@extable/core 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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","../../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(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\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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"}
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/lockManager.ts","../src/cellValueCodec.ts","../src/geometry.ts","../../sequence/dist/index.js","../src/fillHandle.ts","../src/styleResolver.ts","../src/actionValue.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, NumberFormat, StringFormat } 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 const fmt = col.format as StringFormat | undefined;\n if (fmt?.maxLength !== undefined && value.length > fmt.maxLength) {\n return `Too long (max ${fmt.maxLength})`;\n }\n if (fmt?.regex) {\n try {\n const re = new RegExp(fmt.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 const fmt = col.format as NumberFormat | undefined;\n if (fmt?.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 const fmt = col.format as string | undefined;\n if (col.type === \"date\") coerceDatePattern(fmt, \"date\");\n else if (col.type === \"time\") coerceDatePattern(fmt, \"time\");\n else coerceDatePattern(fmt, \"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 ColumnType,\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 private isActionType(colType: ColumnType | undefined) {\n return colType === \"button\" || colType === \"link\";\n }\n\n private supportsConditionalReadonly(colType: ColumnType | undefined) {\n return (\n colType === \"boolean\" ||\n colType === \"number\" ||\n colType === \"date\" ||\n colType === \"time\" ||\n colType === \"datetime\" ||\n colType === \"string\" ||\n colType === \"enum\" ||\n colType === \"tags\"\n );\n }\n\n public isColumnReadonly(colKey: string) {\n const col = this.schema.columns.find((c) => c.key === colKey);\n if (this.isActionType(col?.type)) return true;\n return Boolean(col?.readonly || col?.formula);\n }\n\n public getCellInteraction(rowId: string, colKey: string) {\n const col = this.schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return { readonly: false, disabled: false, muted: false };\n const baseReadonly = this.isRowReadonly(rowId) || this.isColumnReadonly(colKey);\n const delta = this.resolveConditionalStyle(rowId, col).delta;\n const cellStyle = this.getCellStyle(rowId, colKey);\n const readonlyAllowed = this.supportsConditionalReadonly(col.type);\n const readonlyFromStyle =\n readonlyAllowed && Boolean(col.style?.readonly || delta?.readonly || cellStyle?.readonly);\n const disabledAllowed = this.isActionType(col.type);\n const disabled =\n disabledAllowed && Boolean(col.style?.disabled || delta?.disabled || cellStyle?.disabled);\n const readonly = baseReadonly || readonlyFromStyle || disabled;\n const muted = disabled || (readonly && !disabledAllowed);\n return { readonly, disabled, muted };\n }\n\n public isReadonly(rowId: string, colKey: string) {\n return this.getCellInteraction(rowId, colKey).readonly;\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 { 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 h = (e) => e.trim().normalize(\"NFKC\").toLowerCase().replace(/\\s+/g, \" \"), C = (e) => {\n const n = [];\n if (e)\n for (const t of e) {\n const s = t.trim();\n !s || n.includes(s) || n.push(s);\n }\n return n.length === 0 ? n.push(\"en\") : n.includes(\"en\") || n.push(\"en\"), n;\n}, W = (e, n) => {\n const t = e.items.indexOf(n);\n if (t !== -1)\n return t;\n if (!e.aliases)\n return null;\n const s = e.aliases[n];\n if (!s)\n return null;\n const r = e.items.indexOf(s);\n return r === -1 ? null : r;\n}, F = (e, n) => {\n const t = h(n);\n if (h(e.id).includes(t))\n return !0;\n for (const s of e.items)\n if (h(s).includes(t))\n return !0;\n return e.aliases ? Object.keys(e.aliases).some(\n (s) => h(s).includes(t)\n ) : !1;\n}, O = (e, n) => {\n if (e.langs.length === 0)\n return 0;\n let t = Number.POSITIVE_INFINITY;\n for (const s of e.langs) {\n const r = n.indexOf(s);\n r !== -1 && r < t && (t = r);\n }\n return t;\n}, P = (e, n) => !e.langs || e.langs.length === 0 ? !0 : e.langs.some((t) => n.includes(t));\nclass V {\n constructor(n) {\n this.lists = [], this.matchers = [], this.langs = C(n?.langs);\n }\n register(n) {\n const t = this.lists.findIndex((s) => s.id === n.id);\n t === -1 ? this.lists.push(n) : this.lists[t] = n;\n }\n registerMatch(n) {\n const t = this.matchers.findIndex((s) => s.id === n.id);\n t === -1 ? this.matchers.push(n) : this.matchers[t] = n;\n }\n unregister(n) {\n this.lists = this.lists.filter((t) => t.id !== n), this.matchers = this.matchers.filter((t) => t.id !== n);\n }\n list(n) {\n let t = [...this.lists];\n if (n?.enabledIds && n.enabledIds.length > 0) {\n const r = new Set(n.enabledIds);\n t = t.filter((o) => r.has(o.id));\n }\n const s = n?.queryText;\n return s && (t = t.filter((r) => F(r, s))), t;\n }\n match(n, t) {\n if (n.length === 0)\n return null;\n let s = null, r = Number.NEGATIVE_INFINITY;\n const o = t?.enabledIds ? new Set(t.enabledIds) : null;\n for (const a of this.matchers) {\n if (o && !o.has(a.id) || !P(a, this.langs))\n continue;\n const u = a.match(n);\n if (!u)\n continue;\n const l = u.score;\n Number.isFinite(l) && l > r && (r = l, s = {\n kind: \"matcher\",\n matcher: a,\n step: u.step ?? 1,\n state: u.state\n });\n }\n const i = this.list(t).map((a) => ({ list: a, rank: O(a, this.langs) })).filter((a) => Number.isFinite(a.rank)).sort((a, u) => a.rank - u.rank);\n for (const { list: a, rank: u } of i) {\n const l = [];\n let c = !1;\n for (const E of n) {\n const x = W(a, E);\n if (x === null) {\n c = !0;\n break;\n }\n l.push(x);\n }\n if (c)\n continue;\n const d = this.inferStep(a, l);\n if (d === null)\n continue;\n const S = 10 - u;\n S > r && (r = S, s = {\n kind: \"list\",\n list: a,\n startIndex: l[l.length - 1] ?? 0,\n step: d\n });\n }\n return s;\n }\n inferStep(n, t) {\n if (t.length < 2)\n return 1;\n const s = n.items.length, r = this.stepBetween(n.mode, s, t[0], t[1]);\n if (r === null)\n return null;\n for (let o = 2; o < t.length; o += 1) {\n const i = this.nextIndex(n.mode, s, t[o - 1], r);\n if (i === null || i !== t[o])\n return null;\n }\n return r;\n }\n stepBetween(n, t, s, r) {\n if (n === \"cycle\")\n return (r - s + t) % t;\n const o = r - s;\n return o < 0 ? null : o;\n }\n nextIndex(n, t, s, r) {\n if (n === \"cycle\")\n return (s + r) % t;\n const o = s + r;\n return o >= t ? null : o;\n }\n}\nconst J = {\n id: \"weekdays-en-long\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"]\n}, R = {\n id: \"weekdays-en-short\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n aliases: {\n Tues: \"Tue\",\n Thur: \"Thu\",\n Thurs: \"Thu\"\n }\n}, D = {\n id: \"weekdays-ja-long\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜日\", \"火曜日\", \"水曜日\", \"木曜日\", \"金曜日\", \"土曜日\", \"日曜日\"]\n}, K = {\n id: \"weekdays-ja-short\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜\", \"火曜\", \"水曜\", \"木曜\", \"金曜\", \"土曜\", \"日曜\"]\n}, $ = {\n id: \"weekdays-ja-single\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月\", \"火\", \"水\", \"木\", \"金\", \"土\", \"日\"]\n}, z = {\n id: \"months-en-long\",\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}, B = {\n id: \"months-en-short\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n aliases: {\n Sept: \"Sep\"\n }\n}, G = {\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}, H = {\n id: \"months-ja-traditional\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"睦月\", \"如月\", \"弥生\", \"卯月\", \"皐月\", \"水無月\", \"文月\", \"葉月\", \"長月\", \"神無月\", \"霜月\", \"師走\"]\n}, U = {\n id: \"quarters-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"]\n}, Y = {\n id: \"quarters-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"第1四半期\", \"第2四半期\", \"第3四半期\", \"第4四半期\"]\n}, q = {\n id: \"zodiac-animals-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"子\", \"丑\", \"寅\", \"卯\", \"辰\", \"巳\", \"午\", \"未\", \"申\", \"酉\", \"戌\", \"亥\"]\n}, X = {\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}, Q = {\n id: \"zodiac-signs-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"牡羊座\", \"牡牛座\", \"双子座\", \"蟹座\", \"獅子座\", \"乙女座\", \"天秤座\", \"蠍座\", \"射手座\", \"山羊座\", \"水瓶座\", \"魚座\"],\n aliases: {\n さそり座: \"蠍座\"\n }\n}, Z = {\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}, _ = {\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}, ee = {\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}, te = {\n id: \"ampm-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"午前\", \"午後\"]\n}, ne = {\n id: \"seasons-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Spring\", \"Summer\", \"Autumn\", \"Winter\"],\n aliases: {\n Fall: \"Autumn\"\n }\n}, se = {\n id: \"seasons-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"春\", \"夏\", \"秋\", \"冬\"]\n}, re = {\n id: \"solfege-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"ド\", \"レ\", \"ミ\", \"ファ\", \"ソ\", \"ラ\", \"シ\"]\n}, ie = {\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}, ae = {\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}, oe = {\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}, le = {\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}, ue = {\n id: \"rokuyo-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"先勝\", \"友引\", \"先負\", \"仏滅\", \"大安\", \"赤口\"]\n}, ce = {\n id: \"heavenly-stems-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"甲\", \"乙\", \"丙\", \"丁\", \"戊\", \"己\", \"庚\", \"辛\", \"壬\", \"癸\"]\n}, de = {\n id: \"planets-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\"Mercury\", \"Venus\", \"Earth\", \"Mars\", \"Jupiter\", \"Saturn\", \"Uranus\", \"Neptune\"]\n}, fe = {\n id: \"planets-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"水星\", \"金星\", \"地球\", \"火星\", \"木星\", \"土星\", \"天王星\", \"海王星\"]\n}, me = {\n id: \"kuji-in-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"臨\", \"兵\", \"闘\", \"者\", \"皆\", \"陣\", \"烈\", \"在\", \"前\"]\n}, he = {\n id: \"eight-virtues-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"仁\", \"義\", \"礼\", \"智\", \"忠\", \"信\", \"孝\", \"悌\"]\n}, ge = {\n id: \"element-symbols\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"H\",\n \"He\",\n \"Li\",\n \"Be\",\n \"B\",\n \"C\",\n \"N\",\n \"O\",\n \"F\",\n \"Ne\",\n \"Na\",\n \"Mg\",\n \"Al\",\n \"Si\",\n \"P\",\n \"S\",\n \"Cl\",\n \"Ar\",\n \"K\",\n \"Ca\",\n \"Sc\",\n \"Ti\",\n \"V\",\n \"Cr\",\n \"Mn\",\n \"Fe\",\n \"Co\",\n \"Ni\",\n \"Cu\",\n \"Zn\",\n \"Ga\",\n \"Ge\",\n \"As\",\n \"Se\",\n \"Br\",\n \"Kr\",\n \"Rb\",\n \"Sr\",\n \"Y\",\n \"Zr\",\n \"Nb\",\n \"Mo\",\n \"Tc\",\n \"Ru\",\n \"Rh\",\n \"Pd\",\n \"Ag\",\n \"Cd\",\n \"In\",\n \"Sn\",\n \"Sb\",\n \"Te\",\n \"I\",\n \"Xe\",\n \"Cs\",\n \"Ba\",\n \"La\",\n \"Ce\",\n \"Pr\",\n \"Nd\",\n \"Pm\",\n \"Sm\",\n \"Eu\",\n \"Gd\",\n \"Tb\",\n \"Dy\",\n \"Ho\",\n \"Er\",\n \"Tm\",\n \"Yb\",\n \"Lu\",\n \"Hf\",\n \"Ta\",\n \"W\",\n \"Re\",\n \"Os\",\n \"Ir\",\n \"Pt\",\n \"Au\",\n \"Hg\",\n \"Tl\",\n \"Pb\",\n \"Bi\",\n \"Po\",\n \"At\",\n \"Rn\",\n \"Fr\",\n \"Ra\",\n \"Ac\",\n \"Th\",\n \"Pa\",\n \"U\",\n \"Np\",\n \"Pu\",\n \"Am\",\n \"Cm\",\n \"Bk\",\n \"Cf\",\n \"Es\",\n \"Fm\",\n \"Md\",\n \"No\",\n \"Lr\",\n \"Rf\",\n \"Db\",\n \"Sg\",\n \"Bh\",\n \"Hs\",\n \"Mt\",\n \"Ds\",\n \"Rg\",\n \"Cn\",\n \"Nh\",\n \"Fl\",\n \"Mc\",\n \"Lv\",\n \"Ts\",\n \"Og\"\n ]\n}, pe = {\n id: \"element-names-ja\",\n mode: \"finite\",\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 \"鉄\",\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 \"テルル\",\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 \"白金\",\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 \"ラザホージウム\",\n \"ドブニウム\",\n \"シーボーギウム\",\n \"ボーリウム\",\n \"ハッシウム\",\n \"マイトネリウム\",\n \"ダームスタチウム\",\n \"レントゲニウム\",\n \"コペルニシウム\",\n \"ニホニウム\",\n \"フレロビウム\",\n \"モスコビウム\",\n \"リバモリウム\",\n \"テネシン\",\n \"オガネソン\"\n ]\n}, ye = {\n id: \"shoguns-kamakura-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"源頼朝\",\n \"源頼家\",\n \"源実朝\",\n \"九条頼経\",\n \"九条頼嗣\",\n \"宗尊親王\",\n \"惟康親王\",\n \"久明親王\",\n \"守邦親王\"\n ]\n}, Se = {\n id: \"shoguns-ashikaga-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"足利尊氏\",\n \"足利義詮\",\n \"足利義満\",\n \"足利義持\",\n \"足利義量\",\n \"足利義教\",\n \"足利義勝\",\n \"足利義政\",\n \"足利義尚\",\n \"足利義稙\",\n \"足利義澄\",\n \"足利義晴\",\n \"足利義輝\",\n \"足利義栄\",\n \"足利義昭\"\n ]\n}, xe = {\n id: \"shoguns-ashikaga-given-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"尊氏\",\n \"義詮\",\n \"義満\",\n \"義持\",\n \"義量\",\n \"義教\",\n \"義勝\",\n \"義政\",\n \"義尚\",\n \"義稙\",\n \"義澄\",\n \"義晴\",\n \"義輝\",\n \"義栄\",\n \"義昭\"\n ]\n}, be = {\n id: \"shoguns-tokugawa-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"徳川家康\",\n \"徳川秀忠\",\n \"徳川家光\",\n \"徳川家綱\",\n \"徳川綱吉\",\n \"徳川家宣\",\n \"徳川家継\",\n \"徳川吉宗\",\n \"徳川家重\",\n \"徳川家治\",\n \"徳川家斉\",\n \"徳川家慶\",\n \"徳川家定\",\n \"徳川家茂\",\n \"徳川慶喜\"\n ]\n}, ke = {\n id: \"shoguns-tokugawa-given-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"家康\",\n \"秀忠\",\n \"家光\",\n \"家綱\",\n \"綱吉\",\n \"家宣\",\n \"家継\",\n \"吉宗\",\n \"家重\",\n \"家治\",\n \"家斉\",\n \"家慶\",\n \"家定\",\n \"家茂\",\n \"慶喜\"\n ]\n}, j = [\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 \"京都府\",\n \"大阪府\",\n \"兵庫県\",\n \"奈良県\",\n \"和歌山県\",\n \"鳥取県\",\n \"島根県\",\n \"岡山県\",\n \"広島県\",\n \"山口県\",\n \"徳島県\",\n \"香川県\",\n \"愛媛県\",\n \"高知県\",\n \"福岡県\",\n \"佐賀県\",\n \"長崎県\",\n \"熊本県\",\n \"大分県\",\n \"宮崎県\",\n \"鹿児島県\",\n \"沖縄県\"\n], je = j.reduce(\n (e, n) => {\n if (n === \"北海道\")\n return e;\n if (/[都府県]$/.test(n)) {\n const t = n.slice(0, -1);\n e[t] = n;\n }\n return e;\n },\n {}\n), Ne = {\n id: \"prefectures-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: j,\n aliases: je\n}, Ie = {\n id: \"us-states-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\n \"Alabama\",\n \"Alaska\",\n \"Arizona\",\n \"Arkansas\",\n \"California\",\n \"Colorado\",\n \"Connecticut\",\n \"Delaware\",\n \"Florida\",\n \"Georgia\",\n \"Hawaii\",\n \"Idaho\",\n \"Illinois\",\n \"Indiana\",\n \"Iowa\",\n \"Kansas\",\n \"Kentucky\",\n \"Louisiana\",\n \"Maine\",\n \"Maryland\",\n \"Massachusetts\",\n \"Michigan\",\n \"Minnesota\",\n \"Mississippi\",\n \"Missouri\",\n \"Montana\",\n \"Nebraska\",\n \"Nevada\",\n \"New Hampshire\",\n \"New Jersey\",\n \"New Mexico\",\n \"New York\",\n \"North Carolina\",\n \"North Dakota\",\n \"Ohio\",\n \"Oklahoma\",\n \"Oregon\",\n \"Pennsylvania\",\n \"Rhode Island\",\n \"South Carolina\",\n \"South Dakota\",\n \"Tennessee\",\n \"Texas\",\n \"Utah\",\n \"Vermont\",\n \"Virginia\",\n \"Washington\",\n \"West Virginia\",\n \"Wisconsin\",\n \"Wyoming\"\n ]\n}, we = {\n id: \"us-states-abbrev-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\"\n ]\n}, Te = {\n id: \"windows-versions\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"Windows 1.0\",\n \"Windows 2.0\",\n \"Windows 2.1\",\n \"Windows 3.0\",\n \"Windows 3.1\",\n \"Windows 3.11\",\n \"Windows 95\",\n \"Windows 98\",\n \"Windows 98 SE\",\n \"Windows Me\",\n \"Windows XP\",\n \"Windows Vista\",\n \"Windows 7\",\n \"Windows 8\",\n \"Windows 8.1\",\n \"Windows 10\",\n \"Windows 11\"\n ]\n}, Me = {\n id: \"macos-versions\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"Cheetah\",\n \"Puma\",\n \"Jaguar\",\n \"Panther\",\n \"Tiger\",\n \"Leopard\",\n \"Snow Leopard\",\n \"Lion\",\n \"Mountain Lion\",\n \"Mavericks\",\n \"Yosemite\",\n \"El Capitan\",\n \"Sierra\",\n \"High Sierra\",\n \"Mojave\",\n \"Catalina\",\n \"Big Sur\",\n \"Monterey\",\n \"Ventura\",\n \"Sonoma\",\n \"Sequoia\",\n \"Tahoe\"\n ]\n}, Ae = {\n id: \"debian-codenames\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"buzz\",\n \"rex\",\n \"bo\",\n \"hamm\",\n \"slink\",\n \"potato\",\n \"woody\",\n \"sarge\",\n \"etch\",\n \"lenny\",\n \"squeeze\",\n \"wheezy\",\n \"jessie\",\n \"stretch\",\n \"buster\",\n \"bullseye\",\n \"bookworm\",\n \"trixie\"\n ]\n}, ve = [\n J,\n R,\n D,\n K,\n $,\n z,\n B,\n G,\n H,\n U,\n Y,\n q,\n X,\n Q,\n Z,\n _,\n ee,\n te,\n ne,\n se,\n re,\n ie,\n ae,\n oe,\n le,\n ue,\n ce,\n de,\n fe,\n me,\n he,\n ge,\n pe,\n ye,\n Se,\n xe,\n be,\n ke,\n Ne,\n Ie,\n we,\n Te,\n Me,\n Ae\n], N = (e) => {\n const n = e % 100;\n if (n >= 11 && n <= 13) return \"th\";\n const t = e % 10;\n return t === 1 ? \"st\" : t === 2 ? \"nd\" : t === 3 ? \"rd\" : \"th\";\n}, b = (e) => {\n const n = /^(\\d+)(st|nd|rd|th)$/.exec(e);\n if (!n) return null;\n const t = Number(n[1]);\n if (!Number.isFinite(t) || t <= 0) return null;\n const s = n[2];\n return N(t) !== s ? null : t;\n}, Le = {\n id: \"ordinal-en\",\n langs: [\"en\"],\n match(e) {\n if (e.length < 2) return null;\n const n = e.map((r) => b(r));\n if (n.some((r) => r === null)) return null;\n const t = n, s = t[1] - t[0];\n for (let r = 2; r < t.length; r += 1)\n if (t[r] - t[r - 1] !== s) return null;\n return { score: 80, step: s };\n },\n createIterator(e, n) {\n let s = b(e[e.length - 1] ?? \"\") ?? 0;\n return {\n next() {\n return s += n.step, s <= 0 || !Number.isFinite(s) ? { value: void 0, done: !0 } : { value: `${s}${N(s)}`, done: !1 };\n }\n };\n }\n}, Ee = (e) => {\n for (const n of ve)\n e.register(n);\n}, Ce = (e) => {\n e.registerMatch(Le);\n}, We = (e) => {\n const n = e ?? [\"en\", \"ja\"], t = new V({ langs: n });\n return Ee(t), Ce(t), t;\n}, Fe = (e) => {\n let n = 0;\n return {\n next() {\n if (e.length === 0)\n return { value: void 0, done: !0 };\n const t = e[n % e.length];\n return n += 1, { value: t, done: !1 };\n }\n };\n};\nclass f {\n constructor(...n) {\n const t = n;\n this.seed = t, this.kind = t.length === 1 ? \"copy\" : \"seed-repeat\", this.iterator = Fe(t);\n }\n static fromSeed(n, t, s) {\n const r = new f(...n);\n return r.kind = t, r.iterator = s, r;\n }\n next() {\n return this.iterator.next();\n }\n [Symbol.iterator]() {\n return this;\n }\n}\nconst I = 1e-9, Oe = 100, Pe = (e) => ({\n next() {\n return { value: e, done: !1 };\n }\n}), k = (e) => {\n let n = 0;\n return {\n next() {\n if (e.length === 0)\n return { value: void 0, done: !0 };\n const t = e[n % e.length];\n return n += 1, { value: t, done: !1 };\n }\n };\n}, Ve = (e, n) => {\n let t = 0;\n return {\n next() {\n return t += 1, { value: e + n * t, done: !1 };\n }\n };\n}, Je = (e, n) => {\n let t = 0;\n return {\n next() {\n return t += 1, { value: new Date(e.getTime() + n * t), done: !1 };\n }\n };\n}, Re = (e, n) => {\n let t = 0;\n return {\n next() {\n return t += 1, { value: e * n ** t, done: !1 };\n }\n };\n}, De = (e, n) => {\n if (e.kind === \"matcher\")\n return e.matcher.createIterator(n, { step: e.step, state: e.state });\n const { list: t, startIndex: s, step: r } = e, o = t.items.length;\n let i = s;\n return {\n next() {\n if (t.mode === \"finite\") {\n const a = i + r;\n return a >= o ? { value: void 0, done: !0 } : (i = a, { value: t.items[i], done: !1 });\n }\n return i = (i + r) % o, { value: t.items[i], done: !1 };\n }\n };\n}, Ke = (e) => e.every((n) => typeof n == \"number\" && Number.isFinite(n)), $e = (e) => e.every((n) => n instanceof Date && !Number.isNaN(n.getTime())), ze = (e) => e.every((n) => typeof n == \"string\"), Be = (e) => {\n const n = /^(.*?)(-?\\d+)([^0-9]*)$/.exec(e);\n if (!n)\n return null;\n const t = n[1] ?? \"\", s = n[2] ?? \"\", r = n[3] ?? \"\", o = Number(s);\n if (!Number.isFinite(o))\n return null;\n const i = s.replace(\"-\", \"\").length;\n return { prefix: t, num: o, width: i, suffix: r };\n}, Ge = (e, n, t) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = n + t * s, o = r < 0 ? \"-\" : \"\", i = Math.abs(r).toString().padStart(e.width, \"0\");\n return { value: `${e.prefix}${o}${i}${e.suffix}`, done: !1 };\n }\n };\n}, w = [\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], y = (e) => {\n if (e < 1 || e > Oe)\n return null;\n let n = e, t = \"\";\n for (const [s, r] of w)\n for (; n >= r; )\n t += s, n -= r;\n return t;\n}, T = (e) => {\n if (e.length === 0 || e !== e.toUpperCase())\n return null;\n let n = e, t = 0;\n for (const [r, o] of w)\n for (; n.startsWith(r); )\n t += o, n = n.slice(r.length);\n if (n.length > 0)\n return null;\n const s = y(t);\n return !s || s !== e ? null : t;\n}, He = (e, n) => {\n let t = 0;\n return {\n next() {\n t += 1;\n const s = e + n * t, r = y(s);\n return r ? { value: r, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, Ue = (e) => new RegExp(\"\\\\p{White_Space}\", \"u\").test(e) ? \"space\" : new RegExp(\"\\\\p{P}\", \"u\").test(e) ? \"punct\" : new RegExp(\"\\\\p{S}\", \"u\").test(e) ? \"symbol\" : new RegExp(\"\\\\p{Script=Latin}\", \"u\").test(e) ? \"latin\" : new RegExp(\"\\\\p{Script=Han}\", \"u\").test(e) ? \"han\" : new RegExp(\"\\\\p{Script=Hiragana}\", \"u\").test(e) ? \"hiragana\" : new RegExp(\"\\\\p{Script=Katakana}\", \"u\").test(e) ? \"katakana\" : new RegExp(\"\\\\p{N}\", \"u\").test(e) ? \"number\" : \"other\", Ye = (e) => {\n const n = [];\n let t = \"\", s = null;\n for (const r of e) {\n const o = Ue(r);\n if (s === o) {\n t += r;\n continue;\n }\n s !== null && n.push({ value: t, group: s }), t = r, s = o;\n }\n return s !== null && n.push({ value: t, group: s }), n;\n}, qe = (e) => {\n const n = Ye(e), t = n.map((a, u) => ({ index: u, num: T(a.value) })).filter((a) => a.num !== null);\n if (t.length !== 1)\n return null;\n const s = t[0].index, r = t[0].num, o = n.slice(0, s).map((a) => a.value).join(\"\"), i = n.slice(s + 1).map((a) => a.value).join(\"\");\n return { prefix: o, num: r, suffix: i };\n}, Xe = (e, n, t) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = n + t * s, o = y(r);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, g = {\n 一: 1,\n 二: 2,\n 三: 3,\n 四: 4,\n 五: 5,\n 六: 6,\n 七: 7,\n 八: 8,\n 九: 9\n}, p = {\n 壱: 1,\n 弐: 2,\n 参: 3,\n 肆: 4,\n 伍: 5,\n 陸: 6,\n 柒: 7,\n 捌: 8,\n 玖: 9\n}, M = {\n 十: 10,\n 拾: 10,\n 百: 100,\n 佰: 100,\n 千: 1e3,\n 仟: 1e3\n}, A = {\n 万: 1e4,\n 萬: 1e4\n}, Qe = /* @__PURE__ */ new Set([\n ...Object.keys(g),\n ...Object.keys(p),\n ...Object.keys(M),\n ...Object.keys(A)\n]), Ze = (e) => Qe.has(e), _e = (e) => /[壱弐参肆伍陸柒捌玖拾萬佰仟]/.test(e) ? \"traditional\" : \"modern\", v = (e) => {\n if (!e)\n return null;\n const n = _e(e);\n if (e.includes(\"万\") || e.includes(\"萬\")) {\n const a = /^([一二三四五六七八九壱弐参肆伍陸柒捌玖])?(万|萬)$/.exec(e);\n if (!a)\n return null;\n const u = a[1];\n return u ? (g[u] ?? p[u]) !== 1 ? null : { num: 1e4, style: n } : { num: 1e4, style: n };\n }\n let s = 0, r = 0, o = Number.POSITIVE_INFINITY, i = !1;\n for (const a of e) {\n const u = g[a] ?? p[a];\n if (u) {\n if (i)\n return null;\n r = u, i = !0;\n continue;\n }\n const l = M[a];\n if (l) {\n if (l >= o)\n return null;\n r === 0 && (r = 1), s += r * l, r = 0, o = l, i = !1;\n continue;\n }\n return A[a], null;\n }\n return s += r, s <= 0 || s > 1e4 ? null : { num: s, style: n };\n}, et = (e) => {\n const n = [];\n let t = \"\", s = 0, r = 0;\n for (const l of e)\n Ze(l) ? (t || (s = r), t += l) : t && (n.push({ start: s, end: r, text: t }), t = \"\"), r += l.length;\n t && n.push({ start: s, end: r, text: t });\n const o = n.map((l) => ({ run: l, parsed: v(l.text) })).filter((l) => l.parsed !== null);\n if (o.length !== 1)\n return null;\n const i = o[0], a = e.slice(0, i.run.start), u = e.slice(i.run.end);\n return {\n prefix: a,\n num: i.parsed.num,\n suffix: u,\n style: i.parsed.style\n };\n}, L = (e, n) => {\n if (!Number.isFinite(e) || e <= 0 || e > 1e4)\n return null;\n const t = n === \"traditional\" ? [\"\", \"壱\", \"弐\", \"参\", \"肆\", \"伍\", \"陸\", \"柒\", \"捌\", \"玖\"] : [\"\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"七\", \"八\", \"九\"], s = n === \"traditional\" ? \"拾\" : \"十\", r = n === \"traditional\" ? \"萬\" : \"万\";\n if (e === 1e4)\n return `${t[1]}${r}`;\n let o = e, i = \"\";\n const a = Math.floor(o / 1e3);\n a > 0 && (a > 1 && (i += t[a]), i += \"千\", o %= 1e3);\n const u = Math.floor(o / 100);\n u > 0 && (u > 1 && (i += t[u]), i += \"百\", o %= 100);\n const l = Math.floor(o / 10);\n return l > 0 && (l > 1 && (i += t[l]), i += s, o %= 10), o > 0 && (i += t[o]), i || null;\n}, tt = (e, n, t) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = e + n * s, o = L(r, t);\n return o ? { value: o, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, nt = (e, n, t) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = n + t * s, o = L(r, e.style);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, m = (e) => {\n if (e.length < 2)\n return null;\n const n = e[1] - e[0];\n for (let t = 2; t < e.length; t += 1)\n if (Math.abs(e[t] - e[t - 1] - n) > I)\n return null;\n return n;\n}, st = (e) => {\n if (e.length < 2 || e[0] === 0)\n return null;\n const n = e[1] / e[0];\n for (let t = 2; t < e.length; t += 1)\n if (e[t - 1] === 0 || Math.abs(e[t] / e[t - 1] - n) > I)\n return null;\n return n;\n}, rt = (e) => {\n const n = e.map((i) => Be(i));\n if (n.every(Boolean)) {\n const i = n[0], a = n[n.length - 1];\n if (n.every(\n (l) => l?.prefix === i.prefix && l?.suffix === i.suffix\n )) {\n const l = n.map((d) => d?.num ?? 0), c = m(l);\n if (c !== null)\n return {\n kind: \"arithmetic\",\n iterator: Ge(\n { prefix: a.prefix, suffix: a.suffix, width: a.width },\n a.num,\n c\n )\n };\n }\n }\n const t = e.map((i) => T(i));\n if (t.every((i) => i !== null)) {\n const i = t, a = m(i);\n if (a !== null) {\n const u = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: He(u, a)\n };\n }\n }\n const s = e.map((i) => v(i));\n if (s.every((i) => i !== null)) {\n const i = s, a = i[0].style;\n if (i.every((u) => u.style === a)) {\n const u = i.map((c) => c.num), l = m(u);\n if (l !== null) {\n const c = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: tt(c.num, l, c.style)\n };\n }\n }\n }\n const r = e.map((i) => qe(i));\n if (r.every((i) => i !== null)) {\n const i = r, a = i[0];\n if (i.every(\n (l) => l.prefix === a.prefix && l.suffix === a.suffix\n )) {\n const l = i.map((d) => d.num), c = m(l);\n if (c !== null) {\n const d = l[l.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: Xe(\n { prefix: a.prefix, suffix: a.suffix },\n d,\n c\n )\n };\n }\n }\n }\n const o = e.map((i) => et(i));\n if (o.every((i) => i !== null)) {\n const i = o, a = i[0];\n if (i.every(\n (l) => l.prefix === a.prefix && l.suffix === a.suffix && l.style === a.style\n )) {\n const l = i.map((d) => d.num), c = m(l);\n if (c !== null) {\n const d = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: nt(\n { prefix: a.prefix, suffix: a.suffix, style: a.style },\n d.num,\n c\n )\n };\n }\n }\n }\n return null;\n}, it = (e, n) => {\n const t = n.match(e);\n return t ? {\n kind: \"list\",\n iterator: De(t, e)\n } : null;\n};\nfunction at(e, n) {\n const t = n?.registry ?? We();\n if (e.length === 0)\n return f.fromSeed(e, \"seed-repeat\", k(e));\n if (e.length === 1)\n return f.fromSeed(e, \"copy\", Pe(e[0]));\n if (ze(e)) {\n const s = it(e, t);\n if (s)\n return f.fromSeed(e, s.kind, s.iterator);\n const r = rt(e);\n if (r)\n return f.fromSeed(e, r.kind, r.iterator);\n }\n if (Ke(e)) {\n const s = m(e);\n if (s !== null)\n return f.fromSeed(\n e,\n \"arithmetic\",\n Ve(e[e.length - 1], s)\n );\n const r = st(e);\n if (r !== null)\n return f.fromSeed(\n e,\n \"geometric\",\n Re(e[e.length - 1], r)\n );\n }\n if ($e(e)) {\n const s = e.map((o) => o.getTime()), r = m(s);\n if (r !== null)\n return f.fromSeed(\n e,\n \"arithmetic\",\n Je(e[e.length - 1], r)\n );\n }\n return f.fromSeed(e, \"seed-repeat\", k(e));\n}\nexport {\n f as Sequence,\n V as SequenceRegistry,\n We as createBuiltInRegistry,\n at as inferSequence,\n Ee as registerBuiltInLists,\n Ce 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 readonly: fmt?.readonly,\n disabled: fmt?.disabled,\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 readonly: override.readonly ?? base.readonly,\n disabled: override.disabled ?? base.disabled,\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 { ButtonActionValue, ButtonValue, LinkValue } from \"./types\";\n\nexport type LinkActionValue = { label: string; href: string; target?: string };\n\nexport function resolveButtonAction(value: unknown): ButtonActionValue | null {\n if (typeof value === \"string\") return { label: value };\n if (!value || typeof value !== \"object\") return null;\n const obj = value as Record<string, unknown>;\n const label = obj.label;\n const command = obj.command;\n const commandfor = obj.commandfor;\n if (typeof label !== \"string\") return null;\n if (typeof command === \"string\" && typeof commandfor === \"string\") {\n return { label, command, commandfor };\n }\n return null;\n}\n\nexport function getButtonLabel(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (!value || typeof value !== \"object\") return \"\";\n const label = (value as Record<string, unknown>).label;\n return typeof label === \"string\" ? label : \"\";\n}\n\nexport function resolveLinkAction(value: unknown): LinkActionValue | null {\n if (typeof value === \"string\") return { label: value, href: value };\n if (!value || typeof value !== \"object\") return null;\n const obj = value as Record<string, unknown>;\n const label = obj.label;\n const href = obj.href;\n const target = obj.target;\n if (typeof label !== \"string\" || typeof href !== \"string\") return null;\n if (typeof target === \"string\") return { label, href, target };\n if (target === undefined) return { label, href };\n return null;\n}\n\nexport function getLinkLabel(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (!value || typeof value !== \"object\") return \"\";\n const obj = value as Record<string, unknown>;\n const label = obj.label;\n const href = obj.href;\n if (typeof label === \"string\") return label;\n if (typeof href === \"string\") return href;\n return \"\";\n}\n","import type { DataModel } from \"./dataModel\";\nimport type {\n InternalRow,\n Schema,\n ColumnSchema,\n NumberFormat,\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\";\nimport { getButtonLabel, getLinkLabel, resolveButtonAction, resolveLinkAction } from \"./actionValue\";\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 hitTestAction?(\n event: MouseEvent,\n ): { rowId: string; colKey: string; kind: \"button\" | \"link\" } | 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 hitTestAction(event: MouseEvent) {\n const target = event.target as HTMLElement | null;\n if (!target) return null;\n const actionEl = target.closest<HTMLElement>(\"[data-extable-action]\");\n if (!actionEl) return null;\n const cell = actionEl.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n const kind = actionEl.dataset.extableAction as \"button\" | \"link\" | undefined;\n if (kind !== \"button\" && kind !== \"link\") return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n kind,\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 const hasTextColor = Boolean(\n cellStyle?.textColor || condRes.delta?.textColor || col.style?.textColor,\n );\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 const interaction = this.dataModel.getCellInteraction(row.id, col.key);\n const isActionType = col.type === \"button\" || col.type === \"link\";\n const actionValue = isActionType\n ? col.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value)\n : null;\n const actionLabel = isActionType\n ? col.type === \"button\"\n ? getButtonLabel(valueRes.value)\n : getLinkLabel(valueRes.value)\n : \"\";\n if (isActionType && !textOverride && actionValue && actionLabel) {\n const actionEl =\n col.type === \"button\" ? document.createElement(\"button\") : document.createElement(\"span\");\n if (actionEl instanceof HTMLButtonElement) actionEl.type = \"button\";\n actionEl.className =\n col.type === \"button\" ? \"extable-action-button\" : \"extable-action-link\";\n if (interaction.disabled) actionEl.classList.add(\"extable-action-disabled\");\n if (col.type === \"link\" && hasTextColor) actionEl.style.color = \"inherit\";\n actionEl.dataset.extableAction = col.type;\n actionEl.textContent = actionLabel;\n td.replaceChildren(actionEl);\n } else {\n td.textContent = actionLabel || formatted.text;\n if (formatted.color) td.style.color = formatted.color;\n }\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 (interaction.readonly) td.classList.add(\"extable-readonly\");\n else td.classList.add(\"extable-editable\");\n if (interaction.muted) td.classList.add(\"extable-readonly-muted\");\n if (interaction.disabled) td.classList.add(\"extable-disabled\");\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 === \"button\") {\n const label = getButtonLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"link\") {\n const label = getLinkLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"boolean\") {\n if (col.format === \"checkbox\" || !col.format) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.format) && col.format.length >= 2) {\n return { text: value ? String(col.format[0]) : String(col.format[1]) };\n }\n return { text: value ? String(col.format) : \"\" };\n }\n if (col.type === \"number\" && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as NumberFormat | undefined;\n const opts: Intl.NumberFormatOptions = {};\n if (fmt?.scale !== undefined) {\n opts.minimumFractionDigits = fmt.scale;\n opts.maximumFractionDigits = fmt.scale;\n }\n opts.useGrouping = Boolean(fmt?.thousandSeparator);\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.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 fmtValue = col.format as string | undefined;\n const fmt =\n col.type === \"date\"\n ? coerceDatePattern(fmtValue, \"date\")\n : col.type === \"time\"\n ? coerceDatePattern(fmtValue, \"time\")\n : coerceDatePattern(fmtValue, \"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 interaction = this.dataModel.getCellInteraction(row.id, c.key);\n const muted = interaction.muted;\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 = muted ? \"#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 isActionType = c.type === \"button\" || c.type === \"link\";\n const actionValue = isActionType\n ? c.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value)\n : null;\n const actionLabel = isActionType\n ? actionValue?.label ??\n (c.type === \"button\" ? getButtonLabel(valueRes.value) : getLinkLabel(valueRes.value))\n : \"\";\n const renderAction = Boolean(isActionType && actionValue && actionLabel && !textOverride);\n const text = actionLabel || 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 const actionColor =\n renderAction && c.type === \"link\" && !muted && !mergedStyle.textColor\n ? \"#2563eb\"\n : undefined;\n ctx.fillStyle = this.dataModel.hasPending(row.id, c.key)\n ? \"#b91c1c\"\n : formatted.color\n ? formatted.color\n : muted\n ? \"#94a3b8\"\n : (actionColor ?? mergedStyle.textColor ?? \"#0f172a\");\n const wrap = view.wrapText?.[c.key] ?? c.wrapText ?? false;\n const isBoolean = c.type === \"boolean\" && (!c.format || c.format === \"checkbox\");\n const isCustomBoolean = c.type === \"boolean\" && Boolean(c.format && c.format !== \"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 const textAreaX = x + 8;\n const textAreaY = yCursor + 2;\n const textAreaW = Math.max(0, w - 12);\n const textAreaH = Math.max(0, rowH - 8);\n const decorations = {\n underline: Boolean(mergedStyle.underline) || (renderAction && c.type === \"link\"),\n strike: Boolean(mergedStyle.strike),\n };\n const actionBounds =\n renderAction && !isBoolean\n ? this.measureTextBounds(\n ctx,\n text,\n textAreaX,\n textAreaY,\n textAreaW,\n textAreaH,\n wrap,\n align,\n )\n : null;\n if (renderAction && c.type === \"button\" && actionBounds) {\n const padX = 6;\n const padY = 4;\n const left = Math.max(textAreaX, actionBounds.x - padX);\n const top = Math.max(textAreaY, actionBounds.y - padY);\n const right = Math.min(textAreaX + textAreaW, actionBounds.x + actionBounds.width + padX);\n const bottom = Math.min(textAreaY + textAreaH, actionBounds.y + actionBounds.height + padY);\n const bw = Math.max(0, right - left);\n const bh = Math.max(0, bottom - top);\n ctx.save();\n ctx.fillStyle = muted ? \"#f3f4f6\" : \"#f8fafc\";\n ctx.strokeStyle = muted ? \"#e2e8f0\" : \"#cbd5e1\";\n ctx.lineWidth = 1;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\") {\n ctx.roundRect(left, top, bw, bh, 6);\n } else {\n ctx.rect(left, top, bw, bh);\n }\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n }\n this.drawCellText(\n ctx,\n text,\n textAreaX,\n textAreaY,\n textAreaW,\n textAreaH,\n wrap,\n align,\n isBoolean,\n isCustomBoolean,\n decorations,\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 hitTestAction(event: MouseEvent) {\n if (!this.root || !this.canvas) return null;\n const hit = this.hitTest(event);\n if (!hit || !hit.rowId || !hit.colKey) return null;\n if (hit.rowId === \"__all__\" || hit.rowId === \"__header__\") return null;\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(hit.colKey));\n if (!col || (col.type !== \"button\" && col.type !== \"link\")) return null;\n const valueRes = this.dataModel.resolveCellValue(hit.rowId, col);\n const condRes = this.dataModel.resolveConditionalStyle(hit.rowId, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n if (textOverride) return null;\n const actionValue =\n col.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value);\n if (!actionValue || !actionValue.label) return null;\n\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return null;\n const baseStyle = columnFormatToStyle(col);\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const cellStyle = this.dataModel.getCellStyle(hit.rowId, col.key);\n const mergedStyle = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const weight = mergedStyle.bold ? \"600 \" : \"\";\n const ital = mergedStyle.italic ? \"italic \" : \"\";\n ctx.save();\n ctx.font = `${ital}${weight}14px sans-serif`.trim() || \"14px sans-serif\";\n ctx.textBaseline = \"alphabetic\";\n const view = this.dataModel.getView();\n const wrap = view.wrapText?.[col.key] ?? col.wrapText ?? false;\n const align = col.style?.align ?? \"left\";\n const textAreaX = hit.rect.left + 8;\n const textAreaY = hit.rect.top + 2;\n const textAreaW = Math.max(0, hit.rect.width - 12);\n const textAreaH = Math.max(0, hit.rect.height - 8);\n const bounds = this.measureTextBounds(\n ctx,\n actionValue.label,\n textAreaX,\n textAreaY,\n textAreaW,\n textAreaH,\n wrap,\n align,\n );\n ctx.restore();\n if (!bounds) return null;\n const pad = col.type === \"button\" ? 6 : 2;\n const left = Math.max(hit.rect.left, bounds.x - pad);\n const top = Math.max(hit.rect.top, bounds.y - pad);\n const right = Math.min(hit.rect.right, bounds.x + bounds.width + pad);\n const bottom = Math.min(hit.rect.bottom, bounds.y + bounds.height + pad);\n if (\n event.clientX >= left &&\n event.clientX <= right &&\n event.clientY >= top &&\n event.clientY <= bottom\n ) {\n return { rowId: hit.rowId, colKey: String(hit.colKey), kind: col.type };\n }\n return null;\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 const actionHit = this.hitTestAction(new MouseEvent(\"mousemove\", { clientX, clientY }));\n if (actionHit) {\n const interaction = this.dataModel.getCellInteraction(actionHit.rowId, actionHit.colKey);\n if (!interaction.disabled) {\n this.canvas.style.cursor = \"pointer\";\n return;\n }\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 interaction = this.dataModel.getCellInteraction(hit.rowId, hit.colKey);\n if (interaction.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 fitTextLine(ctx: CanvasRenderingContext2D, text: string, width: number) {\n let out = text;\n while (ctx.measureText(out).width > width && out.length > 1) {\n out = `${out.slice(0, -2)}…`;\n }\n return out;\n }\n\n private getTextLinesForBounds(\n ctx: CanvasRenderingContext2D,\n text: string,\n width: number,\n wrap: boolean,\n height: number,\n ) {\n const raw = wrap ? this.wrapLines(ctx, text, width) : [this.fitTextLine(ctx, text, width)];\n const maxLines = Math.max(1, Math.floor(height / this.lineHeight));\n return raw.slice(0, maxLines);\n }\n\n private measureTextBounds(\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\",\n ): DOMRect | null {\n const lines = this.getTextLinesForBounds(ctx, text, width, wrap, height);\n if (!lines.length) return null;\n let minX = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (let idx = 0; idx < lines.length; idx += 1) {\n const line = lines[idx] ?? \"\";\n const lineWidth = ctx.measureText(line).width;\n let startX = x;\n if (align === \"right\") startX = x + width - lineWidth;\n else if (align === \"center\") startX = x + (width - lineWidth) / 2;\n const lineTop = y + this.lineHeight * idx;\n const lineBottom = lineTop + this.lineHeight;\n minX = Math.min(minX, startX);\n maxX = Math.max(maxX, startX + lineWidth);\n minY = Math.min(minY, lineTop);\n maxY = Math.max(maxY, lineBottom);\n }\n if (!Number.isFinite(minX) || !Number.isFinite(minY)) return null;\n return new DOMRect(minX, minY, maxX - minX, maxY - minY);\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 renderLine(this.fitTextLine(ctx, text, width), 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 === \"button\") {\n const label = getButtonLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"link\") {\n const label = getLinkLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"boolean\") {\n if (col.format === \"checkbox\" || !col.format) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.format) && col.format.length >= 2) {\n return { text: value ? String(col.format[0]) : String(col.format[1]) };\n }\n return { text: value ? String(col.format) : \"\" };\n }\n if (col.type === \"number\" && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as NumberFormat | undefined;\n const opts: Intl.NumberFormatOptions = {};\n if (fmt?.scale !== undefined) {\n opts.minimumFractionDigits = fmt.scale;\n opts.maximumFractionDigits = fmt.scale;\n }\n opts.useGrouping = Boolean(fmt?.thousandSeparator);\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.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 fmtValue = col.format as string | undefined;\n const fmt =\n col.type === \"date\"\n ? (fmtValue ?? \"yyyy-MM-dd\")\n : col.type === \"time\"\n ? (fmtValue ?? \"HH:mm\")\n : (fmtValue ?? \"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 { CellAction, 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\";\nimport { resolveButtonAction, resolveLinkAction } from \"./actionValue\";\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 ActionHitTest = (\n event: MouseEvent,\n) => { rowId: string; colKey: string; kind: \"button\" | \"link\" } | 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;\ntype ActionHandler = (action: CellAction) => 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 hitAction: ActionHitTest | null = null;\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 private onCellAction: ActionHandler;\n\n constructor(\n root: HTMLElement,\n editMode: EditMode,\n onEdit: EditHandler,\n onRowSelect: RowSelectHandler,\n onMove: MoveHandler,\n hitTest: HitTest,\n hitAction: ActionHitTest | null,\n private dataModel: DataModel,\n sequenceLangs: readonly string[] | undefined,\n isCellReadonly: (rowId: string, colKey: string) => boolean,\n onCellAction: ActionHandler,\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.hitAction = hitAction;\n this.sequenceLangs = sequenceLangs;\n this.isCellReadonly = isCellReadonly;\n this.onCellAction = onCellAction;\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 === \"button\" || col?.type === \"link\") {\n ev.preventDefault();\n this.triggerCellAction(this.activeCell.rowId, this.activeCell.colKey, col.type);\n this.selectionAnchor = null;\n return;\n }\n if (col?.type === \"boolean\") {\n ev.preventDefault();\n this.toggleBoolean(this.activeCell.rowId, this.activeCell.colKey);\n this.selectionAnchor = null;\n return;\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 const linkAction = resolveLinkAction(value);\n if (linkAction?.href) return linkAction.href;\n const buttonAction = resolveButtonAction(value);\n if (buttonAction?.label) return buttonAction.label;\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(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\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 actionHit = this.hitAction ? this.hitAction(ev) : null;\n if (actionHit) {\n const triggered = this.triggerCellAction(actionHit.rowId, actionHit.colKey, actionHit.kind);\n if (triggered) {\n ev.preventDefault();\n return;\n }\n }\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 triggerCellAction(rowId: string, colKey: string, kind: \"button\" | \"link\") {\n const col = this.findColumn(colKey);\n if (!col) return false;\n if (col.type !== kind) return false;\n const interaction = this.dataModel.getCellInteraction(rowId, colKey);\n if (interaction.disabled) return false;\n const valueRes = this.dataModel.resolveCellValue(rowId, col);\n const condRes = this.dataModel.resolveConditionalStyle(rowId, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n if (textOverride) return false;\n if (col.type === \"button\") {\n const actionValue = resolveButtonAction(valueRes.value);\n if (!actionValue) return false;\n this.onCellAction({ kind: \"button\", rowId, colKey, value: actionValue });\n return true;\n }\n if (col.type === \"link\") {\n const linkValue = resolveLinkAction(valueRes.value);\n if (!linkValue?.href) return false;\n this.openLink(linkValue.href, linkValue.target);\n return true;\n }\n return false;\n }\n\n private openLink(href: string, target?: string) {\n if (typeof document === \"undefined\") return;\n if (!href) return;\n const link = document.createElement(\"a\");\n link.href = href;\n link.target = target ?? \"_self\";\n link.rel = \"noopener noreferrer\";\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n link.remove();\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 ButtonValue = string | { label: string; command: string; commandfor: string };\nexport type LinkValue = string | { label: string; href: string; target?: string };\n\nexport type CellValue =\n | CellPrimitive\n | Date\n | { kind: \"enum\"; value: string }\n | { kind: \"tags\"; values: string[] }\n | ButtonValue\n | LinkValue;\n\nexport type ColumnType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"datetime\"\n | \"date\"\n | \"time\"\n | \"enum\"\n | \"tags\"\n | \"button\"\n | \"link\";\n\nexport type StringFormat = {\n maxLength?: number;\n regex?: string;\n};\n\nexport type NumberFormat = {\n precision?: number;\n scale?: number;\n signed?: boolean;\n thousandSeparator?: boolean;\n negativeRed?: boolean;\n format?: string; // optional custom formatter token\n};\n\nexport type BooleanFormat = \"checkbox\" | string | [string, string];\nexport type DateFormat = string;\nexport type TimeFormat = string;\nexport type DateTimeFormat = string;\n\nexport type ColumnFormat<TType extends ColumnType> = TType extends \"string\"\n ? StringFormat\n : TType extends \"number\"\n ? NumberFormat\n : TType extends \"boolean\"\n ? BooleanFormat\n : TType extends \"date\"\n ? DateFormat\n : TType extends \"time\"\n ? TimeFormat\n : TType extends \"datetime\"\n ? DateTimeFormat\n : never;\n\nexport type ResolvedCellStyle = {\n backgroundColor?: string;\n textColor?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n readonly?: boolean;\n disabled?: 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 format?: ColumnFormat<TType>;\n enum?: { options: string[]; allowCustom?: boolean };\n tags?: { options: string[]; allowCustom?: boolean };\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 readonly?: boolean;\n disabled?: 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 type CommitChanges = {\n commands: Command[];\n user?: UserInfo;\n};\n\nexport type CommitHandler = (changes: CommitChanges) => Promise<void>;\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 defaultClass?: string | string[];\n defaultStyle?: Partial<CSSStyleDeclaration>;\n server?: ServerAdapter;\n user?: UserInfo;\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 ButtonActionValue =\n | { label: string; command?: undefined; commandfor?: undefined }\n | { label: string; command: string; commandfor: string };\n\nexport type CellAction = {\n kind: \"button\";\n rowId: string;\n colKey: string;\n value: ButtonActionValue;\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 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 action?: CellAction | 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 | \"action\"\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 { LockManager } from \"./lockManager\";\nimport { CanvasRenderer, HTMLRenderer, type Renderer, type ViewportState } from \"./renderers\";\nimport { SelectionManager } from \"./selectionManager\";\nimport { resolveCellStyles } from \"./styleResolver\";\nimport { getButtonLabel, getLinkLabel } from \"./actionValue\";\nimport { removeFromParent, toArray } from \"./utils\";\nimport type {\n CellAction,\n CellTarget,\n Command,\n CommitHandler,\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\";\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 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 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 lastAction: CellAction | 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 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.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);\n if (!this.dataLoaded) {\n this.root.dataset.extable = \"loading\";\n this.bindViewport();\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.renderer.hitTestAction ? (ev) => this.renderer.hitTestAction!(ev) : null,\n this.dataModel,\n this.sequenceLangs,\n (rowId, colKey) => this.isCellReadonly(rowId, colKey),\n (action) => this.emitAction(action),\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.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.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) {\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 (col.type === \"button\") {\n const label = getButtonLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (col.type === \"link\") {\n const label = getLinkLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\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 async commit(handler: CommitHandler): Promise<RowStateSnapshot<T, R>[]>;\n async commit(handler?: CommitHandler): Promise<RowStateSnapshot<T, R>[]> {\n const pending = this.commandQueue.listApplied();\n if (!pending.length) return [];\n if (handler) {\n try {\n await handler({ commands: pending, user: this.user });\n this.clearCommitErrors();\n } catch (e) {\n this.recordCommitError(e);\n throw e;\n }\n return this.finalizeCommit(pending);\n }\n const snapshots = this.finalizeCommit(pending, () => this.sendCommit(pending));\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.clearCommitErrors();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"commit failed\", e);\n this.recordCommitError(e);\n }\n }\n }\n\n private clearCommitErrors() {\n this.activeErrors = this.activeErrors.filter((e) => e.scope !== \"commit\");\n this.emitTableState();\n }\n\n private recordCommitError(error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n this.activeErrors = [\n ...this.activeErrors.filter((x) => x.scope !== \"commit\"),\n { scope: \"commit\", message: msg },\n ];\n this.emitTableState();\n }\n\n private finalizeCommit(\n pending: Command[],\n afterApply?: () => Promise<void>,\n ): Promise<RowStateSnapshot<T, R>[]> {\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 const run = async () => {\n if (afterApply) await afterApply();\n await this.lockManager.unlockOnCommit(pending.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 return run();\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.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 // 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 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 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 (col?.type === \"button\") {\n const label = getButtonLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (col?.type === \"link\") {\n const label = getLinkLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\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 action: this.lastAction,\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 emitAction(action: CellAction) {\n this.lastAction = action;\n this.emitSelection(\"action\");\n this.lastAction = null;\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 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.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","fmt","allowCustom","options","DataModel","dataset","schema","view","listener","l","run","row","idx","rowId","index","slowIndex","r","slowRow","height","next","entries","changed","key","found","pendingRow","colType","colKey","c","baseReadonly","delta","cellStyle","readonlyFromStyle","disabledAllowed","disabled","readonly","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","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","LockManager","mode","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","C","n","t","W","F","O","P","V","o","u","E","S","J","R","D","K","$","z","B","G","H","U","Y","q","X","Q","Z","_","ee","te","ne","se","re","ie","ae","oe","le","ue","ce","de","fe","me","he","ge","pe","ye","Se","xe","be","ke","j","je","Ne","Ie","we","Te","Me","Ae","ve","N","Le","Ee","Ce","We","Fe","I","Oe","Pe","Ve","Je","Re","De","Ke","$e","ze","Be","Ge","w","y","T","He","Ue","Ye","qe","Xe","M","A","Qe","Ze","_e","et","L","tt","nt","m","st","rt","it","at","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","dec","mergeStyle","override","resolveCellStyles","columnStyle","conditional","resolved","styleToCssText","css","resolveButtonAction","commandfor","getButtonLabel","resolveLinkAction","href","target","getLinkLabel","getColumnSortDir","hasActiveColumnFilter","svgFunnel","svgArrow","drawDiagnosticCorner","ctx","color","ValueFormatCache","drawFunnelIcon","alpha","drawSortArrowIcon","FenwickTree","ft","count","index0","total","bit","acc","step","nextAcc","HTMLRenderer","root","_state","scrollContainer","prevTop","prevLeft","colWidths","colBaseStyles","colBaseCss","totalWidth","colgroup","rowCol","colEl","body","entry","event","corner","rowHeader","cell","actionEl","thead","tr","rowTh","th","sortDir","hasFilter","wrap","btn","td","isPending","condRes","hasTextColor","baseStyle","withCond","forCss","valueRes","textOverride","formatted","interaction","isActionType","actionValue","actionLabel","align","rawNumbered","rawStr","maxHeight","text","measure","measureHost","isAll","startRow","endRow","startCol","endCol","rowEl","cells","opts","fmtValue","_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","muted","mergedStyle","bg","renderAction","left","top","actionColor","isBoolean","isCustomBoolean","fontKey","weight","textAreaX","textAreaY","textAreaW","textAreaH","decorations","actionBounds","right","bottom","bw","bh","xHeader","isHover","iconBox","ix","iy","yTop","xLeft","existing","heights","idToIndex","measuredVersion","cachedHeight","wraps","widths","task","measured","start","headerHeight","accumHeight","topPx","rowTop","hit","ital","bounds","rootRect","maxW","maxH","side","tRect","clientX","clientY","prevKey","prevIcon","nextKey","nextIcon","cursor","sameCell","sameMessage","actionHit","handleRect","rawLines","lines","line","cut","firstKey","maxLines","minX","maxX","minY","maxY","lineWidth","startX","lineTop","lineBottom","fontBackup","renderLine","ln","lineIdx","baseline","endX","center","strokeBackup","lineWidthBackup","yUnderline","yStrike","CanvasRenderer","SelectionManager","onEdit","onRowSelect","onMove","hitTest","hitAction","sequenceLangs","isCellReadonly","onCellAction","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","currentText","maxRow","maxCol","activeRowIndex","activeColIndex","nextRanges","clamp","max","desiredColKey","fallbackRow","nextRow","nextRange","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","first","normalized","rowIdx","colIdx","linkAction","buttonAction","htmlRows","tableStyle","htmlCells","fromHtml","trimmed","table","trs","ta","select","opt","op","listId","datalist","lineHeight","wrapper","linkValue","link","isRow","targetRange","anchorRow","anchorCol","anchorCell","sorted","sameCols","sameRows","rowsTouch","colsTouch","initialValue","control","end","now","isTextarea","isAltEnter","commitAndMove","clearActive","defineSchema","ExtableCore","init","defaultData","initialData","classes","ua","shell","viewport","anyRO","force","host","action","_colKey","classNames","wasLoaded","rowIdOrIndex","pending","vv","position","insertAt","baseIdx","newId","cmds","toKinds","seen","kinds","labelFor","commandCount","toSteps","groups","handler","commands","error","afterApply","touched","snapshots","snap","pop","actions","act","hr","viewportWidth","targetIndex","effective","applied","pendingCommands","pendingCommandCount","pendingCellCount","validationErrors","diagnosticErrors","ar","br","bc","activeErrors","errorsEqual","bt","activeValueRes","activeCondRes","activeTextOverride","activeValueRaw","activeValueDisplay","activeValueType","activeStyles","reason","diagnostics","computed","unique","sr","er","sc","ec","aside","btnClose","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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AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA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"}