@extable/core 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/fillHandle.d.ts +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1928 -1124
- package/dist/index.js.map +1 -1
- package/dist/selectionManager.d.ts +4 -1
- package/dist/types.d.ts +2 -0
- package/package.json +7 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/commandQueue.ts","../src/utils.ts","../src/dateUtils.ts","../src/validation.ts","../src/dataModel.ts","../src/address.ts","../src/findReplace.ts","../src/lockManager.ts","../src/cellValueCodec.ts","../src/geometry.ts","../src/fillHandle.ts","../src/styleResolver.ts","../src/renderers.ts","../src/selectionManager.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["import type { Command } from \"./types\";\n\ntype CommandGroup = { batchId: string | null; commands: Command[] };\nexport type CommandGroupSnapshot = { batchId: string | null; commands: Command[] };\n\nfunction getBatchId(cmd: Command) {\n const p = cmd.payload as Record<string, unknown> | null | undefined;\n if (!p) return null;\n const id = p.batchId;\n return typeof id === \"string\" && id.length ? id : null;\n}\n\nexport class CommandQueue {\n private applied: CommandGroup[] = [];\n private undone: CommandGroup[] = [];\n private cap: number;\n\n constructor(cap = 100) {\n this.cap = cap;\n }\n\n enqueue(command: Command) {\n const batchId = getBatchId(command);\n const last = this.applied.at(-1);\n if (batchId && last && last.batchId === batchId) {\n last.commands.push(command);\n } else {\n this.applied.push({ batchId, commands: [command] });\n }\n while (this.applied.length > this.cap) this.applied.shift();\n this.undone = [];\n }\n\n canUndo() {\n return this.applied.length > 0;\n }\n\n canRedo() {\n return this.undone.length > 0;\n }\n\n listApplied() {\n const out: Command[] = [];\n for (const group of this.applied) out.push(...group.commands);\n return out;\n }\n\n listUndoGroups(): CommandGroupSnapshot[] {\n // Return top = next undo.\n return this.applied\n .slice()\n .reverse()\n .map((g) => ({ batchId: g.batchId, commands: g.commands.slice() }));\n }\n\n listRedoGroups(): CommandGroupSnapshot[] {\n // Return top = next redo.\n return this.undone\n .slice()\n .reverse()\n .map((g) => ({ batchId: g.batchId, commands: g.commands.slice() }));\n }\n\n undo() {\n const group = this.applied.pop();\n if (group) this.undone.push(group);\n return group?.commands ?? null;\n }\n\n redo() {\n const group = this.undone.pop();\n if (group) this.applied.push(group);\n return group?.commands ?? null;\n }\n\n clear() {\n this.applied = [];\n this.undone = [];\n }\n}\n","export function generateId() {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n return `row_${Math.random().toString(16).slice(2)}`;\n}\n\nexport function toArray<T>(value: T | T[] | undefined): T[] | undefined {\n if (value === undefined) return undefined;\n return Array.isArray(value) ? value : [value];\n}\n\nexport function removeFromParent(el: Element | null | undefined) {\n if (!el) return;\n try {\n el.remove();\n } catch {\n // Ignore NotFoundError from re-entrant blur/remove edge cases.\n }\n}\n","const pad = (num: number, len = 2) => num.toString().padStart(len, \"0\");\n\nconst tokenHandlers: Record<\n string,\n (d: Date) => string\n> = {\n yyyy: (d) => pad(d.getFullYear(), 4),\n MM: (d) => pad(d.getMonth() + 1),\n dd: (d) => pad(d.getDate()),\n HH: (d) => pad(d.getHours()),\n hh: (d) => {\n const h = d.getHours() % 12 || 12;\n return pad(h);\n },\n mm: (d) => pad(d.getMinutes()),\n ss: (d) => pad(d.getSeconds()),\n a: (d) => (d.getHours() >= 12 ? \"PM\" : \"AM\"),\n};\n\nconst TOKENS = Object.keys(tokenHandlers).sort((a, b) => b.length - a.length);\nconst DATE_TOKENS = new Set([\"yyyy\", \"MM\", \"dd\"]);\nconst TIME_TOKENS = new Set([\"HH\", \"hh\", \"mm\", \"ss\", \"a\"]);\nconst DATETIME_TOKENS = new Set([...DATE_TOKENS, ...TIME_TOKENS]);\n\ntype DatePatternKind = \"date\" | \"time\" | \"datetime\";\n\nconst DATE_PRESETS: Record<string, string> = {\n iso: \"yyyy-MM-dd\",\n us: \"MM/dd/yyyy\",\n eu: \"dd.MM.yyyy\",\n};\n\nconst TIME_PRESETS: Record<string, string> = {\n iso: \"HH:mm:ss\",\n \"24h\": \"HH:mm\",\n \"12h\": \"hh:mm a\",\n};\n\nconst DATETIME_PRESETS: Record<string, string> = {\n iso: \"yyyy-MM-dd'T'HH:mm:ss'Z'\",\n \"iso-24h\": \"yyyy-MM-dd'T'HH:mm:ss'Z'\",\n \"iso-12h\": \"yyyy-MM-dd hh:mm a\",\n us: \"MM/dd/yyyy HH:mm\",\n \"us-24h\": \"MM/dd/yyyy HH:mm\",\n \"us-12h\": \"MM/dd/yyyy hh:mm a\",\n eu: \"dd.MM.yyyy HH:mm\",\n \"eu-24h\": \"dd.MM.yyyy HH:mm\",\n \"eu-12h\": \"dd.MM.yyyy hh:mm a\",\n};\n\nexport function parseIsoDate(value: string): Date | null {\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nexport function formatDateLite(date: Date, pattern: string): string {\n let out = \"\";\n let i = 0;\n let inLiteral = false;\n while (i < pattern.length) {\n const ch = pattern[i];\n if (ch === \"'\") {\n inLiteral = !inLiteral;\n i += 1;\n continue;\n }\n if (inLiteral) {\n out += ch;\n i += 1;\n continue;\n }\n let matched = false;\n for (const token of TOKENS) {\n if (pattern.startsWith(token, i)) {\n out += tokenHandlers[token](date);\n i += token.length;\n matched = true;\n break;\n }\n }\n if (!matched) {\n out += ch;\n i += 1;\n }\n }\n return out;\n}\n\nfunction isTokenAllowed(token: string, kind: DatePatternKind): boolean {\n if (kind === \"date\") return DATE_TOKENS.has(token);\n if (kind === \"time\") return TIME_TOKENS.has(token);\n return DATETIME_TOKENS.has(token);\n}\n\nfunction isPatternAllowed(pattern: string, kind: DatePatternKind): boolean {\n let i = 0;\n let inLiteral = false;\n while (i < pattern.length) {\n const ch = pattern[i];\n if (ch === \"'\") {\n inLiteral = !inLiteral;\n i += 1;\n continue;\n }\n if (inLiteral) {\n i += 1;\n continue;\n }\n let matched = false;\n for (const token of TOKENS) {\n if (pattern.startsWith(token, i)) {\n if (!isTokenAllowed(token, kind)) return false;\n i += token.length;\n matched = true;\n break;\n }\n }\n if (!matched) i += 1;\n }\n return true;\n}\n\nexport function coerceDatePattern(\n pattern: string | undefined,\n kind: DatePatternKind,\n): string {\n if (!pattern) {\n return kind === \"date\"\n ? DATE_PRESETS.iso\n : kind === \"time\"\n ? TIME_PRESETS.iso\n : DATETIME_PRESETS.iso;\n }\n\n if (kind === \"date\" && DATE_PRESETS[pattern]) return DATE_PRESETS[pattern];\n if (kind === \"time\" && TIME_PRESETS[pattern]) return TIME_PRESETS[pattern];\n if (kind === \"datetime\" && DATETIME_PRESETS[pattern]) return DATETIME_PRESETS[pattern];\n\n const fallback =\n kind === \"date\"\n ? DATE_PRESETS.iso\n : kind === \"time\"\n ? TIME_PRESETS.iso\n : DATETIME_PRESETS.iso;\n\n return isPatternAllowed(pattern, kind) ? pattern : fallback;\n}\n","import { coerceDatePattern, parseIsoDate } from \"./dateUtils\";\nimport type { ColumnSchema } from \"./types\";\n\nconst isValidDate = (d: Date) => !Number.isNaN(d.getTime());\n\nconst asEnumValue = (value: unknown) => {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"enum\") {\n return typeof obj.value === \"string\" ? obj.value : null;\n }\n }\n return null;\n};\n\nconst asTagsValues = (value: unknown) => {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) return value as string[];\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\") {\n const values = obj.values;\n return Array.isArray(values) && values.every((v) => typeof v === \"string\")\n ? (values as string[])\n : null;\n }\n }\n return null;\n};\n\nexport function validateCellValue(value: unknown, col: ColumnSchema): string | null {\n // MVP: avoid noisy \"required\" errors. Treat empty as valid.\n if (value === null || value === undefined) return null;\n\n switch (col.type) {\n case \"string\": {\n if (typeof value !== \"string\") return \"Expected a string\";\n if (col.string?.maxLength !== undefined && value.length > col.string.maxLength) {\n return `Too long (max ${col.string.maxLength})`;\n }\n if (col.string?.regex) {\n try {\n const re = new RegExp(col.string.regex);\n if (!re.test(value)) return \"Does not match pattern\";\n } catch {\n // ignore invalid regex config\n }\n }\n return null;\n }\n case \"number\": {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return \"Expected a number\";\n if (col.number?.signed === false && value < 0) return \"Expected a non-negative number\";\n return null;\n }\n case \"boolean\": {\n if (typeof value !== \"boolean\") return \"Expected a boolean\";\n return null;\n }\n case \"enum\": {\n const v = asEnumValue(value);\n if (!v) return \"Expected an enum value\";\n const allowCustom = col.enum?.allowCustom ?? false;\n const options = col.enum?.options ?? [];\n if (!allowCustom && options.length && !options.includes(v)) return \"Not in allowed options\";\n return null;\n }\n case \"tags\": {\n const values = asTagsValues(value);\n if (!values) return \"Expected a list of tags\";\n const allowCustom = col.tags?.allowCustom ?? false;\n const options = col.tags?.options ?? [];\n if (!allowCustom && options.length) {\n for (const v of values) {\n if (!options.includes(v)) return \"Contains an unknown tag\";\n }\n }\n return null;\n }\n case \"date\":\n case \"time\":\n case \"datetime\": {\n // Enforce allowed format tokens per type; fall back to ISO preset if invalid.\n if (col.type === \"date\") coerceDatePattern(col.dateFormat, \"date\");\n else if (col.type === \"time\") coerceDatePattern(col.timeFormat, \"time\");\n else coerceDatePattern(col.dateTimeFormat, \"datetime\");\n if (value instanceof Date) return isValidDate(value) ? null : \"Invalid date\";\n if (typeof value === \"string\") {\n const d = parseIsoDate(value);\n return d && isValidDate(d) ? null : \"Invalid date/time\";\n }\n return \"Expected a date/time string\";\n }\n default:\n return null;\n }\n}\n","import { generateId } from \"./utils\";\nimport type {\n CellDiagnostic,\n ColumnSchema,\n ColumnDiagnosticFilter,\n ConditionalStyleFn,\n InternalRow,\n RowObject,\n Schema,\n StyleDelta,\n ViewFilterValues,\n ViewSort,\n View,\n} from \"./types\";\nimport { validateCellValue } from \"./validation\";\n\ntype AnyFilter = { key?: unknown; kind?: unknown };\n\nexport class DataModel {\n private schema: Schema<any>;\n private view: View;\n private rows: InternalRow[] = [];\n private baseIndexById = new Map<string, number>();\n private dataVersion = 0;\n private visibleRowsCache: {\n version: number;\n key: string;\n rows: InternalRow[];\n indexById: Map<string, number>;\n } | null = null;\n private distinctValueCache = new Map<\n string,\n {\n version: number;\n values: Array<{ value: unknown; label: string }>;\n hasBlanks: boolean;\n total: number;\n }\n >();\n private pending: Map<string, Record<string, unknown>> = new Map();\n private rowVersion: Map<string, number> = new Map();\n private listeners = new Set<() => void>();\n private cellStyles = new Map<string, StyleDelta>();\n private cellConditionalStyles = new Map<string, ConditionalStyleFn>();\n private computedCache = new Map<\n string,\n {\n version: number;\n formulaRef: unknown;\n value: unknown;\n textOverride?: string;\n diagnostic: CellDiagnostic | null;\n }\n >();\n private conditionalCache = new Map<\n string,\n {\n version: number;\n fnRef: unknown;\n delta: StyleDelta | null;\n diagnostic: CellDiagnostic | null;\n forceErrorText: boolean;\n }\n >();\n private rowConditionalCache = new Map<\n string,\n {\n version: number;\n fnRef: unknown;\n delta: StyleDelta | null;\n diagnostic: CellDiagnostic | null;\n forceErrorText: boolean;\n }\n >();\n private formulaDiagnostics = new Map<string, CellDiagnostic>();\n private conditionalDiagnostics = new Map<string, CellDiagnostic>();\n private baseValidationErrors = new Map<\n string,\n { rowId: string; colKey: string; message: string }\n >();\n private uniqueValidationErrors = new Map<\n string,\n { rowId: string; colKey: string; message: string }\n >();\n private notifySuspended = false;\n private notifyDirty = false;\n\n constructor(dataset: RowObject[] | undefined, schema: Schema<any>, view: View) {\n this.schema = schema;\n this.view = view;\n this.setData(dataset ?? []);\n }\n\n public subscribe(listener: () => void) {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify() {\n this.visibleRowsCache = null;\n this.distinctValueCache.clear();\n if (this.notifySuspended) {\n this.notifyDirty = true;\n return;\n }\n for (const l of this.listeners) l();\n }\n\n public batchUpdate(run: () => void) {\n this.notifySuspended = true;\n try {\n run();\n } finally {\n this.notifySuspended = false;\n if (this.notifyDirty) {\n this.notifyDirty = false;\n this.notify();\n }\n }\n }\n\n public setData(dataset: RowObject[] | undefined) {\n this.dataVersion += 1;\n this.pending.clear();\n this.cellStyles.clear();\n this.cellConditionalStyles.clear();\n this.computedCache.clear();\n this.conditionalCache.clear();\n this.rowConditionalCache.clear();\n this.formulaDiagnostics.clear();\n this.conditionalDiagnostics.clear();\n this.baseValidationErrors.clear();\n this.uniqueValidationErrors.clear();\n this.rows = (dataset ?? []).map((row, idx) => {\n const id = generateId();\n this.rowVersion.set(id, 0);\n return {\n id,\n raw: row,\n displayIndex: idx + 1,\n };\n });\n this.rebuildBaseIndex();\n this.recomputeValidationErrors();\n this.notify();\n }\n\n public setSchema(schema: Schema<any>) {\n this.dataVersion += 1;\n this.schema = schema;\n this.computedCache.clear();\n this.conditionalCache.clear();\n this.rowConditionalCache.clear();\n this.formulaDiagnostics.clear();\n this.conditionalDiagnostics.clear();\n this.recomputeValidationErrors();\n this.notify();\n }\n\n public setView(view: View) {\n this.dataVersion += 1;\n // MVP constraint: allow `sorts` as array, but enforce at most one sort.\n if (Array.isArray(view.sorts) && view.sorts.length > 1) {\n this.view = { ...view, sorts: view.sorts.slice(0, 1) };\n } else {\n this.view = view;\n }\n this.notify();\n }\n\n public getSchema(): Schema<any> {\n return { ...this.schema, columns: this.getColumns() } as Schema<any>;\n }\n\n public getColumns(): ColumnSchema<any>[] {\n return this.schema.columns;\n }\n\n public getRowConditionalStyleFn(): ConditionalStyleFn | null {\n return this.schema.row?.conditionalStyle ?? null;\n }\n\n public getView() {\n return this.view;\n }\n\n public getDataVersion() {\n return this.dataVersion;\n }\n\n public getFullSchema(): Schema<any> {\n return this.schema;\n }\n\n public listRows(): InternalRow[] {\n return this.computeVisibleRows().rows;\n }\n\n public listAllRows(): InternalRow[] {\n return this.rows;\n }\n\n public getAllRowCount() {\n return this.rows.length;\n }\n\n private findRow(rowId: string): { row: InternalRow; index: number } | null {\n const index = this.baseIndexById.get(rowId);\n if (index === undefined) return null;\n const row = this.rows[index];\n if (row && row.id === rowId) return { row, index };\n // Defensive fallback for unexpected external mutation of `rows`.\n const slowIndex = this.rows.findIndex((r) => r.id === rowId);\n if (slowIndex < 0) return null;\n const slowRow = this.rows[slowIndex];\n if (!slowRow) return null;\n this.rebuildBaseIndex();\n return { row: slowRow, index: slowIndex };\n }\n\n public getRowHeight(rowId: string) {\n return this.view.rowHeights?.[rowId];\n }\n\n public setRowHeight(rowId: string, height: number) {\n if (!this.view.rowHeights) this.view.rowHeights = {};\n const prev = this.view.rowHeights[rowId];\n if (prev === height) return;\n this.view.rowHeights[rowId] = height;\n this.notify();\n }\n\n public setRowHeightsBulk(next: Record<string, number>) {\n const entries = Object.entries(next);\n if (entries.length === 0) return;\n if (!this.view.rowHeights) this.view.rowHeights = {};\n let changed = false;\n for (const [rowId, height] of entries) {\n if (this.view.rowHeights[rowId] === height) continue;\n this.view.rowHeights[rowId] = height;\n changed = true;\n }\n if (changed) this.notify();\n }\n\n public getCell(rowId: string, key: string) {\n const found = this.findRow(rowId);\n if (!found) return undefined;\n const row = found.row;\n const pendingRow = this.pending.get(rowId);\n if (pendingRow && key in pendingRow) return pendingRow[key];\n return row.raw[key];\n }\n\n public getRawCell(rowId: string, key: string) {\n const found = this.findRow(rowId);\n if (!found) return undefined;\n const row = found.row;\n return row.raw[key];\n }\n\n public isRowReadonly(rowId: string) {\n const found = this.findRow(rowId);\n if (!found) return false;\n const row = found.row;\n return Boolean((row.raw as Record<string, unknown>)._readonly);\n }\n\n public isColumnReadonly(colKey: string) {\n const col = this.schema.columns.find((c) => c.key === colKey);\n return Boolean(col?.readonly || col?.formula);\n }\n\n public isReadonly(rowId: string, colKey: string) {\n return this.isRowReadonly(rowId) || this.isColumnReadonly(colKey);\n }\n\n public setCell(rowId: string, key: string, value: unknown, committed: boolean) {\n this.dataVersion += 1;\n const found = this.findRow(rowId);\n if (!found) return;\n const row = found.row;\n const bumpVersion = () => {\n const prev = this.rowVersion.get(rowId) ?? 0;\n this.rowVersion.set(rowId, prev + 1);\n };\n if (committed) {\n row.raw[key] = value;\n this.pending.delete(rowId);\n bumpVersion();\n } else {\n const rawVal = this.getRawCell(rowId, key);\n const current = this.pending.get(rowId) ?? {};\n if (this.isEqual(rawVal, value)) {\n delete current[key];\n } else {\n current[key] = value;\n }\n const hasKeys = Object.keys(current).length > 0;\n if (hasKeys) {\n this.pending.set(rowId, current);\n } else {\n this.pending.delete(rowId);\n }\n bumpVersion();\n }\n this.updateValidationForCell(rowId, key, this.getCell(rowId, key));\n const col = this.schema.columns.find((c) => c.key === key);\n if (col?.unique) this.recomputeUniqueValidationForColumn(key);\n // Invalidate computed/conditional caches for the row by version mismatch; clear diagnostics eagerly.\n this.clearDiagnosticsForCell(rowId, key);\n this.notify();\n }\n\n public applyPending(rowId: string) {\n this.dataVersion += 1;\n const pendingRow = this.pending.get(rowId);\n if (!pendingRow) return;\n const found = this.findRow(rowId);\n if (!found) return;\n const row = found.row;\n const uniqueCols = new Set<string>();\n for (const [key, val] of Object.entries(pendingRow)) {\n row.raw[key] = val;\n this.updateValidationForCell(rowId, key, val);\n const col = this.schema.columns.find((c) => String(c.key) === String(key));\n if (col?.unique) uniqueCols.add(col.key);\n this.clearDiagnosticsForCell(rowId, key);\n }\n this.pending.delete(rowId);\n for (const colKey of uniqueCols) this.recomputeUniqueValidationForColumn(colKey);\n this.notify();\n }\n\n public clearPending(rowId: string) {\n this.dataVersion += 1;\n this.pending.delete(rowId);\n this.notify();\n }\n\n public getPending() {\n return this.pending;\n }\n\n public hasPending(rowId: string, key: string) {\n const p = this.pending.get(rowId);\n if (!p) return false;\n return key in p;\n }\n\n public insertRow(rowData: InternalRow[\"raw\"]) {\n return this.insertRowAt(rowData, this.rows.length);\n }\n\n public insertRowAt(rowData: InternalRow[\"raw\"], index: number, forcedId?: string) {\n this.dataVersion += 1;\n const id = forcedId ?? generateId();\n const clamped = Math.max(0, Math.min(index, this.rows.length));\n this.rows.splice(clamped, 0, { id, raw: rowData, displayIndex: 0 });\n this.reindexRows();\n this.rowVersion.set(id, 0);\n this.rebuildBaseIndex();\n this.recomputeValidationErrors();\n this.notify();\n return id;\n }\n\n public removeRow(rowId: string): { row: InternalRow; index: number } | null {\n this.dataVersion += 1;\n const found = this.findRow(rowId);\n if (!found) return null;\n const removed = this.rows.splice(found.index, 1)[0];\n if (!removed) return null;\n this.pending.delete(rowId);\n this.rowVersion.delete(rowId);\n this.reindexRows();\n this.rebuildBaseIndex();\n this.recomputeValidationErrors();\n this.notify();\n return { row: removed, index: found.index };\n }\n\n public getDisplayIndex(rowId: string) {\n return this.findRow(rowId)?.row.displayIndex ?? null;\n }\n\n public getRowIndex(rowId: string) {\n return this.computeVisibleRows().indexById.get(rowId) ?? -1;\n }\n\n public getBaseRowIndex(rowId: string) {\n return this.baseIndexById.get(rowId) ?? -1;\n }\n\n public getColumnIndex(colKey: string) {\n return this.getColumns().findIndex((c) => c.key === colKey);\n }\n\n public getColumnByIndex(colIndex: number) {\n return this.getColumns()[colIndex] ?? null;\n }\n\n public getRowByIndex(rowIndex: number) {\n return this.listRows()[rowIndex] ?? null;\n }\n\n private rebuildBaseIndex() {\n this.baseIndexById.clear();\n for (let i = 0; i < this.rows.length; i += 1) {\n const r = this.rows[i];\n if (r) this.baseIndexById.set(r.id, i);\n }\n }\n\n private getFilterSortKey(options?: {\n excludeColumnKey?: string;\n includeSort?: boolean;\n }) {\n const exclude = options?.excludeColumnKey;\n const includeSort = options?.includeSort ?? true;\n const view = this.view;\n const filters = (view.filters ?? [])\n .filter((f) => {\n if (exclude === undefined) return true;\n const key = (f as AnyFilter | null | undefined)?.key;\n return String(key) !== String(exclude);\n })\n .map((f) => {\n const kind = (f as AnyFilter | null | undefined)?.kind;\n if (kind === \"values\") {\n const vf = f as ViewFilterValues;\n return {\n kind: \"values\" as const,\n key: String(vf.key),\n includeBlanks: Boolean(vf.includeBlanks),\n values: (vf.values ?? []).map((v) => this.stableValueKey(v)),\n };\n }\n // Unknown filter kind (or legacy op filter) => keep a stable representation for caching.\n const opf = f as Record<string, unknown>;\n return {\n kind: \"op\" as const,\n key: String(opf.key),\n op: String(opf.op ?? \"\"),\n value: this.stableValueKey(opf.value),\n };\n })\n .sort((a, b) => (a.key === b.key ? (a.kind < b.kind ? -1 : 1) : a.key < b.key ? -1 : 1));\n\n const columnDiagnosticsEntries = Object.entries(view.columnDiagnostics ?? {})\n .filter(([k]) => (exclude !== undefined ? String(k) !== String(exclude) : true))\n .map(([k, v]) => ({\n key: String(k),\n errors: Boolean((v as ColumnDiagnosticFilter | undefined)?.errors),\n warnings: Boolean((v as ColumnDiagnosticFilter | undefined)?.warnings),\n }))\n .filter((x) => x.errors || x.warnings)\n .sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n\n const sorts = includeSort\n ? (view.sorts ?? []).slice(0, 1).map((s) => ({ key: String(s.key), dir: s.dir }))\n : [];\n\n return JSON.stringify({ filters, columnDiagnosticsEntries, sorts });\n }\n\n private stableValueKey(value: unknown) {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (value instanceof Date) return `date:${value.getTime()}`;\n if (typeof value === \"string\") return `s:${value}`;\n if (typeof value === \"number\") return `n:${Number.isNaN(value) ? \"NaN\" : String(value)}`;\n if (typeof value === \"boolean\") return `b:${value ? \"1\" : \"0\"}`;\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return `enum:${obj.value}`;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return `tags:${obj.values.filter((x) => typeof x === \"string\").join(\"|\")}`;\n }\n }\n try {\n return `json:${JSON.stringify(value)}`;\n } catch {\n return `str:${String(value)}`;\n }\n }\n\n private isBlankValue(value: unknown) {\n return value === null || value === undefined || value === \"\";\n }\n\n private resolveFilterColumnKey(key: string) {\n const cols = this.getColumns();\n const found = cols.find((c) => String(c.key) === String(key));\n return found?.key ?? key;\n }\n\n private getFilterCellValue(rowId: string, colKey: string) {\n const col = this.getColumns().find((c) => String(c.key) === String(colKey));\n if (!col) return this.getCell(rowId, colKey);\n return this.resolveCellValue(rowId, col).value;\n }\n\n private valuesFilterMatches(rowId: string, filter: ViewFilterValues) {\n const colKey = this.resolveFilterColumnKey(filter.key);\n const value = this.getFilterCellValue(rowId, colKey);\n if (this.isBlankValue(value)) return Boolean(filter.includeBlanks);\n if (!filter.values || filter.values.length === 0) return false;\n const valueKey = this.stableValueKey(value);\n for (const v of filter.values) {\n if (this.stableValueKey(v) === valueKey) return true;\n }\n return false;\n }\n\n private rowPassesColumnDiagnostics(\n rowId: string,\n colKeyStr: string,\n diag: ColumnDiagnosticFilter,\n ) {\n const errors = Boolean(diag.errors);\n const warnings = Boolean(diag.warnings);\n if (!errors && !warnings) return true;\n const colKey = this.resolveFilterColumnKey(colKeyStr);\n // Ensure diagnostics are computed for this cell before filtering by diagnostics.\n const col = this.getColumns().find((c) => String(c.key) === String(colKey));\n if (col) {\n this.resolveCellValue(rowId, col);\n this.resolveConditionalStyle(rowId, col);\n }\n const marker = this.getCellMarker(rowId, colKey);\n if (!marker) return false;\n if (marker.level === \"error\") return errors;\n return warnings;\n }\n\n private computeRowsAfterFilter(options?: {\n excludeColumnKey?: string;\n includeSort?: boolean;\n }) {\n const exclude = options?.excludeColumnKey;\n const includeSort = options?.includeSort ?? true;\n const view = this.view;\n const schema = this.getSchema();\n\n const filters = (view.filters ?? []).filter((f) => {\n if (exclude === undefined) return true;\n const key = (f as AnyFilter | null | undefined)?.key;\n return String(key) !== String(exclude);\n });\n const diagEntries = Object.entries(view.columnDiagnostics ?? {}).filter(([k]) =>\n exclude !== undefined ? String(k) !== String(exclude) : true,\n );\n\n const filtered: InternalRow[] = [];\n for (const row of this.rows) {\n let ok = true;\n for (const f of filters) {\n const kind = (f as AnyFilter | null | undefined)?.kind;\n if (kind === \"values\") {\n if (!this.valuesFilterMatches(row.id, f as ViewFilterValues)) {\n ok = false;\n break;\n }\n // matched values filter\n }\n // Unknown filter kind (or legacy op filter) => ignore in MVP.\n }\n if (!ok) continue;\n for (const [k, diag] of diagEntries) {\n if (!this.rowPassesColumnDiagnostics(row.id, k, diag as ColumnDiagnosticFilter)) {\n ok = false;\n break;\n }\n }\n if (!ok) continue;\n filtered.push(row);\n }\n\n if (!includeSort) return filtered;\n\n const sort = (view.sorts ?? []).slice(0, 1)[0] as ViewSort | undefined;\n if (!sort) return filtered;\n const sortCol = schema.columns.find((c) => String(c.key) === String(sort.key));\n if (!sortCol) return filtered;\n\n const dir = sort.dir === \"desc\" ? -1 : 1;\n const withKeys = filtered.map((row) => {\n const v = this.getFilterCellValue(row.id, sortCol.key);\n const blank = this.isBlankValue(v);\n const baseIndex = this.baseIndexById.get(row.id) ?? 0;\n return { row, v, blank, baseIndex };\n });\n\n const compare = (a: unknown, b: unknown) => {\n if (a === b) return 0;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"boolean\" && typeof b === \"boolean\") return a === b ? 0 : a ? 1 : -1;\n const as = a instanceof Date ? a.toISOString() : typeof a === \"string\" ? a : String(a);\n const bs = b instanceof Date ? b.toISOString() : typeof b === \"string\" ? b : String(b);\n if (as === bs) return 0;\n return as < bs ? -1 : 1;\n };\n\n withKeys.sort((a, b) => {\n if (a.blank && b.blank) return a.baseIndex - b.baseIndex;\n if (a.blank) return 1;\n if (b.blank) return -1;\n const c = compare(a.v, b.v);\n if (c !== 0) return c * dir;\n return a.baseIndex - b.baseIndex;\n });\n\n return withKeys.map((x) => x.row);\n }\n\n private computeVisibleRows() {\n const key = this.getFilterSortKey();\n const cached = this.visibleRowsCache;\n if (cached && cached.version === this.dataVersion && cached.key === key) return cached;\n\n const base = this.computeRowsAfterFilter({ includeSort: true });\n // Keep `displayIndex` stable (pre-filter) and only change the visible ordering.\n const rows = base;\n const indexById = new Map<string, number>();\n for (let i = 0; i < rows.length; i += 1) {\n const r = rows[i];\n if (r) indexById.set(r.id, i);\n }\n const next = { version: this.dataVersion, key, rows, indexById };\n this.visibleRowsCache = next;\n return next;\n }\n\n public getDistinctValuesForColumn(colKey: string) {\n const cacheKey = `${String(colKey)}|${this.getFilterSortKey({ excludeColumnKey: colKey, includeSort: false })}`;\n const cached = this.distinctValueCache.get(cacheKey);\n if (cached && cached.version === this.dataVersion) return cached;\n\n const rows = this.computeRowsAfterFilter({ excludeColumnKey: colKey, includeSort: false });\n const col = this.getSchema().columns.find((c) => String(c.key) === String(colKey));\n if (!col) {\n const empty = { version: this.dataVersion, values: [], hasBlanks: false, total: 0 };\n this.distinctValueCache.set(cacheKey, empty);\n return empty;\n }\n\n const map = new Map<string, { value: unknown; label: string }>();\n let hasBlanks = false;\n for (const row of rows) {\n const v = this.getFilterCellValue(row.id, col.key);\n if (this.isBlankValue(v)) {\n hasBlanks = true;\n continue;\n }\n const k = this.stableValueKey(v);\n if (map.has(k)) continue;\n const label = (() => {\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\" && v) {\n const obj = v as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n return String(v);\n })();\n map.set(k, { value: v, label });\n }\n\n const values = [...map.values()].sort((a, b) =>\n a.label < b.label ? -1 : a.label > b.label ? 1 : 0,\n );\n const next = {\n version: this.dataVersion,\n values,\n hasBlanks,\n total: values.length + (hasBlanks ? 1 : 0),\n };\n this.distinctValueCache.set(cacheKey, next);\n return next;\n }\n\n private cellStyleKey(rowId: string, colKey: string) {\n return `${rowId}::${String(colKey)}`;\n }\n\n private clearDiagnosticsForCell(rowId: string, colKey: string) {\n const key = this.cellStyleKey(rowId, colKey);\n this.formulaDiagnostics.delete(key);\n this.conditionalDiagnostics.delete(key);\n }\n\n public getCellDiagnostic(rowId: string, colKey: string): CellDiagnostic | null {\n const key = this.cellStyleKey(rowId, colKey);\n const a = this.formulaDiagnostics.get(key) ?? null;\n const b = this.conditionalDiagnostics.get(key) ?? null;\n if (!a) return b;\n if (!b) return a;\n if (a.level === \"error\") return a;\n if (b.level === \"error\") return b;\n // Both warnings: prefer formula message (more likely to explain the value).\n return a;\n }\n\n public getDiagnostics() {\n const keys = new Set<string>();\n for (const k of this.formulaDiagnostics.keys()) keys.add(k);\n for (const k of this.conditionalDiagnostics.keys()) keys.add(k);\n return [...keys].map((key) => {\n const sep = key.indexOf(\"::\");\n const rowId = sep >= 0 ? key.slice(0, sep) : key;\n const colKey = sep >= 0 ? key.slice(sep + 2) : \"\";\n return { rowId, colKey, diag: this.getCellDiagnostic(rowId, colKey) };\n });\n }\n\n private getRowObjectEffective(rowId: string): Record<string, unknown> | null {\n const found = this.findRow(rowId);\n if (!found) return null;\n const row = found.row;\n const pendingRow = this.pending.get(rowId);\n if (!pendingRow || Object.keys(pendingRow).length === 0)\n return row.raw as Record<string, unknown>;\n const merged: Record<string, unknown> = { ...(row.raw as Record<string, unknown>) };\n for (const [k, v] of Object.entries(pendingRow)) {\n merged[k] = v;\n }\n return merged;\n }\n\n public resolveCellValue(\n rowId: string,\n col: ColumnSchema,\n ): {\n value: unknown;\n textOverride?: string;\n diagnostic: CellDiagnostic | null;\n } {\n if (!col.formula) {\n return { value: this.getCell(rowId, col.key), diagnostic: null };\n }\n const version = this.getRowVersion(rowId);\n const key = this.cellStyleKey(rowId, col.key);\n const cached = this.computedCache.get(key);\n if (cached && cached.version === version && cached.formulaRef === col.formula) {\n if (cached.diagnostic) this.formulaDiagnostics.set(key, cached.diagnostic);\n return {\n value: cached.value,\n textOverride: cached.textOverride,\n diagnostic: cached.diagnostic,\n };\n }\n const data = this.getRowObjectEffective(rowId);\n if (!data) {\n const value = this.getCell(rowId, col.key);\n const next = {\n version,\n formulaRef: col.formula,\n value,\n diagnostic: null as CellDiagnostic | null,\n };\n this.computedCache.set(key, next);\n return { value, diagnostic: null };\n }\n try {\n const out: unknown = col.formula(data);\n if (Array.isArray(out) && out.length >= 2 && out[1] instanceof Error) {\n const diag: CellDiagnostic = {\n level: \"warning\",\n message: out[1].message,\n source: \"formula\",\n };\n const value = out[0];\n this.computedCache.set(key, { version, formulaRef: col.formula, value, diagnostic: diag });\n this.formulaDiagnostics.set(key, diag);\n return { value, diagnostic: diag };\n }\n const value = out;\n this.computedCache.set(key, { version, formulaRef: col.formula, value, diagnostic: null });\n this.formulaDiagnostics.delete(key);\n return { value, diagnostic: null };\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n const diag: CellDiagnostic = { level: \"error\", message, source: \"formula\" };\n this.computedCache.set(key, {\n version,\n formulaRef: col.formula,\n value: null,\n textOverride: \"#ERROR\",\n diagnostic: diag,\n });\n this.formulaDiagnostics.set(key, diag);\n return { value: null, textOverride: \"#ERROR\", diagnostic: diag };\n }\n }\n\n public setCellConditionalStyle(rowId: string, colKey: string, fn: ConditionalStyleFn | null) {\n const key = this.cellStyleKey(rowId, colKey);\n if (!fn) this.cellConditionalStyles.delete(key);\n else this.cellConditionalStyles.set(key, fn);\n this.conditionalCache.delete(key);\n this.clearDiagnosticsForCell(rowId, colKey);\n this.notify();\n }\n\n private evalConditionalStyleFn(\n fn: ConditionalStyleFn,\n data: Record<string, unknown>,\n ): { delta: StyleDelta | null; diagnostic: CellDiagnostic | null; forceErrorText: boolean } {\n try {\n const out = fn(data);\n if (out instanceof Error) {\n return {\n delta: null,\n diagnostic: { level: \"warning\", message: out.message, source: \"conditionalStyle\" },\n forceErrorText: false,\n };\n }\n return { delta: out ?? null, diagnostic: null, forceErrorText: false };\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return {\n delta: null,\n diagnostic: { level: \"error\", message, source: \"conditionalStyle\" },\n forceErrorText: true,\n };\n }\n }\n\n private resolveRowConditionalStyle(rowId: string): {\n delta: StyleDelta | null;\n diagnostic: CellDiagnostic | null;\n forceErrorText: boolean;\n } {\n const fn = this.getRowConditionalStyleFn();\n if (!fn) return { delta: null, diagnostic: null, forceErrorText: false };\n const version = this.getRowVersion(rowId);\n const cached = this.rowConditionalCache.get(rowId);\n if (cached && cached.version === version && cached.fnRef === fn) {\n return {\n delta: cached.delta,\n diagnostic: cached.diagnostic,\n forceErrorText: cached.forceErrorText,\n };\n }\n const data = this.getRowObjectEffective(rowId);\n if (!data) {\n const next = { version, fnRef: fn, delta: null, diagnostic: null, forceErrorText: false };\n this.rowConditionalCache.set(rowId, next);\n return { delta: null, diagnostic: null, forceErrorText: false };\n }\n const res = this.evalConditionalStyleFn(fn, data);\n this.rowConditionalCache.set(rowId, { version, fnRef: fn, ...res });\n return res;\n }\n\n public resolveConditionalStyle(\n rowId: string,\n col: ColumnSchema,\n ): {\n delta: StyleDelta | null;\n diagnostic: CellDiagnostic | null;\n forceErrorText: boolean;\n } {\n const version = this.getRowVersion(rowId);\n const key = this.cellStyleKey(rowId, col.key);\n const data = this.getRowObjectEffective(rowId);\n const rowRes = this.resolveRowConditionalStyle(rowId);\n\n const applyDelta = (base: StyleDelta | null, next: StyleDelta | null) => {\n if (!next) return base;\n if (!base) return { ...next };\n return { ...base, ...next };\n };\n\n let delta: StyleDelta | null = null;\n let diagnostic: CellDiagnostic | null = null;\n let forceErrorText = false;\n\n // Lowest within the conditional layer: row-level.\n delta = applyDelta(delta, rowRes.delta);\n if (rowRes.diagnostic) diagnostic = rowRes.diagnostic;\n forceErrorText = forceErrorText || rowRes.forceErrorText;\n\n // Column-level conditional style.\n if (col.conditionalStyle && data) {\n const colCacheKey = `${rowId}::${String(col.key)}::col`;\n const cached = this.conditionalCache.get(colCacheKey);\n if (cached && cached.version === version && cached.fnRef === col.conditionalStyle) {\n delta = applyDelta(delta, cached.delta);\n if (cached.diagnostic && (diagnostic === null || diagnostic.level !== \"error\"))\n diagnostic = cached.diagnostic;\n forceErrorText = forceErrorText || cached.forceErrorText;\n } else {\n const res = this.evalConditionalStyleFn(col.conditionalStyle, data);\n this.conditionalCache.set(colCacheKey, { version, fnRef: col.conditionalStyle, ...res });\n delta = applyDelta(delta, res.delta);\n if (res.diagnostic && (diagnostic === null || diagnostic.level !== \"error\"))\n diagnostic = res.diagnostic;\n forceErrorText = forceErrorText || res.forceErrorText;\n }\n }\n\n // Highest within the conditional layer: cell-level.\n const cellFn = this.cellConditionalStyles.get(key);\n if (cellFn && data) {\n const cached = this.conditionalCache.get(key);\n if (cached && cached.version === version && cached.fnRef === cellFn) {\n delta = applyDelta(delta, cached.delta);\n if (cached.diagnostic && (diagnostic === null || diagnostic.level !== \"error\"))\n diagnostic = cached.diagnostic;\n forceErrorText = forceErrorText || cached.forceErrorText;\n } else {\n const res = this.evalConditionalStyleFn(cellFn, data);\n this.conditionalCache.set(key, { version, fnRef: cellFn, ...res });\n delta = applyDelta(delta, res.delta);\n if (res.diagnostic && (diagnostic === null || diagnostic.level !== \"error\"))\n diagnostic = res.diagnostic;\n forceErrorText = forceErrorText || res.forceErrorText;\n }\n }\n\n if (diagnostic) this.conditionalDiagnostics.set(key, diagnostic);\n else this.conditionalDiagnostics.delete(key);\n\n return { delta, diagnostic, forceErrorText };\n }\n\n public getValidationErrors() {\n const merged = new Map<string, { rowId: string; colKey: string; message: string }>();\n for (const [k, v] of this.baseValidationErrors.entries()) merged.set(k, { ...v });\n for (const [k, v] of this.uniqueValidationErrors.entries()) {\n const prev = merged.get(k);\n if (!prev) merged.set(k, { ...v });\n else merged.set(k, { ...prev, message: `${prev.message}\\n${v.message}` });\n }\n const out = [...merged.values()];\n out.sort((a, b) => {\n const ra = this.getRowIndex(a.rowId);\n const rb = this.getRowIndex(b.rowId);\n if (ra !== rb) return ra - rb;\n const ca = this.getColumnIndex(a.colKey);\n const cb = this.getColumnIndex(b.colKey);\n return ca - cb;\n });\n return out;\n }\n\n public getCellValidationMessage(rowId: string, colKey: string): string | null {\n const key = this.cellStyleKey(rowId, colKey);\n const a = this.baseValidationErrors.get(key)?.message ?? null;\n const b = this.uniqueValidationErrors.get(key)?.message ?? null;\n if (!a) return b;\n if (!b) return a;\n return `${a}\\n${b}`;\n }\n\n public getCellMarker(\n rowId: string,\n colKey: string,\n ): { level: \"warning\" | \"error\"; message: string } | null {\n const diag = this.getCellDiagnostic(rowId, colKey);\n const validation = this.getCellValidationMessage(rowId, colKey);\n if (!diag && !validation) return null;\n const level: \"warning\" | \"error\" = validation ? \"error\" : (diag?.level ?? \"warning\");\n const message = [diag?.message ?? null, validation].filter(Boolean).join(\"\\n\");\n return { level, message };\n }\n\n private updateValidationForCell(rowId: string, colKey: string, value: unknown) {\n const col = this.schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return;\n const msg = validateCellValue(value, col);\n const key = this.cellStyleKey(rowId, colKey);\n if (!msg) this.baseValidationErrors.delete(key);\n else this.baseValidationErrors.set(key, { rowId, colKey, message: msg });\n }\n\n private recomputeValidationErrors() {\n this.baseValidationErrors.clear();\n this.uniqueValidationErrors.clear();\n for (const row of this.rows) {\n for (const col of this.schema.columns) {\n const v = this.getCell(row.id, col.key);\n this.updateValidationForCell(row.id, col.key, v);\n }\n }\n for (const col of this.getColumns()) {\n if (!col.unique) continue;\n this.recomputeUniqueValidationForColumn(col.key);\n }\n }\n\n private normalizeUniqueValue(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") return value === \"\" ? null : value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (value instanceof Date) return String(value.getTime());\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") {\n return obj.value === \"\" ? null : obj.value;\n }\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n const joined = obj.values.filter((x) => typeof x === \"string\").join(\",\");\n return joined === \"\" ? null : joined;\n }\n }\n return String(value);\n }\n\n private recomputeUniqueValidationForColumn(colKey: string) {\n const colKeyStr = String(colKey);\n for (const k of Array.from(this.uniqueValidationErrors.keys())) {\n const sep = k.indexOf(\"::\");\n const existingCol = sep >= 0 ? k.slice(sep + 2) : \"\";\n if (existingCol === colKeyStr) this.uniqueValidationErrors.delete(k);\n }\n const valueToRows = new Map<string, string[]>();\n for (const row of this.rows) {\n const v = this.getCell(row.id, colKey);\n const norm = this.normalizeUniqueValue(v);\n if (!norm) continue;\n const list = valueToRows.get(norm) ?? [];\n list.push(row.id);\n valueToRows.set(norm, list);\n }\n for (const rowIds of valueToRows.values()) {\n if (rowIds.length < 2) continue;\n const display = rowIds\n .map((rowId) => this.getDisplayIndex(rowId))\n .filter((x): x is number => typeof x === \"number\" && Number.isFinite(x))\n .sort((a, b) => a - b);\n const rowList = display.length ? display.join(\", \") : rowIds.join(\", \");\n for (const rowId of rowIds) {\n const key = this.cellStyleKey(rowId, colKey);\n this.uniqueValidationErrors.set(key, {\n rowId,\n colKey,\n message: `Duplicate value\\nRows: ${rowList}`,\n });\n }\n }\n }\n\n public getCellStyle(rowId: string, colKey: string): StyleDelta | null {\n return this.cellStyles.get(this.cellStyleKey(rowId, colKey)) ?? null;\n }\n\n public setCellStyle(rowId: string, colKey: string, style: StyleDelta | null) {\n const key = this.cellStyleKey(rowId, colKey);\n if (!style || Object.keys(style).length === 0) this.cellStyles.delete(key);\n else this.cellStyles.set(key, style);\n this.notify();\n }\n\n public updateColumnStyle(\n colKey: string,\n updater:\n | ColumnSchema[\"style\"]\n | ((oldValue: ColumnSchema[\"style\"] | undefined) => ColumnSchema[\"style\"] | undefined),\n ) {\n const col = this.schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return;\n const next = typeof updater === \"function\" ? updater(col.style) : updater;\n col.style = next;\n this.notify();\n }\n\n private isEqual(a: unknown, b: unknown) {\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n return Object.is(a, b);\n }\n\n public getRowVersion(rowId: string) {\n return this.rowVersion.get(rowId) ?? 0;\n }\n\n private reindexRows() {\n let idx = 1;\n for (const row of this.rows) {\n row.displayIndex = idx;\n idx += 1;\n }\n }\n}\n","import type { DataModel } from \"./dataModel\";\nimport type { CellAddress } from \"./types\";\n\nexport type ResolvedCellTarget = {\n rowId: string;\n colKey: string;\n rowIndex: number;\n colIndex: number;\n};\n\nexport function resolveCellAddress(dataModel: DataModel, address: CellAddress): ResolvedCellTarget | null {\n const schema = dataModel.getSchema();\n const rows = dataModel.listRows();\n\n const resolveByIndex = (rowIndex: number, colIndex: number): ResolvedCellTarget | null => {\n if (!Number.isInteger(rowIndex) || !Number.isInteger(colIndex)) return null;\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n if (colIndex < 0 || colIndex >= schema.columns.length) return null;\n const row = rows[rowIndex]!;\n const col = schema.columns[colIndex]!;\n return { rowId: row.id, colKey: col.key, rowIndex, colIndex };\n };\n\n const resolveByKeys = (rowId: string, colKey: string): ResolvedCellTarget | null => {\n const rowIndex = dataModel.getRowIndex(rowId);\n if (rowIndex < 0) return null;\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (colIndex < 0) return null;\n return { rowId, colKey, rowIndex, colIndex };\n };\n\n if (\"rowId\" in address && \"colKey\" in address) {\n return resolveByKeys(address.rowId, address.colKey);\n }\n if (\"rowIndex\" in address && \"colIndex\" in address) {\n return resolveByIndex(address.rowIndex, address.colIndex);\n }\n if (\"rowId\" in address && \"colIndex\" in address) {\n const rowIndex = dataModel.getRowIndex(address.rowId);\n if (rowIndex < 0) return null;\n return resolveByIndex(rowIndex, address.colIndex);\n }\n if (\"rowIndex\" in address && \"colKey\" in address) {\n const colIndex = schema.columns.findIndex((c) => c.key === address.colKey);\n if (colIndex < 0) return null;\n return resolveByIndex(address.rowIndex, colIndex);\n }\n\n return null;\n}\n","import type { ColumnSchema } from \"./types\";\nimport type { DataModel } from \"./dataModel\";\n\nexport type FindReplaceMode = \"find\" | \"replace\";\n\nexport interface FindReplaceOptions {\n caseInsensitive?: boolean;\n regex?: boolean;\n}\n\nexport interface FindReplaceMatch {\n rowId: string;\n colKey: string;\n rowIndex: number;\n colIndex: number;\n start: number;\n end: number;\n text: string;\n}\n\nexport interface FindReplaceState {\n query: string;\n replace: string;\n mode: FindReplaceMode;\n options: Required<FindReplaceOptions>;\n matches: FindReplaceMatch[];\n activeIndex: number;\n error: string | null;\n}\n\nexport type FindReplaceListener = (state: FindReplaceState) => void;\n\nfunction defaultOptions(): Required<FindReplaceOptions> {\n return { caseInsensitive: false, regex: false };\n}\n\nfunction stringifyCellValue(value: unknown, col: ColumnSchema): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n // Fallback: stable stringification.\n return col.type === \"boolean\"\n ? String(value).toLowerCase() === \"true\"\n ? \"TRUE\"\n : \"FALSE\"\n : String(value);\n}\n\nfunction escapeRegExp(text: string) {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction clampIndex(index: number, length: number) {\n if (length <= 0) return -1;\n return Math.max(0, Math.min(length - 1, index));\n}\n\nexport class FindReplaceController {\n private state: FindReplaceState = {\n query: \"\",\n replace: \"\",\n mode: \"find\",\n options: defaultOptions(),\n matches: [],\n activeIndex: -1,\n error: null,\n };\n private listeners = new Set<FindReplaceListener>();\n private debounceId: number | null = null;\n private unsubscribeData: (() => void) | null = null;\n\n constructor(\n private dataModel: DataModel,\n private navigateToCell: (rowId: string, colKey: string) => void,\n private applyEdit: (rowId: string, colKey: string, next: unknown) => void,\n private canEdit: (rowId: string, colKey: string) => boolean,\n ) {\n this.unsubscribeData = this.dataModel.subscribe(() => {\n if (!this.state.query) return;\n this.scheduleRecompute();\n });\n }\n\n destroy() {\n if (this.debounceId !== null) window.clearTimeout(this.debounceId);\n this.debounceId = null;\n this.unsubscribeData?.();\n this.unsubscribeData = null;\n this.listeners.clear();\n }\n\n getState() {\n return this.state;\n }\n\n subscribe(listener: FindReplaceListener) {\n this.listeners.add(listener);\n listener(this.state);\n return () => this.listeners.delete(listener);\n }\n\n setMode(mode: FindReplaceMode) {\n this.setState({ ...this.state, mode });\n }\n\n setQuery(query: string) {\n this.setState({ ...this.state, query });\n this.scheduleRecompute();\n }\n\n setReplace(replace: string) {\n this.setState({ ...this.state, replace });\n }\n\n setOptions(next: FindReplaceOptions) {\n this.setState({ ...this.state, options: { ...this.state.options, ...next } });\n this.scheduleRecompute();\n }\n\n next() {\n if (!this.state.matches.length) return;\n const idx = (this.state.activeIndex + 1) % this.state.matches.length;\n this.activateIndex(idx);\n }\n\n prev() {\n if (!this.state.matches.length) return;\n const idx =\n (this.state.activeIndex - 1 + this.state.matches.length) % this.state.matches.length;\n this.activateIndex(idx);\n }\n\n activateIndex(index: number) {\n const idx = clampIndex(index, this.state.matches.length);\n if (idx < 0) return;\n const match = this.state.matches[idx];\n if (!match) return;\n this.setState({ ...this.state, activeIndex: idx });\n this.navigateToCell(match.rowId, match.colKey);\n }\n\n replaceCurrent() {\n const idx = this.state.activeIndex;\n if (idx < 0) return;\n const match = this.state.matches[idx];\n if (!match) return;\n if (!this.canEdit(match.rowId, match.colKey)) return;\n\n const schema = this.dataModel.getSchema();\n const col = schema.columns[match.colIndex];\n if (!col) return;\n const current = this.dataModel.getCell(match.rowId, match.colKey);\n const currentText = stringifyCellValue(current, col);\n const replacement = this.applyReplacement(currentText, match);\n this.applyEdit(match.rowId, match.colKey, replacement);\n this.recompute();\n }\n\n replaceAll() {\n if (!this.state.matches.length) return;\n const schema = this.dataModel.getSchema();\n const byCell = new Map<string, FindReplaceMatch[]>();\n for (const m of this.state.matches) {\n if (!this.canEdit(m.rowId, m.colKey)) continue;\n byCell.set(`${m.rowId}|${m.colKey}`, [...(byCell.get(`${m.rowId}|${m.colKey}`) ?? []), m]);\n }\n for (const [key, matches] of byCell.entries()) {\n const [rowId, colKeyStr] = key.split(\"|\");\n const first = matches[0];\n if (!first) continue;\n const colIndex = first.colIndex;\n const col = schema.columns[colIndex];\n if (!col) continue;\n if (!rowId || !colKeyStr) continue;\n const colKey = colKeyStr;\n const current = this.dataModel.getCell(rowId, colKey);\n const currentText = stringifyCellValue(current, col);\n const nextText = this.applyReplacementAllInCell(currentText, matches);\n this.applyEdit(rowId, colKey, nextText);\n }\n this.recompute();\n }\n\n private applyReplacement(text: string, match: FindReplaceMatch) {\n const { query, replace, options } = this.state;\n if (!query) return text;\n if (options.regex) {\n try {\n const flags = `g${options.caseInsensitive ? \"i\" : \"\"}`;\n const re = new RegExp(query, flags);\n let seen = -1;\n return text.replace(re, (substr, ...args) => {\n const off = args[args.length - 2];\n if (typeof off !== \"number\") return substr;\n if (off !== match.start) return substr;\n if (seen === off) return substr;\n seen = off;\n return replace;\n });\n } catch {\n return text;\n }\n }\n return text.slice(0, match.start) + replace + text.slice(match.end);\n }\n\n private applyReplacementAllInCell(text: string, matches: FindReplaceMatch[]) {\n if (!matches.length) return text;\n const { query, replace, options } = this.state;\n if (!query) return text;\n if (options.regex) {\n try {\n const flags = `g${options.caseInsensitive ? \"i\" : \"\"}`;\n const re = new RegExp(query, flags);\n return text.replace(re, replace);\n } catch {\n return text;\n }\n }\n // Plain mode: apply from end to keep offsets valid.\n const sorted = [...matches].sort((a, b) => b.start - a.start);\n let out = text;\n for (const m of sorted) {\n out = out.slice(0, m.start) + replace + out.slice(m.end);\n }\n return out;\n }\n\n private scheduleRecompute() {\n if (this.debounceId !== null) window.clearTimeout(this.debounceId);\n this.debounceId = window.setTimeout(() => {\n this.debounceId = null;\n this.recompute();\n }, 180);\n }\n\n recompute() {\n const { query, options } = this.state;\n if (!query) {\n this.setState({ ...this.state, matches: [], activeIndex: -1, error: null });\n return;\n }\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const matches: FindReplaceMatch[] = [];\n let error: string | null = null;\n\n let re: RegExp | null = null;\n if (options.regex) {\n try {\n const flags = `g${options.caseInsensitive ? \"i\" : \"\"}`;\n re = new RegExp(query, flags);\n } catch (e) {\n error = e instanceof Error ? e.message : \"Invalid pattern\";\n }\n } else {\n const flags = options.caseInsensitive ? \"gi\" : \"g\";\n re = new RegExp(escapeRegExp(query), flags);\n }\n\n if (!re || error) {\n this.setState({\n ...this.state,\n matches: [],\n activeIndex: -1,\n error: error ?? \"Invalid pattern\",\n });\n return;\n }\n\n for (let r = 0; r < rows.length; r += 1) {\n const row = rows[r];\n if (!row) continue;\n for (let c = 0; c < schema.columns.length; c += 1) {\n const col = schema.columns[c];\n if (!col) continue;\n if (view.hiddenColumns?.some((k) => String(k) === String(col.key))) continue;\n const cellValue = this.dataModel.getCell(row.id, col.key);\n const text = stringifyCellValue(cellValue, col);\n if (!text) continue;\n re.lastIndex = 0;\n let m: RegExpExecArray | null = re.exec(text);\n while (m) {\n const start = m.index;\n const end = start + (m[0]?.length ?? 0);\n matches.push({\n rowId: row.id,\n colKey: col.key,\n rowIndex: r,\n colIndex: c,\n start,\n end,\n text,\n });\n if (m[0] === \"\") break;\n m = re.exec(text);\n }\n }\n }\n\n const activeIndex = matches.length ? clampIndex(this.state.activeIndex, matches.length) : -1;\n this.setState({ ...this.state, matches, activeIndex, error: null });\n }\n\n private setState(next: FindReplaceState) {\n this.state = next;\n for (const l of this.listeners) l(this.state);\n }\n}\n","import type { LockMode, ServerAdapter, UserInfo } from './types';\n\nexport class LockManager {\n private lockedRows = new Set<string>();\n private mode: LockMode = 'none';\n private server?: ServerAdapter;\n private user?: UserInfo;\n\n constructor(mode: LockMode, server?: ServerAdapter, user?: UserInfo) {\n this.mode = mode;\n this.server = server;\n this.user = user;\n }\n\n setMode(mode: LockMode) {\n this.mode = mode;\n }\n\n setUser(user?: UserInfo) {\n this.user = user;\n }\n\n async selectRow(rowId: string) {\n if (this.mode !== 'row') return;\n if (this.lockedRows.has(rowId)) return;\n this.lockedRows.add(rowId);\n if (this.server && this.user) {\n try {\n await this.server.lockRow(rowId, this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('lockRow failed', e);\n }\n }\n }\n\n async unlockOnMove(currentRowId?: string) {\n if (this.mode !== 'row') return;\n if (!currentRowId) return;\n await this.unlockRows([currentRowId]);\n }\n\n async unlockOnCommit(keepRowId?: string) {\n if (this.mode !== 'row') return;\n const toUnlock: string[] = [];\n for (const id of this.lockedRows) {\n if (id !== keepRowId) toUnlock.push(id);\n }\n if (toUnlock.length) {\n await this.unlockRows(toUnlock);\n }\n }\n\n async unlockRows(rowIds: string[]) {\n for (const id of rowIds) this.lockedRows.delete(id);\n if (this.server && this.user) {\n try {\n await this.server.unlockRows(rowIds, this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('unlockRows failed', e);\n }\n }\n }\n\n getLockedRows() {\n return new Set(this.lockedRows);\n }\n}\n","import type { ColumnSchema } from \"./types\";\nimport { parseIsoDate } from \"./dateUtils\";\n\nconst DAY_MS = 86_400_000;\n\nexport function safeParseDate(value: string): Date | null {\n const parsed = parseIsoDate(value);\n if (!parsed) return null;\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nexport function safeParseTime(value: string): Date | null {\n const parsed = new Date(`1970-01-01T${value}`);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nexport function toRawValue(raw: unknown, value: unknown, col: ColumnSchema): string | null {\n void raw;\n if (value === null || value === undefined) return null;\n if (col.type === \"string\") return null;\n if (col.type === \"boolean\") return String(Boolean(value));\n if (col.type === \"number\" && typeof value === \"number\") return String(value);\n if (col.type === \"datetime\") {\n const d = value instanceof Date ? value : safeParseDate(String(value));\n return d ? String(d.getTime()) : null;\n }\n if (col.type === \"date\") {\n const d = value instanceof Date ? value : safeParseDate(String(value));\n if (!d) return null;\n const floored = Math.floor(d.getTime() / DAY_MS) * DAY_MS;\n return String(floored);\n }\n if (col.type === \"time\") {\n const d = value instanceof Date ? value : safeParseTime(String(value));\n if (!d) return null;\n return String(d.getTime() % DAY_MS);\n }\n return null;\n}\n","import type { Schema, View } from \"./types\";\n\nexport const HEADER_HEIGHT_PX = 24;\nexport const ROW_HEADER_WIDTH_PX = 48;\nexport const DEFAULT_ROW_HEIGHT_PX = 24;\n\nexport function getColumnWidths(schema: Schema, view: View, fallbackWidth = 100): number[] {\n const extraByType: Partial<Record<string, number>> = {\n // Reserve extra space for browser UI affordances (e.g. date picker icon) and formatting.\n date: 8,\n };\n return schema.columns.map((c) => {\n const base = view.columnWidths?.[String(c.key)] ?? c.width ?? fallbackWidth;\n const extra = extraByType[c.type] ?? 0;\n return base + extra;\n });\n}\n","import type { DataModel } from \"./dataModel\";\nimport type { EditMode, SelectionRange } from \"./types\";\n\nexport type FillHandleMode = 'copy' | 'sequence';\n\nexport interface FillHandleSource {\n colKey: string;\n colIndex: number;\n startRowIndex: number;\n endRowIndex: number;\n mode: FillHandleMode;\n}\n\nfunction normalizeRange(range: SelectionRange): SelectionRange {\n return {\n ...range,\n startRow: Math.min(range.startRow, range.endRow),\n endRow: Math.max(range.startRow, range.endRow),\n startCol: Math.min(range.startCol, range.endCol),\n endCol: Math.max(range.startCol, range.endCol)\n };\n}\n\nfunction parseStringSuffixNumber(value: string) {\n const m = /^(.*?)(\\d+)$/.exec(value);\n if (!m) return null;\n const prefix = m[1] ?? '';\n const digits = m[2] ?? '';\n const num = Number(digits);\n if (!Number.isFinite(num)) return null;\n return { prefix, num, width: digits.length };\n}\n\nfunction coerceToTime(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return new Date(value);\n if (typeof value === 'string') {\n const s = value.trim();\n if (/^\\d{1,2}:\\d{2}(:\\d{2}(\\.\\d{1,3})?)?$/.test(s)) {\n const d = new Date(`1970-01-01T${s}`);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n const d = new Date(s);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nfunction coerceToDate(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return new Date(value);\n if (typeof value === 'string') {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nfunction daysInMonthUtc(year: number, month0: number) {\n return new Date(Date.UTC(year, month0 + 1, 0)).getUTCDate();\n}\n\nfunction addMonthsUtcClamped(baseUtc: Date, months: number) {\n const y = baseUtc.getUTCFullYear();\n const m = baseUtc.getUTCMonth();\n const d = baseUtc.getUTCDate();\n const hh = baseUtc.getUTCHours();\n const mm = baseUtc.getUTCMinutes();\n const ss = baseUtc.getUTCSeconds();\n const ms = baseUtc.getUTCMilliseconds();\n const totalMonths = y * 12 + m + months;\n const ny = Math.floor(totalMonths / 12);\n const nm = ((totalMonths % 12) + 12) % 12;\n const maxDay = daysInMonthUtc(ny, nm);\n const nd = Math.min(d, maxDay);\n return new Date(Date.UTC(ny, nm, nd, hh, mm, ss, ms));\n}\n\nfunction addYearsUtcClamped(baseUtc: Date, years: number) {\n return addMonthsUtcClamped(baseUtc, years * 12);\n}\n\nfunction addMonthsLocalClamped(base: Date, months: number) {\n const y = base.getFullYear();\n const m = base.getMonth();\n const d = base.getDate();\n const hh = base.getHours();\n const mm = base.getMinutes();\n const ss = base.getSeconds();\n const ms = base.getMilliseconds();\n const totalMonths = y * 12 + m + months;\n const ny = Math.floor(totalMonths / 12);\n const nm = ((totalMonths % 12) + 12) % 12;\n const maxDay = new Date(ny, nm + 1, 0).getDate();\n const nd = Math.min(d, maxDay);\n const out = new Date(ny, nm, nd, hh, mm, ss, ms);\n return out;\n}\n\nfunction addYearsLocalClamped(base: Date, years: number) {\n return addMonthsLocalClamped(base, years * 12);\n}\n\nexport function getFillHandleSource(dataModel: DataModel, ranges: SelectionRange[]): FillHandleSource | null {\n if (ranges.length !== 1) return null;\n const range = normalizeRange(ranges[0]!);\n if (range.kind !== 'cells') return null;\n const width = range.endCol - range.startCol + 1;\n const height = range.endRow - range.startRow + 1;\n if (width !== 1) return null;\n if (height !== 1 && height !== 2) return null;\n\n const schema = dataModel.getSchema();\n const col = schema.columns[range.startCol];\n if (!col) return null;\n\n if (col.type === 'boolean') {\n if (height !== 1) return null;\n return {\n colKey: col.key,\n colIndex: range.startCol,\n startRowIndex: range.startRow,\n endRowIndex: range.endRow,\n mode: 'copy'\n };\n }\n\n if (height === 1) {\n return {\n colKey: col.key,\n colIndex: range.startCol,\n startRowIndex: range.startRow,\n endRowIndex: range.endRow,\n mode: 'copy'\n };\n }\n\n // height === 2\n if (col.type === 'string') {\n const rows = dataModel.listRows();\n const r1 = rows[range.startRow];\n const r2 = rows[range.endRow];\n if (!r1 || !r2) return null;\n const s1 = String(dataModel.getCell(r1.id, col.key) ?? '');\n const s2 = String(dataModel.getCell(r2.id, col.key) ?? '');\n const p1 = parseStringSuffixNumber(s1);\n const p2 = parseStringSuffixNumber(s2);\n if (!p1 || !p2) return null;\n if (p1.prefix !== p2.prefix) return null;\n if (p1.width !== p2.width) return null;\n return {\n colKey: col.key,\n colIndex: range.startCol,\n startRowIndex: range.startRow,\n endRowIndex: range.endRow,\n mode: 'sequence'\n };\n }\n\n if (col.type === 'number' || col.type === 'date' || col.type === 'time' || col.type === 'datetime') {\n return {\n colKey: col.key,\n colIndex: range.startCol,\n startRowIndex: range.startRow,\n endRowIndex: range.endRow,\n mode: 'sequence'\n };\n }\n\n // enum/tags: sequence not supported (copy only, but 2-cell handle should not appear)\n return null;\n}\n\nexport function makeFillValueGetter(\n dataModel: DataModel,\n source: FillHandleSource\n): ((offsetFromEnd: number) => unknown) | null {\n const schema = dataModel.getSchema();\n const rows = dataModel.listRows();\n const col = schema.columns[source.colIndex];\n if (!col) return null;\n const r1 = rows[source.startRowIndex];\n const r2 = rows[source.endRowIndex];\n if (!r1 || !r2) return null;\n\n const v1 = dataModel.getCell(r1.id, col.key);\n const v2 = dataModel.getCell(r2.id, col.key);\n\n if (source.mode === 'copy') {\n return () => v2;\n }\n\n // sequence\n if (col.type === 'number') {\n const n1 = typeof v1 === 'number' ? v1 : Number(v1);\n const n2 = typeof v2 === 'number' ? v2 : Number(v2);\n if (!Number.isFinite(n1) || !Number.isFinite(n2)) return null;\n const step = n2 - n1;\n return (offsetFromEnd) => n2 + step * offsetFromEnd;\n }\n\n if (col.type === 'date' || col.type === 'time' || col.type === 'datetime') {\n const d1 = col.type === 'time' ? coerceToTime(v1) : coerceToDate(v1);\n const d2 = col.type === 'time' ? coerceToTime(v2) : coerceToDate(v2);\n if (!d1 || !d2) return null;\n const t1 = d1.getTime();\n const t2 = d2.getTime();\n const stepMs = t2 - t1;\n\n if (col.type === 'time') {\n return (offsetFromEnd) => new Date(t2 + stepMs * offsetFromEnd);\n }\n\n // Calendar-aware stepping for date/datetime to avoid month-length/leap-year drift.\n if (col.type === 'date') {\n const sameDayUtc = d1.getUTCDate() === d2.getUTCDate();\n const sameMonthDayUtc = sameDayUtc && d1.getUTCMonth() === d2.getUTCMonth();\n if (sameMonthDayUtc) {\n const stepYears = d2.getUTCFullYear() - d1.getUTCFullYear();\n if (stepYears !== 0) {\n const baseUtc = new Date(Date.UTC(d2.getUTCFullYear(), d2.getUTCMonth(), d2.getUTCDate()));\n return (offsetFromEnd) => addYearsUtcClamped(baseUtc, stepYears * offsetFromEnd);\n }\n } else if (sameDayUtc) {\n const stepMonths =\n (d2.getUTCFullYear() - d1.getUTCFullYear()) * 12 + (d2.getUTCMonth() - d1.getUTCMonth());\n if (stepMonths !== 0) {\n const baseUtc = new Date(Date.UTC(d2.getUTCFullYear(), d2.getUTCMonth(), d2.getUTCDate()));\n return (offsetFromEnd) => addMonthsUtcClamped(baseUtc, stepMonths * offsetFromEnd);\n }\n }\n } else {\n const sameDayLocal = d1.getDate() === d2.getDate();\n const sameMonthDayLocal = sameDayLocal && d1.getMonth() === d2.getMonth();\n if (sameMonthDayLocal) {\n const stepYears = d2.getFullYear() - d1.getFullYear();\n if (stepYears !== 0) {\n return (offsetFromEnd) => addYearsLocalClamped(d2, stepYears * offsetFromEnd);\n }\n } else if (sameDayLocal) {\n const stepMonths = (d2.getFullYear() - d1.getFullYear()) * 12 + (d2.getMonth() - d1.getMonth());\n if (stepMonths !== 0) {\n return (offsetFromEnd) => addMonthsLocalClamped(d2, stepMonths * offsetFromEnd);\n }\n }\n }\n\n // Fallback to millisecond delta.\n return (offsetFromEnd) => new Date(t2 + stepMs * offsetFromEnd);\n }\n\n if (col.type === 'string') {\n const s1 = String(v1 ?? '');\n const s2 = String(v2 ?? '');\n const p1 = parseStringSuffixNumber(s1);\n const p2 = parseStringSuffixNumber(s2);\n if (!p1 || !p2) return null;\n if (p1.prefix !== p2.prefix) return null;\n if (p1.width !== p2.width) return null;\n const step = p2.num - p1.num;\n return (offsetFromEnd) => {\n const next = p2.num + step * offsetFromEnd;\n const sign = next < 0 ? '-' : '';\n const abs = Math.abs(next);\n const digits = String(abs).padStart(p2.width, '0');\n return `${p2.prefix}${sign}${digits}`;\n };\n }\n\n return null;\n}\n\nexport const FILL_HANDLE_VISUAL_SIZE_PX = 12;\nexport const FILL_HANDLE_HIT_SIZE_PX = 14;\n\nexport function getFillHandleRect(cellRect: DOMRect, size = FILL_HANDLE_VISUAL_SIZE_PX): DOMRect {\n return new DOMRect(cellRect.right - size - 1, cellRect.bottom - size - 1, size, size);\n}\n\nexport function isPointInRect(x: number, y: number, rect: DOMRect) {\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n}\n\nexport function shouldShowFillHandle(\n dataModel: DataModel,\n ranges: SelectionRange[],\n activeRowId: string | null,\n activeColKey: string | null,\n editMode: EditMode,\n): boolean {\n if (editMode === \"readonly\") return false;\n const src = getFillHandleSource(dataModel, ranges);\n if (!src) return false;\n if (!activeRowId || activeRowId === '__all__') return false;\n if (activeColKey === null) return false;\n if (activeColKey === '__all__' || activeColKey === null) return false;\n if (activeColKey !== src.colKey) return false;\n if (dataModel.isReadonly(activeRowId, activeColKey)) return false;\n return true;\n}\n","import type { ColumnSchema, ResolvedCellStyle, StyleDelta } from \"./types\";\nimport type { DataModel } from \"./dataModel\";\n\nexport function columnFormatToStyle(col: ColumnSchema): ResolvedCellStyle {\n const fmt = col.style;\n const dec = fmt?.decorations;\n return {\n backgroundColor: fmt?.backgroundColor,\n textColor: fmt?.textColor,\n bold: dec?.bold,\n italic: dec?.italic,\n underline: dec?.underline,\n strike: dec?.strike,\n };\n}\n\nexport function mergeStyle(base: ResolvedCellStyle, override?: StyleDelta | null): ResolvedCellStyle {\n if (!override) return base;\n return {\n backgroundColor: override.backgroundColor ?? base.backgroundColor,\n textColor: override.textColor ?? base.textColor,\n bold: override.bold ?? base.bold,\n italic: override.italic ?? base.italic,\n underline: override.underline ?? base.underline,\n strike: override.strike ?? base.strike,\n };\n}\n\nexport function resolveCellStyles(\n dataModel: DataModel,\n rowId: string,\n col: ColumnSchema,\n): { columnStyle: ResolvedCellStyle; cellStyle: StyleDelta; resolved: ResolvedCellStyle } {\n const columnStyle = columnFormatToStyle(col);\n const conditional = dataModel.resolveConditionalStyle(rowId, col).delta ?? {};\n const cellStyle = dataModel.getCellStyle(rowId, col.key) ?? {};\n const resolved = mergeStyle(mergeStyle(columnStyle, conditional), cellStyle);\n return { columnStyle, cellStyle, resolved };\n}\n\nexport function styleToCssText(style: ResolvedCellStyle): string {\n let css = \"\";\n if (style.backgroundColor) css += `background-color:${style.backgroundColor};`;\n if (style.textColor) css += `color:${style.textColor};`;\n if (style.bold) css += \"font-weight:600;\";\n if (style.italic) css += \"font-style:italic;\";\n const dec: string[] = [];\n if (style.underline) dec.push(\"underline\");\n if (style.strike) dec.push(\"line-through\");\n if (dec.length) css += `text-decoration-line:${dec.join(\" \")};`;\n return css;\n}\n","import type { DataModel } from \"./dataModel\";\nimport type {\n InternalRow,\n Schema,\n ColumnSchema,\n SelectionRange,\n View,\n ViewFilterValues,\n EditMode,\n} from \"./types\";\nimport { coerceDatePattern, formatDateLite, parseIsoDate } from \"./dateUtils\";\nimport { toRawValue } from \"./cellValueCodec\";\nimport {\n DEFAULT_ROW_HEIGHT_PX,\n HEADER_HEIGHT_PX,\n ROW_HEADER_WIDTH_PX,\n getColumnWidths,\n} from \"./geometry\";\nimport {\n FILL_HANDLE_HIT_SIZE_PX,\n FILL_HANDLE_VISUAL_SIZE_PX,\n getFillHandleRect,\n isPointInRect,\n shouldShowFillHandle,\n} from \"./fillHandle\";\nimport { removeFromParent } from \"./utils\";\nimport { columnFormatToStyle, mergeStyle, styleToCssText } from \"./styleResolver\";\n\nfunction getColumnSortDir(view: View, colKey: string): \"asc\" | \"desc\" | null {\n const s = view.sorts?.[0];\n if (!s) return null;\n return s.key === colKey ? s.dir : null;\n}\n\nfunction hasActiveColumnFilter(view: View, colKey: string): boolean {\n const hasValues = (view.filters ?? []).some((f) => {\n const vf = f as ViewFilterValues;\n return vf?.kind === \"values\" && vf.key === colKey;\n });\n if (hasValues) return true;\n const diag = view.columnDiagnostics?.[colKey];\n return Boolean(diag?.errors || diag?.warnings);\n}\n\nfunction svgFunnel() {\n // Simple funnel icon (stroke only) for filter affordance.\n return `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M3 5h18l-7 8v6l-4 2v-8L3 5z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"/>\n </svg>\n `.trim();\n}\n\nfunction svgArrow(dir: \"asc\" | \"desc\") {\n const d = dir === \"asc\" ? \"M12 6l6 8H6l6-8z\" : \"M12 18l-6-8h12l-6 8z\";\n return `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"${d}\" fill=\"currentColor\"/>\n </svg>\n `.trim();\n}\n\nfunction drawDiagnosticCorner(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n level: \"warning\" | \"error\",\n) {\n const size = Math.min(10, Math.floor(Math.min(w, h) / 2));\n if (size <= 0) return;\n const color = level === \"error\" ? \"#ef4444\" : \"#f59e0b\";\n ctx.save();\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x + w, y);\n ctx.lineTo(x + w - size, y);\n ctx.lineTo(x + w, y + size);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nclass ValueFormatCache {\n private numberFormatCache = new Map<string, Intl.NumberFormat>();\n private dateParseCache = new Map<string, Date>();\n\n getNumberFormatter(options: Intl.NumberFormatOptions): Intl.NumberFormat {\n const key = JSON.stringify(options);\n let fmt = this.numberFormatCache.get(key);\n if (!fmt) {\n fmt = new Intl.NumberFormat(\"en-US\", options);\n this.numberFormatCache.set(key, fmt);\n }\n return fmt;\n }\n\n parseIsoDate(value: string): Date | null {\n const cached = this.dateParseCache.get(value);\n if (cached) return cached;\n const parsed = parseIsoDate(value);\n if (!parsed || Number.isNaN(parsed.getTime())) return null;\n this.dateParseCache.set(value, parsed);\n return parsed;\n }\n}\n\nfunction drawFunnelIcon(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n size: number,\n alpha: number,\n) {\n ctx.save();\n ctx.globalAlpha = alpha;\n ctx.strokeStyle = \"rgba(15,23,42,1)\";\n ctx.lineWidth = 2;\n ctx.lineJoin = \"round\";\n ctx.beginPath();\n // Top trapezoid\n ctx.moveTo(x, y);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x + Math.round(size * 0.62), y + Math.round(size * 0.46));\n ctx.lineTo(x + Math.round(size * 0.38), y + Math.round(size * 0.46));\n ctx.closePath();\n ctx.stroke();\n // Stem\n ctx.beginPath();\n ctx.moveTo(x + Math.round(size * 0.46), y + Math.round(size * 0.46));\n ctx.lineTo(x + Math.round(size * 0.46), y + size);\n ctx.lineTo(x + Math.round(size * 0.54), y + size - 2);\n ctx.lineTo(x + Math.round(size * 0.54), y + Math.round(size * 0.46));\n ctx.stroke();\n ctx.restore();\n}\n\nfunction drawSortArrowIcon(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n size: number,\n alpha: number,\n dir: \"asc\" | \"desc\",\n) {\n ctx.save();\n ctx.globalAlpha = alpha;\n ctx.fillStyle = \"rgba(15,23,42,1)\";\n ctx.beginPath();\n if (dir === \"asc\") {\n ctx.moveTo(x + size / 2, y);\n ctx.lineTo(x + size, y + size);\n ctx.lineTo(x, y + size);\n } else {\n ctx.moveTo(x, y);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x + size / 2, y + size);\n }\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nclass FenwickTree {\n // 1-based BIT\n private tree: number[];\n private n: number;\n\n constructor(n: number) {\n this.n = n;\n this.tree = new Array(n + 1).fill(0);\n }\n\n static from(values: number[]) {\n const ft = new FenwickTree(values.length);\n for (let i = 0; i < values.length; i += 1) ft.add(i, values[i] ?? 0);\n return ft;\n }\n\n sum(count: number) {\n // sum of first `count` items: [0..count-1]\n let i = Math.max(0, Math.min(this.n, count));\n let res = 0;\n while (i > 0) {\n res += this.tree[i] ?? 0;\n i -= i & -i;\n }\n return res;\n }\n\n total() {\n return this.sum(this.n);\n }\n\n add(index0: number, delta: number) {\n let i = index0 + 1;\n if (i <= 0 || i > this.n) return;\n while (i <= this.n) {\n this.tree[i] = (this.tree[i] ?? 0) + delta;\n i += i & -i;\n }\n }\n\n /**\n * Returns the smallest index `i` (0-based) such that `sum(i + 1) >= target`.\n * If `target <= 0`, returns 0. If `target > total`, returns `n - 1`.\n */\n lowerBound(target: number) {\n if (this.n <= 0) return 0;\n if (target <= 0) return 0;\n const total = this.total();\n if (target > total) return this.n - 1;\n let idx = 0;\n // Largest power of two >= n\n let bit = 1;\n while (bit <= this.n) bit <<= 1;\n let acc = 0;\n for (let step = bit; step !== 0; step >>= 1) {\n const next = idx + step;\n if (next <= this.n) {\n const nextAcc = acc + (this.tree[next] ?? 0);\n if (nextAcc < target) {\n idx = next;\n acc = nextAcc;\n }\n }\n }\n // idx is the last position where prefix sum < target; answer is idx (0-based)\n return Math.min(this.n - 1, idx);\n }\n}\n\nexport interface ViewportState {\n scrollTop: number;\n scrollLeft: number;\n clientWidth: number;\n clientHeight: number;\n deltaX: number;\n deltaY: number;\n timestamp: number;\n}\n\nexport interface Renderer {\n mount(root: HTMLElement): void;\n render(state?: ViewportState): void;\n destroy(): void;\n getCellElements(): NodeListOf<HTMLElement> | null;\n hitTest(\n event: MouseEvent,\n ): { rowId: string; colKey: string | null; element?: HTMLElement; rect: DOMRect } | null;\n setActiveCell(rowId: string | null, colKey: string | null): void;\n setSelection(ranges: SelectionRange[]): void;\n}\n\nexport class HTMLRenderer implements Renderer {\n private tableEl: HTMLTableElement | null = null;\n private defaultRowHeight = DEFAULT_ROW_HEIGHT_PX;\n private rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n private activeRowId: string | null = null;\n private activeColKey: string | null = null;\n private selection: SelectionRange[] = [];\n private valueFormatCache = new ValueFormatCache();\n private measureCache = new Map<string, { height: number; frame: number }>();\n private frame = 0;\n constructor(private dataModel: DataModel) {}\n\n mount(root: HTMLElement) {\n this.tableEl = document.createElement(\"table\");\n this.tableEl.dataset.extableRenderer = \"html\";\n root.innerHTML = \"\";\n root.appendChild(this.tableEl);\n this.render();\n }\n\n setActiveCell(rowId: string | null, colKey: string | null) {\n this.activeRowId = rowId;\n this.activeColKey = colKey;\n this.updateActiveClasses();\n }\n\n setSelection(ranges: SelectionRange[]) {\n this.selection = ranges;\n this.applySelectionClasses();\n }\n\n render(_state?: ViewportState) {\n this.frame += 1;\n if (!this.tableEl) return;\n const scrollContainer = this.tableEl.parentElement;\n const prevTop = scrollContainer?.scrollTop ?? 0;\n const prevLeft = scrollContainer?.scrollLeft ?? 0;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n this.tableEl.innerHTML = \"\";\n const colWidths = getColumnWidths(schema, view);\n const colBaseStyles = schema.columns.map((c) => columnFormatToStyle(c));\n const colBaseCss = colBaseStyles.map((s) => styleToCssText(s));\n const totalWidth = this.rowHeaderWidth + colWidths.reduce((acc, w) => acc + (w ?? 0), 0);\n const colgroup = document.createElement(\"colgroup\");\n const rowCol = document.createElement(\"col\");\n rowCol.style.width = `${this.rowHeaderWidth}px`;\n colgroup.appendChild(rowCol);\n for (const w of colWidths) {\n const colEl = document.createElement(\"col\");\n if (w) colEl.style.width = `${w}px`;\n colgroup.appendChild(colEl);\n }\n this.tableEl.appendChild(colgroup);\n this.tableEl.style.width = `${totalWidth}px`;\n this.tableEl.appendChild(this.renderHeader(schema, colWidths));\n const body = document.createElement(\"tbody\");\n for (const row of rows) {\n body.appendChild(this.renderRow(row, schema, colWidths, colBaseStyles, colBaseCss));\n }\n this.tableEl.appendChild(body);\n this.updateActiveClasses();\n this.applySelectionClasses();\n if (scrollContainer) {\n scrollContainer.scrollTop = prevTop;\n scrollContainer.scrollLeft = prevLeft;\n }\n for (const [key, entry] of Array.from(this.measureCache.entries())) {\n if (entry.frame !== this.frame) this.measureCache.delete(key);\n }\n }\n\n destroy() {\n removeFromParent(this.tableEl);\n this.tableEl = null;\n }\n\n getCellElements() {\n return this.tableEl?.querySelectorAll<HTMLElement>(\"tr[data-row-id] td[data-col-key]\") ?? null;\n }\n\n hitTest(event: MouseEvent) {\n const target = event.target as HTMLElement | null;\n if (!target) return null;\n const corner = target.closest<HTMLElement>(\"th.extable-corner\");\n if (corner) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n element: corner,\n rect: corner.getBoundingClientRect(),\n };\n }\n const rowHeader = target.closest<HTMLElement>(\"th.extable-row-header:not(.extable-corner)\");\n if (rowHeader) {\n const row = rowHeader.closest<HTMLElement>(\"tr[data-row-id]\");\n if (row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: null,\n element: rowHeader,\n rect: rowHeader.getBoundingClientRect(),\n };\n }\n }\n const cell = target.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n element: cell,\n rect: cell.getBoundingClientRect(),\n };\n }\n\n private renderHeader(schema: Schema, colWidths: number[]) {\n const thead = document.createElement(\"thead\");\n const tr = document.createElement(\"tr\");\n const rowTh = document.createElement(\"th\");\n rowTh.classList.add(\"extable-row-header\", \"extable-corner\");\n rowTh.textContent = \"\";\n rowTh.style.width = `${this.rowHeaderWidth}px`;\n if (this.activeRowId) rowTh.classList.toggle(\"extable-active-row-header\", true);\n rowTh.dataset.colKey = \"\";\n tr.appendChild(rowTh);\n const view = this.dataModel.getView();\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col) continue;\n const th = document.createElement(\"th\");\n th.dataset.colKey = col.key;\n const sortDir = getColumnSortDir(view, col.key);\n const hasFilter = hasActiveColumnFilter(view, col.key);\n if (sortDir) th.dataset.extableSortDir = sortDir;\n else th.removeAttribute(\"data-extable-sort-dir\");\n if (hasFilter) th.dataset.extableFsActive = \"1\";\n else th.removeAttribute(\"data-extable-fs-active\");\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"extable-col-header\";\n const label = document.createElement(\"span\");\n label.className = \"extable-col-header-text\";\n label.textContent = col.header ?? col.key;\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"extable-filter-sort-trigger\";\n btn.dataset.extableFsOpen = \"1\";\n btn.dataset.extableColKey = col.key;\n btn.title = \"Filter / Sort\";\n btn.innerHTML = sortDir ? svgArrow(sortDir) : svgFunnel();\n wrap.appendChild(label);\n wrap.appendChild(btn);\n th.appendChild(wrap);\n const width = colWidths[idx] ?? col.width;\n if (width) th.style.width = `${width}px`;\n th.dataset.colKey = col.key;\n if (this.activeColKey !== null && this.activeColKey === col.key) {\n th.classList.add(\"extable-active-col-header\");\n }\n tr.appendChild(th);\n }\n thead.appendChild(tr);\n return thead;\n }\n\n private renderRow(\n row: InternalRow,\n schema: Schema,\n colWidths: number[],\n colBaseStyles: ReturnType<typeof columnFormatToStyle>[],\n colBaseCss: string[],\n ) {\n const tr = document.createElement(\"tr\");\n tr.dataset.rowId = row.id;\n const view = this.dataModel.getView();\n const rowHeader = document.createElement(\"th\");\n rowHeader.scope = \"row\";\n rowHeader.classList.add(\"extable-row-header\");\n const index = this.dataModel.getDisplayIndex(row.id) ?? \"\";\n rowHeader.textContent = String(index);\n rowHeader.style.width = `${this.rowHeaderWidth}px`;\n if (this.activeRowId === row.id) rowHeader.classList.add(\"extable-active-row-header\");\n tr.appendChild(rowHeader);\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col) continue;\n const td = document.createElement(\"td\");\n td.classList.add(\"extable-cell\");\n td.dataset.colKey = col.key;\n if (col.type === \"boolean\") td.classList.add(\"extable-boolean\");\n const isPending = this.dataModel.hasPending(row.id, col.key);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, col);\n const cellStyle = this.dataModel.getCellStyle(row.id, col.key);\n if (!cellStyle && !condRes.delta && !isPending) {\n const css = colBaseCss[idx] ?? \"\";\n if (css) td.style.cssText = css;\n } else {\n const baseStyle = colBaseStyles[idx] ?? {};\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const merged = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const forCss = isPending ? { ...merged, textColor: undefined } : merged;\n const css = styleToCssText(forCss);\n if (css) td.style.cssText = css;\n }\n const width = colWidths[idx] ?? view.columnWidths?.[col.key] ?? col.width;\n if (width) td.style.width = `${width}px`;\n const wrap = view.wrapText?.[col.key] ?? col.wrapText;\n td.classList.add(wrap ? \"cell-wrap\" : \"cell-nowrap\");\n const raw = this.dataModel.getRawCell(row.id, col.key);\n const valueRes = this.dataModel.resolveCellValue(row.id, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const formatted = textOverride\n ? { text: textOverride as string }\n : this.formatValue(valueRes.value, col);\n td.textContent = formatted.text;\n if (formatted.color) td.style.color = formatted.color;\n const marker = this.dataModel.getCellMarker(row.id, col.key);\n if (marker) {\n td.classList.toggle(\"extable-diag-warning\", marker.level === \"warning\");\n td.classList.toggle(\"extable-diag-error\", marker.level === \"error\");\n td.dataset.extableDiagMessage = marker.message;\n } else {\n td.classList.remove(\"extable-diag-warning\", \"extable-diag-error\");\n td.removeAttribute(\"data-extable-diag-message\");\n }\n const align = col.style?.align ?? (col.type === \"number\" ? \"right\" : \"left\");\n td.classList.add(align === \"right\" ? \"align-right\" : \"align-left\");\n const rawNumbered = toRawValue(raw, valueRes.value, col);\n if (rawNumbered !== null) {\n td.dataset.raw = rawNumbered;\n } else {\n const rawStr = raw === null || raw === undefined ? \"\" : String(raw);\n td.dataset.raw = rawStr;\n }\n if (isPending) td.classList.add(\"pending\");\n if (this.dataModel.isReadonly(row.id, col.key)) {\n td.classList.add(\"extable-readonly\", \"extable-readonly-muted\");\n } else {\n td.classList.add(\"extable-editable\");\n }\n if (\n this.activeRowId === row.id &&\n this.activeColKey !== null &&\n this.activeColKey === col.key\n ) {\n td.classList.add(\"extable-active-cell\");\n }\n tr.appendChild(td);\n }\n // variable row height based on measured content when wrap enabled\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n if (wrapAny) {\n let maxHeight = this.defaultRowHeight;\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col || !col.wrapText) continue;\n const width = colWidths[idx] ?? view.columnWidths?.[col.key] ?? col.width ?? 100;\n const valueRes = this.dataModel.resolveCellValue(row.id, col);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, col);\n const textOverride =\n valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const text = textOverride\n ? \"#ERROR\"\n : valueRes.value === null || valueRes.value === undefined\n ? \"\"\n : String(valueRes.value);\n const version = this.dataModel.getRowVersion(row.id);\n const key = `${row.id}|${col.key}|${version}|${width}|${text}`;\n const cached = this.measureCache.get(key);\n if (cached) {\n cached.frame = this.frame;\n this.measureCache.set(key, cached);\n maxHeight = Math.max(maxHeight, cached.height);\n continue;\n }\n const measure = document.createElement(\"span\");\n measure.style.visibility = \"hidden\";\n measure.style.position = \"absolute\";\n measure.style.left = \"-10000px\";\n measure.style.top = \"0\";\n measure.style.whiteSpace = \"pre-wrap\";\n measure.style.overflowWrap = \"anywhere\";\n measure.style.display = \"inline-block\";\n measure.style.width = `${width}px`;\n measure.textContent = text;\n const measureHost = this.tableEl?.parentElement;\n if (!measureHost) continue;\n measureHost.appendChild(measure);\n const h = measure.clientHeight + 10; // padding allowance\n measure.remove();\n this.measureCache.set(key, { height: h, frame: this.frame });\n maxHeight = Math.max(maxHeight, h);\n }\n tr.style.height = `${maxHeight}px`;\n this.dataModel.setRowHeight(row.id, maxHeight);\n } else {\n tr.style.height = `${this.defaultRowHeight}px`;\n this.dataModel.setRowHeight(row.id, this.defaultRowHeight);\n }\n return tr;\n }\n\n private updateActiveClasses() {\n if (!this.tableEl) return;\n const isAll = this.activeRowId === \"__all__\" && this.activeColKey === \"__all__\";\n this.tableEl.classList.toggle(\"extable-all-selected\", isAll);\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-row-header\"))) {\n el.classList.remove(\"extable-active-row-header\");\n }\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-col-header\"))) {\n el.classList.remove(\"extable-active-col-header\");\n }\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-cell\"))) {\n el.classList.remove(\"extable-active-cell\");\n }\n if (this.activeRowId) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(\n `tr[data-row-id=\"${this.activeRowId}\"] .extable-row-header`,\n ),\n )) {\n el.classList.add(\"extable-active-row-header\");\n }\n }\n if (this.activeColKey !== null) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(`th[data-col-key=\"${this.activeColKey}\"]`),\n )) {\n el.classList.add(\"extable-active-col-header\");\n }\n if (this.activeRowId) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(\n `tr[data-row-id=\"${this.activeRowId}\"] td[data-col-key=\"${this.activeColKey}\"]`,\n ),\n )) {\n el.classList.add(\"extable-active-cell\");\n }\n }\n }\n }\n\n private applySelectionClasses() {\n if (!this.tableEl) return;\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-selected\"))) {\n el.classList.remove(\"extable-selected\");\n }\n if (!this.selection.length) return;\n const rows = Array.from(this.tableEl.querySelectorAll<HTMLTableRowElement>(\"tbody tr\"));\n const schema = this.dataModel.getSchema();\n for (const range of this.selection) {\n const startRow = Math.max(0, Math.min(range.startRow, range.endRow));\n const endRow = Math.min(rows.length - 1, Math.max(range.startRow, range.endRow));\n const startCol = Math.max(0, Math.min(range.startCol, range.endCol));\n const endCol = Math.min(schema.columns.length - 1, Math.max(range.startCol, range.endCol));\n for (let r = startRow; r <= endRow; r += 1) {\n const rowEl = rows[r];\n if (!rowEl) continue;\n const th = rowEl.querySelector(\"th.extable-row-header\");\n if (th) th.classList.add(\"extable-selected\");\n const cells = Array.from(rowEl.querySelectorAll<HTMLTableCellElement>(\"td\"));\n for (let c = startCol; c <= endCol; c += 1) {\n const cell = cells[c];\n if (cell) cell.classList.add(\"extable-selected\");\n }\n }\n }\n }\n\n private formatValue(value: unknown, col: ColumnSchema): { text: string; color?: string } {\n if (value === null || value === undefined) return { text: \"\" };\n if (col.type === \"boolean\") {\n if (col.booleanDisplay === \"checkbox\" || !col.booleanDisplay) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.booleanDisplay) && col.booleanDisplay.length >= 2) {\n return { text: value ? String(col.booleanDisplay[0]) : String(col.booleanDisplay[1]) };\n }\n return { text: value ? String(col.booleanDisplay) : \"\" };\n }\n if (col.type === \"number\" && typeof value === \"number\") {\n const num = value;\n const opts: Intl.NumberFormatOptions = {};\n if (col.number?.scale !== undefined) {\n opts.minimumFractionDigits = col.number.scale;\n opts.maximumFractionDigits = col.number.scale;\n }\n opts.useGrouping = Boolean(col.number?.thousandSeparator);\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = col.number?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n if (\n (col.type === \"date\" || col.type === \"time\" || col.type === \"datetime\") &&\n (value instanceof Date || typeof value === \"string\")\n ) {\n const fmt =\n col.type === \"date\"\n ? coerceDatePattern(col.dateFormat, \"date\")\n : col.type === \"time\"\n ? coerceDatePattern(col.timeFormat, \"time\")\n : coerceDatePattern(col.dateTimeFormat, \"datetime\");\n let d: Date | null = null;\n if (value instanceof Date) d = value;\n else {\n d = this.valueFormatCache.parseIsoDate(value);\n }\n if (!d) return { text: String(value) };\n return { text: formatDateLite(d, fmt) };\n }\n return { text: String(value) };\n }\n}\n\nexport class CanvasRenderer implements Renderer {\n private static readonly MAX_CANVAS_DIM_PX = 8192;\n private static readonly ROW_HEIGHT_MEASURE_CHUNK = 500;\n private static readonly ROW_HEIGHT_MEASURE_TIME_BUDGET_MS = 8;\n private static readonly TEXT_MEASURE_CACHE_MAX = 2000;\n private root: HTMLElement | null = null;\n private canvas: HTMLCanvasElement | null = null;\n private spacer: HTMLDivElement | null = null;\n private overlayLayer: HTMLDivElement | null = null;\n private tooltip: HTMLDivElement | null = null;\n private tooltipTarget: { rowId: string; colKey: string } | null = null;\n private tooltipMessage: string | null = null;\n private dataModel: DataModel;\n private readonly rowHeight = DEFAULT_ROW_HEIGHT_PX;\n private readonly headerHeight = HEADER_HEIGHT_PX;\n private readonly lineHeight = 16;\n private readonly padding = 12;\n private readonly rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n private activeRowId: string | null = null;\n private activeColKey: string | null = null;\n private selection: SelectionRange[] = [];\n private valueFormatCache = new ValueFormatCache();\n private textMeasureCache = new Map<string, { lines: string[] }>();\n private frame = 0;\n private cursorTimer: number | null = null;\n private pendingCursorPoint: { x: number; y: number } | null = null;\n private hoverHeaderColKey: string | null = null;\n private hoverHeaderIcon = false;\n private rowHeightCacheKey: string | null = null;\n private rowHeightMeasuredVersion = new Map<string, number>();\n private rowHeightMeasureRaf: number | null = null;\n private rowHeightMeasureTask: { key: string; nextIndex: number } | null = null;\n private heightIndex: {\n key: string | null;\n rowsRef: InternalRow[];\n idToIndex: Map<string, number>;\n heights: number[];\n fenwick: FenwickTree;\n } | null = null;\n\n constructor(\n dataModel: DataModel,\n private getEditMode: () => EditMode = () => \"direct\",\n ) {\n this.dataModel = dataModel;\n }\n\n mount(root: HTMLElement) {\n this.root = root;\n this.canvas = document.createElement(\"canvas\");\n const maxDim = CanvasRenderer.MAX_CANVAS_DIM_PX;\n this.canvas.width = Math.max(1, Math.min(maxDim, Math.floor(root.clientWidth || 600)));\n this.canvas.height = Math.max(1, Math.min(maxDim, Math.floor(root.clientHeight || 400)));\n this.canvas.style.width = `${this.canvas.width}px`;\n this.canvas.style.height = `${this.canvas.height}px`;\n this.canvas.dataset.extableRenderer = \"canvas\";\n this.canvas.style.position = \"sticky\";\n this.canvas.style.top = \"0\";\n this.canvas.style.left = \"0\";\n this.canvas.style.zIndex = \"1\";\n this.canvas.style.cursor = \"cell\";\n this.canvas.addEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.addEventListener(\"pointerleave\", this.handlePointerLeave);\n this.canvas.addEventListener(\"click\", this.handleClick);\n this.spacer = document.createElement(\"div\");\n this.spacer.style.width = \"1px\";\n if (this.tooltip) this.tooltip.remove();\n if (this.overlayLayer) this.overlayLayer.remove();\n this.overlayLayer = document.createElement(\"div\");\n this.overlayLayer.className = \"extable-overlay-layer\";\n this.tooltip = document.createElement(\"div\");\n this.tooltip.className = \"extable-tooltip\";\n this.tooltip.dataset.visible = \"0\";\n this.overlayLayer.appendChild(this.tooltip);\n root.innerHTML = \"\";\n root.style.position = \"relative\";\n root.appendChild(this.overlayLayer);\n root.appendChild(this.canvas);\n root.appendChild(this.spacer);\n this.render();\n }\n\n setActiveCell(rowId: string | null, colKey: string | null) {\n this.activeRowId = rowId;\n this.activeColKey = colKey;\n this.render();\n }\n\n setSelection(ranges: SelectionRange[]) {\n this.selection = ranges;\n this.render();\n }\n\n render(state?: ViewportState) {\n try {\n this.frame += 1;\n if (!this.canvas || !this.root) return;\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.font = \"14px sans-serif\";\n let baseFont = ctx.font;\n const selectAll = this.activeRowId === \"__all__\" && this.activeColKey === \"__all__\";\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const colWidths = getColumnWidths(schema, view);\n const colBaseStyles = schema.columns.map((c) => columnFormatToStyle(c));\n const fontCache = new Map<string, string>();\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const cacheKey = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n if (cacheKey !== this.rowHeightCacheKey) {\n this.rowHeightCacheKey = cacheKey;\n this.rowHeightMeasuredVersion.clear();\n this.rowHeightMeasureTask = null;\n }\n if (!wrapAny) this.cancelRowHeightMeasurement();\n\n this.ensureHeightIndex(rows, wrapAny ? cacheKey : null, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return;\n\n const totalWidth = this.rowHeaderWidth + colWidths.reduce((acc, w) => acc + (w ?? 0), 0);\n const desiredCanvasWidth = state?.clientWidth ?? (this.root.clientWidth || 600);\n const desiredCanvasHeight =\n state?.clientHeight ?? (this.root.clientHeight || this.canvas.height || 400);\n const maxDim = CanvasRenderer.MAX_CANVAS_DIM_PX;\n const nextWidth = Math.max(1, Math.min(maxDim, Math.floor(desiredCanvasWidth)));\n const nextHeight = Math.max(1, Math.min(maxDim, Math.floor(desiredCanvasHeight)));\n if (this.canvas.width !== nextWidth) this.canvas.width = nextWidth;\n if (this.canvas.height !== nextHeight) this.canvas.height = nextHeight;\n this.canvas.style.width = `${nextWidth}px`;\n this.canvas.style.height = `${nextHeight}px`;\n // Resizing resets 2D state, so reapply after size update.\n ctx.font = \"14px sans-serif\";\n baseFont = ctx.font;\n this.refreshTooltipPosition();\n\n const scrollTop = state?.scrollTop ?? this.root.scrollTop;\n const scrollLeft = state?.scrollLeft ?? this.root.scrollLeft;\n const computeVisibleRange = (contentTop: number) => {\n const target = contentTop + 1;\n const visibleStart = Math.max(\n 0,\n Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(target)),\n );\n const accum = heightIndex.fenwick.sum(visibleStart);\n let visibleEnd = visibleStart;\n let drawnHeight = 0;\n const maxHeight = (this.canvas?.height ?? 0) + this.rowHeight * 2;\n for (let i = visibleStart; i < rows.length && drawnHeight < maxHeight; i += 1) {\n drawnHeight += heightIndex.heights[i] ?? this.rowHeight;\n visibleEnd = i + 1;\n }\n return { accum, visibleStart, visibleEnd };\n };\n\n let totalRowsHeight = heightIndex.fenwick.total();\n let contentScrollTop = Math.max(\n 0,\n Math.min(scrollTop, Math.max(0, totalRowsHeight - this.rowHeight)),\n );\n let { accum, visibleStart, visibleEnd } = computeVisibleRange(contentScrollTop);\n\n if (wrapAny && cacheKey) {\n const updates: Record<string, number> = {};\n for (let i = visibleStart; i < visibleEnd; i += 1) {\n const row = rows[i];\n if (!row) continue;\n const version = this.dataModel.getRowVersion(row.id);\n if (this.rowHeightMeasuredVersion.get(row.id) === version) continue;\n const nextH = this.measureRowHeight(ctx, row, schema, colWidths);\n updates[row.id] = nextH;\n this.rowHeightMeasuredVersion.set(row.id, version);\n }\n this.applyRowHeightUpdates(updates);\n totalRowsHeight = heightIndex.fenwick.total();\n this.dataModel.setRowHeightsBulk(updates);\n contentScrollTop = Math.max(\n 0,\n Math.min(scrollTop, Math.max(0, totalRowsHeight - this.rowHeight)),\n );\n ({ accum, visibleStart, visibleEnd } = computeVisibleRange(contentScrollTop));\n if (this.rowHeightMeasureTask || Object.keys(updates).length > 0)\n this.scheduleRowHeightMeasurement();\n }\n\n if (this.spacer) {\n this.spacer.style.height = `${totalRowsHeight + this.headerHeight}px`;\n this.spacer.style.width = `${totalWidth}px`;\n }\n const dataXOffset = this.rowHeaderWidth - scrollLeft;\n\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n // Keep row-header column background visible across scroll\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, 0, this.rowHeaderWidth, this.canvas.height);\n // Body\n let yCursor = this.headerHeight + accum - contentScrollTop;\n for (let i = visibleStart; i < visibleEnd; i += 1) {\n const row = rows[i];\n const rowH = heightIndex.heights[i] ?? this.rowHeight;\n // row header cell\n ctx.strokeStyle = \"#d0d7de\";\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, yCursor, this.rowHeaderWidth, rowH);\n ctx.strokeRect(0, yCursor, this.rowHeaderWidth, rowH);\n const idxText = this.dataModel.getDisplayIndex(row.id) ?? \"\";\n if (this.activeRowId === row.id) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(0, yCursor, this.rowHeaderWidth, rowH);\n }\n ctx.fillStyle = \"#0f172a\";\n ctx.font = \"bold 14px sans-serif\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(String(idxText), this.rowHeaderWidth / 2, yCursor + rowH / 2);\n ctx.font = baseFont;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"alphabetic\";\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n this.rowHeaderWidth,\n this.headerHeight,\n this.canvas.width - this.rowHeaderWidth,\n this.canvas.height - this.headerHeight,\n );\n ctx.clip();\n ctx.translate(dataXOffset, 0);\n let x = 0;\n let lastFontKey = \"\";\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n const w = colWidths[idx] ?? 100;\n if (!c) {\n x += w;\n continue;\n }\n const readOnly = this.dataModel.isReadonly(row.id, c.key);\n ctx.strokeStyle = \"#d0d7de\";\n const condRes = this.dataModel.resolveConditionalStyle(row.id, c);\n const cellStyle = this.dataModel.getCellStyle(row.id, c.key);\n const baseStyle = colBaseStyles[idx] ?? {};\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const mergedStyle = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const bg = readOnly ? \"#f3f4f6\" : (mergedStyle.backgroundColor ?? \"#ffffff\");\n ctx.fillStyle = bg;\n ctx.fillRect(x, yCursor, w, rowH);\n ctx.strokeRect(x, yCursor, w, rowH);\n const valueRes = this.dataModel.resolveCellValue(row.id, c);\n const textOverride =\n valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const formatted = textOverride ? { text: \"#ERROR\" } : this.formatValue(valueRes.value, c);\n const text = formatted.text;\n const align = c.style?.align ?? (c.type === \"number\" ? \"right\" : \"left\");\n const isActiveCell =\n this.activeRowId === row.id &&\n this.activeColKey !== null &&\n this.activeColKey === c.key;\n if (isActiveCell) {\n ctx.strokeStyle = \"#3b82f6\";\n ctx.lineWidth = 2;\n ctx.strokeRect(x + 1, yCursor + 1, w - 2, rowH - 2);\n ctx.lineWidth = 1;\n if (\n shouldShowFillHandle(\n this.dataModel,\n this.selection,\n this.activeRowId,\n this.activeColKey,\n this.getEditMode(),\n )\n ) {\n const size = FILL_HANDLE_VISUAL_SIZE_PX;\n const left = x + w - size - 1;\n const top = yCursor + rowH - size - 1;\n ctx.fillStyle = \"#3b82f6\";\n ctx.fillRect(left, top, size, size);\n ctx.strokeStyle = \"#ffffff\";\n ctx.strokeRect(left + 0.5, top + 0.5, size - 1, size - 1);\n }\n }\n ctx.fillStyle = this.dataModel.hasPending(row.id, c.key)\n ? \"#b91c1c\"\n : formatted.color\n ? formatted.color\n : readOnly\n ? \"#94a3b8\"\n : (mergedStyle.textColor ?? \"#0f172a\");\n const wrap = view.wrapText?.[c.key] ?? c.wrapText ?? false;\n const isBoolean =\n c.type === \"boolean\" && (!c.booleanDisplay || c.booleanDisplay === \"checkbox\");\n const isCustomBoolean =\n c.type === \"boolean\" && Boolean(c.booleanDisplay && c.booleanDisplay !== \"checkbox\");\n if (!isBoolean) {\n const fontKey = `${mergedStyle.italic ? \"i\" : \"\"}${mergedStyle.bold ? \"b\" : \"\"}`;\n if (fontKey !== lastFontKey) {\n const cached = fontCache.get(fontKey);\n if (cached) ctx.font = cached;\n else {\n const weight = mergedStyle.bold ? \"600 \" : \"\";\n const ital = mergedStyle.italic ? \"italic \" : \"\";\n const f = `${ital}${weight}14px sans-serif`.trim();\n fontCache.set(fontKey, f);\n ctx.font = f;\n }\n lastFontKey = fontKey;\n }\n } else {\n ctx.font = baseFont;\n lastFontKey = \"\";\n }\n this.drawCellText(\n ctx,\n text,\n x + 8,\n yCursor + 6,\n w - 12,\n rowH - 12,\n wrap,\n align,\n isBoolean,\n isCustomBoolean,\n { underline: Boolean(mergedStyle.underline), strike: Boolean(mergedStyle.strike) },\n );\n const marker = this.dataModel.getCellMarker(row.id, c.key);\n if (marker) drawDiagnosticCorner(ctx, x, yCursor, w, rowH, marker.level);\n x += w;\n }\n ctx.restore();\n yCursor += rowH;\n }\n\n // Header (draw last to stay on top)\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, 0, this.canvas.width, this.headerHeight);\n ctx.strokeStyle = \"#d0d7de\";\n // corner\n ctx.strokeRect(0, 0, this.rowHeaderWidth, this.headerHeight);\n ctx.fillStyle = \"#9ca3af\";\n ctx.beginPath();\n ctx.moveTo(4, 4);\n ctx.lineTo(16, 4);\n ctx.lineTo(4, 16);\n ctx.closePath();\n ctx.fill();\n if (this.activeRowId) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(0, 0, this.rowHeaderWidth, this.headerHeight);\n }\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(this.rowHeaderWidth, 0, this.canvas.width - this.rowHeaderWidth, this.headerHeight);\n ctx.clip();\n ctx.translate(dataXOffset, 0);\n let xHeader = 0;\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n const w = colWidths[idx] ?? 100;\n if (!c) {\n xHeader += w;\n continue;\n }\n const isActiveCol = this.activeColKey !== null && this.activeColKey === c.key;\n if (isActiveCol) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(xHeader, 0, w, this.headerHeight);\n }\n ctx.strokeStyle = \"#d0d7de\";\n ctx.strokeRect(xHeader, 0, w, this.headerHeight);\n ctx.fillStyle = \"#0f172a\";\n ctx.font = \"bold 14px sans-serif\";\n ctx.fillText(c.header ?? c.key, xHeader + 8, this.headerHeight - 8);\n ctx.font = baseFont;\n\n const sortDir = getColumnSortDir(view, c.key);\n const hasFilter = hasActiveColumnFilter(view, c.key);\n const isHover = this.hoverHeaderColKey !== null && this.hoverHeaderColKey === c.key;\n const showIcon = Boolean(sortDir) || hasFilter || isHover;\n if (showIcon) {\n const alpha = isHover ? 0.9 : hasFilter || sortDir ? 0.75 : 0.45;\n const iconBox = 16;\n const pad = 6;\n const ix = xHeader + w - iconBox - pad;\n const iy = Math.floor((this.headerHeight - iconBox) / 2);\n if (sortDir) {\n drawSortArrowIcon(ctx, ix + 3, iy + 3, iconBox - 6, alpha, sortDir);\n } else {\n drawFunnelIcon(ctx, ix + 2, iy + 2, iconBox - 4, alpha);\n }\n }\n xHeader += w;\n }\n ctx.restore();\n\n // selection overlay\n if (this.selection.length) {\n ctx.save();\n ctx.strokeStyle = \"#3b82f6\";\n ctx.fillStyle = \"rgba(59,130,246,0.12)\";\n for (const range of this.selection) {\n const startRow = Math.max(0, Math.min(range.startRow, range.endRow));\n const endRow = Math.min(rows.length - 1, Math.max(range.startRow, range.endRow));\n const startCol = Math.max(0, Math.min(range.startCol, range.endCol));\n const endCol = Math.min(\n schema.columns.length - 1,\n Math.max(range.startCol, range.endCol),\n );\n const yTop = this.headerHeight + heightIndex.fenwick.sum(startRow) - contentScrollTop;\n const height = heightIndex.fenwick.sum(endRow + 1) - heightIndex.fenwick.sum(startRow);\n let xLeft = this.rowHeaderWidth;\n for (let c = 0; c < startCol; c += 1) {\n xLeft += colWidths[c] ?? 100;\n }\n let width = 0;\n for (let c = startCol; c <= endCol; c += 1) {\n width += colWidths[c] ?? 100;\n }\n xLeft -= scrollLeft;\n ctx.fillRect(xLeft, yTop, width, height);\n ctx.strokeRect(xLeft + 0.5, yTop + 0.5, width - 1, height - 1);\n }\n ctx.restore();\n }\n\n if (selectAll) {\n ctx.save();\n ctx.fillStyle = \"rgba(59,130,246,0.08)\";\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n ctx.restore();\n }\n } catch {\n // Ignore canvas rendering errors (e.g. context enters an error state after huge resize).\n // A subsequent resize typically recovers.\n return;\n }\n }\n\n destroy() {\n this.cancelRowHeightMeasurement();\n this.heightIndex = null;\n if (this.canvas) {\n this.canvas.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.removeEventListener(\"pointerleave\", this.handlePointerLeave);\n this.canvas.removeEventListener(\"click\", this.handleClick);\n }\n if (this.cursorTimer) {\n window.clearTimeout(this.cursorTimer);\n this.cursorTimer = null;\n }\n this.pendingCursorPoint = null;\n removeFromParent(this.canvas);\n removeFromParent(this.spacer);\n removeFromParent(this.overlayLayer);\n removeFromParent(this.tooltip);\n this.canvas = null;\n this.spacer = null;\n this.overlayLayer = null;\n this.tooltip = null;\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n this.root = null;\n }\n\n private ensureHeightIndex(rows: InternalRow[], key: string | null, wrapAny: boolean) {\n const existing = this.heightIndex;\n if (existing && existing.rowsRef === rows && existing.key === key) return;\n const heights = new Array(rows.length);\n const idToIndex = new Map<string, number>();\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n if (!row) continue;\n idToIndex.set(row.id, i);\n let h = this.rowHeight;\n if (wrapAny && key) {\n const version = this.dataModel.getRowVersion(row.id);\n const measuredVersion = this.rowHeightMeasuredVersion.get(row.id);\n const cachedHeight = this.dataModel.getRowHeight(row.id);\n if (measuredVersion === version && typeof cachedHeight === \"number\") h = cachedHeight;\n }\n heights[i] = h;\n }\n this.heightIndex = {\n key,\n rowsRef: rows,\n idToIndex,\n heights,\n fenwick: FenwickTree.from(heights),\n };\n }\n\n private applyRowHeightUpdates(updates: Record<string, number>) {\n const index = this.heightIndex;\n if (!index) return;\n for (const [rowId, next] of Object.entries(updates)) {\n const i = index.idToIndex.get(rowId);\n if (i === undefined) continue;\n const prev = index.heights[i] ?? this.rowHeight;\n if (prev === next) continue;\n index.heights[i] = next;\n index.fenwick.add(i, next - prev);\n }\n }\n\n private getRowHeightCacheKey(schema: Schema, view: View, colWidths: number[]) {\n const wraps = schema.columns\n .map((c) => ((view.wrapText?.[c.key] ?? c.wrapText) ? \"1\" : \"0\"))\n .join(\"\");\n const widths = colWidths.map((w) => String(w ?? 0)).join(\",\");\n return `${wraps}|${widths}`;\n }\n\n private cancelRowHeightMeasurement() {\n if (this.rowHeightMeasureRaf !== null) {\n cancelAnimationFrame(this.rowHeightMeasureRaf);\n this.rowHeightMeasureRaf = null;\n }\n this.rowHeightMeasureTask = null;\n }\n\n private scheduleRowHeightMeasurement() {\n if (this.rowHeightMeasureRaf !== null) return;\n this.rowHeightMeasureRaf = requestAnimationFrame(() => {\n this.rowHeightMeasureRaf = null;\n this.runRowHeightMeasurement();\n });\n }\n\n private runRowHeightMeasurement() {\n if (!this.canvas) return;\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.font = \"14px sans-serif\";\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n if (!wrapAny) return;\n const key = this.getRowHeightCacheKey(schema, view, colWidths);\n if (this.rowHeightCacheKey !== key) {\n this.rowHeightCacheKey = key;\n this.rowHeightMeasuredVersion.clear();\n this.rowHeightMeasureTask = null;\n }\n const task = this.rowHeightMeasureTask ?? { key, nextIndex: 0 };\n if (task.key !== key) return;\n\n const rows = this.dataModel.listRows();\n const updates: Record<string, number> = {};\n let measured = 0;\n const start = performance.now();\n while (task.nextIndex < rows.length && measured < CanvasRenderer.ROW_HEIGHT_MEASURE_CHUNK) {\n if (performance.now() - start > CanvasRenderer.ROW_HEIGHT_MEASURE_TIME_BUDGET_MS) break;\n const row = rows[task.nextIndex];\n task.nextIndex += 1;\n if (!row) continue;\n const version = this.dataModel.getRowVersion(row.id);\n if (this.rowHeightMeasuredVersion.get(row.id) === version) continue;\n const h = this.measureRowHeight(ctx, row, schema, colWidths);\n updates[row.id] = h;\n this.rowHeightMeasuredVersion.set(row.id, version);\n measured += 1;\n }\n this.rowHeightMeasureTask = task.nextIndex < rows.length ? task : null;\n this.ensureHeightIndex(rows, this.rowHeightCacheKey, true);\n this.applyRowHeightUpdates(updates);\n this.dataModel.setRowHeightsBulk(updates);\n if (this.rowHeightMeasureTask) this.scheduleRowHeightMeasurement();\n }\n\n private handleClick = (ev: MouseEvent) => {\n if (!this.root || !this.canvas) return;\n const rect = this.canvas.getBoundingClientRect();\n const viewportX = ev.clientX - rect.left;\n const viewportY = ev.clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const y = viewportY;\n if (y >= this.headerHeight) return;\n if (x < this.rowHeaderWidth) return;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex < 0) return;\n const col = schema.columns[colIndex];\n if (!col) return;\n const w = colWidths[colIndex] ?? 100;\n const iconSize = 18;\n const pad = 4;\n const iconLeft = xCursor + w - iconSize - pad;\n const iconTop = Math.floor((this.headerHeight - iconSize) / 2);\n const inIcon =\n x >= iconLeft && x <= iconLeft + iconSize && y >= iconTop && y <= iconTop + iconSize;\n if (!inIcon) return;\n this.root.dispatchEvent(\n new CustomEvent(\"extable:filter-sort-open\", { bubbles: true, detail: { colKey: col.key } }),\n );\n };\n\n getCellElements() {\n return null;\n }\n\n hitTest(event: MouseEvent) {\n if (!this.root || !this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n // Use viewport-relative coordinates first because headers are rendered as \"sticky\"\n // (they should not be offset by scrollTop in hit-test).\n const viewportX = event.clientX - rect.left;\n const viewportY = event.clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const headerHeight = this.headerHeight;\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const key = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n this.ensureHeightIndex(rows, key, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return null;\n const totalRowsHeight = heightIndex.fenwick.total();\n const contentScrollTop = Math.max(\n 0,\n Math.min(\n this.root.scrollTop - this.headerHeight,\n Math.max(0, totalRowsHeight - this.rowHeight),\n ),\n );\n if (viewportY < headerHeight && viewportX < this.rowHeaderWidth) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n rect: new DOMRect(rect.left, rect.top, this.rowHeaderWidth, headerHeight),\n };\n }\n if (viewportY < headerHeight) {\n // Column header region (canvas)\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex >= 0) {\n const col = schema.columns[colIndex];\n const cellRect = new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top,\n colWidths[colIndex] ?? 100,\n headerHeight,\n );\n return { rowId: \"__header__\", colKey: col.key, rect: cellRect };\n }\n return null;\n }\n if (viewportX < this.rowHeaderWidth) {\n const y = viewportY - headerHeight + contentScrollTop;\n const rowIndex = Math.max(\n 0,\n Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(y + 1)),\n );\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n const row = rows[rowIndex];\n const topPx = rect.top + headerHeight + accumHeight - contentScrollTop;\n const cellRect = new DOMRect(\n rect.left,\n topPx,\n this.rowHeaderWidth,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n return { rowId: row.id, colKey: null, rect: cellRect };\n }\n const y = viewportY - headerHeight + contentScrollTop;\n const rowIndex = Math.max(0, Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(y + 1)));\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex === -1) return null;\n const row = rows[rowIndex];\n const col = schema.columns[colIndex];\n const rowTop = accumHeight;\n const cellRect = new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top + headerHeight + rowTop - this.root.scrollTop,\n colWidths[colIndex] ?? 100,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n return { rowId: row.id, colKey: col.key, rect: cellRect };\n }\n\n private isPointInSelection(rowId: string, colKey: string) {\n if (!this.selection.length) return false;\n const schema = this.dataModel.getSchema();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (rowIndex < 0 || colIndex < 0) return false;\n for (const range of this.selection) {\n if (range.kind !== \"cells\") continue;\n const startRow = Math.min(range.startRow, range.endRow);\n const endRow = Math.max(range.startRow, range.endRow);\n const startCol = Math.min(range.startCol, range.endCol);\n const endCol = Math.max(range.startCol, range.endCol);\n if (rowIndex >= startRow && rowIndex <= endRow && colIndex >= startCol && colIndex <= endCol)\n return true;\n }\n return false;\n }\n\n private handlePointerMove = (ev: PointerEvent) => {\n this.pendingCursorPoint = { x: ev.clientX, y: ev.clientY };\n if (this.cursorTimer) return;\n this.cursorTimer = window.setTimeout(() => {\n this.cursorTimer = null;\n const p = this.pendingCursorPoint;\n if (!p) return;\n this.updateCanvasCursor(p.x, p.y);\n }, 50);\n };\n\n private handlePointerLeave = () => {\n if (!this.canvas) return;\n this.canvas.style.cursor = \"cell\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n };\n\n private positionTooltipAtRect(rect: DOMRect) {\n if (!this.tooltip) return;\n if (!this.root) return;\n const pad = 8;\n const rootRect = this.root.getBoundingClientRect();\n const maxW = this.root.clientWidth;\n const maxH = this.root.clientHeight;\n let left = rect.right - rootRect.left + pad;\n let top = rect.top - rootRect.top + pad;\n let side: \"right\" | \"left\" = \"right\";\n const tRect = this.tooltip.getBoundingClientRect();\n if (left + tRect.width > maxW) {\n left = Math.max(0, rect.left - rootRect.left - tRect.width - pad);\n side = \"left\";\n }\n if (top + tRect.height > maxH) top = Math.max(0, maxH - tRect.height - pad);\n this.tooltip.style.left = `${left}px`;\n this.tooltip.style.top = `${top}px`;\n this.tooltip.dataset.side = side;\n }\n\n private refreshTooltipPosition() {\n if (!this.tooltip || this.tooltip.dataset.visible !== \"1\") return;\n if (!this.tooltipTarget || !this.tooltipMessage) return;\n const rect = this.getCellRect(this.tooltipTarget.rowId, this.tooltipTarget.colKey);\n if (!rect) {\n this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n return;\n }\n this.tooltip.textContent = this.tooltipMessage;\n this.positionTooltipAtRect(rect);\n }\n\n private getCellRect(rowId: string, colKey: string): DOMRect | null {\n if (!this.root || !this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (rowIndex < 0 || colIndex < 0) return null;\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const key = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n this.ensureHeightIndex(rows, key, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return null;\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n let xCursor = this.rowHeaderWidth;\n for (let i = 0; i < colIndex; i += 1) {\n xCursor += colWidths[i] ?? 100;\n }\n return new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top + this.headerHeight + accumHeight - this.root.scrollTop,\n colWidths[colIndex] ?? 100,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n }\n\n private updateCanvasCursor(clientX: number, clientY: number) {\n if (!this.root || !this.canvas) return;\n if (this.root.dataset.extableFillDragging === \"1\") {\n this.canvas.style.cursor = \"crosshair\";\n return;\n }\n // Header hover (filter/sort icon affordance)\n {\n const rect = this.canvas.getBoundingClientRect();\n const viewportX = clientX - rect.left;\n const viewportY = clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const y = viewportY;\n const prevKey = this.hoverHeaderColKey;\n const prevIcon = this.hoverHeaderIcon;\n let nextKey: string | null = null;\n let nextIcon = false;\n if (y >= 0 && y < this.headerHeight && x >= this.rowHeaderWidth) {\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n const col = colIndex >= 0 ? schema.columns[colIndex] : null;\n if (col) {\n nextKey = col.key;\n const w = colWidths[colIndex] ?? 100;\n const iconSize = 18;\n const pad = 4;\n const iconLeft = xCursor + w - iconSize - pad;\n const iconTop = Math.floor((this.headerHeight - iconSize) / 2);\n nextIcon =\n x >= iconLeft && x <= iconLeft + iconSize && y >= iconTop && y <= iconTop + iconSize;\n }\n }\n const changed =\n String(prevKey ?? \"\") !== String(nextKey ?? \"\") || Boolean(prevIcon) !== Boolean(nextIcon);\n this.hoverHeaderColKey = nextKey;\n this.hoverHeaderIcon = nextIcon;\n if (nextKey !== null) {\n this.canvas.style.cursor = nextIcon ? \"pointer\" : \"default\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n if (changed) this.render();\n return;\n }\n if (changed) this.render();\n }\n // Cursor spec:\n // - No selection or outside selection: cell\n // - Inside selection & on fill handle: crosshair\n // - Inside selection & readonly/boolean: default\n // - Inside selection & others: text\n let cursor = \"cell\";\n\n const hit = this.hitTest(new MouseEvent(\"mousemove\", { clientX, clientY }));\n if (!hit) {\n this.canvas.style.cursor = cursor;\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n return;\n }\n if (hit.colKey === \"__all__\" || hit.colKey === null) {\n this.canvas.style.cursor = \"default\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n return;\n }\n // In readonly editMode, keep spreadsheet-like cursor for all body cells.\n if (this.getEditMode() === \"readonly\") {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n const marker = this.dataModel.getCellMarker(hit.rowId, hit.colKey);\n if (this.tooltip && marker) {\n const sameCell =\n this.tooltipTarget &&\n this.tooltipTarget.rowId === hit.rowId &&\n this.tooltipTarget.colKey === hit.colKey;\n const sameMessage = this.tooltipMessage === marker.message;\n if (!sameCell || !sameMessage || this.tooltip.dataset.visible !== \"1\") {\n this.tooltipTarget = { rowId: hit.rowId, colKey: hit.colKey };\n this.tooltipMessage = marker.message;\n this.tooltip.textContent = marker.message;\n const rect = this.getCellRect(hit.rowId, hit.colKey);\n if (rect) {\n this.positionTooltipAtRect(rect);\n this.tooltip.dataset.visible = \"1\";\n } else {\n this.tooltip.dataset.visible = \"0\";\n }\n }\n } else if (this.tooltip) {\n this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n }\n\n if (!this.isPointInSelection(hit.rowId, hit.colKey)) {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n // Only the active cell shows edit-mode cursor affordances. Other selected cells stay `cell`.\n const isActiveCell =\n this.activeRowId === hit.rowId &&\n this.activeColKey !== null &&\n this.activeColKey === hit.colKey;\n if (!isActiveCell) {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n // Fill handle hover is only considered inside the active cell and when fill handle is shown.\n if (\n this.activeRowId &&\n this.activeColKey !== null &&\n this.activeRowId !== \"__all__\" &&\n this.activeColKey !== \"__all__\" &&\n shouldShowFillHandle(\n this.dataModel,\n this.selection,\n this.activeRowId,\n this.activeColKey,\n this.getEditMode(),\n )\n ) {\n const cellRect = this.getCellRect(this.activeRowId, this.activeColKey);\n if (cellRect) {\n const handleRect = getFillHandleRect(cellRect, FILL_HANDLE_HIT_SIZE_PX);\n if (isPointInRect(clientX, clientY, handleRect)) {\n this.canvas.style.cursor = \"crosshair\";\n return;\n }\n }\n }\n\n const col = this.dataModel.getSchema().columns.find((c) => c.key === hit.colKey);\n const readOnly = this.dataModel.isReadonly(hit.rowId, hit.colKey);\n if (readOnly || col?.type === \"boolean\") cursor = \"default\";\n else cursor = \"text\";\n this.canvas.style.cursor = cursor;\n }\n\n private measureRowHeight(\n ctx: CanvasRenderingContext2D,\n row: InternalRow,\n schema: Schema,\n colWidths: number[],\n ) {\n let maxHeight = this.rowHeight;\n const view = this.dataModel.getView();\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n if (!c) continue;\n const wrap = view.wrapText?.[c.key] ?? c.wrapText;\n if (!wrap) continue;\n const w = (colWidths[idx] ?? 100) - this.padding;\n const valueRes = this.dataModel.resolveCellValue(row.id, c);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, c);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const text = textOverride ? \"#ERROR\" : this.formatValue(valueRes.value, c).text;\n const lines = this.wrapLines(ctx, text, w);\n const h = lines.length * this.lineHeight + this.padding;\n maxHeight = Math.max(maxHeight, h);\n }\n return maxHeight;\n }\n\n private wrapLines(ctx: CanvasRenderingContext2D, text: string, width: number) {\n const key = `${ctx.font}|${width}|${text}`;\n const cached = this.textMeasureCache.get(key);\n if (cached) {\n // LRU refresh\n this.textMeasureCache.delete(key);\n this.textMeasureCache.set(key, cached);\n return cached.lines;\n }\n const rawLines = text.split(\"\\n\");\n const lines: string[] = [];\n for (const line of rawLines) {\n let current = line;\n while (ctx.measureText(current).width > width && current.length > 1) {\n let cut = current.length;\n while (cut > 1 && ctx.measureText(current.slice(0, cut)).width > width) {\n cut -= 1;\n }\n lines.push(current.slice(0, cut));\n current = current.slice(cut);\n }\n lines.push(current);\n }\n this.textMeasureCache.set(key, { lines });\n while (this.textMeasureCache.size > CanvasRenderer.TEXT_MEASURE_CACHE_MAX) {\n const firstKey = this.textMeasureCache.keys().next().value as string | undefined;\n if (!firstKey) break;\n this.textMeasureCache.delete(firstKey);\n }\n return lines;\n }\n\n private drawCellText(\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n width: number,\n height: number,\n wrap: boolean,\n align: \"left\" | \"right\" | \"center\" = \"left\",\n isBoolean = false,\n isCustomBoolean = false,\n decorations?: { underline?: boolean; strike?: boolean },\n ) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(x - 4, y - 4, width + 8, height + 8);\n ctx.clip();\n const fontBackup = ctx.font;\n if (isBoolean) {\n ctx.font = \"28px sans-serif\";\n } else if (isCustomBoolean) {\n ctx.font = \"14px sans-serif\";\n }\n const renderLine = (ln: string, lineIdx: number) => {\n const baseline = y + this.lineHeight * lineIdx;\n let startX = x;\n let endX = x;\n if (align === \"right\") {\n ctx.textAlign = \"right\";\n endX = x + width;\n startX = endX - ctx.measureText(ln).width;\n ctx.fillText(ln, endX, baseline);\n } else if (align === \"center\") {\n ctx.textAlign = \"center\";\n const center = x + width / 2;\n const w = ctx.measureText(ln).width;\n startX = center - w / 2;\n endX = center + w / 2;\n ctx.fillText(ln, center, baseline);\n } else {\n ctx.textAlign = \"left\";\n startX = x;\n endX = x + ctx.measureText(ln).width;\n ctx.fillText(ln, x, baseline);\n }\n if (decorations?.underline || decorations?.strike) {\n const strokeBackup = ctx.strokeStyle;\n const lineWidthBackup = ctx.lineWidth;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = 1;\n ctx.beginPath();\n if (decorations.underline) {\n const yUnderline = baseline + 2;\n ctx.moveTo(startX, yUnderline);\n ctx.lineTo(endX, yUnderline);\n }\n if (decorations.strike) {\n const yStrike = baseline - Math.floor(this.lineHeight / 2) + 2;\n ctx.moveTo(startX, yStrike);\n ctx.lineTo(endX, yStrike);\n }\n ctx.stroke();\n ctx.strokeStyle = strokeBackup;\n ctx.lineWidth = lineWidthBackup;\n }\n };\n if (wrap) {\n const lines = this.wrapLines(ctx, text, width);\n for (let idx = 0; idx < lines.length; idx += 1) {\n renderLine(lines[idx], idx + 1);\n }\n } else {\n let out = text;\n while (ctx.measureText(out).width > width && out.length > 1) {\n out = `${out.slice(0, -2)}…`;\n }\n renderLine(out, 1);\n }\n ctx.textAlign = \"left\";\n ctx.font = fontBackup;\n ctx.restore();\n }\n\n private formatValue(value: unknown, col: ColumnSchema): { text: string; color?: string } {\n if (value === null || value === undefined) return { text: \"\" };\n if (col.type === \"boolean\") {\n if (col.booleanDisplay === \"checkbox\" || !col.booleanDisplay) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.booleanDisplay) && col.booleanDisplay.length >= 2) {\n return { text: value ? String(col.booleanDisplay[0]) : String(col.booleanDisplay[1]) };\n }\n return { text: value ? String(col.booleanDisplay) : \"\" };\n }\n if (col.type === \"number\" && typeof value === \"number\") {\n const num = value;\n const opts: Intl.NumberFormatOptions = {};\n if (col.number?.scale !== undefined) {\n opts.minimumFractionDigits = col.number.scale;\n opts.maximumFractionDigits = col.number.scale;\n }\n opts.useGrouping = Boolean(col.number?.thousandSeparator);\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = col.number?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n if (\n (col.type === \"date\" || col.type === \"time\" || col.type === \"datetime\") &&\n (value instanceof Date || typeof value === \"string\")\n ) {\n const fmt =\n col.type === \"date\"\n ? (col.dateFormat ?? \"yyyy-MM-dd\")\n : col.type === \"time\"\n ? (col.timeFormat ?? \"HH:mm\")\n : (col.dateTimeFormat ?? \"yyyy-MM-dd'T'HH:mm:ss'Z'\");\n let d: Date | null = null;\n if (value instanceof Date) d = value;\n else {\n d = this.valueFormatCache.parseIsoDate(value);\n }\n if (!d) return { text: String(value) };\n return { text: formatDateLite(d, fmt) };\n }\n return { text: String(value) };\n }\n}\n","import type { Command, EditMode, SelectionRange } from \"./types\";\nimport type { DataModel } from \"./dataModel\";\nimport {\n FILL_HANDLE_HIT_SIZE_PX,\n getFillHandleRect,\n getFillHandleSource,\n isPointInRect,\n makeFillValueGetter,\n shouldShowFillHandle,\n} from \"./fillHandle\";\nimport { removeFromParent } from \"./utils\";\nimport {\n DEFAULT_ROW_HEIGHT_PX,\n HEADER_HEIGHT_PX,\n ROW_HEADER_WIDTH_PX,\n getColumnWidths,\n} from \"./geometry\";\n\ntype EditHandler = (cmd: Command, commit: boolean) => void;\ntype RowSelectHandler = (rowId: string) => void;\ntype MoveHandler = (rowId?: string) => void;\ntype HitTest = (\n event: MouseEvent,\n) => { rowId: string; colKey: string | null; element?: HTMLElement; rect: DOMRect } | null;\ntype ActiveChange = (rowId: string | null, colKey: string | null) => void;\ntype ContextMenuHandler = (\n rowId: string | null,\n colKey: string | null,\n clientX: number,\n clientY: number,\n) => void;\ntype SelectionChange = (ranges: SelectionRange[]) => void;\ntype UndoRedoHandler = () => void;\n\nexport class SelectionManager {\n private root: HTMLElement;\n private editMode: EditMode;\n private onEdit: EditHandler;\n private onRowSelect: RowSelectHandler;\n private onMove: MoveHandler;\n private hitTest: HitTest;\n private onContextMenu: ContextMenuHandler;\n private handleDocumentContextMenu: ((ev: MouseEvent) => void) | null = null;\n private selectionRanges: SelectionRange[] = [];\n private inputEl: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null = null;\n private floatingInputWrapper: HTMLDivElement | null = null;\n private selectionInput: HTMLInputElement | null = null;\n private copyToastEl: HTMLDivElement | null = null;\n private copyToastTimer: number | null = null;\n private selectionMode = true;\n private lastBooleanCell: { rowId: string; colKey: string } | null = null;\n private selectionAnchor: { rowIndex: number; colIndex: number } | null = null;\n private dragging = false;\n private dragStart: { rowIndex: number; colIndex: number; kind: \"cells\" | \"rows\" } | null = null;\n private pointerDownClient: { x: number; y: number } | null = null;\n private dragMoved = false;\n private dragSelectionChanged = false;\n private suppressNextClick = false;\n private fillDragging = false;\n private fillSource: import(\"./fillHandle\").FillHandleSource | null = null;\n private fillEndRowIndex: number | null = null;\n private rootCursorBackup: string | null = null;\n private lastPointerClient: { x: number; y: number } | null = null;\n private autoScrollRaf: number | null = null;\n private autoScrollActive = false;\n private activeCell: { rowId: string; colKey: string | null } | null = null;\n private activeHost: HTMLElement | null = null;\n private activeHostOriginalText: string | null = null;\n private composing = false;\n private lastCompositionEnd = 0;\n private readonly handleSelectionBlur = () => this.teardownSelectionInput();\n private isCellReadonly: (rowId: string, colKey: string) => boolean;\n\n constructor(\n root: HTMLElement,\n editMode: EditMode,\n onEdit: EditHandler,\n onRowSelect: RowSelectHandler,\n onMove: MoveHandler,\n hitTest: HitTest,\n private dataModel: DataModel,\n isCellReadonly: (rowId: string, colKey: string) => boolean,\n private onActiveChange: ActiveChange,\n onContextMenu: ContextMenuHandler,\n private onSelectionChange: SelectionChange,\n private onUndo: UndoRedoHandler,\n private onRedo: UndoRedoHandler,\n ) {\n this.root = root;\n this.editMode = editMode;\n this.onEdit = onEdit;\n this.onRowSelect = onRowSelect;\n this.onMove = onMove;\n this.hitTest = hitTest;\n this.isCellReadonly = isCellReadonly;\n this.onContextMenu = onContextMenu;\n this.bind();\n }\n\n setEditMode(mode: EditMode) {\n this.editMode = mode;\n }\n\n syncAfterRowsChanged() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n if (!rows.length || !schema.columns.length) {\n this.selectionRanges = [];\n this.activeCell = null;\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(true);\n this.onActiveChange(null, null);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n return;\n }\n\n const maxRow = rows.length - 1;\n const maxCol = schema.columns.length - 1;\n\n const activeRowId = this.activeCell?.rowId ?? null;\n const activeColKey = this.activeCell?.colKey ?? null;\n const activeRowIndex = activeRowId ? this.dataModel.getRowIndex(activeRowId) : -1;\n const activeColIndex =\n activeColKey !== null\n ? schema.columns.findIndex((c) => String(c.key) === String(activeColKey))\n : -1;\n\n // If current active cell is still visible, just clamp selection ranges when needed.\n if (activeRowIndex >= 0 && activeColIndex >= 0) {\n let changed = false;\n if (!this.selectionRanges.length) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: activeRowIndex,\n endRow: activeRowIndex,\n startCol: activeColIndex,\n endCol: activeColIndex,\n },\n ];\n changed = true;\n } else {\n const nextRanges: SelectionRange[] = this.selectionRanges.map((r) => {\n const clamp = (n: number, max: number) => Math.max(0, Math.min(max, n));\n const next: SelectionRange = {\n ...r,\n startRow: clamp(r.startRow, maxRow),\n endRow: clamp(r.endRow, maxRow),\n startCol: clamp(r.startCol, maxCol),\n endCol: clamp(r.endCol, maxCol),\n };\n if (\n next.startRow !== r.startRow ||\n next.endRow !== r.endRow ||\n next.startCol !== r.startCol ||\n next.endCol !== r.endCol\n ) {\n changed = true;\n }\n return next;\n });\n this.selectionRanges = nextRanges;\n }\n if (changed) this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n return;\n }\n\n // Active row got filtered out (or active col disappeared): move to the nearest visible row/col.\n const desiredColKey = activeColKey ?? schema.columns[0]?.key ?? \"\";\n let colIndex = schema.columns.findIndex((c) => String(c.key) === String(desiredColKey));\n if (colIndex < 0) colIndex = 0;\n const colKey = schema.columns[colIndex]?.key ?? \"\";\n\n const baseIndex = activeRowId ? this.dataModel.getBaseRowIndex(activeRowId) : 0;\n const fallbackRow = rows[rows.length - 1] ?? rows[0] ?? null;\n const nextRow =\n rows.find((r) => this.dataModel.getBaseRowIndex(r.id) >= baseIndex) ?? fallbackRow;\n if (!nextRow) return;\n const rowId = nextRow.id;\n const rowIndex = this.dataModel.getRowIndex(rowId);\n\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(false);\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: rowIndex,\n endRow: rowIndex,\n startCol: colIndex,\n endCol: colIndex,\n },\n ];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n const current = this.dataModel.getCell(rowId, colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n this.updateFillHandleFlag();\n }\n\n navigateToCell(rowId: string, colKey: string) {\n const schema = this.dataModel.getSchema();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(colKey));\n if (rowIndex < 0 || colIndex < 0) return;\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(false);\n const nextRange: SelectionRange = {\n kind: \"cells\",\n startRow: rowIndex,\n endRow: rowIndex,\n startCol: colIndex,\n endCol: colIndex,\n };\n this.selectionRanges = [nextRange];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n const current = this.dataModel.getCell(rowId, colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n this.updateFillHandleFlag();\n }\n\n cancelEditing() {\n this.teardownInput(true);\n }\n\n destroy() {\n this.root.removeEventListener(\"click\", this.handleClick);\n this.root.removeEventListener(\"pointerdown\", this.handlePointerDown);\n this.root.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.root.removeEventListener(\"pointerup\", this.handlePointerUp);\n this.root.removeEventListener(\"pointercancel\", this.handlePointerUp);\n if (this.handleDocumentContextMenu) {\n document.removeEventListener(\"contextmenu\", this.handleDocumentContextMenu, true);\n }\n this.teardownInput(true);\n this.teardownSelectionInput();\n this.teardownCopyToast();\n this.stopAutoScroll();\n }\n\n onScroll(scrollTop: number, scrollLeft: number) {\n // Editors are positioned in scroll-container content coordinates and follow scroll automatically.\n void scrollTop;\n void scrollLeft;\n this.positionCopyToast();\n }\n\n private bind() {\n this.root.addEventListener(\"click\", this.handleClick);\n this.root.addEventListener(\"pointerdown\", this.handlePointerDown);\n this.root.addEventListener(\"pointermove\", this.handlePointerMove);\n this.root.addEventListener(\"pointerup\", this.handlePointerUp);\n this.root.addEventListener(\"pointercancel\", this.handlePointerUp);\n this.handleDocumentContextMenu = (ev: MouseEvent) => this.handleContextMenu(ev);\n document.addEventListener(\"contextmenu\", this.handleDocumentContextMenu, { capture: true });\n }\n\n private updateFillHandleFlag() {\n const activeColKey = this.activeCell?.colKey ?? null;\n const activeRowId = this.activeCell?.rowId ?? null;\n this.root.dataset.extableFillHandle = shouldShowFillHandle(\n this.dataModel,\n this.selectionRanges,\n activeRowId,\n activeColKey,\n this.editMode,\n )\n ? \"1\"\n : \"\";\n }\n\n private findColumn(colKey: string) {\n const schema = this.dataModel.getSchema();\n return schema.columns.find((c) => c.key === colKey);\n }\n\n private pad2(n: number) {\n return String(n).padStart(2, \"0\");\n }\n\n private formatLocalDateForInput(d: Date) {\n return `${d.getFullYear()}-${this.pad2(d.getMonth() + 1)}-${this.pad2(d.getDate())}`;\n }\n\n private formatLocalTimeForInput(d: Date) {\n return `${this.pad2(d.getHours())}:${this.pad2(d.getMinutes())}`;\n }\n\n private formatLocalDateTimeForInput(d: Date) {\n return `${this.formatLocalDateForInput(d)}T${this.formatLocalTimeForInput(d)}`;\n }\n\n private normalizeTemporalInitialValue(colType: \"date\" | \"time\" | \"datetime\", initial: string) {\n const value = initial.trim();\n if (!value) return \"\";\n\n if (colType === \"date\") {\n const m = value.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (m) return m[1] ?? \"\";\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalDateForInput(d);\n return \"\";\n }\n\n if (colType === \"time\") {\n const m = value.match(/(\\d{2}:\\d{2})(?::\\d{2})?/);\n if (m) return m[1] ?? \"\";\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalTimeForInput(d);\n return \"\";\n }\n\n // datetime => input[type=\"datetime-local\"] expects \"YYYY-MM-DDTHH:mm\" (no timezone).\n if (/Z$/.test(value) && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/.test(value)) {\n return value.replace(/Z$/, \"\").slice(0, 16);\n }\n if (\n /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}/.test(value) &&\n !/[+-]\\d{2}:\\d{2}$/.test(value)\n ) {\n return value.slice(0, 16);\n }\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalDateTimeForInput(d);\n return \"\";\n }\n\n private ensureCopyToast() {\n if (this.copyToastEl) return this.copyToastEl;\n // Ensure a positioning context for the toast.\n const computed = window.getComputedStyle(this.root);\n if (computed.position === \"static\") {\n this.root.style.position = \"relative\";\n }\n const toast = document.createElement(\"div\");\n toast.className = \"extable-toast\";\n toast.dataset.extableCopyToast = \"1\";\n toast.setAttribute(\"popover\", \"manual\");\n toast.style.position = \"absolute\";\n toast.style.left = \"0\";\n toast.style.top = \"0\";\n toast.style.pointerEvents = \"none\";\n toast.style.zIndex = \"1000\";\n // Keep it from affecting layout.\n toast.style.margin = \"0\";\n this.root.appendChild(toast);\n this.copyToastEl = toast;\n return toast;\n }\n\n private teardownCopyToast() {\n if (this.copyToastTimer) {\n window.clearTimeout(this.copyToastTimer);\n this.copyToastTimer = null;\n }\n if (!this.copyToastEl) return;\n this.copyToastEl.hidePopover?.();\n removeFromParent(this.copyToastEl);\n this.copyToastEl = null;\n }\n\n private positionCopyToast() {\n if (!this.copyToastEl) return;\n const w = this.copyToastEl.offsetWidth || 0;\n const h = this.copyToastEl.offsetHeight || 0;\n const inset = 16;\n const left = Math.max(0, this.root.scrollLeft + this.root.clientWidth - w - inset);\n const top = Math.max(0, this.root.scrollTop + this.root.clientHeight - h - inset);\n this.copyToastEl.style.left = `${left}px`;\n this.copyToastEl.style.top = `${top}px`;\n }\n\n private showCopyToast(message: string, variant: \"info\" | \"error\" = \"info\", durationMs = 1200) {\n const toast = this.ensureCopyToast();\n toast.textContent = message;\n toast.dataset.variant = variant;\n toast.hidePopover?.();\n toast.showPopover?.();\n this.positionCopyToast();\n if (this.copyToastTimer) {\n window.clearTimeout(this.copyToastTimer);\n this.copyToastTimer = null;\n }\n this.copyToastTimer = window.setTimeout(() => {\n toast.hidePopover?.();\n }, durationMs);\n }\n\n private ensureSelectionInput() {\n if (this.selectionInput) return this.selectionInput;\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.autocomplete = \"off\";\n input.spellcheck = false;\n input.style.position = \"absolute\";\n input.style.left = \"0\";\n input.style.top = \"0\";\n // Avoid affecting scroll extents in the scroll container.\n input.style.transform = \"translate(-10000px, 0)\";\n input.style.width = \"1px\";\n input.style.height = \"1px\";\n input.style.opacity = \"0\";\n input.style.pointerEvents = \"none\";\n input.addEventListener(\"keydown\", this.handleSelectionKeydown);\n input.addEventListener(\"compositionstart\", this.handleSelectionCompositionStart);\n input.addEventListener(\"copy\", this.handleSelectionCopy);\n input.addEventListener(\"cut\", this.handleSelectionCut);\n input.addEventListener(\"paste\", this.handleSelectionPaste);\n input.addEventListener(\"blur\", this.handleSelectionBlur);\n // Keep the selection input inside the table container (root), but offscreen.\n this.root.appendChild(input);\n this.selectionInput = input;\n return input;\n }\n\n private focusSelectionInput(valueForSelection: string) {\n const input = this.ensureSelectionInput();\n input.value = valueForSelection;\n this.selectionMode = true;\n input.focus({ preventScroll: true });\n input.select();\n }\n\n private openEditorAtActiveCell(options?: {\n initialValueOverride?: string;\n placeCursorAtEnd?: boolean;\n }) {\n if (!this.activeCell) return;\n const { rowId, colKey } = this.activeCell;\n if (colKey === null) return;\n const cell = this.findHtmlCellElement(rowId, colKey);\n if (cell) {\n this.activateCellElement(cell, rowId, colKey, options);\n return;\n }\n const rect = this.computeCanvasCellRect(rowId, colKey);\n if (rect) {\n this.activateFloating(rect, rowId, colKey, options);\n }\n }\n\n private escapeCssAttrValue(value: string) {\n const css = (globalThis as unknown as { CSS?: { escape?: (s: string) => string } }).CSS;\n const escapeFn = css?.escape;\n if (typeof escapeFn === \"function\") return escapeFn(value);\n // Minimal escaping for attribute selector values inside double quotes.\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n }\n\n private findHtmlCellElement(rowId: string, colKey: string | null) {\n if (colKey === null) return null;\n const key = String(colKey);\n const rowIdEsc = this.escapeCssAttrValue(rowId);\n const keyEsc = this.escapeCssAttrValue(key);\n return (\n this.root.querySelector<HTMLElement>(\n `tr[data-row-id=\"${rowIdEsc}\"] td[data-col-key=\"${keyEsc}\"]`,\n ) ?? null\n );\n }\n\n private computeCanvasCellRect(rowId: string, colKey: string | null) {\n if (colKey === null) return null;\n const box = this.computeCanvasCellBoxContent(rowId, colKey);\n if (!box) return null;\n const rootRect = this.root.getBoundingClientRect();\n return new DOMRect(\n rootRect.left + box.left - this.root.scrollLeft,\n rootRect.top + box.top - this.root.scrollTop,\n box.width,\n box.height,\n );\n }\n\n private computeCanvasCellBoxContent(rowId: string, colKey: string) {\n const canvas = this.root.querySelector<HTMLCanvasElement>(\n 'canvas[data-extable-renderer=\"canvas\"]',\n );\n if (!canvas) return null;\n return this.getCanvasCellMetrics(rowId, colKey);\n }\n\n private getCanvasCellMetrics(rowId: string, colKey: string) {\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const rowIndex = rows.findIndex((r) => r.id === rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(colKey));\n if (rowIndex < 0 || colIndex < 0) return null;\n\n const headerHeight = HEADER_HEIGHT_PX;\n const rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n const defaultRowHeight = DEFAULT_ROW_HEIGHT_PX;\n const colWidths = getColumnWidths(schema, view);\n\n let left = rowHeaderWidth;\n for (let i = 0; i < colIndex; i += 1) left += colWidths[i] ?? 100;\n\n let top = headerHeight;\n for (let i = 0; i < rowIndex; i += 1) {\n const row = rows[i];\n if (!row) return null;\n const h = this.dataModel.getRowHeight(row.id) ?? defaultRowHeight;\n top += h;\n }\n const height = this.dataModel.getRowHeight(rowId) ?? defaultRowHeight;\n const width = colWidths[colIndex] ?? 100;\n return { left, top, width, height, rowIndex, colIndex };\n }\n\n private ensureVisibleCell(rowId: string, colKey: string) {\n const htmlCell = this.findHtmlCellElement(rowId, colKey);\n if (htmlCell) {\n if (typeof (htmlCell as HTMLElement).scrollIntoView === \"function\") {\n (htmlCell as HTMLElement).scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n }\n return;\n }\n const metrics = this.getCanvasCellMetrics(rowId, colKey);\n if (!metrics) return;\n const xStart = metrics.left;\n const xEnd = metrics.left + metrics.width;\n const yStart = metrics.top;\n const yEnd = metrics.top + metrics.height;\n\n const leftVis = this.root.scrollLeft;\n const rightVis = this.root.scrollLeft + this.root.clientWidth;\n const topVis = this.root.scrollTop;\n const bottomVis = this.root.scrollTop + this.root.clientHeight;\n\n if (xStart < leftVis) this.root.scrollLeft = Math.max(0, xStart);\n else if (xEnd > rightVis) this.root.scrollLeft = Math.max(0, xEnd - this.root.clientWidth);\n\n if (yStart < topVis) this.root.scrollTop = Math.max(0, yStart);\n else if (yEnd > bottomVis) this.root.scrollTop = Math.max(0, yEnd - this.root.clientHeight);\n }\n\n private moveActiveCell(deltaRow: number, deltaCol: number, extendSelection = false) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n if (!rows.length || !schema.columns.length) return;\n const { rowIndex, colIndex } = this.getActiveIndices();\n if (!extendSelection) this.selectionAnchor = null;\n const anchor =\n extendSelection && this.selectionAnchor\n ? this.selectionAnchor\n : extendSelection\n ? { rowIndex, colIndex }\n : null;\n if (extendSelection && !this.selectionAnchor) this.selectionAnchor = { rowIndex, colIndex };\n const nextRowIndex = Math.max(0, Math.min(rows.length - 1, rowIndex + deltaRow));\n const nextColIndex = Math.max(0, Math.min(schema.columns.length - 1, colIndex + deltaCol));\n {\n const row = rows[nextRowIndex];\n if (!row) return;\n const col = schema.columns[nextColIndex];\n if (!col) return;\n const rowId = row.id;\n const colKey = col.key;\n\n const nextRange: SelectionRange = anchor\n ? {\n kind: \"cells\",\n startRow: anchor.rowIndex,\n endRow: nextRowIndex,\n startCol: anchor.colIndex,\n endCol: nextColIndex,\n }\n : {\n kind: \"cells\",\n startRow: nextRowIndex,\n endRow: nextRowIndex,\n startCol: nextColIndex,\n endCol: nextColIndex,\n };\n this.selectionRanges = [nextRange];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n\n const current = this.dataModel.getCell(rowId, colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n this.updateFillHandleFlag();\n return;\n }\n }\n\n private handlePointerDown = (ev: PointerEvent) => {\n if (ev.button !== 0) return;\n const el = ev.target as HTMLElement | null;\n if (el?.closest('button[data-extable-fs-open=\"1\"]')) return;\n if (el?.closest(\".extable-filter-sort-trigger\")) return;\n // Avoid starting a drag from inside an active editor.\n if (this.inputEl && ev.target && this.inputEl.contains(ev.target as Node)) return;\n // Commit current editor before starting a drag/select operation.\n if (this.inputEl && this.activeCell && this.activeCell.colKey !== null) {\n const { rowId, colKey } = this.activeCell;\n const value = this.readActiveValue();\n this.commitEdit(rowId, colKey, value);\n this.onMove(rowId);\n this.teardownInput(false);\n }\n if (this.fillDragging) return;\n const hit = this.hitTest(ev as unknown as MouseEvent);\n if (!hit) return;\n if (hit.rowId === \"__all__\" && hit.colKey === \"__all__\") return;\n if (hit.colKey === \"__all__\") return;\n\n // Fill handle drag starts only when the pointer is down on the handle area.\n const fillSrc = getFillHandleSource(this.dataModel, this.selectionRanges);\n if (fillSrc && this.activeCell) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const handleRowIndex = fillSrc.endRowIndex;\n const handleColIndex = fillSrc.colIndex;\n const handleRow = rows[handleRowIndex];\n const handleCol = schema.columns[handleColIndex];\n if (handleRow && handleCol) {\n const cellRect =\n this.findHtmlCellElement(handleRow.id, handleCol.key)?.getBoundingClientRect() ??\n this.computeCanvasCellRect(handleRow.id, handleCol.key);\n if (\n cellRect &&\n shouldShowFillHandle(\n this.dataModel,\n this.selectionRanges,\n this.activeCell.rowId,\n this.activeCell.colKey,\n this.editMode,\n )\n ) {\n const handleRect = getFillHandleRect(cellRect, FILL_HANDLE_HIT_SIZE_PX);\n if (isPointInRect(ev.clientX, ev.clientY, handleRect)) {\n ev.preventDefault();\n this.fillDragging = true;\n this.fillSource = fillSrc;\n this.fillEndRowIndex = fillSrc.endRowIndex;\n this.root.dataset.extableFillDragging = \"1\";\n if (this.rootCursorBackup === null)\n this.rootCursorBackup = this.root.style.cursor || \"\";\n this.root.style.cursor = \"crosshair\";\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n this.dragging = false;\n this.dragStart = null;\n this.suppressNextClick = true;\n try {\n (ev.target as Element | null)?.setPointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n // Expand selection to include filled range preview (start with source).\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: fillSrc.startRowIndex,\n endRow: fillSrc.endRowIndex,\n startCol: fillSrc.colIndex,\n endCol: fillSrc.colIndex,\n },\n ];\n this.onSelectionChange(this.selectionRanges);\n this.startAutoScroll();\n return;\n }\n }\n }\n }\n\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const rowIndex = hit.rowId === \"__header__\" ? 0 : this.dataModel.getRowIndex(hit.rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIndex < 0) return;\n\n if (hit.rowId === \"__header__\") {\n // Select entire column when clicking column header.\n if (!rows.length) return;\n const range: SelectionRange = {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: colIndex,\n endCol: colIndex,\n };\n this.selectionRanges = [range];\n this.onSelectionChange(this.selectionRanges);\n this.dragging = false;\n this.selectionMode = false;\n this.dragStart = null;\n this.selectionAnchor = null;\n this.suppressNextClick = true;\n const targetRow = rows[0];\n const targetCol = schema.columns[colIndex];\n if (targetRow && targetCol) {\n this.activeCell = { rowId: targetRow.id, colKey: targetCol.key };\n this.onActiveChange(targetRow.id, targetCol.key);\n }\n return;\n }\n\n if (rowIndex < 0) return;\n\n const kind: \"cells\" | \"rows\" = hit.colKey === null ? \"rows\" : \"cells\";\n this.dragging = true;\n this.pointerDownClient = { x: ev.clientX, y: ev.clientY };\n this.dragMoved = false;\n this.dragSelectionChanged = false;\n this.dragStart = { rowIndex, colIndex, kind };\n this.suppressNextClick = false;\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n\n try {\n (ev.target as Element | null)?.setPointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n this.startAutoScroll();\n };\n\n private getHitAtClientPoint(clientX: number, clientY: number) {\n // Prefer coordinate-based hit-test for auto-scroll ticks (no real event.target).\n if (typeof document.elementFromPoint !== \"function\") return null;\n const el = document.elementFromPoint(clientX, clientY) as HTMLElement | null;\n if (el && this.root.contains(el)) {\n const corner = el.closest<HTMLElement>(\"th.extable-corner\");\n if (corner) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n element: corner,\n rect: corner.getBoundingClientRect(),\n };\n }\n const rowHeader = el.closest<HTMLElement>(\"th.extable-row-header:not(.extable-corner)\");\n if (rowHeader) {\n const row = rowHeader.closest<HTMLElement>(\"tr[data-row-id]\");\n if (row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: null,\n element: rowHeader,\n rect: rowHeader.getBoundingClientRect(),\n };\n }\n }\n const colHeader = el.closest<HTMLElement>(\"th[data-col-key]\");\n if (colHeader) {\n return {\n rowId: \"__header__\",\n colKey: colHeader.dataset.colKey ?? \"\",\n element: colHeader,\n rect: colHeader.getBoundingClientRect(),\n };\n }\n const cell = el.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (cell && row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n element: cell,\n rect: cell.getBoundingClientRect(),\n };\n }\n }\n // Canvas renderer hitTest does not rely on target; a minimal shape is enough.\n return this.hitTest({ clientX, clientY } as unknown as MouseEvent);\n }\n\n private updateDragFromClientPoint(clientX: number, clientY: number) {\n if (!this.dragging || !this.dragStart) return;\n const hit = this.getHitAtClientPoint(clientX, clientY);\n if (!hit) return;\n if (\n hit.colKey === \"__all__\" ||\n (this.dragStart.kind === \"cells\" && hit.colKey === null)\n )\n return;\n\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const endRowIndex = this.dataModel.getRowIndex(hit.rowId);\n if (endRowIndex < 0) return;\n const endColIndex =\n this.dragStart.kind === \"rows\"\n ? schema.columns.length - 1\n : schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (endColIndex < 0) return;\n\n const startRow = this.dragStart.rowIndex;\n const startCol = this.dragStart.kind === \"rows\" ? 0 : this.dragStart.colIndex;\n const endCol = this.dragStart.kind === \"rows\" ? schema.columns.length - 1 : endColIndex;\n if (endRowIndex !== startRow || endCol !== startCol) {\n this.dragSelectionChanged = true;\n }\n const nextRange: SelectionRange = {\n kind: this.dragStart.kind,\n startRow,\n endRow: endRowIndex,\n startCol,\n endCol,\n };\n this.selectionRanges = [nextRange];\n const activeRowId = rows[endRowIndex]?.id ?? hit.rowId;\n const activeColKey =\n this.dragStart.kind === \"rows\"\n ? (schema.columns[0]?.key ?? hit.colKey)\n : (schema.columns[endColIndex]?.key ?? hit.colKey);\n this.activeCell = { rowId: activeRowId, colKey: activeColKey };\n this.onActiveChange(activeRowId, activeColKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n }\n\n private updateFillDragFromClientPoint(clientX: number, clientY: number) {\n if (!this.fillDragging || !this.fillSource) return;\n const hit = this.getHitAtClientPoint(clientX, clientY);\n if (!hit) return;\n if (hit.colKey === \"__all__\" || hit.colKey === null) return;\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const endRowIndex = this.dataModel.getRowIndex(hit.rowId);\n if (endRowIndex < 0) return;\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIndex !== this.fillSource.colIndex) return;\n\n // Vertical fill only; allow dragging downwards from the source end.\n const nextEnd = Math.max(this.fillSource.endRowIndex, endRowIndex);\n if (this.fillEndRowIndex !== nextEnd) {\n this.fillEndRowIndex = nextEnd;\n const activeRowId = rows[nextEnd]?.id ?? hit.rowId;\n const col = schema.columns[this.fillSource.colIndex];\n if (!col) return;\n const colKey = col.key;\n this.activeCell = { rowId: activeRowId, colKey };\n this.onActiveChange(activeRowId, colKey);\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: this.fillSource.startRowIndex,\n endRow: nextEnd,\n startCol: this.fillSource.colIndex,\n endCol: this.fillSource.colIndex,\n },\n ];\n this.onSelectionChange(this.selectionRanges);\n }\n this.suppressNextClick = true;\n }\n\n private computeAutoScrollDelta(clientX: number, clientY: number) {\n const rect = this.root.getBoundingClientRect();\n const threshold = 24;\n const maxStep = 18;\n let dx = 0;\n let dy = 0;\n if (clientX < rect.left + threshold) {\n dx = -Math.ceil(((rect.left + threshold - clientX) / threshold) * maxStep);\n } else if (clientX > rect.right - threshold) {\n dx = Math.ceil(((clientX - (rect.right - threshold)) / threshold) * maxStep);\n }\n if (clientY < rect.top + threshold) {\n dy = -Math.ceil(((rect.top + threshold - clientY) / threshold) * maxStep);\n } else if (clientY > rect.bottom - threshold) {\n dy = Math.ceil(((clientY - (rect.bottom - threshold)) / threshold) * maxStep);\n }\n return { dx, dy };\n }\n\n private startAutoScroll() {\n if (this.autoScrollActive) return;\n this.autoScrollActive = true;\n const tick = () => {\n if (!this.autoScrollActive) return;\n const p = this.lastPointerClient;\n if (!p || (!this.dragging && !this.fillDragging)) {\n this.stopAutoScroll();\n return;\n }\n const { dx, dy } = this.computeAutoScrollDelta(p.x, p.y);\n if (dx !== 0 || dy !== 0) {\n const prevTop = this.root.scrollTop;\n const prevLeft = this.root.scrollLeft;\n this.root.scrollTop = Math.max(0, prevTop + dy);\n this.root.scrollLeft = Math.max(0, prevLeft + dx);\n // While scrolling, keep updating selection/fill based on the latest pointer position.\n if (this.fillDragging) this.updateFillDragFromClientPoint(p.x, p.y);\n else this.updateDragFromClientPoint(p.x, p.y);\n }\n const raf =\n window.requestAnimationFrame ??\n ((cb: FrameRequestCallback) => window.setTimeout(() => cb(performance.now()), 16));\n this.autoScrollRaf = raf(tick);\n };\n const raf2 =\n window.requestAnimationFrame ??\n ((cb: FrameRequestCallback) => window.setTimeout(() => cb(performance.now()), 16));\n this.autoScrollRaf = raf2(tick);\n }\n\n private stopAutoScroll() {\n this.autoScrollActive = false;\n if (this.autoScrollRaf !== null) {\n const caf = window.cancelAnimationFrame ?? ((id: number) => window.clearTimeout(id));\n caf(this.autoScrollRaf);\n this.autoScrollRaf = null;\n }\n }\n\n private handlePointerMove = (ev: PointerEvent) => {\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n if (this.fillDragging && this.fillSource) {\n this.updateFillDragFromClientPoint(ev.clientX, ev.clientY);\n return;\n }\n if (!this.dragging || !this.dragStart) return;\n if (!this.dragMoved && this.pointerDownClient) {\n const dx = ev.clientX - this.pointerDownClient.x;\n const dy = ev.clientY - this.pointerDownClient.y;\n // Ignore tiny pointer jitter so clicks aren't suppressed.\n if (dx * dx + dy * dy < 9) return;\n this.dragMoved = true;\n }\n this.updateDragFromClientPoint(ev.clientX, ev.clientY);\n };\n\n private handlePointerUp = (ev: PointerEvent) => {\n if (this.fillDragging && this.fillSource) {\n const src = this.fillSource;\n const endRowIndex = this.fillEndRowIndex ?? src.endRowIndex;\n this.fillDragging = false;\n this.fillSource = null;\n this.fillEndRowIndex = null;\n this.root.dataset.extableFillDragging = \"\";\n if (this.rootCursorBackup !== null) {\n this.root.style.cursor = this.rootCursorBackup;\n this.rootCursorBackup = null;\n }\n this.stopAutoScroll();\n try {\n (ev.target as Element | null)?.releasePointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n this.commitFill(src, endRowIndex);\n this.suppressNextClick = true;\n return;\n }\n if (!this.dragging) return;\n this.dragging = false;\n this.dragStart = null;\n const suppressTrailingClick = this.dragSelectionChanged;\n this.pointerDownClient = null;\n this.dragMoved = false;\n this.dragSelectionChanged = false;\n this.stopAutoScroll();\n try {\n (ev.target as Element | null)?.releasePointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n if (suppressTrailingClick) this.suppressNextClick = true;\n if (this.suppressNextClick) {\n // Keep selection mode focus; prevent the trailing click from opening edit.\n if (this.activeCell && this.activeCell.colKey !== null) {\n const current = this.dataModel.getCell(this.activeCell.rowId, this.activeCell.colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n }\n }\n };\n\n private commitFill(source: import(\"./fillHandle\").FillHandleSource, endRowIndex: number) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const col = schema.columns[source.colIndex];\n if (!col) return;\n if (endRowIndex <= source.endRowIndex) return;\n\n const getValue = makeFillValueGetter(this.dataModel, source);\n if (!getValue) return;\n\n const commitNow = this.editMode === \"direct\";\n const batchId = `fill:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = source.endRowIndex + 1; r <= endRowIndex; r += 1) {\n const row = rows[r];\n if (!row) break;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const offset = r - source.endRowIndex;\n const next = getValue(offset);\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n\n // Select the filled range after commit and focus selection mode.\n const endRow = rows[endRowIndex];\n if (!endRow) return;\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: source.startRowIndex,\n endRow: endRowIndex,\n startCol: source.colIndex,\n endCol: source.colIndex,\n },\n ];\n this.activeCell = { rowId: endRow.id, colKey: col.key };\n this.onActiveChange(endRow.id, col.key);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.ensureVisibleCell(endRow.id, col.key);\n const current = this.dataModel.getCell(endRow.id, col.key);\n this.focusSelectionInput(this.cellToClipboardString(current));\n }\n\n private teardownSelectionInput() {\n const input = this.selectionInput;\n if (!input) return;\n // Avoid re-entrancy via blur fired during DOM removal.\n this.selectionInput = null;\n input.removeEventListener(\"keydown\", this.handleSelectionKeydown);\n input.removeEventListener(\"compositionstart\", this.handleSelectionCompositionStart);\n input.removeEventListener(\"copy\", this.handleSelectionCopy);\n input.removeEventListener(\"cut\", this.handleSelectionCut);\n input.removeEventListener(\"paste\", this.handleSelectionPaste);\n input.removeEventListener(\"blur\", this.handleSelectionBlur);\n removeFromParent(input);\n }\n\n private handleSelectionCopy = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n ev.preventDefault();\n ev.clipboardData?.setData(\"text/plain\", payload.text);\n ev.clipboardData?.setData(\"text/tab-separated-values\", payload.text);\n ev.clipboardData?.setData(\"text/html\", payload.html);\n this.showCopyToast(`Copied ${payload.cellCount} cells`, \"info\");\n };\n\n private handleSelectionCut = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n ev.preventDefault();\n ev.clipboardData?.setData(\"text/plain\", payload.text);\n ev.clipboardData?.setData(\"text/tab-separated-values\", payload.text);\n ev.clipboardData?.setData(\"text/html\", payload.html);\n this.clearSelectionValues();\n };\n\n private handleSelectionPaste = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n ev.preventDefault();\n const html = ev.clipboardData?.getData(\"text/html\") ?? \"\";\n const tsv = ev.clipboardData?.getData(\"text/tab-separated-values\") ?? \"\";\n const text = ev.clipboardData?.getData(\"text/plain\") ?? \"\";\n const grid = this.parseClipboardGrid({ html, tsv, text });\n if (!grid) return;\n this.applyClipboardGrid(grid);\n };\n\n private handleSelectionCompositionStart = () => {\n if (!this.selectionMode) return;\n this.selectionMode = false;\n this.teardownSelectionInput();\n this.openEditorAtActiveCell();\n };\n\n public async copySelection() {\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n const { text, html, cellCount } = payload;\n\n const copyViaClipboardApi = async () => {\n if (typeof navigator === \"undefined\" || !navigator.clipboard) return false;\n if (typeof ClipboardItem !== \"undefined\" && navigator.clipboard.write) {\n try {\n const item = new ClipboardItem({\n \"text/plain\": new Blob([text], { type: \"text/plain\" }),\n \"text/html\": new Blob([html], { type: \"text/html\" }),\n });\n await navigator.clipboard.write([item]);\n return true;\n } catch {\n /* fallthrough */\n }\n }\n if (navigator.clipboard.writeText) {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n /* fallthrough */\n }\n }\n return false;\n };\n\n const copyViaFallbackInput = () => {\n const input = this.ensureSelectionInput();\n const prev = input.value;\n input.value = text;\n input.select();\n document.execCommand?.(\"copy\");\n input.value = prev;\n };\n\n const copied = await copyViaClipboardApi();\n if (!copied) copyViaFallbackInput();\n this.showCopyToast(`Copied ${cellCount} cells`, \"info\");\n }\n\n public async pasteFromClipboard() {\n if (this.editMode === \"readonly\") return;\n if (!this.selectionMode) return;\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.readText) return;\n try {\n const text = await navigator.clipboard.readText();\n if (!text) return;\n const grid = this.parseClipboardGrid({ html: \"\", tsv: text, text });\n if (!grid) return;\n this.applyClipboardGrid(grid);\n } catch {\n /* ignore */\n }\n }\n\n private handleSelectionKeydown = (ev: KeyboardEvent) => {\n if (!this.selectionMode) return;\n if (!this.activeCell) return;\n if (ev.isComposing || this.composing) return;\n\n // Ignore modifier-only keys in selection mode (do not enter edit mode).\n if (\n ev.key === \"Shift\" ||\n ev.key === \"Control\" ||\n ev.key === \"Alt\" ||\n ev.key === \"Meta\" ||\n ev.key === \"CapsLock\" ||\n ev.key === \"NumLock\" ||\n ev.key === \"ScrollLock\"\n ) {\n return;\n }\n\n const isMac = typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n const accel = isMac ? ev.metaKey : ev.ctrlKey;\n if (accel) {\n const key = ev.key.toLowerCase();\n if (key === \"z\") {\n ev.preventDefault();\n if (isMac && ev.shiftKey) this.onRedo();\n else this.onUndo();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"y\") {\n ev.preventDefault();\n this.onRedo();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"c\") {\n ev.preventDefault();\n document.execCommand(\"copy\");\n this.selectionAnchor = null;\n return;\n }\n if (key === \"x\") {\n ev.preventDefault();\n document.execCommand(\"cut\");\n this.selectionAnchor = null;\n return;\n }\n if (key === \"v\") {\n // Let the paste event fire; it will be handled on the input.\n this.selectionAnchor = null;\n return;\n }\n }\n\n if (ev.key === \" \" && this.activeCell.colKey !== null) {\n const col = this.findColumn(this.activeCell.colKey);\n if (col?.type === \"boolean\") {\n ev.preventDefault();\n this.toggleBoolean(this.activeCell.rowId, this.activeCell.colKey);\n }\n this.selectionAnchor = null;\n return;\n }\n\n const isTab = ev.key === \"Tab\";\n const isEnter = ev.key === \"Enter\";\n const isArrow =\n ev.key === \"ArrowLeft\" ||\n ev.key === \"ArrowRight\" ||\n ev.key === \"ArrowUp\" ||\n ev.key === \"ArrowDown\";\n if (isTab || isEnter || isArrow) {\n ev.preventDefault();\n this.teardownSelectionInput();\n if (isTab) {\n this.moveActiveCell(0, ev.shiftKey ? -1 : 1, false);\n return;\n }\n if (isEnter) {\n this.moveActiveCell(ev.shiftKey ? -1 : 1, 0, false);\n return;\n }\n const extend = ev.shiftKey;\n if (ev.key === \"ArrowLeft\") this.moveActiveCell(0, -1, extend);\n else if (ev.key === \"ArrowRight\") this.moveActiveCell(0, 1, extend);\n else if (ev.key === \"ArrowUp\") this.moveActiveCell(-1, 0, extend);\n else if (ev.key === \"ArrowDown\") this.moveActiveCell(1, 0, extend);\n return;\n }\n\n this.selectionMode = false;\n this.selectionAnchor = null;\n this.teardownSelectionInput();\n // Let the original keydown insert the character into the now-focused editor naturally.\n this.openEditorAtActiveCell();\n };\n\n private getActiveIndices() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const fallback = { rowIndex: 0, colIndex: 0 };\n const ac = this.activeCell;\n if (!ac) return fallback;\n const rowIndex = rows.findIndex((r) => r.id === ac.rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n return { rowIndex: rowIndex >= 0 ? rowIndex : 0, colIndex: colIndex >= 0 ? colIndex : 0 };\n }\n\n private normalizeRange(range: SelectionRange): SelectionRange {\n return {\n ...range,\n startRow: Math.min(range.startRow, range.endRow),\n endRow: Math.max(range.startRow, range.endRow),\n startCol: Math.min(range.startCol, range.endCol),\n endCol: Math.max(range.startCol, range.endCol),\n };\n }\n\n private getCopyRange(): SelectionRange | null {\n const schema = this.dataModel.getSchema();\n if (this.selectionRanges.length > 0) {\n const first = this.selectionRanges[0];\n if (!first) return null;\n return this.normalizeRange(first);\n }\n if (!this.activeCell) return null;\n const ac = this.activeCell;\n if (!ac) return null;\n const rowIdx = this.dataModel.getRowIndex(ac.rowId);\n const colIdx = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n if (rowIdx < 0 || colIdx < 0) return null;\n return { kind: \"cells\", startRow: rowIdx, endRow: rowIdx, startCol: colIdx, endCol: colIdx };\n }\n\n private cellToClipboardString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n return String(value);\n }\n\n private escapeHtml(text: string) {\n return text\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n }\n\n private buildSelectionClipboardPayload(): {\n text: string;\n html: string;\n cellCount: number;\n } | null {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const range = this.getCopyRange();\n if (!range) return null;\n if (range.kind !== \"cells\") return null;\n\n const out: string[] = [];\n const htmlRows: string[] = [];\n const tableStyle = \"border-collapse:collapse;border-spacing:0;\";\n const cellStyle = \"border:1px solid #d0d7de;padding:4px 6px;vertical-align:top;\";\n let cellCount = 0;\n for (let r = range.startRow; r <= range.endRow; r += 1) {\n const row = rows[r];\n if (!row) continue;\n const line: string[] = [];\n const htmlCells: string[] = [];\n for (let c = range.startCol; c <= range.endCol; c += 1) {\n const col = schema.columns[c];\n if (!col) continue;\n const v = this.dataModel.getCell(row.id, col.key);\n const s = this.cellToClipboardString(v);\n line.push(s);\n htmlCells.push(`<td style=\"${cellStyle}\">${this.escapeHtml(s)}</td>`);\n cellCount += 1;\n }\n out.push(line.join(\"\\t\"));\n htmlRows.push(`<tr>${htmlCells.join(\"\")}</tr>`);\n }\n const text = out.join(\"\\r\\n\");\n const html = `<table style=\"${tableStyle}\"><tbody>${htmlRows.join(\"\")}</tbody></table>`;\n return { text, html, cellCount };\n }\n\n private clearSelectionValues() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const range = this.getCopyRange();\n if (!range || range.kind !== \"cells\") return;\n const commitNow = this.editMode === \"direct\";\n const batchId = `cut:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = range.startRow; r <= range.endRow; r += 1) {\n const row = rows[r];\n if (!row) continue;\n for (let c = range.startCol; c <= range.endCol; c += 1) {\n const col = schema.columns[c];\n if (!col) continue;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const next = col.type === \"boolean\" ? false : \"\";\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n }\n }\n\n private parseClipboardGrid(payload: { html: string; tsv: string; text: string }):\n | string[][]\n | null {\n const fromHtml = this.parseHtmlTable(payload.html);\n if (fromHtml) return fromHtml;\n const raw = payload.tsv || payload.text;\n return this.parseTsv(raw);\n }\n\n private parseTsv(text: string): string[][] | null {\n const trimmed = text.replace(/\\r\\n$/, \"\").replace(/\\n$/, \"\");\n if (!trimmed) return null;\n const rows = trimmed.split(/\\r\\n|\\n/);\n return rows.map((r) => r.split(\"\\t\"));\n }\n\n private parseHtmlTable(html: string): string[][] | null {\n if (!html) return null;\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n const table = doc.querySelector(\"table\");\n if (!table) return null;\n const trs = Array.from(table.querySelectorAll(\"tr\"));\n if (trs.length === 0) return null;\n const grid: string[][] = [];\n for (const tr of trs) {\n const cells = Array.from(tr.querySelectorAll(\"th,td\"));\n if (\n cells.some(\n (c) =>\n (c as HTMLTableCellElement).rowSpan > 1 || (c as HTMLTableCellElement).colSpan > 1,\n )\n ) {\n return null;\n }\n grid.push(cells.map((c) => (c.textContent ?? \"\").trim()));\n }\n return grid.length ? grid : null;\n } catch {\n return null;\n }\n }\n\n private coerceCellValue(raw: string, colKey: string): unknown {\n const col = this.findColumn(colKey);\n if (!col) return raw;\n if (raw === \"\") return \"\";\n if (col.type === \"number\") {\n const n = Number(raw);\n return Number.isFinite(n) ? n : raw;\n }\n if (col.type === \"boolean\") {\n const v = raw.trim().toLowerCase();\n if (v === \"true\" || v === \"1\" || v === \"yes\") return true;\n if (v === \"false\" || v === \"0\" || v === \"no\") return false;\n return raw;\n }\n return raw;\n }\n\n private applyClipboardGrid(grid: string[][]) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const { rowIndex: startRow, colIndex: startCol } = this.getActiveIndices();\n const commitNow = this.editMode === \"direct\";\n const batchId = `paste:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = 0; r < grid.length; r += 1) {\n const row = rows[startRow + r];\n if (!row) break;\n const line = grid[r] ?? [];\n for (let c = 0; c < line.length; c += 1) {\n const col = schema.columns[startCol + c];\n if (!col) break;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const next = this.coerceCellValue(line[c] ?? \"\", col.key);\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n }\n }\n\n private createEditor(colKey: string, initial: string) {\n const col = this.findColumn(colKey);\n const needsTextarea = col?.wrapText || initial.includes(\"\\n\");\n if (needsTextarea) {\n const ta = document.createElement(\"textarea\");\n ta.value = initial;\n ta.style.resize = \"none\";\n ta.style.whiteSpace = \"pre-wrap\";\n ta.style.overflowWrap = \"anywhere\";\n ta.style.overflow = \"hidden\";\n this.autosize(ta);\n ta.addEventListener(\"input\", () => this.autosize(ta));\n return { control: ta, value: initial };\n }\n if (col?.type === \"boolean\") {\n const input = document.createElement(\"input\");\n input.type = \"checkbox\";\n input.checked = initial === \"true\" || initial === \"1\" || initial === \"on\";\n return { control: input, value: initial };\n }\n if (col?.type === \"number\") {\n const input = document.createElement(\"input\");\n input.type = \"number\";\n input.value = initial;\n return { control: input, value: initial };\n }\n if (col?.type === \"date\" || col?.type === \"time\" || col?.type === \"datetime\") {\n const input = document.createElement(\"input\");\n input.type = col.type === \"date\" ? \"date\" : col.type === \"time\" ? \"time\" : \"datetime-local\";\n const normalized = this.normalizeTemporalInitialValue(col.type, initial);\n input.value = normalized;\n return { control: input, value: normalized };\n }\n if (col?.type === \"enum\" || col?.type === \"tags\") {\n const allowCustom = col.enum?.allowCustom ?? col.tags?.allowCustom;\n const options = col.enum?.options ?? col.tags?.options ?? [];\n if (allowCustom === false) {\n const select = document.createElement(\"select\");\n const empty = document.createElement(\"option\");\n empty.value = \"\";\n empty.textContent = \"\";\n select.appendChild(empty);\n for (const opt of options) {\n const op = document.createElement(\"option\");\n op.value = opt;\n op.textContent = opt;\n if (initial === opt) op.selected = true;\n select.appendChild(op);\n }\n return { control: select, value: initial };\n }\n const input = document.createElement(\"input\");\n input.type = \"text\";\n const listId = `extable-datalist-${String(colKey)}`;\n input.setAttribute(\"list\", listId);\n input.value = initial;\n let datalist = document.getElementById(listId) as HTMLDataListElement | null;\n if (!datalist) {\n datalist = document.createElement(\"datalist\");\n datalist.id = listId;\n for (const opt of options) {\n const op = document.createElement(\"option\");\n op.value = opt;\n datalist.appendChild(op);\n }\n this.root.appendChild(datalist);\n }\n return { control: input, value: initial, datalistId: listId };\n }\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.value = initial;\n return { control: input, value: initial };\n }\n\n private autosize(ta: HTMLTextAreaElement) {\n const style = window.getComputedStyle(ta);\n let lineHeight = Number.parseFloat(style.lineHeight);\n if (!Number.isFinite(lineHeight) || lineHeight <= 0) lineHeight = 16;\n ta.rows = 1; // shrink to measure\n const lines = Math.ceil(ta.scrollHeight / lineHeight);\n ta.rows = Math.max(1, lines);\n ta.style.minHeight = `${lineHeight}px`;\n }\n\n private positionFloatingContentBox(\n box: { left: number; top: number; width: number; height: number },\n wrapper: HTMLDivElement,\n ) {\n const inset = 2;\n wrapper.style.left = `${box.left + inset}px`;\n wrapper.style.top = `${box.top + inset}px`;\n wrapper.style.width = `${Math.max(8, box.width - inset * 2)}px`;\n wrapper.style.height = `${Math.max(8, box.height - inset * 2)}px`;\n }\n\n private handleClick = (ev: MouseEvent) => {\n if (ev.button !== 0) {\n return; // only left click starts edit/selection; right-click is handled by contextmenu\n }\n const el = ev.target as HTMLElement | null;\n if (el?.closest('button[data-extable-fs-open=\"1\"]')) {\n return;\n }\n if (this.suppressNextClick) {\n this.suppressNextClick = false;\n return;\n }\n if (this.inputEl && ev.target && this.inputEl.contains(ev.target as Node)) {\n return;\n }\n if (this.inputEl && this.activeCell && this.activeCell.colKey !== null) {\n const { rowId, colKey } = this.activeCell;\n const value = this.readActiveValue();\n this.commitEdit(rowId, colKey, value);\n this.onMove(rowId);\n this.teardownInput(false);\n }\n const hit =\n typeof document.elementFromPoint === \"function\"\n ? this.getHitAtClientPoint(ev.clientX, ev.clientY)\n : this.hitTest(ev);\n if (!hit) return;\n const wasSameCell =\n this.selectionMode &&\n !ev.shiftKey &&\n !ev.metaKey &&\n !ev.ctrlKey &&\n this.activeCell?.rowId === hit.rowId &&\n String(this.activeCell?.colKey) === String(hit.colKey);\n if (hit.rowId === \"__all__\" && hit.colKey === \"__all__\") {\n this.teardownInput(false);\n this.activeCell = null;\n this.onActiveChange(\"__all__\", \"__all__\");\n this.selectionAnchor = null;\n return;\n }\n this.onRowSelect(hit.rowId);\n this.applySelectionFromHit(ev, hit);\n if (hit.colKey === null || hit.colKey === \"__all__\") {\n return;\n }\n if (this.isCellReadonly(hit.rowId, hit.colKey)) {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.teardownInput(false);\n this.teardownSelectionInput();\n return;\n }\n const col = this.findColumn(hit.colKey);\n const isBoolean = col?.type === \"boolean\";\n if (isBoolean) {\n const isSecondClick =\n this.lastBooleanCell?.rowId === hit.rowId &&\n String(this.lastBooleanCell?.colKey) === String(hit.colKey);\n this.lastBooleanCell = { rowId: hit.rowId, colKey: hit.colKey };\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.teardownInput(false);\n this.teardownSelectionInput();\n if (isSecondClick) {\n this.toggleBoolean(hit.rowId, hit.colKey);\n // Keep focus on the hidden selection input so Space does not scroll the container/page.\n this.focusSelectionInput(\"\");\n return;\n }\n // Keep focus on the hidden selection input so Space can toggle.\n this.focusSelectionInput(\"\");\n return;\n }\n this.lastBooleanCell = null;\n this.selectionAnchor = null;\n this.teardownInput(false);\n const current = this.dataModel.getCell(hit.rowId, hit.colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n if (wasSameCell) {\n this.selectionMode = false;\n this.teardownSelectionInput();\n this.openEditorAtActiveCell();\n }\n };\n\n private toggleBoolean(rowId: string, colKey: string) {\n const current = this.dataModel.getCell(rowId, colKey);\n const currentBool = current === true || current === \"true\" || current === \"1\" || current === 1;\n const next = !currentBool;\n const cmd: Command = { kind: \"edit\", rowId, colKey, next };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n this.onMove(rowId);\n }\n\n private handleContextMenu = (ev: MouseEvent) => {\n const target = ev.target as Node | null;\n if (ev.ctrlKey) {\n ev.preventDefault();\n return;\n }\n if (!target || !this.root.contains(target)) return;\n ev.preventDefault();\n ev.stopPropagation();\n const hit = this.hitTest(ev);\n const rowId = hit?.rowId ?? null;\n const colKey = hit?.colKey ?? null;\n this.onContextMenu(rowId, colKey, ev.clientX, ev.clientY);\n };\n\n private applySelectionFromHit(ev: MouseEvent, hit: { rowId: string; colKey: string | null }) {\n const schema = this.dataModel.getSchema();\n const rowIdx = this.dataModel.getRowIndex(hit.rowId);\n const isRow = hit.colKey === null;\n const colIdx = isRow ? (schema.columns.length > 0 ? 0 : -1) : schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIdx < 0) return;\n const targetRange: SelectionRange = isRow\n ? {\n kind: \"rows\",\n startRow: rowIdx,\n endRow: rowIdx,\n startCol: 0,\n endCol: schema.columns.length - 1,\n }\n : {\n kind: \"cells\",\n startRow: rowIdx,\n endRow: rowIdx,\n startCol: Math.max(0, colIdx),\n endCol: Math.max(0, colIdx),\n };\n let nextRanges: SelectionRange[] = [];\n if (ev.shiftKey && this.activeCell) {\n const ac = this.activeCell;\n const anchorRow = this.dataModel.getRowIndex(ac.rowId);\n const anchorCol = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n const anchorRange: SelectionRange = isRow\n ? {\n kind: \"rows\",\n startRow: anchorRow,\n endRow: rowIdx,\n startCol: 0,\n endCol: schema.columns.length - 1,\n }\n : {\n kind: \"cells\",\n startRow: anchorRow,\n endRow: rowIdx,\n startCol: Math.max(0, anchorCol),\n endCol: Math.max(0, colIdx),\n };\n nextRanges = [anchorRange];\n } else if (ev.metaKey || ev.ctrlKey) {\n nextRanges = [...this.selectionRanges, targetRange];\n } else {\n nextRanges = [targetRange];\n }\n this.selectionRanges = this.mergeRanges(nextRanges);\n const anchorCell =\n targetRange.kind === \"rows\"\n ? { rowId: hit.rowId, colKey: schema.columns[colIdx]?.key ?? null }\n : { rowId: hit.rowId, colKey: hit.colKey };\n this.activeCell = anchorCell;\n this.onActiveChange(anchorCell.rowId, anchorCell.colKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n }\n\n private mergeRanges(ranges: SelectionRange[]) {\n const merged: SelectionRange[] = [];\n const sorted = [...ranges].sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === \"rows\" ? -1 : 1;\n if (a.startRow !== b.startRow) return a.startRow - b.startRow;\n if (a.startCol !== b.startCol) return a.startCol - b.startCol;\n if (a.endRow !== b.endRow) return a.endRow - b.endRow;\n return a.endCol - b.endCol;\n });\n for (const r of sorted) {\n const last = merged.at(-1);\n if (!last) {\n merged.push({ ...r });\n continue;\n }\n if (last.kind !== r.kind) {\n merged.push({ ...r });\n continue;\n }\n if (r.kind === \"rows\") {\n const canMerge =\n last.startCol === r.startCol &&\n last.endCol === r.endCol &&\n last.startRow <= r.endRow + 1 &&\n r.startRow <= last.endRow + 1;\n if (canMerge) {\n last.startRow = Math.min(last.startRow, r.startRow);\n last.endRow = Math.max(last.endRow, r.endRow);\n continue;\n }\n } else {\n const sameCols = last.startCol === r.startCol && last.endCol === r.endCol;\n const sameRows = last.startRow === r.startRow && last.endRow === r.endRow;\n const rowsTouch = last.startRow <= r.endRow + 1 && r.startRow <= last.endRow + 1;\n const colsTouch = last.startCol <= r.endCol + 1 && r.startCol <= last.endCol + 1;\n if (sameCols && rowsTouch) {\n last.startRow = Math.min(last.startRow, r.startRow);\n last.endRow = Math.max(last.endRow, r.endRow);\n continue;\n }\n if (sameRows && colsTouch) {\n last.startCol = Math.min(last.startCol, r.startCol);\n last.endCol = Math.max(last.endCol, r.endCol);\n continue;\n }\n }\n merged.push({ ...r });\n }\n return merged;\n }\n\n private activateCellElement(\n cell: HTMLElement,\n rowId: string,\n colKey: string,\n options?: { initialValueOverride?: string; placeCursorAtEnd?: boolean },\n ) {\n this.teardownInput();\n this.activeCell = { rowId, colKey };\n this.activeHost = cell;\n this.activeHostOriginalText = cell.textContent ?? \"\";\n const current = this.dataModel.getCell(rowId, colKey);\n const initialValue =\n options?.initialValueOverride ??\n (current === null || current === undefined ? \"\" : String(current));\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n input.style.width = \"calc(100% - 4px)\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"2px\";\n input.style.padding = \"4px 6px\";\n input.style.border = \"none\";\n input.style.borderRadius = \"0\";\n input.style.boxShadow = \"none\";\n input.style.background = \"#fff\";\n input.style.outline = \"none\";\n input.style.fontSize = \"14px\";\n input.style.fontFamily = \"inherit\";\n input.style.lineHeight = \"1.2\";\n input.style.fontWeight = \"inherit\";\n const col = this.findColumn(colKey);\n input.style.textAlign = col?.style?.align ?? (col?.type === \"number\" ? \"right\" : \"left\");\n input.addEventListener(\"keydown\", (e) => this.handleKey(e as KeyboardEvent, cell));\n input.addEventListener(\"focus\", () => {\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) input.select();\n });\n this.bindImmediateCommit(input);\n cell.textContent = \"\";\n cell.appendChild(input);\n if (input.tagName.toLowerCase() === \"textarea\") {\n requestAnimationFrame(() => {\n if (input instanceof HTMLTextAreaElement) this.autosize(input);\n });\n }\n input.focus({ preventScroll: true });\n if (\n options?.placeCursorAtEnd &&\n (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement)\n ) {\n const end = input.value.length;\n input.setSelectionRange(end, end);\n }\n this.inputEl = input;\n }\n\n private activateFloating(\n rect: DOMRect,\n rowId: string,\n colKey: string,\n options?: { initialValueOverride?: string; placeCursorAtEnd?: boolean },\n ) {\n this.teardownInput();\n this.activeCell = { rowId, colKey };\n void rect;\n const box = this.computeCanvasCellBoxContent(rowId, colKey);\n if (!box) return;\n const wrapper = document.createElement(\"div\");\n this.activeHost = wrapper;\n this.activeHostOriginalText = null;\n wrapper.style.position = \"absolute\";\n wrapper.dataset.extableFloating = \"fixed\";\n wrapper.style.pointerEvents = \"auto\";\n wrapper.style.padding = \"0\";\n wrapper.style.zIndex = \"10\";\n const current = this.dataModel.getCell(rowId, colKey);\n const initialValue =\n options?.initialValueOverride ??\n (current === null || current === undefined ? \"\" : String(current));\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n input.style.width = \"calc(100% - 4px)\";\n input.style.height = \"calc(100% - 4px)\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"2px\";\n input.style.padding = \"4px 6px\";\n input.style.border = \"none\";\n input.style.borderRadius = \"0\";\n input.style.boxShadow = \"none\";\n input.style.background = \"#fff\";\n input.style.outline = \"none\";\n input.style.fontSize = \"14px\";\n input.style.fontFamily = \"inherit\";\n input.style.lineHeight = \"1.2\";\n input.style.fontWeight = \"inherit\";\n const col = this.findColumn(colKey);\n input.style.textAlign = col?.style?.align ?? (col?.type === \"number\" ? \"right\" : \"left\");\n input.style.pointerEvents = \"auto\";\n input.addEventListener(\"keydown\", (e) => this.handleKey(e as KeyboardEvent, wrapper));\n input.addEventListener(\"focus\", () => {\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) input.select();\n });\n this.bindImmediateCommit(input);\n wrapper.appendChild(input);\n if (input instanceof HTMLSelectElement) {\n // No auto focus/click for select; standard focus will allow selection on first interaction\n }\n if (input.tagName.toLowerCase() === \"textarea\") {\n requestAnimationFrame(() => {\n if (input instanceof HTMLTextAreaElement) this.autosize(input);\n });\n }\n this.root.appendChild(wrapper);\n this.positionFloatingContentBox(box, wrapper);\n input.focus({ preventScroll: true });\n if (\n options?.placeCursorAtEnd &&\n (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement)\n ) {\n const end = input.value.length;\n input.setSelectionRange(end, end);\n }\n this.inputEl = input;\n this.floatingInputWrapper = wrapper;\n }\n\n private handleKey(e: KeyboardEvent, cell: HTMLElement) {\n if (!this.activeCell || !this.inputEl) return;\n const now = Date.now();\n if (e.isComposing || this.composing) return; // IME composing; ignore control keys\n if (now - this.lastCompositionEnd < 24) return; // absorb trailing key events right after IME commit\n const { rowId, colKey } = this.activeCell;\n if (colKey === null) return;\n const isTextarea = this.inputEl.tagName.toLowerCase() === \"textarea\";\n const isAltEnter = e.key === \"Enter\" && e.altKey;\n const commitAndMove = (deltaRow: number, deltaCol: number) => {\n const value = this.readActiveValue();\n this.commitEdit(rowId, colKey, value);\n this.onMove(rowId);\n this.teardownInput(false);\n this.moveActiveCell(deltaRow, deltaCol);\n };\n\n if (e.key === \"Tab\") {\n e.preventDefault();\n commitAndMove(0, e.shiftKey ? -1 : 1);\n return;\n }\n if (e.key === \"Enter\") {\n if (isTextarea && isAltEnter) {\n // allow newline insertion (Excel-like Alt+Enter)\n return;\n }\n e.preventDefault();\n commitAndMove(e.shiftKey ? -1 : 1, 0);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n this.cancelEdit(cell);\n this.onMove();\n if (this.activeCell && this.activeCell.colKey !== null) {\n const current = this.dataModel.getCell(this.activeCell.rowId, this.activeCell.colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n }\n } else if (e.key === \"Backspace\" && this.inputEl.value === \"\") {\n e.preventDefault();\n this.commitEdit(rowId, colKey, \"\");\n this.onMove(rowId);\n this.teardownInput(false);\n this.moveActiveCell(0, 0);\n }\n }\n\n private commitEdit(rowId: string, colKey: string | null, value: unknown) {\n if (colKey === null) return;\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next: value,\n };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n }\n\n private readActiveValue() {\n if (!this.inputEl || !this.activeCell) return this.inputEl?.value ?? \"\";\n if (this.inputEl instanceof HTMLInputElement) {\n if (this.inputEl.type === \"checkbox\") {\n return this.inputEl.checked;\n }\n if (this.inputEl.type === \"number\") {\n if (this.inputEl.value === \"\") return \"\";\n const parsed = Number(this.inputEl.value);\n return Number.isNaN(parsed) ? \"\" : parsed;\n }\n return this.inputEl.value;\n }\n if (this.inputEl instanceof HTMLSelectElement) {\n return this.inputEl.value;\n }\n return (this.inputEl as HTMLTextAreaElement).value;\n }\n\n private bindImmediateCommit(control: HTMLElement) {\n if (!this.activeCell) return;\n const isInstant =\n control instanceof HTMLInputElement\n ? control.type === \"checkbox\" ||\n control.type === \"number\" ||\n control.type === \"date\" ||\n control.type === \"time\" ||\n control.type === \"datetime-local\"\n : control instanceof HTMLSelectElement;\n if (!isInstant) return;\n control.addEventListener(\"change\", () => {\n const ac = this.activeCell;\n if (!ac) return;\n const { rowId, colKey } = ac;\n if (colKey === null) return;\n const value = this.readActiveValue();\n this.commitEdit(rowId, colKey, value);\n this.onMove(rowId);\n this.teardownInput(false);\n });\n }\n\n private cancelEdit(cell: HTMLElement) {\n if (this.activeCell) {\n const { rowId, colKey } = this.activeCell;\n if (colKey === null) return;\n const prev =\n cell.dataset?.original ??\n cell.dataset?.value ??\n (() => {\n const v = this.dataModel.getCell(rowId, colKey);\n return v === null || v === undefined ? \"\" : String(v);\n })();\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next: prev,\n prev,\n };\n this.onEdit(cmd, true);\n }\n this.teardownInput(false);\n if (cell.dataset?.original !== undefined || cell.dataset?.value !== undefined) {\n cell.textContent = cell.dataset.original ?? cell.dataset.value ?? \"\";\n }\n cell.blur();\n }\n\n private teardownInput(clearActive = false) {\n removeFromParent(this.inputEl);\n removeFromParent(this.floatingInputWrapper);\n if (this.activeHost && this.activeHostOriginalText !== null) {\n this.activeHost.textContent = this.activeHostOriginalText;\n }\n this.inputEl = null;\n this.floatingInputWrapper = null;\n this.activeHost = null;\n this.activeHostOriginalText = null;\n if (clearActive) {\n this.activeCell = null;\n this.onActiveChange(null, null);\n }\n }\n}\n","export type CellPrimitive = string | number | boolean | null;\n\nexport type CellValue =\n | CellPrimitive\n | Date\n | { kind: \"enum\"; value: string }\n | { kind: \"tags\"; values: string[] };\n\nexport type ColumnType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"datetime\"\n | \"date\"\n | \"time\"\n | \"enum\"\n | \"tags\";\n\nexport type ResolvedCellStyle = {\n backgroundColor?: string;\n textColor?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n};\n\nexport type StyleDelta = Partial<ResolvedCellStyle>;\n\nexport type DiagnosticLevel = \"warning\" | \"error\";\nexport type CellDiagnostic = {\n level: DiagnosticLevel;\n message: string;\n source: \"formula\" | \"conditionalStyle\";\n};\n\nexport type FormulaOk = string | boolean | number | Date;\nexport type FormulaWarn<T extends FormulaOk> = readonly [value: T, warning: Error];\nexport type FormulaReturn<T extends FormulaOk = FormulaOk> = T | FormulaWarn<T>;\n\nexport type ConditionalStyleFn<TData extends object = object> = (\n data: TData,\n) => StyleDelta | null | Error;\n\nexport type Updater<T> = T | ((oldValue: T) => T);\n\nexport type CellAddress =\n | { rowId: string; colKey: string }\n | { rowIndex: number; colIndex: number }\n | { rowId: string; colIndex: number }\n | { rowIndex: number; colKey: string };\n\nexport type CellTarget = {\n rowId: string;\n colKey: string;\n};\n\n// Forward declaration for recursive type inference\nexport interface ColumnSchema<\n TData extends object = object,\n RData extends object = TData,\n TType extends ColumnType = ColumnType,\n K extends string = string,\n> {\n key: K;\n type: TType;\n header?: string;\n readonly?: boolean;\n /**\n * When true, enforce uniqueness within this column (per table).\n * Duplicate (non-empty) values mark all duplicated cells as invalid.\n */\n unique?: boolean;\n nullable?: boolean;\n string?: { maxLength?: number; regex?: string };\n number?: {\n precision?: number;\n scale?: number;\n signed?: boolean;\n thousandSeparator?: boolean;\n negativeRed?: boolean;\n format?: string; // optional custom formatter token\n };\n enum?: { options: string[]; allowCustom?: boolean };\n tags?: { options: string[]; allowCustom?: boolean };\n booleanDisplay?: \"checkbox\" | string | [string, string]; // arbitrary label set; default checkbox when absent\n dateFormat?: string;\n timeFormat?: string;\n dateTimeFormat?: string;\n width?: number; // px\n wrapText?: boolean; // allow per-column wrapping\n style?: {\n textColor?: string;\n backgroundColor?: string;\n align?: \"left\" | \"right\" | \"center\";\n decorations?: { strike?: boolean; underline?: boolean; bold?: boolean; italic?: boolean };\n };\n formula?: (data: TData) => unknown;\n conditionalStyle?: ConditionalStyleFn<RData>;\n}\n\n// Infer row data type from schema columns\nexport type InferSchemaData<TColumns extends readonly ColumnSchema<any>[]> = {\n [I in keyof TColumns]: TColumns[I] extends ColumnSchema<infer TData, any, infer TType, infer K>\n ? K extends keyof TData\n ? TData[K]\n : never\n : never;\n} extends (infer U)[]\n ? U extends object\n ? U\n : Record<string, unknown>\n : Record<string, unknown>;\n\nexport interface Schema<TData extends object = object, RData extends object = TData> {\n columns: ColumnSchema<TData, RData>[];\n row?: { conditionalStyle?: ConditionalStyleFn<RData> };\n}\n\n/**\n * Helper to lock schema generics so `formula`/`conditionalStyle` receive the correct row type.\n * Usage: `const schema = defineSchema<MyRow>({ columns: [...], row: {...} });`\n */\nexport const defineSchema = <TData extends object, RData extends object = TData>(\n schema: Schema<TData, RData>,\n): Schema<TData, RData> => schema;\n\nexport type RowObject<T extends object = Record<string, unknown>> = {\n _readonly?: boolean;\n} & T &\n Record<string, unknown>;\n\n// Public data is object-row arrays only. Use `null` or `undefined` for async loading.\nexport type NullableData<T extends object = object> = T[] | null | undefined;\n\nexport type ViewFilterOp = {\n kind: \"op\";\n key: string;\n op: \"eq\" | \"neq\" | \"lt\" | \"lte\" | \"gt\" | \"gte\" | \"contains\";\n value: unknown;\n};\n\nexport type ViewFilterValues = {\n kind: \"values\";\n key: string;\n /** Allow-list of selected non-blank values. */\n values: unknown[];\n /** When true, blanks (null/undefined/\"\") are included. */\n includeBlanks?: boolean;\n};\n\nexport type ViewFilter = ViewFilterOp | ViewFilterValues;\n\nexport type ColumnDiagnosticFilter = {\n errors?: boolean;\n warnings?: boolean;\n};\n\nexport type ColumnDiagnosticFilterMap = Record<string, ColumnDiagnosticFilter>;\n\nexport interface ViewSort {\n key: string;\n dir: \"asc\" | \"desc\";\n}\n\nexport interface View {\n hiddenColumns?: string[];\n filters?: ViewFilter[];\n sorts?: ViewSort[];\n /**\n * Column-scoped diagnostic quick filters.\n * Key is the column key (stringified).\n */\n columnDiagnostics?: ColumnDiagnosticFilterMap;\n userId?: string; // personalization\n columnWidths?: Record<string, number>; // key -> px\n rowHeights?: Record<string, number>;\n wrapText?: Record<string, boolean>; // view override per column\n}\n\nexport type RenderMode = \"html\" | \"canvas\" | \"auto\";\nexport type EditMode = \"direct\" | \"commit\" | \"readonly\";\nexport type LockMode = \"none\" | \"row\";\n\nexport interface Command {\n kind: \"edit\" | \"deleteRow\" | \"insertRow\" | \"updateView\" | \"lock\" | \"unlock\";\n rowId?: string;\n colKey?: string;\n rowData?: RowObject;\n prev?: unknown;\n next?: unknown;\n payload?: unknown;\n}\n\nexport interface UserInfo {\n id: string;\n name: string;\n}\n\nexport interface ServerAdapter {\n fetchInitial?: () => Promise<{\n data: Record<string, unknown>[];\n view?: View;\n schema?: Schema;\n user: UserInfo;\n }>;\n lockRow: (rowId: string, user: UserInfo) => Promise<void>;\n unlockRows: (rowIds: string[], user: UserInfo) => Promise<void>;\n commit: (commands: Command[], user: UserInfo) => Promise<void>;\n subscribe: (onEvent: (event: ServerEvent) => void) => () => void;\n}\n\nexport type ServerEvent = { type: \"update\"; commands: Command[]; user: UserInfo };\n\nexport interface CoreOptions {\n renderMode?: RenderMode;\n editMode?: EditMode;\n lockMode?: LockMode;\n /** Loading UI configuration used when `defaultData` is `null`. */\n loading?: {\n /** Enable built-in loading overlay/spinner. Default: true */\n enabled?: boolean;\n };\n defaultClass?: string | string[];\n defaultStyle?: Partial<CSSStyleDeclaration>;\n server?: ServerAdapter;\n user?: UserInfo;\n findReplace?: {\n /** Enable Find/Replace feature (engine + integrations). Default: true */\n enabled?: boolean;\n /**\n * Enable the default built-in UI and its shortcut bindings. Default: true\n * Note: legacy name is `dialog`; `sidebar` is the preferred name.\n */\n sidebar?: boolean;\n /** @deprecated Use `sidebar` instead. */\n dialog?: boolean;\n /**\n * When true, always intercept `Ctrl/Cmd+F` and show extable's search sidebar.\n * Use this when the table is the primary focus of the page and browser Find/Reload should be overridden.\n * Default: true (always intercept).\n */\n enableSearch?: boolean;\n };\n}\n\nexport interface TableConfig<T extends object = Record<string, unknown>> {\n data: T[] | null;\n view: View;\n schema: Schema;\n}\n\nexport type HistoryCommandKind = Command[\"kind\"];\n\nexport type UndoRedoStep = {\n batchId: string | null;\n kinds: HistoryCommandKind[];\n commandCount: number;\n label: string;\n};\n\nexport type UndoRedoHistory = {\n /** Top (index 0) is the next undo step. */\n undo: UndoRedoStep[];\n /** Top (index 0) is the next redo step. */\n redo: UndoRedoStep[];\n};\n\nexport interface InternalRow {\n id: string;\n raw: RowObject;\n displayIndex: number;\n}\n\nexport type SelectionKind = \"cells\" | \"rows\";\n\nexport interface SelectionRange {\n kind: SelectionKind;\n startRow: number;\n endRow: number;\n startCol: number;\n endCol: number;\n}\n\nexport type ToggleState = \"on\" | \"off\" | \"mixed\" | \"disabled\";\nexport type ColorState = string | \"mixed\" | null | \"disabled\";\n\nexport type TableError = {\n scope: \"validation\" | \"commit\" | \"render\" | \"formula\" | \"conditionalStyle\" | \"unknown\";\n message: string;\n target?: { rowId?: string; colKey?: string };\n};\n\nexport type TableState = {\n canCommit: boolean;\n pendingCommandCount: number;\n pendingCellCount?: number;\n undoRedo: { canUndo: boolean; canRedo: boolean };\n renderMode: \"html\" | \"canvas\";\n ui: { searchPanelOpen: boolean };\n activeErrors: TableError[];\n};\n\nexport type TableStateListener = (next: TableState, prev: TableState | null) => void;\n\nexport type RowStateSnapshot<\n TInput extends object = Record<string, unknown>,\n TResult extends object = TInput,\n> = {\n rowId: string;\n rowIndex: number;\n data: TResult;\n pending?: Partial<TInput>;\n diagnostics?: TableError[];\n};\n\nexport type RowChangeReason = \"new\" | \"edit\" | \"delete\";\nexport type RowStateListener<\n TInput extends object = Record<string, unknown>,\n TResult extends object = TInput,\n> = (\n rowId: string,\n next: RowStateSnapshot<TInput, TResult> | null,\n prev: RowStateSnapshot<TInput, TResult> | null,\n reason: RowChangeReason,\n) => void;\n\nexport type SelectionSnapshot = {\n ranges: SelectionRange[];\n activeRowIndex: number | null;\n activeRowKey: string | null;\n activeColumnIndex: number | null;\n activeColumnKey: string | null;\n activeValueRaw: unknown;\n activeValueDisplay: string;\n activeValueType: ColumnType | null;\n diagnostic: CellDiagnostic | null;\n styles: {\n columnStyle: Partial<ResolvedCellStyle>;\n cellStyle: Partial<ResolvedCellStyle>;\n resolved: Partial<ResolvedCellStyle>;\n };\n};\n\nexport type SelectionChangeReason =\n | \"selection\"\n | \"edit\"\n | \"style\"\n | \"schema\"\n | \"view\"\n | \"data\"\n | \"unknown\";\nexport type SelectionListener = (\n next: SelectionSnapshot,\n prev: SelectionSnapshot | null,\n reason: SelectionChangeReason,\n) => void;\n","import \"./styles.css\";\nimport { CommandQueue } from \"./commandQueue\";\nimport { DataModel } from \"./dataModel\";\nimport { resolveCellAddress } from \"./address\";\nimport { FindReplaceController, type FindReplaceMode } from \"./findReplace\";\nimport { LockManager } from \"./lockManager\";\nimport { CanvasRenderer, HTMLRenderer, type Renderer, type ViewportState } from \"./renderers\";\nimport { SelectionManager } from \"./selectionManager\";\nimport { resolveCellStyles } from \"./styleResolver\";\nimport { removeFromParent, toArray } from \"./utils\";\nimport type {\n CellTarget,\n Command,\n CoreOptions,\n HistoryCommandKind,\n InternalRow,\n NullableData,\n EditMode,\n LockMode,\n RenderMode,\n Schema,\n ServerAdapter,\n SelectionChangeReason,\n SelectionListener,\n SelectionRange,\n SelectionSnapshot,\n TableConfig,\n TableError,\n TableState,\n TableStateListener,\n UndoRedoHistory,\n UndoRedoStep,\n UserInfo,\n Updater,\n View,\n ViewFilterValues,\n RowObject,\n RowStateSnapshot,\n RowStateListener,\n RowChangeReason,\n} from \"./types\";\n\nexport * from \"./types\";\nexport type {\n FindReplaceMatch,\n FindReplaceMode,\n FindReplaceOptions,\n FindReplaceState,\n} from \"./findReplace\";\nexport { FindReplaceController } from \"./findReplace\";\n\nexport interface CoreInit<T extends object = Record<string, unknown>> {\n root: HTMLElement;\n defaultData: NullableData<T>;\n defaultView: View;\n schema: Schema<any>;\n options?: CoreOptions;\n}\n\nexport class ExtableCore<T extends object = Record<string, unknown>, R extends object = T> {\n private root: HTMLElement;\n private shell: HTMLDivElement | null = null;\n private viewportEl: HTMLDivElement | null = null;\n private viewportResizeObserver: ResizeObserver | null = null;\n private dataModel: DataModel;\n private dataLoaded: boolean;\n private loadingEnabled: boolean;\n private commandQueue: CommandQueue;\n private lockManager: LockManager;\n private renderer: Renderer;\n private selectionManager: SelectionManager | null = null;\n private renderMode: RenderMode;\n private editMode: EditMode;\n private lockMode: LockMode;\n private server?: ServerAdapter;\n private user?: UserInfo;\n private unsubscribe?: () => void;\n private resizeHandler: (() => void) | null = null;\n private scrollHandler: (() => void) | null = null;\n private viewportState: ViewportState | null = null;\n private rafId: number | null = null;\n private contextMenu: HTMLDivElement | null = null;\n private contextMenuRowId: string | null = null;\n private handleGlobalPointer: ((ev: MouseEvent | PointerEvent) => void) | null = null;\n private toast: HTMLDivElement | null = null;\n private toastTimer: number | null = null;\n private findReplace: FindReplaceController | null = null;\n private findReplaceSidebar: HTMLElement | null = null;\n private findReplaceSidebarUnsub: (() => void) | null = null;\n private findReplaceEnabled = true;\n private findReplaceUiEnabled = true;\n private findReplaceEnableSearch = false;\n\n private mounted = false;\n\n private isCellReadonly(rowId: string, colKey: string) {\n return this.editMode === \"readonly\" || this.dataModel.isReadonly(rowId, colKey);\n }\n\n private resolveRowId(row: string | number): string | null {\n if (typeof row === \"string\") {\n return this.findRowById(row)?.id ?? null;\n }\n const found = this.dataModel.listAllRows()[row] ?? null;\n return found?.id ?? null;\n }\n\n private filterSortSidebar: HTMLElement | null = null;\n private filterSortSidebarUnsub: (() => void) | null = null;\n private filterSortKeydown: ((ev: KeyboardEvent) => void) | null = null;\n private filterSortClickCapture: ((ev: MouseEvent) => void) | null = null;\n private filterSortOpenEvent: ((ev: Event) => void) | null = null;\n private filterSortActiveColumnKey: string | null = null;\n private filterSortDraft: {\n colKey: string;\n values: Array<{ key: string; value: unknown; label: string }>;\n hasBlanks: boolean;\n selected: Set<string>;\n includeBlanks: boolean;\n diagErrors: boolean;\n diagWarnings: boolean;\n search: string;\n } | null = null;\n\n private tableStateListeners = new Set<TableStateListener>();\n private selectionListeners = new Set<SelectionListener>();\n private lastTableState: TableState | null = null;\n private lastSelectionSnapshot: SelectionSnapshot | null = null;\n private selectionRanges: SelectionRange[] = [];\n private activeCell: CellTarget | null = null;\n private activeErrors: TableError[] = [];\n private rowStateListeners = new Set<RowStateListener<T, R>>();\n private lastRowStates = new Map<string, RowStateSnapshot<T, R>>();\n\n private isSearchPanelVisible() {\n return this.root.classList.contains(\"extable-search-open\");\n }\n\n private isFilterSortPanelVisible() {\n return this.root.classList.contains(\"extable-filter-sort-open\");\n }\n\n private safeRender(state?: ViewportState) {\n try {\n this.renderer.render(state);\n const hadRenderError = this.activeErrors.some((e) => e.scope === \"render\");\n if (hadRenderError) {\n this.activeErrors = this.activeErrors.filter((e) => e.scope !== \"render\");\n this.emitTableState();\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.activeErrors = [\n ...this.activeErrors.filter((x) => x.scope !== \"render\"),\n { scope: \"render\", message },\n ];\n this.emitTableState();\n }\n }\n\n constructor(init: CoreInit<T>) {\n this.root = init.root;\n this.root.classList.add(\"extable-root\");\n this.renderMode = init.options?.renderMode ?? \"auto\";\n this.editMode = init.options?.editMode ?? \"direct\";\n this.lockMode = init.options?.lockMode ?? \"none\";\n this.loadingEnabled = init.options?.loading?.enabled ?? true;\n this.findReplaceEnabled = init.options?.findReplace?.enabled ?? true;\n this.findReplaceUiEnabled =\n init.options?.findReplace?.sidebar ?? init.options?.findReplace?.dialog ?? true;\n this.findReplaceEnableSearch = init.options?.findReplace?.enableSearch ?? true;\n this.server = init.options?.server;\n this.user = init.options?.user;\n\n const defaultData = init.defaultData ?? null;\n const initialData = defaultData ?? [];\n this.dataLoaded = defaultData !== null && defaultData !== undefined;\n this.dataModel = new DataModel(\n initialData as unknown as RowObject[],\n init.schema,\n init.defaultView,\n );\n this.commandQueue = new CommandQueue();\n this.lockManager = new LockManager(this.lockMode, this.server, this.user);\n this.renderer = this.chooseRenderer(this.renderMode);\n this.applyRootDecor(init.options);\n this.applyReadonlyClass();\n void this.loadInitial();\n }\n\n private async loadInitial() {\n if (this.server?.fetchInitial) {\n try {\n const initial = await this.server.fetchInitial();\n this.dataModel.setData(initial.data);\n if (initial.schema) this.dataModel.setSchema(initial.schema);\n if (initial.view) this.dataModel.setView(initial.view);\n this.user = initial.user ?? this.user;\n this.lockManager.setUser(this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"fetchInitial failed\", e);\n }\n }\n this.mount();\n }\n\n private applyRootDecor(options?: CoreOptions) {\n const classes = toArray(options?.defaultClass);\n if (classes?.length) {\n this.root.classList.add(...classes);\n }\n if (options?.defaultStyle) {\n for (const [k, v] of Object.entries(options.defaultStyle)) {\n // @ts-expect-error CSSStyleDeclaration index\n this.root.style[k] = v ?? \"\";\n }\n }\n }\n\n private applyReadonlyClass() {\n this.root.classList.toggle(\"extable-readonly-all\", this.editMode === \"readonly\");\n }\n\n private chooseRenderer(mode: RenderMode): Renderer {\n if (mode === \"auto\") {\n const ua = typeof navigator !== \"undefined\" ? navigator.userAgent : \"\";\n type UserAgentBrand = { brand?: string };\n type NavigatorWithUAData = Navigator & { userAgentData?: { brands?: UserAgentBrand[] } };\n const isBot =\n /bot|crawl|spider/i.test(ua) ||\n (typeof navigator !== \"undefined\" &&\n \"userAgentData\" in navigator &&\n (navigator as NavigatorWithUAData).userAgentData?.brands?.some((b) =>\n /bot/i.test(b.brand ?? \"\"),\n ));\n return isBot\n ? new HTMLRenderer(this.dataModel)\n : new CanvasRenderer(this.dataModel, () => this.editMode);\n }\n return mode === \"html\"\n ? new HTMLRenderer(this.dataModel)\n : new CanvasRenderer(this.dataModel, () => this.editMode);\n }\n\n private ensureShell() {\n if (this.shell && this.viewportEl && this.shell.parentElement === this.root) return;\n this.root.innerHTML = \"\";\n const shell = document.createElement(\"div\");\n shell.className = \"extable-shell\";\n const viewport = document.createElement(\"div\");\n viewport.className = \"extable-viewport\";\n shell.appendChild(viewport);\n this.root.appendChild(shell);\n this.shell = shell;\n this.viewportEl = viewport;\n\n this.viewportResizeObserver?.disconnect();\n const anyRO = globalThis.ResizeObserver as typeof ResizeObserver | undefined;\n if (typeof anyRO === \"function\") {\n this.viewportResizeObserver = new anyRO(() => {\n this.updateViewportFromRoot();\n });\n this.viewportResizeObserver.observe(viewport);\n } else {\n this.viewportResizeObserver = null;\n }\n }\n\n private getScrollHost() {\n return this.viewportEl ?? this.root;\n }\n\n private mount(force = false) {\n if (this.mounted && !force) return;\n this.ensureShell();\n const host = this.viewportEl ?? this.root;\n this.renderer.mount(host);\n this.ensureContextMenu();\n this.ensureToast();\n this.initViewportState();\n\n this.root.classList.toggle(\"extable-loading\", !this.dataLoaded && this.loadingEnabled);\n if (!this.dataLoaded && this.loadingEnabled) {\n this.root.dataset.extable = \"loading\";\n this.bindViewport();\n this.ensureFindReplace();\n this.ensureFilterSort();\n this.emitTableState();\n this.emitSelection(\"data\");\n return;\n }\n this.selectionManager = new SelectionManager(\n host,\n this.editMode,\n (cmd, commitNow) => this.handleEdit(cmd, commitNow),\n (rowId) => void this.lockManager.selectRow(rowId),\n (rowId) => void this.lockManager.unlockOnMove(rowId),\n (ev) => this.renderer.hitTest(ev),\n this.dataModel,\n (rowId, colKey) => this.isCellReadonly(rowId, colKey),\n (rowId, colKey) => {\n const target: CellTarget | null = rowId && colKey !== null ? { rowId, colKey } : null;\n if (target) this.renderer.setActiveCell(target.rowId, target.colKey);\n this.activeCell = target;\n this.emitSelection(\"selection\");\n },\n (rowId, _colKey, x, y) => this.showContextMenu(rowId, x, y),\n (ranges) => {\n this.selectionRanges = ranges;\n this.renderer.setSelection(ranges);\n this.emitSelection(\"selection\");\n },\n () => this.undo(),\n () => this.redo(),\n );\n this.root.dataset.extable = \"ready\";\n this.bindViewport();\n this.ensureFindReplace();\n this.ensureFilterSort();\n if (this.server) {\n this.unsubscribe = this.server.subscribe((event) => this.handleServerEvent(event));\n }\n this.emitTableState();\n this.emitSelection(\"selection\");\n this.mounted = true;\n }\n\n destroy() {\n this.teardownFilterSort();\n this.teardownFindReplace();\n this.selectionManager?.destroy();\n this.renderer.destroy();\n this.unsubscribe?.();\n this.unbindViewport();\n this.viewportResizeObserver?.disconnect();\n this.viewportResizeObserver = null;\n this.mounted = false;\n }\n\n // editMode/lockMode are configured only at construction time for consistency.\n\n setRootClass(classNames: string | string[]) {\n this.root.className = \"\";\n this.root.classList.add(...(toArray(classNames) ?? []));\n }\n\n setRootStyle(style: Partial<CSSStyleDeclaration>) {\n for (const [k, v] of Object.entries(style)) {\n // @ts-expect-error CSSStyleDeclaration index\n this.root.style[k] = v ?? \"\";\n }\n }\n\n setData(data: NullableData<T>) {\n if (data == null) {\n // Allow loading only before the first successful data load.\n if (this.dataLoaded) return;\n this.dataLoaded = false;\n this.safeRender(this.viewportState ?? undefined);\n this.emitSelection(\"data\");\n this.emitTableState();\n return;\n }\n const wasLoaded = this.dataLoaded;\n this.dataLoaded = true;\n this.dataModel.setData(data as unknown as RowObject[]);\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n\n if (!wasLoaded && this.loadingEnabled) {\n this.root.classList.remove(\"extable-loading\");\n this.selectionManager?.destroy();\n this.selectionManager = null;\n this.mount();\n }\n }\n\n setView(view: View) {\n this.dataModel.setView(view);\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"view\");\n this.emitTableState();\n }\n\n // Public API: configuration getters (mirror setters)\n getSchema(): Schema {\n return this.dataModel.getSchema();\n }\n\n getView(): View {\n return this.dataModel.getView();\n }\n\n /**\n * Returns the current table data (includes pending edits in commit mode and formula results).\n * Note: This is the full dataset (not affected by view filters/sorts). Use `listRows()` for the visible rows.\n */\n getData(): R[] {\n return this.getTableData();\n }\n\n /**\n * Returns the raw dataset without pending edits and without formula results.\n * Note: This is the full dataset (not affected by view filters/sorts). Use `listRows()` for the visible rows.\n */\n getRawData(): T[] {\n return this.dataModel.listAllRows().map((r) => ({ ...(r.raw as unknown as T) }));\n }\n\n // Public API: cell-level access\n getCell<K extends keyof R & string>(rowId: string, colKey: K): R[K] | undefined {\n return this.dataModel.getCell(rowId, colKey) as R[K] | undefined;\n }\n\n // Public API: row/column index utilities\n getRowIndex(rowId: string): number {\n return this.dataModel.getRowIndex(rowId);\n }\n\n getColumnIndex(colKey: string): number {\n return this.dataModel.getColumnIndex(colKey);\n }\n\n // Public API: row-level access\n findRowById(rowId: string): InternalRow | null {\n const idx = this.dataModel.getBaseRowIndex(rowId);\n if (idx < 0) return null;\n return this.dataModel.listAllRows()[idx] ?? null;\n }\n\n listRows(): InternalRow[] {\n return this.dataModel.listRows();\n }\n\n getAllRows(): InternalRow[] {\n return this.dataModel.listAllRows();\n }\n\n /**\n * Returns a single row as an object (includes pending edits in commit mode and formula results).\n * When a number is passed, it is interpreted as the base row index (not affected by view filters/sorts).\n */\n getRow(rowIdOrIndex: string | number): R | null {\n const rowId = this.resolveRowId(rowIdOrIndex);\n if (!rowId) return null;\n return this.buildRow(rowId);\n }\n\n private buildRow(rowId: string): R | null {\n const found = this.findRowById(rowId);\n if (!found) return null;\n const schema = this.dataModel.getSchema();\n const out: Record<string, unknown> = { ...(found.raw as Record<string, unknown>) };\n for (const col of schema.columns) {\n out[col.key] = this.dataModel.resolveCellValue(rowId, col).value;\n }\n return out as R;\n }\n\n // Public API: bulk data access\n getTableData(): R[] {\n const rows = this.dataModel.listAllRows();\n return rows.map((r) => this.buildRow(r.id)).filter(Boolean) as R[];\n }\n\n getColumnData<K extends keyof R & string>(colKey: K): R[K][] {\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => c.key === colKey);\n if (!col) return [];\n const rows = this.dataModel.listAllRows();\n return rows.map((r) => this.dataModel.resolveCellValue(r.id, col).value as R[K]);\n }\n\n // Public API: commit-mode pending helpers\n getPending(): Map<string, Record<string, unknown>> {\n if (this.editMode !== \"commit\") return new Map();\n return new Map(this.dataModel.getPending());\n }\n\n getPendingRowIds(): string[] {\n return [...this.getPending().keys()];\n }\n\n hasPendingChanges(): boolean {\n return this.getPending().size > 0;\n }\n\n getPendingCellCount(): number {\n const pending = this.getPending();\n let count = 0;\n for (const row of pending.values()) count += Object.keys(row).length;\n return count;\n }\n\n getCellPending<K extends keyof R & string>(row: string | number, colKey: K): boolean {\n if (this.editMode !== \"commit\") return false;\n const rowId = this.resolveRowId(row);\n if (!rowId) return false;\n return this.dataModel.hasPending(rowId, colKey);\n }\n\n getDisplayValue<K extends keyof R & string>(row: string | number, colKey: K): string {\n const rowId = this.resolveRowId(row);\n if (!rowId) return \"\";\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return \"\";\n const res = this.dataModel.resolveCellValue(rowId, col);\n if (res.textOverride) return res.textOverride;\n const v = res.value;\n if (v === null || v === undefined) return \"\";\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\") {\n const vv = v as Record<string, unknown>;\n if (vv.kind === \"enum\" && typeof vv.value === \"string\") return vv.value;\n if (vv.kind === \"tags\" && Array.isArray(vv.values)) {\n const values = vv.values.filter((x): x is string => typeof x === \"string\");\n return values.join(\", \");\n }\n }\n return String(v);\n }\n\n insertRow(rowData: T, position?: number | string): string | null {\n let insertAt: number | null = null;\n if (typeof position === \"number\" && Number.isFinite(position)) {\n insertAt = Math.max(0, Math.min(Math.floor(position), this.dataModel.getAllRowCount()));\n } else if (typeof position === \"string\") {\n const baseIdx = this.dataModel.getBaseRowIndex(position);\n if (baseIdx >= 0) insertAt = baseIdx;\n }\n if (insertAt === null) insertAt = this.dataModel.getAllRowCount();\n const newId = this.dataModel.insertRowAt(rowData as unknown as RowObject, insertAt);\n const cmd: Command = {\n kind: \"insertRow\",\n rowId: newId,\n rowData: rowData as unknown as RowObject,\n payload: { index: insertAt },\n };\n this.commandQueue.enqueue(cmd);\n this.emitRowState(newId, \"new\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n if (this.editMode === \"direct\") void this.sendCommit([cmd]);\n return newId;\n }\n\n deleteRow(row: string | number): boolean {\n const rowId = this.resolveRowId(row);\n if (!rowId) return false;\n const removed = this.dataModel.removeRow(rowId);\n if (!removed) return false;\n const cmd: Command = {\n kind: \"deleteRow\",\n rowId: removed.row.id,\n rowData: removed.row.raw,\n payload: { index: removed.index },\n };\n this.commandQueue.enqueue(cmd);\n this.emitRowState(rowId, \"delete\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n if (this.editMode === \"direct\") void this.sendCommit([cmd]);\n return true;\n }\n\n private handleEdit(cmd: Command, commitNow: boolean) {\n if (this.editMode === \"readonly\") return;\n if (!cmd.rowId || cmd.colKey === undefined) return;\n const prev = this.dataModel.getCell(cmd.rowId, cmd.colKey);\n this.commandQueue.enqueue({ ...cmd, prev });\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, commitNow);\n this.emitRowState(cmd.rowId, \"edit\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n if (commitNow) {\n void this.sendCommit([cmd]);\n }\n }\n\n undo() {\n this.selectionManager?.cancelEditing();\n const cmds = this.commandQueue.undo();\n if (!cmds || !cmds.length) return;\n // Apply inverse operations in reverse order.\n for (let i = cmds.length - 1; i >= 0; i -= 1) {\n const cmd = cmds[i];\n if (!cmd) continue;\n this.applyInverse(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n }\n\n redo() {\n this.selectionManager?.cancelEditing();\n const cmds = this.commandQueue.redo();\n if (!cmds || !cmds.length) return;\n for (const cmd of cmds) {\n this.applyForward(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n }\n\n getUndoRedoHistory(): UndoRedoHistory {\n const toKinds = (cmds: Command[]): HistoryCommandKind[] => {\n const seen = new Set<HistoryCommandKind>();\n const kinds: HistoryCommandKind[] = [];\n for (const c of cmds) {\n if (seen.has(c.kind)) continue;\n seen.add(c.kind);\n kinds.push(c.kind);\n }\n return kinds;\n };\n\n const labelFor = (kinds: HistoryCommandKind[], commandCount: number) => {\n if (kinds.length === 1 && kinds[0] === \"edit\") {\n return `Edit ${commandCount} cell(s)`;\n }\n if (kinds.length === 1 && kinds[0] === \"insertRow\") {\n return commandCount === 1 ? \"Insert row\" : `Insert row (${commandCount})`;\n }\n if (kinds.length === 1 && kinds[0] === \"deleteRow\") {\n return commandCount === 1 ? \"Delete row\" : `Delete row (${commandCount})`;\n }\n if (kinds.length === 1 && kinds[0] === \"updateView\") {\n return \"Update view\";\n }\n return `Command: ${kinds.join(\", \")} (${commandCount})`;\n };\n\n const toSteps = (groups: { batchId: string | null; commands: Command[] }[]): UndoRedoStep[] =>\n groups.map((g) => {\n const kinds = toKinds(g.commands);\n const commandCount = g.commands.length;\n return {\n batchId: g.batchId,\n kinds,\n commandCount,\n label: labelFor(kinds, commandCount),\n };\n });\n\n return {\n undo: toSteps(this.commandQueue.listUndoGroups()),\n redo: toSteps(this.commandQueue.listRedoGroups()),\n };\n }\n\n private applyInverse(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.prev, this.editMode === \"direct\");\n this.emitRowState(cmd.rowId, \"edit\");\n }\n return;\n case \"insertRow\":\n if (cmd.rowId) this.dataModel.removeRow(cmd.rowId);\n if (cmd.rowId) this.emitRowState(cmd.rowId, \"delete\");\n return;\n case \"deleteRow\":\n if (cmd.rowId && cmd.rowData) {\n const idx = (cmd.payload as Record<string, unknown> | undefined)?.index;\n const index = typeof idx === \"number\" ? idx : this.dataModel.getAllRowCount();\n this.dataModel.insertRowAt(cmd.rowData, index, cmd.rowId);\n this.emitRowState(cmd.rowId, \"new\");\n }\n return;\n default:\n return;\n }\n }\n\n private applyForward(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, this.editMode === \"direct\");\n this.emitRowState(cmd.rowId, \"edit\");\n }\n return;\n case \"insertRow\":\n if (cmd.rowData) {\n const idx = (cmd.payload as Record<string, unknown> | undefined)?.index;\n const index = typeof idx === \"number\" ? idx : this.dataModel.getAllRowCount();\n const forcedId = typeof cmd.rowId === \"string\" ? cmd.rowId : undefined;\n this.dataModel.insertRowAt(cmd.rowData, index, forcedId);\n if (forcedId) this.emitRowState(forcedId, \"new\");\n }\n return;\n case \"deleteRow\":\n if (cmd.rowId) {\n this.dataModel.removeRow(cmd.rowId);\n this.emitRowState(cmd.rowId, \"delete\");\n }\n return;\n default:\n return;\n }\n }\n\n async commit(): Promise<RowStateSnapshot<T, R>[]> {\n const pending = this.commandQueue.listApplied();\n if (!pending.length) return [];\n const touched = new Set<string>();\n for (const cmd of pending) {\n if (cmd.rowId) {\n this.dataModel.applyPending(cmd.rowId);\n touched.add(cmd.rowId);\n }\n }\n await this.sendCommit(pending);\n await this.lockManager.unlockOnCommit(this.commandQueue.listApplied().at(-1)?.rowId);\n this.commandQueue.clear();\n const snapshots: RowStateSnapshot<T, R>[] = [];\n for (const rowId of touched) {\n this.emitRowState(rowId, \"edit\");\n const snap = this.getRowStateSnapshot(rowId);\n if (snap) snapshots.push(snap);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n return snapshots;\n }\n\n private async sendCommit(commands: Command[]) {\n if (this.server && this.user) {\n try {\n await this.server.commit(commands, this.user);\n this.activeErrors = this.activeErrors.filter((e) => e.scope !== \"commit\");\n this.emitTableState();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"commit failed\", e);\n const msg = e instanceof Error ? e.message : String(e);\n this.activeErrors = [\n ...this.activeErrors.filter((x) => x.scope !== \"commit\"),\n { scope: \"commit\", message: msg },\n ];\n this.emitTableState();\n }\n }\n }\n\n private handleServerEvent(event: {\n type: \"update\";\n commands: Command[];\n user: UserInfo;\n }) {\n for (const cmd of event.commands) {\n this.applyCommand(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n }\n\n private applyCommand(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, true);\n this.emitRowState(cmd.rowId, \"edit\");\n }\n break;\n case \"insertRow\":\n if (cmd.rowData) {\n const id = this.dataModel.insertRow(cmd.rowData);\n if (id) this.emitRowState(id, \"new\");\n }\n break;\n case \"deleteRow\":\n if (cmd.rowId) {\n this.dataModel.removeRow(cmd.rowId);\n this.emitRowState(cmd.rowId, \"delete\");\n }\n break;\n case \"updateView\":\n if (cmd.next && typeof cmd.next === \"object\") {\n this.dataModel.setView(cmd.next as View);\n }\n break;\n default:\n break;\n }\n }\n\n private ensureContextMenu() {\n if (this.contextMenu?.isConnected) return;\n this.contextMenu = null;\n const pop = document.createElement(\"div\");\n pop.className = \"extable-context-menu\";\n pop.setAttribute(\"popover\", \"manual\");\n pop.addEventListener(\"contextmenu\", (e) => e.preventDefault());\n const readonlyMode = this.editMode === \"readonly\";\n const actions: Array<{ key: string; label?: string; kind?: \"sep\" }> = readonlyMode\n ? [{ key: \"copy\", label: \"Copy\" }]\n : [\n { key: \"copy\", label: \"Copy\" },\n { key: \"paste\", label: \"Paste\" },\n { key: \"sep-top\", kind: \"sep\" },\n { key: \"undo\", label: \"Undo\" },\n { key: \"redo\", label: \"Redo\" },\n { key: \"sep-mid\", kind: \"sep\" },\n { key: \"insert-above\", label: \"Insert row above\" },\n { key: \"insert-below\", label: \"Insert row below\" },\n { key: \"delete-row\", label: \"Delete row\" },\n ];\n const list = document.createElement(\"div\");\n for (const act of actions) {\n if (act.kind === \"sep\") {\n const hr = document.createElement(\"hr\");\n hr.className = \"extable-context-sep\";\n list.appendChild(hr);\n continue;\n }\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.dataset.action = act.key;\n btn.textContent = act.label ?? \"\";\n btn.addEventListener(\"click\", () => {\n this.handleContextAction(act.key);\n this.closeContextMenu();\n });\n list.appendChild(btn);\n }\n pop.appendChild(list);\n (this.viewportEl ?? this.root).appendChild(pop);\n this.contextMenu = pop;\n }\n\n private showContextMenu(rowId: string | null, clientX: number, clientY: number) {\n this.ensureContextMenu();\n if (!this.contextMenu) return;\n if (!this.contextMenu.isConnected) {\n // Host may have been rebuilt (e.g. renderer switch). Recreate.\n this.contextMenu = null;\n this.ensureContextMenu();\n if (!this.contextMenu) return;\n }\n this.contextMenuRowId = rowId;\n // Update enable/disable state for undo/redo.\n for (const btn of Array.from(\n this.contextMenu.querySelectorAll<HTMLButtonElement>(\"button[data-action]\"),\n )) {\n const action = btn.dataset.action;\n if (action === \"undo\") btn.disabled = !this.commandQueue.canUndo();\n else if (action === \"redo\") btn.disabled = !this.commandQueue.canRedo();\n }\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const rect = { width: 220, height: 160 };\n let left = clientX;\n let top = clientY;\n if (left + rect.width > viewportWidth) left = Math.max(0, viewportWidth - rect.width - 8);\n if (top + rect.height > viewportHeight) top = Math.max(0, viewportHeight - rect.height - 8);\n this.contextMenu.style.left = `${left}px`;\n this.contextMenu.style.top = `${top}px`;\n this.contextMenu.hidePopover?.();\n this.contextMenu.showPopover?.();\n }\n\n private handleContextAction(action: string) {\n if (action === \"copy\") {\n void this.selectionManager?.copySelection();\n return;\n }\n if (action === \"paste\") {\n void this.selectionManager?.pasteFromClipboard();\n return;\n }\n if (action === \"undo\") {\n this.undo();\n return;\n }\n if (action === \"redo\") {\n this.redo();\n return;\n }\n if (!this.contextMenuRowId) return;\n const idx = this.dataModel.getBaseRowIndex(this.contextMenuRowId);\n const targetIndex = idx >= 0 ? idx : this.dataModel.getAllRowCount();\n if (action === \"insert-above\" || action === \"insert-below\") {\n const insertAt = action === \"insert-above\" ? targetIndex : targetIndex + 1;\n const raw = this.createBlankRow();\n const newId = this.dataModel.insertRowAt(raw, insertAt);\n this.commandQueue.enqueue({\n kind: \"insertRow\",\n rowId: newId,\n rowData: raw,\n payload: { index: insertAt },\n });\n this.emitRowState(newId, \"new\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.showToast(\"Row inserted\", \"info\");\n return;\n }\n if (action === \"delete-row\") {\n const removed = this.dataModel.removeRow(this.contextMenuRowId);\n if (!removed) return;\n this.commandQueue.enqueue({\n kind: \"deleteRow\",\n rowId: removed.row.id,\n rowData: removed.row.raw,\n payload: { index: removed.index },\n });\n this.emitRowState(removed.row.id, \"delete\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.showToast(\"Row deleted\", \"info\");\n return;\n }\n }\n\n private createBlankRow(): RowObject {\n const schema = this.dataModel.getSchema();\n const obj: RowObject = {};\n for (const col of schema.columns) {\n obj[String(col.key)] = null;\n }\n return obj;\n }\n\n private closeContextMenu() {\n this.contextMenu?.hidePopover?.();\n }\n\n private ensureToast() {\n if (this.toast?.isConnected) return;\n this.toast = null;\n const toast = document.createElement(\"div\");\n toast.className = \"extable-toast\";\n toast.setAttribute(\"popover\", \"manual\");\n toast.style.right = \"16px\";\n toast.style.bottom = \"16px\";\n toast.style.position = \"fixed\";\n (this.viewportEl ?? this.root).appendChild(toast);\n this.toast = toast;\n }\n\n private showToast(message: string, variant: \"info\" | \"error\" = \"info\", durationMs = 2500) {\n this.ensureToast();\n if (!this.toast) return;\n this.toast.textContent = message;\n this.toast.dataset.variant = variant;\n this.toast.hidePopover?.();\n this.toast.showPopover?.();\n if (this.toastTimer) {\n window.clearTimeout(this.toastTimer);\n this.toastTimer = null;\n }\n this.toastTimer = window.setTimeout(() => {\n this.toast?.hidePopover?.();\n }, durationMs);\n }\n\n private bindViewport() {\n this.resizeHandler = () => this.updateViewportFromRoot();\n this.scrollHandler = () => this.updateViewportFromRoot();\n this.getScrollHost().addEventListener(\"scroll\", this.scrollHandler, { passive: true });\n window.addEventListener(\"resize\", this.resizeHandler);\n this.handleGlobalPointer = (ev: MouseEvent | PointerEvent) => {\n if (this.contextMenu && !this.contextMenu.contains(ev.target as Node)) {\n this.contextMenu.hidePopover?.();\n }\n };\n document.addEventListener(\"pointerdown\", this.handleGlobalPointer, true);\n\n }\n\n private unbindViewport() {\n if (this.resizeHandler) window.removeEventListener(\"resize\", this.resizeHandler);\n if (this.scrollHandler) this.getScrollHost().removeEventListener(\"scroll\", this.scrollHandler);\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n if (this.handleGlobalPointer) {\n document.removeEventListener(\"pointerdown\", this.handleGlobalPointer, true);\n this.handleGlobalPointer = null;\n }\n if (this.contextMenu) {\n this.contextMenu.hidePopover?.();\n if (this.contextMenu.parentElement) removeFromParent(this.contextMenu);\n this.contextMenu = null;\n }\n if (this.toast) {\n this.toast.hidePopover?.();\n if (this.toast.parentElement) removeFromParent(this.toast);\n this.toast = null;\n }\n }\n\n remount(target: HTMLElement) {\n this.unbindViewport();\n this.teardownFilterSort();\n this.teardownFindReplace();\n this.selectionManager?.destroy();\n this.renderer.destroy();\n this.root = target;\n this.applyReadonlyClass();\n this.shell = null;\n this.viewportEl = null;\n this.viewportResizeObserver?.disconnect();\n this.viewportResizeObserver = null;\n this.renderer = this.chooseRenderer(this.renderMode);\n this.mounted = false;\n this.mount(true);\n }\n\n showSearchPanel(mode: FindReplaceMode = \"find\") {\n if (!this.findReplaceEnabled || !this.findReplaceUiEnabled) return;\n this.ensureFindReplace();\n if (!this.findReplace || !this.findReplaceSidebar) return;\n this.hideFilterSortPanel();\n this.findReplace.setMode(mode);\n this.root.classList.toggle(\"extable-search-open\", true);\n this.updateViewportFromRoot();\n this.safeRender(this.viewportState ?? undefined);\n this.emitTableState();\n const input = this.findReplaceSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fr=\"query\"]',\n );\n input?.focus({ preventScroll: true });\n input?.select();\n }\n\n hideSearchPanel() {\n if (!this.findReplaceSidebar) return;\n this.root.classList.toggle(\"extable-search-open\", false);\n this.updateViewportFromRoot();\n this.safeRender(this.viewportState ?? undefined);\n this.emitTableState();\n // Restore focus to table selection.\n (\n this.getScrollHost().querySelector(\n 'input[data-extable-selection=\"1\"]',\n ) as HTMLInputElement | null\n )?.focus?.({\n preventScroll: true,\n });\n }\n\n // External toggle for host apps.\n toggleSearchPanel(mode: FindReplaceMode = \"find\") {\n if (this.isSearchPanelVisible()) this.hideSearchPanel();\n else this.showSearchPanel(mode);\n }\n\n private updateFindReplaceReadonlyUI() {\n if (!this.findReplaceSidebar) return;\n const aside = this.findReplaceSidebar;\n const toggleReplace = aside.querySelector<HTMLInputElement>('input[data-extable-fr=\"replace-toggle\"]');\n if (!toggleReplace) return;\n const readonly = this.editMode === \"readonly\";\n aside.dataset.extableFrReadonly = readonly ? \"1\" : \"0\";\n if (readonly) {\n toggleReplace.checked = false;\n this.findReplace?.setMode(\"find\");\n aside.dataset.extableFrMode = \"find\";\n } else {\n aside.dataset.extableFrMode = toggleReplace.checked ? \"replace\" : \"find\";\n }\n }\n\n // Public API: table-level state callbacks\n getTableState(): TableState {\n const effective = this.renderer instanceof HTMLRenderer ? \"html\" : \"canvas\";\n const applied = this.commandQueue.listApplied();\n const pendingCommands = this.editMode === \"commit\" ? applied : [];\n const pendingCommandCount = pendingCommands.length;\n const pendingCellCount = (() => {\n const keys = new Set<string>();\n for (const c of pendingCommands) {\n if (c.kind !== \"edit\") continue;\n if (!c.rowId || c.colKey === undefined) continue;\n keys.add(`${c.rowId}::${String(c.colKey)}`);\n }\n return keys.size;\n })();\n const validationErrors: TableError[] = this.dataModel.getValidationErrors().map((e) => ({\n scope: \"validation\",\n message: e.message,\n target: { rowId: e.rowId, colKey: e.colKey },\n }));\n const diagnosticErrors: TableError[] = this.dataModel\n .getDiagnostics()\n .map((x) => {\n if (!x.diag) return null;\n return {\n scope: x.diag.source,\n message: x.diag.message,\n target: { rowId: x.rowId, colKey: x.colKey },\n } as TableError;\n })\n .filter(Boolean) as TableError[];\n diagnosticErrors.sort((a, b) => {\n const ar = a.target?.rowId ? this.dataModel.getRowIndex(a.target.rowId) : -1;\n const br = b.target?.rowId ? this.dataModel.getRowIndex(b.target.rowId) : -1;\n if (ar !== br) return ar - br;\n const ac =\n a.target?.colKey !== undefined ? this.dataModel.getColumnIndex(a.target.colKey) : -1;\n const bc =\n b.target?.colKey !== undefined ? this.dataModel.getColumnIndex(b.target.colKey) : -1;\n if (ac !== bc) return ac - bc;\n if (a.scope !== b.scope) return a.scope < b.scope ? -1 : 1;\n return a.message < b.message ? -1 : a.message > b.message ? 1 : 0;\n });\n const activeErrors = [\n ...validationErrors,\n ...diagnosticErrors.slice(0, 200),\n ...this.activeErrors,\n ];\n return {\n canCommit: this.editMode === \"commit\" && pendingCommandCount > 0,\n pendingCommandCount,\n pendingCellCount,\n undoRedo: { canUndo: this.commandQueue.canUndo(), canRedo: this.commandQueue.canRedo() },\n renderMode: effective,\n ui: { searchPanelOpen: this.isSearchPanelVisible() },\n activeErrors,\n };\n }\n\n subscribeTableState(listener: TableStateListener) {\n this.tableStateListeners.add(listener);\n listener(this.getTableState(), null);\n return () => this.tableStateListeners.delete(listener);\n }\n\n private emitTableState() {\n const next = this.getTableState();\n const prev = this.lastTableState;\n const errorsEqual = (() => {\n if (!prev) return false;\n if (prev.activeErrors.length !== next.activeErrors.length) return false;\n for (let i = 0; i < next.activeErrors.length; i += 1) {\n const a = prev.activeErrors[i];\n const b = next.activeErrors[i];\n if (!a || !b) return false;\n if (a.scope !== b.scope) return false;\n if (a.message !== b.message) return false;\n const at = a.target;\n const bt = b.target;\n if (!at && !bt) continue;\n if (!at || !bt) return false;\n if ((at.rowId ?? null) !== (bt.rowId ?? null)) return false;\n if (String(at.colKey ?? \"\") !== String(bt.colKey ?? \"\")) return false;\n }\n return true;\n })();\n // Shallow equality shortcut.\n const same =\n prev &&\n prev.canCommit === next.canCommit &&\n prev.pendingCommandCount === next.pendingCommandCount &&\n prev.pendingCellCount === next.pendingCellCount &&\n prev.undoRedo.canUndo === next.undoRedo.canUndo &&\n prev.undoRedo.canRedo === next.undoRedo.canRedo &&\n prev.renderMode === next.renderMode &&\n prev.ui.searchPanelOpen === next.ui.searchPanelOpen &&\n errorsEqual;\n if (same) return;\n this.lastTableState = next;\n for (const l of this.tableStateListeners) l(next, prev);\n }\n\n // Public API: selection callbacks\n getSelectionSnapshot(): SelectionSnapshot {\n const ranges = this.selectionRanges;\n const schema = this.dataModel.getSchema();\n const active = this.activeCell;\n const activeRowId = active?.rowId ?? null;\n const activeColKey = active?.colKey ?? null;\n const activeRowIndex = activeRowId ? this.dataModel.getRowIndex(activeRowId) : null;\n const activeColIndex =\n activeColKey !== null\n ? schema.columns.findIndex((c) => String(c.key) === String(activeColKey))\n : null;\n const col =\n activeColIndex !== null && activeColIndex >= 0 ? schema.columns[activeColIndex] : null;\n\n const activeValueRes =\n activeRowId && col ? this.dataModel.resolveCellValue(activeRowId, col) : null;\n const activeCondRes =\n activeRowId && col ? this.dataModel.resolveConditionalStyle(activeRowId, col) : null;\n const activeTextOverride =\n activeValueRes?.textOverride ?? (activeCondRes?.forceErrorText ? \"#ERROR\" : undefined);\n const activeValueRaw = activeValueRes ? activeValueRes.value : null;\n const activeValueDisplay = (() => {\n if (activeTextOverride) return activeTextOverride;\n const v = activeValueRaw;\n if (v === null || v === undefined) return \"\";\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\") {\n const obj = v as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n return String(v);\n })();\n const activeValueType = col?.type ?? null;\n const diagnostic =\n activeRowId && activeColKey !== null\n ? this.dataModel.getCellDiagnostic(activeRowId, activeColKey)\n : null;\n\n const activeStyles = (() => {\n if (!activeRowId || !col) {\n return { columnStyle: {}, cellStyle: {}, resolved: {} };\n }\n const { columnStyle, cellStyle, resolved } = resolveCellStyles(\n this.dataModel,\n activeRowId,\n col,\n );\n return { columnStyle, cellStyle, resolved };\n })();\n\n return {\n ranges: [...ranges],\n activeRowIndex: activeRowIndex !== null && activeRowIndex >= 0 ? activeRowIndex : null,\n activeRowKey: activeRowId,\n activeColumnIndex: activeColIndex !== null && activeColIndex >= 0 ? activeColIndex : null,\n activeColumnKey: activeColKey,\n activeValueRaw,\n activeValueDisplay,\n activeValueType,\n diagnostic,\n styles: activeStyles,\n };\n }\n\n subscribeSelection(listener: SelectionListener) {\n this.selectionListeners.add(listener);\n listener(this.getSelectionSnapshot(), null, \"selection\");\n return () => this.selectionListeners.delete(listener);\n }\n\n private emitSelection(reason: SelectionChangeReason) {\n const next = this.getSelectionSnapshot();\n const prev = this.lastSelectionSnapshot;\n this.lastSelectionSnapshot = next;\n for (const l of this.selectionListeners) l(next, prev, reason);\n }\n\n private getRowStateSnapshot(rowId: string): RowStateSnapshot<T, R> | null {\n const rowIndex = this.dataModel.getRowIndex(rowId);\n if (rowIndex < 0) return null;\n const data = this.buildRow(rowId);\n if (!data) return null;\n const pending =\n this.editMode === \"commit\"\n ? (this.dataModel.getPending().get(rowId) ?? undefined)\n : undefined;\n const diagnostics = this.getTableState().activeErrors.filter((e) => e.target?.rowId === rowId);\n return {\n rowId,\n rowIndex,\n data,\n pending: pending as Partial<T> | undefined,\n diagnostics: diagnostics.length ? diagnostics : undefined,\n };\n }\n\n subscribeRowState(listener: RowStateListener<T, R>) {\n this.rowStateListeners.add(listener);\n const rows = this.dataModel.listAllRows();\n for (const row of rows) {\n const snap = this.getRowStateSnapshot(row.id);\n if (!snap) continue;\n this.lastRowStates.set(row.id, snap);\n listener(row.id, snap, null, \"new\");\n }\n return () => this.rowStateListeners.delete(listener);\n }\n\n private emitRowState(rowId: string, reason: RowChangeReason) {\n const prev = this.lastRowStates.get(rowId) ?? null;\n if (reason === \"delete\") {\n this.lastRowStates.delete(rowId);\n for (const l of this.rowStateListeners) l(rowId, null, prev, reason);\n return;\n }\n const next = this.getRowStateSnapshot(rowId);\n if (!next) return;\n this.lastRowStates.set(rowId, next);\n for (const l of this.rowStateListeners) l(rowId, next, prev, reason);\n }\n\n // Public API: value updates\n setCellValue<K extends keyof T & string>(row: number | string, colKey: K, next: Updater<T[K]>) {\n const rowId = typeof row === \"string\" ? row : this.dataModel.listRows()[row]?.id;\n const resolved = rowId ? resolveCellAddress(this.dataModel, { rowId, colKey }) : null;\n if (!resolved) return;\n if (this.isCellReadonly(resolved.rowId, resolved.colKey)) return;\n const current = this.dataModel.getCell(resolved.rowId, resolved.colKey) as T[K];\n const computed = typeof next === \"function\" ? (next as (old: T[K]) => T[K])(current) : next;\n this.handleEdit(\n { kind: \"edit\", rowId: resolved.rowId, colKey: resolved.colKey, next: computed },\n this.editMode === \"direct\",\n );\n }\n\n setValueToSelection(next: Updater<unknown>) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const unique = new Set<string>();\n for (const r of this.selectionRanges) {\n if (r.kind !== \"cells\") continue;\n const sr = Math.min(r.startRow, r.endRow);\n const er = Math.max(r.startRow, r.endRow);\n const sc = Math.min(r.startCol, r.endCol);\n const ec = Math.max(r.startCol, r.endCol);\n for (let rowIndex = sr; rowIndex <= er; rowIndex += 1) {\n const row = rows[rowIndex];\n if (!row) continue;\n for (let colIndex = sc; colIndex <= ec; colIndex += 1) {\n const col = schema.columns[colIndex];\n if (!col) continue;\n const key = `${row.id}::${String(col.key)}`;\n if (unique.has(key)) continue;\n unique.add(key);\n if (this.isCellReadonly(row.id, col.key)) continue;\n const current = this.dataModel.getCell(row.id, col.key);\n const computed = typeof next === \"function\" ? next(current) : next;\n this.handleEdit(\n { kind: \"edit\", rowId: row.id, colKey: col.key, next: computed },\n this.editMode === \"direct\",\n );\n }\n }\n }\n }\n\n // Backward compatible aliases.\n openFindReplaceDialog(mode: FindReplaceMode = \"find\") {\n this.showSearchPanel(mode);\n }\n\n closeFindReplaceDialog() {\n this.hideSearchPanel();\n }\n\n private ensureFindReplace() {\n if (!this.findReplaceEnabled) return;\n if (!this.findReplace) {\n this.findReplace = new FindReplaceController(\n this.dataModel,\n (rowId, colKey) => this.selectionManager?.navigateToCell(rowId, colKey),\n (rowId, colKey, next) =>\n this.handleEdit({ kind: \"edit\", rowId, colKey, next }, this.editMode === \"direct\"),\n (rowId, colKey) => !this.isCellReadonly(rowId, colKey),\n );\n }\n if (this.findReplaceUiEnabled) {\n this.ensureFindReplaceSidebar();\n }\n }\n\n private ensureFindReplaceSidebar() {\n if (this.findReplaceSidebar) {\n if (this.findReplaceSidebar.isConnected) return;\n // If detached (e.g., React dev tools/fast refresh), drop reference and recreate.\n this.findReplaceSidebar = null;\n }\n this.ensureShell();\n const shell = this.shell ?? this.root;\n\n const aside = document.createElement(\"aside\");\n aside.className = \"extable-search-sidebar\";\n aside.innerHTML = `\n <div class=\"extable-search-header\">\n <div class=\"extable-search-row\">\n <label class=\"extable-search-label\">\n <span class=\"extable-search-title\">Find</span>\n <input data-extable-fr=\"query\" type=\"text\" />\n </label>\n <button type=\"button\" data-extable-fr=\"close\" class=\"extable-search-close\">×</button>\n </div>\n <div class=\"extable-search-row\">\n <label><input data-extable-fr=\"case\" type=\"checkbox\" /> <span>Case</span></label>\n <label><input data-extable-fr=\"regex\" type=\"checkbox\" /> <span>Regex</span></label>\n <label data-extable-fr=\"replace-toggle-row\"><input data-extable-fr=\"replace-toggle\" type=\"checkbox\" /> <span>Replace</span></label>\n </div>\n <div class=\"extable-search-row extable-search-replace-row\" data-extable-fr=\"replace-row\">\n <label class=\"extable-search-label\">\n <span class=\"extable-search-title\">Replace</span>\n <input data-extable-fr=\"replace\" type=\"text\" />\n </label>\n </div>\n <div class=\"extable-search-row extable-search-status\">\n <span data-extable-fr=\"status\"></span>\n <span data-extable-fr=\"error\" class=\"extable-search-error\"></span>\n </div>\n </div>\n <div class=\"extable-search-body\">\n <div class=\"extable-search-actions\">\n <button type=\"button\" data-extable-fr=\"prev\">Prev</button>\n <button type=\"button\" data-extable-fr=\"next\">Next</button>\n <button type=\"button\" data-extable-fr=\"replace-current\" data-extable-fr-only=\"replace\">Replace</button>\n <button type=\"button\" data-extable-fr=\"replace-all\" data-extable-fr-only=\"replace\">Replace All</button>\n </div>\n <div class=\"extable-search-results\" data-extable-fr=\"results\">\n <table class=\"extable-search-table\" data-extable-fr=\"results-table\">\n <thead>\n <tr><th>Cell</th><th>Text</th></tr>\n </thead>\n <tbody data-extable-fr=\"results-tbody\"></tbody>\n </table>\n </div>\n </div>\n `;\n\n shell.appendChild(aside);\n this.findReplaceSidebar = aside;\n\n const query = aside.querySelector<HTMLInputElement>('input[data-extable-fr=\"query\"]');\n const replace = aside.querySelector<HTMLInputElement>('input[data-extable-fr=\"replace\"]');\n const toggleReplace = aside.querySelector<HTMLInputElement>(\n 'input[data-extable-fr=\"replace-toggle\"]',\n );\n const toggleReplaceRow = aside.querySelector<HTMLElement>(\n '[data-extable-fr=\"replace-toggle-row\"]',\n );\n const caseCb = aside.querySelector<HTMLInputElement>('input[data-extable-fr=\"case\"]');\n const regexCb = aside.querySelector<HTMLInputElement>('input[data-extable-fr=\"regex\"]');\n const btnPrev = aside.querySelector<HTMLButtonElement>('button[data-extable-fr=\"prev\"]');\n const btnNext = aside.querySelector<HTMLButtonElement>('button[data-extable-fr=\"next\"]');\n const btnReplace = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fr=\"replace-current\"]',\n );\n const btnReplaceAll = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fr=\"replace-all\"]',\n );\n const btnClose = aside.querySelector<HTMLButtonElement>('button[data-extable-fr=\"close\"]');\n const tbody = aside.querySelector<HTMLElement>('[data-extable-fr=\"results-tbody\"]');\n\n if (\n !query ||\n !replace ||\n !toggleReplace ||\n !toggleReplaceRow ||\n !caseCb ||\n !regexCb ||\n !btnPrev ||\n !btnNext ||\n !btnReplace ||\n !btnReplaceAll ||\n !btnClose ||\n !tbody\n ) {\n removeFromParent(aside);\n this.findReplaceSidebar = null;\n return;\n }\n\n query.addEventListener(\"input\", () => this.findReplace?.setQuery(query.value));\n replace.addEventListener(\"input\", () => this.findReplace?.setReplace(replace.value));\n caseCb.addEventListener(\"change\", () =>\n this.findReplace?.setOptions({ caseInsensitive: caseCb.checked }),\n );\n regexCb.addEventListener(\"change\", () =>\n this.findReplace?.setOptions({ regex: regexCb.checked }),\n );\n toggleReplace.addEventListener(\"change\", () => {\n if (this.editMode === \"readonly\") {\n toggleReplace.checked = false;\n this.findReplace?.setMode(\"find\");\n aside.dataset.extableFrMode = \"find\";\n return;\n }\n const mode: FindReplaceMode = toggleReplace.checked ? \"replace\" : \"find\";\n this.findReplace?.setMode(mode);\n aside.dataset.extableFrMode = mode;\n });\n this.updateFindReplaceReadonlyUI();\n btnPrev.addEventListener(\"click\", () => this.findReplace?.prev());\n btnNext.addEventListener(\"click\", () => this.findReplace?.next());\n btnReplace.addEventListener(\"click\", () => this.findReplace?.replaceCurrent());\n btnReplaceAll.addEventListener(\"click\", () => this.findReplace?.replaceAll());\n btnClose.addEventListener(\"click\", () => this.hideSearchPanel());\n\n const truncate = (text: string, max = 140) =>\n text.length > max ? `${text.slice(0, max - 1)}…` : text;\n\n tbody.addEventListener(\"click\", (e) => {\n const tr = (e.target as HTMLElement | null)?.closest<HTMLElement>(\"tr[data-index]\");\n const idx = tr ? Number(tr.dataset.index) : -1;\n if (Number.isFinite(idx) && idx >= 0) this.findReplace?.activateIndex(idx);\n });\n tbody.addEventListener(\"keydown\", (e) => {\n if (e.key !== \"Enter\") return;\n const tr = (e.target as HTMLElement | null)?.closest<HTMLElement>(\"tr[data-index]\");\n const idx = tr ? Number(tr.dataset.index) : -1;\n if (Number.isFinite(idx) && idx >= 0) this.findReplace?.activateIndex(idx);\n });\n\n this.updateFindReplaceReadonlyUI();\n\n this.findReplaceSidebarUnsub =\n this.findReplace?.subscribe((state) => {\n const replaceRow = aside.querySelector<HTMLElement>('[data-extable-fr=\"replace-row\"]');\n const status = aside.querySelector<HTMLElement>('[data-extable-fr=\"status\"]');\n const error = aside.querySelector<HTMLElement>('[data-extable-fr=\"error\"]');\n if (!replaceRow || !status || !error) return;\n\n query.value = state.query;\n replace.value = state.replace;\n caseCb.checked = state.options.caseInsensitive;\n regexCb.checked = state.options.regex;\n toggleReplace.checked = state.mode === \"replace\";\n replaceRow.style.display = state.mode === \"replace\" ? \"block\" : \"none\";\n btnReplace.style.display = state.mode === \"replace\" ? \"inline-block\" : \"none\";\n btnReplaceAll.style.display = state.mode === \"replace\" ? \"inline-block\" : \"none\";\n\n status.textContent = `${state.matches.length} matches`;\n error.textContent = state.error ?? \"\";\n\n btnPrev.disabled = state.matches.length === 0;\n btnNext.disabled = state.matches.length === 0;\n btnReplace.disabled = state.matches.length === 0 || state.activeIndex < 0;\n btnReplaceAll.disabled = state.matches.length === 0;\n\n tbody.innerHTML = \"\";\n for (let i = 0; i < state.matches.length; i += 1) {\n const m = state.matches[i];\n if (!m) continue;\n const tr = document.createElement(\"tr\");\n tr.dataset.index = String(i);\n tr.tabIndex = 0;\n tr.className = \"extable-search-result-row\";\n if (i === state.activeIndex) tr.dataset.active = \"1\";\n const cellTd = document.createElement(\"td\");\n cellTd.textContent = `R${m.rowIndex + 1}C${m.colIndex + 1}`;\n const textTd = document.createElement(\"td\");\n const preview = truncate(m.text);\n textTd.textContent = preview;\n textTd.title = m.text;\n tr.appendChild(cellTd);\n tr.appendChild(textTd);\n tbody.appendChild(tr);\n }\n }) ?? null;\n }\n\n private teardownFindReplace() {\n this.findReplaceSidebarUnsub?.();\n this.findReplaceSidebarUnsub = null;\n if (this.findReplaceSidebar) {\n removeFromParent(this.findReplaceSidebar);\n this.findReplaceSidebar = null;\n }\n this.findReplace?.destroy();\n this.findReplace = null;\n }\n\n // External toggle for host apps.\n private stableValueKey(value: unknown) {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (value instanceof Date) return `date:${value.getTime()}`;\n if (typeof value === \"string\") return `s:${value}`;\n if (typeof value === \"number\") return `n:${Number.isNaN(value) ? \"NaN\" : String(value)}`;\n if (typeof value === \"boolean\") return `b:${value ? \"1\" : \"0\"}`;\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return `enum:${obj.value}`;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return `tags:${obj.values.filter((x) => typeof x === \"string\").join(\"|\")}`;\n }\n }\n try {\n return `json:${JSON.stringify(value)}`;\n } catch {\n return `str:${String(value)}`;\n }\n }\n\n private ensureFilterSort() {\n this.ensureFilterSortSidebar();\n this.ensureFilterSortHeaderIntegration();\n this.ensureFilterSortEscape();\n }\n\n private ensureFilterSortEscape() {\n if (this.filterSortKeydown) return;\n this.filterSortKeydown = (ev: KeyboardEvent) => {\n if (!this.isFilterSortPanelVisible()) return;\n if (ev.key !== \"Escape\") return;\n ev.preventDefault();\n ev.stopPropagation();\n this.hideFilterSortPanel();\n };\n document.addEventListener(\"keydown\", this.filterSortKeydown, true);\n }\n\n private ensureFilterSortHeaderIntegration() {\n if (this.filterSortClickCapture) return;\n const host = this.viewportEl ?? this.root;\n this.filterSortClickCapture = (ev: MouseEvent) => {\n const el = ev.target as HTMLElement | null;\n const btn = el?.closest<HTMLButtonElement>('button[data-extable-fs-open=\"1\"]');\n if (!btn) return;\n const key =\n btn.dataset.extableColKey ?? btn.closest<HTMLElement>(\"th[data-col-key]\")?.dataset.colKey;\n if (!key) return;\n ev.preventDefault();\n ev.stopPropagation();\n this.showFilterSortPanel(key);\n };\n host.addEventListener(\"click\", this.filterSortClickCapture, true);\n this.filterSortOpenEvent = (ev: Event) => {\n const anyEv = ev as CustomEvent<unknown>;\n const detail = anyEv.detail as Record<string, unknown> | null | undefined;\n const key = detail?.colKey;\n if (key === undefined || key === null) return;\n this.showFilterSortPanel(String(key));\n };\n host.addEventListener(\"extable:filter-sort-open\", this.filterSortOpenEvent);\n }\n\n private ensureFilterSortSidebar() {\n if (this.filterSortSidebar) {\n if (this.filterSortSidebar.isConnected) return;\n this.filterSortSidebar = null;\n }\n this.ensureShell();\n const shell = this.shell ?? this.root;\n\n const aside = document.createElement(\"aside\");\n aside.className = \"extable-filter-sort-sidebar\";\n aside.innerHTML = `\n <div class=\"extable-filter-sort-header\">\n <div class=\"extable-filter-sort-row\">\n <div class=\"extable-filter-sort-title\" data-extable-fs=\"title\">Sort/Filter</div>\n <button type=\"button\" data-extable-fs=\"close\" class=\"extable-filter-sort-close\">×</button>\n </div>\n </div>\n <div class=\"extable-filter-sort-body\">\n <div class=\"extable-filter-sort-section extable-filter-sort-section-filter\">\n <div class=\"extable-filter-sort-section-title\">Filter</div>\n <div class=\"extable-filter-sort-actions\">\n <label><input type=\"checkbox\" data-extable-fs=\"col-errors\" /> Errors</label>\n <label><input type=\"checkbox\" data-extable-fs=\"col-warnings\" /> Warnings</label>\n </div>\n <input data-extable-fs=\"search\" type=\"text\" placeholder=\"Search values\" />\n <div class=\"extable-filter-sort-values\" data-extable-fs=\"values\"></div>\n <div class=\"extable-filter-sort-actions\" data-align=\"split\">\n <button type=\"button\" data-extable-fs=\"select-all\">Select All</button>\n <button type=\"button\" data-extable-fs=\"select-none\">Select None</button>\n <button type=\"button\" data-extable-fs=\"apply-filter\">Apply</button>\n <button type=\"button\" data-extable-fs=\"clear-filter\">Clear</button>\n </div>\n </div>\n <div class=\"extable-filter-sort-section extable-filter-sort-section-sort\">\n <div class=\"extable-filter-sort-section-title\">Sort</div>\n <div class=\"extable-filter-sort-actions\" data-align=\"right\">\n <button type=\"button\" data-extable-fs=\"sort-asc\">Sort Asc</button>\n <button type=\"button\" data-extable-fs=\"sort-desc\">Sort Desc</button>\n <button type=\"button\" data-extable-fs=\"clear-sort\">Clear Sort</button>\n </div>\n </div>\n </div>\n `;\n shell.appendChild(aside);\n this.filterSortSidebar = aside;\n\n const btnClose = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"close\"]');\n const cbErrors = aside.querySelector<HTMLInputElement>('input[data-extable-fs=\"col-errors\"]');\n const cbWarnings = aside.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-warnings\"]',\n );\n const search = aside.querySelector<HTMLInputElement>('input[data-extable-fs=\"search\"]');\n const values = aside.querySelector<HTMLElement>('[data-extable-fs=\"values\"]');\n const btnAll = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"select-all\"]');\n const btnNone = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"select-none\"]');\n const btnApply = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"apply-filter\"]',\n );\n const btnClear = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"clear-filter\"]',\n );\n const btnSortAsc = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"sort-asc\"]');\n const btnSortDesc = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-desc\"]',\n );\n const btnSortClear = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"clear-sort\"]',\n );\n\n if (\n !btnClose ||\n !cbErrors ||\n !cbWarnings ||\n !search ||\n !values ||\n !btnAll ||\n !btnNone ||\n !btnApply ||\n !btnClear ||\n !btnSortAsc ||\n !btnSortDesc ||\n !btnSortClear\n ) {\n removeFromParent(aside);\n this.filterSortSidebar = null;\n return;\n }\n\n btnClose.addEventListener(\"click\", () => this.hideFilterSortPanel());\n\n cbErrors.addEventListener(\"change\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.diagErrors = cbErrors.checked;\n });\n cbWarnings.addEventListener(\"change\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.diagWarnings = cbWarnings.checked;\n });\n search.addEventListener(\"input\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.search = search.value;\n this.renderFilterSortValues();\n });\n\n values.addEventListener(\"change\", (e) => {\n const input = (e.target as HTMLElement | null)?.closest<HTMLInputElement>(\n 'input[type=\"checkbox\"][data-fs-val]',\n );\n if (!input || !this.filterSortDraft) return;\n const k = input.dataset.fsVal ?? \"\";\n if (!k) return;\n if (k === \"__blanks__\") {\n this.filterSortDraft.includeBlanks = input.checked;\n } else if (input.checked) {\n this.filterSortDraft.selected.add(k);\n } else {\n this.filterSortDraft.selected.delete(k);\n }\n });\n\n btnAll.addEventListener(\"click\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.selected = new Set(this.filterSortDraft.values.map((v) => v.key));\n this.filterSortDraft.includeBlanks = this.filterSortDraft.hasBlanks;\n this.renderFilterSortValues();\n });\n btnNone.addEventListener(\"click\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.selected = new Set();\n this.filterSortDraft.includeBlanks = false;\n this.renderFilterSortValues();\n });\n btnApply.addEventListener(\"click\", () => this.applyFilterSortDraft());\n btnClear.addEventListener(\"click\", () => this.clearFilterSortForActiveColumn());\n btnSortAsc.addEventListener(\"click\", () => this.setSortForActiveColumn(\"asc\"));\n btnSortDesc.addEventListener(\"click\", () => this.setSortForActiveColumn(\"desc\"));\n btnSortClear.addEventListener(\"click\", () => this.clearSort());\n\n this.filterSortSidebarUnsub = this.dataModel.subscribe(() => {\n if (!this.isFilterSortPanelVisible()) return;\n if (!this.filterSortActiveColumnKey) return;\n this.buildFilterSortDraft(this.filterSortActiveColumnKey);\n this.renderFilterSortSidebar();\n });\n }\n\n showFilterSortPanel(colKey: string) {\n this.hideSearchPanel();\n this.filterSortActiveColumnKey = colKey;\n this.buildFilterSortDraft(colKey);\n this.root.classList.toggle(\"extable-filter-sort-open\", true);\n this.renderFilterSortSidebar();\n const input =\n this.filterSortSidebar?.querySelector<HTMLInputElement>('input[data-extable-fs=\"search\"]') ??\n null;\n input?.focus();\n }\n\n hideFilterSortPanel() {\n this.root.classList.toggle(\"extable-filter-sort-open\", false);\n this.filterSortActiveColumnKey = null;\n this.filterSortDraft = null;\n }\n\n toggleFilterSortPanel(colKey: string) {\n if (this.isFilterSortPanelVisible()) this.hideFilterSortPanel();\n else this.showFilterSortPanel(colKey);\n }\n\n private buildFilterSortDraft(colKey: string) {\n const view = this.dataModel.getView();\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) {\n this.filterSortDraft = null;\n return;\n }\n const prevSearch =\n this.filterSortDraft && String(this.filterSortDraft.colKey) === String(col.key)\n ? this.filterSortDraft.search\n : \"\";\n const distinct = this.dataModel.getDistinctValuesForColumn(col.key);\n const values = distinct.values.map((v) => ({ ...v, key: this.stableValueKey(v.value) }));\n const existing = (view.filters ?? []).find(\n (f) =>\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(col.key),\n ) as ViewFilterValues | undefined;\n\n const selected = new Set<string>();\n if (existing) {\n for (const v of existing.values ?? []) selected.add(this.stableValueKey(v));\n } else {\n for (const v of values) selected.add(v.key);\n }\n const includeBlanks = existing ? Boolean(existing.includeBlanks) : distinct.hasBlanks;\n const diag = view.columnDiagnostics?.[String(col.key)];\n this.filterSortDraft = {\n colKey: col.key,\n values,\n hasBlanks: distinct.hasBlanks,\n selected,\n includeBlanks,\n diagErrors: Boolean(diag?.errors),\n diagWarnings: Boolean(diag?.warnings),\n search: prevSearch,\n };\n }\n\n private renderFilterSortSidebar() {\n if (!this.filterSortSidebar) return;\n const title = this.filterSortSidebar.querySelector<HTMLElement>('[data-extable-fs=\"title\"]');\n const cbErrors = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-errors\"]',\n );\n const cbWarnings = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-warnings\"]',\n );\n const search = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"search\"]',\n );\n if (!title || !cbErrors || !cbWarnings || !search) return;\n const btnSortAsc = this.filterSortSidebar.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-asc\"]',\n );\n const btnSortDesc = this.filterSortSidebar.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-desc\"]',\n );\n const draft = this.filterSortDraft;\n if (!draft) {\n title.textContent = \"Sort/Filter\";\n cbErrors.checked = false;\n cbWarnings.checked = false;\n search.value = \"\";\n if (btnSortAsc) btnSortAsc.dataset.active = \"0\";\n if (btnSortDesc) btnSortDesc.dataset.active = \"0\";\n this.renderFilterSortValues();\n return;\n }\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(draft.colKey));\n const name = col?.header ?? String(draft.colKey);\n title.textContent = `Sort/Filter: ${name}`;\n cbErrors.checked = draft.diagErrors;\n cbWarnings.checked = draft.diagWarnings;\n search.value = draft.search;\n const view = this.dataModel.getView();\n const sort = view.sorts?.find((s) => String(s.key) === String(draft.colKey));\n if (btnSortAsc) btnSortAsc.dataset.active = sort?.dir === \"asc\" ? \"1\" : \"0\";\n if (btnSortDesc) btnSortDesc.dataset.active = sort?.dir === \"desc\" ? \"1\" : \"0\";\n this.renderFilterSortValues();\n }\n\n private renderFilterSortValues() {\n if (!this.filterSortSidebar) return;\n const values = this.filterSortSidebar.querySelector<HTMLElement>('[data-extable-fs=\"values\"]');\n if (!values) return;\n values.innerHTML = \"\";\n const draft = this.filterSortDraft;\n if (!draft) return;\n\n const q = draft.search.trim().toLowerCase();\n const total = draft.values.length + (draft.hasBlanks ? 1 : 0);\n if (total > 100 && !q) {\n const msg = document.createElement(\"div\");\n msg.textContent = \"Too many values (100+). Type to search.\";\n values.appendChild(msg);\n return;\n }\n\n if (draft.hasBlanks) {\n const label = document.createElement(\"label\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.dataset.fsVal = \"__blanks__\";\n cb.checked = draft.includeBlanks;\n const text = document.createElement(\"span\");\n text.textContent = \"(Blanks)\";\n label.appendChild(cb);\n label.appendChild(text);\n values.appendChild(label);\n }\n\n const filtered = q\n ? draft.values.filter((v) => v.label.toLowerCase().includes(q))\n : draft.values;\n for (const v of filtered.slice(0, 200)) {\n const label = document.createElement(\"label\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.dataset.fsVal = v.key;\n cb.checked = draft.selected.has(v.key);\n const text = document.createElement(\"span\");\n text.textContent = v.label;\n label.appendChild(cb);\n label.appendChild(text);\n values.appendChild(label);\n }\n }\n\n private applyFilterSortDraft() {\n const draft = this.filterSortDraft;\n if (!draft) return;\n const view = this.dataModel.getView();\n const existingFilters = [...(view.filters ?? [])].filter(\n (f) =>\n !(\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(draft.colKey)\n ),\n );\n\n const allSelected =\n draft.selected.size === draft.values.length &&\n draft.includeBlanks === Boolean(draft.hasBlanks);\n const nextFilters = allSelected\n ? existingFilters\n : [\n ...existingFilters,\n {\n kind: \"values\",\n key: draft.colKey,\n values: draft.values.filter((v) => draft.selected.has(v.key)).map((v) => v.value),\n includeBlanks: draft.includeBlanks,\n } satisfies ViewFilterValues,\n ];\n\n const nextDiagnostics = { ...(view.columnDiagnostics ?? {}) };\n if (draft.diagErrors || draft.diagWarnings) {\n nextDiagnostics[String(draft.colKey)] = {\n errors: draft.diagErrors,\n warnings: draft.diagWarnings,\n };\n } else {\n delete nextDiagnostics[String(draft.colKey)];\n }\n\n const nextView: View = {\n ...view,\n filters: nextFilters.length ? nextFilters : undefined,\n columnDiagnostics: Object.keys(nextDiagnostics).length ? nextDiagnostics : undefined,\n };\n this.setView(nextView);\n }\n\n private clearFilterSortForActiveColumn() {\n const colKey = this.filterSortActiveColumnKey;\n if (colKey === null || colKey === undefined) return;\n const view = this.dataModel.getView();\n const nextFilters = [...(view.filters ?? [])].filter(\n (f) =>\n !(\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(colKey)\n ),\n );\n const nextDiagnostics = { ...(view.columnDiagnostics ?? {}) };\n delete nextDiagnostics[String(colKey)];\n const nextView: View = {\n ...view,\n filters: nextFilters.length ? nextFilters : undefined,\n columnDiagnostics: Object.keys(nextDiagnostics).length ? nextDiagnostics : undefined,\n };\n this.setView(nextView);\n this.buildFilterSortDraft(colKey);\n this.renderFilterSortSidebar();\n }\n\n private setSortForActiveColumn(dir: \"asc\" | \"desc\") {\n const colKey = this.filterSortActiveColumnKey;\n if (colKey === null || colKey === undefined) return;\n const view = this.dataModel.getView();\n const nextView: View = { ...view, sorts: [{ key: colKey, dir }] };\n this.setView(nextView);\n this.buildFilterSortDraft(colKey);\n this.renderFilterSortSidebar();\n }\n\n private clearSort() {\n const view = this.dataModel.getView();\n if (!view.sorts?.length) return;\n const nextView: View = { ...view, sorts: undefined };\n this.setView(nextView);\n if (this.filterSortActiveColumnKey !== null) {\n this.buildFilterSortDraft(this.filterSortActiveColumnKey);\n this.renderFilterSortSidebar();\n }\n }\n\n private teardownFilterSort() {\n this.filterSortSidebarUnsub?.();\n this.filterSortSidebarUnsub = null;\n if (this.filterSortSidebar) {\n removeFromParent(this.filterSortSidebar);\n this.filterSortSidebar = null;\n }\n if (this.filterSortKeydown) {\n document.removeEventListener(\"keydown\", this.filterSortKeydown, true);\n this.filterSortKeydown = null;\n }\n if (this.filterSortClickCapture) {\n (this.viewportEl ?? this.root).removeEventListener(\n \"click\",\n this.filterSortClickCapture,\n true,\n );\n this.filterSortClickCapture = null;\n }\n if (this.filterSortOpenEvent) {\n (this.viewportEl ?? this.root).removeEventListener(\n \"extable:filter-sort-open\",\n this.filterSortOpenEvent,\n );\n this.filterSortOpenEvent = null;\n }\n this.root.classList.toggle(\"extable-filter-sort-open\", false);\n this.filterSortActiveColumnKey = null;\n this.filterSortDraft = null;\n }\n\n private initViewportState() {\n const host = this.getScrollHost();\n this.viewportState = {\n scrollTop: host.scrollTop,\n scrollLeft: host.scrollLeft,\n clientWidth: host.clientWidth,\n clientHeight: host.clientHeight,\n deltaX: 0,\n deltaY: 0,\n timestamp: performance.now(),\n };\n }\n\n private updateViewportFromRoot() {\n if (!this.viewportState) this.initViewportState();\n const prev = this.viewportState ?? {\n scrollTop: 0,\n scrollLeft: 0,\n clientWidth: 0,\n clientHeight: 0,\n deltaX: 0,\n deltaY: 0,\n timestamp: performance.now(),\n };\n const host = this.getScrollHost();\n const next: ViewportState = {\n scrollTop: host.scrollTop,\n scrollLeft: host.scrollLeft,\n clientWidth: host.clientWidth,\n clientHeight: host.clientHeight,\n deltaX: host.scrollLeft - prev.scrollLeft,\n deltaY: host.scrollTop - prev.scrollTop,\n timestamp: performance.now(),\n };\n this.viewportState = next;\n if (this.rafId === null) {\n this.rafId = requestAnimationFrame(() => this.flushRender());\n }\n }\n\n private flushRender() {\n this.rafId = null;\n if (!this.viewportState) return;\n this.selectionManager?.onScroll(this.viewportState.scrollTop, this.viewportState.scrollLeft);\n // HTML renderer re-renders DOM; avoid doing it on scroll to preserve scroll position.\n if (this.renderer instanceof HTMLRenderer) return;\n this.safeRender(this.viewportState);\n }\n}\n\n// Compatibility helpers for wrappers/tests\nexport function createTablePlaceholder<T extends object = Record<string, unknown>>(\n config: TableConfig<T>,\n options?: CoreOptions,\n) {\n const core = new ExtableCore<T>({\n root: document.createElement(\"div\"),\n defaultData: config.data,\n defaultView: config.view,\n schema: config.schema,\n options,\n });\n return core;\n}\n\nexport function mountTable(target: HTMLElement, core: ExtableCore) {\n core.remount(target);\n return core;\n}\n"],"names":["getBatchId","cmd","p","id","CommandQueue","cap","command","batchId","last","out","group","g","generateId","toArray","value","removeFromParent","el","pad","num","len","tokenHandlers","d","h","TOKENS","a","b","DATE_TOKENS","TIME_TOKENS","DATETIME_TOKENS","DATE_PRESETS","TIME_PRESETS","DATETIME_PRESETS","parseIsoDate","parsed","formatDateLite","date","pattern","inLiteral","ch","matched","token","isTokenAllowed","kind","isPatternAllowed","i","coerceDatePattern","fallback","isValidDate","asEnumValue","obj","asTagsValues","v","values","validateCellValue","col","allowCustom","options","DataModel","dataset","schema","view","listener","l","run","row","idx","rowId","index","slowIndex","r","slowRow","height","next","entries","changed","key","found","pendingRow","colKey","c","committed","bumpVersion","prev","rawVal","current","uniqueCols","val","rowData","forcedId","clamped","removed","colIndex","rowIndex","exclude","includeSort","filters","f","vf","opf","columnDiagnosticsEntries","k","x","sorts","s","filter","valueKey","colKeyStr","diag","errors","warnings","marker","diagEntries","filtered","ok","sort","sortCol","dir","withKeys","blank","baseIndex","compare","as","bs","cached","rows","indexById","cacheKey","empty","map","hasBlanks","label","keys","sep","merged","version","data","e","fn","res","rowRes","applyDelta","base","delta","diagnostic","forceErrorText","colCacheKey","cellFn","ra","rb","ca","cb","validation","level","message","msg","joined","valueToRows","norm","list","rowIds","display","rowList","style","updater","resolveCellAddress","dataModel","address","resolveByIndex","resolveByKeys","defaultOptions","stringifyCellValue","escapeRegExp","text","clampIndex","length","FindReplaceController","navigateToCell","applyEdit","canEdit","mode","query","replace","match","currentText","replacement","byCell","m","matches","first","nextText","flags","re","seen","substr","args","off","sorted","error","cellValue","start","end","activeIndex","LockManager","server","user","currentRowId","keepRowId","toUnlock","DAY_MS","safeParseDate","safeParseTime","toRawValue","raw","floored","HEADER_HEIGHT_PX","ROW_HEADER_WIDTH_PX","DEFAULT_ROW_HEIGHT_PX","getColumnWidths","fallbackWidth","extraByType","extra","normalizeRange","range","parseStringSuffixNumber","prefix","digits","coerceToTime","coerceToDate","daysInMonthUtc","year","month0","addMonthsUtcClamped","baseUtc","months","y","hh","mm","ss","ms","totalMonths","ny","nm","maxDay","nd","addYearsUtcClamped","years","addMonthsLocalClamped","addYearsLocalClamped","getFillHandleSource","ranges","width","r1","r2","s1","s2","p1","p2","makeFillValueGetter","source","v1","v2","n1","n2","step","offsetFromEnd","d1","d2","t1","t2","stepMs","sameDayUtc","stepYears","stepMonths","sameDayLocal","sign","abs","FILL_HANDLE_VISUAL_SIZE_PX","FILL_HANDLE_HIT_SIZE_PX","getFillHandleRect","cellRect","size","isPointInRect","rect","shouldShowFillHandle","activeRowId","activeColKey","editMode","src","columnFormatToStyle","fmt","dec","mergeStyle","override","resolveCellStyles","columnStyle","conditional","cellStyle","resolved","styleToCssText","css","getColumnSortDir","hasActiveColumnFilter","svgFunnel","svgArrow","drawDiagnosticCorner","ctx","w","color","ValueFormatCache","drawFunnelIcon","alpha","drawSortArrowIcon","FenwickTree","n","ft","count","index0","target","total","bit","acc","nextAcc","HTMLRenderer","root","_state","scrollContainer","prevTop","prevLeft","colWidths","colBaseStyles","colBaseCss","totalWidth","colgroup","rowCol","colEl","body","entry","event","corner","rowHeader","cell","thead","tr","rowTh","th","sortDir","hasFilter","wrap","btn","td","isPending","condRes","baseStyle","withCond","forCss","valueRes","textOverride","formatted","align","rawNumbered","rawStr","maxHeight","measure","measureHost","isAll","startRow","endRow","startCol","endCol","rowEl","cells","opts","_CanvasRenderer","getEditMode","ev","viewportX","viewportY","xCursor","iconSize","iconLeft","iconTop","maxDim","state","baseFont","selectAll","fontCache","wrapAny","heightIndex","desiredCanvasWidth","desiredCanvasHeight","nextWidth","nextHeight","scrollTop","scrollLeft","computeVisibleRange","contentTop","visibleStart","accum","visibleEnd","drawnHeight","totalRowsHeight","contentScrollTop","updates","nextH","dataXOffset","yCursor","rowH","idxText","lastFontKey","readOnly","mergedStyle","bg","left","top","isBoolean","isCustomBoolean","fontKey","weight","xHeader","isHover","iconBox","ix","iy","yTop","xLeft","existing","heights","idToIndex","measuredVersion","cachedHeight","wraps","widths","task","measured","headerHeight","accumHeight","topPx","rowTop","rootRect","maxW","maxH","side","tRect","clientX","clientY","prevKey","prevIcon","nextKey","nextIcon","cursor","hit","sameCell","sameMessage","handleRect","rawLines","lines","line","cut","firstKey","decorations","fontBackup","renderLine","ln","lineIdx","baseline","startX","endX","center","strokeBackup","lineWidthBackup","yUnderline","yStrike","CanvasRenderer","SelectionManager","onEdit","onRowSelect","onMove","hitTest","isCellReadonly","onActiveChange","onContextMenu","onSelectionChange","onUndo","onRedo","fillSrc","handleRowIndex","handleColIndex","handleRow","handleCol","targetRow","targetCol","dx","dy","endRowIndex","suppressTrailingClick","payload","html","tsv","grid","isMac","isTab","isEnter","isArrow","extend","wasSameCell","isSecondClick","maxRow","maxCol","activeRowIndex","activeColIndex","nextRanges","clamp","max","desiredColKey","fallbackRow","nextRow","nextRange","colType","initial","toast","inset","variant","durationMs","input","valueForSelection","escapeFn","rowIdEsc","keyEsc","box","rowHeaderWidth","defaultRowHeight","htmlCell","metrics","xStart","xEnd","yStart","yEnd","leftVis","rightVis","topVis","bottomVis","deltaRow","deltaCol","extendSelection","anchor","nextRowIndex","nextColIndex","colHeader","endColIndex","nextEnd","threshold","maxStep","tick","raf","raf2","getValue","commitNow","offset","cellCount","copyViaClipboardApi","item","copyViaFallbackInput","ac","rowIdx","colIdx","htmlRows","tableStyle","htmlCells","fromHtml","trimmed","table","trs","ta","normalized","select","opt","op","listId","datalist","lineHeight","wrapper","isRow","targetRange","anchorRow","anchorCol","anchorCell","sameCols","sameRows","rowsTouch","colsTouch","initialValue","control","now","isTextarea","isAltEnter","commitAndMove","clearActive","defineSchema","ExtableCore","init","defaultData","initialData","classes","ua","shell","viewport","anyRO","force","host","_colKey","classNames","wasLoaded","rowIdOrIndex","pending","vv","position","insertAt","baseIdx","newId","cmds","toKinds","kinds","labelFor","commandCount","toSteps","groups","touched","snapshots","snap","commands","pop","actions","act","hr","action","viewportWidth","viewportHeight","targetIndex","aside","toggleReplace","readonly","effective","applied","pendingCommands","pendingCommandCount","pendingCellCount","validationErrors","diagnosticErrors","ar","br","bc","activeErrors","errorsEqual","at","bt","active","activeValueRes","activeCondRes","activeTextOverride","activeValueRaw","activeValueDisplay","activeValueType","activeStyles","reason","diagnostics","computed","unique","sr","er","sc","ec","toggleReplaceRow","caseCb","regexCb","btnPrev","btnNext","btnReplace","btnReplaceAll","btnClose","tbody","truncate","replaceRow","status","cellTd","textTd","preview","cbErrors","cbWarnings","search","btnAll","btnNone","btnApply","btnClear","btnSortAsc","btnSortDesc","btnSortClear","prevSearch","distinct","selected","includeBlanks","title","draft","name","q","existingFilters","nextFilters","nextDiagnostics","nextView","createTablePlaceholder","config","mountTable","core"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/commandQueue.ts","../src/utils.ts","../src/dateUtils.ts","../src/validation.ts","../src/dataModel.ts","../src/address.ts","../src/findReplace.ts","../src/lockManager.ts","../src/cellValueCodec.ts","../src/geometry.ts","../../sequence/dist/index.js","../src/fillHandle.ts","../src/styleResolver.ts","../src/renderers.ts","../src/selectionManager.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["import type { Command } from \"./types\";\n\ntype CommandGroup = { batchId: string | null; commands: Command[] };\nexport type CommandGroupSnapshot = { batchId: string | null; commands: Command[] };\n\nfunction getBatchId(cmd: Command) {\n const p = cmd.payload as Record<string, unknown> | null | undefined;\n if (!p) return null;\n const id = p.batchId;\n return typeof id === \"string\" && id.length ? id : null;\n}\n\nexport class CommandQueue {\n private applied: CommandGroup[] = [];\n private undone: CommandGroup[] = [];\n private cap: number;\n\n constructor(cap = 100) {\n this.cap = cap;\n }\n\n enqueue(command: Command) {\n const batchId = getBatchId(command);\n const last = this.applied.at(-1);\n if (batchId && last && last.batchId === batchId) {\n last.commands.push(command);\n } else {\n this.applied.push({ batchId, commands: [command] });\n }\n while (this.applied.length > this.cap) this.applied.shift();\n this.undone = [];\n }\n\n canUndo() {\n return this.applied.length > 0;\n }\n\n canRedo() {\n return this.undone.length > 0;\n }\n\n listApplied() {\n const out: Command[] = [];\n for (const group of this.applied) out.push(...group.commands);\n return out;\n }\n\n listUndoGroups(): CommandGroupSnapshot[] {\n // Return top = next undo.\n return this.applied\n .slice()\n .reverse()\n .map((g) => ({ batchId: g.batchId, commands: g.commands.slice() }));\n }\n\n listRedoGroups(): CommandGroupSnapshot[] {\n // Return top = next redo.\n return this.undone\n .slice()\n .reverse()\n .map((g) => ({ batchId: g.batchId, commands: g.commands.slice() }));\n }\n\n undo() {\n const group = this.applied.pop();\n if (group) this.undone.push(group);\n return group?.commands ?? null;\n }\n\n redo() {\n const group = this.undone.pop();\n if (group) this.applied.push(group);\n return group?.commands ?? null;\n }\n\n clear() {\n this.applied = [];\n this.undone = [];\n }\n}\n","export function generateId() {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n return `row_${Math.random().toString(16).slice(2)}`;\n}\n\nexport function toArray<T>(value: T | T[] | undefined): T[] | undefined {\n if (value === undefined) return undefined;\n return Array.isArray(value) ? value : [value];\n}\n\nexport function removeFromParent(el: Element | null | undefined) {\n if (!el) return;\n try {\n el.remove();\n } catch {\n // Ignore NotFoundError from re-entrant blur/remove edge cases.\n }\n}\n","const pad = (num: number, len = 2) => num.toString().padStart(len, \"0\");\n\nconst tokenHandlers: Record<\n string,\n (d: Date) => string\n> = {\n yyyy: (d) => pad(d.getFullYear(), 4),\n MM: (d) => pad(d.getMonth() + 1),\n dd: (d) => pad(d.getDate()),\n HH: (d) => pad(d.getHours()),\n hh: (d) => {\n const h = d.getHours() % 12 || 12;\n return pad(h);\n },\n mm: (d) => pad(d.getMinutes()),\n ss: (d) => pad(d.getSeconds()),\n a: (d) => (d.getHours() >= 12 ? \"PM\" : \"AM\"),\n};\n\nconst TOKENS = Object.keys(tokenHandlers).sort((a, b) => b.length - a.length);\nconst DATE_TOKENS = new Set([\"yyyy\", \"MM\", \"dd\"]);\nconst TIME_TOKENS = new Set([\"HH\", \"hh\", \"mm\", \"ss\", \"a\"]);\nconst DATETIME_TOKENS = new Set([...DATE_TOKENS, ...TIME_TOKENS]);\n\ntype DatePatternKind = \"date\" | \"time\" | \"datetime\";\n\nconst DATE_PRESETS: Record<string, string> = {\n iso: \"yyyy-MM-dd\",\n us: \"MM/dd/yyyy\",\n eu: \"dd.MM.yyyy\",\n};\n\nconst TIME_PRESETS: Record<string, string> = {\n iso: \"HH:mm:ss\",\n \"24h\": \"HH:mm\",\n \"12h\": \"hh:mm a\",\n};\n\nconst DATETIME_PRESETS: Record<string, string> = {\n iso: \"yyyy-MM-dd'T'HH:mm:ss'Z'\",\n \"iso-24h\": \"yyyy-MM-dd'T'HH:mm:ss'Z'\",\n \"iso-12h\": \"yyyy-MM-dd hh:mm a\",\n us: \"MM/dd/yyyy HH:mm\",\n \"us-24h\": \"MM/dd/yyyy HH:mm\",\n \"us-12h\": \"MM/dd/yyyy hh:mm a\",\n eu: \"dd.MM.yyyy HH:mm\",\n \"eu-24h\": \"dd.MM.yyyy HH:mm\",\n \"eu-12h\": \"dd.MM.yyyy hh:mm a\",\n};\n\nexport function parseIsoDate(value: string): Date | null {\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nexport function formatDateLite(date: Date, pattern: string): string {\n let out = \"\";\n let i = 0;\n let inLiteral = false;\n while (i < pattern.length) {\n const ch = pattern[i];\n if (ch === \"'\") {\n inLiteral = !inLiteral;\n i += 1;\n continue;\n }\n if (inLiteral) {\n out += ch;\n i += 1;\n continue;\n }\n let matched = false;\n for (const token of TOKENS) {\n if (pattern.startsWith(token, i)) {\n out += tokenHandlers[token](date);\n i += token.length;\n matched = true;\n break;\n }\n }\n if (!matched) {\n out += ch;\n i += 1;\n }\n }\n return out;\n}\n\nfunction isTokenAllowed(token: string, kind: DatePatternKind): boolean {\n if (kind === \"date\") return DATE_TOKENS.has(token);\n if (kind === \"time\") return TIME_TOKENS.has(token);\n return DATETIME_TOKENS.has(token);\n}\n\nfunction isPatternAllowed(pattern: string, kind: DatePatternKind): boolean {\n let i = 0;\n let inLiteral = false;\n while (i < pattern.length) {\n const ch = pattern[i];\n if (ch === \"'\") {\n inLiteral = !inLiteral;\n i += 1;\n continue;\n }\n if (inLiteral) {\n i += 1;\n continue;\n }\n let matched = false;\n for (const token of TOKENS) {\n if (pattern.startsWith(token, i)) {\n if (!isTokenAllowed(token, kind)) return false;\n i += token.length;\n matched = true;\n break;\n }\n }\n if (!matched) i += 1;\n }\n return true;\n}\n\nexport function coerceDatePattern(\n pattern: string | undefined,\n kind: DatePatternKind,\n): string {\n if (!pattern) {\n return kind === \"date\"\n ? DATE_PRESETS.iso\n : kind === \"time\"\n ? TIME_PRESETS.iso\n : DATETIME_PRESETS.iso;\n }\n\n if (kind === \"date\" && DATE_PRESETS[pattern]) return DATE_PRESETS[pattern];\n if (kind === \"time\" && TIME_PRESETS[pattern]) return TIME_PRESETS[pattern];\n if (kind === \"datetime\" && DATETIME_PRESETS[pattern]) return DATETIME_PRESETS[pattern];\n\n const fallback =\n kind === \"date\"\n ? DATE_PRESETS.iso\n : kind === \"time\"\n ? TIME_PRESETS.iso\n : DATETIME_PRESETS.iso;\n\n return isPatternAllowed(pattern, kind) ? pattern : fallback;\n}\n","import { coerceDatePattern, parseIsoDate } from \"./dateUtils\";\nimport type { ColumnSchema } from \"./types\";\n\nconst isValidDate = (d: Date) => !Number.isNaN(d.getTime());\n\nconst asEnumValue = (value: unknown) => {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"enum\") {\n return typeof obj.value === \"string\" ? obj.value : null;\n }\n }\n return null;\n};\n\nconst asTagsValues = (value: unknown) => {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) return value as string[];\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\") {\n const values = obj.values;\n return Array.isArray(values) && values.every((v) => typeof v === \"string\")\n ? (values as string[])\n : null;\n }\n }\n return null;\n};\n\nexport function validateCellValue(value: unknown, col: ColumnSchema): string | null {\n // MVP: avoid noisy \"required\" errors. Treat empty as valid.\n if (value === null || value === undefined) return null;\n\n switch (col.type) {\n case \"string\": {\n if (typeof value !== \"string\") return \"Expected a string\";\n if (col.string?.maxLength !== undefined && value.length > col.string.maxLength) {\n return `Too long (max ${col.string.maxLength})`;\n }\n if (col.string?.regex) {\n try {\n const re = new RegExp(col.string.regex);\n if (!re.test(value)) return \"Does not match pattern\";\n } catch {\n // ignore invalid regex config\n }\n }\n return null;\n }\n case \"number\": {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return \"Expected a number\";\n if (col.number?.signed === false && value < 0) return \"Expected a non-negative number\";\n return null;\n }\n case \"boolean\": {\n if (typeof value !== \"boolean\") return \"Expected a boolean\";\n return null;\n }\n case \"enum\": {\n const v = asEnumValue(value);\n if (!v) return \"Expected an enum value\";\n const allowCustom = col.enum?.allowCustom ?? false;\n const options = col.enum?.options ?? [];\n if (!allowCustom && options.length && !options.includes(v)) return \"Not in allowed options\";\n return null;\n }\n case \"tags\": {\n const values = asTagsValues(value);\n if (!values) return \"Expected a list of tags\";\n const allowCustom = col.tags?.allowCustom ?? false;\n const options = col.tags?.options ?? [];\n if (!allowCustom && options.length) {\n for (const v of values) {\n if (!options.includes(v)) return \"Contains an unknown tag\";\n }\n }\n return null;\n }\n case \"date\":\n case \"time\":\n case \"datetime\": {\n // Enforce allowed format tokens per type; fall back to ISO preset if invalid.\n if (col.type === \"date\") coerceDatePattern(col.dateFormat, \"date\");\n else if (col.type === \"time\") coerceDatePattern(col.timeFormat, \"time\");\n else coerceDatePattern(col.dateTimeFormat, \"datetime\");\n if (value instanceof Date) return isValidDate(value) ? null : \"Invalid date\";\n if (typeof value === \"string\") {\n const d = parseIsoDate(value);\n return d && isValidDate(d) ? null : \"Invalid date/time\";\n }\n return \"Expected a date/time string\";\n }\n default:\n return null;\n }\n}\n","import { generateId } from \"./utils\";\nimport type {\n CellDiagnostic,\n ColumnSchema,\n ColumnDiagnosticFilter,\n ConditionalStyleFn,\n InternalRow,\n RowObject,\n Schema,\n StyleDelta,\n ViewFilterValues,\n ViewSort,\n View,\n} from \"./types\";\nimport { validateCellValue } from \"./validation\";\n\ntype AnyFilter = { key?: unknown; kind?: unknown };\n\nexport class DataModel {\n private schema: Schema<any>;\n private view: View;\n private rows: InternalRow[] = [];\n private baseIndexById = new Map<string, number>();\n private dataVersion = 0;\n private visibleRowsCache: {\n version: number;\n key: string;\n rows: InternalRow[];\n indexById: Map<string, number>;\n } | null = null;\n private distinctValueCache = new Map<\n string,\n {\n version: number;\n values: Array<{ value: unknown; label: string }>;\n hasBlanks: boolean;\n total: number;\n }\n >();\n private pending: Map<string, Record<string, unknown>> = new Map();\n private rowVersion: Map<string, number> = new Map();\n private listeners = new Set<() => void>();\n private cellStyles = new Map<string, StyleDelta>();\n private cellConditionalStyles = new Map<string, ConditionalStyleFn>();\n private computedCache = new Map<\n string,\n {\n version: number;\n formulaRef: unknown;\n value: unknown;\n textOverride?: string;\n diagnostic: CellDiagnostic | null;\n }\n >();\n private conditionalCache = new Map<\n string,\n {\n version: number;\n fnRef: unknown;\n delta: StyleDelta | null;\n diagnostic: CellDiagnostic | null;\n forceErrorText: boolean;\n }\n >();\n private rowConditionalCache = new Map<\n string,\n {\n version: number;\n fnRef: unknown;\n delta: StyleDelta | null;\n diagnostic: CellDiagnostic | null;\n forceErrorText: boolean;\n }\n >();\n private formulaDiagnostics = new Map<string, CellDiagnostic>();\n private conditionalDiagnostics = new Map<string, CellDiagnostic>();\n private baseValidationErrors = new Map<\n string,\n { rowId: string; colKey: string; message: string }\n >();\n private uniqueValidationErrors = new Map<\n string,\n { rowId: string; colKey: string; message: string }\n >();\n private notifySuspended = false;\n private notifyDirty = false;\n\n constructor(dataset: RowObject[] | undefined, schema: Schema<any>, view: View) {\n this.schema = schema;\n this.view = view;\n this.setData(dataset ?? []);\n }\n\n public subscribe(listener: () => void) {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify() {\n this.visibleRowsCache = null;\n this.distinctValueCache.clear();\n if (this.notifySuspended) {\n this.notifyDirty = true;\n return;\n }\n for (const l of this.listeners) l();\n }\n\n public batchUpdate(run: () => void) {\n this.notifySuspended = true;\n try {\n run();\n } finally {\n this.notifySuspended = false;\n if (this.notifyDirty) {\n this.notifyDirty = false;\n this.notify();\n }\n }\n }\n\n public setData(dataset: RowObject[] | undefined) {\n this.dataVersion += 1;\n this.pending.clear();\n this.cellStyles.clear();\n this.cellConditionalStyles.clear();\n this.computedCache.clear();\n this.conditionalCache.clear();\n this.rowConditionalCache.clear();\n this.formulaDiagnostics.clear();\n this.conditionalDiagnostics.clear();\n this.baseValidationErrors.clear();\n this.uniqueValidationErrors.clear();\n this.rows = (dataset ?? []).map((row, idx) => {\n const id = generateId();\n this.rowVersion.set(id, 0);\n return {\n id,\n raw: row,\n displayIndex: idx + 1,\n };\n });\n this.rebuildBaseIndex();\n this.recomputeValidationErrors();\n this.notify();\n }\n\n public setSchema(schema: Schema<any>) {\n this.dataVersion += 1;\n this.schema = schema;\n this.computedCache.clear();\n this.conditionalCache.clear();\n this.rowConditionalCache.clear();\n this.formulaDiagnostics.clear();\n this.conditionalDiagnostics.clear();\n this.recomputeValidationErrors();\n this.notify();\n }\n\n public setView(view: View) {\n this.dataVersion += 1;\n // MVP constraint: allow `sorts` as array, but enforce at most one sort.\n if (Array.isArray(view.sorts) && view.sorts.length > 1) {\n this.view = { ...view, sorts: view.sorts.slice(0, 1) };\n } else {\n this.view = view;\n }\n this.notify();\n }\n\n public getSchema(): Schema<any> {\n return { ...this.schema, columns: this.getColumns() } as Schema<any>;\n }\n\n public getColumns(): ColumnSchema<any>[] {\n return this.schema.columns;\n }\n\n public getRowConditionalStyleFn(): ConditionalStyleFn | null {\n return this.schema.row?.conditionalStyle ?? null;\n }\n\n public getView() {\n return this.view;\n }\n\n public getDataVersion() {\n return this.dataVersion;\n }\n\n public getFullSchema(): Schema<any> {\n return this.schema;\n }\n\n public listRows(): InternalRow[] {\n return this.computeVisibleRows().rows;\n }\n\n public listAllRows(): InternalRow[] {\n return this.rows;\n }\n\n public getAllRowCount() {\n return this.rows.length;\n }\n\n private findRow(rowId: string): { row: InternalRow; index: number } | null {\n const index = this.baseIndexById.get(rowId);\n if (index === undefined) return null;\n const row = this.rows[index];\n if (row && row.id === rowId) return { row, index };\n // Defensive fallback for unexpected external mutation of `rows`.\n const slowIndex = this.rows.findIndex((r) => r.id === rowId);\n if (slowIndex < 0) return null;\n const slowRow = this.rows[slowIndex];\n if (!slowRow) return null;\n this.rebuildBaseIndex();\n return { row: slowRow, index: slowIndex };\n }\n\n public getRowHeight(rowId: string) {\n return this.view.rowHeights?.[rowId];\n }\n\n public setRowHeight(rowId: string, height: number) {\n if (!this.view.rowHeights) this.view.rowHeights = {};\n const prev = this.view.rowHeights[rowId];\n if (prev === height) return;\n this.view.rowHeights[rowId] = height;\n this.notify();\n }\n\n public setRowHeightsBulk(next: Record<string, number>) {\n const entries = Object.entries(next);\n if (entries.length === 0) return;\n if (!this.view.rowHeights) this.view.rowHeights = {};\n let changed = false;\n for (const [rowId, height] of entries) {\n if (this.view.rowHeights[rowId] === height) continue;\n this.view.rowHeights[rowId] = height;\n changed = true;\n }\n if (changed) this.notify();\n }\n\n public getCell(rowId: string, key: string) {\n const found = this.findRow(rowId);\n if (!found) return undefined;\n const row = found.row;\n const pendingRow = this.pending.get(rowId);\n if (pendingRow && key in pendingRow) return pendingRow[key];\n return row.raw[key];\n }\n\n public getRawCell(rowId: string, key: string) {\n const found = this.findRow(rowId);\n if (!found) return undefined;\n const row = found.row;\n return row.raw[key];\n }\n\n public isRowReadonly(rowId: string) {\n const found = this.findRow(rowId);\n if (!found) return false;\n const row = found.row;\n return Boolean((row.raw as Record<string, unknown>)._readonly);\n }\n\n public isColumnReadonly(colKey: string) {\n const col = this.schema.columns.find((c) => c.key === colKey);\n return Boolean(col?.readonly || col?.formula);\n }\n\n public isReadonly(rowId: string, colKey: string) {\n return this.isRowReadonly(rowId) || this.isColumnReadonly(colKey);\n }\n\n public setCell(rowId: string, key: string, value: unknown, committed: boolean) {\n this.dataVersion += 1;\n const found = this.findRow(rowId);\n if (!found) return;\n const row = found.row;\n const bumpVersion = () => {\n const prev = this.rowVersion.get(rowId) ?? 0;\n this.rowVersion.set(rowId, prev + 1);\n };\n if (committed) {\n row.raw[key] = value;\n this.pending.delete(rowId);\n bumpVersion();\n } else {\n const rawVal = this.getRawCell(rowId, key);\n const current = this.pending.get(rowId) ?? {};\n if (this.isEqual(rawVal, value)) {\n delete current[key];\n } else {\n current[key] = value;\n }\n const hasKeys = Object.keys(current).length > 0;\n if (hasKeys) {\n this.pending.set(rowId, current);\n } else {\n this.pending.delete(rowId);\n }\n bumpVersion();\n }\n this.updateValidationForCell(rowId, key, this.getCell(rowId, key));\n const col = this.schema.columns.find((c) => c.key === key);\n if (col?.unique) this.recomputeUniqueValidationForColumn(key);\n // Invalidate computed/conditional caches for the row by version mismatch; clear diagnostics eagerly.\n this.clearDiagnosticsForCell(rowId, key);\n this.notify();\n }\n\n public applyPending(rowId: string) {\n this.dataVersion += 1;\n const pendingRow = this.pending.get(rowId);\n if (!pendingRow) return;\n const found = this.findRow(rowId);\n if (!found) return;\n const row = found.row;\n const uniqueCols = new Set<string>();\n for (const [key, val] of Object.entries(pendingRow)) {\n row.raw[key] = val;\n this.updateValidationForCell(rowId, key, val);\n const col = this.schema.columns.find((c) => String(c.key) === String(key));\n if (col?.unique) uniqueCols.add(col.key);\n this.clearDiagnosticsForCell(rowId, key);\n }\n this.pending.delete(rowId);\n for (const colKey of uniqueCols) this.recomputeUniqueValidationForColumn(colKey);\n this.notify();\n }\n\n public clearPending(rowId: string) {\n this.dataVersion += 1;\n this.pending.delete(rowId);\n this.notify();\n }\n\n public getPending() {\n return this.pending;\n }\n\n public hasPending(rowId: string, key: string) {\n const p = this.pending.get(rowId);\n if (!p) return false;\n return key in p;\n }\n\n public insertRow(rowData: InternalRow[\"raw\"]) {\n return this.insertRowAt(rowData, this.rows.length);\n }\n\n public insertRowAt(rowData: InternalRow[\"raw\"], index: number, forcedId?: string) {\n this.dataVersion += 1;\n const id = forcedId ?? generateId();\n const clamped = Math.max(0, Math.min(index, this.rows.length));\n this.rows.splice(clamped, 0, { id, raw: rowData, displayIndex: 0 });\n this.reindexRows();\n this.rowVersion.set(id, 0);\n this.rebuildBaseIndex();\n this.recomputeValidationErrors();\n this.notify();\n return id;\n }\n\n public removeRow(rowId: string): { row: InternalRow; index: number } | null {\n this.dataVersion += 1;\n const found = this.findRow(rowId);\n if (!found) return null;\n const removed = this.rows.splice(found.index, 1)[0];\n if (!removed) return null;\n this.pending.delete(rowId);\n this.rowVersion.delete(rowId);\n this.reindexRows();\n this.rebuildBaseIndex();\n this.recomputeValidationErrors();\n this.notify();\n return { row: removed, index: found.index };\n }\n\n public getDisplayIndex(rowId: string) {\n return this.findRow(rowId)?.row.displayIndex ?? null;\n }\n\n public getRowIndex(rowId: string) {\n return this.computeVisibleRows().indexById.get(rowId) ?? -1;\n }\n\n public getBaseRowIndex(rowId: string) {\n return this.baseIndexById.get(rowId) ?? -1;\n }\n\n public getColumnIndex(colKey: string) {\n return this.getColumns().findIndex((c) => c.key === colKey);\n }\n\n public getColumnByIndex(colIndex: number) {\n return this.getColumns()[colIndex] ?? null;\n }\n\n public getRowByIndex(rowIndex: number) {\n return this.listRows()[rowIndex] ?? null;\n }\n\n private rebuildBaseIndex() {\n this.baseIndexById.clear();\n for (let i = 0; i < this.rows.length; i += 1) {\n const r = this.rows[i];\n if (r) this.baseIndexById.set(r.id, i);\n }\n }\n\n private getFilterSortKey(options?: {\n excludeColumnKey?: string;\n includeSort?: boolean;\n }) {\n const exclude = options?.excludeColumnKey;\n const includeSort = options?.includeSort ?? true;\n const view = this.view;\n const filters = (view.filters ?? [])\n .filter((f) => {\n if (exclude === undefined) return true;\n const key = (f as AnyFilter | null | undefined)?.key;\n return String(key) !== String(exclude);\n })\n .map((f) => {\n const kind = (f as AnyFilter | null | undefined)?.kind;\n if (kind === \"values\") {\n const vf = f as ViewFilterValues;\n return {\n kind: \"values\" as const,\n key: String(vf.key),\n includeBlanks: Boolean(vf.includeBlanks),\n values: (vf.values ?? []).map((v) => this.stableValueKey(v)),\n };\n }\n // Unknown filter kind (or legacy op filter) => keep a stable representation for caching.\n const opf = f as Record<string, unknown>;\n return {\n kind: \"op\" as const,\n key: String(opf.key),\n op: String(opf.op ?? \"\"),\n value: this.stableValueKey(opf.value),\n };\n })\n .sort((a, b) => (a.key === b.key ? (a.kind < b.kind ? -1 : 1) : a.key < b.key ? -1 : 1));\n\n const columnDiagnosticsEntries = Object.entries(view.columnDiagnostics ?? {})\n .filter(([k]) => (exclude !== undefined ? String(k) !== String(exclude) : true))\n .map(([k, v]) => ({\n key: String(k),\n errors: Boolean((v as ColumnDiagnosticFilter | undefined)?.errors),\n warnings: Boolean((v as ColumnDiagnosticFilter | undefined)?.warnings),\n }))\n .filter((x) => x.errors || x.warnings)\n .sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n\n const sorts = includeSort\n ? (view.sorts ?? []).slice(0, 1).map((s) => ({ key: String(s.key), dir: s.dir }))\n : [];\n\n return JSON.stringify({ filters, columnDiagnosticsEntries, sorts });\n }\n\n private stableValueKey(value: unknown) {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (value instanceof Date) return `date:${value.getTime()}`;\n if (typeof value === \"string\") return `s:${value}`;\n if (typeof value === \"number\") return `n:${Number.isNaN(value) ? \"NaN\" : String(value)}`;\n if (typeof value === \"boolean\") return `b:${value ? \"1\" : \"0\"}`;\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return `enum:${obj.value}`;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return `tags:${obj.values.filter((x) => typeof x === \"string\").join(\"|\")}`;\n }\n }\n try {\n return `json:${JSON.stringify(value)}`;\n } catch {\n return `str:${String(value)}`;\n }\n }\n\n private isBlankValue(value: unknown) {\n return value === null || value === undefined || value === \"\";\n }\n\n private resolveFilterColumnKey(key: string) {\n const cols = this.getColumns();\n const found = cols.find((c) => String(c.key) === String(key));\n return found?.key ?? key;\n }\n\n private getFilterCellValue(rowId: string, colKey: string) {\n const col = this.getColumns().find((c) => String(c.key) === String(colKey));\n if (!col) return this.getCell(rowId, colKey);\n return this.resolveCellValue(rowId, col).value;\n }\n\n private valuesFilterMatches(rowId: string, filter: ViewFilterValues) {\n const colKey = this.resolveFilterColumnKey(filter.key);\n const value = this.getFilterCellValue(rowId, colKey);\n if (this.isBlankValue(value)) return Boolean(filter.includeBlanks);\n if (!filter.values || filter.values.length === 0) return false;\n const valueKey = this.stableValueKey(value);\n for (const v of filter.values) {\n if (this.stableValueKey(v) === valueKey) return true;\n }\n return false;\n }\n\n private rowPassesColumnDiagnostics(\n rowId: string,\n colKeyStr: string,\n diag: ColumnDiagnosticFilter,\n ) {\n const errors = Boolean(diag.errors);\n const warnings = Boolean(diag.warnings);\n if (!errors && !warnings) return true;\n const colKey = this.resolveFilterColumnKey(colKeyStr);\n // Ensure diagnostics are computed for this cell before filtering by diagnostics.\n const col = this.getColumns().find((c) => String(c.key) === String(colKey));\n if (col) {\n this.resolveCellValue(rowId, col);\n this.resolveConditionalStyle(rowId, col);\n }\n const marker = this.getCellMarker(rowId, colKey);\n if (!marker) return false;\n if (marker.level === \"error\") return errors;\n return warnings;\n }\n\n private computeRowsAfterFilter(options?: {\n excludeColumnKey?: string;\n includeSort?: boolean;\n }) {\n const exclude = options?.excludeColumnKey;\n const includeSort = options?.includeSort ?? true;\n const view = this.view;\n const schema = this.getSchema();\n\n const filters = (view.filters ?? []).filter((f) => {\n if (exclude === undefined) return true;\n const key = (f as AnyFilter | null | undefined)?.key;\n return String(key) !== String(exclude);\n });\n const diagEntries = Object.entries(view.columnDiagnostics ?? {}).filter(([k]) =>\n exclude !== undefined ? String(k) !== String(exclude) : true,\n );\n\n const filtered: InternalRow[] = [];\n for (const row of this.rows) {\n let ok = true;\n for (const f of filters) {\n const kind = (f as AnyFilter | null | undefined)?.kind;\n if (kind === \"values\") {\n if (!this.valuesFilterMatches(row.id, f as ViewFilterValues)) {\n ok = false;\n break;\n }\n // matched values filter\n }\n // Unknown filter kind (or legacy op filter) => ignore in MVP.\n }\n if (!ok) continue;\n for (const [k, diag] of diagEntries) {\n if (!this.rowPassesColumnDiagnostics(row.id, k, diag as ColumnDiagnosticFilter)) {\n ok = false;\n break;\n }\n }\n if (!ok) continue;\n filtered.push(row);\n }\n\n if (!includeSort) return filtered;\n\n const sort = (view.sorts ?? []).slice(0, 1)[0] as ViewSort | undefined;\n if (!sort) return filtered;\n const sortCol = schema.columns.find((c) => String(c.key) === String(sort.key));\n if (!sortCol) return filtered;\n\n const dir = sort.dir === \"desc\" ? -1 : 1;\n const withKeys = filtered.map((row) => {\n const v = this.getFilterCellValue(row.id, sortCol.key);\n const blank = this.isBlankValue(v);\n const baseIndex = this.baseIndexById.get(row.id) ?? 0;\n return { row, v, blank, baseIndex };\n });\n\n const compare = (a: unknown, b: unknown) => {\n if (a === b) return 0;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"boolean\" && typeof b === \"boolean\") return a === b ? 0 : a ? 1 : -1;\n const as = a instanceof Date ? a.toISOString() : typeof a === \"string\" ? a : String(a);\n const bs = b instanceof Date ? b.toISOString() : typeof b === \"string\" ? b : String(b);\n if (as === bs) return 0;\n return as < bs ? -1 : 1;\n };\n\n withKeys.sort((a, b) => {\n if (a.blank && b.blank) return a.baseIndex - b.baseIndex;\n if (a.blank) return 1;\n if (b.blank) return -1;\n const c = compare(a.v, b.v);\n if (c !== 0) return c * dir;\n return a.baseIndex - b.baseIndex;\n });\n\n return withKeys.map((x) => x.row);\n }\n\n private computeVisibleRows() {\n const key = this.getFilterSortKey();\n const cached = this.visibleRowsCache;\n if (cached && cached.version === this.dataVersion && cached.key === key) return cached;\n\n const base = this.computeRowsAfterFilter({ includeSort: true });\n // Keep `displayIndex` stable (pre-filter) and only change the visible ordering.\n const rows = base;\n const indexById = new Map<string, number>();\n for (let i = 0; i < rows.length; i += 1) {\n const r = rows[i];\n if (r) indexById.set(r.id, i);\n }\n const next = { version: this.dataVersion, key, rows, indexById };\n this.visibleRowsCache = next;\n return next;\n }\n\n public getDistinctValuesForColumn(colKey: string) {\n const cacheKey = `${String(colKey)}|${this.getFilterSortKey({ excludeColumnKey: colKey, includeSort: false })}`;\n const cached = this.distinctValueCache.get(cacheKey);\n if (cached && cached.version === this.dataVersion) return cached;\n\n const rows = this.computeRowsAfterFilter({ excludeColumnKey: colKey, includeSort: false });\n const col = this.getSchema().columns.find((c) => String(c.key) === String(colKey));\n if (!col) {\n const empty = { version: this.dataVersion, values: [], hasBlanks: false, total: 0 };\n this.distinctValueCache.set(cacheKey, empty);\n return empty;\n }\n\n const map = new Map<string, { value: unknown; label: string }>();\n let hasBlanks = false;\n for (const row of rows) {\n const v = this.getFilterCellValue(row.id, col.key);\n if (this.isBlankValue(v)) {\n hasBlanks = true;\n continue;\n }\n const k = this.stableValueKey(v);\n if (map.has(k)) continue;\n const label = (() => {\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\" && v) {\n const obj = v as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n return String(v);\n })();\n map.set(k, { value: v, label });\n }\n\n const values = [...map.values()].sort((a, b) =>\n a.label < b.label ? -1 : a.label > b.label ? 1 : 0,\n );\n const next = {\n version: this.dataVersion,\n values,\n hasBlanks,\n total: values.length + (hasBlanks ? 1 : 0),\n };\n this.distinctValueCache.set(cacheKey, next);\n return next;\n }\n\n private cellStyleKey(rowId: string, colKey: string) {\n return `${rowId}::${String(colKey)}`;\n }\n\n private clearDiagnosticsForCell(rowId: string, colKey: string) {\n const key = this.cellStyleKey(rowId, colKey);\n this.formulaDiagnostics.delete(key);\n this.conditionalDiagnostics.delete(key);\n }\n\n public getCellDiagnostic(rowId: string, colKey: string): CellDiagnostic | null {\n const key = this.cellStyleKey(rowId, colKey);\n const a = this.formulaDiagnostics.get(key) ?? null;\n const b = this.conditionalDiagnostics.get(key) ?? null;\n if (!a) return b;\n if (!b) return a;\n if (a.level === \"error\") return a;\n if (b.level === \"error\") return b;\n // Both warnings: prefer formula message (more likely to explain the value).\n return a;\n }\n\n public getDiagnostics() {\n const keys = new Set<string>();\n for (const k of this.formulaDiagnostics.keys()) keys.add(k);\n for (const k of this.conditionalDiagnostics.keys()) keys.add(k);\n return [...keys].map((key) => {\n const sep = key.indexOf(\"::\");\n const rowId = sep >= 0 ? key.slice(0, sep) : key;\n const colKey = sep >= 0 ? key.slice(sep + 2) : \"\";\n return { rowId, colKey, diag: this.getCellDiagnostic(rowId, colKey) };\n });\n }\n\n private getRowObjectEffective(rowId: string): Record<string, unknown> | null {\n const found = this.findRow(rowId);\n if (!found) return null;\n const row = found.row;\n const pendingRow = this.pending.get(rowId);\n if (!pendingRow || Object.keys(pendingRow).length === 0)\n return row.raw as Record<string, unknown>;\n const merged: Record<string, unknown> = { ...(row.raw as Record<string, unknown>) };\n for (const [k, v] of Object.entries(pendingRow)) {\n merged[k] = v;\n }\n return merged;\n }\n\n public resolveCellValue(\n rowId: string,\n col: ColumnSchema,\n ): {\n value: unknown;\n textOverride?: string;\n diagnostic: CellDiagnostic | null;\n } {\n if (!col.formula) {\n return { value: this.getCell(rowId, col.key), diagnostic: null };\n }\n const version = this.getRowVersion(rowId);\n const key = this.cellStyleKey(rowId, col.key);\n const cached = this.computedCache.get(key);\n if (cached && cached.version === version && cached.formulaRef === col.formula) {\n if (cached.diagnostic) this.formulaDiagnostics.set(key, cached.diagnostic);\n return {\n value: cached.value,\n textOverride: cached.textOverride,\n diagnostic: cached.diagnostic,\n };\n }\n const data = this.getRowObjectEffective(rowId);\n if (!data) {\n const value = this.getCell(rowId, col.key);\n const next = {\n version,\n formulaRef: col.formula,\n value,\n diagnostic: null as CellDiagnostic | null,\n };\n this.computedCache.set(key, next);\n return { value, diagnostic: null };\n }\n try {\n const out: unknown = col.formula(data);\n if (Array.isArray(out) && out.length >= 2 && out[1] instanceof Error) {\n const diag: CellDiagnostic = {\n level: \"warning\",\n message: out[1].message,\n source: \"formula\",\n };\n const value = out[0];\n this.computedCache.set(key, { version, formulaRef: col.formula, value, diagnostic: diag });\n this.formulaDiagnostics.set(key, diag);\n return { value, diagnostic: diag };\n }\n const value = out;\n this.computedCache.set(key, { version, formulaRef: col.formula, value, diagnostic: null });\n this.formulaDiagnostics.delete(key);\n return { value, diagnostic: null };\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n const diag: CellDiagnostic = { level: \"error\", message, source: \"formula\" };\n this.computedCache.set(key, {\n version,\n formulaRef: col.formula,\n value: null,\n textOverride: \"#ERROR\",\n diagnostic: diag,\n });\n this.formulaDiagnostics.set(key, diag);\n return { value: null, textOverride: \"#ERROR\", diagnostic: diag };\n }\n }\n\n public setCellConditionalStyle(rowId: string, colKey: string, fn: ConditionalStyleFn | null) {\n const key = this.cellStyleKey(rowId, colKey);\n if (!fn) this.cellConditionalStyles.delete(key);\n else this.cellConditionalStyles.set(key, fn);\n this.conditionalCache.delete(key);\n this.clearDiagnosticsForCell(rowId, colKey);\n this.notify();\n }\n\n private evalConditionalStyleFn(\n fn: ConditionalStyleFn,\n data: Record<string, unknown>,\n ): { delta: StyleDelta | null; diagnostic: CellDiagnostic | null; forceErrorText: boolean } {\n try {\n const out = fn(data);\n if (out instanceof Error) {\n return {\n delta: null,\n diagnostic: { level: \"warning\", message: out.message, source: \"conditionalStyle\" },\n forceErrorText: false,\n };\n }\n return { delta: out ?? null, diagnostic: null, forceErrorText: false };\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return {\n delta: null,\n diagnostic: { level: \"error\", message, source: \"conditionalStyle\" },\n forceErrorText: true,\n };\n }\n }\n\n private resolveRowConditionalStyle(rowId: string): {\n delta: StyleDelta | null;\n diagnostic: CellDiagnostic | null;\n forceErrorText: boolean;\n } {\n const fn = this.getRowConditionalStyleFn();\n if (!fn) return { delta: null, diagnostic: null, forceErrorText: false };\n const version = this.getRowVersion(rowId);\n const cached = this.rowConditionalCache.get(rowId);\n if (cached && cached.version === version && cached.fnRef === fn) {\n return {\n delta: cached.delta,\n diagnostic: cached.diagnostic,\n forceErrorText: cached.forceErrorText,\n };\n }\n const data = this.getRowObjectEffective(rowId);\n if (!data) {\n const next = { version, fnRef: fn, delta: null, diagnostic: null, forceErrorText: false };\n this.rowConditionalCache.set(rowId, next);\n return { delta: null, diagnostic: null, forceErrorText: false };\n }\n const res = this.evalConditionalStyleFn(fn, data);\n this.rowConditionalCache.set(rowId, { version, fnRef: fn, ...res });\n return res;\n }\n\n public resolveConditionalStyle(\n rowId: string,\n col: ColumnSchema,\n ): {\n delta: StyleDelta | null;\n diagnostic: CellDiagnostic | null;\n forceErrorText: boolean;\n } {\n const version = this.getRowVersion(rowId);\n const key = this.cellStyleKey(rowId, col.key);\n const data = this.getRowObjectEffective(rowId);\n const rowRes = this.resolveRowConditionalStyle(rowId);\n\n const applyDelta = (base: StyleDelta | null, next: StyleDelta | null) => {\n if (!next) return base;\n if (!base) return { ...next };\n return { ...base, ...next };\n };\n\n let delta: StyleDelta | null = null;\n let diagnostic: CellDiagnostic | null = null;\n let forceErrorText = false;\n\n // Lowest within the conditional layer: row-level.\n delta = applyDelta(delta, rowRes.delta);\n if (rowRes.diagnostic) diagnostic = rowRes.diagnostic;\n forceErrorText = forceErrorText || rowRes.forceErrorText;\n\n // Column-level conditional style.\n if (col.conditionalStyle && data) {\n const colCacheKey = `${rowId}::${String(col.key)}::col`;\n const cached = this.conditionalCache.get(colCacheKey);\n if (cached && cached.version === version && cached.fnRef === col.conditionalStyle) {\n delta = applyDelta(delta, cached.delta);\n if (cached.diagnostic && (diagnostic === null || diagnostic.level !== \"error\"))\n diagnostic = cached.diagnostic;\n forceErrorText = forceErrorText || cached.forceErrorText;\n } else {\n const res = this.evalConditionalStyleFn(col.conditionalStyle, data);\n this.conditionalCache.set(colCacheKey, { version, fnRef: col.conditionalStyle, ...res });\n delta = applyDelta(delta, res.delta);\n if (res.diagnostic && (diagnostic === null || diagnostic.level !== \"error\"))\n diagnostic = res.diagnostic;\n forceErrorText = forceErrorText || res.forceErrorText;\n }\n }\n\n // Highest within the conditional layer: cell-level.\n const cellFn = this.cellConditionalStyles.get(key);\n if (cellFn && data) {\n const cached = this.conditionalCache.get(key);\n if (cached && cached.version === version && cached.fnRef === cellFn) {\n delta = applyDelta(delta, cached.delta);\n if (cached.diagnostic && (diagnostic === null || diagnostic.level !== \"error\"))\n diagnostic = cached.diagnostic;\n forceErrorText = forceErrorText || cached.forceErrorText;\n } else {\n const res = this.evalConditionalStyleFn(cellFn, data);\n this.conditionalCache.set(key, { version, fnRef: cellFn, ...res });\n delta = applyDelta(delta, res.delta);\n if (res.diagnostic && (diagnostic === null || diagnostic.level !== \"error\"))\n diagnostic = res.diagnostic;\n forceErrorText = forceErrorText || res.forceErrorText;\n }\n }\n\n if (diagnostic) this.conditionalDiagnostics.set(key, diagnostic);\n else this.conditionalDiagnostics.delete(key);\n\n return { delta, diagnostic, forceErrorText };\n }\n\n public getValidationErrors() {\n const merged = new Map<string, { rowId: string; colKey: string; message: string }>();\n for (const [k, v] of this.baseValidationErrors.entries()) merged.set(k, { ...v });\n for (const [k, v] of this.uniqueValidationErrors.entries()) {\n const prev = merged.get(k);\n if (!prev) merged.set(k, { ...v });\n else merged.set(k, { ...prev, message: `${prev.message}\\n${v.message}` });\n }\n const out = [...merged.values()];\n out.sort((a, b) => {\n const ra = this.getRowIndex(a.rowId);\n const rb = this.getRowIndex(b.rowId);\n if (ra !== rb) return ra - rb;\n const ca = this.getColumnIndex(a.colKey);\n const cb = this.getColumnIndex(b.colKey);\n return ca - cb;\n });\n return out;\n }\n\n public getCellValidationMessage(rowId: string, colKey: string): string | null {\n const key = this.cellStyleKey(rowId, colKey);\n const a = this.baseValidationErrors.get(key)?.message ?? null;\n const b = this.uniqueValidationErrors.get(key)?.message ?? null;\n if (!a) return b;\n if (!b) return a;\n return `${a}\\n${b}`;\n }\n\n public getCellMarker(\n rowId: string,\n colKey: string,\n ): { level: \"warning\" | \"error\"; message: string } | null {\n const diag = this.getCellDiagnostic(rowId, colKey);\n const validation = this.getCellValidationMessage(rowId, colKey);\n if (!diag && !validation) return null;\n const level: \"warning\" | \"error\" = validation ? \"error\" : (diag?.level ?? \"warning\");\n const message = [diag?.message ?? null, validation].filter(Boolean).join(\"\\n\");\n return { level, message };\n }\n\n private updateValidationForCell(rowId: string, colKey: string, value: unknown) {\n const col = this.schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return;\n const msg = validateCellValue(value, col);\n const key = this.cellStyleKey(rowId, colKey);\n if (!msg) this.baseValidationErrors.delete(key);\n else this.baseValidationErrors.set(key, { rowId, colKey, message: msg });\n }\n\n private recomputeValidationErrors() {\n this.baseValidationErrors.clear();\n this.uniqueValidationErrors.clear();\n for (const row of this.rows) {\n for (const col of this.schema.columns) {\n const v = this.getCell(row.id, col.key);\n this.updateValidationForCell(row.id, col.key, v);\n }\n }\n for (const col of this.getColumns()) {\n if (!col.unique) continue;\n this.recomputeUniqueValidationForColumn(col.key);\n }\n }\n\n private normalizeUniqueValue(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") return value === \"\" ? null : value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (value instanceof Date) return String(value.getTime());\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") {\n return obj.value === \"\" ? null : obj.value;\n }\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n const joined = obj.values.filter((x) => typeof x === \"string\").join(\",\");\n return joined === \"\" ? null : joined;\n }\n }\n return String(value);\n }\n\n private recomputeUniqueValidationForColumn(colKey: string) {\n const colKeyStr = String(colKey);\n for (const k of Array.from(this.uniqueValidationErrors.keys())) {\n const sep = k.indexOf(\"::\");\n const existingCol = sep >= 0 ? k.slice(sep + 2) : \"\";\n if (existingCol === colKeyStr) this.uniqueValidationErrors.delete(k);\n }\n const valueToRows = new Map<string, string[]>();\n for (const row of this.rows) {\n const v = this.getCell(row.id, colKey);\n const norm = this.normalizeUniqueValue(v);\n if (!norm) continue;\n const list = valueToRows.get(norm) ?? [];\n list.push(row.id);\n valueToRows.set(norm, list);\n }\n for (const rowIds of valueToRows.values()) {\n if (rowIds.length < 2) continue;\n const display = rowIds\n .map((rowId) => this.getDisplayIndex(rowId))\n .filter((x): x is number => typeof x === \"number\" && Number.isFinite(x))\n .sort((a, b) => a - b);\n const rowList = display.length ? display.join(\", \") : rowIds.join(\", \");\n for (const rowId of rowIds) {\n const key = this.cellStyleKey(rowId, colKey);\n this.uniqueValidationErrors.set(key, {\n rowId,\n colKey,\n message: `Duplicate value\\nRows: ${rowList}`,\n });\n }\n }\n }\n\n public getCellStyle(rowId: string, colKey: string): StyleDelta | null {\n return this.cellStyles.get(this.cellStyleKey(rowId, colKey)) ?? null;\n }\n\n public setCellStyle(rowId: string, colKey: string, style: StyleDelta | null) {\n const key = this.cellStyleKey(rowId, colKey);\n if (!style || Object.keys(style).length === 0) this.cellStyles.delete(key);\n else this.cellStyles.set(key, style);\n this.notify();\n }\n\n public updateColumnStyle(\n colKey: string,\n updater:\n | ColumnSchema[\"style\"]\n | ((oldValue: ColumnSchema[\"style\"] | undefined) => ColumnSchema[\"style\"] | undefined),\n ) {\n const col = this.schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return;\n const next = typeof updater === \"function\" ? updater(col.style) : updater;\n col.style = next;\n this.notify();\n }\n\n private isEqual(a: unknown, b: unknown) {\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n return Object.is(a, b);\n }\n\n public getRowVersion(rowId: string) {\n return this.rowVersion.get(rowId) ?? 0;\n }\n\n private reindexRows() {\n let idx = 1;\n for (const row of this.rows) {\n row.displayIndex = idx;\n idx += 1;\n }\n }\n}\n","import type { DataModel } from \"./dataModel\";\nimport type { CellAddress } from \"./types\";\n\nexport type ResolvedCellTarget = {\n rowId: string;\n colKey: string;\n rowIndex: number;\n colIndex: number;\n};\n\nexport function resolveCellAddress(dataModel: DataModel, address: CellAddress): ResolvedCellTarget | null {\n const schema = dataModel.getSchema();\n const rows = dataModel.listRows();\n\n const resolveByIndex = (rowIndex: number, colIndex: number): ResolvedCellTarget | null => {\n if (!Number.isInteger(rowIndex) || !Number.isInteger(colIndex)) return null;\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n if (colIndex < 0 || colIndex >= schema.columns.length) return null;\n const row = rows[rowIndex]!;\n const col = schema.columns[colIndex]!;\n return { rowId: row.id, colKey: col.key, rowIndex, colIndex };\n };\n\n const resolveByKeys = (rowId: string, colKey: string): ResolvedCellTarget | null => {\n const rowIndex = dataModel.getRowIndex(rowId);\n if (rowIndex < 0) return null;\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (colIndex < 0) return null;\n return { rowId, colKey, rowIndex, colIndex };\n };\n\n if (\"rowId\" in address && \"colKey\" in address) {\n return resolveByKeys(address.rowId, address.colKey);\n }\n if (\"rowIndex\" in address && \"colIndex\" in address) {\n return resolveByIndex(address.rowIndex, address.colIndex);\n }\n if (\"rowId\" in address && \"colIndex\" in address) {\n const rowIndex = dataModel.getRowIndex(address.rowId);\n if (rowIndex < 0) return null;\n return resolveByIndex(rowIndex, address.colIndex);\n }\n if (\"rowIndex\" in address && \"colKey\" in address) {\n const colIndex = schema.columns.findIndex((c) => c.key === address.colKey);\n if (colIndex < 0) return null;\n return resolveByIndex(address.rowIndex, colIndex);\n }\n\n return null;\n}\n","import type { ColumnSchema } from \"./types\";\nimport type { DataModel } from \"./dataModel\";\n\nexport type FindReplaceMode = \"find\" | \"replace\";\n\nexport interface FindReplaceOptions {\n caseInsensitive?: boolean;\n regex?: boolean;\n}\n\nexport interface FindReplaceMatch {\n rowId: string;\n colKey: string;\n rowIndex: number;\n colIndex: number;\n start: number;\n end: number;\n text: string;\n}\n\nexport interface FindReplaceState {\n query: string;\n replace: string;\n mode: FindReplaceMode;\n options: Required<FindReplaceOptions>;\n matches: FindReplaceMatch[];\n activeIndex: number;\n error: string | null;\n}\n\nexport type FindReplaceListener = (state: FindReplaceState) => void;\n\nfunction defaultOptions(): Required<FindReplaceOptions> {\n return { caseInsensitive: false, regex: false };\n}\n\nfunction stringifyCellValue(value: unknown, col: ColumnSchema): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n // Fallback: stable stringification.\n return col.type === \"boolean\"\n ? String(value).toLowerCase() === \"true\"\n ? \"TRUE\"\n : \"FALSE\"\n : String(value);\n}\n\nfunction escapeRegExp(text: string) {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction clampIndex(index: number, length: number) {\n if (length <= 0) return -1;\n return Math.max(0, Math.min(length - 1, index));\n}\n\nexport class FindReplaceController {\n private state: FindReplaceState = {\n query: \"\",\n replace: \"\",\n mode: \"find\",\n options: defaultOptions(),\n matches: [],\n activeIndex: -1,\n error: null,\n };\n private listeners = new Set<FindReplaceListener>();\n private debounceId: number | null = null;\n private unsubscribeData: (() => void) | null = null;\n\n constructor(\n private dataModel: DataModel,\n private navigateToCell: (rowId: string, colKey: string) => void,\n private applyEdit: (rowId: string, colKey: string, next: unknown) => void,\n private canEdit: (rowId: string, colKey: string) => boolean,\n ) {\n this.unsubscribeData = this.dataModel.subscribe(() => {\n if (!this.state.query) return;\n this.scheduleRecompute();\n });\n }\n\n destroy() {\n if (this.debounceId !== null) window.clearTimeout(this.debounceId);\n this.debounceId = null;\n this.unsubscribeData?.();\n this.unsubscribeData = null;\n this.listeners.clear();\n }\n\n getState() {\n return this.state;\n }\n\n subscribe(listener: FindReplaceListener) {\n this.listeners.add(listener);\n listener(this.state);\n return () => this.listeners.delete(listener);\n }\n\n setMode(mode: FindReplaceMode) {\n this.setState({ ...this.state, mode });\n }\n\n setQuery(query: string) {\n this.setState({ ...this.state, query });\n this.scheduleRecompute();\n }\n\n setReplace(replace: string) {\n this.setState({ ...this.state, replace });\n }\n\n setOptions(next: FindReplaceOptions) {\n this.setState({ ...this.state, options: { ...this.state.options, ...next } });\n this.scheduleRecompute();\n }\n\n next() {\n if (!this.state.matches.length) return;\n const idx = (this.state.activeIndex + 1) % this.state.matches.length;\n this.activateIndex(idx);\n }\n\n prev() {\n if (!this.state.matches.length) return;\n const idx =\n (this.state.activeIndex - 1 + this.state.matches.length) % this.state.matches.length;\n this.activateIndex(idx);\n }\n\n activateIndex(index: number) {\n const idx = clampIndex(index, this.state.matches.length);\n if (idx < 0) return;\n const match = this.state.matches[idx];\n if (!match) return;\n this.setState({ ...this.state, activeIndex: idx });\n this.navigateToCell(match.rowId, match.colKey);\n }\n\n replaceCurrent() {\n const idx = this.state.activeIndex;\n if (idx < 0) return;\n const match = this.state.matches[idx];\n if (!match) return;\n if (!this.canEdit(match.rowId, match.colKey)) return;\n\n const schema = this.dataModel.getSchema();\n const col = schema.columns[match.colIndex];\n if (!col) return;\n const current = this.dataModel.getCell(match.rowId, match.colKey);\n const currentText = stringifyCellValue(current, col);\n const replacement = this.applyReplacement(currentText, match);\n this.applyEdit(match.rowId, match.colKey, replacement);\n this.recompute();\n }\n\n replaceAll() {\n if (!this.state.matches.length) return;\n const schema = this.dataModel.getSchema();\n const byCell = new Map<string, FindReplaceMatch[]>();\n for (const m of this.state.matches) {\n if (!this.canEdit(m.rowId, m.colKey)) continue;\n byCell.set(`${m.rowId}|${m.colKey}`, [...(byCell.get(`${m.rowId}|${m.colKey}`) ?? []), m]);\n }\n for (const [key, matches] of byCell.entries()) {\n const [rowId, colKeyStr] = key.split(\"|\");\n const first = matches[0];\n if (!first) continue;\n const colIndex = first.colIndex;\n const col = schema.columns[colIndex];\n if (!col) continue;\n if (!rowId || !colKeyStr) continue;\n const colKey = colKeyStr;\n const current = this.dataModel.getCell(rowId, colKey);\n const currentText = stringifyCellValue(current, col);\n const nextText = this.applyReplacementAllInCell(currentText, matches);\n this.applyEdit(rowId, colKey, nextText);\n }\n this.recompute();\n }\n\n private applyReplacement(text: string, match: FindReplaceMatch) {\n const { query, replace, options } = this.state;\n if (!query) return text;\n if (options.regex) {\n try {\n const flags = `g${options.caseInsensitive ? \"i\" : \"\"}`;\n const re = new RegExp(query, flags);\n let seen = -1;\n return text.replace(re, (substr, ...args) => {\n const off = args[args.length - 2];\n if (typeof off !== \"number\") return substr;\n if (off !== match.start) return substr;\n if (seen === off) return substr;\n seen = off;\n return replace;\n });\n } catch {\n return text;\n }\n }\n return text.slice(0, match.start) + replace + text.slice(match.end);\n }\n\n private applyReplacementAllInCell(text: string, matches: FindReplaceMatch[]) {\n if (!matches.length) return text;\n const { query, replace, options } = this.state;\n if (!query) return text;\n if (options.regex) {\n try {\n const flags = `g${options.caseInsensitive ? \"i\" : \"\"}`;\n const re = new RegExp(query, flags);\n return text.replace(re, replace);\n } catch {\n return text;\n }\n }\n // Plain mode: apply from end to keep offsets valid.\n const sorted = [...matches].sort((a, b) => b.start - a.start);\n let out = text;\n for (const m of sorted) {\n out = out.slice(0, m.start) + replace + out.slice(m.end);\n }\n return out;\n }\n\n private scheduleRecompute() {\n if (this.debounceId !== null) window.clearTimeout(this.debounceId);\n this.debounceId = window.setTimeout(() => {\n this.debounceId = null;\n this.recompute();\n }, 180);\n }\n\n recompute() {\n const { query, options } = this.state;\n if (!query) {\n this.setState({ ...this.state, matches: [], activeIndex: -1, error: null });\n return;\n }\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const matches: FindReplaceMatch[] = [];\n let error: string | null = null;\n\n let re: RegExp | null = null;\n if (options.regex) {\n try {\n const flags = `g${options.caseInsensitive ? \"i\" : \"\"}`;\n re = new RegExp(query, flags);\n } catch (e) {\n error = e instanceof Error ? e.message : \"Invalid pattern\";\n }\n } else {\n const flags = options.caseInsensitive ? \"gi\" : \"g\";\n re = new RegExp(escapeRegExp(query), flags);\n }\n\n if (!re || error) {\n this.setState({\n ...this.state,\n matches: [],\n activeIndex: -1,\n error: error ?? \"Invalid pattern\",\n });\n return;\n }\n\n for (let r = 0; r < rows.length; r += 1) {\n const row = rows[r];\n if (!row) continue;\n for (let c = 0; c < schema.columns.length; c += 1) {\n const col = schema.columns[c];\n if (!col) continue;\n if (view.hiddenColumns?.some((k) => String(k) === String(col.key))) continue;\n const cellValue = this.dataModel.getCell(row.id, col.key);\n const text = stringifyCellValue(cellValue, col);\n if (!text) continue;\n re.lastIndex = 0;\n let m: RegExpExecArray | null = re.exec(text);\n while (m) {\n const start = m.index;\n const end = start + (m[0]?.length ?? 0);\n matches.push({\n rowId: row.id,\n colKey: col.key,\n rowIndex: r,\n colIndex: c,\n start,\n end,\n text,\n });\n if (m[0] === \"\") break;\n m = re.exec(text);\n }\n }\n }\n\n const activeIndex = matches.length ? clampIndex(this.state.activeIndex, matches.length) : -1;\n this.setState({ ...this.state, matches, activeIndex, error: null });\n }\n\n private setState(next: FindReplaceState) {\n this.state = next;\n for (const l of this.listeners) l(this.state);\n }\n}\n","import type { LockMode, ServerAdapter, UserInfo } from './types';\n\nexport class LockManager {\n private lockedRows = new Set<string>();\n private mode: LockMode = 'none';\n private server?: ServerAdapter;\n private user?: UserInfo;\n\n constructor(mode: LockMode, server?: ServerAdapter, user?: UserInfo) {\n this.mode = mode;\n this.server = server;\n this.user = user;\n }\n\n setMode(mode: LockMode) {\n this.mode = mode;\n }\n\n setUser(user?: UserInfo) {\n this.user = user;\n }\n\n async selectRow(rowId: string) {\n if (this.mode !== 'row') return;\n if (this.lockedRows.has(rowId)) return;\n this.lockedRows.add(rowId);\n if (this.server && this.user) {\n try {\n await this.server.lockRow(rowId, this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('lockRow failed', e);\n }\n }\n }\n\n async unlockOnMove(currentRowId?: string) {\n if (this.mode !== 'row') return;\n if (!currentRowId) return;\n await this.unlockRows([currentRowId]);\n }\n\n async unlockOnCommit(keepRowId?: string) {\n if (this.mode !== 'row') return;\n const toUnlock: string[] = [];\n for (const id of this.lockedRows) {\n if (id !== keepRowId) toUnlock.push(id);\n }\n if (toUnlock.length) {\n await this.unlockRows(toUnlock);\n }\n }\n\n async unlockRows(rowIds: string[]) {\n for (const id of rowIds) this.lockedRows.delete(id);\n if (this.server && this.user) {\n try {\n await this.server.unlockRows(rowIds, this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('unlockRows failed', e);\n }\n }\n }\n\n getLockedRows() {\n return new Set(this.lockedRows);\n }\n}\n","import type { ColumnSchema } from \"./types\";\nimport { parseIsoDate } from \"./dateUtils\";\n\nconst DAY_MS = 86_400_000;\n\nexport function safeParseDate(value: string): Date | null {\n const parsed = parseIsoDate(value);\n if (!parsed) return null;\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nexport function safeParseTime(value: string): Date | null {\n const parsed = new Date(`1970-01-01T${value}`);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nexport function toRawValue(raw: unknown, value: unknown, col: ColumnSchema): string | null {\n void raw;\n if (value === null || value === undefined) return null;\n if (col.type === \"string\") return null;\n if (col.type === \"boolean\") return String(Boolean(value));\n if (col.type === \"number\" && typeof value === \"number\") return String(value);\n if (col.type === \"datetime\") {\n const d = value instanceof Date ? value : safeParseDate(String(value));\n return d ? String(d.getTime()) : null;\n }\n if (col.type === \"date\") {\n const d = value instanceof Date ? value : safeParseDate(String(value));\n if (!d) return null;\n const floored = Math.floor(d.getTime() / DAY_MS) * DAY_MS;\n return String(floored);\n }\n if (col.type === \"time\") {\n const d = value instanceof Date ? value : safeParseTime(String(value));\n if (!d) return null;\n return String(d.getTime() % DAY_MS);\n }\n return null;\n}\n","import type { Schema, View } from \"./types\";\n\nexport const HEADER_HEIGHT_PX = 24;\nexport const ROW_HEADER_WIDTH_PX = 48;\nexport const DEFAULT_ROW_HEIGHT_PX = 24;\n\nexport function getColumnWidths(schema: Schema, view: View, fallbackWidth = 100): number[] {\n const extraByType: Partial<Record<string, number>> = {\n // Reserve extra space for browser UI affordances (e.g. date picker icon) and formatting.\n date: 8,\n };\n return schema.columns.map((c) => {\n const base = view.columnWidths?.[String(c.key)] ?? c.width ?? fallbackWidth;\n const extra = extraByType[c.type] ?? 0;\n return base + extra;\n });\n}\n","const m = (e) => e.trim().normalize(\"NFKC\").toLowerCase().replace(/\\s+/g, \" \"), j = (e) => {\n const t = [];\n if (e)\n for (const n of e) {\n const r = n.trim();\n !r || t.includes(r) || t.push(r);\n }\n return t.length === 0 ? t.push(\"en\") : t.includes(\"en\") || t.push(\"en\"), t;\n}, T = (e, t) => {\n const n = e.items.indexOf(t);\n if (n !== -1)\n return n;\n if (!e.aliases)\n return null;\n const r = e.aliases[t];\n if (!r)\n return null;\n const s = e.items.indexOf(r);\n return s === -1 ? null : s;\n}, M = (e, t) => {\n const n = m(t);\n if (m(e.id).includes(n))\n return !0;\n for (const r of e.items)\n if (m(r).includes(n))\n return !0;\n return e.aliases ? Object.keys(e.aliases).some(\n (r) => m(r).includes(n)\n ) : !1;\n}, w = (e, t) => {\n if (e.langs.length === 0)\n return 0;\n let n = Number.POSITIVE_INFINITY;\n for (const r of e.langs) {\n const s = t.indexOf(r);\n s !== -1 && s < n && (n = s);\n }\n return n;\n}, E = (e, t) => !e.langs || e.langs.length === 0 ? !0 : e.langs.some((n) => t.includes(n));\nclass J {\n constructor(t) {\n this.lists = [], this.matchers = [], this.langs = j(t?.langs);\n }\n register(t) {\n const n = this.lists.findIndex((r) => r.id === t.id);\n n === -1 ? this.lists.push(t) : this.lists[n] = t;\n }\n registerMatch(t) {\n const n = this.matchers.findIndex((r) => r.id === t.id);\n n === -1 ? this.matchers.push(t) : this.matchers[n] = t;\n }\n unregister(t) {\n this.lists = this.lists.filter((n) => n.id !== t), this.matchers = this.matchers.filter((n) => n.id !== t);\n }\n list(t) {\n let n = [...this.lists];\n if (t?.enabledIds && t.enabledIds.length > 0) {\n const s = new Set(t.enabledIds);\n n = n.filter((i) => s.has(i.id));\n }\n const r = t?.queryText;\n return r && (n = n.filter((s) => M(s, r))), n;\n }\n match(t, n) {\n if (t.length === 0)\n return null;\n let r = null, s = Number.NEGATIVE_INFINITY;\n const i = n?.enabledIds ? new Set(n.enabledIds) : null;\n for (const o of this.matchers) {\n if (i && !i.has(o.id) || !E(o, this.langs))\n continue;\n const l = o.match(t);\n if (!l)\n continue;\n const u = l.score;\n Number.isFinite(u) && u > s && (s = u, r = {\n kind: \"matcher\",\n matcher: o,\n step: l.step ?? 1,\n state: l.state\n });\n }\n const a = this.list(n).map((o) => ({ list: o, rank: w(o, this.langs) })).filter((o) => Number.isFinite(o.rank)).sort((o, l) => o.rank - l.rank);\n for (const { list: o, rank: l } of a) {\n const u = [];\n let f = !1;\n for (const N of t) {\n const p = T(o, N);\n if (p === null) {\n f = !0;\n break;\n }\n u.push(p);\n }\n if (f)\n continue;\n const h = this.inferStep(o, u);\n if (h === null)\n continue;\n const g = 10 - l;\n g > s && (s = g, r = {\n kind: \"list\",\n list: o,\n startIndex: u[u.length - 1] ?? 0,\n step: h\n });\n }\n return r;\n }\n inferStep(t, n) {\n if (n.length < 2)\n return 1;\n const r = t.items.length, s = this.stepBetween(t.mode, r, n[0], n[1]);\n if (s === null)\n return null;\n for (let i = 2; i < n.length; i += 1) {\n const a = this.nextIndex(t.mode, r, n[i - 1], s);\n if (a === null || a !== n[i])\n return null;\n }\n return s;\n }\n stepBetween(t, n, r, s) {\n if (t === \"cycle\")\n return (s - r + n) % n;\n const i = s - r;\n return i < 0 ? null : i;\n }\n nextIndex(t, n, r, s) {\n if (t === \"cycle\")\n return (r + s) % n;\n const i = r + s;\n return i >= n ? null : i;\n }\n}\nconst A = {\n id: \"weekdays-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"],\n aliases: {\n Mon: \"Monday\",\n Tue: \"Tuesday\",\n Tues: \"Tuesday\",\n Wed: \"Wednesday\",\n Thu: \"Thursday\",\n Thur: \"Thursday\",\n Thurs: \"Thursday\",\n Fri: \"Friday\",\n Sat: \"Saturday\",\n Sun: \"Sunday\"\n }\n}, L = {\n id: \"weekdays-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜日\", \"火曜日\", \"水曜日\", \"木曜日\", \"金曜日\", \"土曜日\", \"日曜日\"],\n aliases: {\n 月曜: \"月曜日\",\n 月: \"月曜日\",\n 火曜: \"火曜日\",\n 火: \"火曜日\",\n 水曜: \"水曜日\",\n 水: \"水曜日\",\n 木曜: \"木曜日\",\n 木: \"木曜日\",\n 金曜: \"金曜日\",\n 金: \"金曜日\",\n 土曜: \"土曜日\",\n 土: \"土曜日\",\n 日曜: \"日曜日\",\n 日: \"日曜日\"\n }\n}, F = {\n id: \"months-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n ],\n aliases: {\n Jan: \"January\",\n Feb: \"February\",\n Mar: \"March\",\n Apr: \"April\",\n Jun: \"June\",\n Jul: \"July\",\n Aug: \"August\",\n Sep: \"September\",\n Sept: \"September\",\n Oct: \"October\",\n Nov: \"November\",\n Dec: \"December\"\n }\n}, v = {\n id: \"months-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"]\n}, z = {\n id: \"months-ja-traditional\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"睦月\", \"如月\", \"弥生\", \"卯月\", \"皐月\", \"水無月\", \"文月\", \"葉月\", \"長月\", \"神無月\", \"霜月\", \"師走\"]\n}, O = {\n id: \"quarters-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"]\n}, P = {\n id: \"quarters-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"第1四半期\", \"第2四半期\", \"第3四半期\", \"第4四半期\"]\n}, R = {\n id: \"zodiac-animals-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"子\", \"丑\", \"寅\", \"卯\", \"辰\", \"巳\", \"午\", \"未\", \"申\", \"酉\", \"戌\", \"亥\"]\n}, C = {\n id: \"zodiac-signs-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"Aries\",\n \"Taurus\",\n \"Gemini\",\n \"Cancer\",\n \"Leo\",\n \"Virgo\",\n \"Libra\",\n \"Scorpio\",\n \"Sagittarius\",\n \"Capricorn\",\n \"Aquarius\",\n \"Pisces\"\n ]\n}, D = {\n id: \"zodiac-signs-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"牡羊座\", \"牡牛座\", \"双子座\", \"蟹座\", \"獅子座\", \"乙女座\", \"天秤座\", \"蠍座\", \"射手座\", \"山羊座\", \"水瓶座\", \"魚座\"],\n aliases: {\n さそり座: \"蠍座\"\n }\n}, $ = {\n id: \"directions-16-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"North\",\n \"North-Northeast\",\n \"Northeast\",\n \"East-Northeast\",\n \"East\",\n \"East-Southeast\",\n \"Southeast\",\n \"South-Southeast\",\n \"South\",\n \"South-Southwest\",\n \"Southwest\",\n \"West-Southwest\",\n \"West\",\n \"West-Northwest\",\n \"Northwest\",\n \"North-Northwest\"\n ]\n}, V = {\n id: \"directions-16-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\n \"北\",\n \"北北東\",\n \"北東\",\n \"東北東\",\n \"東\",\n \"東南東\",\n \"南東\",\n \"南南東\",\n \"南\",\n \"南南西\",\n \"南西\",\n \"西南西\",\n \"西\",\n \"西北西\",\n \"北西\",\n \"北北西\"\n ]\n}, W = {\n id: \"ampm-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"AM\", \"PM\"],\n aliases: {\n \"A.M.\": \"AM\",\n \"P.M.\": \"PM\"\n }\n}, B = {\n id: \"ampm-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"午前\", \"午後\"]\n}, Q = {\n id: \"seasons-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Spring\", \"Summer\", \"Autumn\", \"Winter\"],\n aliases: {\n Fall: \"Autumn\"\n }\n}, q = {\n id: \"seasons-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"春\", \"夏\", \"秋\", \"冬\"]\n}, G = {\n id: \"solfege-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"ド\", \"レ\", \"ミ\", \"ファ\", \"ソ\", \"ラ\", \"シ\"]\n}, X = {\n id: \"solfege-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Do\", \"Re\", \"Mi\", \"Fa\", \"Sol\", \"La\", \"Ti\"],\n aliases: {\n So: \"Sol\",\n Si: \"Ti\"\n }\n}, U = {\n id: \"greek-letters-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"Alpha\",\n \"Beta\",\n \"Gamma\",\n \"Delta\",\n \"Epsilon\",\n \"Zeta\",\n \"Eta\",\n \"Theta\",\n \"Iota\",\n \"Kappa\",\n \"Lambda\",\n \"Mu\",\n \"Nu\",\n \"Xi\",\n \"Omicron\",\n \"Pi\",\n \"Rho\",\n \"Sigma\",\n \"Tau\",\n \"Upsilon\",\n \"Phi\",\n \"Chi\",\n \"Psi\",\n \"Omega\"\n ]\n}, K = {\n id: \"greek-letters-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\n \"アルファ\",\n \"ベータ\",\n \"ガンマ\",\n \"デルタ\",\n \"イプシロン\",\n \"ゼータ\",\n \"イータ\",\n \"シータ\",\n \"イオタ\",\n \"カッパ\",\n \"ラムダ\",\n \"ミュー\",\n \"ニュー\",\n \"クサイ\",\n \"オミクロン\",\n \"パイ\",\n \"ロー\",\n \"シグマ\",\n \"タウ\",\n \"ウプシロン\",\n \"ファイ\",\n \"カイ\",\n \"プサイ\",\n \"オメガ\"\n ]\n}, Y = {\n id: \"greek-letters-symbols\",\n mode: \"cycle\",\n langs: [\"en\", \"ja\"],\n items: [\n \"α\",\n \"β\",\n \"γ\",\n \"δ\",\n \"ε\",\n \"ζ\",\n \"η\",\n \"θ\",\n \"ι\",\n \"κ\",\n \"λ\",\n \"μ\",\n \"ν\",\n \"ξ\",\n \"ο\",\n \"π\",\n \"ρ\",\n \"σ\",\n \"τ\",\n \"υ\",\n \"φ\",\n \"χ\",\n \"ψ\",\n \"ω\"\n ],\n aliases: {\n ς: \"σ\"\n }\n}, H = {\n id: \"rokuyo-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"先勝\", \"友引\", \"先負\", \"仏滅\", \"大安\", \"赤口\"]\n}, Z = {\n id: \"heavenly-stems-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"甲\", \"乙\", \"丙\", \"丁\", \"戊\", \"己\", \"庚\", \"辛\", \"壬\", \"癸\"]\n}, _ = {\n id: \"planets-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\"Mercury\", \"Venus\", \"Earth\", \"Mars\", \"Jupiter\", \"Saturn\", \"Uranus\", \"Neptune\"]\n}, ee = {\n id: \"planets-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"水星\", \"金星\", \"地球\", \"火星\", \"木星\", \"土星\", \"天王星\", \"海王星\"]\n}, te = {\n id: \"kuji-in-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"臨\", \"兵\", \"闘\", \"者\", \"皆\", \"陣\", \"烈\", \"在\", \"前\"]\n}, ne = {\n id: \"eight-virtues-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"仁\", \"義\", \"礼\", \"智\", \"忠\", \"信\", \"孝\", \"悌\"]\n}, re = [\n A,\n L,\n F,\n v,\n z,\n O,\n P,\n R,\n C,\n D,\n $,\n V,\n W,\n B,\n Q,\n q,\n G,\n X,\n U,\n K,\n Y,\n H,\n Z,\n _,\n ee,\n te,\n ne\n], b = (e) => {\n const t = e % 100;\n if (t >= 11 && t <= 13) return \"th\";\n const n = e % 10;\n return n === 1 ? \"st\" : n === 2 ? \"nd\" : n === 3 ? \"rd\" : \"th\";\n}, y = (e) => {\n const t = /^(\\d+)(st|nd|rd|th)$/.exec(e);\n if (!t) return null;\n const n = Number(t[1]);\n if (!Number.isFinite(n) || n <= 0) return null;\n const r = t[2];\n return b(n) !== r ? null : n;\n}, se = {\n id: \"ordinal-en\",\n langs: [\"en\"],\n match(e) {\n if (e.length < 2) return null;\n const t = e.map((s) => y(s));\n if (t.some((s) => s === null)) return null;\n const n = t, r = n[1] - n[0];\n for (let s = 2; s < n.length; s += 1)\n if (n[s] - n[s - 1] !== r) return null;\n return { score: 80, step: r };\n },\n createIterator(e, t) {\n let r = y(e[e.length - 1] ?? \"\") ?? 0;\n return {\n next() {\n return r += t.step, r <= 0 || !Number.isFinite(r) ? { value: void 0, done: !0 } : { value: `${r}${b(r)}`, done: !1 };\n }\n };\n }\n}, ie = (e) => {\n for (const t of re)\n e.register(t);\n}, ae = (e) => {\n e.registerMatch(se);\n}, oe = (e) => {\n const t = new J({ langs: e });\n return ie(t), ae(t), t;\n}, le = (e) => {\n let t = 0;\n return {\n next() {\n if (e.length === 0)\n return { value: void 0, done: !0 };\n const n = e[t % e.length];\n return t += 1, { value: n, done: !1 };\n }\n };\n};\nclass c {\n constructor(...t) {\n const n = t;\n this.seed = n, this.kind = n.length === 1 ? \"copy\" : \"seed-repeat\", this.iterator = le(n);\n }\n static fromSeed(t, n, r) {\n const s = new c(...t);\n return s.kind = n, s.iterator = r, s;\n }\n next() {\n return this.iterator.next();\n }\n [Symbol.iterator]() {\n return this;\n }\n}\nconst x = 1e-9, ce = 100, ue = (e) => ({\n next() {\n return { value: e, done: !1 };\n }\n}), S = (e) => {\n let t = 0;\n return {\n next() {\n if (e.length === 0)\n return { value: void 0, done: !0 };\n const n = e[t % e.length];\n return t += 1, { value: n, done: !1 };\n }\n };\n}, me = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: e + t * n, done: !1 };\n }\n };\n}, de = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: new Date(e.getTime() + t * n), done: !1 };\n }\n };\n}, fe = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: e * t ** n, done: !1 };\n }\n };\n}, he = (e, t) => {\n if (e.kind === \"matcher\")\n return e.matcher.createIterator(t, { step: e.step, state: e.state });\n const { list: n, startIndex: r, step: s } = e, i = n.items.length;\n let a = r;\n return {\n next() {\n if (n.mode === \"finite\") {\n const o = a + s;\n return o >= i ? { value: void 0, done: !0 } : (a = o, { value: n.items[a], done: !1 });\n }\n return a = (a + s) % i, { value: n.items[a], done: !1 };\n }\n };\n}, ge = (e) => e.every((t) => typeof t == \"number\" && Number.isFinite(t)), pe = (e) => e.every((t) => t instanceof Date && !Number.isNaN(t.getTime())), ye = (e) => e.every((t) => typeof t == \"string\"), Se = (e) => {\n const t = /^(.*?)(-?\\d+)([^0-9]*)$/.exec(e);\n if (!t)\n return null;\n const n = t[1] ?? \"\", r = t[2] ?? \"\", s = t[3] ?? \"\", i = Number(r);\n if (!Number.isFinite(i))\n return null;\n const a = r.replace(\"-\", \"\").length;\n return { prefix: n, num: i, width: a, suffix: s };\n}, be = (e, t, n) => {\n let r = 0;\n return {\n next() {\n r += 1;\n const s = t + n * r, i = s < 0 ? \"-\" : \"\", a = Math.abs(s).toString().padStart(e.width, \"0\");\n return { value: `${e.prefix}${i}${a}${e.suffix}`, done: !1 };\n }\n };\n}, I = [\n [\"C\", 100],\n [\"XC\", 90],\n [\"L\", 50],\n [\"XL\", 40],\n [\"X\", 10],\n [\"IX\", 9],\n [\"V\", 5],\n [\"IV\", 4],\n [\"I\", 1]\n], k = (e) => {\n if (e < 1 || e > ce)\n return null;\n let t = e, n = \"\";\n for (const [r, s] of I)\n for (; t >= s; )\n n += r, t -= s;\n return n;\n}, xe = (e) => {\n if (e.length === 0 || e !== e.toUpperCase())\n return null;\n let t = e, n = 0;\n for (const [s, i] of I)\n for (; t.startsWith(s); )\n n += i, t = t.slice(s.length);\n if (t.length > 0)\n return null;\n const r = k(n);\n return !r || r !== e ? null : n;\n}, Ie = (e, t) => {\n let n = 0;\n return {\n next() {\n n += 1;\n const r = e + t * n, s = k(r);\n return s ? { value: s, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, d = (e) => {\n if (e.length < 2)\n return null;\n const t = e[1] - e[0];\n for (let n = 2; n < e.length; n += 1)\n if (Math.abs(e[n] - e[n - 1] - t) > x)\n return null;\n return t;\n}, ke = (e) => {\n if (e.length < 2 || e[0] === 0)\n return null;\n const t = e[1] / e[0];\n for (let n = 2; n < e.length; n += 1)\n if (e[n - 1] === 0 || Math.abs(e[n] / e[n - 1] - t) > x)\n return null;\n return t;\n}, Ne = (e) => {\n const t = e.map((r) => Se(r));\n if (t.every(Boolean)) {\n const r = t[0], s = t[t.length - 1];\n if (t.every(\n (a) => a?.prefix === r.prefix && a?.suffix === r.suffix\n )) {\n const a = t.map((l) => l?.num ?? 0), o = d(a);\n if (o !== null)\n return {\n kind: \"arithmetic\",\n iterator: be(\n { prefix: s.prefix, suffix: s.suffix, width: s.width },\n s.num,\n o\n )\n };\n }\n }\n const n = e.map((r) => xe(r));\n if (n.every((r) => r !== null)) {\n const r = n, s = d(r);\n if (s !== null) {\n const i = r[r.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: Ie(i, s)\n };\n }\n }\n return null;\n}, je = (e, t) => {\n const n = t.match(e);\n return n ? {\n kind: \"list\",\n iterator: he(n, e)\n } : null;\n};\nfunction Te(e, t) {\n const n = t?.registry ?? oe();\n if (e.length === 0)\n return c.fromSeed(e, \"seed-repeat\", S(e));\n if (e.length === 1)\n return c.fromSeed(e, \"copy\", ue(e[0]));\n if (ye(e)) {\n const r = je(e, n);\n if (r)\n return c.fromSeed(e, r.kind, r.iterator);\n const s = Ne(e);\n if (s)\n return c.fromSeed(e, s.kind, s.iterator);\n }\n if (ge(e)) {\n const r = d(e);\n if (r !== null)\n return c.fromSeed(\n e,\n \"arithmetic\",\n me(e[e.length - 1], r)\n );\n const s = ke(e);\n if (s !== null)\n return c.fromSeed(\n e,\n \"geometric\",\n fe(e[e.length - 1], s)\n );\n }\n if (pe(e)) {\n const r = e.map((i) => i.getTime()), s = d(r);\n if (s !== null)\n return c.fromSeed(\n e,\n \"arithmetic\",\n de(e[e.length - 1], s)\n );\n }\n return c.fromSeed(e, \"seed-repeat\", S(e));\n}\nexport {\n c as Sequence,\n J as SequenceRegistry,\n oe as createBuiltInRegistry,\n Te as inferSequence,\n ie as registerBuiltInLists,\n ae as registerBuiltInMatchers\n};\n//# sourceMappingURL=index.js.map\n","import type { DataModel } from \"./dataModel\";\nimport type { EditMode, SelectionRange } from \"./types\";\nimport { createBuiltInRegistry, inferSequence } from \"@extable/sequence\";\n\nexport type FillHandleMode = 'copy' | 'sequence';\n\nexport interface FillHandleSource {\n colKey: string;\n colIndex: number;\n startRowIndex: number;\n endRowIndex: number;\n mode: FillHandleMode;\n}\n\nfunction normalizeRange(range: SelectionRange): SelectionRange {\n return {\n ...range,\n startRow: Math.min(range.startRow, range.endRow),\n endRow: Math.max(range.startRow, range.endRow),\n startCol: Math.min(range.startCol, range.endCol),\n endCol: Math.max(range.startCol, range.endCol)\n };\n}\n\nfunction coerceToTime(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return new Date(value);\n if (typeof value === 'string') {\n const s = value.trim();\n if (/^\\d{1,2}:\\d{2}(:\\d{2}(\\.\\d{1,3})?)?$/.test(s)) {\n const d = new Date(`1970-01-01T${s}`);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n const d = new Date(s);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nfunction coerceToDate(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return new Date(value);\n if (typeof value === 'string') {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nexport function getFillHandleSource(dataModel: DataModel, ranges: SelectionRange[]): FillHandleSource | null {\n if (ranges.length !== 1) return null;\n const range = normalizeRange(ranges[0]!);\n if (range.kind !== 'cells') return null;\n const width = range.endCol - range.startCol + 1;\n const height = range.endRow - range.startRow + 1;\n if (width !== 1) return null;\n if (height < 1) return null;\n\n const schema = dataModel.getSchema();\n const col = schema.columns[range.startCol];\n if (!col) return null;\n\n if (height === 1) {\n return {\n colKey: col.key,\n colIndex: range.startCol,\n startRowIndex: range.startRow,\n endRowIndex: range.endRow,\n mode: 'copy'\n };\n }\n\n if (col.type === 'boolean') {\n return null;\n }\n\n if (\n col.type === 'number' ||\n col.type === 'date' ||\n col.type === 'time' ||\n col.type === 'datetime' ||\n col.type === 'string'\n ) {\n return {\n colKey: col.key,\n colIndex: range.startCol,\n startRowIndex: range.startRow,\n endRowIndex: range.endRow,\n mode: 'sequence'\n };\n }\n\n // enum/tags: sequence not supported (copy only, but 2-cell handle should not appear)\n return null;\n}\n\nexport function makeFillValueGetter(\n dataModel: DataModel,\n source: FillHandleSource,\n langs?: readonly string[]\n): ((offsetFromEnd: number) => unknown) | null {\n const schema = dataModel.getSchema();\n const rows = dataModel.listRows();\n const col = schema.columns[source.colIndex];\n if (!col) return null;\n const seed: unknown[] = [];\n for (let r = source.startRowIndex; r <= source.endRowIndex; r += 1) {\n const row = rows[r];\n if (!row) return null;\n seed.push(dataModel.getCell(row.id, col.key));\n }\n\n if (source.mode === 'copy') {\n const last = seed[seed.length - 1];\n return () => last;\n }\n\n const registry = createBuiltInRegistry(langs);\n if (col.type === 'number') {\n const numbers = seed.map((value) => (typeof value === 'number' ? value : Number(value)));\n if (!numbers.every((value) => Number.isFinite(value))) return null;\n const seq = inferSequence(numbers, { registry });\n const cache: number[] = [];\n let done = false;\n return (offsetFromEnd) => {\n while (!done && cache.length < offsetFromEnd) {\n const next = seq.next();\n if (next.done) {\n done = true;\n break;\n }\n cache.push(next.value);\n }\n if (offsetFromEnd <= 0) return null;\n return cache[offsetFromEnd - 1] ?? null;\n };\n }\n\n if (col.type === 'date' || col.type === 'time' || col.type === 'datetime') {\n const dates = seed.map((value) =>\n col.type === 'time' ? coerceToTime(value) : coerceToDate(value)\n );\n if (!dates.every((value) => value instanceof Date)) return null;\n const seq = inferSequence(dates as Date[], { registry });\n const cache: Date[] = [];\n let done = false;\n return (offsetFromEnd) => {\n while (!done && cache.length < offsetFromEnd) {\n const next = seq.next();\n if (next.done) {\n done = true;\n break;\n }\n cache.push(next.value);\n }\n if (offsetFromEnd <= 0) return null;\n return cache[offsetFromEnd - 1] ?? null;\n };\n }\n\n if (col.type === 'string') {\n const strings = seed.map((value) => String(value ?? ''));\n const seq = inferSequence(strings, { registry });\n const cache: string[] = [];\n let done = false;\n return (offsetFromEnd) => {\n while (!done && cache.length < offsetFromEnd) {\n const next = seq.next();\n if (next.done) {\n done = true;\n break;\n }\n cache.push(next.value);\n }\n if (offsetFromEnd <= 0) return null;\n return cache[offsetFromEnd - 1] ?? null;\n };\n }\n\n return null;\n}\n\nexport const FILL_HANDLE_VISUAL_SIZE_PX = 12;\nexport const FILL_HANDLE_HIT_SIZE_PX = 14;\n\nexport function getFillHandleRect(cellRect: DOMRect, size = FILL_HANDLE_VISUAL_SIZE_PX): DOMRect {\n return new DOMRect(cellRect.right - size - 1, cellRect.bottom - size - 1, size, size);\n}\n\nexport function isPointInRect(x: number, y: number, rect: DOMRect) {\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n}\n\nexport function shouldShowFillHandle(\n dataModel: DataModel,\n ranges: SelectionRange[],\n activeRowId: string | null,\n activeColKey: string | null,\n editMode: EditMode,\n): boolean {\n if (editMode === \"readonly\") return false;\n const src = getFillHandleSource(dataModel, ranges);\n if (!src) return false;\n if (!activeRowId || activeRowId === '__all__') return false;\n if (activeColKey === null) return false;\n if (activeColKey === '__all__' || activeColKey === null) return false;\n if (activeColKey !== src.colKey) return false;\n if (dataModel.isReadonly(activeRowId, activeColKey)) return false;\n return true;\n}\n","import type { ColumnSchema, ResolvedCellStyle, StyleDelta } from \"./types\";\nimport type { DataModel } from \"./dataModel\";\n\nexport function columnFormatToStyle(col: ColumnSchema): ResolvedCellStyle {\n const fmt = col.style;\n const dec = fmt?.decorations;\n return {\n backgroundColor: fmt?.backgroundColor,\n textColor: fmt?.textColor,\n bold: dec?.bold,\n italic: dec?.italic,\n underline: dec?.underline,\n strike: dec?.strike,\n };\n}\n\nexport function mergeStyle(base: ResolvedCellStyle, override?: StyleDelta | null): ResolvedCellStyle {\n if (!override) return base;\n return {\n backgroundColor: override.backgroundColor ?? base.backgroundColor,\n textColor: override.textColor ?? base.textColor,\n bold: override.bold ?? base.bold,\n italic: override.italic ?? base.italic,\n underline: override.underline ?? base.underline,\n strike: override.strike ?? base.strike,\n };\n}\n\nexport function resolveCellStyles(\n dataModel: DataModel,\n rowId: string,\n col: ColumnSchema,\n): { columnStyle: ResolvedCellStyle; cellStyle: StyleDelta; resolved: ResolvedCellStyle } {\n const columnStyle = columnFormatToStyle(col);\n const conditional = dataModel.resolveConditionalStyle(rowId, col).delta ?? {};\n const cellStyle = dataModel.getCellStyle(rowId, col.key) ?? {};\n const resolved = mergeStyle(mergeStyle(columnStyle, conditional), cellStyle);\n return { columnStyle, cellStyle, resolved };\n}\n\nexport function styleToCssText(style: ResolvedCellStyle): string {\n let css = \"\";\n if (style.backgroundColor) css += `background-color:${style.backgroundColor};`;\n if (style.textColor) css += `color:${style.textColor};`;\n if (style.bold) css += \"font-weight:600;\";\n if (style.italic) css += \"font-style:italic;\";\n const dec: string[] = [];\n if (style.underline) dec.push(\"underline\");\n if (style.strike) dec.push(\"line-through\");\n if (dec.length) css += `text-decoration-line:${dec.join(\" \")};`;\n return css;\n}\n","import type { DataModel } from \"./dataModel\";\nimport type {\n InternalRow,\n Schema,\n ColumnSchema,\n SelectionRange,\n View,\n ViewFilterValues,\n EditMode,\n} from \"./types\";\nimport { coerceDatePattern, formatDateLite, parseIsoDate } from \"./dateUtils\";\nimport { toRawValue } from \"./cellValueCodec\";\nimport {\n DEFAULT_ROW_HEIGHT_PX,\n HEADER_HEIGHT_PX,\n ROW_HEADER_WIDTH_PX,\n getColumnWidths,\n} from \"./geometry\";\nimport {\n FILL_HANDLE_HIT_SIZE_PX,\n FILL_HANDLE_VISUAL_SIZE_PX,\n getFillHandleRect,\n isPointInRect,\n shouldShowFillHandle,\n} from \"./fillHandle\";\nimport { removeFromParent } from \"./utils\";\nimport { columnFormatToStyle, mergeStyle, styleToCssText } from \"./styleResolver\";\n\nfunction getColumnSortDir(view: View, colKey: string): \"asc\" | \"desc\" | null {\n const s = view.sorts?.[0];\n if (!s) return null;\n return s.key === colKey ? s.dir : null;\n}\n\nfunction hasActiveColumnFilter(view: View, colKey: string): boolean {\n const hasValues = (view.filters ?? []).some((f) => {\n const vf = f as ViewFilterValues;\n return vf?.kind === \"values\" && vf.key === colKey;\n });\n if (hasValues) return true;\n const diag = view.columnDiagnostics?.[colKey];\n return Boolean(diag?.errors || diag?.warnings);\n}\n\nfunction svgFunnel() {\n // Simple funnel icon (stroke only) for filter affordance.\n return `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M3 5h18l-7 8v6l-4 2v-8L3 5z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"/>\n </svg>\n `.trim();\n}\n\nfunction svgArrow(dir: \"asc\" | \"desc\") {\n const d = dir === \"asc\" ? \"M12 6l6 8H6l6-8z\" : \"M12 18l-6-8h12l-6 8z\";\n return `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"${d}\" fill=\"currentColor\"/>\n </svg>\n `.trim();\n}\n\nfunction drawDiagnosticCorner(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n level: \"warning\" | \"error\",\n) {\n const size = Math.min(10, Math.floor(Math.min(w, h) / 2));\n if (size <= 0) return;\n const color = level === \"error\" ? \"#ef4444\" : \"#f59e0b\";\n ctx.save();\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x + w, y);\n ctx.lineTo(x + w - size, y);\n ctx.lineTo(x + w, y + size);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nclass ValueFormatCache {\n private numberFormatCache = new Map<string, Intl.NumberFormat>();\n private dateParseCache = new Map<string, Date>();\n\n getNumberFormatter(options: Intl.NumberFormatOptions): Intl.NumberFormat {\n const key = JSON.stringify(options);\n let fmt = this.numberFormatCache.get(key);\n if (!fmt) {\n fmt = new Intl.NumberFormat(\"en-US\", options);\n this.numberFormatCache.set(key, fmt);\n }\n return fmt;\n }\n\n parseIsoDate(value: string): Date | null {\n const cached = this.dateParseCache.get(value);\n if (cached) return cached;\n const parsed = parseIsoDate(value);\n if (!parsed || Number.isNaN(parsed.getTime())) return null;\n this.dateParseCache.set(value, parsed);\n return parsed;\n }\n}\n\nfunction drawFunnelIcon(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n size: number,\n alpha: number,\n) {\n ctx.save();\n ctx.globalAlpha = alpha;\n ctx.strokeStyle = \"rgba(15,23,42,1)\";\n ctx.lineWidth = 2;\n ctx.lineJoin = \"round\";\n ctx.beginPath();\n // Top trapezoid\n ctx.moveTo(x, y);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x + Math.round(size * 0.62), y + Math.round(size * 0.46));\n ctx.lineTo(x + Math.round(size * 0.38), y + Math.round(size * 0.46));\n ctx.closePath();\n ctx.stroke();\n // Stem\n ctx.beginPath();\n ctx.moveTo(x + Math.round(size * 0.46), y + Math.round(size * 0.46));\n ctx.lineTo(x + Math.round(size * 0.46), y + size);\n ctx.lineTo(x + Math.round(size * 0.54), y + size - 2);\n ctx.lineTo(x + Math.round(size * 0.54), y + Math.round(size * 0.46));\n ctx.stroke();\n ctx.restore();\n}\n\nfunction drawSortArrowIcon(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n size: number,\n alpha: number,\n dir: \"asc\" | \"desc\",\n) {\n ctx.save();\n ctx.globalAlpha = alpha;\n ctx.fillStyle = \"rgba(15,23,42,1)\";\n ctx.beginPath();\n if (dir === \"asc\") {\n ctx.moveTo(x + size / 2, y);\n ctx.lineTo(x + size, y + size);\n ctx.lineTo(x, y + size);\n } else {\n ctx.moveTo(x, y);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x + size / 2, y + size);\n }\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nclass FenwickTree {\n // 1-based BIT\n private tree: number[];\n private n: number;\n\n constructor(n: number) {\n this.n = n;\n this.tree = new Array(n + 1).fill(0);\n }\n\n static from(values: number[]) {\n const ft = new FenwickTree(values.length);\n for (let i = 0; i < values.length; i += 1) ft.add(i, values[i] ?? 0);\n return ft;\n }\n\n sum(count: number) {\n // sum of first `count` items: [0..count-1]\n let i = Math.max(0, Math.min(this.n, count));\n let res = 0;\n while (i > 0) {\n res += this.tree[i] ?? 0;\n i -= i & -i;\n }\n return res;\n }\n\n total() {\n return this.sum(this.n);\n }\n\n add(index0: number, delta: number) {\n let i = index0 + 1;\n if (i <= 0 || i > this.n) return;\n while (i <= this.n) {\n this.tree[i] = (this.tree[i] ?? 0) + delta;\n i += i & -i;\n }\n }\n\n /**\n * Returns the smallest index `i` (0-based) such that `sum(i + 1) >= target`.\n * If `target <= 0`, returns 0. If `target > total`, returns `n - 1`.\n */\n lowerBound(target: number) {\n if (this.n <= 0) return 0;\n if (target <= 0) return 0;\n const total = this.total();\n if (target > total) return this.n - 1;\n let idx = 0;\n // Largest power of two >= n\n let bit = 1;\n while (bit <= this.n) bit <<= 1;\n let acc = 0;\n for (let step = bit; step !== 0; step >>= 1) {\n const next = idx + step;\n if (next <= this.n) {\n const nextAcc = acc + (this.tree[next] ?? 0);\n if (nextAcc < target) {\n idx = next;\n acc = nextAcc;\n }\n }\n }\n // idx is the last position where prefix sum < target; answer is idx (0-based)\n return Math.min(this.n - 1, idx);\n }\n}\n\nexport interface ViewportState {\n scrollTop: number;\n scrollLeft: number;\n clientWidth: number;\n clientHeight: number;\n deltaX: number;\n deltaY: number;\n timestamp: number;\n}\n\nexport interface Renderer {\n mount(root: HTMLElement): void;\n render(state?: ViewportState): void;\n destroy(): void;\n getCellElements(): NodeListOf<HTMLElement> | null;\n hitTest(\n event: MouseEvent,\n ): { rowId: string; colKey: string | null; element?: HTMLElement; rect: DOMRect } | null;\n setActiveCell(rowId: string | null, colKey: string | null): void;\n setSelection(ranges: SelectionRange[]): void;\n}\n\nexport class HTMLRenderer implements Renderer {\n private tableEl: HTMLTableElement | null = null;\n private defaultRowHeight = DEFAULT_ROW_HEIGHT_PX;\n private rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n private activeRowId: string | null = null;\n private activeColKey: string | null = null;\n private selection: SelectionRange[] = [];\n private valueFormatCache = new ValueFormatCache();\n private measureCache = new Map<string, { height: number; frame: number }>();\n private frame = 0;\n constructor(private dataModel: DataModel) {}\n\n mount(root: HTMLElement) {\n this.tableEl = document.createElement(\"table\");\n this.tableEl.dataset.extableRenderer = \"html\";\n root.innerHTML = \"\";\n root.appendChild(this.tableEl);\n this.render();\n }\n\n setActiveCell(rowId: string | null, colKey: string | null) {\n this.activeRowId = rowId;\n this.activeColKey = colKey;\n this.updateActiveClasses();\n }\n\n setSelection(ranges: SelectionRange[]) {\n this.selection = ranges;\n this.applySelectionClasses();\n }\n\n render(_state?: ViewportState) {\n this.frame += 1;\n if (!this.tableEl) return;\n const scrollContainer = this.tableEl.parentElement;\n const prevTop = scrollContainer?.scrollTop ?? 0;\n const prevLeft = scrollContainer?.scrollLeft ?? 0;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n this.tableEl.innerHTML = \"\";\n const colWidths = getColumnWidths(schema, view);\n const colBaseStyles = schema.columns.map((c) => columnFormatToStyle(c));\n const colBaseCss = colBaseStyles.map((s) => styleToCssText(s));\n const totalWidth = this.rowHeaderWidth + colWidths.reduce((acc, w) => acc + (w ?? 0), 0);\n const colgroup = document.createElement(\"colgroup\");\n const rowCol = document.createElement(\"col\");\n rowCol.style.width = `${this.rowHeaderWidth}px`;\n colgroup.appendChild(rowCol);\n for (const w of colWidths) {\n const colEl = document.createElement(\"col\");\n if (w) colEl.style.width = `${w}px`;\n colgroup.appendChild(colEl);\n }\n this.tableEl.appendChild(colgroup);\n this.tableEl.style.width = `${totalWidth}px`;\n this.tableEl.appendChild(this.renderHeader(schema, colWidths));\n const body = document.createElement(\"tbody\");\n for (const row of rows) {\n body.appendChild(this.renderRow(row, schema, colWidths, colBaseStyles, colBaseCss));\n }\n this.tableEl.appendChild(body);\n this.updateActiveClasses();\n this.applySelectionClasses();\n if (scrollContainer) {\n scrollContainer.scrollTop = prevTop;\n scrollContainer.scrollLeft = prevLeft;\n }\n for (const [key, entry] of Array.from(this.measureCache.entries())) {\n if (entry.frame !== this.frame) this.measureCache.delete(key);\n }\n }\n\n destroy() {\n removeFromParent(this.tableEl);\n this.tableEl = null;\n }\n\n getCellElements() {\n return this.tableEl?.querySelectorAll<HTMLElement>(\"tr[data-row-id] td[data-col-key]\") ?? null;\n }\n\n hitTest(event: MouseEvent) {\n const target = event.target as HTMLElement | null;\n if (!target) return null;\n const corner = target.closest<HTMLElement>(\"th.extable-corner\");\n if (corner) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n element: corner,\n rect: corner.getBoundingClientRect(),\n };\n }\n const rowHeader = target.closest<HTMLElement>(\"th.extable-row-header:not(.extable-corner)\");\n if (rowHeader) {\n const row = rowHeader.closest<HTMLElement>(\"tr[data-row-id]\");\n if (row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: null,\n element: rowHeader,\n rect: rowHeader.getBoundingClientRect(),\n };\n }\n }\n const cell = target.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n element: cell,\n rect: cell.getBoundingClientRect(),\n };\n }\n\n private renderHeader(schema: Schema, colWidths: number[]) {\n const thead = document.createElement(\"thead\");\n const tr = document.createElement(\"tr\");\n const rowTh = document.createElement(\"th\");\n rowTh.classList.add(\"extable-row-header\", \"extable-corner\");\n rowTh.textContent = \"\";\n rowTh.style.width = `${this.rowHeaderWidth}px`;\n if (this.activeRowId) rowTh.classList.toggle(\"extable-active-row-header\", true);\n rowTh.dataset.colKey = \"\";\n tr.appendChild(rowTh);\n const view = this.dataModel.getView();\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col) continue;\n const th = document.createElement(\"th\");\n th.dataset.colKey = col.key;\n const sortDir = getColumnSortDir(view, col.key);\n const hasFilter = hasActiveColumnFilter(view, col.key);\n if (sortDir) th.dataset.extableSortDir = sortDir;\n else th.removeAttribute(\"data-extable-sort-dir\");\n if (hasFilter) th.dataset.extableFsActive = \"1\";\n else th.removeAttribute(\"data-extable-fs-active\");\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"extable-col-header\";\n const label = document.createElement(\"span\");\n label.className = \"extable-col-header-text\";\n label.textContent = col.header ?? col.key;\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"extable-filter-sort-trigger\";\n btn.dataset.extableFsOpen = \"1\";\n btn.dataset.extableColKey = col.key;\n btn.title = \"Filter / Sort\";\n btn.innerHTML = sortDir ? svgArrow(sortDir) : svgFunnel();\n wrap.appendChild(label);\n wrap.appendChild(btn);\n th.appendChild(wrap);\n const width = colWidths[idx] ?? col.width;\n if (width) th.style.width = `${width}px`;\n th.dataset.colKey = col.key;\n if (this.activeColKey !== null && this.activeColKey === col.key) {\n th.classList.add(\"extable-active-col-header\");\n }\n tr.appendChild(th);\n }\n thead.appendChild(tr);\n return thead;\n }\n\n private renderRow(\n row: InternalRow,\n schema: Schema,\n colWidths: number[],\n colBaseStyles: ReturnType<typeof columnFormatToStyle>[],\n colBaseCss: string[],\n ) {\n const tr = document.createElement(\"tr\");\n tr.dataset.rowId = row.id;\n const view = this.dataModel.getView();\n const rowHeader = document.createElement(\"th\");\n rowHeader.scope = \"row\";\n rowHeader.classList.add(\"extable-row-header\");\n const index = this.dataModel.getDisplayIndex(row.id) ?? \"\";\n rowHeader.textContent = String(index);\n rowHeader.style.width = `${this.rowHeaderWidth}px`;\n if (this.activeRowId === row.id) rowHeader.classList.add(\"extable-active-row-header\");\n tr.appendChild(rowHeader);\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col) continue;\n const td = document.createElement(\"td\");\n td.classList.add(\"extable-cell\");\n td.dataset.colKey = col.key;\n if (col.type === \"boolean\") td.classList.add(\"extable-boolean\");\n const isPending = this.dataModel.hasPending(row.id, col.key);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, col);\n const cellStyle = this.dataModel.getCellStyle(row.id, col.key);\n if (!cellStyle && !condRes.delta && !isPending) {\n const css = colBaseCss[idx] ?? \"\";\n if (css) td.style.cssText = css;\n } else {\n const baseStyle = colBaseStyles[idx] ?? {};\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const merged = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const forCss = isPending ? { ...merged, textColor: undefined } : merged;\n const css = styleToCssText(forCss);\n if (css) td.style.cssText = css;\n }\n const width = colWidths[idx] ?? view.columnWidths?.[col.key] ?? col.width;\n if (width) td.style.width = `${width}px`;\n const wrap = view.wrapText?.[col.key] ?? col.wrapText;\n td.classList.add(wrap ? \"cell-wrap\" : \"cell-nowrap\");\n const raw = this.dataModel.getRawCell(row.id, col.key);\n const valueRes = this.dataModel.resolveCellValue(row.id, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const formatted = textOverride\n ? { text: textOverride as string }\n : this.formatValue(valueRes.value, col);\n td.textContent = formatted.text;\n if (formatted.color) td.style.color = formatted.color;\n const marker = this.dataModel.getCellMarker(row.id, col.key);\n if (marker) {\n td.classList.toggle(\"extable-diag-warning\", marker.level === \"warning\");\n td.classList.toggle(\"extable-diag-error\", marker.level === \"error\");\n td.dataset.extableDiagMessage = marker.message;\n } else {\n td.classList.remove(\"extable-diag-warning\", \"extable-diag-error\");\n td.removeAttribute(\"data-extable-diag-message\");\n }\n const align = col.style?.align ?? (col.type === \"number\" ? \"right\" : \"left\");\n td.classList.add(align === \"right\" ? \"align-right\" : \"align-left\");\n const rawNumbered = toRawValue(raw, valueRes.value, col);\n if (rawNumbered !== null) {\n td.dataset.raw = rawNumbered;\n } else {\n const rawStr = raw === null || raw === undefined ? \"\" : String(raw);\n td.dataset.raw = rawStr;\n }\n if (isPending) td.classList.add(\"pending\");\n if (this.dataModel.isReadonly(row.id, col.key)) {\n td.classList.add(\"extable-readonly\", \"extable-readonly-muted\");\n } else {\n td.classList.add(\"extable-editable\");\n }\n if (\n this.activeRowId === row.id &&\n this.activeColKey !== null &&\n this.activeColKey === col.key\n ) {\n td.classList.add(\"extable-active-cell\");\n }\n tr.appendChild(td);\n }\n // variable row height based on measured content when wrap enabled\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n if (wrapAny) {\n let maxHeight = this.defaultRowHeight;\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col || !col.wrapText) continue;\n const width = colWidths[idx] ?? view.columnWidths?.[col.key] ?? col.width ?? 100;\n const valueRes = this.dataModel.resolveCellValue(row.id, col);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, col);\n const textOverride =\n valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const text = textOverride\n ? \"#ERROR\"\n : valueRes.value === null || valueRes.value === undefined\n ? \"\"\n : String(valueRes.value);\n const version = this.dataModel.getRowVersion(row.id);\n const key = `${row.id}|${col.key}|${version}|${width}|${text}`;\n const cached = this.measureCache.get(key);\n if (cached) {\n cached.frame = this.frame;\n this.measureCache.set(key, cached);\n maxHeight = Math.max(maxHeight, cached.height);\n continue;\n }\n const measure = document.createElement(\"span\");\n measure.style.visibility = \"hidden\";\n measure.style.position = \"absolute\";\n measure.style.left = \"-10000px\";\n measure.style.top = \"0\";\n measure.style.whiteSpace = \"pre-wrap\";\n measure.style.overflowWrap = \"anywhere\";\n measure.style.display = \"inline-block\";\n measure.style.width = `${width}px`;\n measure.textContent = text;\n const measureHost = this.tableEl?.parentElement;\n if (!measureHost) continue;\n measureHost.appendChild(measure);\n const h = measure.clientHeight + 10; // padding allowance\n measure.remove();\n this.measureCache.set(key, { height: h, frame: this.frame });\n maxHeight = Math.max(maxHeight, h);\n }\n tr.style.height = `${maxHeight}px`;\n this.dataModel.setRowHeight(row.id, maxHeight);\n } else {\n tr.style.height = `${this.defaultRowHeight}px`;\n this.dataModel.setRowHeight(row.id, this.defaultRowHeight);\n }\n return tr;\n }\n\n private updateActiveClasses() {\n if (!this.tableEl) return;\n const isAll = this.activeRowId === \"__all__\" && this.activeColKey === \"__all__\";\n this.tableEl.classList.toggle(\"extable-all-selected\", isAll);\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-row-header\"))) {\n el.classList.remove(\"extable-active-row-header\");\n }\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-col-header\"))) {\n el.classList.remove(\"extable-active-col-header\");\n }\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-cell\"))) {\n el.classList.remove(\"extable-active-cell\");\n }\n if (this.activeRowId) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(\n `tr[data-row-id=\"${this.activeRowId}\"] .extable-row-header`,\n ),\n )) {\n el.classList.add(\"extable-active-row-header\");\n }\n }\n if (this.activeColKey !== null) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(`th[data-col-key=\"${this.activeColKey}\"]`),\n )) {\n el.classList.add(\"extable-active-col-header\");\n }\n if (this.activeRowId) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(\n `tr[data-row-id=\"${this.activeRowId}\"] td[data-col-key=\"${this.activeColKey}\"]`,\n ),\n )) {\n el.classList.add(\"extable-active-cell\");\n }\n }\n }\n }\n\n private applySelectionClasses() {\n if (!this.tableEl) return;\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-selected\"))) {\n el.classList.remove(\"extable-selected\");\n }\n if (!this.selection.length) return;\n const rows = Array.from(this.tableEl.querySelectorAll<HTMLTableRowElement>(\"tbody tr\"));\n const schema = this.dataModel.getSchema();\n for (const range of this.selection) {\n const startRow = Math.max(0, Math.min(range.startRow, range.endRow));\n const endRow = Math.min(rows.length - 1, Math.max(range.startRow, range.endRow));\n const startCol = Math.max(0, Math.min(range.startCol, range.endCol));\n const endCol = Math.min(schema.columns.length - 1, Math.max(range.startCol, range.endCol));\n for (let r = startRow; r <= endRow; r += 1) {\n const rowEl = rows[r];\n if (!rowEl) continue;\n const th = rowEl.querySelector(\"th.extable-row-header\");\n if (th) th.classList.add(\"extable-selected\");\n const cells = Array.from(rowEl.querySelectorAll<HTMLTableCellElement>(\"td\"));\n for (let c = startCol; c <= endCol; c += 1) {\n const cell = cells[c];\n if (cell) cell.classList.add(\"extable-selected\");\n }\n }\n }\n }\n\n private formatValue(value: unknown, col: ColumnSchema): { text: string; color?: string } {\n if (value === null || value === undefined) return { text: \"\" };\n if (col.type === \"boolean\") {\n if (col.booleanDisplay === \"checkbox\" || !col.booleanDisplay) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.booleanDisplay) && col.booleanDisplay.length >= 2) {\n return { text: value ? String(col.booleanDisplay[0]) : String(col.booleanDisplay[1]) };\n }\n return { text: value ? String(col.booleanDisplay) : \"\" };\n }\n if (col.type === \"number\" && typeof value === \"number\") {\n const num = value;\n const opts: Intl.NumberFormatOptions = {};\n if (col.number?.scale !== undefined) {\n opts.minimumFractionDigits = col.number.scale;\n opts.maximumFractionDigits = col.number.scale;\n }\n opts.useGrouping = Boolean(col.number?.thousandSeparator);\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = col.number?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n if (\n (col.type === \"date\" || col.type === \"time\" || col.type === \"datetime\") &&\n (value instanceof Date || typeof value === \"string\")\n ) {\n const fmt =\n col.type === \"date\"\n ? coerceDatePattern(col.dateFormat, \"date\")\n : col.type === \"time\"\n ? coerceDatePattern(col.timeFormat, \"time\")\n : coerceDatePattern(col.dateTimeFormat, \"datetime\");\n let d: Date | null = null;\n if (value instanceof Date) d = value;\n else {\n d = this.valueFormatCache.parseIsoDate(value);\n }\n if (!d) return { text: String(value) };\n return { text: formatDateLite(d, fmt) };\n }\n return { text: String(value) };\n }\n}\n\nexport class CanvasRenderer implements Renderer {\n private static readonly MAX_CANVAS_DIM_PX = 8192;\n private static readonly ROW_HEIGHT_MEASURE_CHUNK = 500;\n private static readonly ROW_HEIGHT_MEASURE_TIME_BUDGET_MS = 8;\n private static readonly TEXT_MEASURE_CACHE_MAX = 2000;\n private root: HTMLElement | null = null;\n private canvas: HTMLCanvasElement | null = null;\n private spacer: HTMLDivElement | null = null;\n private overlayLayer: HTMLDivElement | null = null;\n private tooltip: HTMLDivElement | null = null;\n private tooltipTarget: { rowId: string; colKey: string } | null = null;\n private tooltipMessage: string | null = null;\n private dataModel: DataModel;\n private readonly rowHeight = DEFAULT_ROW_HEIGHT_PX;\n private readonly headerHeight = HEADER_HEIGHT_PX;\n private readonly lineHeight = 16;\n private readonly padding = 12;\n private readonly rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n private activeRowId: string | null = null;\n private activeColKey: string | null = null;\n private selection: SelectionRange[] = [];\n private valueFormatCache = new ValueFormatCache();\n private textMeasureCache = new Map<string, { lines: string[] }>();\n private frame = 0;\n private cursorTimer: number | null = null;\n private pendingCursorPoint: { x: number; y: number } | null = null;\n private hoverHeaderColKey: string | null = null;\n private hoverHeaderIcon = false;\n private rowHeightCacheKey: string | null = null;\n private rowHeightMeasuredVersion = new Map<string, number>();\n private rowHeightMeasureRaf: number | null = null;\n private rowHeightMeasureTask: { key: string; nextIndex: number } | null = null;\n private heightIndex: {\n key: string | null;\n rowsRef: InternalRow[];\n idToIndex: Map<string, number>;\n heights: number[];\n fenwick: FenwickTree;\n } | null = null;\n\n constructor(\n dataModel: DataModel,\n private getEditMode: () => EditMode = () => \"direct\",\n ) {\n this.dataModel = dataModel;\n }\n\n mount(root: HTMLElement) {\n this.root = root;\n this.canvas = document.createElement(\"canvas\");\n const maxDim = CanvasRenderer.MAX_CANVAS_DIM_PX;\n this.canvas.width = Math.max(1, Math.min(maxDim, Math.floor(root.clientWidth || 600)));\n this.canvas.height = Math.max(1, Math.min(maxDim, Math.floor(root.clientHeight || 400)));\n this.canvas.style.width = `${this.canvas.width}px`;\n this.canvas.style.height = `${this.canvas.height}px`;\n this.canvas.dataset.extableRenderer = \"canvas\";\n this.canvas.style.position = \"sticky\";\n this.canvas.style.top = \"0\";\n this.canvas.style.left = \"0\";\n this.canvas.style.zIndex = \"1\";\n this.canvas.style.cursor = \"cell\";\n this.canvas.addEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.addEventListener(\"pointerleave\", this.handlePointerLeave);\n this.canvas.addEventListener(\"click\", this.handleClick);\n this.spacer = document.createElement(\"div\");\n this.spacer.style.width = \"1px\";\n if (this.tooltip) this.tooltip.remove();\n if (this.overlayLayer) this.overlayLayer.remove();\n this.overlayLayer = document.createElement(\"div\");\n this.overlayLayer.className = \"extable-overlay-layer\";\n this.tooltip = document.createElement(\"div\");\n this.tooltip.className = \"extable-tooltip\";\n this.tooltip.dataset.visible = \"0\";\n this.overlayLayer.appendChild(this.tooltip);\n root.innerHTML = \"\";\n root.style.position = \"relative\";\n root.appendChild(this.overlayLayer);\n root.appendChild(this.canvas);\n root.appendChild(this.spacer);\n this.render();\n }\n\n setActiveCell(rowId: string | null, colKey: string | null) {\n this.activeRowId = rowId;\n this.activeColKey = colKey;\n this.render();\n }\n\n setSelection(ranges: SelectionRange[]) {\n this.selection = ranges;\n this.render();\n }\n\n render(state?: ViewportState) {\n try {\n this.frame += 1;\n if (!this.canvas || !this.root) return;\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.font = \"14px sans-serif\";\n let baseFont = ctx.font;\n const selectAll = this.activeRowId === \"__all__\" && this.activeColKey === \"__all__\";\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const colWidths = getColumnWidths(schema, view);\n const colBaseStyles = schema.columns.map((c) => columnFormatToStyle(c));\n const fontCache = new Map<string, string>();\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const cacheKey = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n if (cacheKey !== this.rowHeightCacheKey) {\n this.rowHeightCacheKey = cacheKey;\n this.rowHeightMeasuredVersion.clear();\n this.rowHeightMeasureTask = null;\n }\n if (!wrapAny) this.cancelRowHeightMeasurement();\n\n this.ensureHeightIndex(rows, wrapAny ? cacheKey : null, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return;\n\n const totalWidth = this.rowHeaderWidth + colWidths.reduce((acc, w) => acc + (w ?? 0), 0);\n const desiredCanvasWidth = state?.clientWidth ?? (this.root.clientWidth || 600);\n const desiredCanvasHeight =\n state?.clientHeight ?? (this.root.clientHeight || this.canvas.height || 400);\n const maxDim = CanvasRenderer.MAX_CANVAS_DIM_PX;\n const nextWidth = Math.max(1, Math.min(maxDim, Math.floor(desiredCanvasWidth)));\n const nextHeight = Math.max(1, Math.min(maxDim, Math.floor(desiredCanvasHeight)));\n if (this.canvas.width !== nextWidth) this.canvas.width = nextWidth;\n if (this.canvas.height !== nextHeight) this.canvas.height = nextHeight;\n this.canvas.style.width = `${nextWidth}px`;\n this.canvas.style.height = `${nextHeight}px`;\n // Resizing resets 2D state, so reapply after size update.\n ctx.font = \"14px sans-serif\";\n baseFont = ctx.font;\n this.refreshTooltipPosition();\n\n const scrollTop = state?.scrollTop ?? this.root.scrollTop;\n const scrollLeft = state?.scrollLeft ?? this.root.scrollLeft;\n const computeVisibleRange = (contentTop: number) => {\n const target = contentTop + 1;\n const visibleStart = Math.max(\n 0,\n Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(target)),\n );\n const accum = heightIndex.fenwick.sum(visibleStart);\n let visibleEnd = visibleStart;\n let drawnHeight = 0;\n const maxHeight = (this.canvas?.height ?? 0) + this.rowHeight * 2;\n for (let i = visibleStart; i < rows.length && drawnHeight < maxHeight; i += 1) {\n drawnHeight += heightIndex.heights[i] ?? this.rowHeight;\n visibleEnd = i + 1;\n }\n return { accum, visibleStart, visibleEnd };\n };\n\n let totalRowsHeight = heightIndex.fenwick.total();\n const viewportHeight = this.canvas?.height ?? this.root.clientHeight;\n const dataViewportHeight = Math.max(0, viewportHeight - this.headerHeight);\n let maxContentScrollTop = Math.max(0, totalRowsHeight - dataViewportHeight);\n let contentScrollTop = Math.max(0, Math.min(scrollTop, maxContentScrollTop));\n let { accum, visibleStart, visibleEnd } = computeVisibleRange(contentScrollTop);\n\n if (wrapAny && cacheKey) {\n const updates: Record<string, number> = {};\n for (let i = visibleStart; i < visibleEnd; i += 1) {\n const row = rows[i];\n if (!row) continue;\n const version = this.dataModel.getRowVersion(row.id);\n if (this.rowHeightMeasuredVersion.get(row.id) === version) continue;\n const nextH = this.measureRowHeight(ctx, row, schema, colWidths);\n updates[row.id] = nextH;\n this.rowHeightMeasuredVersion.set(row.id, version);\n }\n this.applyRowHeightUpdates(updates);\n totalRowsHeight = heightIndex.fenwick.total();\n this.dataModel.setRowHeightsBulk(updates);\n maxContentScrollTop = Math.max(0, totalRowsHeight - dataViewportHeight);\n contentScrollTop = Math.max(0, Math.min(scrollTop, maxContentScrollTop));\n ({ accum, visibleStart, visibleEnd } = computeVisibleRange(contentScrollTop));\n if (this.rowHeightMeasureTask || Object.keys(updates).length > 0)\n this.scheduleRowHeightMeasurement();\n }\n\n if (this.spacer) {\n this.spacer.style.height = `${maxContentScrollTop}px`;\n this.spacer.style.width = `${totalWidth}px`;\n }\n const dataXOffset = this.rowHeaderWidth - scrollLeft;\n\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n // Keep row-header column background visible across scroll\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, 0, this.rowHeaderWidth, this.canvas.height);\n // Body\n let yCursor = this.headerHeight + accum - contentScrollTop;\n for (let i = visibleStart; i < visibleEnd; i += 1) {\n const row = rows[i];\n const rowH = heightIndex.heights[i] ?? this.rowHeight;\n // row header cell\n ctx.strokeStyle = \"#d0d7de\";\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, yCursor, this.rowHeaderWidth, rowH);\n ctx.strokeRect(0, yCursor, this.rowHeaderWidth, rowH);\n const idxText = this.dataModel.getDisplayIndex(row.id) ?? \"\";\n if (this.activeRowId === row.id) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(0, yCursor, this.rowHeaderWidth, rowH);\n }\n ctx.fillStyle = \"#0f172a\";\n ctx.font = \"bold 14px sans-serif\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(String(idxText), this.rowHeaderWidth / 2, yCursor + rowH / 2);\n ctx.font = baseFont;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"alphabetic\";\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n this.rowHeaderWidth,\n this.headerHeight,\n this.canvas.width - this.rowHeaderWidth,\n this.canvas.height - this.headerHeight,\n );\n ctx.clip();\n ctx.translate(dataXOffset, 0);\n let x = 0;\n let lastFontKey = \"\";\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n const w = colWidths[idx] ?? 100;\n if (!c) {\n x += w;\n continue;\n }\n const readOnly = this.dataModel.isReadonly(row.id, c.key);\n ctx.strokeStyle = \"#d0d7de\";\n const condRes = this.dataModel.resolveConditionalStyle(row.id, c);\n const cellStyle = this.dataModel.getCellStyle(row.id, c.key);\n const baseStyle = colBaseStyles[idx] ?? {};\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const mergedStyle = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const bg = readOnly ? \"#f3f4f6\" : (mergedStyle.backgroundColor ?? \"#ffffff\");\n ctx.fillStyle = bg;\n ctx.fillRect(x, yCursor, w, rowH);\n ctx.strokeRect(x, yCursor, w, rowH);\n const valueRes = this.dataModel.resolveCellValue(row.id, c);\n const textOverride =\n valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const formatted = textOverride ? { text: \"#ERROR\" } : this.formatValue(valueRes.value, c);\n const text = formatted.text;\n const align = c.style?.align ?? (c.type === \"number\" ? \"right\" : \"left\");\n const isActiveCell =\n this.activeRowId === row.id &&\n this.activeColKey !== null &&\n this.activeColKey === c.key;\n if (isActiveCell) {\n ctx.strokeStyle = \"#3b82f6\";\n ctx.lineWidth = 2;\n ctx.strokeRect(x + 1, yCursor + 1, w - 2, rowH - 2);\n ctx.lineWidth = 1;\n if (\n shouldShowFillHandle(\n this.dataModel,\n this.selection,\n this.activeRowId,\n this.activeColKey,\n this.getEditMode(),\n )\n ) {\n const size = FILL_HANDLE_VISUAL_SIZE_PX;\n const left = x + w - size - 1;\n const top = yCursor + rowH - size - 1;\n ctx.fillStyle = \"#3b82f6\";\n ctx.fillRect(left, top, size, size);\n ctx.strokeStyle = \"#ffffff\";\n ctx.strokeRect(left + 0.5, top + 0.5, size - 1, size - 1);\n }\n }\n ctx.fillStyle = this.dataModel.hasPending(row.id, c.key)\n ? \"#b91c1c\"\n : formatted.color\n ? formatted.color\n : readOnly\n ? \"#94a3b8\"\n : (mergedStyle.textColor ?? \"#0f172a\");\n const wrap = view.wrapText?.[c.key] ?? c.wrapText ?? false;\n const isBoolean =\n c.type === \"boolean\" && (!c.booleanDisplay || c.booleanDisplay === \"checkbox\");\n const isCustomBoolean =\n c.type === \"boolean\" && Boolean(c.booleanDisplay && c.booleanDisplay !== \"checkbox\");\n if (!isBoolean) {\n const fontKey = `${mergedStyle.italic ? \"i\" : \"\"}${mergedStyle.bold ? \"b\" : \"\"}`;\n if (fontKey !== lastFontKey) {\n const cached = fontCache.get(fontKey);\n if (cached) ctx.font = cached;\n else {\n const weight = mergedStyle.bold ? \"600 \" : \"\";\n const ital = mergedStyle.italic ? \"italic \" : \"\";\n const f = `${ital}${weight}14px sans-serif`.trim();\n fontCache.set(fontKey, f);\n ctx.font = f;\n }\n lastFontKey = fontKey;\n }\n } else {\n ctx.font = baseFont;\n lastFontKey = \"\";\n }\n this.drawCellText(\n ctx,\n text,\n x + 8,\n yCursor + 2,\n w - 12,\n rowH - 8,\n wrap,\n align,\n isBoolean,\n isCustomBoolean,\n { underline: Boolean(mergedStyle.underline), strike: Boolean(mergedStyle.strike) },\n );\n const marker = this.dataModel.getCellMarker(row.id, c.key);\n if (marker) drawDiagnosticCorner(ctx, x, yCursor, w, rowH, marker.level);\n x += w;\n }\n ctx.restore();\n yCursor += rowH;\n }\n\n // Header (draw last to stay on top)\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, 0, this.canvas.width, this.headerHeight);\n ctx.strokeStyle = \"#d0d7de\";\n // corner\n ctx.strokeRect(0, 0, this.rowHeaderWidth, this.headerHeight);\n ctx.fillStyle = \"#9ca3af\";\n ctx.beginPath();\n ctx.moveTo(4, 4);\n ctx.lineTo(16, 4);\n ctx.lineTo(4, 16);\n ctx.closePath();\n ctx.fill();\n if (this.activeRowId) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(0, 0, this.rowHeaderWidth, this.headerHeight);\n }\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(this.rowHeaderWidth, 0, this.canvas.width - this.rowHeaderWidth, this.headerHeight);\n ctx.clip();\n ctx.translate(dataXOffset, 0);\n let xHeader = 0;\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n const w = colWidths[idx] ?? 100;\n if (!c) {\n xHeader += w;\n continue;\n }\n const isActiveCol = this.activeColKey !== null && this.activeColKey === c.key;\n if (isActiveCol) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(xHeader, 0, w, this.headerHeight);\n }\n ctx.strokeStyle = \"#d0d7de\";\n ctx.strokeRect(xHeader, 0, w, this.headerHeight);\n ctx.fillStyle = \"#0f172a\";\n ctx.font = \"bold 14px sans-serif\";\n ctx.fillText(c.header ?? c.key, xHeader + 8, this.headerHeight - 8);\n ctx.font = baseFont;\n\n const sortDir = getColumnSortDir(view, c.key);\n const hasFilter = hasActiveColumnFilter(view, c.key);\n const isHover = this.hoverHeaderColKey !== null && this.hoverHeaderColKey === c.key;\n const showIcon = Boolean(sortDir) || hasFilter || isHover;\n if (showIcon) {\n const alpha = isHover ? 0.9 : hasFilter || sortDir ? 0.75 : 0.45;\n const iconBox = 16;\n const pad = 6;\n const ix = xHeader + w - iconBox - pad;\n const iy = Math.floor((this.headerHeight - iconBox) / 2);\n if (sortDir) {\n drawSortArrowIcon(ctx, ix + 3, iy + 3, iconBox - 6, alpha, sortDir);\n } else {\n drawFunnelIcon(ctx, ix + 2, iy + 2, iconBox - 4, alpha);\n }\n }\n xHeader += w;\n }\n ctx.restore();\n\n // selection overlay\n if (this.selection.length) {\n ctx.save();\n ctx.strokeStyle = \"#3b82f6\";\n ctx.fillStyle = \"rgba(59,130,246,0.12)\";\n for (const range of this.selection) {\n const startRow = Math.max(0, Math.min(range.startRow, range.endRow));\n const endRow = Math.min(rows.length - 1, Math.max(range.startRow, range.endRow));\n const startCol = Math.max(0, Math.min(range.startCol, range.endCol));\n const endCol = Math.min(\n schema.columns.length - 1,\n Math.max(range.startCol, range.endCol),\n );\n const yTop = this.headerHeight + heightIndex.fenwick.sum(startRow) - contentScrollTop;\n const height = heightIndex.fenwick.sum(endRow + 1) - heightIndex.fenwick.sum(startRow);\n let xLeft = this.rowHeaderWidth;\n for (let c = 0; c < startCol; c += 1) {\n xLeft += colWidths[c] ?? 100;\n }\n let width = 0;\n for (let c = startCol; c <= endCol; c += 1) {\n width += colWidths[c] ?? 100;\n }\n xLeft -= scrollLeft;\n ctx.fillRect(xLeft, yTop, width, height);\n ctx.strokeRect(xLeft + 0.5, yTop + 0.5, width - 1, height - 1);\n }\n ctx.restore();\n }\n\n if (selectAll) {\n ctx.save();\n ctx.fillStyle = \"rgba(59,130,246,0.08)\";\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n ctx.restore();\n }\n } catch {\n // Ignore canvas rendering errors (e.g. context enters an error state after huge resize).\n // A subsequent resize typically recovers.\n return;\n }\n }\n\n destroy() {\n this.cancelRowHeightMeasurement();\n this.heightIndex = null;\n if (this.canvas) {\n this.canvas.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.removeEventListener(\"pointerleave\", this.handlePointerLeave);\n this.canvas.removeEventListener(\"click\", this.handleClick);\n }\n if (this.cursorTimer) {\n window.clearTimeout(this.cursorTimer);\n this.cursorTimer = null;\n }\n this.pendingCursorPoint = null;\n removeFromParent(this.canvas);\n removeFromParent(this.spacer);\n removeFromParent(this.overlayLayer);\n removeFromParent(this.tooltip);\n this.canvas = null;\n this.spacer = null;\n this.overlayLayer = null;\n this.tooltip = null;\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n this.root = null;\n }\n\n private ensureHeightIndex(rows: InternalRow[], key: string | null, wrapAny: boolean) {\n const existing = this.heightIndex;\n if (existing && existing.rowsRef === rows && existing.key === key) return;\n const heights = new Array(rows.length);\n const idToIndex = new Map<string, number>();\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n if (!row) continue;\n idToIndex.set(row.id, i);\n let h = this.rowHeight;\n if (wrapAny && key) {\n const version = this.dataModel.getRowVersion(row.id);\n const measuredVersion = this.rowHeightMeasuredVersion.get(row.id);\n const cachedHeight = this.dataModel.getRowHeight(row.id);\n if (measuredVersion === version && typeof cachedHeight === \"number\") h = cachedHeight;\n }\n heights[i] = h;\n }\n this.heightIndex = {\n key,\n rowsRef: rows,\n idToIndex,\n heights,\n fenwick: FenwickTree.from(heights),\n };\n }\n\n private applyRowHeightUpdates(updates: Record<string, number>) {\n const index = this.heightIndex;\n if (!index) return;\n for (const [rowId, next] of Object.entries(updates)) {\n const i = index.idToIndex.get(rowId);\n if (i === undefined) continue;\n const prev = index.heights[i] ?? this.rowHeight;\n if (prev === next) continue;\n index.heights[i] = next;\n index.fenwick.add(i, next - prev);\n }\n }\n\n private getRowHeightCacheKey(schema: Schema, view: View, colWidths: number[]) {\n const wraps = schema.columns\n .map((c) => ((view.wrapText?.[c.key] ?? c.wrapText) ? \"1\" : \"0\"))\n .join(\"\");\n const widths = colWidths.map((w) => String(w ?? 0)).join(\",\");\n return `${wraps}|${widths}`;\n }\n\n private cancelRowHeightMeasurement() {\n if (this.rowHeightMeasureRaf !== null) {\n cancelAnimationFrame(this.rowHeightMeasureRaf);\n this.rowHeightMeasureRaf = null;\n }\n this.rowHeightMeasureTask = null;\n }\n\n private scheduleRowHeightMeasurement() {\n if (this.rowHeightMeasureRaf !== null) return;\n this.rowHeightMeasureRaf = requestAnimationFrame(() => {\n this.rowHeightMeasureRaf = null;\n this.runRowHeightMeasurement();\n });\n }\n\n private runRowHeightMeasurement() {\n if (!this.canvas) return;\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.font = \"14px sans-serif\";\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n if (!wrapAny) return;\n const key = this.getRowHeightCacheKey(schema, view, colWidths);\n if (this.rowHeightCacheKey !== key) {\n this.rowHeightCacheKey = key;\n this.rowHeightMeasuredVersion.clear();\n this.rowHeightMeasureTask = null;\n }\n const task = this.rowHeightMeasureTask ?? { key, nextIndex: 0 };\n if (task.key !== key) return;\n\n const rows = this.dataModel.listRows();\n const updates: Record<string, number> = {};\n let measured = 0;\n const start = performance.now();\n while (task.nextIndex < rows.length && measured < CanvasRenderer.ROW_HEIGHT_MEASURE_CHUNK) {\n if (performance.now() - start > CanvasRenderer.ROW_HEIGHT_MEASURE_TIME_BUDGET_MS) break;\n const row = rows[task.nextIndex];\n task.nextIndex += 1;\n if (!row) continue;\n const version = this.dataModel.getRowVersion(row.id);\n if (this.rowHeightMeasuredVersion.get(row.id) === version) continue;\n const h = this.measureRowHeight(ctx, row, schema, colWidths);\n updates[row.id] = h;\n this.rowHeightMeasuredVersion.set(row.id, version);\n measured += 1;\n }\n this.rowHeightMeasureTask = task.nextIndex < rows.length ? task : null;\n this.ensureHeightIndex(rows, this.rowHeightCacheKey, true);\n this.applyRowHeightUpdates(updates);\n this.dataModel.setRowHeightsBulk(updates);\n if (this.rowHeightMeasureTask) this.scheduleRowHeightMeasurement();\n }\n\n private handleClick = (ev: MouseEvent) => {\n if (!this.root || !this.canvas) return;\n const rect = this.canvas.getBoundingClientRect();\n const viewportX = ev.clientX - rect.left;\n const viewportY = ev.clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const y = viewportY;\n if (y >= this.headerHeight) return;\n if (x < this.rowHeaderWidth) return;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex < 0) return;\n const col = schema.columns[colIndex];\n if (!col) return;\n const w = colWidths[colIndex] ?? 100;\n const iconSize = 18;\n const pad = 4;\n const iconLeft = xCursor + w - iconSize - pad;\n const iconTop = Math.floor((this.headerHeight - iconSize) / 2);\n const inIcon =\n x >= iconLeft && x <= iconLeft + iconSize && y >= iconTop && y <= iconTop + iconSize;\n if (!inIcon) return;\n this.root.dispatchEvent(\n new CustomEvent(\"extable:filter-sort-open\", { bubbles: true, detail: { colKey: col.key } }),\n );\n };\n\n getCellElements() {\n return null;\n }\n\n hitTest(event: MouseEvent) {\n if (!this.root || !this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n // Use viewport-relative coordinates first because headers are rendered as \"sticky\"\n // (they should not be offset by scrollTop in hit-test).\n const viewportX = event.clientX - rect.left;\n const viewportY = event.clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const headerHeight = this.headerHeight;\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const key = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n this.ensureHeightIndex(rows, key, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return null;\n const totalRowsHeight = heightIndex.fenwick.total();\n const viewportHeight = this.canvas?.height ?? this.root.clientHeight;\n const dataViewportHeight = Math.max(0, viewportHeight - this.headerHeight);\n const maxContentScrollTop = Math.max(0, totalRowsHeight - dataViewportHeight);\n const contentScrollTop = Math.max(0, Math.min(this.root.scrollTop, maxContentScrollTop));\n if (viewportY < headerHeight && viewportX < this.rowHeaderWidth) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n rect: new DOMRect(rect.left, rect.top, this.rowHeaderWidth, headerHeight),\n };\n }\n if (viewportY < headerHeight) {\n // Column header region (canvas)\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex >= 0) {\n const col = schema.columns[colIndex];\n const cellRect = new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top,\n colWidths[colIndex] ?? 100,\n headerHeight,\n );\n return { rowId: \"__header__\", colKey: col.key, rect: cellRect };\n }\n return null;\n }\n if (viewportX < this.rowHeaderWidth) {\n const y = viewportY - headerHeight + contentScrollTop;\n const rowIndex = Math.max(\n 0,\n Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(y + 1)),\n );\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n const row = rows[rowIndex];\n const topPx = rect.top + headerHeight + accumHeight - contentScrollTop;\n const cellRect = new DOMRect(\n rect.left,\n topPx,\n this.rowHeaderWidth,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n return { rowId: row.id, colKey: null, rect: cellRect };\n }\n const y = viewportY - headerHeight + contentScrollTop;\n const rowIndex = Math.max(0, Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(y + 1)));\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex === -1) return null;\n const row = rows[rowIndex];\n const col = schema.columns[colIndex];\n const rowTop = accumHeight;\n const cellRect = new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top + headerHeight + rowTop - this.root.scrollTop,\n colWidths[colIndex] ?? 100,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n return { rowId: row.id, colKey: col.key, rect: cellRect };\n }\n\n private isPointInSelection(rowId: string, colKey: string) {\n if (!this.selection.length) return false;\n const schema = this.dataModel.getSchema();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (rowIndex < 0 || colIndex < 0) return false;\n for (const range of this.selection) {\n if (range.kind !== \"cells\") continue;\n const startRow = Math.min(range.startRow, range.endRow);\n const endRow = Math.max(range.startRow, range.endRow);\n const startCol = Math.min(range.startCol, range.endCol);\n const endCol = Math.max(range.startCol, range.endCol);\n if (rowIndex >= startRow && rowIndex <= endRow && colIndex >= startCol && colIndex <= endCol)\n return true;\n }\n return false;\n }\n\n private handlePointerMove = (ev: PointerEvent) => {\n this.pendingCursorPoint = { x: ev.clientX, y: ev.clientY };\n if (this.cursorTimer) return;\n this.cursorTimer = window.setTimeout(() => {\n this.cursorTimer = null;\n const p = this.pendingCursorPoint;\n if (!p) return;\n this.updateCanvasCursor(p.x, p.y);\n }, 50);\n };\n\n private handlePointerLeave = () => {\n if (!this.canvas) return;\n this.canvas.style.cursor = \"cell\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n };\n\n private positionTooltipAtRect(rect: DOMRect) {\n if (!this.tooltip) return;\n if (!this.root) return;\n const pad = 8;\n const rootRect = this.root.getBoundingClientRect();\n const maxW = this.root.clientWidth;\n const maxH = this.root.clientHeight;\n let left = rect.right - rootRect.left + pad;\n let top = rect.top - rootRect.top + pad;\n let side: \"right\" | \"left\" = \"right\";\n const tRect = this.tooltip.getBoundingClientRect();\n if (left + tRect.width > maxW) {\n left = Math.max(0, rect.left - rootRect.left - tRect.width - pad);\n side = \"left\";\n }\n if (top + tRect.height > maxH) top = Math.max(0, maxH - tRect.height - pad);\n this.tooltip.style.left = `${left}px`;\n this.tooltip.style.top = `${top}px`;\n this.tooltip.dataset.side = side;\n }\n\n private refreshTooltipPosition() {\n if (!this.tooltip || this.tooltip.dataset.visible !== \"1\") return;\n if (!this.tooltipTarget || !this.tooltipMessage) return;\n const rect = this.getCellRect(this.tooltipTarget.rowId, this.tooltipTarget.colKey);\n if (!rect) {\n this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n return;\n }\n this.tooltip.textContent = this.tooltipMessage;\n this.positionTooltipAtRect(rect);\n }\n\n private getCellRect(rowId: string, colKey: string): DOMRect | null {\n if (!this.root || !this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (rowIndex < 0 || colIndex < 0) return null;\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const key = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n this.ensureHeightIndex(rows, key, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return null;\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n let xCursor = this.rowHeaderWidth;\n for (let i = 0; i < colIndex; i += 1) {\n xCursor += colWidths[i] ?? 100;\n }\n return new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top + this.headerHeight + accumHeight - this.root.scrollTop,\n colWidths[colIndex] ?? 100,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n }\n\n private updateCanvasCursor(clientX: number, clientY: number) {\n if (!this.root || !this.canvas) return;\n if (this.root.dataset.extableFillDragging === \"1\") {\n this.canvas.style.cursor = \"crosshair\";\n return;\n }\n // Header hover (filter/sort icon affordance)\n {\n const rect = this.canvas.getBoundingClientRect();\n const viewportX = clientX - rect.left;\n const viewportY = clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const y = viewportY;\n const prevKey = this.hoverHeaderColKey;\n const prevIcon = this.hoverHeaderIcon;\n let nextKey: string | null = null;\n let nextIcon = false;\n if (y >= 0 && y < this.headerHeight && x >= this.rowHeaderWidth) {\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n const col = colIndex >= 0 ? schema.columns[colIndex] : null;\n if (col) {\n nextKey = col.key;\n const w = colWidths[colIndex] ?? 100;\n const iconSize = 18;\n const pad = 4;\n const iconLeft = xCursor + w - iconSize - pad;\n const iconTop = Math.floor((this.headerHeight - iconSize) / 2);\n nextIcon =\n x >= iconLeft && x <= iconLeft + iconSize && y >= iconTop && y <= iconTop + iconSize;\n }\n }\n const changed =\n String(prevKey ?? \"\") !== String(nextKey ?? \"\") || Boolean(prevIcon) !== Boolean(nextIcon);\n this.hoverHeaderColKey = nextKey;\n this.hoverHeaderIcon = nextIcon;\n if (nextKey !== null) {\n this.canvas.style.cursor = nextIcon ? \"pointer\" : \"default\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n if (changed) this.render();\n return;\n }\n if (changed) this.render();\n }\n // Cursor spec:\n // - No selection or outside selection: cell\n // - Inside selection & on fill handle: crosshair\n // - Inside selection & readonly/boolean: default\n // - Inside selection & others: text\n let cursor = \"cell\";\n\n const hit = this.hitTest(new MouseEvent(\"mousemove\", { clientX, clientY }));\n if (!hit) {\n this.canvas.style.cursor = cursor;\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n return;\n }\n if (hit.colKey === \"__all__\" || hit.colKey === null) {\n this.canvas.style.cursor = \"default\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n return;\n }\n // In readonly editMode, keep spreadsheet-like cursor for all body cells.\n if (this.getEditMode() === \"readonly\") {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n const marker = this.dataModel.getCellMarker(hit.rowId, hit.colKey);\n if (this.tooltip && marker) {\n const sameCell =\n this.tooltipTarget &&\n this.tooltipTarget.rowId === hit.rowId &&\n this.tooltipTarget.colKey === hit.colKey;\n const sameMessage = this.tooltipMessage === marker.message;\n if (!sameCell || !sameMessage || this.tooltip.dataset.visible !== \"1\") {\n this.tooltipTarget = { rowId: hit.rowId, colKey: hit.colKey };\n this.tooltipMessage = marker.message;\n this.tooltip.textContent = marker.message;\n const rect = this.getCellRect(hit.rowId, hit.colKey);\n if (rect) {\n this.positionTooltipAtRect(rect);\n this.tooltip.dataset.visible = \"1\";\n } else {\n this.tooltip.dataset.visible = \"0\";\n }\n }\n } else if (this.tooltip) {\n this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n }\n\n if (!this.isPointInSelection(hit.rowId, hit.colKey)) {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n // Only the active cell shows edit-mode cursor affordances. Other selected cells stay `cell`.\n const isActiveCell =\n this.activeRowId === hit.rowId &&\n this.activeColKey !== null &&\n this.activeColKey === hit.colKey;\n if (!isActiveCell) {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n // Fill handle hover is only considered inside the active cell and when fill handle is shown.\n if (\n this.activeRowId &&\n this.activeColKey !== null &&\n this.activeRowId !== \"__all__\" &&\n this.activeColKey !== \"__all__\" &&\n shouldShowFillHandle(\n this.dataModel,\n this.selection,\n this.activeRowId,\n this.activeColKey,\n this.getEditMode(),\n )\n ) {\n const cellRect = this.getCellRect(this.activeRowId, this.activeColKey);\n if (cellRect) {\n const handleRect = getFillHandleRect(cellRect, FILL_HANDLE_HIT_SIZE_PX);\n if (isPointInRect(clientX, clientY, handleRect)) {\n this.canvas.style.cursor = \"crosshair\";\n return;\n }\n }\n }\n\n const col = this.dataModel.getSchema().columns.find((c) => c.key === hit.colKey);\n const readOnly = this.dataModel.isReadonly(hit.rowId, hit.colKey);\n if (readOnly || col?.type === \"boolean\") cursor = \"default\";\n else cursor = \"text\";\n this.canvas.style.cursor = cursor;\n }\n\n private measureRowHeight(\n ctx: CanvasRenderingContext2D,\n row: InternalRow,\n schema: Schema,\n colWidths: number[],\n ) {\n let maxHeight = this.rowHeight;\n const view = this.dataModel.getView();\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n if (!c) continue;\n const wrap = view.wrapText?.[c.key] ?? c.wrapText;\n if (!wrap) continue;\n const w = (colWidths[idx] ?? 100) - this.padding;\n const valueRes = this.dataModel.resolveCellValue(row.id, c);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, c);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const text = textOverride ? \"#ERROR\" : this.formatValue(valueRes.value, c).text;\n const lines = this.wrapLines(ctx, text, w);\n const h = lines.length * this.lineHeight + this.padding;\n maxHeight = Math.max(maxHeight, h);\n }\n return maxHeight;\n }\n\n private wrapLines(ctx: CanvasRenderingContext2D, text: string, width: number) {\n const key = `${ctx.font}|${width}|${text}`;\n const cached = this.textMeasureCache.get(key);\n if (cached) {\n // LRU refresh\n this.textMeasureCache.delete(key);\n this.textMeasureCache.set(key, cached);\n return cached.lines;\n }\n const rawLines = text.split(\"\\n\");\n const lines: string[] = [];\n for (const line of rawLines) {\n let current = line;\n while (ctx.measureText(current).width > width && current.length > 1) {\n let cut = current.length;\n while (cut > 1 && ctx.measureText(current.slice(0, cut)).width > width) {\n cut -= 1;\n }\n lines.push(current.slice(0, cut));\n current = current.slice(cut);\n }\n lines.push(current);\n }\n this.textMeasureCache.set(key, { lines });\n while (this.textMeasureCache.size > CanvasRenderer.TEXT_MEASURE_CACHE_MAX) {\n const firstKey = this.textMeasureCache.keys().next().value as string | undefined;\n if (!firstKey) break;\n this.textMeasureCache.delete(firstKey);\n }\n return lines;\n }\n\n private drawCellText(\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n width: number,\n height: number,\n wrap: boolean,\n align: \"left\" | \"right\" | \"center\" = \"left\",\n isBoolean = false,\n isCustomBoolean = false,\n decorations?: { underline?: boolean; strike?: boolean },\n ) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(x - 4, y - 4, width + 8, height + 8);\n ctx.clip();\n const fontBackup = ctx.font;\n if (isBoolean) {\n ctx.font = \"28px sans-serif\";\n } else if (isCustomBoolean) {\n ctx.font = \"14px sans-serif\";\n }\n const renderLine = (ln: string, lineIdx: number) => {\n const baseline = y + this.lineHeight * lineIdx;\n let startX = x;\n let endX = x;\n if (align === \"right\") {\n ctx.textAlign = \"right\";\n endX = x + width;\n startX = endX - ctx.measureText(ln).width;\n ctx.fillText(ln, endX, baseline);\n } else if (align === \"center\") {\n ctx.textAlign = \"center\";\n const center = x + width / 2;\n const w = ctx.measureText(ln).width;\n startX = center - w / 2;\n endX = center + w / 2;\n ctx.fillText(ln, center, baseline);\n } else {\n ctx.textAlign = \"left\";\n startX = x;\n endX = x + ctx.measureText(ln).width;\n ctx.fillText(ln, x, baseline);\n }\n if (decorations?.underline || decorations?.strike) {\n const strokeBackup = ctx.strokeStyle;\n const lineWidthBackup = ctx.lineWidth;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = 1;\n ctx.beginPath();\n if (decorations.underline) {\n const yUnderline = baseline + 2;\n ctx.moveTo(startX, yUnderline);\n ctx.lineTo(endX, yUnderline);\n }\n if (decorations.strike) {\n const yStrike = baseline - Math.floor(this.lineHeight / 2) + 2;\n ctx.moveTo(startX, yStrike);\n ctx.lineTo(endX, yStrike);\n }\n ctx.stroke();\n ctx.strokeStyle = strokeBackup;\n ctx.lineWidth = lineWidthBackup;\n }\n };\n if (wrap) {\n const lines = this.wrapLines(ctx, text, width);\n for (let idx = 0; idx < lines.length; idx += 1) {\n renderLine(lines[idx], idx + 1);\n }\n } else {\n let out = text;\n while (ctx.measureText(out).width > width && out.length > 1) {\n out = `${out.slice(0, -2)}…`;\n }\n renderLine(out, 1);\n }\n ctx.textAlign = \"left\";\n ctx.font = fontBackup;\n ctx.restore();\n }\n\n private formatValue(value: unknown, col: ColumnSchema): { text: string; color?: string } {\n if (value === null || value === undefined) return { text: \"\" };\n if (col.type === \"boolean\") {\n if (col.booleanDisplay === \"checkbox\" || !col.booleanDisplay) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.booleanDisplay) && col.booleanDisplay.length >= 2) {\n return { text: value ? String(col.booleanDisplay[0]) : String(col.booleanDisplay[1]) };\n }\n return { text: value ? String(col.booleanDisplay) : \"\" };\n }\n if (col.type === \"number\" && typeof value === \"number\") {\n const num = value;\n const opts: Intl.NumberFormatOptions = {};\n if (col.number?.scale !== undefined) {\n opts.minimumFractionDigits = col.number.scale;\n opts.maximumFractionDigits = col.number.scale;\n }\n opts.useGrouping = Boolean(col.number?.thousandSeparator);\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = col.number?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n if (\n (col.type === \"date\" || col.type === \"time\" || col.type === \"datetime\") &&\n (value instanceof Date || typeof value === \"string\")\n ) {\n const fmt =\n col.type === \"date\"\n ? (col.dateFormat ?? \"yyyy-MM-dd\")\n : col.type === \"time\"\n ? (col.timeFormat ?? \"HH:mm\")\n : (col.dateTimeFormat ?? \"yyyy-MM-dd'T'HH:mm:ss'Z'\");\n let d: Date | null = null;\n if (value instanceof Date) d = value;\n else {\n d = this.valueFormatCache.parseIsoDate(value);\n }\n if (!d) return { text: String(value) };\n return { text: formatDateLite(d, fmt) };\n }\n return { text: String(value) };\n }\n}\n","import type { Command, EditMode, SelectionRange } from \"./types\";\nimport type { DataModel } from \"./dataModel\";\nimport {\n FILL_HANDLE_HIT_SIZE_PX,\n getFillHandleRect,\n getFillHandleSource,\n isPointInRect,\n makeFillValueGetter,\n shouldShowFillHandle,\n} from \"./fillHandle\";\nimport { removeFromParent } from \"./utils\";\nimport {\n DEFAULT_ROW_HEIGHT_PX,\n HEADER_HEIGHT_PX,\n ROW_HEADER_WIDTH_PX,\n getColumnWidths,\n} from \"./geometry\";\n\ntype EditHandler = (cmd: Command, commit: boolean) => void;\ntype RowSelectHandler = (rowId: string) => void;\ntype MoveHandler = (rowId?: string) => void;\ntype HitTest = (\n event: MouseEvent,\n) => { rowId: string; colKey: string | null; element?: HTMLElement; rect: DOMRect } | null;\ntype ActiveChange = (rowId: string | null, colKey: string | null) => void;\ntype ContextMenuHandler = (\n rowId: string | null,\n colKey: string | null,\n clientX: number,\n clientY: number,\n) => void;\ntype SelectionChange = (ranges: SelectionRange[]) => void;\ntype UndoRedoHandler = () => void;\n\nexport class SelectionManager {\n private root: HTMLElement;\n private editMode: EditMode;\n private onEdit: EditHandler;\n private onRowSelect: RowSelectHandler;\n private onMove: MoveHandler;\n private hitTest: HitTest;\n private onContextMenu: ContextMenuHandler;\n private handleDocumentContextMenu: ((ev: MouseEvent) => void) | null = null;\n private selectionRanges: SelectionRange[] = [];\n private inputEl: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null = null;\n private floatingInputWrapper: HTMLDivElement | null = null;\n private selectionInput: HTMLInputElement | null = null;\n private copyToastEl: HTMLDivElement | null = null;\n private copyToastTimer: number | null = null;\n private selectionMode = true;\n private lastBooleanCell: { rowId: string; colKey: string } | null = null;\n private selectionAnchor: { rowIndex: number; colIndex: number } | null = null;\n private dragging = false;\n private dragStart: { rowIndex: number; colIndex: number; kind: \"cells\" | \"rows\" } | null = null;\n private pointerDownClient: { x: number; y: number } | null = null;\n private dragMoved = false;\n private dragSelectionChanged = false;\n private suppressNextClick = false;\n private fillDragging = false;\n private fillSource: import(\"./fillHandle\").FillHandleSource | null = null;\n private fillEndRowIndex: number | null = null;\n private rootCursorBackup: string | null = null;\n private lastPointerClient: { x: number; y: number } | null = null;\n private autoScrollRaf: number | null = null;\n private autoScrollActive = false;\n private activeCell: { rowId: string; colKey: string | null } | null = null;\n private activeHost: HTMLElement | null = null;\n private activeHostOriginalText: string | null = null;\n private composing = false;\n private lastCompositionEnd = 0;\n private readonly handleSelectionBlur = () => this.teardownSelectionInput();\n private readonly handleRootKeydown = async (ev: KeyboardEvent) => {\n if (ev.defaultPrevented) return;\n if (!this.selectionMode) return;\n if (this.inputEl) return;\n if (ev.isComposing || this.composing) return;\n const isMac = typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n const accel = isMac ? ev.metaKey : ev.ctrlKey;\n if (!accel) return;\n const key = ev.key.toLowerCase();\n if (key === \"c\") {\n ev.preventDefault();\n await this.copySelection();\n } else if (key === \"x\") {\n ev.preventDefault();\n await this.copySelection();\n this.clearSelectionValues();\n }\n };\n private isCellReadonly: (rowId: string, colKey: string) => boolean;\n private sequenceLangs?: readonly string[];\n\n constructor(\n root: HTMLElement,\n editMode: EditMode,\n onEdit: EditHandler,\n onRowSelect: RowSelectHandler,\n onMove: MoveHandler,\n hitTest: HitTest,\n private dataModel: DataModel,\n sequenceLangs: readonly string[] | undefined,\n isCellReadonly: (rowId: string, colKey: string) => boolean,\n private onActiveChange: ActiveChange,\n onContextMenu: ContextMenuHandler,\n private onSelectionChange: SelectionChange,\n private onUndo: UndoRedoHandler,\n private onRedo: UndoRedoHandler,\n ) {\n this.root = root;\n this.editMode = editMode;\n this.onEdit = onEdit;\n this.onRowSelect = onRowSelect;\n this.onMove = onMove;\n this.hitTest = hitTest;\n this.sequenceLangs = sequenceLangs;\n this.isCellReadonly = isCellReadonly;\n this.onContextMenu = onContextMenu;\n this.bind();\n }\n\n setEditMode(mode: EditMode) {\n this.editMode = mode;\n }\n\n syncAfterRowsChanged() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n if (!rows.length || !schema.columns.length) {\n this.selectionRanges = [];\n this.activeCell = null;\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(true);\n this.onActiveChange(null, null);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n return;\n }\n\n const maxRow = rows.length - 1;\n const maxCol = schema.columns.length - 1;\n\n const activeRowId = this.activeCell?.rowId ?? null;\n const activeColKey = this.activeCell?.colKey ?? null;\n const activeRowIndex = activeRowId ? this.dataModel.getRowIndex(activeRowId) : -1;\n const activeColIndex =\n activeColKey !== null\n ? schema.columns.findIndex((c) => String(c.key) === String(activeColKey))\n : -1;\n\n // If current active cell is still visible, just clamp selection ranges when needed.\n if (activeRowIndex >= 0 && activeColIndex >= 0) {\n let changed = false;\n if (!this.selectionRanges.length) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: activeRowIndex,\n endRow: activeRowIndex,\n startCol: activeColIndex,\n endCol: activeColIndex,\n },\n ];\n changed = true;\n } else {\n const nextRanges: SelectionRange[] = this.selectionRanges.map((r) => {\n const clamp = (n: number, max: number) => Math.max(0, Math.min(max, n));\n const next: SelectionRange = {\n ...r,\n startRow: clamp(r.startRow, maxRow),\n endRow: clamp(r.endRow, maxRow),\n startCol: clamp(r.startCol, maxCol),\n endCol: clamp(r.endCol, maxCol),\n };\n if (\n next.startRow !== r.startRow ||\n next.endRow !== r.endRow ||\n next.startCol !== r.startCol ||\n next.endCol !== r.endCol\n ) {\n changed = true;\n }\n return next;\n });\n this.selectionRanges = nextRanges;\n }\n if (changed) this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n return;\n }\n\n // Active row got filtered out (or active col disappeared): move to the nearest visible row/col.\n const desiredColKey = activeColKey ?? schema.columns[0]?.key ?? \"\";\n let colIndex = schema.columns.findIndex((c) => String(c.key) === String(desiredColKey));\n if (colIndex < 0) colIndex = 0;\n const colKey = schema.columns[colIndex]?.key ?? \"\";\n\n const baseIndex = activeRowId ? this.dataModel.getBaseRowIndex(activeRowId) : 0;\n const fallbackRow = rows[rows.length - 1] ?? rows[0] ?? null;\n const nextRow =\n rows.find((r) => this.dataModel.getBaseRowIndex(r.id) >= baseIndex) ?? fallbackRow;\n if (!nextRow) return;\n const rowId = nextRow.id;\n const rowIndex = this.dataModel.getRowIndex(rowId);\n\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(false);\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: rowIndex,\n endRow: rowIndex,\n startCol: colIndex,\n endCol: colIndex,\n },\n ];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n const current = this.dataModel.getCell(rowId, colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n this.updateFillHandleFlag();\n }\n\n navigateToCell(rowId: string, colKey: string) {\n const schema = this.dataModel.getSchema();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(colKey));\n if (rowIndex < 0 || colIndex < 0) return;\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(false);\n const nextRange: SelectionRange = {\n kind: \"cells\",\n startRow: rowIndex,\n endRow: rowIndex,\n startCol: colIndex,\n endCol: colIndex,\n };\n this.selectionRanges = [nextRange];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n const current = this.dataModel.getCell(rowId, colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n this.updateFillHandleFlag();\n }\n\n cancelEditing() {\n this.teardownInput(true);\n }\n\n destroy() {\n this.root.removeEventListener(\"click\", this.handleClick);\n this.root.removeEventListener(\"pointerdown\", this.handlePointerDown);\n this.root.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.root.removeEventListener(\"pointerup\", this.handlePointerUp);\n this.root.removeEventListener(\"pointercancel\", this.handlePointerUp);\n this.root.removeEventListener(\"keydown\", this.handleRootKeydown);\n if (this.handleDocumentContextMenu) {\n document.removeEventListener(\"contextmenu\", this.handleDocumentContextMenu, true);\n }\n this.teardownInput(true);\n this.teardownSelectionInput();\n this.teardownCopyToast();\n this.stopAutoScroll();\n }\n\n onScroll(scrollTop: number, scrollLeft: number) {\n // Editors are positioned in scroll-container content coordinates and follow scroll automatically.\n void scrollTop;\n void scrollLeft;\n this.positionCopyToast();\n }\n\n private bind() {\n this.root.addEventListener(\"click\", this.handleClick);\n this.root.addEventListener(\"pointerdown\", this.handlePointerDown);\n this.root.addEventListener(\"pointermove\", this.handlePointerMove);\n this.root.addEventListener(\"pointerup\", this.handlePointerUp);\n this.root.addEventListener(\"pointercancel\", this.handlePointerUp);\n this.root.addEventListener(\"keydown\", this.handleRootKeydown);\n this.handleDocumentContextMenu = (ev: MouseEvent) => this.handleContextMenu(ev);\n document.addEventListener(\"contextmenu\", this.handleDocumentContextMenu, { capture: true });\n }\n\n private updateFillHandleFlag() {\n const activeColKey = this.activeCell?.colKey ?? null;\n const activeRowId = this.activeCell?.rowId ?? null;\n this.root.dataset.extableFillHandle = shouldShowFillHandle(\n this.dataModel,\n this.selectionRanges,\n activeRowId,\n activeColKey,\n this.editMode,\n )\n ? \"1\"\n : \"\";\n }\n\n private findColumn(colKey: string) {\n const schema = this.dataModel.getSchema();\n return schema.columns.find((c) => c.key === colKey);\n }\n\n private pad2(n: number) {\n return String(n).padStart(2, \"0\");\n }\n\n private formatLocalDateForInput(d: Date) {\n return `${d.getFullYear()}-${this.pad2(d.getMonth() + 1)}-${this.pad2(d.getDate())}`;\n }\n\n private formatLocalTimeForInput(d: Date) {\n return `${this.pad2(d.getHours())}:${this.pad2(d.getMinutes())}`;\n }\n\n private formatLocalDateTimeForInput(d: Date) {\n return `${this.formatLocalDateForInput(d)}T${this.formatLocalTimeForInput(d)}`;\n }\n\n private normalizeTemporalInitialValue(colType: \"date\" | \"time\" | \"datetime\", initial: string) {\n const value = initial.trim();\n if (!value) return \"\";\n\n if (colType === \"date\") {\n const m = value.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (m) return m[1] ?? \"\";\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalDateForInput(d);\n return \"\";\n }\n\n if (colType === \"time\") {\n const m = value.match(/(\\d{2}:\\d{2})(?::\\d{2})?/);\n if (m) return m[1] ?? \"\";\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalTimeForInput(d);\n return \"\";\n }\n\n // datetime => input[type=\"datetime-local\"] expects \"YYYY-MM-DDTHH:mm\" (no timezone).\n if (/Z$/.test(value) && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/.test(value)) {\n return value.replace(/Z$/, \"\").slice(0, 16);\n }\n if (\n /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}/.test(value) &&\n !/[+-]\\d{2}:\\d{2}$/.test(value)\n ) {\n return value.slice(0, 16);\n }\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalDateTimeForInput(d);\n return \"\";\n }\n\n private ensureCopyToast() {\n if (this.copyToastEl) return this.copyToastEl;\n // Ensure a positioning context for the toast.\n const computed = window.getComputedStyle(this.root);\n if (computed.position === \"static\") {\n this.root.style.position = \"relative\";\n }\n const toast = document.createElement(\"div\");\n toast.className = \"extable-toast\";\n toast.dataset.extableCopyToast = \"1\";\n toast.style.position = \"absolute\";\n toast.style.left = \"0\";\n toast.style.top = \"0\";\n toast.style.pointerEvents = \"none\";\n toast.style.zIndex = \"1000\";\n toast.style.display = \"none\";\n // Keep it from affecting layout.\n toast.style.margin = \"0\";\n this.root.appendChild(toast);\n this.copyToastEl = toast;\n return toast;\n }\n\n private teardownCopyToast() {\n if (this.copyToastTimer) {\n window.clearTimeout(this.copyToastTimer);\n this.copyToastTimer = null;\n }\n if (!this.copyToastEl) return;\n this.copyToastEl.style.display = \"none\";\n removeFromParent(this.copyToastEl);\n this.copyToastEl = null;\n }\n\n private positionCopyToast() {\n if (!this.copyToastEl) return;\n const w = this.copyToastEl.offsetWidth || 0;\n const h = this.copyToastEl.offsetHeight || 0;\n const inset = 16;\n const maxLeft = Math.max(0, this.root.scrollLeft + this.root.clientWidth - w - inset);\n const maxTop = Math.max(0, this.root.scrollTop + this.root.clientHeight - h - inset);\n const minLeft = Math.max(0, this.root.scrollLeft + inset);\n const minTop = Math.max(0, this.root.scrollTop + inset);\n const rootRect = this.root.getBoundingClientRect();\n const rect = this.getActiveCellRect();\n if (rect) {\n const candidateLeft = rect.right - rootRect.left + this.root.scrollLeft - w + 8;\n const candidateTop = rect.top - rootRect.top + this.root.scrollTop - h + 8;\n const left = Math.min(maxLeft, Math.max(minLeft, candidateLeft));\n const top = Math.min(maxTop, Math.max(minTop, candidateTop));\n this.copyToastEl.style.left = `${left}px`;\n this.copyToastEl.style.top = `${top}px`;\n return;\n }\n this.copyToastEl.style.left = `${maxLeft}px`;\n this.copyToastEl.style.top = `${maxTop}px`;\n }\n\n private showCopyToast(message: string, variant: \"info\" | \"error\" = \"info\", durationMs = 1200) {\n const toast = this.ensureCopyToast();\n toast.textContent = message;\n toast.dataset.variant = variant;\n toast.style.display = \"block\";\n this.positionCopyToast();\n if (this.copyToastTimer) {\n window.clearTimeout(this.copyToastTimer);\n this.copyToastTimer = null;\n }\n this.copyToastTimer = window.setTimeout(() => {\n toast.style.display = \"none\";\n }, durationMs);\n }\n\n private ensureSelectionInput() {\n if (this.selectionInput) return this.selectionInput;\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.autocomplete = \"off\";\n input.spellcheck = false;\n input.style.position = \"absolute\";\n input.style.left = \"0\";\n input.style.top = \"0\";\n // Avoid affecting scroll extents in the scroll container.\n input.style.transform = \"translate(-10000px, 0)\";\n input.style.width = \"1px\";\n input.style.height = \"1px\";\n input.style.opacity = \"0\";\n input.style.pointerEvents = \"none\";\n input.addEventListener(\"keydown\", this.handleSelectionKeydown);\n input.addEventListener(\"compositionstart\", this.handleSelectionCompositionStart);\n input.addEventListener(\"copy\", this.handleSelectionCopy);\n input.addEventListener(\"cut\", this.handleSelectionCut);\n input.addEventListener(\"paste\", this.handleSelectionPaste);\n input.addEventListener(\"blur\", this.handleSelectionBlur);\n // Keep the selection input inside the table container (root), but offscreen.\n this.root.appendChild(input);\n this.selectionInput = input;\n return input;\n }\n\n private focusSelectionInput(valueForSelection: string) {\n const input = this.ensureSelectionInput();\n input.value = valueForSelection;\n this.selectionMode = true;\n input.focus({ preventScroll: true });\n input.select();\n }\n\n private openEditorAtActiveCell(options?: {\n initialValueOverride?: string;\n placeCursorAtEnd?: boolean;\n }) {\n if (!this.activeCell) return;\n const { rowId, colKey } = this.activeCell;\n if (colKey === null) return;\n const cell = this.findHtmlCellElement(rowId, colKey);\n if (cell) {\n this.activateCellElement(cell, rowId, colKey, options);\n return;\n }\n const rect = this.computeCanvasCellRect(rowId, colKey);\n if (rect) {\n this.activateFloating(rect, rowId, colKey, options);\n }\n }\n\n private escapeCssAttrValue(value: string) {\n const css = (globalThis as unknown as { CSS?: { escape?: (s: string) => string } }).CSS;\n const escapeFn = css?.escape;\n if (typeof escapeFn === \"function\") return escapeFn(value);\n // Minimal escaping for attribute selector values inside double quotes.\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n }\n\n private findHtmlCellElement(rowId: string, colKey: string | null) {\n if (colKey === null) return null;\n const key = String(colKey);\n const rowIdEsc = this.escapeCssAttrValue(rowId);\n const keyEsc = this.escapeCssAttrValue(key);\n return (\n this.root.querySelector<HTMLElement>(\n `tr[data-row-id=\"${rowIdEsc}\"] td[data-col-key=\"${keyEsc}\"]`,\n ) ?? null\n );\n }\n\n private computeCanvasCellRect(rowId: string, colKey: string | null) {\n if (colKey === null) return null;\n const box = this.computeCanvasCellBoxContent(rowId, colKey);\n if (!box) return null;\n const rootRect = this.root.getBoundingClientRect();\n return new DOMRect(\n rootRect.left + box.left - this.root.scrollLeft,\n rootRect.top + box.top - this.root.scrollTop,\n box.width,\n box.height,\n );\n }\n\n private computeCanvasCellBoxContent(rowId: string, colKey: string) {\n const canvas = this.root.querySelector<HTMLCanvasElement>(\n 'canvas[data-extable-renderer=\"canvas\"]',\n );\n if (!canvas) return null;\n return this.getCanvasCellMetrics(rowId, colKey);\n }\n\n private getCanvasCellMetrics(rowId: string, colKey: string) {\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const rowIndex = rows.findIndex((r) => r.id === rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(colKey));\n if (rowIndex < 0 || colIndex < 0) return null;\n\n const headerHeight = HEADER_HEIGHT_PX;\n const rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n const defaultRowHeight = DEFAULT_ROW_HEIGHT_PX;\n const colWidths = getColumnWidths(schema, view);\n\n let left = rowHeaderWidth;\n for (let i = 0; i < colIndex; i += 1) left += colWidths[i] ?? 100;\n\n let top = headerHeight;\n for (let i = 0; i < rowIndex; i += 1) {\n const row = rows[i];\n if (!row) return null;\n const h = this.dataModel.getRowHeight(row.id) ?? defaultRowHeight;\n top += h;\n }\n const height = this.dataModel.getRowHeight(rowId) ?? defaultRowHeight;\n const width = colWidths[colIndex] ?? 100;\n return { left, top, width, height, rowIndex, colIndex };\n }\n\n private getActiveCellRect() {\n const active = this.activeCell;\n if (!active) return null;\n const rootRect = this.root.getBoundingClientRect();\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n if (active.rowId === \"__all__\" && active.colKey === \"__all__\") {\n return new DOMRect(rootRect.left, rootRect.top, ROW_HEADER_WIDTH_PX, HEADER_HEIGHT_PX);\n }\n if (active.rowId === \"__header__\" && active.colKey !== null) {\n const key = this.escapeCssAttrValue(String(active.colKey));\n const headerEl = this.root.querySelector<HTMLElement>(`th[data-col-key=\"${key}\"]`);\n if (headerEl) return headerEl.getBoundingClientRect();\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(active.colKey));\n if (colIndex >= 0) {\n const colWidths = getColumnWidths(schema, view);\n let x = ROW_HEADER_WIDTH_PX;\n for (let i = 0; i < colIndex; i += 1) x += colWidths[i] ?? 100;\n const width = colWidths[colIndex] ?? 100;\n return new DOMRect(\n rootRect.left + x - this.root.scrollLeft,\n rootRect.top,\n width,\n HEADER_HEIGHT_PX,\n );\n }\n }\n if (active.colKey === null) {\n const rowIndex = this.dataModel.getRowIndex(active.rowId);\n if (rowIndex >= 0) {\n let y = HEADER_HEIGHT_PX;\n const rows = this.dataModel.listRows();\n for (let i = 0; i < rowIndex; i += 1) {\n const row = rows[i];\n if (!row) break;\n y += this.dataModel.getRowHeight(row.id) ?? DEFAULT_ROW_HEIGHT_PX;\n }\n const height = this.dataModel.getRowHeight(active.rowId) ?? DEFAULT_ROW_HEIGHT_PX;\n return new DOMRect(\n rootRect.left,\n rootRect.top + y - this.root.scrollTop,\n ROW_HEADER_WIDTH_PX,\n height,\n );\n }\n }\n if (active.colKey === null) return null;\n const cellEl = this.findHtmlCellElement(active.rowId, active.colKey);\n if (cellEl) return cellEl.getBoundingClientRect();\n return this.computeCanvasCellRect(active.rowId, active.colKey);\n }\n\n private ensureVisibleCell(rowId: string, colKey: string) {\n const htmlCell = this.findHtmlCellElement(rowId, colKey);\n if (htmlCell) {\n if (typeof (htmlCell as HTMLElement).scrollIntoView === \"function\") {\n (htmlCell as HTMLElement).scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n }\n return;\n }\n const metrics = this.getCanvasCellMetrics(rowId, colKey);\n if (!metrics) return;\n const xStart = metrics.left;\n const xEnd = metrics.left + metrics.width;\n const yStart = metrics.top;\n const yEnd = metrics.top + metrics.height;\n\n const leftVis = this.root.scrollLeft;\n const rightVis = this.root.scrollLeft + this.root.clientWidth;\n const topVis = this.root.scrollTop;\n const bottomVis = this.root.scrollTop + this.root.clientHeight;\n\n if (xStart < leftVis) this.root.scrollLeft = Math.max(0, xStart);\n else if (xEnd > rightVis) this.root.scrollLeft = Math.max(0, xEnd - this.root.clientWidth);\n\n if (yStart < topVis) this.root.scrollTop = Math.max(0, yStart);\n else if (yEnd > bottomVis) this.root.scrollTop = Math.max(0, yEnd - this.root.clientHeight);\n }\n\n private moveActiveCell(deltaRow: number, deltaCol: number, extendSelection = false) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n if (!rows.length || !schema.columns.length) return;\n const { rowIndex, colIndex } = this.getActiveIndices();\n if (!extendSelection) this.selectionAnchor = null;\n const anchor =\n extendSelection && this.selectionAnchor\n ? this.selectionAnchor\n : extendSelection\n ? { rowIndex, colIndex }\n : null;\n if (extendSelection && !this.selectionAnchor) this.selectionAnchor = { rowIndex, colIndex };\n const nextRowIndex = Math.max(0, Math.min(rows.length - 1, rowIndex + deltaRow));\n const nextColIndex = Math.max(0, Math.min(schema.columns.length - 1, colIndex + deltaCol));\n {\n const row = rows[nextRowIndex];\n if (!row) return;\n const col = schema.columns[nextColIndex];\n if (!col) return;\n const rowId = row.id;\n const colKey = col.key;\n\n const nextRange: SelectionRange = anchor\n ? {\n kind: \"cells\",\n startRow: anchor.rowIndex,\n endRow: nextRowIndex,\n startCol: anchor.colIndex,\n endCol: nextColIndex,\n }\n : {\n kind: \"cells\",\n startRow: nextRowIndex,\n endRow: nextRowIndex,\n startCol: nextColIndex,\n endCol: nextColIndex,\n };\n this.selectionRanges = [nextRange];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n\n const current = this.dataModel.getCell(rowId, colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n this.updateFillHandleFlag();\n return;\n }\n }\n\n private handlePointerDown = (ev: PointerEvent) => {\n if (ev.button !== 0) return;\n const el = ev.target as HTMLElement | null;\n if (el?.closest('button[data-extable-fs-open=\"1\"]')) return;\n if (el?.closest(\".extable-filter-sort-trigger\")) return;\n // Avoid starting a drag from inside an active editor.\n if (this.inputEl && ev.target && this.inputEl.contains(ev.target as Node)) return;\n // Commit current editor before starting a drag/select operation.\n if (this.inputEl && this.activeCell && this.activeCell.colKey !== null) {\n const { rowId, colKey } = this.activeCell;\n const value = this.readActiveValue();\n this.commitEdit(rowId, colKey, value);\n this.onMove(rowId);\n this.teardownInput(false);\n }\n if (this.fillDragging) return;\n const hit = this.hitTest(ev as unknown as MouseEvent);\n if (!hit) return;\n if (hit.rowId === \"__all__\" && hit.colKey === \"__all__\") return;\n if (hit.colKey === \"__all__\") return;\n\n // Fill handle drag starts only when the pointer is down on the handle area.\n const fillSrc = getFillHandleSource(this.dataModel, this.selectionRanges);\n if (fillSrc && this.activeCell) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const handleRowIndex = fillSrc.endRowIndex;\n const handleColIndex = fillSrc.colIndex;\n const handleRow = rows[handleRowIndex];\n const handleCol = schema.columns[handleColIndex];\n if (handleRow && handleCol) {\n const cellRect =\n this.findHtmlCellElement(handleRow.id, handleCol.key)?.getBoundingClientRect() ??\n this.computeCanvasCellRect(handleRow.id, handleCol.key);\n if (\n cellRect &&\n shouldShowFillHandle(\n this.dataModel,\n this.selectionRanges,\n this.activeCell.rowId,\n this.activeCell.colKey,\n this.editMode,\n )\n ) {\n const handleRect = getFillHandleRect(cellRect, FILL_HANDLE_HIT_SIZE_PX);\n if (isPointInRect(ev.clientX, ev.clientY, handleRect)) {\n ev.preventDefault();\n this.fillDragging = true;\n this.fillSource = fillSrc;\n this.fillEndRowIndex = fillSrc.endRowIndex;\n this.root.dataset.extableFillDragging = \"1\";\n if (this.rootCursorBackup === null)\n this.rootCursorBackup = this.root.style.cursor || \"\";\n this.root.style.cursor = \"crosshair\";\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n this.dragging = false;\n this.dragStart = null;\n this.suppressNextClick = true;\n try {\n (ev.target as Element | null)?.setPointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n // Expand selection to include filled range preview (start with source).\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: fillSrc.startRowIndex,\n endRow: fillSrc.endRowIndex,\n startCol: fillSrc.colIndex,\n endCol: fillSrc.colIndex,\n },\n ];\n this.onSelectionChange(this.selectionRanges);\n this.startAutoScroll();\n return;\n }\n }\n }\n }\n\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const rowIndex = hit.rowId === \"__header__\" ? 0 : this.dataModel.getRowIndex(hit.rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIndex < 0) return;\n\n if (hit.rowId === \"__header__\") {\n // Select entire column when clicking column header.\n if (!rows.length) return;\n const range: SelectionRange = {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: colIndex,\n endCol: colIndex,\n };\n this.selectionRanges = [range];\n this.onSelectionChange(this.selectionRanges);\n this.dragging = false;\n this.selectionMode = true;\n this.dragStart = null;\n this.selectionAnchor = null;\n this.suppressNextClick = false;\n const targetRow = rows[0];\n const targetCol = schema.columns[colIndex];\n if (targetRow && targetCol) {\n this.activeCell = { rowId: targetRow.id, colKey: targetCol.key };\n this.onActiveChange(targetRow.id, targetCol.key);\n }\n this.focusSelectionInput(\"\");\n return;\n }\n\n if (rowIndex < 0) return;\n\n const kind: \"cells\" | \"rows\" = hit.colKey === null ? \"rows\" : \"cells\";\n this.dragging = true;\n this.pointerDownClient = { x: ev.clientX, y: ev.clientY };\n this.dragMoved = false;\n this.dragSelectionChanged = false;\n this.dragStart = { rowIndex, colIndex, kind };\n this.suppressNextClick = false;\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n\n try {\n (ev.target as Element | null)?.setPointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n this.startAutoScroll();\n };\n\n private getHitAtClientPoint(clientX: number, clientY: number) {\n // Prefer coordinate-based hit-test for auto-scroll ticks (no real event.target).\n if (typeof document.elementFromPoint !== \"function\") return null;\n const el = document.elementFromPoint(clientX, clientY) as HTMLElement | null;\n if (el && this.root.contains(el)) {\n const corner = el.closest<HTMLElement>(\"th.extable-corner\");\n if (corner) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n element: corner,\n rect: corner.getBoundingClientRect(),\n };\n }\n const rowHeader = el.closest<HTMLElement>(\"th.extable-row-header:not(.extable-corner)\");\n if (rowHeader) {\n const row = rowHeader.closest<HTMLElement>(\"tr[data-row-id]\");\n if (row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: null,\n element: rowHeader,\n rect: rowHeader.getBoundingClientRect(),\n };\n }\n }\n const colHeader = el.closest<HTMLElement>(\"th[data-col-key]\");\n if (colHeader) {\n return {\n rowId: \"__header__\",\n colKey: colHeader.dataset.colKey ?? \"\",\n element: colHeader,\n rect: colHeader.getBoundingClientRect(),\n };\n }\n const cell = el.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (cell && row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n element: cell,\n rect: cell.getBoundingClientRect(),\n };\n }\n }\n // Canvas renderer hitTest does not rely on target; a minimal shape is enough.\n return this.hitTest({ clientX, clientY } as unknown as MouseEvent);\n }\n\n private updateDragFromClientPoint(clientX: number, clientY: number) {\n if (!this.dragging || !this.dragStart) return;\n const hit = this.getHitAtClientPoint(clientX, clientY);\n if (!hit) return;\n if (\n hit.colKey === \"__all__\" ||\n (this.dragStart.kind === \"cells\" && hit.colKey === null)\n )\n return;\n\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const endRowIndex = this.dataModel.getRowIndex(hit.rowId);\n if (endRowIndex < 0) return;\n const endColIndex =\n this.dragStart.kind === \"rows\"\n ? schema.columns.length - 1\n : schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (endColIndex < 0) return;\n\n const startRow = this.dragStart.rowIndex;\n const startCol = this.dragStart.kind === \"rows\" ? 0 : this.dragStart.colIndex;\n const endCol = this.dragStart.kind === \"rows\" ? schema.columns.length - 1 : endColIndex;\n if (endRowIndex !== startRow || endCol !== startCol) {\n this.dragSelectionChanged = true;\n }\n const nextRange: SelectionRange = {\n kind: this.dragStart.kind,\n startRow,\n endRow: endRowIndex,\n startCol,\n endCol,\n };\n this.selectionRanges = [nextRange];\n const activeRowId = rows[endRowIndex]?.id ?? hit.rowId;\n const activeColKey =\n this.dragStart.kind === \"rows\"\n ? (schema.columns[0]?.key ?? hit.colKey)\n : (schema.columns[endColIndex]?.key ?? hit.colKey);\n this.activeCell = { rowId: activeRowId, colKey: activeColKey };\n this.onActiveChange(activeRowId, activeColKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n }\n\n private updateFillDragFromClientPoint(clientX: number, clientY: number) {\n if (!this.fillDragging || !this.fillSource) return;\n const hit = this.getHitAtClientPoint(clientX, clientY);\n if (!hit) return;\n if (hit.colKey === \"__all__\" || hit.colKey === null) return;\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const endRowIndex = this.dataModel.getRowIndex(hit.rowId);\n if (endRowIndex < 0) return;\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIndex !== this.fillSource.colIndex) return;\n\n // Vertical fill only; allow dragging downwards from the source end.\n const nextEnd = Math.max(this.fillSource.endRowIndex, endRowIndex);\n if (this.fillEndRowIndex !== nextEnd) {\n this.fillEndRowIndex = nextEnd;\n const activeRowId = rows[nextEnd]?.id ?? hit.rowId;\n const col = schema.columns[this.fillSource.colIndex];\n if (!col) return;\n const colKey = col.key;\n this.activeCell = { rowId: activeRowId, colKey };\n this.onActiveChange(activeRowId, colKey);\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: this.fillSource.startRowIndex,\n endRow: nextEnd,\n startCol: this.fillSource.colIndex,\n endCol: this.fillSource.colIndex,\n },\n ];\n this.onSelectionChange(this.selectionRanges);\n }\n this.suppressNextClick = true;\n }\n\n private computeAutoScrollDelta(clientX: number, clientY: number) {\n const rect = this.root.getBoundingClientRect();\n const threshold = 24;\n const maxStep = 18;\n let dx = 0;\n let dy = 0;\n if (clientX < rect.left + threshold) {\n dx = -Math.ceil(((rect.left + threshold - clientX) / threshold) * maxStep);\n } else if (clientX > rect.right - threshold) {\n dx = Math.ceil(((clientX - (rect.right - threshold)) / threshold) * maxStep);\n }\n if (clientY < rect.top + threshold) {\n dy = -Math.ceil(((rect.top + threshold - clientY) / threshold) * maxStep);\n } else if (clientY > rect.bottom - threshold) {\n dy = Math.ceil(((clientY - (rect.bottom - threshold)) / threshold) * maxStep);\n }\n return { dx, dy };\n }\n\n private startAutoScroll() {\n if (this.autoScrollActive) return;\n this.autoScrollActive = true;\n const tick = () => {\n if (!this.autoScrollActive) return;\n const p = this.lastPointerClient;\n if (!p || (!this.dragging && !this.fillDragging)) {\n this.stopAutoScroll();\n return;\n }\n const { dx, dy } = this.computeAutoScrollDelta(p.x, p.y);\n if (dx !== 0 || dy !== 0) {\n const prevTop = this.root.scrollTop;\n const prevLeft = this.root.scrollLeft;\n this.root.scrollTop = Math.max(0, prevTop + dy);\n this.root.scrollLeft = Math.max(0, prevLeft + dx);\n // While scrolling, keep updating selection/fill based on the latest pointer position.\n if (this.fillDragging) this.updateFillDragFromClientPoint(p.x, p.y);\n else this.updateDragFromClientPoint(p.x, p.y);\n }\n const raf =\n window.requestAnimationFrame ??\n ((cb: FrameRequestCallback) => window.setTimeout(() => cb(performance.now()), 16));\n this.autoScrollRaf = raf(tick);\n };\n const raf2 =\n window.requestAnimationFrame ??\n ((cb: FrameRequestCallback) => window.setTimeout(() => cb(performance.now()), 16));\n this.autoScrollRaf = raf2(tick);\n }\n\n private stopAutoScroll() {\n this.autoScrollActive = false;\n if (this.autoScrollRaf !== null) {\n const caf = window.cancelAnimationFrame ?? ((id: number) => window.clearTimeout(id));\n caf(this.autoScrollRaf);\n this.autoScrollRaf = null;\n }\n }\n\n private handlePointerMove = (ev: PointerEvent) => {\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n if (this.fillDragging && this.fillSource) {\n this.updateFillDragFromClientPoint(ev.clientX, ev.clientY);\n return;\n }\n if (!this.dragging || !this.dragStart) return;\n if (!this.dragMoved && this.pointerDownClient) {\n const dx = ev.clientX - this.pointerDownClient.x;\n const dy = ev.clientY - this.pointerDownClient.y;\n // Ignore tiny pointer jitter so clicks aren't suppressed.\n if (dx * dx + dy * dy < 9) return;\n this.dragMoved = true;\n }\n this.updateDragFromClientPoint(ev.clientX, ev.clientY);\n };\n\n private handlePointerUp = (ev: PointerEvent) => {\n if (this.fillDragging && this.fillSource) {\n const src = this.fillSource;\n const endRowIndex = this.fillEndRowIndex ?? src.endRowIndex;\n this.fillDragging = false;\n this.fillSource = null;\n this.fillEndRowIndex = null;\n this.root.dataset.extableFillDragging = \"\";\n if (this.rootCursorBackup !== null) {\n this.root.style.cursor = this.rootCursorBackup;\n this.rootCursorBackup = null;\n }\n this.stopAutoScroll();\n try {\n (ev.target as Element | null)?.releasePointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n this.commitFill(src, endRowIndex);\n this.suppressNextClick = true;\n return;\n }\n if (!this.dragging) return;\n this.dragging = false;\n this.dragStart = null;\n const suppressTrailingClick = this.dragSelectionChanged;\n this.pointerDownClient = null;\n this.dragMoved = false;\n this.dragSelectionChanged = false;\n this.stopAutoScroll();\n try {\n (ev.target as Element | null)?.releasePointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n if (suppressTrailingClick) this.suppressNextClick = true;\n if (this.suppressNextClick) {\n // Keep selection mode focus; prevent the trailing click from opening edit.\n if (this.activeCell && this.activeCell.colKey !== null) {\n const current = this.dataModel.getCell(this.activeCell.rowId, this.activeCell.colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n }\n }\n };\n\n private commitFill(source: import(\"./fillHandle\").FillHandleSource, endRowIndex: number) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const col = schema.columns[source.colIndex];\n if (!col) return;\n if (endRowIndex <= source.endRowIndex) return;\n\n const getValue = makeFillValueGetter(this.dataModel, source, this.sequenceLangs);\n if (!getValue) return;\n\n const commitNow = this.editMode === \"direct\";\n const batchId = `fill:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = source.endRowIndex + 1; r <= endRowIndex; r += 1) {\n const row = rows[r];\n if (!row) break;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const offset = r - source.endRowIndex;\n const next = getValue(offset);\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n\n // Select the filled range after commit and focus selection mode.\n const endRow = rows[endRowIndex];\n if (!endRow) return;\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: source.startRowIndex,\n endRow: endRowIndex,\n startCol: source.colIndex,\n endCol: source.colIndex,\n },\n ];\n this.activeCell = { rowId: endRow.id, colKey: col.key };\n this.onActiveChange(endRow.id, col.key);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.ensureVisibleCell(endRow.id, col.key);\n const current = this.dataModel.getCell(endRow.id, col.key);\n this.focusSelectionInput(this.cellToClipboardString(current));\n }\n\n private teardownSelectionInput() {\n const input = this.selectionInput;\n if (!input) return;\n // Avoid re-entrancy via blur fired during DOM removal.\n this.selectionInput = null;\n input.removeEventListener(\"keydown\", this.handleSelectionKeydown);\n input.removeEventListener(\"compositionstart\", this.handleSelectionCompositionStart);\n input.removeEventListener(\"copy\", this.handleSelectionCopy);\n input.removeEventListener(\"cut\", this.handleSelectionCut);\n input.removeEventListener(\"paste\", this.handleSelectionPaste);\n input.removeEventListener(\"blur\", this.handleSelectionBlur);\n removeFromParent(input);\n }\n\n private handleSelectionCopy = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n ev.preventDefault();\n ev.clipboardData?.setData(\"text/plain\", payload.text);\n ev.clipboardData?.setData(\"text/tab-separated-values\", payload.text);\n ev.clipboardData?.setData(\"text/html\", payload.html);\n this.showCopyToast(`Copied ${payload.cellCount} cells`, \"info\");\n };\n\n private handleSelectionCut = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n ev.preventDefault();\n ev.clipboardData?.setData(\"text/plain\", payload.text);\n ev.clipboardData?.setData(\"text/tab-separated-values\", payload.text);\n ev.clipboardData?.setData(\"text/html\", payload.html);\n this.clearSelectionValues();\n };\n\n private handleSelectionPaste = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n ev.preventDefault();\n const html = ev.clipboardData?.getData(\"text/html\") ?? \"\";\n const tsv = ev.clipboardData?.getData(\"text/tab-separated-values\") ?? \"\";\n const text = ev.clipboardData?.getData(\"text/plain\") ?? \"\";\n const grid = this.parseClipboardGrid({ html, tsv, text });\n if (!grid) return;\n this.applyClipboardGrid(grid);\n };\n\n private handleSelectionCompositionStart = () => {\n if (!this.selectionMode) return;\n this.selectionMode = false;\n this.teardownSelectionInput();\n this.openEditorAtActiveCell();\n };\n\n public async copySelection() {\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n const { text, html, cellCount } = payload;\n\n const copyViaClipboardApi = async () => {\n if (typeof navigator === \"undefined\" || !navigator.clipboard) return false;\n if (typeof ClipboardItem !== \"undefined\" && navigator.clipboard.write) {\n try {\n const item = new ClipboardItem({\n \"text/plain\": new Blob([text], { type: \"text/plain\" }),\n \"text/html\": new Blob([html], { type: \"text/html\" }),\n });\n await navigator.clipboard.write([item]);\n return true;\n } catch {\n /* fallthrough */\n }\n }\n if (navigator.clipboard.writeText) {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n /* fallthrough */\n }\n }\n return false;\n };\n\n const copyViaFallbackInput = () => {\n const input = this.ensureSelectionInput();\n const prev = input.value;\n input.value = text;\n input.select();\n document.execCommand?.(\"copy\");\n input.value = prev;\n };\n\n const copied = await copyViaClipboardApi();\n if (!copied) copyViaFallbackInput();\n this.showCopyToast(`Copied ${cellCount} cells`, \"info\");\n }\n\n public async pasteFromClipboard() {\n if (this.editMode === \"readonly\") return;\n if (!this.selectionMode) return;\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.readText) return;\n try {\n const text = await navigator.clipboard.readText();\n if (!text) return;\n const grid = this.parseClipboardGrid({ html: \"\", tsv: text, text });\n if (!grid) return;\n this.applyClipboardGrid(grid);\n } catch {\n /* ignore */\n }\n }\n\n private handleSelectionKeydown = async (ev: KeyboardEvent) => {\n if (!this.selectionMode) return;\n if (!this.activeCell) return;\n if (ev.isComposing || this.composing) return;\n\n // Ignore modifier-only keys in selection mode (do not enter edit mode).\n if (\n ev.key === \"Shift\" ||\n ev.key === \"Control\" ||\n ev.key === \"Alt\" ||\n ev.key === \"Meta\" ||\n ev.key === \"CapsLock\" ||\n ev.key === \"NumLock\" ||\n ev.key === \"ScrollLock\"\n ) {\n return;\n }\n\n const isMac = typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n const accel = isMac ? ev.metaKey : ev.ctrlKey;\n if (accel) {\n const key = ev.key.toLowerCase();\n if (key === \"z\") {\n ev.preventDefault();\n if (isMac && ev.shiftKey) this.onRedo();\n else this.onUndo();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"y\") {\n ev.preventDefault();\n this.onRedo();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"c\") {\n ev.preventDefault();\n await this.copySelection();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"x\") {\n ev.preventDefault();\n await this.copySelection();\n this.clearSelectionValues();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"v\") {\n // Let the paste event fire; it will be handled on the input.\n this.selectionAnchor = null;\n return;\n }\n }\n\n if (ev.key === \" \" && this.activeCell.colKey !== null) {\n const col = this.findColumn(this.activeCell.colKey);\n if (col?.type === \"boolean\") {\n ev.preventDefault();\n this.toggleBoolean(this.activeCell.rowId, this.activeCell.colKey);\n }\n this.selectionAnchor = null;\n return;\n }\n\n const isTab = ev.key === \"Tab\";\n const isEnter = ev.key === \"Enter\";\n const isArrow =\n ev.key === \"ArrowLeft\" ||\n ev.key === \"ArrowRight\" ||\n ev.key === \"ArrowUp\" ||\n ev.key === \"ArrowDown\";\n if (isTab || isEnter || isArrow) {\n ev.preventDefault();\n this.teardownSelectionInput();\n if (isTab) {\n this.moveActiveCell(0, ev.shiftKey ? -1 : 1, false);\n return;\n }\n if (isEnter) {\n this.moveActiveCell(ev.shiftKey ? -1 : 1, 0, false);\n return;\n }\n const extend = ev.shiftKey;\n if (ev.key === \"ArrowLeft\") this.moveActiveCell(0, -1, extend);\n else if (ev.key === \"ArrowRight\") this.moveActiveCell(0, 1, extend);\n else if (ev.key === \"ArrowUp\") this.moveActiveCell(-1, 0, extend);\n else if (ev.key === \"ArrowDown\") this.moveActiveCell(1, 0, extend);\n return;\n }\n\n this.selectionMode = false;\n this.selectionAnchor = null;\n this.teardownSelectionInput();\n // Let the original keydown insert the character into the now-focused editor naturally.\n this.openEditorAtActiveCell();\n };\n\n private getActiveIndices() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const fallback = { rowIndex: 0, colIndex: 0 };\n const ac = this.activeCell;\n if (!ac) return fallback;\n const rowIndex = rows.findIndex((r) => r.id === ac.rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n return { rowIndex: rowIndex >= 0 ? rowIndex : 0, colIndex: colIndex >= 0 ? colIndex : 0 };\n }\n\n private normalizeRange(range: SelectionRange): SelectionRange {\n return {\n ...range,\n startRow: Math.min(range.startRow, range.endRow),\n endRow: Math.max(range.startRow, range.endRow),\n startCol: Math.min(range.startCol, range.endCol),\n endCol: Math.max(range.startCol, range.endCol),\n };\n }\n\n private getCopyRange(): SelectionRange | null {\n const schema = this.dataModel.getSchema();\n if (this.selectionRanges.length > 0) {\n const first = this.selectionRanges[0];\n if (!first) return null;\n const normalized = this.normalizeRange(first);\n if (normalized.kind === \"rows\") {\n return {\n kind: \"cells\",\n startRow: normalized.startRow,\n endRow: normalized.endRow,\n startCol: normalized.startCol,\n endCol: normalized.endCol,\n };\n }\n return normalized;\n }\n if (!this.activeCell) return null;\n const ac = this.activeCell;\n if (!ac) return null;\n const rowIdx = this.dataModel.getRowIndex(ac.rowId);\n const colIdx = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n if (rowIdx < 0 || colIdx < 0) return null;\n return { kind: \"cells\", startRow: rowIdx, endRow: rowIdx, startCol: colIdx, endCol: colIdx };\n }\n\n private cellToClipboardString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n return String(value);\n }\n\n private escapeHtml(text: string) {\n return text\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n }\n\n private buildSelectionClipboardPayload(): {\n text: string;\n html: string;\n cellCount: number;\n } | null {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const range = this.getCopyRange();\n if (!range) return null;\n if (range.kind !== \"cells\") return null;\n\n const out: string[] = [];\n const htmlRows: string[] = [];\n const tableStyle = \"border-collapse:collapse;border-spacing:0;\";\n const cellStyle = \"border:1px solid #d0d7de;padding:4px 6px;vertical-align:top;\";\n let cellCount = 0;\n for (let r = range.startRow; r <= range.endRow; r += 1) {\n const row = rows[r];\n if (!row) continue;\n const line: string[] = [];\n const htmlCells: string[] = [];\n for (let c = range.startCol; c <= range.endCol; c += 1) {\n const col = schema.columns[c];\n if (!col) continue;\n const v = this.dataModel.getCell(row.id, col.key);\n const s = this.cellToClipboardString(v);\n line.push(s);\n htmlCells.push(`<td style=\"${cellStyle}\">${this.escapeHtml(s)}</td>`);\n cellCount += 1;\n }\n out.push(line.join(\"\\t\"));\n htmlRows.push(`<tr>${htmlCells.join(\"\")}</tr>`);\n }\n const text = out.join(\"\\r\\n\");\n const html = `<table style=\"${tableStyle}\"><tbody>${htmlRows.join(\"\")}</tbody></table>`;\n return { text, html, cellCount };\n }\n\n private clearSelectionValues() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const range = this.getCopyRange();\n if (!range || range.kind !== \"cells\") return;\n const commitNow = this.editMode === \"direct\";\n const batchId = `cut:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = range.startRow; r <= range.endRow; r += 1) {\n const row = rows[r];\n if (!row) continue;\n for (let c = range.startCol; c <= range.endCol; c += 1) {\n const col = schema.columns[c];\n if (!col) continue;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const next = col.type === \"boolean\" ? false : \"\";\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n }\n }\n\n private parseClipboardGrid(payload: { html: string; tsv: string; text: string }):\n | string[][]\n | null {\n const fromHtml = this.parseHtmlTable(payload.html);\n if (fromHtml) return fromHtml;\n const raw = payload.tsv || payload.text;\n return this.parseTsv(raw);\n }\n\n private parseTsv(text: string): string[][] | null {\n const trimmed = text.replace(/\\r\\n$/, \"\").replace(/\\n$/, \"\");\n if (!trimmed) return null;\n const rows = trimmed.split(/\\r\\n|\\n/);\n return rows.map((r) => r.split(\"\\t\"));\n }\n\n private parseHtmlTable(html: string): string[][] | null {\n if (!html) return null;\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n const table = doc.querySelector(\"table\");\n if (!table) return null;\n const trs = Array.from(table.querySelectorAll(\"tr\"));\n if (trs.length === 0) return null;\n const grid: string[][] = [];\n for (const tr of trs) {\n const cells = Array.from(tr.querySelectorAll(\"th,td\"));\n if (\n cells.some(\n (c) =>\n (c as HTMLTableCellElement).rowSpan > 1 || (c as HTMLTableCellElement).colSpan > 1,\n )\n ) {\n return null;\n }\n grid.push(cells.map((c) => (c.textContent ?? \"\").trim()));\n }\n return grid.length ? grid : null;\n } catch {\n return null;\n }\n }\n\n private coerceCellValue(raw: string, colKey: string): unknown {\n const col = this.findColumn(colKey);\n if (!col) return raw;\n if (raw === \"\") return \"\";\n if (col.type === \"number\") {\n const n = Number(raw);\n return Number.isFinite(n) ? n : raw;\n }\n if (col.type === \"boolean\") {\n const v = raw.trim().toLowerCase();\n if (v === \"true\" || v === \"1\" || v === \"yes\") return true;\n if (v === \"false\" || v === \"0\" || v === \"no\") return false;\n return raw;\n }\n return raw;\n }\n\n private applyClipboardGrid(grid: string[][]) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const { rowIndex: startRow, colIndex: startCol } = this.getActiveIndices();\n const commitNow = this.editMode === \"direct\";\n const batchId = `paste:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = 0; r < grid.length; r += 1) {\n const row = rows[startRow + r];\n if (!row) break;\n const line = grid[r] ?? [];\n for (let c = 0; c < line.length; c += 1) {\n const col = schema.columns[startCol + c];\n if (!col) break;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const next = this.coerceCellValue(line[c] ?? \"\", col.key);\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n }\n }\n\n private createEditor(colKey: string, initial: string) {\n const col = this.findColumn(colKey);\n const needsTextarea = col?.wrapText || initial.includes(\"\\n\");\n if (needsTextarea) {\n const ta = document.createElement(\"textarea\");\n ta.value = initial;\n ta.style.resize = \"none\";\n ta.style.whiteSpace = \"pre-wrap\";\n ta.style.overflowWrap = \"anywhere\";\n ta.style.overflow = \"hidden\";\n this.autosize(ta);\n ta.addEventListener(\"input\", () => this.autosize(ta));\n return { control: ta, value: initial };\n }\n if (col?.type === \"boolean\") {\n const input = document.createElement(\"input\");\n input.type = \"checkbox\";\n input.checked = initial === \"true\" || initial === \"1\" || initial === \"on\";\n return { control: input, value: initial };\n }\n if (col?.type === \"number\") {\n const input = document.createElement(\"input\");\n input.type = \"number\";\n input.value = initial;\n return { control: input, value: initial };\n }\n if (col?.type === \"date\" || col?.type === \"time\" || col?.type === \"datetime\") {\n const input = document.createElement(\"input\");\n input.type = col.type === \"date\" ? \"date\" : col.type === \"time\" ? \"time\" : \"datetime-local\";\n const normalized = this.normalizeTemporalInitialValue(col.type, initial);\n input.value = normalized;\n return { control: input, value: normalized };\n }\n if (col?.type === \"enum\" || col?.type === \"tags\") {\n const allowCustom = col.enum?.allowCustom ?? col.tags?.allowCustom;\n const options = col.enum?.options ?? col.tags?.options ?? [];\n if (allowCustom === false) {\n const select = document.createElement(\"select\");\n const empty = document.createElement(\"option\");\n empty.value = \"\";\n empty.textContent = \"\";\n select.appendChild(empty);\n for (const opt of options) {\n const op = document.createElement(\"option\");\n op.value = opt;\n op.textContent = opt;\n if (initial === opt) op.selected = true;\n select.appendChild(op);\n }\n return { control: select, value: initial };\n }\n const input = document.createElement(\"input\");\n input.type = \"text\";\n const listId = `extable-datalist-${String(colKey)}`;\n input.setAttribute(\"list\", listId);\n input.value = initial;\n let datalist = document.getElementById(listId) as HTMLDataListElement | null;\n if (!datalist) {\n datalist = document.createElement(\"datalist\");\n datalist.id = listId;\n for (const opt of options) {\n const op = document.createElement(\"option\");\n op.value = opt;\n datalist.appendChild(op);\n }\n this.root.appendChild(datalist);\n }\n return { control: input, value: initial, datalistId: listId };\n }\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.value = initial;\n return { control: input, value: initial };\n }\n\n private autosize(ta: HTMLTextAreaElement) {\n const style = window.getComputedStyle(ta);\n let lineHeight = Number.parseFloat(style.lineHeight);\n if (!Number.isFinite(lineHeight) || lineHeight <= 0) lineHeight = 16;\n ta.rows = 1; // shrink to measure\n const lines = Math.ceil(ta.scrollHeight / lineHeight);\n ta.rows = Math.max(1, lines);\n ta.style.minHeight = `${lineHeight}px`;\n }\n\n private positionFloatingContentBox(\n box: { left: number; top: number; width: number; height: number },\n wrapper: HTMLDivElement,\n ) {\n const inset = 2;\n wrapper.style.left = `${box.left + inset}px`;\n wrapper.style.top = `${box.top + inset}px`;\n wrapper.style.width = `${Math.max(8, box.width - inset * 2)}px`;\n wrapper.style.height = `${Math.max(8, box.height - inset * 2)}px`;\n }\n\n private handleClick = (ev: MouseEvent) => {\n if (ev.button !== 0) {\n return; // only left click starts edit/selection; right-click is handled by contextmenu\n }\n const el = ev.target as HTMLElement | null;\n if (el?.closest('button[data-extable-fs-open=\"1\"]')) {\n return;\n }\n if (this.suppressNextClick) {\n this.suppressNextClick = false;\n return;\n }\n if (this.inputEl && ev.target && this.inputEl.contains(ev.target as Node)) {\n return;\n }\n if (this.inputEl && this.activeCell && this.activeCell.colKey !== null) {\n const { rowId, colKey } = this.activeCell;\n const value = this.readActiveValue();\n this.commitEdit(rowId, colKey, value);\n this.onMove(rowId);\n this.teardownInput(false);\n }\n const hit =\n typeof document.elementFromPoint === \"function\"\n ? this.getHitAtClientPoint(ev.clientX, ev.clientY)\n : this.hitTest(ev);\n if (!hit) return;\n const wasSameCell =\n this.selectionMode &&\n !ev.shiftKey &&\n !ev.metaKey &&\n !ev.ctrlKey &&\n this.activeCell?.rowId === hit.rowId &&\n String(this.activeCell?.colKey) === String(hit.colKey);\n if (hit.rowId === \"__all__\" && hit.colKey === \"__all__\") {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n this.teardownInput(false);\n if (rows.length && schema.columns.length) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: 0,\n endCol: schema.columns.length - 1,\n },\n ];\n this.activeCell = { rowId: \"__all__\", colKey: \"__all__\" };\n this.onActiveChange(\"__all__\", \"__all__\");\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n } else {\n this.activeCell = null;\n this.onActiveChange(\"__all__\", \"__all__\");\n this.selectionAnchor = null;\n }\n return;\n }\n this.onRowSelect(hit.rowId);\n if (hit.rowId === \"__header__\") {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (rows.length && colIndex >= 0) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: colIndex,\n endCol: colIndex,\n },\n ];\n this.activeCell = { rowId: rows[0].id, colKey: hit.colKey };\n this.onActiveChange(this.activeCell.rowId, this.activeCell.colKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n }\n return;\n }\n this.applySelectionFromHit(ev, hit);\n if (hit.colKey === null || hit.colKey === \"__all__\") {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n return;\n }\n if (hit.rowId === \"__header__\") {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n return;\n }\n if (this.isCellReadonly(hit.rowId, hit.colKey)) {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.teardownInput(false);\n const current = this.dataModel.getCell(hit.rowId, hit.colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n return;\n }\n const col = this.findColumn(hit.colKey);\n const isBoolean = col?.type === \"boolean\";\n if (isBoolean) {\n const isSecondClick =\n this.lastBooleanCell?.rowId === hit.rowId &&\n String(this.lastBooleanCell?.colKey) === String(hit.colKey);\n this.lastBooleanCell = { rowId: hit.rowId, colKey: hit.colKey };\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.teardownInput(false);\n this.teardownSelectionInput();\n if (isSecondClick) {\n this.toggleBoolean(hit.rowId, hit.colKey);\n // Keep focus on the hidden selection input so Space does not scroll the container/page.\n this.focusSelectionInput(\"\");\n return;\n }\n // Keep focus on the hidden selection input so Space can toggle.\n this.focusSelectionInput(\"\");\n return;\n }\n this.lastBooleanCell = null;\n this.selectionAnchor = null;\n this.teardownInput(false);\n const current = this.dataModel.getCell(hit.rowId, hit.colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n if (wasSameCell) {\n this.selectionMode = false;\n this.teardownSelectionInput();\n this.openEditorAtActiveCell();\n }\n };\n\n private toggleBoolean(rowId: string, colKey: string) {\n const current = this.dataModel.getCell(rowId, colKey);\n const currentBool = current === true || current === \"true\" || current === \"1\" || current === 1;\n const next = !currentBool;\n const cmd: Command = { kind: \"edit\", rowId, colKey, next };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n this.onMove(rowId);\n }\n\n private handleContextMenu = (ev: MouseEvent) => {\n const target = ev.target as Node | null;\n if (ev.ctrlKey) {\n ev.preventDefault();\n return;\n }\n if (!target || !this.root.contains(target)) return;\n ev.preventDefault();\n ev.stopPropagation();\n const hit = this.hitTest(ev);\n const rowId = hit?.rowId ?? null;\n const colKey = hit?.colKey ?? null;\n this.onContextMenu(rowId, colKey, ev.clientX, ev.clientY);\n };\n\n private applySelectionFromHit(ev: MouseEvent, hit: { rowId: string; colKey: string | null }) {\n const schema = this.dataModel.getSchema();\n const rowIdx = this.dataModel.getRowIndex(hit.rowId);\n const isRow = hit.colKey === null;\n const colIdx = isRow ? (schema.columns.length > 0 ? 0 : -1) : schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIdx < 0) return;\n const targetRange: SelectionRange = isRow\n ? {\n kind: \"rows\",\n startRow: rowIdx,\n endRow: rowIdx,\n startCol: 0,\n endCol: schema.columns.length - 1,\n }\n : {\n kind: \"cells\",\n startRow: rowIdx,\n endRow: rowIdx,\n startCol: Math.max(0, colIdx),\n endCol: Math.max(0, colIdx),\n };\n let nextRanges: SelectionRange[] = [];\n if (ev.shiftKey && this.activeCell) {\n const ac = this.activeCell;\n const anchorRow = this.dataModel.getRowIndex(ac.rowId);\n const anchorCol = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n const anchorRange: SelectionRange = isRow\n ? {\n kind: \"rows\",\n startRow: anchorRow,\n endRow: rowIdx,\n startCol: 0,\n endCol: schema.columns.length - 1,\n }\n : {\n kind: \"cells\",\n startRow: anchorRow,\n endRow: rowIdx,\n startCol: Math.max(0, anchorCol),\n endCol: Math.max(0, colIdx),\n };\n nextRanges = [anchorRange];\n } else if (ev.metaKey || ev.ctrlKey) {\n nextRanges = [...this.selectionRanges, targetRange];\n } else {\n nextRanges = [targetRange];\n }\n this.selectionRanges = this.mergeRanges(nextRanges);\n const anchorCell =\n targetRange.kind === \"rows\"\n ? { rowId: hit.rowId, colKey: schema.columns[colIdx]?.key ?? null }\n : { rowId: hit.rowId, colKey: hit.colKey };\n this.activeCell = anchorCell;\n this.onActiveChange(anchorCell.rowId, anchorCell.colKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n if (targetRange.kind === \"rows\") {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n }\n }\n\n private mergeRanges(ranges: SelectionRange[]) {\n const merged: SelectionRange[] = [];\n const sorted = [...ranges].sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === \"rows\" ? -1 : 1;\n if (a.startRow !== b.startRow) return a.startRow - b.startRow;\n if (a.startCol !== b.startCol) return a.startCol - b.startCol;\n if (a.endRow !== b.endRow) return a.endRow - b.endRow;\n return a.endCol - b.endCol;\n });\n for (const r of sorted) {\n const last = merged.at(-1);\n if (!last) {\n merged.push({ ...r });\n continue;\n }\n if (last.kind !== r.kind) {\n merged.push({ ...r });\n continue;\n }\n if (r.kind === \"rows\") {\n const canMerge =\n last.startCol === r.startCol &&\n last.endCol === r.endCol &&\n last.startRow <= r.endRow + 1 &&\n r.startRow <= last.endRow + 1;\n if (canMerge) {\n last.startRow = Math.min(last.startRow, r.startRow);\n last.endRow = Math.max(last.endRow, r.endRow);\n continue;\n }\n } else {\n const sameCols = last.startCol === r.startCol && last.endCol === r.endCol;\n const sameRows = last.startRow === r.startRow && last.endRow === r.endRow;\n const rowsTouch = last.startRow <= r.endRow + 1 && r.startRow <= last.endRow + 1;\n const colsTouch = last.startCol <= r.endCol + 1 && r.startCol <= last.endCol + 1;\n if (sameCols && rowsTouch) {\n last.startRow = Math.min(last.startRow, r.startRow);\n last.endRow = Math.max(last.endRow, r.endRow);\n continue;\n }\n if (sameRows && colsTouch) {\n last.startCol = Math.min(last.startCol, r.startCol);\n last.endCol = Math.max(last.endCol, r.endCol);\n continue;\n }\n }\n merged.push({ ...r });\n }\n return merged;\n }\n\n private activateCellElement(\n cell: HTMLElement,\n rowId: string,\n colKey: string,\n options?: { initialValueOverride?: string; placeCursorAtEnd?: boolean },\n ) {\n this.teardownInput();\n this.activeCell = { rowId, colKey };\n this.activeHost = cell;\n this.activeHostOriginalText = cell.textContent ?? \"\";\n const current = this.dataModel.getCell(rowId, colKey);\n const initialValue =\n options?.initialValueOverride ??\n (current === null || current === undefined ? \"\" : String(current));\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n input.style.width = \"calc(100% - 4px)\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"2px\";\n input.style.padding = \"4px 6px\";\n input.style.border = \"none\";\n input.style.borderRadius = \"0\";\n input.style.boxShadow = \"none\";\n input.style.background = \"#fff\";\n input.style.outline = \"none\";\n input.style.fontSize = \"14px\";\n input.style.fontFamily = \"inherit\";\n input.style.lineHeight = \"1.2\";\n input.style.fontWeight = \"inherit\";\n const col = this.findColumn(colKey);\n input.style.textAlign = col?.style?.align ?? (col?.type === \"number\" ? \"right\" : \"left\");\n input.addEventListener(\"keydown\", (e) => this.handleKey(e as KeyboardEvent, cell));\n input.addEventListener(\"focus\", () => {\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) input.select();\n });\n this.bindImmediateCommit(input);\n cell.textContent = \"\";\n cell.appendChild(input);\n if (input.tagName.toLowerCase() === \"textarea\") {\n requestAnimationFrame(() => {\n if (input instanceof HTMLTextAreaElement) this.autosize(input);\n });\n }\n input.focus({ preventScroll: true });\n if (\n options?.placeCursorAtEnd &&\n (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement)\n ) {\n const end = input.value.length;\n input.setSelectionRange(end, end);\n }\n this.inputEl = input;\n }\n\n private activateFloating(\n rect: DOMRect,\n rowId: string,\n colKey: string,\n options?: { initialValueOverride?: string; placeCursorAtEnd?: boolean },\n ) {\n this.teardownInput();\n this.activeCell = { rowId, colKey };\n void rect;\n const box = this.computeCanvasCellBoxContent(rowId, colKey);\n if (!box) return;\n const wrapper = document.createElement(\"div\");\n this.activeHost = wrapper;\n this.activeHostOriginalText = null;\n wrapper.style.position = \"absolute\";\n wrapper.dataset.extableFloating = \"fixed\";\n wrapper.style.pointerEvents = \"auto\";\n wrapper.style.padding = \"0\";\n wrapper.style.zIndex = \"10\";\n const current = this.dataModel.getCell(rowId, colKey);\n const initialValue =\n options?.initialValueOverride ??\n (current === null || current === undefined ? \"\" : String(current));\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n input.style.width = \"calc(100% - 4px)\";\n input.style.height = \"calc(100% - 4px)\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"2px\";\n input.style.padding = \"4px 6px\";\n input.style.border = \"none\";\n input.style.borderRadius = \"0\";\n input.style.boxShadow = \"none\";\n input.style.background = \"#fff\";\n input.style.outline = \"none\";\n input.style.fontSize = \"14px\";\n input.style.fontFamily = \"inherit\";\n input.style.lineHeight = \"1.2\";\n input.style.fontWeight = \"inherit\";\n const col = this.findColumn(colKey);\n input.style.textAlign = col?.style?.align ?? (col?.type === \"number\" ? \"right\" : \"left\");\n input.style.pointerEvents = \"auto\";\n input.addEventListener(\"keydown\", (e) => this.handleKey(e as KeyboardEvent, wrapper));\n input.addEventListener(\"focus\", () => {\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) input.select();\n });\n this.bindImmediateCommit(input);\n wrapper.appendChild(input);\n if (input instanceof HTMLSelectElement) {\n // No auto focus/click for select; standard focus will allow selection on first interaction\n }\n if (input.tagName.toLowerCase() === \"textarea\") {\n requestAnimationFrame(() => {\n if (input instanceof HTMLTextAreaElement) this.autosize(input);\n });\n }\n this.root.appendChild(wrapper);\n this.positionFloatingContentBox(box, wrapper);\n input.focus({ preventScroll: true });\n if (\n options?.placeCursorAtEnd &&\n (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement)\n ) {\n const end = input.value.length;\n input.setSelectionRange(end, end);\n }\n this.inputEl = input;\n this.floatingInputWrapper = wrapper;\n }\n\n private handleKey(e: KeyboardEvent, cell: HTMLElement) {\n if (!this.activeCell || !this.inputEl) return;\n const now = Date.now();\n if (e.isComposing || this.composing) return; // IME composing; ignore control keys\n if (now - this.lastCompositionEnd < 24) return; // absorb trailing key events right after IME commit\n const { rowId, colKey } = this.activeCell;\n if (colKey === null) return;\n const isTextarea = this.inputEl.tagName.toLowerCase() === \"textarea\";\n const isAltEnter = e.key === \"Enter\" && e.altKey;\n const commitAndMove = (deltaRow: number, deltaCol: number) => {\n const value = this.readActiveValue();\n this.commitEdit(rowId, colKey, value);\n this.onMove(rowId);\n this.teardownInput(false);\n this.moveActiveCell(deltaRow, deltaCol);\n };\n\n if (e.key === \"Tab\") {\n e.preventDefault();\n commitAndMove(0, e.shiftKey ? -1 : 1);\n return;\n }\n if (e.key === \"Enter\") {\n if (isTextarea && isAltEnter) {\n // allow newline insertion (Excel-like Alt+Enter)\n return;\n }\n e.preventDefault();\n commitAndMove(e.shiftKey ? -1 : 1, 0);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n this.cancelEdit(cell);\n this.onMove();\n if (this.activeCell && this.activeCell.colKey !== null) {\n const current = this.dataModel.getCell(this.activeCell.rowId, this.activeCell.colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n }\n } else if (e.key === \"Backspace\" && this.inputEl.value === \"\") {\n e.preventDefault();\n this.commitEdit(rowId, colKey, \"\");\n this.onMove(rowId);\n this.teardownInput(false);\n this.moveActiveCell(0, 0);\n }\n }\n\n private commitEdit(rowId: string, colKey: string | null, value: unknown) {\n if (colKey === null) return;\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next: value,\n };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n }\n\n private readActiveValue() {\n if (!this.inputEl || !this.activeCell) return this.inputEl?.value ?? \"\";\n if (this.inputEl instanceof HTMLInputElement) {\n if (this.inputEl.type === \"checkbox\") {\n return this.inputEl.checked;\n }\n if (this.inputEl.type === \"number\") {\n if (this.inputEl.value === \"\") return \"\";\n const parsed = Number(this.inputEl.value);\n return Number.isNaN(parsed) ? \"\" : parsed;\n }\n return this.inputEl.value;\n }\n if (this.inputEl instanceof HTMLSelectElement) {\n return this.inputEl.value;\n }\n return (this.inputEl as HTMLTextAreaElement).value;\n }\n\n private bindImmediateCommit(control: HTMLElement) {\n if (!this.activeCell) return;\n const isInstant =\n control instanceof HTMLInputElement\n ? control.type === \"checkbox\" ||\n control.type === \"number\" ||\n control.type === \"date\" ||\n control.type === \"time\" ||\n control.type === \"datetime-local\"\n : control instanceof HTMLSelectElement;\n if (!isInstant) return;\n control.addEventListener(\"change\", () => {\n const ac = this.activeCell;\n if (!ac) return;\n const { rowId, colKey } = ac;\n if (colKey === null) return;\n const value = this.readActiveValue();\n this.commitEdit(rowId, colKey, value);\n this.onMove(rowId);\n this.teardownInput(false);\n });\n }\n\n private cancelEdit(cell: HTMLElement) {\n if (this.activeCell) {\n const { rowId, colKey } = this.activeCell;\n if (colKey === null) return;\n const prev =\n cell.dataset?.original ??\n cell.dataset?.value ??\n (() => {\n const v = this.dataModel.getCell(rowId, colKey);\n return v === null || v === undefined ? \"\" : String(v);\n })();\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next: prev,\n prev,\n };\n this.onEdit(cmd, true);\n }\n this.teardownInput(false);\n if (cell.dataset?.original !== undefined || cell.dataset?.value !== undefined) {\n cell.textContent = cell.dataset.original ?? cell.dataset.value ?? \"\";\n }\n cell.blur();\n }\n\n private teardownInput(clearActive = false) {\n removeFromParent(this.inputEl);\n removeFromParent(this.floatingInputWrapper);\n if (this.activeHost && this.activeHostOriginalText !== null) {\n this.activeHost.textContent = this.activeHostOriginalText;\n }\n this.inputEl = null;\n this.floatingInputWrapper = null;\n this.activeHost = null;\n this.activeHostOriginalText = null;\n if (clearActive) {\n this.activeCell = null;\n this.onActiveChange(null, null);\n }\n }\n}\n","export type CellPrimitive = string | number | boolean | null;\n\nexport type CellValue =\n | CellPrimitive\n | Date\n | { kind: \"enum\"; value: string }\n | { kind: \"tags\"; values: string[] };\n\nexport type ColumnType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"datetime\"\n | \"date\"\n | \"time\"\n | \"enum\"\n | \"tags\";\n\nexport type ResolvedCellStyle = {\n backgroundColor?: string;\n textColor?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n};\n\nexport type StyleDelta = Partial<ResolvedCellStyle>;\n\nexport type DiagnosticLevel = \"warning\" | \"error\";\nexport type CellDiagnostic = {\n level: DiagnosticLevel;\n message: string;\n source: \"formula\" | \"conditionalStyle\";\n};\n\nexport type FormulaOk = string | boolean | number | Date;\nexport type FormulaWarn<T extends FormulaOk> = readonly [value: T, warning: Error];\nexport type FormulaReturn<T extends FormulaOk = FormulaOk> = T | FormulaWarn<T>;\n\nexport type ConditionalStyleFn<TData extends object = object> = (\n data: TData,\n) => StyleDelta | null | Error;\n\nexport type Updater<T> = T | ((oldValue: T) => T);\n\nexport type CellAddress =\n | { rowId: string; colKey: string }\n | { rowIndex: number; colIndex: number }\n | { rowId: string; colIndex: number }\n | { rowIndex: number; colKey: string };\n\nexport type CellTarget = {\n rowId: string;\n colKey: string;\n};\n\n// Forward declaration for recursive type inference\nexport interface ColumnSchema<\n TData extends object = object,\n RData extends object = TData,\n TType extends ColumnType = ColumnType,\n K extends string = string,\n> {\n key: K;\n type: TType;\n header?: string;\n readonly?: boolean;\n /**\n * When true, enforce uniqueness within this column (per table).\n * Duplicate (non-empty) values mark all duplicated cells as invalid.\n */\n unique?: boolean;\n nullable?: boolean;\n string?: { maxLength?: number; regex?: string };\n number?: {\n precision?: number;\n scale?: number;\n signed?: boolean;\n thousandSeparator?: boolean;\n negativeRed?: boolean;\n format?: string; // optional custom formatter token\n };\n enum?: { options: string[]; allowCustom?: boolean };\n tags?: { options: string[]; allowCustom?: boolean };\n booleanDisplay?: \"checkbox\" | string | [string, string]; // arbitrary label set; default checkbox when absent\n dateFormat?: string;\n timeFormat?: string;\n dateTimeFormat?: string;\n width?: number; // px\n wrapText?: boolean; // allow per-column wrapping\n style?: {\n textColor?: string;\n backgroundColor?: string;\n align?: \"left\" | \"right\" | \"center\";\n decorations?: { strike?: boolean; underline?: boolean; bold?: boolean; italic?: boolean };\n };\n formula?: (data: TData) => unknown;\n conditionalStyle?: ConditionalStyleFn<RData>;\n}\n\n// Infer row data type from schema columns\nexport type InferSchemaData<TColumns extends readonly ColumnSchema<any>[]> = {\n [I in keyof TColumns]: TColumns[I] extends ColumnSchema<infer TData, any, infer TType, infer K>\n ? K extends keyof TData\n ? TData[K]\n : never\n : never;\n} extends (infer U)[]\n ? U extends object\n ? U\n : Record<string, unknown>\n : Record<string, unknown>;\n\nexport interface Schema<TData extends object = object, RData extends object = TData> {\n columns: ColumnSchema<TData, RData>[];\n row?: { conditionalStyle?: ConditionalStyleFn<RData> };\n}\n\n/**\n * Helper to lock schema generics so `formula`/`conditionalStyle` receive the correct row type.\n * Usage: `const schema = defineSchema<MyRow>({ columns: [...], row: {...} });`\n */\nexport const defineSchema = <TData extends object, RData extends object = TData>(\n schema: Schema<TData, RData>,\n): Schema<TData, RData> => schema;\n\nexport type RowObject<T extends object = Record<string, unknown>> = {\n _readonly?: boolean;\n} & T &\n Record<string, unknown>;\n\n// Public data is object-row arrays only. Use `null` or `undefined` for async loading.\nexport type NullableData<T extends object = object> = T[] | null | undefined;\n\nexport type ViewFilterOp = {\n kind: \"op\";\n key: string;\n op: \"eq\" | \"neq\" | \"lt\" | \"lte\" | \"gt\" | \"gte\" | \"contains\";\n value: unknown;\n};\n\nexport type ViewFilterValues = {\n kind: \"values\";\n key: string;\n /** Allow-list of selected non-blank values. */\n values: unknown[];\n /** When true, blanks (null/undefined/\"\") are included. */\n includeBlanks?: boolean;\n};\n\nexport type ViewFilter = ViewFilterOp | ViewFilterValues;\n\nexport type ColumnDiagnosticFilter = {\n errors?: boolean;\n warnings?: boolean;\n};\n\nexport type ColumnDiagnosticFilterMap = Record<string, ColumnDiagnosticFilter>;\n\nexport interface ViewSort {\n key: string;\n dir: \"asc\" | \"desc\";\n}\n\nexport interface View {\n hiddenColumns?: string[];\n filters?: ViewFilter[];\n sorts?: ViewSort[];\n /**\n * Column-scoped diagnostic quick filters.\n * Key is the column key (stringified).\n */\n columnDiagnostics?: ColumnDiagnosticFilterMap;\n userId?: string; // personalization\n columnWidths?: Record<string, number>; // key -> px\n rowHeights?: Record<string, number>;\n wrapText?: Record<string, boolean>; // view override per column\n}\n\nexport type RenderMode = \"html\" | \"canvas\" | \"auto\";\nexport type EditMode = \"direct\" | \"commit\" | \"readonly\";\nexport type LockMode = \"none\" | \"row\";\n\nexport interface Command {\n kind: \"edit\" | \"deleteRow\" | \"insertRow\" | \"updateView\" | \"lock\" | \"unlock\";\n rowId?: string;\n colKey?: string;\n rowData?: RowObject;\n prev?: unknown;\n next?: unknown;\n payload?: unknown;\n}\n\nexport interface UserInfo {\n id: string;\n name: string;\n}\n\nexport interface ServerAdapter {\n fetchInitial?: () => Promise<{\n data: Record<string, unknown>[];\n view?: View;\n schema?: Schema;\n user: UserInfo;\n }>;\n lockRow: (rowId: string, user: UserInfo) => Promise<void>;\n unlockRows: (rowIds: string[], user: UserInfo) => Promise<void>;\n commit: (commands: Command[], user: UserInfo) => Promise<void>;\n subscribe: (onEvent: (event: ServerEvent) => void) => () => void;\n}\n\nexport type ServerEvent = { type: \"update\"; commands: Command[]; user: UserInfo };\n\nexport interface CoreOptions {\n renderMode?: RenderMode;\n editMode?: EditMode;\n lockMode?: LockMode;\n /** Preferred languages for auto-fill sequence matching (e.g. [\"ja\", \"en\"]). */\n langs?: string[];\n /** Loading UI configuration used when `defaultData` is `null`. */\n loading?: {\n /** Enable built-in loading overlay/spinner. Default: true */\n enabled?: boolean;\n };\n defaultClass?: string | string[];\n defaultStyle?: Partial<CSSStyleDeclaration>;\n server?: ServerAdapter;\n user?: UserInfo;\n findReplace?: {\n /** Enable Find/Replace feature (engine + integrations). Default: true */\n enabled?: boolean;\n /**\n * Enable the default built-in UI and its shortcut bindings. Default: true\n * Note: legacy name is `dialog`; `sidebar` is the preferred name.\n */\n sidebar?: boolean;\n /** @deprecated Use `sidebar` instead. */\n dialog?: boolean;\n /**\n * When true, always intercept `Ctrl/Cmd+F` and show extable's search sidebar.\n * Use this when the table is the primary focus of the page and browser Find/Reload should be overridden.\n * Default: true (always intercept).\n */\n enableSearch?: boolean;\n };\n}\n\nexport interface TableConfig<T extends object = Record<string, unknown>> {\n data: T[] | null;\n view: View;\n schema: Schema;\n}\n\nexport type HistoryCommandKind = Command[\"kind\"];\n\nexport type UndoRedoStep = {\n batchId: string | null;\n kinds: HistoryCommandKind[];\n commandCount: number;\n label: string;\n};\n\nexport type UndoRedoHistory = {\n /** Top (index 0) is the next undo step. */\n undo: UndoRedoStep[];\n /** Top (index 0) is the next redo step. */\n redo: UndoRedoStep[];\n};\n\nexport interface InternalRow {\n id: string;\n raw: RowObject;\n displayIndex: number;\n}\n\nexport type SelectionKind = \"cells\" | \"rows\";\n\nexport interface SelectionRange {\n kind: SelectionKind;\n startRow: number;\n endRow: number;\n startCol: number;\n endCol: number;\n}\n\nexport type ToggleState = \"on\" | \"off\" | \"mixed\" | \"disabled\";\nexport type ColorState = string | \"mixed\" | null | \"disabled\";\n\nexport type TableError = {\n scope: \"validation\" | \"commit\" | \"render\" | \"formula\" | \"conditionalStyle\" | \"unknown\";\n message: string;\n target?: { rowId?: string; colKey?: string };\n};\n\nexport type TableState = {\n canCommit: boolean;\n pendingCommandCount: number;\n pendingCellCount?: number;\n undoRedo: { canUndo: boolean; canRedo: boolean };\n renderMode: \"html\" | \"canvas\";\n ui: { searchPanelOpen: boolean };\n activeErrors: TableError[];\n};\n\nexport type TableStateListener = (next: TableState, prev: TableState | null) => void;\n\nexport type RowStateSnapshot<\n TInput extends object = Record<string, unknown>,\n TResult extends object = TInput,\n> = {\n rowId: string;\n rowIndex: number;\n data: TResult;\n pending?: Partial<TInput>;\n diagnostics?: TableError[];\n};\n\nexport type RowChangeReason = \"new\" | \"edit\" | \"delete\";\nexport type RowStateListener<\n TInput extends object = Record<string, unknown>,\n TResult extends object = TInput,\n> = (\n rowId: string,\n next: RowStateSnapshot<TInput, TResult> | null,\n prev: RowStateSnapshot<TInput, TResult> | null,\n reason: RowChangeReason,\n) => void;\n\nexport type SelectionSnapshot = {\n ranges: SelectionRange[];\n activeRowIndex: number | null;\n activeRowKey: string | null;\n activeColumnIndex: number | null;\n activeColumnKey: string | null;\n activeValueRaw: unknown;\n activeValueDisplay: string;\n activeValueType: ColumnType | null;\n diagnostic: CellDiagnostic | null;\n styles: {\n columnStyle: Partial<ResolvedCellStyle>;\n cellStyle: Partial<ResolvedCellStyle>;\n resolved: Partial<ResolvedCellStyle>;\n };\n};\n\nexport type SelectionChangeReason =\n | \"selection\"\n | \"edit\"\n | \"style\"\n | \"schema\"\n | \"view\"\n | \"data\"\n | \"unknown\";\nexport type SelectionListener = (\n next: SelectionSnapshot,\n prev: SelectionSnapshot | null,\n reason: SelectionChangeReason,\n) => void;\n","import \"./styles.css\";\nimport { CommandQueue } from \"./commandQueue\";\nimport { DataModel } from \"./dataModel\";\nimport { resolveCellAddress } from \"./address\";\nimport { FindReplaceController, type FindReplaceMode } from \"./findReplace\";\nimport { LockManager } from \"./lockManager\";\nimport { CanvasRenderer, HTMLRenderer, type Renderer, type ViewportState } from \"./renderers\";\nimport { SelectionManager } from \"./selectionManager\";\nimport { resolveCellStyles } from \"./styleResolver\";\nimport { removeFromParent, toArray } from \"./utils\";\nimport type {\n CellTarget,\n Command,\n CoreOptions,\n HistoryCommandKind,\n InternalRow,\n NullableData,\n EditMode,\n LockMode,\n RenderMode,\n Schema,\n ServerAdapter,\n SelectionChangeReason,\n SelectionListener,\n SelectionRange,\n SelectionSnapshot,\n TableConfig,\n TableError,\n TableState,\n TableStateListener,\n UndoRedoHistory,\n UndoRedoStep,\n UserInfo,\n Updater,\n View,\n ViewFilterValues,\n RowObject,\n RowStateSnapshot,\n RowStateListener,\n RowChangeReason,\n} from \"./types\";\n\nexport * from \"./types\";\nexport type {\n FindReplaceMatch,\n FindReplaceMode,\n FindReplaceOptions,\n FindReplaceState,\n} from \"./findReplace\";\nexport { FindReplaceController } from \"./findReplace\";\n\nexport interface CoreInit<T extends object = Record<string, unknown>> {\n root: HTMLElement;\n defaultData: NullableData<T>;\n defaultView: View;\n schema: Schema<any>;\n options?: CoreOptions;\n}\n\nexport class ExtableCore<T extends object = Record<string, unknown>, R extends object = T> {\n private root: HTMLElement;\n private shell: HTMLDivElement | null = null;\n private viewportEl: HTMLDivElement | null = null;\n private viewportResizeObserver: ResizeObserver | null = null;\n private dataModel: DataModel;\n private dataLoaded: boolean;\n private loadingEnabled: boolean;\n private commandQueue: CommandQueue;\n private lockManager: LockManager;\n private renderer: Renderer;\n private selectionManager: SelectionManager | null = null;\n private renderMode: RenderMode;\n private editMode: EditMode;\n private lockMode: LockMode;\n private server?: ServerAdapter;\n private user?: UserInfo;\n private unsubscribe?: () => void;\n private resizeHandler: (() => void) | null = null;\n private scrollHandler: (() => void) | null = null;\n private viewportState: ViewportState | null = null;\n private rafId: number | null = null;\n private contextMenu: HTMLDivElement | null = null;\n private contextMenuRowId: string | null = null;\n private handleGlobalPointer: ((ev: MouseEvent | PointerEvent) => void) | null = null;\n private toast: HTMLDivElement | null = null;\n private toastTimer: number | null = null;\n private findReplace: FindReplaceController | null = null;\n private findReplaceSidebar: HTMLElement | null = null;\n private findReplaceSidebarUnsub: (() => void) | null = null;\n private findReplaceEnabled = true;\n private findReplaceUiEnabled = true;\n private findReplaceEnableSearch = false;\n private sequenceLangs?: readonly string[];\n\n private mounted = false;\n\n private isCellReadonly(rowId: string, colKey: string) {\n return this.editMode === \"readonly\" || this.dataModel.isReadonly(rowId, colKey);\n }\n\n private resolveRowId(row: string | number): string | null {\n if (typeof row === \"string\") {\n return this.findRowById(row)?.id ?? null;\n }\n const found = this.dataModel.listAllRows()[row] ?? null;\n return found?.id ?? null;\n }\n\n private filterSortSidebar: HTMLElement | null = null;\n private filterSortSidebarUnsub: (() => void) | null = null;\n private filterSortKeydown: ((ev: KeyboardEvent) => void) | null = null;\n private filterSortClickCapture: ((ev: MouseEvent) => void) | null = null;\n private filterSortOpenEvent: ((ev: Event) => void) | null = null;\n private filterSortActiveColumnKey: string | null = null;\n private filterSortDraft: {\n colKey: string;\n values: Array<{ key: string; value: unknown; label: string }>;\n hasBlanks: boolean;\n selected: Set<string>;\n includeBlanks: boolean;\n diagErrors: boolean;\n diagWarnings: boolean;\n search: string;\n } | null = null;\n\n private tableStateListeners = new Set<TableStateListener>();\n private selectionListeners = new Set<SelectionListener>();\n private lastTableState: TableState | null = null;\n private lastSelectionSnapshot: SelectionSnapshot | null = null;\n private selectionRanges: SelectionRange[] = [];\n private activeCell: CellTarget | null = null;\n private activeErrors: TableError[] = [];\n private rowStateListeners = new Set<RowStateListener<T, R>>();\n private lastRowStates = new Map<string, RowStateSnapshot<T, R>>();\n\n private isSearchPanelVisible() {\n return this.root.classList.contains(\"extable-search-open\");\n }\n\n private isFilterSortPanelVisible() {\n return this.root.classList.contains(\"extable-filter-sort-open\");\n }\n\n private safeRender(state?: ViewportState) {\n try {\n this.renderer.render(state);\n const hadRenderError = this.activeErrors.some((e) => e.scope === \"render\");\n if (hadRenderError) {\n this.activeErrors = this.activeErrors.filter((e) => e.scope !== \"render\");\n this.emitTableState();\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.activeErrors = [\n ...this.activeErrors.filter((x) => x.scope !== \"render\"),\n { scope: \"render\", message },\n ];\n this.emitTableState();\n }\n }\n\n constructor(init: CoreInit<T>) {\n this.root = init.root;\n this.root.classList.add(\"extable-root\");\n this.renderMode = init.options?.renderMode ?? \"auto\";\n this.editMode = init.options?.editMode ?? \"direct\";\n this.lockMode = init.options?.lockMode ?? \"none\";\n this.loadingEnabled = init.options?.loading?.enabled ?? true;\n this.findReplaceEnabled = init.options?.findReplace?.enabled ?? true;\n this.findReplaceUiEnabled =\n init.options?.findReplace?.sidebar ?? init.options?.findReplace?.dialog ?? true;\n this.findReplaceEnableSearch = init.options?.findReplace?.enableSearch ?? true;\n this.server = init.options?.server;\n this.user = init.options?.user;\n this.sequenceLangs = init.options?.langs;\n\n const defaultData = init.defaultData ?? null;\n const initialData = defaultData ?? [];\n this.dataLoaded = defaultData !== null && defaultData !== undefined;\n this.dataModel = new DataModel(\n initialData as unknown as RowObject[],\n init.schema,\n init.defaultView,\n );\n this.commandQueue = new CommandQueue();\n this.lockManager = new LockManager(this.lockMode, this.server, this.user);\n this.renderer = this.chooseRenderer(this.renderMode);\n this.applyRootDecor(init.options);\n this.applyReadonlyClass();\n void this.loadInitial();\n }\n\n private async loadInitial() {\n if (this.server?.fetchInitial) {\n try {\n const initial = await this.server.fetchInitial();\n this.dataModel.setData(initial.data);\n if (initial.schema) this.dataModel.setSchema(initial.schema);\n if (initial.view) this.dataModel.setView(initial.view);\n this.user = initial.user ?? this.user;\n this.lockManager.setUser(this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"fetchInitial failed\", e);\n }\n }\n this.mount();\n }\n\n private applyRootDecor(options?: CoreOptions) {\n const classes = toArray(options?.defaultClass);\n if (classes?.length) {\n this.root.classList.add(...classes);\n }\n if (options?.defaultStyle) {\n for (const [k, v] of Object.entries(options.defaultStyle)) {\n // @ts-expect-error CSSStyleDeclaration index\n this.root.style[k] = v ?? \"\";\n }\n }\n }\n\n private applyReadonlyClass() {\n this.root.classList.toggle(\"extable-readonly-all\", this.editMode === \"readonly\");\n }\n\n private chooseRenderer(mode: RenderMode): Renderer {\n if (mode === \"auto\") {\n const ua = typeof navigator !== \"undefined\" ? navigator.userAgent : \"\";\n type UserAgentBrand = { brand?: string };\n type NavigatorWithUAData = Navigator & { userAgentData?: { brands?: UserAgentBrand[] } };\n const isBot =\n /bot|crawl|spider|playwright|puppeteer|selenium|phantomjs/i.test(ua) ||\n (typeof navigator !== \"undefined\" &&\n \"userAgentData\" in navigator &&\n (navigator as NavigatorWithUAData).userAgentData?.brands?.some((b) =>\n /bot/i.test(b.brand ?? \"\"),\n ));\n return isBot\n ? new HTMLRenderer(this.dataModel)\n : new CanvasRenderer(this.dataModel, () => this.editMode);\n }\n return mode === \"html\"\n ? new HTMLRenderer(this.dataModel)\n : new CanvasRenderer(this.dataModel, () => this.editMode);\n }\n\n private ensureShell() {\n if (this.shell && this.viewportEl && this.shell.parentElement === this.root) return;\n this.root.innerHTML = \"\";\n const shell = document.createElement(\"div\");\n shell.className = \"extable-shell\";\n const viewport = document.createElement(\"div\");\n viewport.className = \"extable-viewport\";\n shell.appendChild(viewport);\n this.root.appendChild(shell);\n this.shell = shell;\n this.viewportEl = viewport;\n\n this.viewportResizeObserver?.disconnect();\n const anyRO = globalThis.ResizeObserver as typeof ResizeObserver | undefined;\n if (typeof anyRO === \"function\") {\n this.viewportResizeObserver = new anyRO(() => {\n this.updateViewportFromRoot();\n });\n this.viewportResizeObserver.observe(viewport);\n } else {\n this.viewportResizeObserver = null;\n }\n }\n\n private getScrollHost() {\n return this.viewportEl ?? this.root;\n }\n\n private mount(force = false) {\n if (this.mounted && !force) return;\n this.ensureShell();\n const host = this.viewportEl ?? this.root;\n this.renderer.mount(host);\n this.ensureContextMenu();\n this.ensureToast();\n this.initViewportState();\n\n this.root.classList.toggle(\"extable-loading\", !this.dataLoaded && this.loadingEnabled);\n if (!this.dataLoaded && this.loadingEnabled) {\n this.root.dataset.extable = \"loading\";\n this.bindViewport();\n this.ensureFindReplace();\n this.ensureFilterSort();\n this.emitTableState();\n this.emitSelection(\"data\");\n return;\n }\n this.selectionManager = new SelectionManager(\n host,\n this.editMode,\n (cmd, commitNow) => this.handleEdit(cmd, commitNow),\n (rowId) => void this.lockManager.selectRow(rowId),\n (rowId) => void this.lockManager.unlockOnMove(rowId),\n (ev) => this.renderer.hitTest(ev),\n this.dataModel,\n this.sequenceLangs,\n (rowId, colKey) => this.isCellReadonly(rowId, colKey),\n (rowId, colKey) => {\n const target: CellTarget | null = rowId && colKey !== null ? { rowId, colKey } : null;\n if (target) this.renderer.setActiveCell(target.rowId, target.colKey);\n this.activeCell = target;\n this.emitSelection(\"selection\");\n },\n (rowId, _colKey, x, y) => this.showContextMenu(rowId, x, y),\n (ranges) => {\n this.selectionRanges = ranges;\n this.renderer.setSelection(ranges);\n this.emitSelection(\"selection\");\n },\n () => this.undo(),\n () => this.redo(),\n );\n this.root.dataset.extable = \"ready\";\n this.bindViewport();\n this.ensureFindReplace();\n this.ensureFilterSort();\n if (this.server) {\n this.unsubscribe = this.server.subscribe((event) => this.handleServerEvent(event));\n }\n this.emitTableState();\n this.emitSelection(\"selection\");\n this.mounted = true;\n }\n\n destroy() {\n this.teardownFilterSort();\n this.teardownFindReplace();\n this.selectionManager?.destroy();\n this.renderer.destroy();\n this.unsubscribe?.();\n this.unbindViewport();\n this.viewportResizeObserver?.disconnect();\n this.viewportResizeObserver = null;\n this.mounted = false;\n }\n\n // editMode/lockMode are configured only at construction time for consistency.\n\n setRootClass(classNames: string | string[]) {\n this.root.className = \"\";\n this.root.classList.add(...(toArray(classNames) ?? []));\n }\n\n setRootStyle(style: Partial<CSSStyleDeclaration>) {\n for (const [k, v] of Object.entries(style)) {\n // @ts-expect-error CSSStyleDeclaration index\n this.root.style[k] = v ?? \"\";\n }\n }\n\n setData(data: NullableData<T>) {\n if (data == null) {\n // Allow loading only before the first successful data load.\n if (this.dataLoaded) return;\n this.dataLoaded = false;\n this.safeRender(this.viewportState ?? undefined);\n this.emitSelection(\"data\");\n this.emitTableState();\n return;\n }\n const wasLoaded = this.dataLoaded;\n this.dataLoaded = true;\n this.dataModel.setData(data as unknown as RowObject[]);\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n\n if (!wasLoaded && this.loadingEnabled) {\n this.root.classList.remove(\"extable-loading\");\n this.selectionManager?.destroy();\n this.selectionManager = null;\n this.mount();\n }\n }\n\n setView(view: View) {\n this.dataModel.setView(view);\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"view\");\n this.emitTableState();\n }\n\n // Public API: configuration getters (mirror setters)\n getSchema(): Schema {\n return this.dataModel.getSchema();\n }\n\n getView(): View {\n return this.dataModel.getView();\n }\n\n /**\n * Returns the current table data (includes pending edits in commit mode and formula results).\n * Note: This is the full dataset (not affected by view filters/sorts). Use `listRows()` for the visible rows.\n */\n getData(): R[] {\n return this.getTableData();\n }\n\n /**\n * Returns the raw dataset without pending edits and without formula results.\n * Note: This is the full dataset (not affected by view filters/sorts). Use `listRows()` for the visible rows.\n */\n getRawData(): T[] {\n return this.dataModel.listAllRows().map((r) => ({ ...(r.raw as unknown as T) }));\n }\n\n // Public API: cell-level access\n getCell<K extends keyof R & string>(rowId: string, colKey: K): R[K] | undefined {\n return this.dataModel.getCell(rowId, colKey) as R[K] | undefined;\n }\n\n // Public API: row/column index utilities\n getRowIndex(rowId: string): number {\n return this.dataModel.getRowIndex(rowId);\n }\n\n getColumnIndex(colKey: string): number {\n return this.dataModel.getColumnIndex(colKey);\n }\n\n // Public API: row-level access\n findRowById(rowId: string): InternalRow | null {\n const idx = this.dataModel.getBaseRowIndex(rowId);\n if (idx < 0) return null;\n return this.dataModel.listAllRows()[idx] ?? null;\n }\n\n listRows(): InternalRow[] {\n return this.dataModel.listRows();\n }\n\n getAllRows(): InternalRow[] {\n return this.dataModel.listAllRows();\n }\n\n /**\n * Returns a single row as an object (includes pending edits in commit mode and formula results).\n * When a number is passed, it is interpreted as the base row index (not affected by view filters/sorts).\n */\n getRow(rowIdOrIndex: string | number): R | null {\n const rowId = this.resolveRowId(rowIdOrIndex);\n if (!rowId) return null;\n return this.buildRow(rowId);\n }\n\n private buildRow(rowId: string): R | null {\n const found = this.findRowById(rowId);\n if (!found) return null;\n const schema = this.dataModel.getSchema();\n const out: Record<string, unknown> = { ...(found.raw as Record<string, unknown>) };\n for (const col of schema.columns) {\n out[col.key] = this.dataModel.resolveCellValue(rowId, col).value;\n }\n return out as R;\n }\n\n // Public API: bulk data access\n getTableData(): R[] {\n const rows = this.dataModel.listAllRows();\n return rows.map((r) => this.buildRow(r.id)).filter(Boolean) as R[];\n }\n\n getColumnData<K extends keyof R & string>(colKey: K): R[K][] {\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => c.key === colKey);\n if (!col) return [];\n const rows = this.dataModel.listAllRows();\n return rows.map((r) => this.dataModel.resolveCellValue(r.id, col).value as R[K]);\n }\n\n // Public API: commit-mode pending helpers\n getPending(): Map<string, Record<string, unknown>> {\n if (this.editMode !== \"commit\") return new Map();\n return new Map(this.dataModel.getPending());\n }\n\n getPendingRowIds(): string[] {\n return [...this.getPending().keys()];\n }\n\n hasPendingChanges(): boolean {\n return this.getPending().size > 0;\n }\n\n getPendingCellCount(): number {\n const pending = this.getPending();\n let count = 0;\n for (const row of pending.values()) count += Object.keys(row).length;\n return count;\n }\n\n getCellPending<K extends keyof R & string>(row: string | number, colKey: K): boolean {\n if (this.editMode !== \"commit\") return false;\n const rowId = this.resolveRowId(row);\n if (!rowId) return false;\n return this.dataModel.hasPending(rowId, colKey);\n }\n\n getDisplayValue<K extends keyof R & string>(row: string | number, colKey: K): string {\n const rowId = this.resolveRowId(row);\n if (!rowId) return \"\";\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return \"\";\n const res = this.dataModel.resolveCellValue(rowId, col);\n if (res.textOverride) return res.textOverride;\n const v = res.value;\n if (v === null || v === undefined) return \"\";\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\") {\n const vv = v as Record<string, unknown>;\n if (vv.kind === \"enum\" && typeof vv.value === \"string\") return vv.value;\n if (vv.kind === \"tags\" && Array.isArray(vv.values)) {\n const values = vv.values.filter((x): x is string => typeof x === \"string\");\n return values.join(\", \");\n }\n }\n return String(v);\n }\n\n insertRow(rowData: T, position?: number | string): string | null {\n let insertAt: number | null = null;\n if (typeof position === \"number\" && Number.isFinite(position)) {\n insertAt = Math.max(0, Math.min(Math.floor(position), this.dataModel.getAllRowCount()));\n } else if (typeof position === \"string\") {\n const baseIdx = this.dataModel.getBaseRowIndex(position);\n if (baseIdx >= 0) insertAt = baseIdx;\n }\n if (insertAt === null) insertAt = this.dataModel.getAllRowCount();\n const newId = this.dataModel.insertRowAt(rowData as unknown as RowObject, insertAt);\n const cmd: Command = {\n kind: \"insertRow\",\n rowId: newId,\n rowData: rowData as unknown as RowObject,\n payload: { index: insertAt },\n };\n this.commandQueue.enqueue(cmd);\n this.emitRowState(newId, \"new\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n if (this.editMode === \"direct\") void this.sendCommit([cmd]);\n return newId;\n }\n\n deleteRow(row: string | number): boolean {\n const rowId = this.resolveRowId(row);\n if (!rowId) return false;\n const removed = this.dataModel.removeRow(rowId);\n if (!removed) return false;\n const cmd: Command = {\n kind: \"deleteRow\",\n rowId: removed.row.id,\n rowData: removed.row.raw,\n payload: { index: removed.index },\n };\n this.commandQueue.enqueue(cmd);\n this.emitRowState(rowId, \"delete\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n if (this.editMode === \"direct\") void this.sendCommit([cmd]);\n return true;\n }\n\n private handleEdit(cmd: Command, commitNow: boolean) {\n if (this.editMode === \"readonly\") return;\n if (!cmd.rowId || cmd.colKey === undefined) return;\n const prev = this.dataModel.getCell(cmd.rowId, cmd.colKey);\n this.commandQueue.enqueue({ ...cmd, prev });\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, commitNow);\n this.emitRowState(cmd.rowId, \"edit\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n if (commitNow) {\n void this.sendCommit([cmd]);\n }\n }\n\n undo() {\n this.selectionManager?.cancelEditing();\n const cmds = this.commandQueue.undo();\n if (!cmds || !cmds.length) return;\n // Apply inverse operations in reverse order.\n for (let i = cmds.length - 1; i >= 0; i -= 1) {\n const cmd = cmds[i];\n if (!cmd) continue;\n this.applyInverse(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n }\n\n redo() {\n this.selectionManager?.cancelEditing();\n const cmds = this.commandQueue.redo();\n if (!cmds || !cmds.length) return;\n for (const cmd of cmds) {\n this.applyForward(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n }\n\n getUndoRedoHistory(): UndoRedoHistory {\n const toKinds = (cmds: Command[]): HistoryCommandKind[] => {\n const seen = new Set<HistoryCommandKind>();\n const kinds: HistoryCommandKind[] = [];\n for (const c of cmds) {\n if (seen.has(c.kind)) continue;\n seen.add(c.kind);\n kinds.push(c.kind);\n }\n return kinds;\n };\n\n const labelFor = (kinds: HistoryCommandKind[], commandCount: number) => {\n if (kinds.length === 1 && kinds[0] === \"edit\") {\n return `Edit ${commandCount} cell(s)`;\n }\n if (kinds.length === 1 && kinds[0] === \"insertRow\") {\n return commandCount === 1 ? \"Insert row\" : `Insert row (${commandCount})`;\n }\n if (kinds.length === 1 && kinds[0] === \"deleteRow\") {\n return commandCount === 1 ? \"Delete row\" : `Delete row (${commandCount})`;\n }\n if (kinds.length === 1 && kinds[0] === \"updateView\") {\n return \"Update view\";\n }\n return `Command: ${kinds.join(\", \")} (${commandCount})`;\n };\n\n const toSteps = (groups: { batchId: string | null; commands: Command[] }[]): UndoRedoStep[] =>\n groups.map((g) => {\n const kinds = toKinds(g.commands);\n const commandCount = g.commands.length;\n return {\n batchId: g.batchId,\n kinds,\n commandCount,\n label: labelFor(kinds, commandCount),\n };\n });\n\n return {\n undo: toSteps(this.commandQueue.listUndoGroups()),\n redo: toSteps(this.commandQueue.listRedoGroups()),\n };\n }\n\n private applyInverse(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.prev, this.editMode === \"direct\");\n this.emitRowState(cmd.rowId, \"edit\");\n }\n return;\n case \"insertRow\":\n if (cmd.rowId) this.dataModel.removeRow(cmd.rowId);\n if (cmd.rowId) this.emitRowState(cmd.rowId, \"delete\");\n return;\n case \"deleteRow\":\n if (cmd.rowId && cmd.rowData) {\n const idx = (cmd.payload as Record<string, unknown> | undefined)?.index;\n const index = typeof idx === \"number\" ? idx : this.dataModel.getAllRowCount();\n this.dataModel.insertRowAt(cmd.rowData, index, cmd.rowId);\n this.emitRowState(cmd.rowId, \"new\");\n }\n return;\n default:\n return;\n }\n }\n\n private applyForward(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, this.editMode === \"direct\");\n this.emitRowState(cmd.rowId, \"edit\");\n }\n return;\n case \"insertRow\":\n if (cmd.rowData) {\n const idx = (cmd.payload as Record<string, unknown> | undefined)?.index;\n const index = typeof idx === \"number\" ? idx : this.dataModel.getAllRowCount();\n const forcedId = typeof cmd.rowId === \"string\" ? cmd.rowId : undefined;\n this.dataModel.insertRowAt(cmd.rowData, index, forcedId);\n if (forcedId) this.emitRowState(forcedId, \"new\");\n }\n return;\n case \"deleteRow\":\n if (cmd.rowId) {\n this.dataModel.removeRow(cmd.rowId);\n this.emitRowState(cmd.rowId, \"delete\");\n }\n return;\n default:\n return;\n }\n }\n\n async commit(): Promise<RowStateSnapshot<T, R>[]> {\n const pending = this.commandQueue.listApplied();\n if (!pending.length) return [];\n const touched = new Set<string>();\n for (const cmd of pending) {\n if (cmd.rowId) {\n this.dataModel.applyPending(cmd.rowId);\n touched.add(cmd.rowId);\n }\n }\n await this.sendCommit(pending);\n await this.lockManager.unlockOnCommit(this.commandQueue.listApplied().at(-1)?.rowId);\n this.commandQueue.clear();\n const snapshots: RowStateSnapshot<T, R>[] = [];\n for (const rowId of touched) {\n this.emitRowState(rowId, \"edit\");\n const snap = this.getRowStateSnapshot(rowId);\n if (snap) snapshots.push(snap);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n return snapshots;\n }\n\n private async sendCommit(commands: Command[]) {\n if (this.server && this.user) {\n try {\n await this.server.commit(commands, this.user);\n this.activeErrors = this.activeErrors.filter((e) => e.scope !== \"commit\");\n this.emitTableState();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"commit failed\", e);\n const msg = e instanceof Error ? e.message : String(e);\n this.activeErrors = [\n ...this.activeErrors.filter((x) => x.scope !== \"commit\"),\n { scope: \"commit\", message: msg },\n ];\n this.emitTableState();\n }\n }\n }\n\n private handleServerEvent(event: {\n type: \"update\";\n commands: Command[];\n user: UserInfo;\n }) {\n for (const cmd of event.commands) {\n this.applyCommand(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n }\n\n private applyCommand(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, true);\n this.emitRowState(cmd.rowId, \"edit\");\n }\n break;\n case \"insertRow\":\n if (cmd.rowData) {\n const id = this.dataModel.insertRow(cmd.rowData);\n if (id) this.emitRowState(id, \"new\");\n }\n break;\n case \"deleteRow\":\n if (cmd.rowId) {\n this.dataModel.removeRow(cmd.rowId);\n this.emitRowState(cmd.rowId, \"delete\");\n }\n break;\n case \"updateView\":\n if (cmd.next && typeof cmd.next === \"object\") {\n this.dataModel.setView(cmd.next as View);\n }\n break;\n default:\n break;\n }\n }\n\n private ensureContextMenu() {\n if (this.contextMenu?.isConnected) return;\n this.contextMenu = null;\n const pop = document.createElement(\"div\");\n pop.className = \"extable-context-menu\";\n pop.setAttribute(\"popover\", \"manual\");\n pop.addEventListener(\"contextmenu\", (e) => e.preventDefault());\n const readonlyMode = this.editMode === \"readonly\";\n const actions: Array<{ key: string; label?: string; kind?: \"sep\" }> = readonlyMode\n ? [{ key: \"copy\", label: \"Copy\" }]\n : [\n { key: \"copy\", label: \"Copy\" },\n { key: \"paste\", label: \"Paste\" },\n { key: \"sep-top\", kind: \"sep\" },\n { key: \"undo\", label: \"Undo\" },\n { key: \"redo\", label: \"Redo\" },\n { key: \"sep-mid\", kind: \"sep\" },\n { key: \"insert-above\", label: \"Insert row above\" },\n { key: \"insert-below\", label: \"Insert row below\" },\n { key: \"delete-row\", label: \"Delete row\" },\n ];\n const list = document.createElement(\"div\");\n for (const act of actions) {\n if (act.kind === \"sep\") {\n const hr = document.createElement(\"hr\");\n hr.className = \"extable-context-sep\";\n list.appendChild(hr);\n continue;\n }\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.dataset.action = act.key;\n btn.textContent = act.label ?? \"\";\n btn.addEventListener(\"click\", () => {\n this.handleContextAction(act.key);\n this.closeContextMenu();\n });\n list.appendChild(btn);\n }\n pop.appendChild(list);\n (this.viewportEl ?? this.root).appendChild(pop);\n this.contextMenu = pop;\n }\n\n private showContextMenu(rowId: string | null, clientX: number, clientY: number) {\n this.ensureContextMenu();\n if (!this.contextMenu) return;\n if (!this.contextMenu.isConnected) {\n // Host may have been rebuilt (e.g. renderer switch). Recreate.\n this.contextMenu = null;\n this.ensureContextMenu();\n if (!this.contextMenu) return;\n }\n this.contextMenuRowId = rowId;\n // Update enable/disable state for undo/redo.\n for (const btn of Array.from(\n this.contextMenu.querySelectorAll<HTMLButtonElement>(\"button[data-action]\"),\n )) {\n const action = btn.dataset.action;\n if (action === \"undo\") btn.disabled = !this.commandQueue.canUndo();\n else if (action === \"redo\") btn.disabled = !this.commandQueue.canRedo();\n }\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const rect = { width: 220, height: 160 };\n let left = clientX;\n let top = clientY;\n if (left + rect.width > viewportWidth) left = Math.max(0, viewportWidth - rect.width - 8);\n if (top + rect.height > viewportHeight) top = Math.max(0, viewportHeight - rect.height - 8);\n this.contextMenu.style.left = `${left}px`;\n this.contextMenu.style.top = `${top}px`;\n this.contextMenu.hidePopover?.();\n this.contextMenu.showPopover?.();\n }\n\n private handleContextAction(action: string) {\n if (action === \"copy\") {\n void this.selectionManager?.copySelection();\n return;\n }\n if (action === \"paste\") {\n void this.selectionManager?.pasteFromClipboard();\n return;\n }\n if (action === \"undo\") {\n this.undo();\n return;\n }\n if (action === \"redo\") {\n this.redo();\n return;\n }\n if (!this.contextMenuRowId) return;\n const idx = this.dataModel.getBaseRowIndex(this.contextMenuRowId);\n const targetIndex = idx >= 0 ? idx : this.dataModel.getAllRowCount();\n if (action === \"insert-above\" || action === \"insert-below\") {\n const insertAt = action === \"insert-above\" ? targetIndex : targetIndex + 1;\n const raw = this.createBlankRow();\n const newId = this.dataModel.insertRowAt(raw, insertAt);\n this.commandQueue.enqueue({\n kind: \"insertRow\",\n rowId: newId,\n rowData: raw,\n payload: { index: insertAt },\n });\n this.emitRowState(newId, \"new\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.showToast(\"Row inserted\", \"info\");\n return;\n }\n if (action === \"delete-row\") {\n const removed = this.dataModel.removeRow(this.contextMenuRowId);\n if (!removed) return;\n this.commandQueue.enqueue({\n kind: \"deleteRow\",\n rowId: removed.row.id,\n rowData: removed.row.raw,\n payload: { index: removed.index },\n });\n this.emitRowState(removed.row.id, \"delete\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.showToast(\"Row deleted\", \"info\");\n return;\n }\n }\n\n private createBlankRow(): RowObject {\n const schema = this.dataModel.getSchema();\n const obj: RowObject = {};\n for (const col of schema.columns) {\n obj[String(col.key)] = null;\n }\n return obj;\n }\n\n private closeContextMenu() {\n this.contextMenu?.hidePopover?.();\n }\n\n private ensureToast() {\n if (this.toast?.isConnected) return;\n this.toast = null;\n const toast = document.createElement(\"div\");\n toast.className = \"extable-toast\";\n toast.setAttribute(\"popover\", \"manual\");\n toast.style.right = \"16px\";\n toast.style.bottom = \"16px\";\n toast.style.position = \"fixed\";\n (this.viewportEl ?? this.root).appendChild(toast);\n this.toast = toast;\n }\n\n private showToast(message: string, variant: \"info\" | \"error\" = \"info\", durationMs = 2500) {\n this.ensureToast();\n if (!this.toast) return;\n this.toast.textContent = message;\n this.toast.dataset.variant = variant;\n this.toast.hidePopover?.();\n this.toast.showPopover?.();\n if (this.toastTimer) {\n window.clearTimeout(this.toastTimer);\n this.toastTimer = null;\n }\n this.toastTimer = window.setTimeout(() => {\n this.toast?.hidePopover?.();\n }, durationMs);\n }\n\n private bindViewport() {\n this.resizeHandler = () => this.updateViewportFromRoot();\n this.scrollHandler = () => this.updateViewportFromRoot();\n this.getScrollHost().addEventListener(\"scroll\", this.scrollHandler, { passive: true });\n window.addEventListener(\"resize\", this.resizeHandler);\n this.handleGlobalPointer = (ev: MouseEvent | PointerEvent) => {\n if (this.contextMenu && !this.contextMenu.contains(ev.target as Node)) {\n this.contextMenu.hidePopover?.();\n }\n };\n document.addEventListener(\"pointerdown\", this.handleGlobalPointer, true);\n\n }\n\n private unbindViewport() {\n if (this.resizeHandler) window.removeEventListener(\"resize\", this.resizeHandler);\n if (this.scrollHandler) this.getScrollHost().removeEventListener(\"scroll\", this.scrollHandler);\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n if (this.handleGlobalPointer) {\n document.removeEventListener(\"pointerdown\", this.handleGlobalPointer, true);\n this.handleGlobalPointer = null;\n }\n if (this.contextMenu) {\n this.contextMenu.hidePopover?.();\n if (this.contextMenu.parentElement) removeFromParent(this.contextMenu);\n this.contextMenu = null;\n }\n if (this.toast) {\n this.toast.hidePopover?.();\n if (this.toast.parentElement) removeFromParent(this.toast);\n this.toast = null;\n }\n }\n\n remount(target: HTMLElement) {\n this.unbindViewport();\n this.teardownFilterSort();\n this.teardownFindReplace();\n this.selectionManager?.destroy();\n this.renderer.destroy();\n this.root = target;\n this.applyReadonlyClass();\n this.shell = null;\n this.viewportEl = null;\n this.viewportResizeObserver?.disconnect();\n this.viewportResizeObserver = null;\n this.renderer = this.chooseRenderer(this.renderMode);\n this.mounted = false;\n this.mount(true);\n }\n\n showSearchPanel(mode: FindReplaceMode = \"find\") {\n if (!this.findReplaceEnabled || !this.findReplaceUiEnabled) return;\n this.ensureFindReplace();\n if (!this.findReplace || !this.findReplaceSidebar) return;\n this.hideFilterSortPanel();\n this.findReplace.setMode(mode);\n this.root.classList.toggle(\"extable-search-open\", true);\n this.updateViewportFromRoot();\n this.safeRender(this.viewportState ?? undefined);\n this.emitTableState();\n const input = this.findReplaceSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fr=\"query\"]',\n );\n input?.focus({ preventScroll: true });\n input?.select();\n }\n\n hideSearchPanel() {\n if (!this.findReplaceSidebar) return;\n this.root.classList.toggle(\"extable-search-open\", false);\n this.updateViewportFromRoot();\n this.safeRender(this.viewportState ?? undefined);\n this.emitTableState();\n // Restore focus to table selection.\n (\n this.getScrollHost().querySelector(\n 'input[data-extable-selection=\"1\"]',\n ) as HTMLInputElement | null\n )?.focus?.({\n preventScroll: true,\n });\n }\n\n // External toggle for host apps.\n toggleSearchPanel(mode: FindReplaceMode = \"find\") {\n if (this.isSearchPanelVisible()) this.hideSearchPanel();\n else this.showSearchPanel(mode);\n }\n\n private updateFindReplaceReadonlyUI() {\n if (!this.findReplaceSidebar) return;\n const aside = this.findReplaceSidebar;\n const toggleReplace = aside.querySelector<HTMLInputElement>('input[data-extable-fr=\"replace-toggle\"]');\n if (!toggleReplace) return;\n const readonly = this.editMode === \"readonly\";\n aside.dataset.extableFrReadonly = readonly ? \"1\" : \"0\";\n if (readonly) {\n toggleReplace.checked = false;\n this.findReplace?.setMode(\"find\");\n aside.dataset.extableFrMode = \"find\";\n } else {\n aside.dataset.extableFrMode = toggleReplace.checked ? \"replace\" : \"find\";\n }\n }\n\n // Public API: table-level state callbacks\n getTableState(): TableState {\n const effective = this.renderer instanceof HTMLRenderer ? \"html\" : \"canvas\";\n const applied = this.commandQueue.listApplied();\n const pendingCommands = this.editMode === \"commit\" ? applied : [];\n const pendingCommandCount = pendingCommands.length;\n const pendingCellCount = (() => {\n const keys = new Set<string>();\n for (const c of pendingCommands) {\n if (c.kind !== \"edit\") continue;\n if (!c.rowId || c.colKey === undefined) continue;\n keys.add(`${c.rowId}::${String(c.colKey)}`);\n }\n return keys.size;\n })();\n const validationErrors: TableError[] = this.dataModel.getValidationErrors().map((e) => ({\n scope: \"validation\",\n message: e.message,\n target: { rowId: e.rowId, colKey: e.colKey },\n }));\n const diagnosticErrors: TableError[] = this.dataModel\n .getDiagnostics()\n .map((x) => {\n if (!x.diag) return null;\n return {\n scope: x.diag.source,\n message: x.diag.message,\n target: { rowId: x.rowId, colKey: x.colKey },\n } as TableError;\n })\n .filter(Boolean) as TableError[];\n diagnosticErrors.sort((a, b) => {\n const ar = a.target?.rowId ? this.dataModel.getRowIndex(a.target.rowId) : -1;\n const br = b.target?.rowId ? this.dataModel.getRowIndex(b.target.rowId) : -1;\n if (ar !== br) return ar - br;\n const ac =\n a.target?.colKey !== undefined ? this.dataModel.getColumnIndex(a.target.colKey) : -1;\n const bc =\n b.target?.colKey !== undefined ? this.dataModel.getColumnIndex(b.target.colKey) : -1;\n if (ac !== bc) return ac - bc;\n if (a.scope !== b.scope) return a.scope < b.scope ? -1 : 1;\n return a.message < b.message ? -1 : a.message > b.message ? 1 : 0;\n });\n const activeErrors = [\n ...validationErrors,\n ...diagnosticErrors.slice(0, 200),\n ...this.activeErrors,\n ];\n return {\n canCommit: this.editMode === \"commit\" && pendingCommandCount > 0,\n pendingCommandCount,\n pendingCellCount,\n undoRedo: { canUndo: this.commandQueue.canUndo(), canRedo: this.commandQueue.canRedo() },\n renderMode: effective,\n ui: { searchPanelOpen: this.isSearchPanelVisible() },\n activeErrors,\n };\n }\n\n subscribeTableState(listener: TableStateListener) {\n this.tableStateListeners.add(listener);\n listener(this.getTableState(), null);\n return () => this.tableStateListeners.delete(listener);\n }\n\n private emitTableState() {\n const next = this.getTableState();\n const prev = this.lastTableState;\n const errorsEqual = (() => {\n if (!prev) return false;\n if (prev.activeErrors.length !== next.activeErrors.length) return false;\n for (let i = 0; i < next.activeErrors.length; i += 1) {\n const a = prev.activeErrors[i];\n const b = next.activeErrors[i];\n if (!a || !b) return false;\n if (a.scope !== b.scope) return false;\n if (a.message !== b.message) return false;\n const at = a.target;\n const bt = b.target;\n if (!at && !bt) continue;\n if (!at || !bt) return false;\n if ((at.rowId ?? null) !== (bt.rowId ?? null)) return false;\n if (String(at.colKey ?? \"\") !== String(bt.colKey ?? \"\")) return false;\n }\n return true;\n })();\n // Shallow equality shortcut.\n const same =\n prev &&\n prev.canCommit === next.canCommit &&\n prev.pendingCommandCount === next.pendingCommandCount &&\n prev.pendingCellCount === next.pendingCellCount &&\n prev.undoRedo.canUndo === next.undoRedo.canUndo &&\n prev.undoRedo.canRedo === next.undoRedo.canRedo &&\n prev.renderMode === next.renderMode &&\n prev.ui.searchPanelOpen === next.ui.searchPanelOpen &&\n errorsEqual;\n if (same) return;\n this.lastTableState = next;\n for (const l of this.tableStateListeners) l(next, prev);\n }\n\n // Public API: selection callbacks\n getSelectionSnapshot(): SelectionSnapshot {\n const ranges = this.selectionRanges;\n const schema = this.dataModel.getSchema();\n const active = this.activeCell;\n const activeRowId = active?.rowId ?? null;\n const activeColKey = active?.colKey ?? null;\n const activeRowIndex = activeRowId ? this.dataModel.getRowIndex(activeRowId) : null;\n const activeColIndex =\n activeColKey !== null\n ? schema.columns.findIndex((c) => String(c.key) === String(activeColKey))\n : null;\n const col =\n activeColIndex !== null && activeColIndex >= 0 ? schema.columns[activeColIndex] : null;\n\n const activeValueRes =\n activeRowId && col ? this.dataModel.resolveCellValue(activeRowId, col) : null;\n const activeCondRes =\n activeRowId && col ? this.dataModel.resolveConditionalStyle(activeRowId, col) : null;\n const activeTextOverride =\n activeValueRes?.textOverride ?? (activeCondRes?.forceErrorText ? \"#ERROR\" : undefined);\n const activeValueRaw = activeValueRes ? activeValueRes.value : null;\n const activeValueDisplay = (() => {\n if (activeTextOverride) return activeTextOverride;\n const v = activeValueRaw;\n if (v === null || v === undefined) return \"\";\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\") {\n const obj = v as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n return String(v);\n })();\n const activeValueType = col?.type ?? null;\n const diagnostic =\n activeRowId && activeColKey !== null\n ? this.dataModel.getCellDiagnostic(activeRowId, activeColKey)\n : null;\n\n const activeStyles = (() => {\n if (!activeRowId || !col) {\n return { columnStyle: {}, cellStyle: {}, resolved: {} };\n }\n const { columnStyle, cellStyle, resolved } = resolveCellStyles(\n this.dataModel,\n activeRowId,\n col,\n );\n return { columnStyle, cellStyle, resolved };\n })();\n\n return {\n ranges: [...ranges],\n activeRowIndex: activeRowIndex !== null && activeRowIndex >= 0 ? activeRowIndex : null,\n activeRowKey: activeRowId,\n activeColumnIndex: activeColIndex !== null && activeColIndex >= 0 ? activeColIndex : null,\n activeColumnKey: activeColKey,\n activeValueRaw,\n activeValueDisplay,\n activeValueType,\n diagnostic,\n styles: activeStyles,\n };\n }\n\n subscribeSelection(listener: SelectionListener) {\n this.selectionListeners.add(listener);\n listener(this.getSelectionSnapshot(), null, \"selection\");\n return () => this.selectionListeners.delete(listener);\n }\n\n private emitSelection(reason: SelectionChangeReason) {\n const next = this.getSelectionSnapshot();\n const prev = this.lastSelectionSnapshot;\n this.lastSelectionSnapshot = next;\n for (const l of this.selectionListeners) l(next, prev, reason);\n }\n\n private getRowStateSnapshot(rowId: string): RowStateSnapshot<T, R> | null {\n const rowIndex = this.dataModel.getRowIndex(rowId);\n if (rowIndex < 0) return null;\n const data = this.buildRow(rowId);\n if (!data) return null;\n const pending =\n this.editMode === \"commit\"\n ? (this.dataModel.getPending().get(rowId) ?? undefined)\n : undefined;\n const diagnostics = this.getTableState().activeErrors.filter((e) => e.target?.rowId === rowId);\n return {\n rowId,\n rowIndex,\n data,\n pending: pending as Partial<T> | undefined,\n diagnostics: diagnostics.length ? diagnostics : undefined,\n };\n }\n\n subscribeRowState(listener: RowStateListener<T, R>) {\n this.rowStateListeners.add(listener);\n const rows = this.dataModel.listAllRows();\n for (const row of rows) {\n const snap = this.getRowStateSnapshot(row.id);\n if (!snap) continue;\n this.lastRowStates.set(row.id, snap);\n listener(row.id, snap, null, \"new\");\n }\n return () => this.rowStateListeners.delete(listener);\n }\n\n private emitRowState(rowId: string, reason: RowChangeReason) {\n const prev = this.lastRowStates.get(rowId) ?? null;\n if (reason === \"delete\") {\n this.lastRowStates.delete(rowId);\n for (const l of this.rowStateListeners) l(rowId, null, prev, reason);\n return;\n }\n const next = this.getRowStateSnapshot(rowId);\n if (!next) return;\n this.lastRowStates.set(rowId, next);\n for (const l of this.rowStateListeners) l(rowId, next, prev, reason);\n }\n\n // Public API: value updates\n setCellValue<K extends keyof T & string>(row: number | string, colKey: K, next: Updater<T[K]>) {\n const rowId = typeof row === \"string\" ? row : this.dataModel.listRows()[row]?.id;\n const resolved = rowId ? resolveCellAddress(this.dataModel, { rowId, colKey }) : null;\n if (!resolved) return;\n if (this.isCellReadonly(resolved.rowId, resolved.colKey)) return;\n const current = this.dataModel.getCell(resolved.rowId, resolved.colKey) as T[K];\n const computed = typeof next === \"function\" ? (next as (old: T[K]) => T[K])(current) : next;\n this.handleEdit(\n { kind: \"edit\", rowId: resolved.rowId, colKey: resolved.colKey, next: computed },\n this.editMode === \"direct\",\n );\n }\n\n setValueToSelection(next: Updater<unknown>) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const unique = new Set<string>();\n for (const r of this.selectionRanges) {\n if (r.kind !== \"cells\") continue;\n const sr = Math.min(r.startRow, r.endRow);\n const er = Math.max(r.startRow, r.endRow);\n const sc = Math.min(r.startCol, r.endCol);\n const ec = Math.max(r.startCol, r.endCol);\n for (let rowIndex = sr; rowIndex <= er; rowIndex += 1) {\n const row = rows[rowIndex];\n if (!row) continue;\n for (let colIndex = sc; colIndex <= ec; colIndex += 1) {\n const col = schema.columns[colIndex];\n if (!col) continue;\n const key = `${row.id}::${String(col.key)}`;\n if (unique.has(key)) continue;\n unique.add(key);\n if (this.isCellReadonly(row.id, col.key)) continue;\n const current = this.dataModel.getCell(row.id, col.key);\n const computed = typeof next === \"function\" ? next(current) : next;\n this.handleEdit(\n { kind: \"edit\", rowId: row.id, colKey: col.key, next: computed },\n this.editMode === \"direct\",\n );\n }\n }\n }\n }\n\n // Backward compatible aliases.\n openFindReplaceDialog(mode: FindReplaceMode = \"find\") {\n this.showSearchPanel(mode);\n }\n\n closeFindReplaceDialog() {\n this.hideSearchPanel();\n }\n\n private ensureFindReplace() {\n if (!this.findReplaceEnabled) return;\n if (!this.findReplace) {\n this.findReplace = new FindReplaceController(\n this.dataModel,\n (rowId, colKey) => this.selectionManager?.navigateToCell(rowId, colKey),\n (rowId, colKey, next) =>\n this.handleEdit({ kind: \"edit\", rowId, colKey, next }, this.editMode === \"direct\"),\n (rowId, colKey) => !this.isCellReadonly(rowId, colKey),\n );\n }\n if (this.findReplaceUiEnabled) {\n this.ensureFindReplaceSidebar();\n }\n }\n\n private ensureFindReplaceSidebar() {\n if (this.findReplaceSidebar) {\n if (this.findReplaceSidebar.isConnected) return;\n // If detached (e.g., React dev tools/fast refresh), drop reference and recreate.\n this.findReplaceSidebar = null;\n }\n this.ensureShell();\n const shell = this.shell ?? this.root;\n\n const aside = document.createElement(\"aside\");\n aside.className = \"extable-search-sidebar\";\n aside.innerHTML = `\n <div class=\"extable-search-header\">\n <div class=\"extable-search-row\">\n <label class=\"extable-search-label\">\n <span class=\"extable-search-title\">Find</span>\n <input data-extable-fr=\"query\" type=\"text\" />\n </label>\n <button type=\"button\" data-extable-fr=\"close\" class=\"extable-search-close\">×</button>\n </div>\n <div class=\"extable-search-row\">\n <label><input data-extable-fr=\"case\" type=\"checkbox\" /> <span>Case</span></label>\n <label><input data-extable-fr=\"regex\" type=\"checkbox\" /> <span>Regex</span></label>\n <label data-extable-fr=\"replace-toggle-row\"><input data-extable-fr=\"replace-toggle\" type=\"checkbox\" /> <span>Replace</span></label>\n </div>\n <div class=\"extable-search-row extable-search-replace-row\" data-extable-fr=\"replace-row\">\n <label class=\"extable-search-label\">\n <span class=\"extable-search-title\">Replace</span>\n <input data-extable-fr=\"replace\" type=\"text\" />\n </label>\n </div>\n <div class=\"extable-search-row extable-search-status\">\n <span data-extable-fr=\"status\"></span>\n <span data-extable-fr=\"error\" class=\"extable-search-error\"></span>\n </div>\n </div>\n <div class=\"extable-search-body\">\n <div class=\"extable-search-actions\">\n <button type=\"button\" data-extable-fr=\"prev\">Prev</button>\n <button type=\"button\" data-extable-fr=\"next\">Next</button>\n <button type=\"button\" data-extable-fr=\"replace-current\" data-extable-fr-only=\"replace\">Replace</button>\n <button type=\"button\" data-extable-fr=\"replace-all\" data-extable-fr-only=\"replace\">Replace All</button>\n </div>\n <div class=\"extable-search-results\" data-extable-fr=\"results\">\n <table class=\"extable-search-table\" data-extable-fr=\"results-table\">\n <thead>\n <tr><th>Cell</th><th>Text</th></tr>\n </thead>\n <tbody data-extable-fr=\"results-tbody\"></tbody>\n </table>\n </div>\n </div>\n `;\n\n shell.appendChild(aside);\n this.findReplaceSidebar = aside;\n\n const query = aside.querySelector<HTMLInputElement>('input[data-extable-fr=\"query\"]');\n const replace = aside.querySelector<HTMLInputElement>('input[data-extable-fr=\"replace\"]');\n const toggleReplace = aside.querySelector<HTMLInputElement>(\n 'input[data-extable-fr=\"replace-toggle\"]',\n );\n const toggleReplaceRow = aside.querySelector<HTMLElement>(\n '[data-extable-fr=\"replace-toggle-row\"]',\n );\n const caseCb = aside.querySelector<HTMLInputElement>('input[data-extable-fr=\"case\"]');\n const regexCb = aside.querySelector<HTMLInputElement>('input[data-extable-fr=\"regex\"]');\n const btnPrev = aside.querySelector<HTMLButtonElement>('button[data-extable-fr=\"prev\"]');\n const btnNext = aside.querySelector<HTMLButtonElement>('button[data-extable-fr=\"next\"]');\n const btnReplace = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fr=\"replace-current\"]',\n );\n const btnReplaceAll = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fr=\"replace-all\"]',\n );\n const btnClose = aside.querySelector<HTMLButtonElement>('button[data-extable-fr=\"close\"]');\n const tbody = aside.querySelector<HTMLElement>('[data-extable-fr=\"results-tbody\"]');\n\n if (\n !query ||\n !replace ||\n !toggleReplace ||\n !toggleReplaceRow ||\n !caseCb ||\n !regexCb ||\n !btnPrev ||\n !btnNext ||\n !btnReplace ||\n !btnReplaceAll ||\n !btnClose ||\n !tbody\n ) {\n removeFromParent(aside);\n this.findReplaceSidebar = null;\n return;\n }\n\n query.addEventListener(\"input\", () => this.findReplace?.setQuery(query.value));\n replace.addEventListener(\"input\", () => this.findReplace?.setReplace(replace.value));\n caseCb.addEventListener(\"change\", () =>\n this.findReplace?.setOptions({ caseInsensitive: caseCb.checked }),\n );\n regexCb.addEventListener(\"change\", () =>\n this.findReplace?.setOptions({ regex: regexCb.checked }),\n );\n toggleReplace.addEventListener(\"change\", () => {\n if (this.editMode === \"readonly\") {\n toggleReplace.checked = false;\n this.findReplace?.setMode(\"find\");\n aside.dataset.extableFrMode = \"find\";\n return;\n }\n const mode: FindReplaceMode = toggleReplace.checked ? \"replace\" : \"find\";\n this.findReplace?.setMode(mode);\n aside.dataset.extableFrMode = mode;\n });\n this.updateFindReplaceReadonlyUI();\n btnPrev.addEventListener(\"click\", () => this.findReplace?.prev());\n btnNext.addEventListener(\"click\", () => this.findReplace?.next());\n btnReplace.addEventListener(\"click\", () => this.findReplace?.replaceCurrent());\n btnReplaceAll.addEventListener(\"click\", () => this.findReplace?.replaceAll());\n btnClose.addEventListener(\"click\", () => this.hideSearchPanel());\n\n const truncate = (text: string, max = 140) =>\n text.length > max ? `${text.slice(0, max - 1)}…` : text;\n\n tbody.addEventListener(\"click\", (e) => {\n const tr = (e.target as HTMLElement | null)?.closest<HTMLElement>(\"tr[data-index]\");\n const idx = tr ? Number(tr.dataset.index) : -1;\n if (Number.isFinite(idx) && idx >= 0) this.findReplace?.activateIndex(idx);\n });\n tbody.addEventListener(\"keydown\", (e) => {\n if (e.key !== \"Enter\") return;\n const tr = (e.target as HTMLElement | null)?.closest<HTMLElement>(\"tr[data-index]\");\n const idx = tr ? Number(tr.dataset.index) : -1;\n if (Number.isFinite(idx) && idx >= 0) this.findReplace?.activateIndex(idx);\n });\n\n this.updateFindReplaceReadonlyUI();\n\n this.findReplaceSidebarUnsub =\n this.findReplace?.subscribe((state) => {\n const replaceRow = aside.querySelector<HTMLElement>('[data-extable-fr=\"replace-row\"]');\n const status = aside.querySelector<HTMLElement>('[data-extable-fr=\"status\"]');\n const error = aside.querySelector<HTMLElement>('[data-extable-fr=\"error\"]');\n if (!replaceRow || !status || !error) return;\n\n query.value = state.query;\n replace.value = state.replace;\n caseCb.checked = state.options.caseInsensitive;\n regexCb.checked = state.options.regex;\n toggleReplace.checked = state.mode === \"replace\";\n replaceRow.style.display = state.mode === \"replace\" ? \"block\" : \"none\";\n btnReplace.style.display = state.mode === \"replace\" ? \"inline-block\" : \"none\";\n btnReplaceAll.style.display = state.mode === \"replace\" ? \"inline-block\" : \"none\";\n\n status.textContent = `${state.matches.length} matches`;\n error.textContent = state.error ?? \"\";\n\n btnPrev.disabled = state.matches.length === 0;\n btnNext.disabled = state.matches.length === 0;\n btnReplace.disabled = state.matches.length === 0 || state.activeIndex < 0;\n btnReplaceAll.disabled = state.matches.length === 0;\n\n tbody.innerHTML = \"\";\n for (let i = 0; i < state.matches.length; i += 1) {\n const m = state.matches[i];\n if (!m) continue;\n const tr = document.createElement(\"tr\");\n tr.dataset.index = String(i);\n tr.tabIndex = 0;\n tr.className = \"extable-search-result-row\";\n if (i === state.activeIndex) tr.dataset.active = \"1\";\n const cellTd = document.createElement(\"td\");\n cellTd.textContent = `R${m.rowIndex + 1}C${m.colIndex + 1}`;\n const textTd = document.createElement(\"td\");\n const preview = truncate(m.text);\n textTd.textContent = preview;\n textTd.title = m.text;\n tr.appendChild(cellTd);\n tr.appendChild(textTd);\n tbody.appendChild(tr);\n }\n }) ?? null;\n }\n\n private teardownFindReplace() {\n this.findReplaceSidebarUnsub?.();\n this.findReplaceSidebarUnsub = null;\n if (this.findReplaceSidebar) {\n removeFromParent(this.findReplaceSidebar);\n this.findReplaceSidebar = null;\n }\n this.findReplace?.destroy();\n this.findReplace = null;\n }\n\n // External toggle for host apps.\n private stableValueKey(value: unknown) {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (value instanceof Date) return `date:${value.getTime()}`;\n if (typeof value === \"string\") return `s:${value}`;\n if (typeof value === \"number\") return `n:${Number.isNaN(value) ? \"NaN\" : String(value)}`;\n if (typeof value === \"boolean\") return `b:${value ? \"1\" : \"0\"}`;\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return `enum:${obj.value}`;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return `tags:${obj.values.filter((x) => typeof x === \"string\").join(\"|\")}`;\n }\n }\n try {\n return `json:${JSON.stringify(value)}`;\n } catch {\n return `str:${String(value)}`;\n }\n }\n\n private ensureFilterSort() {\n this.ensureFilterSortSidebar();\n this.ensureFilterSortHeaderIntegration();\n this.ensureFilterSortEscape();\n }\n\n private ensureFilterSortEscape() {\n if (this.filterSortKeydown) return;\n this.filterSortKeydown = (ev: KeyboardEvent) => {\n if (!this.isFilterSortPanelVisible()) return;\n if (ev.key !== \"Escape\") return;\n ev.preventDefault();\n ev.stopPropagation();\n this.hideFilterSortPanel();\n };\n document.addEventListener(\"keydown\", this.filterSortKeydown, true);\n }\n\n private ensureFilterSortHeaderIntegration() {\n if (this.filterSortClickCapture) return;\n const host = this.viewportEl ?? this.root;\n this.filterSortClickCapture = (ev: MouseEvent) => {\n const el = ev.target as HTMLElement | null;\n const btn = el?.closest<HTMLButtonElement>('button[data-extable-fs-open=\"1\"]');\n if (!btn) return;\n const key =\n btn.dataset.extableColKey ?? btn.closest<HTMLElement>(\"th[data-col-key]\")?.dataset.colKey;\n if (!key) return;\n ev.preventDefault();\n ev.stopPropagation();\n this.showFilterSortPanel(key);\n };\n host.addEventListener(\"click\", this.filterSortClickCapture, true);\n this.filterSortOpenEvent = (ev: Event) => {\n const anyEv = ev as CustomEvent<unknown>;\n const detail = anyEv.detail as Record<string, unknown> | null | undefined;\n const key = detail?.colKey;\n if (key === undefined || key === null) return;\n this.showFilterSortPanel(String(key));\n };\n host.addEventListener(\"extable:filter-sort-open\", this.filterSortOpenEvent);\n }\n\n private ensureFilterSortSidebar() {\n if (this.filterSortSidebar) {\n if (this.filterSortSidebar.isConnected) return;\n this.filterSortSidebar = null;\n }\n this.ensureShell();\n const shell = this.shell ?? this.root;\n\n const aside = document.createElement(\"aside\");\n aside.className = \"extable-filter-sort-sidebar\";\n aside.innerHTML = `\n <div class=\"extable-filter-sort-header\">\n <div class=\"extable-filter-sort-row\">\n <div class=\"extable-filter-sort-title\" data-extable-fs=\"title\">Sort/Filter</div>\n <button type=\"button\" data-extable-fs=\"close\" class=\"extable-filter-sort-close\">×</button>\n </div>\n </div>\n <div class=\"extable-filter-sort-body\">\n <div class=\"extable-filter-sort-section extable-filter-sort-section-filter\">\n <div class=\"extable-filter-sort-section-title\">Filter</div>\n <div class=\"extable-filter-sort-actions\">\n <label><input type=\"checkbox\" data-extable-fs=\"col-errors\" /> Errors</label>\n <label><input type=\"checkbox\" data-extable-fs=\"col-warnings\" /> Warnings</label>\n </div>\n <input data-extable-fs=\"search\" type=\"text\" placeholder=\"Search values\" />\n <div class=\"extable-filter-sort-values\" data-extable-fs=\"values\"></div>\n <div class=\"extable-filter-sort-actions\" data-align=\"split\">\n <button type=\"button\" data-extable-fs=\"select-all\">Select All</button>\n <button type=\"button\" data-extable-fs=\"select-none\">Select None</button>\n <button type=\"button\" data-extable-fs=\"apply-filter\">Apply</button>\n <button type=\"button\" data-extable-fs=\"clear-filter\">Clear</button>\n </div>\n </div>\n <div class=\"extable-filter-sort-section extable-filter-sort-section-sort\">\n <div class=\"extable-filter-sort-section-title\">Sort</div>\n <div class=\"extable-filter-sort-actions\" data-align=\"right\">\n <button type=\"button\" data-extable-fs=\"sort-asc\">Sort Asc</button>\n <button type=\"button\" data-extable-fs=\"sort-desc\">Sort Desc</button>\n <button type=\"button\" data-extable-fs=\"clear-sort\">Clear Sort</button>\n </div>\n </div>\n </div>\n `;\n shell.appendChild(aside);\n this.filterSortSidebar = aside;\n\n const btnClose = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"close\"]');\n const cbErrors = aside.querySelector<HTMLInputElement>('input[data-extable-fs=\"col-errors\"]');\n const cbWarnings = aside.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-warnings\"]',\n );\n const search = aside.querySelector<HTMLInputElement>('input[data-extable-fs=\"search\"]');\n const values = aside.querySelector<HTMLElement>('[data-extable-fs=\"values\"]');\n const btnAll = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"select-all\"]');\n const btnNone = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"select-none\"]');\n const btnApply = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"apply-filter\"]',\n );\n const btnClear = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"clear-filter\"]',\n );\n const btnSortAsc = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"sort-asc\"]');\n const btnSortDesc = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-desc\"]',\n );\n const btnSortClear = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"clear-sort\"]',\n );\n\n if (\n !btnClose ||\n !cbErrors ||\n !cbWarnings ||\n !search ||\n !values ||\n !btnAll ||\n !btnNone ||\n !btnApply ||\n !btnClear ||\n !btnSortAsc ||\n !btnSortDesc ||\n !btnSortClear\n ) {\n removeFromParent(aside);\n this.filterSortSidebar = null;\n return;\n }\n\n btnClose.addEventListener(\"click\", () => this.hideFilterSortPanel());\n\n cbErrors.addEventListener(\"change\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.diagErrors = cbErrors.checked;\n });\n cbWarnings.addEventListener(\"change\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.diagWarnings = cbWarnings.checked;\n });\n search.addEventListener(\"input\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.search = search.value;\n this.renderFilterSortValues();\n });\n\n values.addEventListener(\"change\", (e) => {\n const input = (e.target as HTMLElement | null)?.closest<HTMLInputElement>(\n 'input[type=\"checkbox\"][data-fs-val]',\n );\n if (!input || !this.filterSortDraft) return;\n const k = input.dataset.fsVal ?? \"\";\n if (!k) return;\n if (k === \"__blanks__\") {\n this.filterSortDraft.includeBlanks = input.checked;\n } else if (input.checked) {\n this.filterSortDraft.selected.add(k);\n } else {\n this.filterSortDraft.selected.delete(k);\n }\n });\n\n btnAll.addEventListener(\"click\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.selected = new Set(this.filterSortDraft.values.map((v) => v.key));\n this.filterSortDraft.includeBlanks = this.filterSortDraft.hasBlanks;\n this.renderFilterSortValues();\n });\n btnNone.addEventListener(\"click\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.selected = new Set();\n this.filterSortDraft.includeBlanks = false;\n this.renderFilterSortValues();\n });\n btnApply.addEventListener(\"click\", () => this.applyFilterSortDraft());\n btnClear.addEventListener(\"click\", () => this.clearFilterSortForActiveColumn());\n btnSortAsc.addEventListener(\"click\", () => this.setSortForActiveColumn(\"asc\"));\n btnSortDesc.addEventListener(\"click\", () => this.setSortForActiveColumn(\"desc\"));\n btnSortClear.addEventListener(\"click\", () => this.clearSort());\n\n this.filterSortSidebarUnsub = this.dataModel.subscribe(() => {\n if (!this.isFilterSortPanelVisible()) return;\n if (!this.filterSortActiveColumnKey) return;\n this.buildFilterSortDraft(this.filterSortActiveColumnKey);\n this.renderFilterSortSidebar();\n });\n }\n\n showFilterSortPanel(colKey: string) {\n this.hideSearchPanel();\n this.filterSortActiveColumnKey = colKey;\n this.buildFilterSortDraft(colKey);\n this.root.classList.toggle(\"extable-filter-sort-open\", true);\n this.renderFilterSortSidebar();\n const input =\n this.filterSortSidebar?.querySelector<HTMLInputElement>('input[data-extable-fs=\"search\"]') ??\n null;\n input?.focus();\n }\n\n hideFilterSortPanel() {\n this.root.classList.toggle(\"extable-filter-sort-open\", false);\n this.filterSortActiveColumnKey = null;\n this.filterSortDraft = null;\n }\n\n toggleFilterSortPanel(colKey: string) {\n if (this.isFilterSortPanelVisible()) this.hideFilterSortPanel();\n else this.showFilterSortPanel(colKey);\n }\n\n private buildFilterSortDraft(colKey: string) {\n const view = this.dataModel.getView();\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) {\n this.filterSortDraft = null;\n return;\n }\n const prevSearch =\n this.filterSortDraft && String(this.filterSortDraft.colKey) === String(col.key)\n ? this.filterSortDraft.search\n : \"\";\n const distinct = this.dataModel.getDistinctValuesForColumn(col.key);\n const values = distinct.values.map((v) => ({ ...v, key: this.stableValueKey(v.value) }));\n const existing = (view.filters ?? []).find(\n (f) =>\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(col.key),\n ) as ViewFilterValues | undefined;\n\n const selected = new Set<string>();\n if (existing) {\n for (const v of existing.values ?? []) selected.add(this.stableValueKey(v));\n } else {\n for (const v of values) selected.add(v.key);\n }\n const includeBlanks = existing ? Boolean(existing.includeBlanks) : distinct.hasBlanks;\n const diag = view.columnDiagnostics?.[String(col.key)];\n this.filterSortDraft = {\n colKey: col.key,\n values,\n hasBlanks: distinct.hasBlanks,\n selected,\n includeBlanks,\n diagErrors: Boolean(diag?.errors),\n diagWarnings: Boolean(diag?.warnings),\n search: prevSearch,\n };\n }\n\n private renderFilterSortSidebar() {\n if (!this.filterSortSidebar) return;\n const title = this.filterSortSidebar.querySelector<HTMLElement>('[data-extable-fs=\"title\"]');\n const cbErrors = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-errors\"]',\n );\n const cbWarnings = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-warnings\"]',\n );\n const search = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"search\"]',\n );\n if (!title || !cbErrors || !cbWarnings || !search) return;\n const btnSortAsc = this.filterSortSidebar.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-asc\"]',\n );\n const btnSortDesc = this.filterSortSidebar.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-desc\"]',\n );\n const draft = this.filterSortDraft;\n if (!draft) {\n title.textContent = \"Sort/Filter\";\n cbErrors.checked = false;\n cbWarnings.checked = false;\n search.value = \"\";\n if (btnSortAsc) btnSortAsc.dataset.active = \"0\";\n if (btnSortDesc) btnSortDesc.dataset.active = \"0\";\n this.renderFilterSortValues();\n return;\n }\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(draft.colKey));\n const name = col?.header ?? String(draft.colKey);\n title.textContent = `Sort/Filter: ${name}`;\n cbErrors.checked = draft.diagErrors;\n cbWarnings.checked = draft.diagWarnings;\n search.value = draft.search;\n const view = this.dataModel.getView();\n const sort = view.sorts?.find((s) => String(s.key) === String(draft.colKey));\n if (btnSortAsc) btnSortAsc.dataset.active = sort?.dir === \"asc\" ? \"1\" : \"0\";\n if (btnSortDesc) btnSortDesc.dataset.active = sort?.dir === \"desc\" ? \"1\" : \"0\";\n this.renderFilterSortValues();\n }\n\n private renderFilterSortValues() {\n if (!this.filterSortSidebar) return;\n const values = this.filterSortSidebar.querySelector<HTMLElement>('[data-extable-fs=\"values\"]');\n if (!values) return;\n values.innerHTML = \"\";\n const draft = this.filterSortDraft;\n if (!draft) return;\n\n const q = draft.search.trim().toLowerCase();\n const total = draft.values.length + (draft.hasBlanks ? 1 : 0);\n if (total > 100 && !q) {\n const msg = document.createElement(\"div\");\n msg.textContent = \"Too many values (100+). Type to search.\";\n values.appendChild(msg);\n return;\n }\n\n if (draft.hasBlanks) {\n const label = document.createElement(\"label\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.dataset.fsVal = \"__blanks__\";\n cb.checked = draft.includeBlanks;\n const text = document.createElement(\"span\");\n text.textContent = \"(Blanks)\";\n label.appendChild(cb);\n label.appendChild(text);\n values.appendChild(label);\n }\n\n const filtered = q\n ? draft.values.filter((v) => v.label.toLowerCase().includes(q))\n : draft.values;\n for (const v of filtered.slice(0, 200)) {\n const label = document.createElement(\"label\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.dataset.fsVal = v.key;\n cb.checked = draft.selected.has(v.key);\n const text = document.createElement(\"span\");\n text.textContent = v.label;\n label.appendChild(cb);\n label.appendChild(text);\n values.appendChild(label);\n }\n }\n\n private applyFilterSortDraft() {\n const draft = this.filterSortDraft;\n if (!draft) return;\n const view = this.dataModel.getView();\n const existingFilters = [...(view.filters ?? [])].filter(\n (f) =>\n !(\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(draft.colKey)\n ),\n );\n\n const allSelected =\n draft.selected.size === draft.values.length &&\n draft.includeBlanks === Boolean(draft.hasBlanks);\n const nextFilters = allSelected\n ? existingFilters\n : [\n ...existingFilters,\n {\n kind: \"values\",\n key: draft.colKey,\n values: draft.values.filter((v) => draft.selected.has(v.key)).map((v) => v.value),\n includeBlanks: draft.includeBlanks,\n } satisfies ViewFilterValues,\n ];\n\n const nextDiagnostics = { ...(view.columnDiagnostics ?? {}) };\n if (draft.diagErrors || draft.diagWarnings) {\n nextDiagnostics[String(draft.colKey)] = {\n errors: draft.diagErrors,\n warnings: draft.diagWarnings,\n };\n } else {\n delete nextDiagnostics[String(draft.colKey)];\n }\n\n const nextView: View = {\n ...view,\n filters: nextFilters.length ? nextFilters : undefined,\n columnDiagnostics: Object.keys(nextDiagnostics).length ? nextDiagnostics : undefined,\n };\n this.setView(nextView);\n }\n\n private clearFilterSortForActiveColumn() {\n const colKey = this.filterSortActiveColumnKey;\n if (colKey === null || colKey === undefined) return;\n const view = this.dataModel.getView();\n const nextFilters = [...(view.filters ?? [])].filter(\n (f) =>\n !(\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(colKey)\n ),\n );\n const nextDiagnostics = { ...(view.columnDiagnostics ?? {}) };\n delete nextDiagnostics[String(colKey)];\n const nextView: View = {\n ...view,\n filters: nextFilters.length ? nextFilters : undefined,\n columnDiagnostics: Object.keys(nextDiagnostics).length ? nextDiagnostics : undefined,\n };\n this.setView(nextView);\n this.buildFilterSortDraft(colKey);\n this.renderFilterSortSidebar();\n }\n\n private setSortForActiveColumn(dir: \"asc\" | \"desc\") {\n const colKey = this.filterSortActiveColumnKey;\n if (colKey === null || colKey === undefined) return;\n const view = this.dataModel.getView();\n const nextView: View = { ...view, sorts: [{ key: colKey, dir }] };\n this.setView(nextView);\n this.buildFilterSortDraft(colKey);\n this.renderFilterSortSidebar();\n }\n\n private clearSort() {\n const view = this.dataModel.getView();\n if (!view.sorts?.length) return;\n const nextView: View = { ...view, sorts: undefined };\n this.setView(nextView);\n if (this.filterSortActiveColumnKey !== null) {\n this.buildFilterSortDraft(this.filterSortActiveColumnKey);\n this.renderFilterSortSidebar();\n }\n }\n\n private teardownFilterSort() {\n this.filterSortSidebarUnsub?.();\n this.filterSortSidebarUnsub = null;\n if (this.filterSortSidebar) {\n removeFromParent(this.filterSortSidebar);\n this.filterSortSidebar = null;\n }\n if (this.filterSortKeydown) {\n document.removeEventListener(\"keydown\", this.filterSortKeydown, true);\n this.filterSortKeydown = null;\n }\n if (this.filterSortClickCapture) {\n (this.viewportEl ?? this.root).removeEventListener(\n \"click\",\n this.filterSortClickCapture,\n true,\n );\n this.filterSortClickCapture = null;\n }\n if (this.filterSortOpenEvent) {\n (this.viewportEl ?? this.root).removeEventListener(\n \"extable:filter-sort-open\",\n this.filterSortOpenEvent,\n );\n this.filterSortOpenEvent = null;\n }\n this.root.classList.toggle(\"extable-filter-sort-open\", false);\n this.filterSortActiveColumnKey = null;\n this.filterSortDraft = null;\n }\n\n private initViewportState() {\n const host = this.getScrollHost();\n this.viewportState = {\n scrollTop: host.scrollTop,\n scrollLeft: host.scrollLeft,\n clientWidth: host.clientWidth,\n clientHeight: host.clientHeight,\n deltaX: 0,\n deltaY: 0,\n timestamp: performance.now(),\n };\n }\n\n private updateViewportFromRoot() {\n if (!this.viewportState) this.initViewportState();\n const prev = this.viewportState ?? {\n scrollTop: 0,\n scrollLeft: 0,\n clientWidth: 0,\n clientHeight: 0,\n deltaX: 0,\n deltaY: 0,\n timestamp: performance.now(),\n };\n const host = this.getScrollHost();\n const next: ViewportState = {\n scrollTop: host.scrollTop,\n scrollLeft: host.scrollLeft,\n clientWidth: host.clientWidth,\n clientHeight: host.clientHeight,\n deltaX: host.scrollLeft - prev.scrollLeft,\n deltaY: host.scrollTop - prev.scrollTop,\n timestamp: performance.now(),\n };\n this.viewportState = next;\n if (this.rafId === null) {\n this.rafId = requestAnimationFrame(() => this.flushRender());\n }\n }\n\n private flushRender() {\n this.rafId = null;\n if (!this.viewportState) return;\n this.selectionManager?.onScroll(this.viewportState.scrollTop, this.viewportState.scrollLeft);\n // HTML renderer re-renders DOM; avoid doing it on scroll to preserve scroll position.\n if (this.renderer instanceof HTMLRenderer) return;\n this.safeRender(this.viewportState);\n }\n}\n\n// Compatibility helpers for wrappers/tests\nexport function createTablePlaceholder<T extends object = Record<string, unknown>>(\n config: TableConfig<T>,\n options?: CoreOptions,\n) {\n const core = new ExtableCore<T>({\n root: document.createElement(\"div\"),\n defaultData: config.data,\n defaultView: config.view,\n schema: config.schema,\n options,\n });\n return core;\n}\n\nexport function mountTable(target: HTMLElement, core: ExtableCore) {\n core.remount(target);\n return core;\n}\n"],"names":["getBatchId","cmd","p","id","CommandQueue","cap","command","batchId","last","out","group","g","generateId","toArray","value","removeFromParent","el","pad","num","len","tokenHandlers","d","h","TOKENS","a","b","DATE_TOKENS","TIME_TOKENS","DATETIME_TOKENS","DATE_PRESETS","TIME_PRESETS","DATETIME_PRESETS","parseIsoDate","parsed","formatDateLite","date","pattern","inLiteral","ch","matched","token","isTokenAllowed","kind","isPatternAllowed","i","coerceDatePattern","fallback","isValidDate","asEnumValue","obj","asTagsValues","v","values","validateCellValue","col","allowCustom","options","DataModel","dataset","schema","view","listener","l","run","row","idx","rowId","index","slowIndex","r","slowRow","height","next","entries","changed","key","found","pendingRow","colKey","c","committed","bumpVersion","prev","rawVal","current","uniqueCols","val","rowData","forcedId","clamped","removed","colIndex","rowIndex","exclude","includeSort","filters","f","vf","opf","columnDiagnosticsEntries","k","x","sorts","s","filter","valueKey","colKeyStr","diag","errors","warnings","marker","diagEntries","filtered","ok","sort","sortCol","dir","withKeys","blank","baseIndex","compare","as","bs","cached","rows","indexById","cacheKey","empty","map","hasBlanks","label","keys","sep","merged","version","data","e","fn","res","rowRes","applyDelta","base","delta","diagnostic","forceErrorText","colCacheKey","cellFn","ra","rb","ca","cb","validation","level","message","msg","joined","valueToRows","norm","list","rowIds","display","rowList","style","updater","resolveCellAddress","dataModel","address","resolveByIndex","resolveByKeys","defaultOptions","stringifyCellValue","escapeRegExp","text","clampIndex","length","FindReplaceController","navigateToCell","applyEdit","canEdit","mode","query","replace","match","currentText","replacement","byCell","m","matches","first","nextText","flags","re","seen","substr","args","off","sorted","error","cellValue","start","end","activeIndex","LockManager","server","user","currentRowId","keepRowId","toUnlock","DAY_MS","safeParseDate","safeParseTime","toRawValue","raw","floored","HEADER_HEIGHT_PX","ROW_HEADER_WIDTH_PX","DEFAULT_ROW_HEIGHT_PX","getColumnWidths","fallbackWidth","extraByType","extra","j","n","T","M","w","E","J","o","u","N","A","L","F","z","O","P","R","C","D","$","V","W","B","Q","q","G","X","U","K","Y","H","Z","_","ee","te","ne","y","se","ie","ae","oe","le","ce","ue","S","me","de","fe","he","ge","pe","ye","Se","be","I","xe","Ie","ke","Ne","je","Te","normalizeRange","range","coerceToTime","coerceToDate","getFillHandleSource","ranges","width","makeFillValueGetter","source","langs","seed","registry","createBuiltInRegistry","numbers","seq","inferSequence","cache","done","offsetFromEnd","dates","strings","FILL_HANDLE_VISUAL_SIZE_PX","FILL_HANDLE_HIT_SIZE_PX","getFillHandleRect","cellRect","size","isPointInRect","rect","shouldShowFillHandle","activeRowId","activeColKey","editMode","src","columnFormatToStyle","fmt","dec","mergeStyle","override","resolveCellStyles","columnStyle","conditional","cellStyle","resolved","styleToCssText","css","getColumnSortDir","hasActiveColumnFilter","svgFunnel","svgArrow","drawDiagnosticCorner","ctx","color","ValueFormatCache","drawFunnelIcon","alpha","drawSortArrowIcon","FenwickTree","ft","count","index0","target","total","bit","acc","step","nextAcc","HTMLRenderer","root","_state","scrollContainer","prevTop","prevLeft","colWidths","colBaseStyles","colBaseCss","totalWidth","colgroup","rowCol","colEl","body","entry","event","corner","rowHeader","cell","thead","tr","rowTh","th","sortDir","hasFilter","wrap","btn","td","isPending","condRes","baseStyle","withCond","forCss","valueRes","textOverride","formatted","align","rawNumbered","rawStr","maxHeight","measure","measureHost","isAll","startRow","endRow","startCol","endCol","rowEl","cells","opts","_CanvasRenderer","getEditMode","ev","viewportX","viewportY","xCursor","iconSize","iconLeft","iconTop","maxDim","state","baseFont","selectAll","fontCache","wrapAny","heightIndex","desiredCanvasWidth","desiredCanvasHeight","nextWidth","nextHeight","scrollTop","scrollLeft","computeVisibleRange","contentTop","visibleStart","accum","visibleEnd","drawnHeight","totalRowsHeight","viewportHeight","dataViewportHeight","maxContentScrollTop","contentScrollTop","updates","nextH","dataXOffset","yCursor","rowH","idxText","lastFontKey","readOnly","mergedStyle","bg","left","top","isBoolean","isCustomBoolean","fontKey","weight","xHeader","isHover","iconBox","ix","iy","yTop","xLeft","existing","heights","idToIndex","measuredVersion","cachedHeight","wraps","widths","task","measured","headerHeight","accumHeight","topPx","rowTop","rootRect","maxW","maxH","side","tRect","clientX","clientY","prevKey","prevIcon","nextKey","nextIcon","cursor","hit","sameCell","sameMessage","handleRect","rawLines","lines","line","cut","firstKey","decorations","fontBackup","renderLine","ln","lineIdx","baseline","startX","endX","center","strokeBackup","lineWidthBackup","yUnderline","yStrike","CanvasRenderer","SelectionManager","onEdit","onRowSelect","onMove","hitTest","sequenceLangs","isCellReadonly","onActiveChange","onContextMenu","onSelectionChange","onUndo","onRedo","fillSrc","handleRowIndex","handleColIndex","handleRow","handleCol","targetRow","targetCol","dx","dy","endRowIndex","suppressTrailingClick","payload","html","tsv","grid","isMac","isTab","isEnter","isArrow","extend","wasSameCell","isSecondClick","maxRow","maxCol","activeRowIndex","activeColIndex","nextRanges","clamp","max","desiredColKey","fallbackRow","nextRow","nextRange","colType","initial","toast","inset","maxLeft","maxTop","minLeft","minTop","candidateLeft","candidateTop","variant","durationMs","input","valueForSelection","escapeFn","rowIdEsc","keyEsc","box","rowHeaderWidth","defaultRowHeight","active","headerEl","cellEl","htmlCell","metrics","xStart","xEnd","yStart","yEnd","leftVis","rightVis","topVis","bottomVis","deltaRow","deltaCol","extendSelection","anchor","nextRowIndex","nextColIndex","colHeader","endColIndex","nextEnd","threshold","maxStep","tick","raf","raf2","getValue","commitNow","offset","cellCount","copyViaClipboardApi","item","copyViaFallbackInput","ac","normalized","rowIdx","colIdx","htmlRows","tableStyle","htmlCells","fromHtml","trimmed","table","trs","ta","select","opt","op","listId","datalist","lineHeight","wrapper","isRow","targetRange","anchorRow","anchorCol","anchorCell","sameCols","sameRows","rowsTouch","colsTouch","initialValue","control","now","isTextarea","isAltEnter","commitAndMove","clearActive","defineSchema","ExtableCore","init","defaultData","initialData","classes","ua","shell","viewport","anyRO","force","host","_colKey","classNames","wasLoaded","rowIdOrIndex","pending","vv","position","insertAt","baseIdx","newId","cmds","toKinds","kinds","labelFor","commandCount","toSteps","groups","touched","snapshots","snap","commands","pop","actions","act","hr","action","viewportWidth","targetIndex","aside","toggleReplace","readonly","effective","applied","pendingCommands","pendingCommandCount","pendingCellCount","validationErrors","diagnosticErrors","ar","br","bc","activeErrors","errorsEqual","at","bt","activeValueRes","activeCondRes","activeTextOverride","activeValueRaw","activeValueDisplay","activeValueType","activeStyles","reason","diagnostics","computed","unique","sr","er","sc","ec","toggleReplaceRow","caseCb","regexCb","btnPrev","btnNext","btnReplace","btnReplaceAll","btnClose","tbody","truncate","replaceRow","status","cellTd","textTd","preview","cbErrors","cbWarnings","search","btnAll","btnNone","btnApply","btnClear","btnSortAsc","btnSortDesc","btnSortClear","prevSearch","distinct","selected","includeBlanks","title","draft","name","existingFilters","nextFilters","nextDiagnostics","nextView","createTablePlaceholder","config","mountTable","core"],"mappings":"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"}
|