@extable/core 0.3.3 → 0.3.4

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/lockManager.ts","../src/cellValueCodec.ts","../src/geometry.ts","../../sequence/dist/index.js","../src/fillHandle.ts","../src/styleResolver.ts","../src/actionValue.ts","../src/numberIO.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 \"int\": {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) return \"Expected an integer\";\n return null;\n }\n case \"uint\": {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) {\n return \"Expected a non-negative integer\";\n }\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 isFormulaCol = Boolean(col.formula);\n const muted = disabled || (readonly && !disabledAllowed && !isFormulaCol);\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\" || col.type === \"int\" || col.type === \"uint\") && typeof value === \"number\") {\n return String(value);\n }\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 = 35;\nexport const ROW_HEADER_WIDTH_PX = 48;\nexport const DEFAULT_ROW_HEIGHT_PX = 35;\n\n// Shared visual metrics\n// Keep vertical insets compatible with DEFAULT_ROW_HEIGHT_PX (24px) and base line-height (16px).\nexport const CELL_PADDING_X_PX = 8;\nexport const CELL_PADDING_TOP_PX = 4;\nexport const CELL_PADDING_BOTTOM_PX = 4;\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 g = (e) => e.trim().normalize(\"NFKC\").toLowerCase().replace(/\\s+/g, \" \"), V = (e) => {\n const t = [];\n if (e)\n for (const n of e) {\n const s = n.trim();\n !s || t.includes(s) || t.push(s);\n }\n return t.length === 0 ? t.push(\"en\") : t.includes(\"en\") || t.push(\"en\"), t;\n}, J = (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 s = e.aliases[t];\n if (!s)\n return null;\n const r = e.items.indexOf(s);\n return r === -1 ? null : r;\n}, R = (e, t) => {\n const n = g(t);\n if (g(e.id).includes(n))\n return !0;\n for (const s of e.items)\n if (g(s).includes(n))\n return !0;\n return e.aliases ? Object.keys(e.aliases).some(\n (s) => g(s).includes(n)\n ) : !1;\n}, D = (e, t) => {\n if (e.langs.length === 0)\n return 0;\n let n = Number.POSITIVE_INFINITY;\n for (const s of e.langs) {\n const r = t.indexOf(s);\n r !== -1 && r < n && (n = r);\n }\n return n;\n}, K = (e, t) => !e.langs || e.langs.length === 0 ? !0 : e.langs.some((n) => t.includes(n));\nclass z {\n constructor(t) {\n this.lists = [], this.matchers = [], this.langs = V(t?.langs);\n }\n register(t) {\n const n = this.lists.findIndex((s) => s.id === t.id);\n n === -1 ? this.lists.push(t) : this.lists[n] = t;\n }\n registerMatch(t) {\n const n = this.matchers.findIndex((s) => s.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 r = new Set(t.enabledIds);\n n = n.filter((o) => r.has(o.id));\n }\n const s = t?.queryText;\n return s && (n = n.filter((r) => R(r, s))), n;\n }\n match(t, n) {\n if (t.length === 0)\n return null;\n let s = null, r = Number.NEGATIVE_INFINITY;\n const o = n?.enabledIds ? new Set(n.enabledIds) : null;\n for (const i of this.matchers) {\n if (o && !o.has(i.id) || !K(i, this.langs))\n continue;\n const a = i.match(t);\n if (!a)\n continue;\n const l = a.score;\n Number.isFinite(l) && l > r && (r = l, s = {\n kind: \"matcher\",\n matcher: i,\n step: a.step ?? 1,\n state: a.state\n });\n }\n const u = this.list(n).map((i) => ({ list: i, rank: D(i, this.langs) })).filter((i) => Number.isFinite(i.rank)).sort((i, a) => i.rank - a.rank);\n for (const { list: i, rank: a } of u) {\n const l = [];\n let c = !1;\n for (const P of t) {\n const k = J(i, P);\n if (k === null) {\n c = !0;\n break;\n }\n l.push(k);\n }\n if (c)\n continue;\n const f = this.inferStep(i, l);\n if (f === null)\n continue;\n const d = 10 - a;\n d > r && (r = d, s = {\n kind: \"list\",\n list: i,\n startIndex: l[l.length - 1] ?? 0,\n step: f\n });\n }\n return s;\n }\n inferStep(t, n) {\n if (n.length < 2)\n return 1;\n const s = t.items.length, r = this.stepBetween(t.mode, s, n[0], n[1]);\n if (r === null)\n return null;\n for (let o = 2; o < n.length; o += 1) {\n const u = this.nextIndex(t.mode, s, n[o - 1], r);\n if (u === null || u !== n[o])\n return null;\n }\n return r;\n }\n stepBetween(t, n, s, r) {\n if (t === \"cycle\")\n return (r - s + n) % n;\n const o = r - s;\n return o < 0 ? null : o;\n }\n nextIndex(t, n, s, r) {\n if (t === \"cycle\")\n return (s + r) % n;\n const o = s + r;\n return o >= n ? null : o;\n }\n}\nconst B = {\n id: \"weekdays-en-long\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"]\n}, G = {\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}, H = {\n id: \"weekdays-ja-long\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜日\", \"火曜日\", \"水曜日\", \"木曜日\", \"金曜日\", \"土曜日\", \"日曜日\"]\n}, U = {\n id: \"weekdays-ja-short\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜\", \"火曜\", \"水曜\", \"木曜\", \"金曜\", \"土曜\", \"日曜\"]\n}, Y = {\n id: \"weekdays-ja-single\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月\", \"火\", \"水\", \"木\", \"金\", \"土\", \"日\"]\n}, q = {\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}, X = {\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}, Q = {\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}, _ = {\n id: \"quarters-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"]\n}, ee = {\n id: \"quarters-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"第1四半期\", \"第2四半期\", \"第3四半期\", \"第4四半期\"]\n}, te = {\n id: \"zodiac-animals-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"子\", \"丑\", \"寅\", \"卯\", \"辰\", \"巳\", \"午\", \"未\", \"申\", \"酉\", \"戌\", \"亥\"]\n}, ne = {\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}, se = {\n id: \"zodiac-signs-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"牡羊座\", \"牡牛座\", \"双子座\", \"蟹座\", \"獅子座\", \"乙女座\", \"天秤座\", \"蠍座\", \"射手座\", \"山羊座\", \"水瓶座\", \"魚座\"],\n aliases: {\n さそり座: \"蠍座\"\n }\n}, re = {\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}, ie = {\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}, oe = {\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}, ae = {\n id: \"ampm-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"午前\", \"午後\"]\n}, ue = {\n id: \"seasons-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Spring\", \"Summer\", \"Autumn\", \"Winter\"],\n aliases: {\n Fall: \"Autumn\"\n }\n}, le = {\n id: \"seasons-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"春\", \"夏\", \"秋\", \"冬\"]\n}, ce = {\n id: \"solfege-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"ド\", \"レ\", \"ミ\", \"ファ\", \"ソ\", \"ラ\", \"シ\"]\n}, fe = {\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}, de = {\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}, me = {\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}, he = {\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}, ge = {\n id: \"rokuyo-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"先勝\", \"友引\", \"先負\", \"仏滅\", \"大安\", \"赤口\"]\n}, pe = {\n id: \"heavenly-stems-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"甲\", \"乙\", \"丙\", \"丁\", \"戊\", \"己\", \"庚\", \"辛\", \"壬\", \"癸\"]\n}, xe = {\n id: \"planets-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\"Mercury\", \"Venus\", \"Earth\", \"Mars\", \"Jupiter\", \"Saturn\", \"Uranus\", \"Neptune\"]\n}, ye = {\n id: \"planets-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"水星\", \"金星\", \"地球\", \"火星\", \"木星\", \"土星\", \"天王星\", \"海王星\"]\n}, be = {\n id: \"kuji-in-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"臨\", \"兵\", \"闘\", \"者\", \"皆\", \"陣\", \"烈\", \"在\", \"前\"]\n}, Se = {\n id: \"eight-virtues-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"仁\", \"義\", \"礼\", \"智\", \"忠\", \"信\", \"孝\", \"悌\"]\n}, je = {\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}, ke = {\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}, we = {\n id: \"shoguns-kamakura-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"源頼朝\",\n \"源頼家\",\n \"源実朝\",\n \"九条頼経\",\n \"九条頼嗣\",\n \"宗尊親王\",\n \"惟康親王\",\n \"久明親王\",\n \"守邦親王\"\n ]\n}, Ne = {\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}, Ie = {\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}, Te = {\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}, Me = {\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}, T = [\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], Ae = T.reduce(\n (e, t) => {\n if (t === \"北海道\")\n return e;\n if (/[都府県]$/.test(t)) {\n const n = t.slice(0, -1);\n e[n] = t;\n }\n return e;\n },\n {}\n), ve = {\n id: \"prefectures-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: T,\n aliases: Ae\n}, Le = {\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}, Ee = {\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}, We = {\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}, Ce = {\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}, Oe = {\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}, $e = [\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 oe,\n ae,\n ue,\n le,\n ce,\n fe,\n de,\n me,\n he,\n ge,\n pe,\n xe,\n ye,\n be,\n Se,\n je,\n ke,\n we,\n Ne,\n Ie,\n Te,\n Me,\n ve,\n Le,\n Ee,\n We,\n Ce,\n Oe\n], p = (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}, x = {\n 1: \"first\",\n 2: \"second\",\n 3: \"third\",\n 4: \"fourth\",\n 5: \"fifth\",\n 6: \"sixth\",\n 7: \"seventh\",\n 8: \"eighth\",\n 9: \"ninth\",\n 10: \"tenth\",\n 11: \"eleventh\",\n 12: \"twelfth\",\n 13: \"thirteenth\",\n 14: \"fourteenth\",\n 15: \"fifteenth\",\n 16: \"sixteenth\",\n 17: \"seventeenth\",\n 18: \"eighteenth\",\n 19: \"nineteenth\"\n}, y = {\n 20: \"twentieth\",\n 30: \"thirtieth\",\n 40: \"fortieth\",\n 50: \"fiftieth\",\n 60: \"sixtieth\",\n 70: \"seventieth\",\n 80: \"eightieth\",\n 90: \"ninetieth\"\n}, M = {\n 20: \"twenty\",\n 30: \"thirty\",\n 40: \"forty\",\n 50: \"fifty\",\n 60: \"sixty\",\n 70: \"seventy\",\n 80: \"eighty\",\n 90: \"ninety\"\n}, w = Object.fromEntries(\n Object.entries(x).map(([e, t]) => [t, Number(e)])\n), Fe = Object.fromEntries(\n Object.entries(y).map(([e, t]) => [t, Number(e)])\n), Pe = Object.fromEntries(\n Object.entries(M).map(([e, t]) => [t, Number(e)])\n), A = (e) => {\n const t = e.trim().toLowerCase();\n if (!t) return null;\n const n = w[t] ?? Fe[t];\n if (n) return n;\n const s = t.split(/[-\\s]+/);\n if (s.length !== 2) return null;\n const r = Pe[s[0] ?? \"\"], o = w[s[1] ?? \"\"];\n return !r || !o ? null : r + o;\n}, v = (e) => {\n if (!Number.isFinite(e) || e <= 0 || Math.floor(e) !== e) return null;\n if (e <= 19) return x[e] ?? null;\n if (e < 100) {\n if (y[e]) return y[e] ?? null;\n const t = Math.floor(e / 10) * 10, n = e % 10, s = M[t], r = x[n];\n return !s || !r ? null : `${s}-${r}`;\n }\n return null;\n}, N = (e) => {\n const t = /^(\\d+)(st|nd|rd|th)$/i.exec(e);\n if (t) {\n const s = Number(t[1]);\n if (!Number.isFinite(s) || s <= 0) return null;\n const r = t[2]?.toLowerCase();\n return p(s) !== r ? null : { value: s, format: \"numeric\" };\n }\n const n = A(e);\n return n !== null ? { value: n, format: \"word\" } : null;\n}, Ve = {\n id: \"ordinal-en\",\n langs: [\"en\"],\n match(e) {\n if (e.length < 2) return null;\n const t = e.map((o) => N(o));\n if (t.some((o) => o === null)) return null;\n const n = t[0].format;\n if (t.some((o) => o?.format !== n)) return null;\n const s = t.map((o) => o.value), r = s[1] - s[0];\n for (let o = 2; o < s.length; o += 1)\n if (s[o] - s[o - 1] !== r) return null;\n return { score: 80, step: r, state: { format: n } };\n },\n createIterator(e, t) {\n const n = N(e[e.length - 1] ?? \"\"), s = t.state?.format ?? \"numeric\";\n let r = n?.value ?? 0;\n return {\n next() {\n if (r += t.step, r <= 0 || !Number.isFinite(r))\n return { value: void 0, done: !0 };\n if (s === \"word\") {\n const o = v(r);\n return o ? { value: o, done: !1 } : { value: void 0, done: !0 };\n }\n return { value: `${r}${p(r)}`, done: !1 };\n }\n };\n }\n}, Je = (e) => {\n for (const t of $e)\n e.register(t);\n}, Re = (e) => {\n e.registerMatch(Ve);\n}, De = (e) => {\n const t = e ?? [\"en\", \"ja\"], n = new z({ langs: t });\n return Je(n), Re(n), n;\n}, Ke = (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 m {\n constructor(...t) {\n const n = t;\n this.seed = n, this.kind = n.length === 1 ? \"copy\" : \"seed-repeat\", this.iterator = Ke(n);\n }\n static fromSeed(t, n, s) {\n const r = new m(...t);\n return r.kind = n, r.iterator = s, r;\n }\n next() {\n return this.iterator.next();\n }\n [Symbol.iterator]() {\n return this;\n }\n}\nconst L = 1e-9, ze = 100, Be = (e) => ({\n next() {\n return { value: e, done: !1 };\n }\n}), I = (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}, Ge = (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 let n = 0;\n return {\n next() {\n return n += 1, { value: new Date(e.getTime() + t * n), done: !1 };\n }\n };\n}, Ue = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: e * t ** n, done: !1 };\n }\n };\n}, Ye = (e, t) => {\n if (e.kind === \"matcher\")\n return e.matcher.createIterator(t, { step: e.step, state: e.state });\n const { list: n, startIndex: s, step: r } = e, o = n.items.length;\n let u = s;\n return {\n next() {\n if (n.mode === \"finite\") {\n const i = u + r;\n return i >= o ? { value: void 0, done: !0 } : (u = i, { value: n.items[u], done: !1 });\n }\n return u = (u + r) % o, { value: n.items[u], done: !1 };\n }\n };\n}, qe = (e) => e.every((t) => typeof t == \"number\" && Number.isFinite(t)), Xe = (e) => e.every((t) => t instanceof Date && !Number.isNaN(t.getTime())), Qe = (e) => e.every((t) => typeof t == \"string\"), Ze = (e) => {\n const t = /^(.*?)(-?\\d+)([^0-9]*)$/.exec(e);\n if (!t)\n return null;\n const n = t[1] ?? \"\", s = t[2] ?? \"\", r = t[3] ?? \"\", o = Number(s);\n if (!Number.isFinite(o))\n return null;\n const u = s.replace(\"-\", \"\").length;\n return { prefix: n, num: o, width: u, suffix: r };\n}, _e = (e) => {\n const t = /^(.*?)(\\d+)(st|nd|rd|th)([^0-9]*)$/i.exec(e);\n if (t) {\n const r = Number(t[2]);\n if (!Number.isFinite(r) || r <= 0) return null;\n const o = t[3]?.toLowerCase();\n return p(r) !== o ? null : {\n prefix: t[1] ?? \"\",\n num: r,\n suffix: t[4] ?? \"\",\n format: \"numeric\"\n };\n }\n const n = /^(.*?)([A-Za-z-]+)([^A-Za-z]*)$/.exec(e);\n if (!n) return null;\n const s = A(n[2] ?? \"\");\n return s === null ? null : {\n prefix: n[1] ?? \"\",\n num: s,\n suffix: n[3] ?? \"\",\n format: \"word\"\n };\n}, et = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s;\n if (r <= 0 || !Number.isFinite(r))\n return { value: void 0, done: !0 };\n if (e.format === \"word\") {\n const o = v(r);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n return {\n value: `${e.prefix}${r}${p(r)}${e.suffix}`,\n done: !1\n };\n }\n };\n}, tt = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = r < 0 ? \"-\" : \"\", u = Math.abs(r).toString().padStart(e.width, \"0\");\n return { value: `${e.prefix}${o}${u}${e.suffix}`, done: !1 };\n }\n };\n}, E = [\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], j = (e) => {\n if (e < 1 || e > ze)\n return null;\n let t = e, n = \"\";\n for (const [s, r] of E)\n for (; t >= r; )\n n += s, t -= r;\n return n;\n}, W = (e) => {\n if (e.length === 0 || e !== e.toUpperCase())\n return null;\n let t = e, n = 0;\n for (const [r, o] of E)\n for (; t.startsWith(r); )\n n += o, t = t.slice(r.length);\n if (t.length > 0)\n return null;\n const s = j(n);\n return !s || s !== e ? null : n;\n}, nt = (e, t) => {\n let n = 0;\n return {\n next() {\n n += 1;\n const s = e + t * n, r = j(s);\n return r ? { value: r, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, st = (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\", rt = (e) => {\n const t = [];\n let n = \"\", s = null;\n for (const r of e) {\n const o = st(r);\n if (s === o) {\n n += r;\n continue;\n }\n s !== null && t.push({ value: n, group: s }), n = r, s = o;\n }\n return s !== null && t.push({ value: n, group: s }), t;\n}, it = (e) => {\n const t = rt(e), n = t.map((i, a) => ({ index: a, num: W(i.value) })).filter((i) => i.num !== null);\n if (n.length !== 1)\n return null;\n const s = n[0].index, r = n[0].num, o = t.slice(0, s).map((i) => i.value).join(\"\"), u = t.slice(s + 1).map((i) => i.value).join(\"\");\n return { prefix: o, num: r, suffix: u };\n}, ot = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = j(r);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, b = {\n 一: 1,\n 二: 2,\n 三: 3,\n 四: 4,\n 五: 5,\n 六: 6,\n 七: 7,\n 八: 8,\n 九: 9\n}, S = {\n 壱: 1,\n 弐: 2,\n 参: 3,\n 肆: 4,\n 伍: 5,\n 陸: 6,\n 柒: 7,\n 捌: 8,\n 玖: 9\n}, C = {\n 十: 10,\n 拾: 10,\n 百: 100,\n 佰: 100,\n 千: 1e3,\n 仟: 1e3\n}, O = {\n 万: 1e4,\n 萬: 1e4\n}, at = /* @__PURE__ */ new Set([\n ...Object.keys(b),\n ...Object.keys(S),\n ...Object.keys(C),\n ...Object.keys(O)\n]), ut = (e) => at.has(e), lt = (e) => /[壱弐参肆伍陸柒捌玖拾萬佰仟]/.test(e) ? \"traditional\" : \"modern\", $ = (e) => {\n if (!e)\n return null;\n const t = lt(e);\n if (e.includes(\"万\") || e.includes(\"萬\")) {\n const i = /^([一二三四五六七八九壱弐参肆伍陸柒捌玖])?(万|萬)$/.exec(e);\n if (!i)\n return null;\n const a = i[1];\n return a ? (b[a] ?? S[a]) !== 1 ? null : { num: 1e4, style: t } : { num: 1e4, style: t };\n }\n let s = 0, r = 0, o = Number.POSITIVE_INFINITY, u = !1;\n for (const i of e) {\n const a = b[i] ?? S[i];\n if (a) {\n if (u)\n return null;\n r = a, u = !0;\n continue;\n }\n const l = C[i];\n if (l) {\n if (l >= o)\n return null;\n r === 0 && (r = 1), s += r * l, r = 0, o = l, u = !1;\n continue;\n }\n return O[i], null;\n }\n return s += r, s <= 0 || s > 1e4 ? null : { num: s, style: t };\n}, ct = (e) => {\n const t = [];\n let n = \"\", s = 0, r = 0;\n for (const l of e)\n ut(l) ? (n || (s = r), n += l) : n && (t.push({ start: s, end: r, text: n }), n = \"\"), r += l.length;\n n && t.push({ start: s, end: r, text: n });\n const o = t.map((l) => ({ run: l, parsed: $(l.text) })).filter((l) => l.parsed !== null);\n if (o.length !== 1)\n return null;\n const u = o[0], i = e.slice(0, u.run.start), a = e.slice(u.run.end);\n return {\n prefix: i,\n num: u.parsed.num,\n suffix: a,\n style: u.parsed.style\n };\n}, F = (e, t) => {\n if (!Number.isFinite(e) || e <= 0 || e > 1e4)\n return null;\n const n = t === \"traditional\" ? [\"\", \"壱\", \"弐\", \"参\", \"肆\", \"伍\", \"陸\", \"柒\", \"捌\", \"玖\"] : [\"\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"七\", \"八\", \"九\"], s = t === \"traditional\" ? \"拾\" : \"十\", r = t === \"traditional\" ? \"萬\" : \"万\";\n if (e === 1e4)\n return `${n[1]}${r}`;\n let o = e, u = \"\";\n const i = Math.floor(o / 1e3);\n i > 0 && (i > 1 && (u += n[i]), u += \"千\", o %= 1e3);\n const a = Math.floor(o / 100);\n a > 0 && (a > 1 && (u += n[a]), u += \"百\", o %= 100);\n const l = Math.floor(o / 10);\n return l > 0 && (l > 1 && (u += n[l]), u += s, o %= 10), o > 0 && (u += n[o]), u || null;\n}, ft = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = e + t * s, o = F(r, n);\n return o ? { value: o, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, dt = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = F(r, e.style);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, h = (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) > L)\n return null;\n return t;\n}, mt = (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) > L)\n return null;\n return t;\n}, ht = (e) => {\n const t = e.map((i) => _e(i));\n if (t.every((i) => i !== null)) {\n const i = t, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix && c.format === a.format\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: et(\n { prefix: a.prefix, suffix: a.suffix, format: a.format },\n d.num,\n f\n )\n };\n }\n }\n }\n const n = e.map((i) => Ze(i));\n if (n.every(Boolean)) {\n const i = n[0], a = n[n.length - 1];\n if (n.every(\n (c) => c?.prefix === i.prefix && c?.suffix === i.suffix\n )) {\n const c = n.map((d) => d?.num ?? 0), f = h(c);\n if (f !== null)\n return {\n kind: \"arithmetic\",\n iterator: tt(\n { prefix: a.prefix, suffix: a.suffix, width: a.width },\n a.num,\n f\n )\n };\n }\n }\n const s = e.map((i) => W(i));\n if (s.every((i) => i !== null)) {\n const i = s, a = h(i);\n if (a !== null) {\n const l = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: nt(l, a)\n };\n }\n }\n const r = e.map((i) => $(i));\n if (r.every((i) => i !== null)) {\n const i = r, a = i[0].style;\n if (i.every((l) => l.style === a)) {\n const l = i.map((f) => f.num), c = h(l);\n if (c !== null) {\n const f = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: ft(f.num, c, f.style)\n };\n }\n }\n }\n const o = e.map((i) => it(i));\n if (o.every((i) => i !== null)) {\n const i = o, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = c[c.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: ot(\n { prefix: a.prefix, suffix: a.suffix },\n d,\n f\n )\n };\n }\n }\n }\n const u = e.map((i) => ct(i));\n if (u.every((i) => i !== null)) {\n const i = u, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix && c.style === a.style\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: dt(\n { prefix: a.prefix, suffix: a.suffix, style: a.style },\n d.num,\n f\n )\n };\n }\n }\n }\n return null;\n}, gt = (e, t) => {\n const n = t.match(e);\n return n ? {\n kind: \"list\",\n iterator: Ye(n, e)\n } : null;\n};\nfunction pt(e, t) {\n const n = t?.registry ?? De();\n if (e.length === 0)\n return m.fromSeed(e, \"seed-repeat\", I(e));\n if (e.length === 1)\n return m.fromSeed(e, \"copy\", Be(e[0]));\n if (Qe(e)) {\n const s = gt(e, n);\n if (s)\n return m.fromSeed(e, s.kind, s.iterator);\n const r = ht(e);\n if (r)\n return m.fromSeed(e, r.kind, r.iterator);\n }\n if (qe(e)) {\n const s = h(e);\n if (s !== null)\n return m.fromSeed(\n e,\n \"arithmetic\",\n Ge(e[e.length - 1], s)\n );\n const r = mt(e);\n if (r !== null)\n return m.fromSeed(\n e,\n \"geometric\",\n Ue(e[e.length - 1], r)\n );\n }\n if (Xe(e)) {\n const s = e.map((o) => o.getTime()), r = h(s);\n if (r !== null)\n return m.fromSeed(\n e,\n \"arithmetic\",\n He(e[e.length - 1], r)\n );\n }\n return m.fromSeed(e, \"seed-repeat\", I(e));\n}\nexport {\n m as Sequence,\n z as SequenceRegistry,\n De as createBuiltInRegistry,\n v as formatEnglishOrdinalWord,\n pt as inferSequence,\n p as ordinalSuffix,\n A as parseEnglishOrdinalWord,\n Je as registerBuiltInLists,\n Re 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","export type NumericParseResult =\n | { ok: true; value: number }\n | { ok: false; reason: \"empty\" | \"invalid\" | \"non-finite\" | \"not-integer\" | \"out-of-range\" };\n\nexport type NumericColumnType = \"number\" | \"int\" | \"uint\";\n\nexport function normalizeNumericInput(text: string): string {\n return text.normalize(\"NFKC\").trim();\n}\n\nconst parsePrefixedBaseInteger = (text: string): number | null => {\n const s = text.trim();\n const m = /^([+-]?)(0[bBoOxX])([0-9a-fA-F]+)$/.exec(s);\n if (!m) return null;\n\n const sign = m[1] === \"-\" ? -1 : 1;\n const prefix = m[2].toLowerCase();\n const digits = m[3] ?? \"\";\n\n let radix = 10;\n let validRe = /^[0-9]+$/;\n if (prefix === \"0b\") {\n radix = 2;\n validRe = /^[01]+$/;\n } else if (prefix === \"0o\") {\n radix = 8;\n validRe = /^[0-7]+$/;\n } else if (prefix === \"0x\") {\n radix = 16;\n validRe = /^[0-9a-fA-F]+$/;\n }\n\n if (!digits || !validRe.test(digits)) return NaN;\n const n = Number.parseInt(digits, radix);\n return sign * n;\n};\n\nexport function parseNumericText(rawText: string): NumericParseResult {\n const text = normalizeNumericInput(rawText);\n if (text === \"\") return { ok: false, reason: \"empty\" };\n\n const baseParsed = parsePrefixedBaseInteger(text);\n if (baseParsed !== null) {\n if (!Number.isFinite(baseParsed)) return { ok: false, reason: \"invalid\" };\n return { ok: true, value: baseParsed };\n }\n\n const n = Number(text);\n if (!Number.isFinite(n)) return { ok: false, reason: Number.isNaN(n) ? \"invalid\" : \"non-finite\" };\n return { ok: true, value: n };\n}\n\nexport function coerceNumericForColumn(\n value: number,\n type: NumericColumnType,\n): NumericParseResult {\n if (!Number.isFinite(value)) return { ok: false, reason: \"non-finite\" };\n if (type === \"number\") return { ok: true, value };\n\n if (!Number.isSafeInteger(value)) return { ok: false, reason: \"not-integer\" };\n if (type === \"uint\" && value < 0) return { ok: false, reason: \"out-of-range\" };\n return { ok: true, value };\n}\n\nexport type IntegerBaseFormat = \"binary\" | \"octal\" | \"hex\";\n\nexport function formatIntegerWithPrefix(value: number, base: IntegerBaseFormat): string {\n const sign = value < 0 ? \"-\" : \"\";\n const abs = Math.abs(value);\n const digits =\n base === \"binary\" ? abs.toString(2) : base === \"octal\" ? abs.toString(8) : abs.toString(16);\n const prefix = base === \"binary\" ? \"0b\" : base === \"octal\" ? \"0o\" : \"0x\";\n return `${sign}${prefix}${digits}`;\n}\n\nexport function formatNumberForEdit(value: number, options?: { format?: \"decimal\" | \"scientific\"; precision?: number; scale?: number }): string {\n if (!Number.isFinite(value)) return \"\";\n const fmt = options?.format ?? \"decimal\";\n if (fmt === \"scientific\") {\n const p = options?.precision;\n if (p !== undefined && Number.isFinite(p) && p > 0) {\n return value.toExponential(Math.max(0, Math.floor(p) - 1));\n }\n return value.toExponential();\n }\n const scale = options?.scale;\n if (scale !== undefined && Number.isFinite(scale)) {\n const s = Math.max(0, Math.floor(scale));\n return value.toFixed(s);\n }\n return String(value);\n}\n","import type { DataModel } from \"./dataModel\";\nimport type {\n InternalRow,\n Schema,\n ColumnSchema,\n NumberFormat,\n IntegerFormat,\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 CELL_PADDING_X_PX,\n CELL_PADDING_TOP_PX,\n CELL_PADDING_BOTTOM_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\";\nimport { formatIntegerWithPrefix, formatNumberForEdit } from \"./numberIO\";\n\nconst CANVAS_FONT_FAMILY = '\"Inter\",\"Segoe UI\",system-ui,-apple-system,\"Helvetica Neue\",sans-serif';\n// Canvas text tends to render slightly larger than HTML with the same nominal size.\n// Use a slightly smaller size to visually match HTML's 14px.\nconst CANVAS_FONT_SIZE_PX = 13.5;\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\nfunction resolveTagValues(value: unknown): string[] | null {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\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 if (Array.isArray(values)) {\n return values.filter((v): v is string => typeof v === \"string\");\n }\n }\n }\n return null;\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 ):\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | 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 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(\n event: MouseEvent,\n ):\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | null {\n const target = event.target as HTMLElement | null;\n if (!target) return null;\n const tagRemove = target.closest<HTMLButtonElement>(\"[data-extable-tag-remove]\");\n if (tagRemove && !tagRemove.disabled) {\n const cell = tagRemove.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n const indexStr = tagRemove.dataset.extableTagIndex;\n const tagIndex = indexStr ? Number.parseInt(indexStr, 10) : Number.NaN;\n if (!Number.isFinite(tagIndex)) return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n kind: \"tag-remove\" as const,\n tagIndex,\n };\n }\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 tr.style.height = `${this.defaultRowHeight}px`;\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 tr.style.height = `${this.defaultRowHeight}px`;\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 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 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 tagValues =\n col.type === \"tags\" && !textOverride ? resolveTagValues(valueRes.value) : null;\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 (tagValues && tagValues.length) {\n const list = document.createElement(\"div\");\n list.className = \"extable-tag-list\";\n tagValues.forEach((tag, index) => {\n const chip = document.createElement(\"span\");\n chip.className = \"extable-tag\";\n const label = document.createElement(\"span\");\n label.className = \"extable-tag-label\";\n label.textContent = tag;\n const remove = document.createElement(\"button\");\n remove.type = \"button\";\n remove.className = \"extable-tag-remove\";\n remove.dataset.extableTagRemove = \"1\";\n remove.dataset.extableTagIndex = String(index);\n remove.textContent = \"×\";\n if (interaction.readonly || interaction.disabled) {\n remove.disabled = true;\n }\n chip.appendChild(label);\n chip.appendChild(remove);\n list.appendChild(chip);\n });\n td.replaceChildren(list);\n } else 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 =\n col.style?.align ??\n (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\" ? \"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 =\n measure.clientHeight +\n CELL_PADDING_TOP_PX +\n CELL_PADDING_BOTTOM_PX +\n 2; // border allowance (top+bottom)\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 === \"tags\") {\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\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 token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n const text = formatNumberForEdit(num, { format: \"scientific\", precision: fmt?.precision });\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\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\n if ((col.type === \"int\" || col.type === \"uint\") && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as IntegerFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n const text = formatIntegerWithPrefix(num, token);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n useGrouping: Boolean(fmt?.thousandSeparator),\n };\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 hoverActionKey: string | null = null;\n private activeActionKey: string | null = null;\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(\"pointerdown\", this.handlePointerDown);\n this.canvas.addEventListener(\"pointerup\", this.handlePointerUp);\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 = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\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 = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\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 ${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\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}${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`.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 + CELL_PADDING_X_PX;\n const textAreaY = yCursor + CELL_PADDING_TOP_PX;\n const textAreaW = Math.max(0, w - CELL_PADDING_X_PX * 2);\n const textAreaH = Math.max(0, rowH - (CELL_PADDING_TOP_PX + CELL_PADDING_BOTTOM_PX));\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 const actionKey = `${row.id}::${c.key}::button`;\n const isHover = this.hoverActionKey === actionKey;\n const isActive = this.activeActionKey === actionKey;\n if (muted) {\n ctx.fillStyle = \"#f3f4f6\";\n ctx.strokeStyle = \"#e2e8f0\";\n } else if (isActive) {\n ctx.fillStyle = \"#cbd5e1\";\n ctx.strokeStyle = \"#94a3b8\";\n } else if (isHover) {\n ctx.fillStyle = \"#e2e8f0\";\n ctx.strokeStyle = \"#94a3b8\";\n } else {\n ctx.fillStyle = \"#f8fafc\";\n ctx.strokeStyle = \"#cbd5e1\";\n }\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 ${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\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.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.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(\"pointerdown\", this.handlePointerDown);\n this.canvas.removeEventListener(\"pointerup\", this.handlePointerUp);\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 = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\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}${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`.trim();\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 + CELL_PADDING_X_PX;\n const textAreaY = hit.rect.top + CELL_PADDING_TOP_PX;\n const textAreaW = Math.max(0, hit.rect.width - CELL_PADDING_X_PX * 2);\n const textAreaH = Math.max(\n 0,\n hit.rect.height - (CELL_PADDING_TOP_PX + CELL_PADDING_BOTTOM_PX),\n );\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 if (this.hoverActionKey || this.activeActionKey) {\n this.hoverActionKey = null;\n this.activeActionKey = null;\n this.render();\n }\n };\n\n private handlePointerDown = (ev: PointerEvent) => {\n if (!this.canvas) return;\n const actionHit = this.hitTestAction(\n new MouseEvent(\"mousemove\", { clientX: ev.clientX, clientY: ev.clientY }),\n );\n if (!actionHit || actionHit.kind !== \"button\") return;\n const interaction = this.dataModel.getCellInteraction(actionHit.rowId, actionHit.colKey);\n if (interaction.disabled) return;\n const nextKey = `${actionHit.rowId}::${actionHit.colKey}::${actionHit.kind}`;\n if (nextKey !== this.activeActionKey) {\n this.activeActionKey = nextKey;\n this.render();\n }\n };\n\n private handlePointerUp = () => {\n if (this.activeActionKey) {\n this.activeActionKey = null;\n this.render();\n }\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 this.hoverActionKey = 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 this.hoverActionKey = 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 const nextHoverKey = actionHit ? `${actionHit.rowId}::${actionHit.colKey}::${actionHit.kind}` : null;\n if (nextHoverKey !== this.hoverActionKey) {\n this.hoverActionKey = nextHoverKey;\n this.render();\n }\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 = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n }\n const lines = this.getTextLinesForBounds(ctx, text, width, wrap, height);\n const totalTextHeight = lines.length * this.lineHeight;\n const baseY = y + Math.max(0, Math.floor((height - totalTextHeight) / 2));\n const renderLine = (ln: string, lineIdx: number) => {\n const baseline = baseY + 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 for (let idx = 0; idx < lines.length; idx += 1) {\n renderLine(lines[idx] ?? \"\", idx + 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 === \"tags\") {\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\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 token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n const text = formatNumberForEdit(num, { format: \"scientific\", precision: fmt?.precision });\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\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\n if ((col.type === \"int\" || col.type === \"uint\") && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as IntegerFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n const text = formatIntegerWithPrefix(num, token);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n useGrouping: Boolean(fmt?.thousandSeparator),\n };\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 coerceNumericForColumn,\n formatIntegerWithPrefix,\n formatNumberForEdit,\n normalizeNumericInput,\n parseNumericText,\n} from \"./numberIO\";\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 CELL_PADDING_X_PX,\n CELL_PADDING_TOP_PX,\n CELL_PADDING_BOTTOM_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) =>\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | 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 activeOriginalValue: { rowId: string; colKey: string; value: unknown } | null = null;\n private composing = false;\n private lastCompositionEnd = 0;\n private readonly handleInputCompositionStart = () => {\n this.composing = true;\n };\n private readonly handleInputCompositionEnd = () => {\n this.composing = false;\n this.lastCompositionEnd = Date.now();\n };\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 // This input exists only to receive keyboard/clipboard/IME events in selection mode.\n // It is not a text editor.\n input.readOnly = true;\n // Helps suppress virtual keyboards; also reduces IME oddities on some platforms.\n input.inputMode = \"none\";\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(\"beforeinput\", this.handleSelectionBeforeInput);\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 if (!this.tryCommitActiveEditor()) return;\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\n // Avoid re-entrancy via blur fired during DOM removal.\n this.selectionInput = null;\n\n input.removeEventListener(\"keydown\", this.handleSelectionKeydown);\n input.removeEventListener(\"beforeinput\", this.handleSelectionBeforeInput);\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 = (ev?: CompositionEvent) => {\n if (!this.selectionMode) return;\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) return;\n\n if (this.isCellReadonly(ac.rowId, ac.colKey)) {\n // Keep selection mode for readonly cells.\n // IMPORTANT: cancel any ongoing IME composition by tearing down the focused hidden input.\n // Otherwise, some IMEs show a floating preedit UI (e.g. an \"a\") even though we ignore edits.\n ev?.preventDefault?.();\n ev?.stopPropagation?.();\n const current = this.dataModel.getCell(ac.rowId, ac.colKey);\n const currentText = this.cellToClipboardString(current);\n this.teardownSelectionInput();\n this.focusSelectionInput(currentText);\n return;\n }\n\n this.selectionMode = false;\n this.teardownSelectionInput();\n this.openEditorAtActiveCell();\n };\n\n private handleSelectionBeforeInput = (ev: InputEvent) => {\n if (!this.selectionMode) return;\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) return;\n if (!this.isCellReadonly(ac.rowId, ac.colKey)) return;\n\n // Block text insertion into the hidden selection input while readonly.\n ev.preventDefault();\n try {\n const current = this.dataModel.getCell(ac.rowId, ac.colKey);\n const currentText = this.cellToClipboardString(current);\n const input = this.ensureSelectionInput();\n input.value = currentText;\n input.select();\n } catch {\n // ignore\n }\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 if (\n this.activeCell.colKey !== null &&\n this.isCellReadonly(this.activeCell.rowId, this.activeCell.colKey)\n ) {\n ev.preventDefault();\n this.selectionAnchor = null;\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\" || col.type === \"int\" || col.type === \"uint\") {\n const parsed = parseNumericText(raw);\n if (!parsed.ok) return raw;\n const coerced = coerceNumericForColumn(parsed.value, col.type);\n return coerced.ok ? coerced.value : 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\" || col?.type === \"int\" || col?.type === \"uint\") {\n const input = document.createElement(\"input\");\n input.type = \"text\";\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 getInitialEditValue(colKey: string, current: unknown): string {\n if (current === null || current === undefined) return \"\";\n const col = this.findColumn(colKey);\n if (!col) return String(current);\n\n if ((col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") && typeof current === \"number\") {\n if (col.type === \"number\") {\n const fmt = col.format as { format?: string; precision?: number; scale?: number } | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n return formatNumberForEdit(current, { format: \"scientific\", precision: fmt?.precision });\n }\n return formatNumberForEdit(current, { format: \"decimal\", scale: fmt?.scale });\n }\n\n const fmt = col.format as { format?: string } | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n return formatIntegerWithPrefix(current, token);\n }\n return String(current);\n }\n\n return String(current);\n }\n\n private readActiveValueForCommit(): { ok: true; value: unknown } | { ok: false } {\n if (!this.inputEl || !this.activeCell || this.activeCell.colKey === null) {\n return { ok: true, value: this.inputEl?.value ?? \"\" };\n }\n\n const col = this.findColumn(this.activeCell.colKey);\n if (\n col &&\n (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") &&\n this.inputEl instanceof HTMLInputElement\n ) {\n const normalized = normalizeNumericInput(this.inputEl.value);\n if (normalized === \"\") return { ok: true, value: \"\" };\n\n const parsed = parseNumericText(normalized);\n if (!parsed.ok) return { ok: false };\n const coerced = coerceNumericForColumn(parsed.value, col.type);\n if (!coerced.ok) return { ok: false };\n return { ok: true, value: coerced.value };\n }\n\n return { ok: true, value: this.readActiveValue() };\n }\n\n private tryCommitActiveEditor(): boolean {\n if (!this.inputEl || !this.activeCell || this.activeCell.colKey === null) return true;\n const { rowId, colKey } = this.activeCell;\n const next = this.readActiveValueForCommit();\n if (!next.ok) {\n this.inputEl.focus({ preventScroll: true });\n return false;\n }\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n return true;\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 insetX = CELL_PADDING_X_PX;\n const insetTop = CELL_PADDING_TOP_PX;\n const insetBottom = CELL_PADDING_BOTTOM_PX;\n wrapper.style.left = `${box.left + insetX}px`;\n wrapper.style.top = `${box.top + insetTop}px`;\n wrapper.style.width = `${Math.max(8, box.width - insetX * 2)}px`;\n wrapper.style.height = `${Math.max(8, box.height - (insetTop + insetBottom))}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 if (!this.tryCommitActiveEditor()) return;\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 if ((globalThis as { __EXTABLE_DEBUG_ACTIONS?: boolean }).__EXTABLE_DEBUG_ACTIONS) {\n console.log(\"[extable][canvas][action-click]\", actionHit);\n }\n if (actionHit.kind === \"tag-remove\") {\n const removed = this.removeTagValue(actionHit.rowId, actionHit.colKey, actionHit.tagIndex);\n if (removed) {\n ev.preventDefault();\n return;\n }\n } else {\n const triggered = this.triggerCellAction(actionHit.rowId, actionHit.colKey, actionHit.kind);\n if (triggered) {\n ev.preventDefault();\n return;\n }\n }\n } else if ((globalThis as { __EXTABLE_DEBUG_ACTIONS?: boolean }).__EXTABLE_DEBUG_ACTIONS) {\n console.log(\"[extable][canvas][action-click]\", null);\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 removeTagValue(rowId: string, colKey: string, tagIndex: number) {\n if (this.isCellReadonly(rowId, colKey)) return false;\n const col = this.findColumn(colKey);\n if (!col || col.type !== \"tags\") return false;\n const current = this.dataModel.getCell(rowId, colKey);\n const values = this.normalizeTagValues(current);\n if (!values || tagIndex < 0 || tagIndex >= values.length) return false;\n const nextValues = values.filter((_, i) => i !== tagIndex);\n const next =\n current && typeof current === \"object\" && (current as Record<string, unknown>).kind === \"tags\"\n ? { kind: \"tags\", values: nextValues }\n : nextValues;\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next,\n };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n return true;\n }\n\n private normalizeTagValues(value: unknown): string[] | null {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((v): v is string => typeof v === \"string\");\n }\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return [];\n return trimmed.split(/\\s*,\\s*/).filter(Boolean);\n }\n return null;\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 this.activeOriginalValue = { rowId, colKey, value: current };\n const initialValue =\n options?.initialValueOverride ?? this.getInitialEditValue(colKey, current);\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n const isCheckbox = input instanceof HTMLInputElement && input.type === \"checkbox\";\n input.style.width = \"100%\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"0\";\n input.style.padding = \"0\";\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 = \"16px\";\n input.style.fontWeight = \"inherit\";\n if (isCheckbox) {\n input.style.width = \"auto\";\n input.style.lineHeight = \"normal\";\n }\n const col = this.findColumn(colKey);\n input.style.textAlign =\n col?.style?.align ??\n (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\" ? \"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 this.activeOriginalValue = { rowId, colKey, value: current };\n const initialValue =\n options?.initialValueOverride ?? this.getInitialEditValue(colKey, current);\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n const isCheckbox = input instanceof HTMLInputElement && input.type === \"checkbox\";\n input.style.width = \"100%\";\n input.style.height = \"100%\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"0\";\n input.style.padding = \"0\";\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 = \"16px\";\n input.style.fontWeight = \"inherit\";\n if (isCheckbox) {\n input.style.width = \"auto\";\n input.style.height = \"auto\";\n input.style.lineHeight = \"normal\";\n }\n const col = this.findColumn(colKey);\n input.style.textAlign =\n col?.style?.align ??\n (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\" ? \"right\" : \"left\");\n input.style.pointerEvents = \"auto\";\n input.addEventListener(\"keydown\", (e) => this.handleKey(e as KeyboardEvent, wrapper));\n input.addEventListener(\"compositionstart\", this.handleInputCompositionStart);\n input.addEventListener(\"compositionend\", this.handleInputCompositionEnd);\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 next = this.readActiveValueForCommit();\n if (!next.ok) return;\n this.commitEdit(rowId, colKey, next.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 === \"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 next = this.readActiveValueForCommit();\n if (!next.ok) return;\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n });\n }\n\n private cancelEdit(cell: HTMLElement) {\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) {\n this.teardownInput(false);\n cell.blur();\n return;\n }\n\n const { rowId, colKey } = ac;\n const orig =\n this.activeOriginalValue &&\n this.activeOriginalValue.rowId === rowId &&\n this.activeOriginalValue.colKey === colKey\n ? this.activeOriginalValue.value\n : this.dataModel.getCell(rowId, colKey);\n\n const current = this.dataModel.getCell(rowId, colKey);\n const norm = (v: unknown) => (v === null || v === undefined ? \"\" : v);\n const normalizedOrig = norm(orig);\n const normalizedCurrent = norm(current);\n\n // If something committed/changed during this edit session (e.g. due to a validation path),\n // revert it back to the original value. Otherwise, do not emit any command.\n if (!Object.is(normalizedCurrent, normalizedOrig)) {\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next: normalizedOrig,\n prev: normalizedCurrent,\n };\n this.onEdit(cmd, true);\n }\n\n this.teardownInput(false);\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 this.activeOriginalValue = null;\n this.composing = false;\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 | \"int\"\n | \"uint\"\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 /**\n * Format token for number display.\n * - \"decimal\": normal decimal formatting (default)\n * - \"scientific\": scientific notation\n * - other strings are reserved for future/custom formatters\n */\n format?: string;\n};\n\nexport type IntegerFormat = {\n thousandSeparator?: boolean;\n negativeRed?: boolean;\n /**\n * Format token for integer display.\n * - \"decimal\": normal decimal formatting (default)\n * - \"binary\" | \"octal\" | \"hex\": prefixed base literals\n * - other strings are reserved for future/custom formatters\n */\n format?: string;\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 \"int\" | \"uint\"\n ? IntegerFormat\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","slowRow","height","next","entries","changed","key","found","pendingRow","colType","colKey","c","baseReadonly","delta","cellStyle","readonlyFromStyle","disabledAllowed","disabled","readonly","isFormulaCol","committed","bumpVersion","prev","rawVal","current","uniqueCols","val","rowData","forcedId","clamped","removed","colIndex","rowIndex","r","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","CELL_PADDING_X_PX","CELL_PADDING_TOP_PX","CELL_PADDING_BOTTOM_PX","getColumnWidths","fallbackWidth","extraByType","extra","V","n","J","R","D","K","z","o","u","P","B","G","H","U","Y","q","X","Q","Z","_","ee","te","ne","se","re","ie","oe","ae","ue","le","ce","fe","de","me","he","ge","pe","xe","ye","be","Se","je","ke","we","Ne","Ie","Te","Me","T","Ae","ve","Le","Ee","We","Ce","Oe","$e","y","M","w","Fe","Pe","A","N","Ve","Je","Re","De","Ke","m","L","ze","Be","I","Ge","He","Ue","Ye","qe","Xe","Qe","Ze","_e","et","tt","E","j","W","nt","st","rt","it","ot","S","C","O","at","ut","lt","$","ct","F","ft","dt","mt","ht","gt","pt","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","normalizeNumericInput","text","parsePrefixedBaseInteger","sign","prefix","digits","radix","validRe","parseNumericText","rawText","baseParsed","coerceNumericForColumn","type","formatIntegerWithPrefix","abs","formatNumberForEdit","scale","CANVAS_FONT_FAMILY","CANVAS_FONT_SIZE_PX","getColumnSortDir","hasActiveColumnFilter","svgFunnel","svgArrow","drawDiagnosticCorner","ctx","color","ValueFormatCache","drawFunnelIcon","alpha","drawSortArrowIcon","resolveTagValues","FenwickTree","count","index0","total","bit","acc","step","nextAcc","HTMLRenderer","root","_state","scrollContainer","prevTop","prevLeft","colWidths","colBaseStyles","colBaseCss","totalWidth","body","entry","event","corner","rowHeader","cell","tagRemove","indexStr","tagIndex","actionEl","thead","tr","rowTh","th","sortDir","hasFilter","wrap","btn","td","isPending","condRes","hasTextColor","baseStyle","withCond","forCss","valueRes","textOverride","formatted","interaction","tagValues","isActionType","actionValue","actionLabel","tag","chip","remove","align","rawNumbered","rawStr","maxHeight","measure","measureHost","isAll","startRow","endRow","startCol","endCol","rowEl","cells","tags","opts","fmtValue","_CanvasRenderer","getEditMode","ev","viewportX","viewportY","xCursor","iconSize","iconLeft","iconTop","actionHit","nextKey","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","actionKey","isHover","isActive","xHeader","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","nextIcon","cursor","sameCell","sameMessage","nextHoverKey","handleRect","rawLines","lines","line","cut","firstKey","maxLines","minX","maxX","minY","maxY","lineWidth","startX","lineTop","lineBottom","fontBackup","totalTextHeight","baseY","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","ac","currentText","input","isMac","isTab","isEnter","isArrow","extend","wasSameCell","isSecondClick","maxRow","maxCol","activeRowIndex","activeColIndex","nextRanges","clamp","max","desiredColKey","fallbackRow","nextRow","nextRange","initial","toast","inset","maxLeft","maxTop","minLeft","minTop","candidateLeft","candidateTop","variant","durationMs","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","first","normalized","rowIdx","colIdx","linkAction","buttonAction","htmlRows","tableStyle","htmlCells","fromHtml","trimmed","table","trs","coerced","ta","select","opt","op","listId","datalist","lineHeight","wrapper","insetX","insetTop","insetBottom","linkValue","nextValues","link","isRow","targetRange","anchorRow","anchorCol","anchorCell","sorted","sameCols","sameRows","rowsTouch","colsTouch","initialValue","control","isCheckbox","end","now","isTextarea","isAltEnter","commitAndMove","orig","normalizedOrig","normalizedCurrent","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,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;AAA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"}
1
+ {"version":3,"file":"index.js","sources":["../src/commandQueue.ts","../src/address.ts","../src/lockManager.ts","../../sequence/dist/index.js","../src/fillHandle.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","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","const g = (e) => e.trim().normalize(\"NFKC\").toLowerCase().replace(/\\s+/g, \" \"), V = (e) => {\n const t = [];\n if (e)\n for (const n of e) {\n const s = n.trim();\n !s || t.includes(s) || t.push(s);\n }\n return t.length === 0 ? t.push(\"en\") : t.includes(\"en\") || t.push(\"en\"), t;\n}, J = (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 s = e.aliases[t];\n if (!s)\n return null;\n const r = e.items.indexOf(s);\n return r === -1 ? null : r;\n}, R = (e, t) => {\n const n = g(t);\n if (g(e.id).includes(n))\n return !0;\n for (const s of e.items)\n if (g(s).includes(n))\n return !0;\n return e.aliases ? Object.keys(e.aliases).some(\n (s) => g(s).includes(n)\n ) : !1;\n}, D = (e, t) => {\n if (e.langs.length === 0)\n return 0;\n let n = Number.POSITIVE_INFINITY;\n for (const s of e.langs) {\n const r = t.indexOf(s);\n r !== -1 && r < n && (n = r);\n }\n return n;\n}, K = (e, t) => !e.langs || e.langs.length === 0 ? !0 : e.langs.some((n) => t.includes(n));\nclass z {\n constructor(t) {\n this.lists = [], this.matchers = [], this.langs = V(t?.langs);\n }\n register(t) {\n const n = this.lists.findIndex((s) => s.id === t.id);\n n === -1 ? this.lists.push(t) : this.lists[n] = t;\n }\n registerMatch(t) {\n const n = this.matchers.findIndex((s) => s.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 r = new Set(t.enabledIds);\n n = n.filter((o) => r.has(o.id));\n }\n const s = t?.queryText;\n return s && (n = n.filter((r) => R(r, s))), n;\n }\n match(t, n) {\n if (t.length === 0)\n return null;\n let s = null, r = Number.NEGATIVE_INFINITY;\n const o = n?.enabledIds ? new Set(n.enabledIds) : null;\n for (const i of this.matchers) {\n if (o && !o.has(i.id) || !K(i, this.langs))\n continue;\n const a = i.match(t);\n if (!a)\n continue;\n const l = a.score;\n Number.isFinite(l) && l > r && (r = l, s = {\n kind: \"matcher\",\n matcher: i,\n step: a.step ?? 1,\n state: a.state\n });\n }\n const u = this.list(n).map((i) => ({ list: i, rank: D(i, this.langs) })).filter((i) => Number.isFinite(i.rank)).sort((i, a) => i.rank - a.rank);\n for (const { list: i, rank: a } of u) {\n const l = [];\n let c = !1;\n for (const P of t) {\n const k = J(i, P);\n if (k === null) {\n c = !0;\n break;\n }\n l.push(k);\n }\n if (c)\n continue;\n const f = this.inferStep(i, l);\n if (f === null)\n continue;\n const d = 10 - a;\n d > r && (r = d, s = {\n kind: \"list\",\n list: i,\n startIndex: l[l.length - 1] ?? 0,\n step: f\n });\n }\n return s;\n }\n inferStep(t, n) {\n if (n.length < 2)\n return 1;\n const s = t.items.length, r = this.stepBetween(t.mode, s, n[0], n[1]);\n if (r === null)\n return null;\n for (let o = 2; o < n.length; o += 1) {\n const u = this.nextIndex(t.mode, s, n[o - 1], r);\n if (u === null || u !== n[o])\n return null;\n }\n return r;\n }\n stepBetween(t, n, s, r) {\n if (t === \"cycle\")\n return (r - s + n) % n;\n const o = r - s;\n return o < 0 ? null : o;\n }\n nextIndex(t, n, s, r) {\n if (t === \"cycle\")\n return (s + r) % n;\n const o = s + r;\n return o >= n ? null : o;\n }\n}\nconst B = {\n id: \"weekdays-en-long\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"]\n}, G = {\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}, H = {\n id: \"weekdays-ja-long\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜日\", \"火曜日\", \"水曜日\", \"木曜日\", \"金曜日\", \"土曜日\", \"日曜日\"]\n}, U = {\n id: \"weekdays-ja-short\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜\", \"火曜\", \"水曜\", \"木曜\", \"金曜\", \"土曜\", \"日曜\"]\n}, Y = {\n id: \"weekdays-ja-single\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月\", \"火\", \"水\", \"木\", \"金\", \"土\", \"日\"]\n}, q = {\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}, X = {\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}, Q = {\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}, _ = {\n id: \"quarters-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"]\n}, ee = {\n id: \"quarters-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"第1四半期\", \"第2四半期\", \"第3四半期\", \"第4四半期\"]\n}, te = {\n id: \"zodiac-animals-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"子\", \"丑\", \"寅\", \"卯\", \"辰\", \"巳\", \"午\", \"未\", \"申\", \"酉\", \"戌\", \"亥\"]\n}, ne = {\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}, se = {\n id: \"zodiac-signs-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"牡羊座\", \"牡牛座\", \"双子座\", \"蟹座\", \"獅子座\", \"乙女座\", \"天秤座\", \"蠍座\", \"射手座\", \"山羊座\", \"水瓶座\", \"魚座\"],\n aliases: {\n さそり座: \"蠍座\"\n }\n}, re = {\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}, ie = {\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}, oe = {\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}, ae = {\n id: \"ampm-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"午前\", \"午後\"]\n}, ue = {\n id: \"seasons-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Spring\", \"Summer\", \"Autumn\", \"Winter\"],\n aliases: {\n Fall: \"Autumn\"\n }\n}, le = {\n id: \"seasons-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"春\", \"夏\", \"秋\", \"冬\"]\n}, ce = {\n id: \"solfege-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"ド\", \"レ\", \"ミ\", \"ファ\", \"ソ\", \"ラ\", \"シ\"]\n}, fe = {\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}, de = {\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}, me = {\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}, he = {\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}, ge = {\n id: \"rokuyo-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"先勝\", \"友引\", \"先負\", \"仏滅\", \"大安\", \"赤口\"]\n}, pe = {\n id: \"heavenly-stems-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"甲\", \"乙\", \"丙\", \"丁\", \"戊\", \"己\", \"庚\", \"辛\", \"壬\", \"癸\"]\n}, xe = {\n id: \"planets-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\"Mercury\", \"Venus\", \"Earth\", \"Mars\", \"Jupiter\", \"Saturn\", \"Uranus\", \"Neptune\"]\n}, ye = {\n id: \"planets-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"水星\", \"金星\", \"地球\", \"火星\", \"木星\", \"土星\", \"天王星\", \"海王星\"]\n}, be = {\n id: \"kuji-in-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"臨\", \"兵\", \"闘\", \"者\", \"皆\", \"陣\", \"烈\", \"在\", \"前\"]\n}, Se = {\n id: \"eight-virtues-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"仁\", \"義\", \"礼\", \"智\", \"忠\", \"信\", \"孝\", \"悌\"]\n}, je = {\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}, ke = {\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}, we = {\n id: \"shoguns-kamakura-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"源頼朝\",\n \"源頼家\",\n \"源実朝\",\n \"九条頼経\",\n \"九条頼嗣\",\n \"宗尊親王\",\n \"惟康親王\",\n \"久明親王\",\n \"守邦親王\"\n ]\n}, Ne = {\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}, Ie = {\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}, Te = {\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}, Me = {\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}, T = [\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], Ae = T.reduce(\n (e, t) => {\n if (t === \"北海道\")\n return e;\n if (/[都府県]$/.test(t)) {\n const n = t.slice(0, -1);\n e[n] = t;\n }\n return e;\n },\n {}\n), ve = {\n id: \"prefectures-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: T,\n aliases: Ae\n}, Le = {\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}, Ee = {\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}, We = {\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}, Ce = {\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}, Oe = {\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}, $e = [\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 oe,\n ae,\n ue,\n le,\n ce,\n fe,\n de,\n me,\n he,\n ge,\n pe,\n xe,\n ye,\n be,\n Se,\n je,\n ke,\n we,\n Ne,\n Ie,\n Te,\n Me,\n ve,\n Le,\n Ee,\n We,\n Ce,\n Oe\n], p = (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}, x = {\n 1: \"first\",\n 2: \"second\",\n 3: \"third\",\n 4: \"fourth\",\n 5: \"fifth\",\n 6: \"sixth\",\n 7: \"seventh\",\n 8: \"eighth\",\n 9: \"ninth\",\n 10: \"tenth\",\n 11: \"eleventh\",\n 12: \"twelfth\",\n 13: \"thirteenth\",\n 14: \"fourteenth\",\n 15: \"fifteenth\",\n 16: \"sixteenth\",\n 17: \"seventeenth\",\n 18: \"eighteenth\",\n 19: \"nineteenth\"\n}, y = {\n 20: \"twentieth\",\n 30: \"thirtieth\",\n 40: \"fortieth\",\n 50: \"fiftieth\",\n 60: \"sixtieth\",\n 70: \"seventieth\",\n 80: \"eightieth\",\n 90: \"ninetieth\"\n}, M = {\n 20: \"twenty\",\n 30: \"thirty\",\n 40: \"forty\",\n 50: \"fifty\",\n 60: \"sixty\",\n 70: \"seventy\",\n 80: \"eighty\",\n 90: \"ninety\"\n}, w = Object.fromEntries(\n Object.entries(x).map(([e, t]) => [t, Number(e)])\n), Fe = Object.fromEntries(\n Object.entries(y).map(([e, t]) => [t, Number(e)])\n), Pe = Object.fromEntries(\n Object.entries(M).map(([e, t]) => [t, Number(e)])\n), A = (e) => {\n const t = e.trim().toLowerCase();\n if (!t) return null;\n const n = w[t] ?? Fe[t];\n if (n) return n;\n const s = t.split(/[-\\s]+/);\n if (s.length !== 2) return null;\n const r = Pe[s[0] ?? \"\"], o = w[s[1] ?? \"\"];\n return !r || !o ? null : r + o;\n}, v = (e) => {\n if (!Number.isFinite(e) || e <= 0 || Math.floor(e) !== e) return null;\n if (e <= 19) return x[e] ?? null;\n if (e < 100) {\n if (y[e]) return y[e] ?? null;\n const t = Math.floor(e / 10) * 10, n = e % 10, s = M[t], r = x[n];\n return !s || !r ? null : `${s}-${r}`;\n }\n return null;\n}, N = (e) => {\n const t = /^(\\d+)(st|nd|rd|th)$/i.exec(e);\n if (t) {\n const s = Number(t[1]);\n if (!Number.isFinite(s) || s <= 0) return null;\n const r = t[2]?.toLowerCase();\n return p(s) !== r ? null : { value: s, format: \"numeric\" };\n }\n const n = A(e);\n return n !== null ? { value: n, format: \"word\" } : null;\n}, Ve = {\n id: \"ordinal-en\",\n langs: [\"en\"],\n match(e) {\n if (e.length < 2) return null;\n const t = e.map((o) => N(o));\n if (t.some((o) => o === null)) return null;\n const n = t[0].format;\n if (t.some((o) => o?.format !== n)) return null;\n const s = t.map((o) => o.value), r = s[1] - s[0];\n for (let o = 2; o < s.length; o += 1)\n if (s[o] - s[o - 1] !== r) return null;\n return { score: 80, step: r, state: { format: n } };\n },\n createIterator(e, t) {\n const n = N(e[e.length - 1] ?? \"\"), s = t.state?.format ?? \"numeric\";\n let r = n?.value ?? 0;\n return {\n next() {\n if (r += t.step, r <= 0 || !Number.isFinite(r))\n return { value: void 0, done: !0 };\n if (s === \"word\") {\n const o = v(r);\n return o ? { value: o, done: !1 } : { value: void 0, done: !0 };\n }\n return { value: `${r}${p(r)}`, done: !1 };\n }\n };\n }\n}, Je = (e) => {\n for (const t of $e)\n e.register(t);\n}, Re = (e) => {\n e.registerMatch(Ve);\n}, De = (e) => {\n const t = e ?? [\"en\", \"ja\"], n = new z({ langs: t });\n return Je(n), Re(n), n;\n}, Ke = (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 m {\n constructor(...t) {\n const n = t;\n this.seed = n, this.kind = n.length === 1 ? \"copy\" : \"seed-repeat\", this.iterator = Ke(n);\n }\n static fromSeed(t, n, s) {\n const r = new m(...t);\n return r.kind = n, r.iterator = s, r;\n }\n next() {\n return this.iterator.next();\n }\n [Symbol.iterator]() {\n return this;\n }\n}\nconst L = 1e-9, ze = 100, Be = (e) => ({\n next() {\n return { value: e, done: !1 };\n }\n}), I = (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}, Ge = (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 let n = 0;\n return {\n next() {\n return n += 1, { value: new Date(e.getTime() + t * n), done: !1 };\n }\n };\n}, Ue = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: e * t ** n, done: !1 };\n }\n };\n}, Ye = (e, t) => {\n if (e.kind === \"matcher\")\n return e.matcher.createIterator(t, { step: e.step, state: e.state });\n const { list: n, startIndex: s, step: r } = e, o = n.items.length;\n let u = s;\n return {\n next() {\n if (n.mode === \"finite\") {\n const i = u + r;\n return i >= o ? { value: void 0, done: !0 } : (u = i, { value: n.items[u], done: !1 });\n }\n return u = (u + r) % o, { value: n.items[u], done: !1 };\n }\n };\n}, qe = (e) => e.every((t) => typeof t == \"number\" && Number.isFinite(t)), Xe = (e) => e.every((t) => t instanceof Date && !Number.isNaN(t.getTime())), Qe = (e) => e.every((t) => typeof t == \"string\"), Ze = (e) => {\n const t = /^(.*?)(-?\\d+)([^0-9]*)$/.exec(e);\n if (!t)\n return null;\n const n = t[1] ?? \"\", s = t[2] ?? \"\", r = t[3] ?? \"\", o = Number(s);\n if (!Number.isFinite(o))\n return null;\n const u = s.replace(\"-\", \"\").length;\n return { prefix: n, num: o, width: u, suffix: r };\n}, _e = (e) => {\n const t = /^(.*?)(\\d+)(st|nd|rd|th)([^0-9]*)$/i.exec(e);\n if (t) {\n const r = Number(t[2]);\n if (!Number.isFinite(r) || r <= 0) return null;\n const o = t[3]?.toLowerCase();\n return p(r) !== o ? null : {\n prefix: t[1] ?? \"\",\n num: r,\n suffix: t[4] ?? \"\",\n format: \"numeric\"\n };\n }\n const n = /^(.*?)([A-Za-z-]+)([^A-Za-z]*)$/.exec(e);\n if (!n) return null;\n const s = A(n[2] ?? \"\");\n return s === null ? null : {\n prefix: n[1] ?? \"\",\n num: s,\n suffix: n[3] ?? \"\",\n format: \"word\"\n };\n}, et = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s;\n if (r <= 0 || !Number.isFinite(r))\n return { value: void 0, done: !0 };\n if (e.format === \"word\") {\n const o = v(r);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n return {\n value: `${e.prefix}${r}${p(r)}${e.suffix}`,\n done: !1\n };\n }\n };\n}, tt = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = r < 0 ? \"-\" : \"\", u = Math.abs(r).toString().padStart(e.width, \"0\");\n return { value: `${e.prefix}${o}${u}${e.suffix}`, done: !1 };\n }\n };\n}, E = [\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], j = (e) => {\n if (e < 1 || e > ze)\n return null;\n let t = e, n = \"\";\n for (const [s, r] of E)\n for (; t >= r; )\n n += s, t -= r;\n return n;\n}, W = (e) => {\n if (e.length === 0 || e !== e.toUpperCase())\n return null;\n let t = e, n = 0;\n for (const [r, o] of E)\n for (; t.startsWith(r); )\n n += o, t = t.slice(r.length);\n if (t.length > 0)\n return null;\n const s = j(n);\n return !s || s !== e ? null : n;\n}, nt = (e, t) => {\n let n = 0;\n return {\n next() {\n n += 1;\n const s = e + t * n, r = j(s);\n return r ? { value: r, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, st = (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\", rt = (e) => {\n const t = [];\n let n = \"\", s = null;\n for (const r of e) {\n const o = st(r);\n if (s === o) {\n n += r;\n continue;\n }\n s !== null && t.push({ value: n, group: s }), n = r, s = o;\n }\n return s !== null && t.push({ value: n, group: s }), t;\n}, it = (e) => {\n const t = rt(e), n = t.map((i, a) => ({ index: a, num: W(i.value) })).filter((i) => i.num !== null);\n if (n.length !== 1)\n return null;\n const s = n[0].index, r = n[0].num, o = t.slice(0, s).map((i) => i.value).join(\"\"), u = t.slice(s + 1).map((i) => i.value).join(\"\");\n return { prefix: o, num: r, suffix: u };\n}, ot = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = j(r);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, b = {\n 一: 1,\n 二: 2,\n 三: 3,\n 四: 4,\n 五: 5,\n 六: 6,\n 七: 7,\n 八: 8,\n 九: 9\n}, S = {\n 壱: 1,\n 弐: 2,\n 参: 3,\n 肆: 4,\n 伍: 5,\n 陸: 6,\n 柒: 7,\n 捌: 8,\n 玖: 9\n}, C = {\n 十: 10,\n 拾: 10,\n 百: 100,\n 佰: 100,\n 千: 1e3,\n 仟: 1e3\n}, O = {\n 万: 1e4,\n 萬: 1e4\n}, at = /* @__PURE__ */ new Set([\n ...Object.keys(b),\n ...Object.keys(S),\n ...Object.keys(C),\n ...Object.keys(O)\n]), ut = (e) => at.has(e), lt = (e) => /[壱弐参肆伍陸柒捌玖拾萬佰仟]/.test(e) ? \"traditional\" : \"modern\", $ = (e) => {\n if (!e)\n return null;\n const t = lt(e);\n if (e.includes(\"万\") || e.includes(\"萬\")) {\n const i = /^([一二三四五六七八九壱弐参肆伍陸柒捌玖])?(万|萬)$/.exec(e);\n if (!i)\n return null;\n const a = i[1];\n return a ? (b[a] ?? S[a]) !== 1 ? null : { num: 1e4, style: t } : { num: 1e4, style: t };\n }\n let s = 0, r = 0, o = Number.POSITIVE_INFINITY, u = !1;\n for (const i of e) {\n const a = b[i] ?? S[i];\n if (a) {\n if (u)\n return null;\n r = a, u = !0;\n continue;\n }\n const l = C[i];\n if (l) {\n if (l >= o)\n return null;\n r === 0 && (r = 1), s += r * l, r = 0, o = l, u = !1;\n continue;\n }\n return O[i], null;\n }\n return s += r, s <= 0 || s > 1e4 ? null : { num: s, style: t };\n}, ct = (e) => {\n const t = [];\n let n = \"\", s = 0, r = 0;\n for (const l of e)\n ut(l) ? (n || (s = r), n += l) : n && (t.push({ start: s, end: r, text: n }), n = \"\"), r += l.length;\n n && t.push({ start: s, end: r, text: n });\n const o = t.map((l) => ({ run: l, parsed: $(l.text) })).filter((l) => l.parsed !== null);\n if (o.length !== 1)\n return null;\n const u = o[0], i = e.slice(0, u.run.start), a = e.slice(u.run.end);\n return {\n prefix: i,\n num: u.parsed.num,\n suffix: a,\n style: u.parsed.style\n };\n}, F = (e, t) => {\n if (!Number.isFinite(e) || e <= 0 || e > 1e4)\n return null;\n const n = t === \"traditional\" ? [\"\", \"壱\", \"弐\", \"参\", \"肆\", \"伍\", \"陸\", \"柒\", \"捌\", \"玖\"] : [\"\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"七\", \"八\", \"九\"], s = t === \"traditional\" ? \"拾\" : \"十\", r = t === \"traditional\" ? \"萬\" : \"万\";\n if (e === 1e4)\n return `${n[1]}${r}`;\n let o = e, u = \"\";\n const i = Math.floor(o / 1e3);\n i > 0 && (i > 1 && (u += n[i]), u += \"千\", o %= 1e3);\n const a = Math.floor(o / 100);\n a > 0 && (a > 1 && (u += n[a]), u += \"百\", o %= 100);\n const l = Math.floor(o / 10);\n return l > 0 && (l > 1 && (u += n[l]), u += s, o %= 10), o > 0 && (u += n[o]), u || null;\n}, ft = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = e + t * s, o = F(r, n);\n return o ? { value: o, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, dt = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = F(r, e.style);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, h = (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) > L)\n return null;\n return t;\n}, mt = (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) > L)\n return null;\n return t;\n}, ht = (e) => {\n const t = e.map((i) => _e(i));\n if (t.every((i) => i !== null)) {\n const i = t, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix && c.format === a.format\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: et(\n { prefix: a.prefix, suffix: a.suffix, format: a.format },\n d.num,\n f\n )\n };\n }\n }\n }\n const n = e.map((i) => Ze(i));\n if (n.every(Boolean)) {\n const i = n[0], a = n[n.length - 1];\n if (n.every(\n (c) => c?.prefix === i.prefix && c?.suffix === i.suffix\n )) {\n const c = n.map((d) => d?.num ?? 0), f = h(c);\n if (f !== null)\n return {\n kind: \"arithmetic\",\n iterator: tt(\n { prefix: a.prefix, suffix: a.suffix, width: a.width },\n a.num,\n f\n )\n };\n }\n }\n const s = e.map((i) => W(i));\n if (s.every((i) => i !== null)) {\n const i = s, a = h(i);\n if (a !== null) {\n const l = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: nt(l, a)\n };\n }\n }\n const r = e.map((i) => $(i));\n if (r.every((i) => i !== null)) {\n const i = r, a = i[0].style;\n if (i.every((l) => l.style === a)) {\n const l = i.map((f) => f.num), c = h(l);\n if (c !== null) {\n const f = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: ft(f.num, c, f.style)\n };\n }\n }\n }\n const o = e.map((i) => it(i));\n if (o.every((i) => i !== null)) {\n const i = o, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = c[c.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: ot(\n { prefix: a.prefix, suffix: a.suffix },\n d,\n f\n )\n };\n }\n }\n }\n const u = e.map((i) => ct(i));\n if (u.every((i) => i !== null)) {\n const i = u, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix && c.style === a.style\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: dt(\n { prefix: a.prefix, suffix: a.suffix, style: a.style },\n d.num,\n f\n )\n };\n }\n }\n }\n return null;\n}, gt = (e, t) => {\n const n = t.match(e);\n return n ? {\n kind: \"list\",\n iterator: Ye(n, e)\n } : null;\n};\nfunction pt(e, t) {\n const n = t?.registry ?? De();\n if (e.length === 0)\n return m.fromSeed(e, \"seed-repeat\", I(e));\n if (e.length === 1)\n return m.fromSeed(e, \"copy\", Be(e[0]));\n if (Qe(e)) {\n const s = gt(e, n);\n if (s)\n return m.fromSeed(e, s.kind, s.iterator);\n const r = ht(e);\n if (r)\n return m.fromSeed(e, r.kind, r.iterator);\n }\n if (qe(e)) {\n const s = h(e);\n if (s !== null)\n return m.fromSeed(\n e,\n \"arithmetic\",\n Ge(e[e.length - 1], s)\n );\n const r = mt(e);\n if (r !== null)\n return m.fromSeed(\n e,\n \"geometric\",\n Ue(e[e.length - 1], r)\n );\n }\n if (Xe(e)) {\n const s = e.map((o) => o.getTime()), r = h(s);\n if (r !== null)\n return m.fromSeed(\n e,\n \"arithmetic\",\n He(e[e.length - 1], r)\n );\n }\n return m.fromSeed(e, \"seed-repeat\", I(e));\n}\nexport {\n m as Sequence,\n z as SequenceRegistry,\n De as createBuiltInRegistry,\n v as formatEnglishOrdinalWord,\n pt as inferSequence,\n p as ordinalSuffix,\n A as parseEnglishOrdinalWord,\n Je as registerBuiltInLists,\n Re 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 { DataModel } from \"./dataModel\";\nimport type {\n InternalRow,\n Schema,\n ColumnSchema,\n NumberFormat,\n IntegerFormat,\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 CELL_PADDING_X_PX,\n CELL_PADDING_TOP_PX,\n CELL_PADDING_BOTTOM_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\";\nimport { formatIntegerWithPrefix, formatNumberForEdit } from \"./numberIO\";\n\nconst CANVAS_FONT_FAMILY = '\"Inter\",\"Segoe UI\",system-ui,-apple-system,\"Helvetica Neue\",sans-serif';\n// Canvas text tends to render slightly larger than HTML with the same nominal size.\n// Use a slightly smaller size to visually match HTML's 14px.\nconst CANVAS_FONT_SIZE_PX = 13.5;\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\nfunction resolveTagValues(value: unknown): string[] | null {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\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 if (Array.isArray(values)) {\n return values.filter((v): v is string => typeof v === \"string\");\n }\n }\n }\n return null;\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 ):\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | 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 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(\n event: MouseEvent,\n ):\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | null {\n const target = event.target as HTMLElement | null;\n if (!target) return null;\n const tagRemove = target.closest<HTMLButtonElement>(\"[data-extable-tag-remove]\");\n if (tagRemove && !tagRemove.disabled) {\n const cell = tagRemove.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n const indexStr = tagRemove.dataset.extableTagIndex;\n const tagIndex = indexStr ? Number.parseInt(indexStr, 10) : Number.NaN;\n if (!Number.isFinite(tagIndex)) return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n kind: \"tag-remove\" as const,\n tagIndex,\n };\n }\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 tr.style.height = `${this.defaultRowHeight}px`;\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 tr.style.height = `${this.defaultRowHeight}px`;\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 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 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 tagValues =\n col.type === \"tags\" && !textOverride ? resolveTagValues(valueRes.value) : null;\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 (tagValues && tagValues.length) {\n const list = document.createElement(\"div\");\n list.className = \"extable-tag-list\";\n tagValues.forEach((tag, index) => {\n const chip = document.createElement(\"span\");\n chip.className = \"extable-tag\";\n const label = document.createElement(\"span\");\n label.className = \"extable-tag-label\";\n label.textContent = tag;\n const remove = document.createElement(\"button\");\n remove.type = \"button\";\n remove.className = \"extable-tag-remove\";\n remove.dataset.extableTagRemove = \"1\";\n remove.dataset.extableTagIndex = String(index);\n remove.textContent = \"×\";\n if (interaction.readonly || interaction.disabled) {\n remove.disabled = true;\n }\n chip.appendChild(label);\n chip.appendChild(remove);\n list.appendChild(chip);\n });\n td.replaceChildren(list);\n } else 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 =\n col.style?.align ??\n (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\" ? \"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) {\n td.classList.add(\"extable-readonly\");\n if (col.formula) td.classList.add(\"extable-readonly-formula\");\n } else {\n td.classList.add(\"extable-editable\");\n }\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 =\n measure.clientHeight +\n CELL_PADDING_TOP_PX +\n CELL_PADDING_BOTTOM_PX +\n 2; // border allowance (top+bottom)\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 === \"tags\") {\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\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 token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n const text = formatNumberForEdit(num, { format: \"scientific\", precision: fmt?.precision });\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\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\n if ((col.type === \"int\" || col.type === \"uint\") && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as IntegerFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n const text = formatIntegerWithPrefix(num, token);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n useGrouping: Boolean(fmt?.thousandSeparator),\n };\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 hoverActionKey: string | null = null;\n private activeActionKey: string | null = null;\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(\"pointerdown\", this.handlePointerDown);\n this.canvas.addEventListener(\"pointerup\", this.handlePointerUp);\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 = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\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 = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\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 ${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\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 const isGlobalReadonly = this.getEditMode() === \"readonly\";\n const hasExplicitTextColor = Boolean(formatted.color || mergedStyle.textColor || actionColor);\n const formulaReadonlyColor =\n !isGlobalReadonly && Boolean(c.formula) && interaction.readonly && !muted && !hasExplicitTextColor\n ? \"#99aaff\"\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 ?? formulaReadonlyColor ?? \"#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}${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`.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 + CELL_PADDING_X_PX;\n const textAreaY = yCursor + CELL_PADDING_TOP_PX;\n const textAreaW = Math.max(0, w - CELL_PADDING_X_PX * 2);\n const textAreaH = Math.max(0, rowH - (CELL_PADDING_TOP_PX + CELL_PADDING_BOTTOM_PX));\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 const actionKey = `${row.id}::${c.key}::button`;\n const isHover = this.hoverActionKey === actionKey;\n const isActive = this.activeActionKey === actionKey;\n if (muted) {\n ctx.fillStyle = \"#f3f4f6\";\n ctx.strokeStyle = \"#e2e8f0\";\n } else if (isActive) {\n ctx.fillStyle = \"#cbd5e1\";\n ctx.strokeStyle = \"#94a3b8\";\n } else if (isHover) {\n ctx.fillStyle = \"#e2e8f0\";\n ctx.strokeStyle = \"#94a3b8\";\n } else {\n ctx.fillStyle = \"#f8fafc\";\n ctx.strokeStyle = \"#cbd5e1\";\n }\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 ${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\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.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.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(\"pointerdown\", this.handlePointerDown);\n this.canvas.removeEventListener(\"pointerup\", this.handlePointerUp);\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 = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\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}${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`.trim();\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 + CELL_PADDING_X_PX;\n const textAreaY = hit.rect.top + CELL_PADDING_TOP_PX;\n const textAreaW = Math.max(0, hit.rect.width - CELL_PADDING_X_PX * 2);\n const textAreaH = Math.max(\n 0,\n hit.rect.height - (CELL_PADDING_TOP_PX + CELL_PADDING_BOTTOM_PX),\n );\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 if (this.hoverActionKey || this.activeActionKey) {\n this.hoverActionKey = null;\n this.activeActionKey = null;\n this.render();\n }\n };\n\n private handlePointerDown = (ev: PointerEvent) => {\n if (!this.canvas) return;\n const actionHit = this.hitTestAction(\n new MouseEvent(\"mousemove\", { clientX: ev.clientX, clientY: ev.clientY }),\n );\n if (!actionHit || actionHit.kind !== \"button\") return;\n const interaction = this.dataModel.getCellInteraction(actionHit.rowId, actionHit.colKey);\n if (interaction.disabled) return;\n const nextKey = `${actionHit.rowId}::${actionHit.colKey}::${actionHit.kind}`;\n if (nextKey !== this.activeActionKey) {\n this.activeActionKey = nextKey;\n this.render();\n }\n };\n\n private handlePointerUp = () => {\n if (this.activeActionKey) {\n this.activeActionKey = null;\n this.render();\n }\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 this.hoverActionKey = 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 this.hoverActionKey = 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 const nextHoverKey = actionHit ? `${actionHit.rowId}::${actionHit.colKey}::${actionHit.kind}` : null;\n if (nextHoverKey !== this.hoverActionKey) {\n this.hoverActionKey = nextHoverKey;\n this.render();\n }\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 = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n }\n const lines = this.getTextLinesForBounds(ctx, text, width, wrap, height);\n const totalTextHeight = lines.length * this.lineHeight;\n const baseY = y + Math.max(0, Math.floor((height - totalTextHeight) / 2));\n const renderLine = (ln: string, lineIdx: number) => {\n const baseline = baseY + 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 for (let idx = 0; idx < lines.length; idx += 1) {\n renderLine(lines[idx] ?? \"\", idx + 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 === \"tags\") {\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\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 token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n const text = formatNumberForEdit(num, { format: \"scientific\", precision: fmt?.precision });\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\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\n if ((col.type === \"int\" || col.type === \"uint\") && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as IntegerFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n const text = formatIntegerWithPrefix(num, token);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n useGrouping: Boolean(fmt?.thousandSeparator),\n };\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 coerceNumericForColumn,\n formatIntegerWithPrefix,\n formatNumberForEdit,\n normalizeNumericInput,\n parseNumericText,\n} from \"./numberIO\";\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 CELL_PADDING_X_PX,\n CELL_PADDING_TOP_PX,\n CELL_PADDING_BOTTOM_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) =>\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | 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 activeOriginalValue: { rowId: string; colKey: string; value: unknown } | null = null;\n private composing = false;\n private lastCompositionEnd = 0;\n private readonly handleInputCompositionStart = () => {\n this.composing = true;\n };\n private readonly handleInputCompositionEnd = () => {\n this.composing = false;\n this.lastCompositionEnd = Date.now();\n };\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 // This input exists only to receive keyboard/clipboard/IME events in selection mode.\n // It is not a text editor.\n input.readOnly = true;\n // Helps suppress virtual keyboards; also reduces IME oddities on some platforms.\n input.inputMode = \"none\";\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(\"beforeinput\", this.handleSelectionBeforeInput);\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 if (!this.tryCommitActiveEditor()) return;\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\n // Avoid re-entrancy via blur fired during DOM removal.\n this.selectionInput = null;\n\n input.removeEventListener(\"keydown\", this.handleSelectionKeydown);\n input.removeEventListener(\"beforeinput\", this.handleSelectionBeforeInput);\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 = (ev?: CompositionEvent) => {\n if (!this.selectionMode) return;\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) return;\n\n if (this.isCellReadonly(ac.rowId, ac.colKey)) {\n // Keep selection mode for readonly cells.\n // IMPORTANT: cancel any ongoing IME composition by tearing down the focused hidden input.\n // Otherwise, some IMEs show a floating preedit UI (e.g. an \"a\") even though we ignore edits.\n ev?.preventDefault?.();\n ev?.stopPropagation?.();\n const current = this.dataModel.getCell(ac.rowId, ac.colKey);\n const currentText = this.cellToClipboardString(current);\n this.teardownSelectionInput();\n this.focusSelectionInput(currentText);\n return;\n }\n\n this.selectionMode = false;\n this.teardownSelectionInput();\n this.openEditorAtActiveCell();\n };\n\n private handleSelectionBeforeInput = (ev: InputEvent) => {\n if (!this.selectionMode) return;\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) return;\n if (!this.isCellReadonly(ac.rowId, ac.colKey)) return;\n\n // Block text insertion into the hidden selection input while readonly.\n ev.preventDefault();\n try {\n const current = this.dataModel.getCell(ac.rowId, ac.colKey);\n const currentText = this.cellToClipboardString(current);\n const input = this.ensureSelectionInput();\n input.value = currentText;\n input.select();\n } catch {\n // ignore\n }\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 if (\n this.activeCell.colKey !== null &&\n this.isCellReadonly(this.activeCell.rowId, this.activeCell.colKey)\n ) {\n ev.preventDefault();\n this.selectionAnchor = null;\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\" || col.type === \"int\" || col.type === \"uint\") {\n const parsed = parseNumericText(raw);\n if (!parsed.ok) return raw;\n const coerced = coerceNumericForColumn(parsed.value, col.type);\n return coerced.ok ? coerced.value : 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\" || col?.type === \"int\" || col?.type === \"uint\") {\n const input = document.createElement(\"input\");\n input.type = \"text\";\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 getInitialEditValue(colKey: string, current: unknown): string {\n if (current === null || current === undefined) return \"\";\n const col = this.findColumn(colKey);\n if (!col) return String(current);\n\n if ((col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") && typeof current === \"number\") {\n if (col.type === \"number\") {\n const fmt = col.format as { format?: string; precision?: number; scale?: number } | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n return formatNumberForEdit(current, { format: \"scientific\", precision: fmt?.precision });\n }\n return formatNumberForEdit(current, { format: \"decimal\", scale: fmt?.scale });\n }\n\n const fmt = col.format as { format?: string } | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n return formatIntegerWithPrefix(current, token);\n }\n return String(current);\n }\n\n return String(current);\n }\n\n private readActiveValueForCommit(): { ok: true; value: unknown } | { ok: false } {\n if (!this.inputEl || !this.activeCell || this.activeCell.colKey === null) {\n return { ok: true, value: this.inputEl?.value ?? \"\" };\n }\n\n const col = this.findColumn(this.activeCell.colKey);\n if (\n col &&\n (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") &&\n this.inputEl instanceof HTMLInputElement\n ) {\n const normalized = normalizeNumericInput(this.inputEl.value);\n if (normalized === \"\") return { ok: true, value: \"\" };\n\n const parsed = parseNumericText(normalized);\n if (!parsed.ok) return { ok: false };\n const coerced = coerceNumericForColumn(parsed.value, col.type);\n if (!coerced.ok) return { ok: false };\n return { ok: true, value: coerced.value };\n }\n\n return { ok: true, value: this.readActiveValue() };\n }\n\n private tryCommitActiveEditor(): boolean {\n if (!this.inputEl || !this.activeCell || this.activeCell.colKey === null) return true;\n const { rowId, colKey } = this.activeCell;\n const next = this.readActiveValueForCommit();\n if (!next.ok) {\n this.inputEl.focus({ preventScroll: true });\n return false;\n }\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n return true;\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 insetX = CELL_PADDING_X_PX;\n const insetTop = CELL_PADDING_TOP_PX;\n const insetBottom = CELL_PADDING_BOTTOM_PX;\n wrapper.style.left = `${box.left + insetX}px`;\n wrapper.style.top = `${box.top + insetTop}px`;\n wrapper.style.width = `${Math.max(8, box.width - insetX * 2)}px`;\n wrapper.style.height = `${Math.max(8, box.height - (insetTop + insetBottom))}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 if (!this.tryCommitActiveEditor()) return;\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 if ((globalThis as { __EXTABLE_DEBUG_ACTIONS?: boolean }).__EXTABLE_DEBUG_ACTIONS) {\n console.log(\"[extable][canvas][action-click]\", actionHit);\n }\n if (actionHit.kind === \"tag-remove\") {\n const removed = this.removeTagValue(actionHit.rowId, actionHit.colKey, actionHit.tagIndex);\n if (removed) {\n ev.preventDefault();\n return;\n }\n } else {\n const triggered = this.triggerCellAction(actionHit.rowId, actionHit.colKey, actionHit.kind);\n if (triggered) {\n ev.preventDefault();\n return;\n }\n }\n } else if ((globalThis as { __EXTABLE_DEBUG_ACTIONS?: boolean }).__EXTABLE_DEBUG_ACTIONS) {\n console.log(\"[extable][canvas][action-click]\", null);\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 removeTagValue(rowId: string, colKey: string, tagIndex: number) {\n if (this.isCellReadonly(rowId, colKey)) return false;\n const col = this.findColumn(colKey);\n if (!col || col.type !== \"tags\") return false;\n const current = this.dataModel.getCell(rowId, colKey);\n const values = this.normalizeTagValues(current);\n if (!values || tagIndex < 0 || tagIndex >= values.length) return false;\n const nextValues = values.filter((_, i) => i !== tagIndex);\n const next =\n current && typeof current === \"object\" && (current as Record<string, unknown>).kind === \"tags\"\n ? { kind: \"tags\", values: nextValues }\n : nextValues;\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next,\n };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n return true;\n }\n\n private normalizeTagValues(value: unknown): string[] | null {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((v): v is string => typeof v === \"string\");\n }\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return [];\n return trimmed.split(/\\s*,\\s*/).filter(Boolean);\n }\n return null;\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 this.activeOriginalValue = { rowId, colKey, value: current };\n const initialValue =\n options?.initialValueOverride ?? this.getInitialEditValue(colKey, current);\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n const isCheckbox = input instanceof HTMLInputElement && input.type === \"checkbox\";\n input.style.width = \"100%\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"0\";\n input.style.padding = \"0\";\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 = \"16px\";\n input.style.fontWeight = \"inherit\";\n if (isCheckbox) {\n input.style.width = \"auto\";\n input.style.lineHeight = \"normal\";\n }\n const col = this.findColumn(colKey);\n input.style.textAlign =\n col?.style?.align ??\n (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\" ? \"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 this.activeOriginalValue = { rowId, colKey, value: current };\n const initialValue =\n options?.initialValueOverride ?? this.getInitialEditValue(colKey, current);\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n const isCheckbox = input instanceof HTMLInputElement && input.type === \"checkbox\";\n input.style.width = \"100%\";\n input.style.height = \"100%\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"0\";\n input.style.padding = \"0\";\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 = \"16px\";\n input.style.fontWeight = \"inherit\";\n if (isCheckbox) {\n input.style.width = \"auto\";\n input.style.height = \"auto\";\n input.style.lineHeight = \"normal\";\n }\n const col = this.findColumn(colKey);\n input.style.textAlign =\n col?.style?.align ??\n (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\" ? \"right\" : \"left\");\n input.style.pointerEvents = \"auto\";\n input.addEventListener(\"keydown\", (e) => this.handleKey(e as KeyboardEvent, wrapper));\n input.addEventListener(\"compositionstart\", this.handleInputCompositionStart);\n input.addEventListener(\"compositionend\", this.handleInputCompositionEnd);\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 next = this.readActiveValueForCommit();\n if (!next.ok) return;\n this.commitEdit(rowId, colKey, next.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 === \"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 next = this.readActiveValueForCommit();\n if (!next.ok) return;\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n });\n }\n\n private cancelEdit(cell: HTMLElement) {\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) {\n this.teardownInput(false);\n cell.blur();\n return;\n }\n\n const { rowId, colKey } = ac;\n const orig =\n this.activeOriginalValue &&\n this.activeOriginalValue.rowId === rowId &&\n this.activeOriginalValue.colKey === colKey\n ? this.activeOriginalValue.value\n : this.dataModel.getCell(rowId, colKey);\n\n const current = this.dataModel.getCell(rowId, colKey);\n const norm = (v: unknown) => (v === null || v === undefined ? \"\" : v);\n const normalizedOrig = norm(orig);\n const normalizedCurrent = norm(current);\n\n // If something committed/changed during this edit session (e.g. due to a validation path),\n // revert it back to the original value. Otherwise, do not emit any command.\n if (!Object.is(normalizedCurrent, normalizedOrig)) {\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next: normalizedOrig,\n prev: normalizedCurrent,\n };\n this.onEdit(cmd, true);\n }\n\n this.teardownInput(false);\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 this.activeOriginalValue = null;\n this.composing = false;\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 | \"int\"\n | \"uint\"\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 /**\n * Format token for number display.\n * - \"decimal\": normal decimal formatting (default)\n * - \"scientific\": scientific notation\n * - other strings are reserved for future/custom formatters\n */\n format?: string;\n};\n\nexport type IntegerFormat = {\n thousandSeparator?: boolean;\n negativeRed?: boolean;\n /**\n * Format token for integer display.\n * - \"decimal\": normal decimal formatting (default)\n * - \"binary\" | \"octal\" | \"hex\": prefixed base literals\n * - other strings are reserved for future/custom formatters\n */\n format?: string;\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 \"int\" | \"uint\"\n ? IntegerFormat\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","resolveCellAddress","dataModel","address","schema","rows","resolveByIndex","rowIndex","colIndex","row","col","resolveByKeys","rowId","colKey","c","LockManager","mode","server","user","currentRowId","keepRowId","toUnlock","rowIds","e","V","n","s","J","r","R","D","K","z","i","a","l","u","P","k","f","B","G","H","U","Y","q","X","Q","Z","_","ee","te","ne","se","re","ie","oe","ae","ue","le","ce","fe","de","me","he","ge","pe","xe","ye","be","Se","je","ke","we","Ne","Ie","Te","Me","T","Ae","ve","Le","Ee","We","Ce","Oe","$e","x","y","M","w","Fe","Pe","A","v","N","Ve","Je","Re","De","Ke","m","L","ze","Be","I","Ge","He","Ue","Ye","qe","Xe","Qe","Ze","_e","et","tt","E","j","W","nt","st","rt","it","ot","b","S","C","O","at","ut","lt","$","o","ct","F","ft","dt","h","mt","ht","d","gt","pt","normalizeRange","range","coerceToTime","value","coerceToDate","getFillHandleSource","ranges","width","height","makeFillValueGetter","source","langs","seed","registry","createBuiltInRegistry","numbers","seq","inferSequence","cache","done","offsetFromEnd","next","dates","strings","FILL_HANDLE_VISUAL_SIZE_PX","FILL_HANDLE_HIT_SIZE_PX","getFillHandleRect","cellRect","size","isPointInRect","rect","shouldShowFillHandle","activeRowId","activeColKey","editMode","src","CANVAS_FONT_FAMILY","CANVAS_FONT_SIZE_PX","getColumnSortDir","view","hasActiveColumnFilter","vf","diag","svgFunnel","svgArrow","dir","drawDiagnosticCorner","ctx","level","color","ValueFormatCache","options","key","fmt","cached","parsed","parseIsoDate","drawFunnelIcon","alpha","drawSortArrowIcon","resolveTagValues","obj","values","FenwickTree","count","res","index0","delta","target","total","idx","bit","acc","step","nextAcc","HTMLRenderer","DEFAULT_ROW_HEIGHT_PX","ROW_HEADER_WIDTH_PX","root","_state","scrollContainer","prevTop","prevLeft","colWidths","getColumnWidths","colBaseStyles","columnFormatToStyle","colBaseCss","styleToCssText","totalWidth","body","entry","removeFromParent","event","corner","rowHeader","cell","tagRemove","indexStr","tagIndex","actionEl","kind","thead","tr","rowTh","th","sortDir","hasFilter","wrap","label","btn","index","td","isPending","condRes","cellStyle","hasTextColor","css","baseStyle","withCond","mergeStyle","merged","forCss","raw","valueRes","textOverride","formatted","interaction","tagValues","isActionType","actionValue","resolveButtonAction","resolveLinkAction","actionLabel","getButtonLabel","getLinkLabel","list","tag","chip","remove","marker","align","rawNumbered","toRawValue","rawStr","maxHeight","text","version","measure","measureHost","CELL_PADDING_TOP_PX","CELL_PADDING_BOTTOM_PX","isAll","el","startRow","endRow","startCol","endCol","rowEl","cells","tags","num","formatNumberForEdit","opts","token","formatIntegerWithPrefix","fmtValue","coerceDatePattern","formatDateLite","_CanvasRenderer","getEditMode","HEADER_HEIGHT_PX","ev","viewportX","viewportY","xCursor","iconSize","iconLeft","iconTop","actionHit","nextKey","maxDim","state","baseFont","selectAll","fontCache","wrapAny","cacheKey","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","isGlobalReadonly","hasExplicitTextColor","formulaReadonlyColor","isBoolean","isCustomBoolean","fontKey","weight","textAreaX","CELL_PADDING_X_PX","textAreaY","textAreaW","textAreaH","decorations","actionBounds","right","bottom","bw","bh","actionKey","isHover","isActive","xHeader","iconBox","ix","iy","yTop","xLeft","existing","heights","idToIndex","measuredVersion","cachedHeight","prev","wraps","widths","task","measured","start","headerHeight","accumHeight","topPx","rowTop","hit","ital","bounds","pad","rootRect","maxW","maxH","side","tRect","clientX","clientY","prevKey","prevIcon","nextIcon","changed","cursor","sameCell","sameMessage","nextHoverKey","handleRect","rawLines","lines","line","current","cut","firstKey","maxLines","minX","maxX","minY","maxY","lineWidth","startX","lineTop","lineBottom","fontBackup","totalTextHeight","baseY","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","ac","currentText","input","isMac","isTab","isEnter","isArrow","extend","wasSameCell","isSecondClick","maxRow","maxCol","activeRowIndex","activeColIndex","nextRanges","clamp","max","desiredColKey","baseIndex","fallbackRow","nextRow","nextRange","colType","initial","toast","inset","maxLeft","maxTop","minLeft","minTop","candidateLeft","candidateTop","message","variant","durationMs","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","cb","raf2","getValue","commitNow","offset","cellCount","copyViaClipboardApi","item","copyViaFallbackInput","fallback","first","normalized","rowIdx","colIdx","linkAction","buttonAction","htmlRows","tableStyle","htmlCells","fromHtml","trimmed","table","trs","parseNumericText","coerced","coerceNumericForColumn","ta","allowCustom","select","empty","opt","op","listId","datalist","normalizeNumericInput","style","lineHeight","wrapper","insetX","insetTop","insetBottom","linkValue","nextValues","href","link","isRow","targetRange","anchorRow","anchorCol","anchorCell","sorted","sameCols","sameRows","rowsTouch","colsTouch","initialValue","control","isCheckbox","end","now","isTextarea","isAltEnter","commitAndMove","orig","norm","normalizedOrig","normalizedCurrent","clearActive","defineSchema","ExtableCore","init","defaultData","initialData","DataModel","classes","toArray","ua","shell","viewport","anyRO","force","host","action","_colKey","classNames","data","wasLoaded","rowIdOrIndex","found","pending","vv","rowData","position","insertAt","baseIdx","newId","removed","cmds","toKinds","seen","kinds","labelFor","commandCount","toSteps","groups","forcedId","handler","commands","error","msg","afterApply","touched","snapshots","snap","pop","actions","act","hr","viewportWidth","targetIndex","effective","applied","pendingCommands","pendingCommandCount","pendingCellCount","keys","validationErrors","diagnosticErrors","ar","br","bc","activeErrors","listener","errorsEqual","bt","activeValueRes","activeCondRes","activeTextOverride","activeValueRaw","activeValueDisplay","activeValueType","diagnostic","activeStyles","columnStyle","resolved","resolveCellStyles","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","sort","filtered","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,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,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,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,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,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EA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"}