{"version":3,"sources":["../src/utils.ts","../src/sortingFns.ts","../src/filterFns.ts","../src/core/resolvers.ts","../src/core/column.ts","../src/core/editCommitHooks.ts","../src/core/headers.ts","../src/events/EventEmitter.ts","../src/i18n/en.ts","../src/i18n/locales.ts","../src/features/keyboardNavigation.ts","../src/features/clipboard.ts","../src/features/selection.ts","../src/features/commits/CommitError.ts","../src/features/commits/coordinator.ts","../src/features/undoRedo.ts","../src/features/fillHandle.ts","../src/features/grouping.ts","../src/features/formulas/parser.ts","../src/features/formulas/functions.ts","../src/features/formulas/evaluator.ts","../src/features/formulas/cellRef.ts","../src/features/formulas/engine.ts","../src/core/table.ts","../src/features/fullRowEditing.ts"],"names":["aggregationFns","range","rowsById","rows","createRow","getCellValue","options","safeData","getTreeRowModel","createRowDragIntegration","getPivotRowModel","result"],"mappings":"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","file":"chunk-Y32CVU65.cjs","sourcesContent":["// @zvndev/yable-core — Core utility functions\n\nimport type { RowData, Updater, DeepKeys, DeepValue, ColumnDef } from './types'\n\n// ---------------------------------------------------------------------------\n// State Updater\n// ---------------------------------------------------------------------------\n\nexport function functionalUpdate<T>(updater: Updater<T>, input: T): T {\n  return typeof updater === 'function' ? (updater as (prev: T) => T)(input) : updater\n}\n\n// ---------------------------------------------------------------------------\n// Memoisation\n// ---------------------------------------------------------------------------\n\n/**\n * Lightweight memo — returns a function that caches its result.\n * Re-computes only when `getDeps()` returns different values (shallow compare).\n */\nexport function memo<TResult>(\n  getDeps: () => any[],\n  fn: (...deps: any[]) => TResult,\n  opts?: {\n    key?: string\n    debug?: () => boolean\n    onChange?: (result: TResult) => void\n  },\n): () => TResult {\n  let deps: any[] | undefined\n  let result: TResult | undefined\n\n  return () => {\n    const newDeps = getDeps()\n    const depsChanged =\n      !deps || newDeps.length !== deps.length || newDeps.some((dep, i) => dep !== deps![i])\n\n    if (depsChanged) {\n      if (opts?.debug?.()) {\n        const depChanges = newDeps.map((dep, i) => ({\n          old: deps?.[i],\n          new: dep,\n          changed: deps ? dep !== deps[i] : true,\n        }))\n        console.info(`[yable:memo] '${opts.key}' deps changed:`, depChanges)\n      }\n\n      deps = newDeps\n      result = fn(...newDeps)\n      opts?.onChange?.(result!)\n    }\n\n    return result!\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Deep Key Accessor\n// ---------------------------------------------------------------------------\n\n/**\n * Maximum depth allowed when walking a dot-notation accessor path.\n * Protects against accidentally pathological keys like \"a.b.c.d.e.f.g...\"\n * that would walk the row object indefinitely.\n */\nexport const MAX_ACCESSOR_DEPTH = 32\n\n/** Keys that must never be traversed during deep property access. */\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\n/**\n * Access a deeply-nested value from an object using dot-notation key.\n * e.g. `getDeepValue(row, 'address.city')` → `row.address.city`\n *\n * Paths deeper than `MAX_ACCESSOR_DEPTH` segments are rejected with a\n * console.error and `undefined` is returned, to prevent runaway walks.\n *\n * Path segments matching `__proto__`, `constructor`, or `prototype` are\n * blocked to prevent prototype-pollution attacks.\n */\nexport function getDeepValue<T, K extends DeepKeys<T>>(obj: T, key: K): DeepValue<T, K> {\n  const path = key as string\n  const parts = path.split('.')\n  if (parts.length > MAX_ACCESSOR_DEPTH) {\n    console.error(`[yable] accessor path too deep (>${MAX_ACCESSOR_DEPTH} segments): ${path}`)\n    return undefined as DeepValue<T, K>\n  }\n  let current: unknown = obj\n  for (const part of parts) {\n    if (UNSAFE_KEYS.has(part)) return undefined as DeepValue<T, K>\n    if (current == null) return undefined as DeepValue<T, K>\n    current = (current as Record<string, unknown>)[part]\n  }\n  return current as DeepValue<T, K>\n}\n\n// ---------------------------------------------------------------------------\n// Column ID Resolution\n// ---------------------------------------------------------------------------\n\nexport function resolveColumnId<TData extends RowData>(columnDef: ColumnDef<TData, any>): string {\n  if (columnDef.id) return columnDef.id\n  if ('accessorKey' in columnDef && columnDef.accessorKey) {\n    return typeof columnDef.accessorKey === 'string'\n      ? columnDef.accessorKey\n      : String(columnDef.accessorKey)\n  }\n  throw new Error('[yable E004] Column definitions must have an `id` or `accessorKey` property.')\n}\n\n// ---------------------------------------------------------------------------\n// Row ID Resolution\n// ---------------------------------------------------------------------------\n\nexport function resolveRowId<TData extends RowData>(\n  row: TData,\n  index: number,\n  getRowId?: (originalRow: TData, index: number, parent?: unknown) => string,\n  parent?: unknown,\n): string {\n  if (getRowId) return getRowId(row, index, parent)\n  return String(index)\n}\n\n// ---------------------------------------------------------------------------\n// Cell Value Accessor\n// ---------------------------------------------------------------------------\n\nexport function getCellValue<TData extends RowData>(\n  row: TData,\n  columnDef: ColumnDef<TData, any>,\n): unknown {\n  if ('accessorFn' in columnDef && columnDef.accessorFn) {\n    return columnDef.accessorFn(row, 0)\n  }\n  if ('accessorKey' in columnDef && columnDef.accessorKey) {\n    return getDeepValue(row, columnDef.accessorKey as DeepKeys<TData>)\n  }\n  return undefined\n}\n\n// ---------------------------------------------------------------------------\n// Shallow Comparison\n// ---------------------------------------------------------------------------\n\nexport function shallowEqual<T>(a: T, b: T): boolean {\n  if (Object.is(a, b)) return true\n  if (typeof a !== 'object' || typeof b !== 'object') return false\n  if (a === null || b === null) return false\n\n  const objA = a as Record<string, unknown>\n  const objB = b as Record<string, unknown>\n  const keysA = Object.keys(objA)\n  const keysB = Object.keys(objB)\n\n  if (keysA.length !== keysB.length) return false\n\n  for (const key of keysA) {\n    if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(objA[key], objB[key])) {\n      return false\n    }\n  }\n\n  return true\n}\n\n// ---------------------------------------------------------------------------\n// Array Utilities\n// ---------------------------------------------------------------------------\n\nexport function makeStateUpdater<K extends keyof any, V>(\n  key: K,\n  instance: {\n    setState: (updater: Updater<any>) => void\n    getState: () => any\n    options: { [P in `on${Capitalize<string & K>}Change`]?: (updater: Updater<V>) => void }\n  },\n): (updater: Updater<V>) => void {\n  return (updater: Updater<V>) => {\n    // Check if there's a direct onChange handler\n    const onChangeKey =\n      `on${String(key).charAt(0).toUpperCase()}${String(key).slice(1)}Change` as keyof typeof instance.options\n    const onChange = instance.options[onChangeKey] as ((updater: Updater<V>) => void) | undefined\n\n    if (onChange) {\n      onChange(updater)\n      return\n    }\n\n    // Otherwise update internal state\n    instance.setState((old: any) => ({\n      ...old,\n      [key]: functionalUpdate(updater, old[key]),\n    }))\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Misc Helpers\n// ---------------------------------------------------------------------------\n\n/** No-op function */\nexport const noop = () => {}\n\n/** Identity function */\nexport const identity = <T>(x: T): T => x\n\n/** Check if a value is a function */\nexport function isFunction(val: unknown): val is (...args: any[]) => any {\n  return typeof val === 'function'\n}\n\n/** Create a range [start..end) */\nexport function range(start: number, end: number): number[] {\n  const result: number[] = []\n  for (let i = start; i < end; i++) {\n    result.push(i)\n  }\n  return result\n}\n\n/** Flatten a tree of items that have children */\nexport function flattenBy<T>(items: T[], getChildren: (item: T) => T[]): T[] {\n  const result: T[] = []\n  const recurse = (list: T[]) => {\n    for (const item of list) {\n      result.push(item)\n      const children = getChildren(item)\n      if (children.length) recurse(children)\n    }\n  }\n  recurse(items)\n  return result\n}\n\n/** Unique values from an array */\nexport function uniqueBy<T, K>(arr: T[], getKey: (item: T) => K): T[] {\n  const seen = new Set<K>()\n  return arr.filter((item) => {\n    const key = getKey(item)\n    if (seen.has(key)) return false\n    seen.add(key)\n    return true\n  })\n}\n\n/** Clamp a number between min and max */\nexport function clamp(value: number, min: number, max: number): number {\n  return Math.min(Math.max(value, min), max)\n}\n","// @zvndev/yable-core — Built-in sorting functions\n\nimport type { RowData, Row, SortingFn } from './types'\n\nexport const sortingFns = {\n  alphanumeric: <TData extends RowData>(\n    rowA: Row<TData>,\n    rowB: Row<TData>,\n    columnId: string,\n  ): number => {\n    return compareAlphanumeric(toString(rowA.getValue(columnId)), toString(rowB.getValue(columnId)))\n  },\n\n  alphanumericCaseSensitive: <TData extends RowData>(\n    rowA: Row<TData>,\n    rowB: Row<TData>,\n    columnId: string,\n  ): number => {\n    return compareAlphanumeric(\n      toString(rowA.getValue(columnId)),\n      toString(rowB.getValue(columnId)),\n      false,\n    )\n  },\n\n  text: <TData extends RowData>(rowA: Row<TData>, rowB: Row<TData>, columnId: string): number => {\n    const a = toString(rowA.getValue(columnId)).toLowerCase()\n    const b = toString(rowB.getValue(columnId)).toLowerCase()\n    return a.localeCompare(b)\n  },\n\n  textCaseSensitive: <TData extends RowData>(\n    rowA: Row<TData>,\n    rowB: Row<TData>,\n    columnId: string,\n  ): number => {\n    const a = toString(rowA.getValue(columnId))\n    const b = toString(rowB.getValue(columnId))\n    return a.localeCompare(b)\n  },\n\n  datetime: <TData extends RowData>(\n    rowA: Row<TData>,\n    rowB: Row<TData>,\n    columnId: string,\n  ): number => {\n    const a = rowA.getValue<Date | string | number>(columnId)\n    const b = rowB.getValue<Date | string | number>(columnId)\n    return toDate(a).getTime() - toDate(b).getTime()\n  },\n\n  basic: <TData extends RowData>(rowA: Row<TData>, rowB: Row<TData>, columnId: string): number => {\n    const a = rowA.getValue(columnId)\n    const b = rowB.getValue(columnId)\n    return compareBasic(a as number | string, b as number | string)\n  },\n} as const satisfies Record<string, SortingFn<RowData>>\n\nexport type BuiltInSortingFn = keyof typeof sortingFns\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction toString(val: unknown): string {\n  if (val == null) return ''\n  if (typeof val === 'number') return String(val)\n  if (typeof val === 'boolean') return val ? '1' : '0'\n  return String(val)\n}\n\nfunction toDate(val: Date | string | number): Date {\n  if (val instanceof Date) return val\n  return new Date(val)\n}\n\nfunction compareBasic(a: number | string, b: number | string): number {\n  if (a === b) return 0\n  if (a > b) return 1\n  return -1\n}\n\n/**\n * Alphanumeric comparison that handles mixed text and numbers.\n * \"item2\" comes before \"item10\".\n */\nfunction compareAlphanumeric(a: string, b: string, caseInsensitive = true): number {\n  const aStr = caseInsensitive ? a.toLowerCase() : a\n  const bStr = caseInsensitive ? b.toLowerCase() : b\n\n  const reNum = /(\\d+)/\n  const aParts = aStr.split(reNum)\n  const bParts = bStr.split(reNum)\n\n  const len = Math.min(aParts.length, bParts.length)\n\n  for (let i = 0; i < len; i++) {\n    const aPart = aParts[i]!\n    const bPart = bParts[i]!\n\n    const aNum = parseInt(aPart, 10)\n    const bNum = parseInt(bPart, 10)\n\n    if (!isNaN(aNum) && !isNaN(bNum)) {\n      if (aNum !== bNum) return aNum - bNum\n    } else {\n      if (aPart !== bPart) return aPart.localeCompare(bPart)\n    }\n  }\n\n  return aParts.length - bParts.length\n}\n","// @zvndev/yable-core — Built-in filter functions\n\nimport type { RowData, Row, FilterFn } from './types'\n\nexport const filterFns = {\n  includesString: <TData extends RowData>(\n    row: Row<TData>,\n    columnId: string,\n    filterValue: unknown,\n  ): boolean => {\n    const value = String(row.getValue(columnId) ?? '').toLowerCase()\n    return value.includes(String(filterValue ?? '').toLowerCase())\n  },\n\n  includesStringSensitive: <TData extends RowData>(\n    row: Row<TData>,\n    columnId: string,\n    filterValue: unknown,\n  ): boolean => {\n    const value = String(row.getValue(columnId) ?? '')\n    return value.includes(String(filterValue ?? ''))\n  },\n\n  equalsString: <TData extends RowData>(\n    row: Row<TData>,\n    columnId: string,\n    filterValue: unknown,\n  ): boolean => {\n    const value = String(row.getValue(columnId) ?? '').toLowerCase()\n    return value === String(filterValue ?? '').toLowerCase()\n  },\n\n  equalsStringSensitive: <TData extends RowData>(\n    row: Row<TData>,\n    columnId: string,\n    filterValue: unknown,\n  ): boolean => {\n    const value = String(row.getValue(columnId) ?? '')\n    return value === String(filterValue ?? '')\n  },\n\n  arrIncludes: <TData extends RowData>(\n    row: Row<TData>,\n    columnId: string,\n    filterValue: unknown,\n  ): boolean => {\n    const value = row.getValue<unknown[]>(columnId)\n    return Array.isArray(value) && value.includes(filterValue)\n  },\n\n  arrIncludesAll: <TData extends RowData>(\n    row: Row<TData>,\n    columnId: string,\n    filterValue: unknown,\n  ): boolean => {\n    const value = row.getValue<unknown[]>(columnId)\n    const arr = filterValue as unknown[]\n    return Array.isArray(value) && Array.isArray(arr) && arr.every((v) => value.includes(v))\n  },\n\n  arrIncludesSome: <TData extends RowData>(\n    row: Row<TData>,\n    columnId: string,\n    filterValue: unknown,\n  ): boolean => {\n    const value = row.getValue<unknown[]>(columnId)\n    const arr = filterValue as unknown[]\n    return Array.isArray(value) && Array.isArray(arr) && arr.some((v) => value.includes(v))\n  },\n\n  equals: <TData extends RowData>(\n    row: Row<TData>,\n    columnId: string,\n    filterValue: unknown,\n  ): boolean => {\n    return row.getValue(columnId) === filterValue\n  },\n\n  weakEquals: <TData extends RowData>(\n    row: Row<TData>,\n    columnId: string,\n    filterValue: unknown,\n  ): boolean => {\n    return row.getValue(columnId) == filterValue\n  },\n\n  inNumberRange: <TData extends RowData>(\n    row: Row<TData>,\n    columnId: string,\n    filterValue: unknown,\n  ): boolean => {\n    const value = row.getValue<number>(columnId)\n    const [min, max] = filterValue as [number | undefined, number | undefined]\n    if (value == null) return false\n    if (min != null && value < min) return false\n    if (max != null && value > max) return false\n    return true\n  },\n\n  inDateRange: <TData extends RowData>(\n    row: Row<TData>,\n    columnId: string,\n    filterValue: unknown,\n  ): boolean => {\n    const value = row.getValue<Date | string>(columnId)\n    if (value == null) return false\n    const date = value instanceof Date ? value : new Date(value)\n    const [min, max] = filterValue as [Date | string | undefined, Date | string | undefined]\n    if (min != null) {\n      const minDate = min instanceof Date ? min : new Date(min)\n      if (date < minDate) return false\n    }\n    if (max != null) {\n      const maxDate = max instanceof Date ? max : new Date(max)\n      if (date > maxDate) return false\n    }\n    return true\n  },\n} as const satisfies Record<string, FilterFn<RowData>>\n\nexport type BuiltInFilterFn = keyof typeof filterFns\n","// @zvndev/yable-core — Sort/Filter function resolvers\n// Factored out of table.ts to avoid circular imports (table -> column -> table).\n\nimport type { RowData, SortingFn, FilterFn } from '../types'\nimport { sortingFns } from '../sortingFns'\nimport { filterFns } from '../filterFns'\n\n/**\n * T1-04: Resolve a sorting function from a column definition.\n * Handles: named built-in string, custom function, or 'auto'.\n */\nexport function resolveSortingFn<TData extends RowData>(\n  sortingFnOption: string | SortingFn<TData> | undefined,\n  tableSortingFns?: Record<string, SortingFn<TData>>\n): SortingFn<TData> | undefined {\n  if (!sortingFnOption) return undefined\n  if (typeof sortingFnOption === 'function') return sortingFnOption\n  // Check table-level custom sorting fns\n  if (tableSortingFns?.[sortingFnOption]) return tableSortingFns[sortingFnOption]\n  // Check built-in sorting fns\n  if (sortingFnOption in sortingFns) {\n    return sortingFns[sortingFnOption as keyof typeof sortingFns] as SortingFn<TData>\n  }\n  return undefined\n}\n\n/**\n * T1-04: Resolve a filter function from a column definition.\n * Handles: named built-in string, custom function.\n */\nexport function resolveFilterFn<TData extends RowData>(\n  filterFnOption: string | FilterFn<TData> | undefined,\n  tableFilterFns?: Record<string, FilterFn<TData>>\n): FilterFn<TData> | undefined {\n  if (!filterFnOption) return undefined\n  if (typeof filterFnOption === 'function') return filterFnOption\n  // Check table-level custom filter fns\n  if (tableFilterFns?.[filterFnOption]) return tableFilterFns[filterFnOption]\n  // Check built-in filter fns\n  if (filterFnOption in filterFns) {\n    return filterFns[filterFnOption as keyof typeof filterFns] as FilterFn<TData>\n  }\n  return undefined\n}\n","// @zvndev/yable-core — Column Model\n\nimport type {\n  RowData,\n  Row,\n  RowModel,\n  Column,\n  ColumnDef,\n  ColumnDefExtensions,\n  Table,\n  ColumnPinningPosition,\n  SortingFn,\n  FilterFn,\n  AggregationFn,\n} from '../types'\nimport { resolveColumnId, memo, MAX_ACCESSOR_DEPTH } from '../utils'\nimport { resolveSortingFn, resolveFilterFn } from './resolvers'\nimport { sortingFns } from '../sortingFns'\nimport { filterFns } from '../filterFns'\nimport { aggregationFns } from '../aggregationFns'\n\n// ---------------------------------------------------------------------------\n// Helper: safely access ColumnDefExtensions properties from a ColumnDef union\n// ---------------------------------------------------------------------------\n\n/**\n * Extract extension properties from a ColumnDef.\n * All four union variants include ColumnDefExtensions (GroupColumnDef uses Partial),\n * so casting to the extensions interface is safe for optional property reads.\n */\nfunction getExtensions<TData extends RowData, TValue>(\n  columnDef: ColumnDef<TData, TValue>,\n): Partial<ColumnDefExtensions<TData, TValue>> {\n  return columnDef as Partial<ColumnDefExtensions<TData, TValue>>\n}\n\nexport function createColumn<TData extends RowData, TValue = unknown>(\n  table: Table<TData>,\n  columnDef: ColumnDef<TData, TValue>,\n  depth: number,\n  parent?: Column<TData, unknown>,\n): Column<TData, TValue> {\n  const id = resolveColumnId(columnDef)\n  const ext = getExtensions(columnDef)\n\n  // One-shot guard so we don't spam the console on every getSize() call\n  // when a column def has invalid min/max bounds.\n  let warnedInvalidSizeBounds = false\n\n  const getFacetedRowModel = (): RowModel<TData> => {\n    const coreModel = table.getCoreRowModel()\n    if (table.options.manualFiltering) return coreModel\n\n    const columnFilters = table.getState().columnFilters.filter((filter) => filter.id !== id)\n    const globalFilter = table.getState().globalFilter\n\n    if (columnFilters.length === 0 && !globalFilter) return coreModel\n\n    let filtered = coreModel.rows\n\n    for (const filter of columnFilters) {\n      const filterColumn = table.getColumn(filter.id)\n      if (!filterColumn) continue\n\n      filtered = filtered.filter((row: Row<TData>) => {\n        const filterFn = filterColumn.getFilterFn()\n\n        if (filterFn) {\n          try {\n            return filterFn(row, filter.id, filter.value, () => {})\n          } catch (err) {\n            console.error(\n              `[yable E010] filterFn threw for column \"${filter.id}\", row \"${row.id}\":`,\n              err,\n            )\n            return true\n          }\n        }\n\n        const value = row.getValue(filter.id)\n        if (Array.isArray(filter.value)) {\n          return filter.value.some((candidate) => value === candidate)\n        }\n\n        return String(value ?? '')\n          .toLowerCase()\n          .includes(String(filter.value ?? '').toLowerCase())\n      })\n    }\n\n    if (globalFilter) {\n      const searchStr = String(globalFilter).toLowerCase()\n      filtered = filtered.filter((row: Row<TData>) => {\n        return table.getAllLeafColumns().some((candidateColumn: Column<TData, unknown>) => {\n          const value = row.getValue(candidateColumn.id)\n          return String(value ?? '')\n            .toLowerCase()\n            .includes(searchStr)\n        })\n      })\n    }\n\n    const rowsById: Record<string, Row<TData>> = {}\n    for (const row of filtered) {\n      rowsById[row.id] = row\n    }\n\n    return {\n      rows: filtered,\n      flatRows: filtered,\n      rowsById,\n    }\n  }\n\n  const column: Column<TData, TValue> = {\n    id,\n    columnDef,\n    depth,\n    parent,\n    columns: [],\n    accessorFn: undefined,\n\n    // Gets populated by features via createColumn hooks\n    getSize: () => {\n      const state = table.getState()\n      const sizing = state.columnSizing?.[id]\n      const raw = sizing ?? ext.size ?? 150\n\n      const min = ext.minSize\n      const max = ext.maxSize\n\n      // A user-set width may render up to `resizeMaxSize` (defaults to `maxSize`).\n      // Auto/stretch widths are already clamped to `maxSize` upstream (in\n      // `computeAutoColumnWidths`), so raising this render ceiling only affects\n      // widths a human dragged — it never lets auto-sizing exceed `maxSize`.\n      const resizeMax = typeof ext.resizeMaxSize === 'number' ? ext.resizeMaxSize : max\n\n      // Validate bounds: if a user accidentally sets minSize > maxSize the\n      // resulting clamp would silently flip the size. Warn once and resolve\n      // by treating minSize as the floor (i.e. min wins). This is documented\n      // so callers know which bound takes precedence on misconfiguration.\n      if (typeof min === 'number' && typeof max === 'number' && min > max) {\n        if (!warnedInvalidSizeBounds) {\n          warnedInvalidSizeBounds = true\n          console.warn(`[yable] column \"${id}\" has minSize (${min}) > maxSize (${max})`)\n        }\n      }\n\n      // Min wins on inversion against the resolved upper bound.\n      if (typeof min === 'number' && typeof resizeMax === 'number' && min > resizeMax) {\n        return Math.max(raw, min)\n      }\n\n      let resolved = raw\n      if (typeof min === 'number') resolved = Math.max(resolved, min)\n      if (typeof resizeMax === 'number') resolved = Math.min(resolved, resizeMax)\n      return resolved\n    },\n    getStart: (position?: ColumnPinningPosition) => {\n      // Cumulative sticky offset for a pinned column. Resolve the side from the\n      // explicit argument, falling back to the column's own pinned position.\n      const pos = position ?? column.getIsPinned()\n\n      if (pos === 'left') {\n        // Sum the widths of all left-pinned visible leaf columns BEFORE this one.\n        let offset = 0\n        for (const col of table.getLeftVisibleLeafColumns()) {\n          if (col.id === id) break\n          offset += col.getSize()\n        }\n        return offset\n      }\n\n      if (pos === 'right') {\n        // Sum the widths of all right-pinned visible leaf columns AFTER this one.\n        let offset = 0\n        let seen = false\n        for (const col of table.getRightVisibleLeafColumns()) {\n          if (col.id === id) {\n            seen = true\n            continue\n          }\n          if (seen) offset += col.getSize()\n        }\n        return offset\n      }\n\n      return 0\n    },\n    getAfter: () => 0,\n\n    getFlatColumns: memo(\n      () => [column.columns],\n      (subColumns: Column<TData, unknown>[]) => {\n        const result: Column<TData, unknown>[] = [column as Column<TData, unknown>]\n        for (const sub of subColumns) {\n          result.push(...sub.getFlatColumns())\n        }\n        return result\n      },\n      { key: `${id}_getFlatColumns` },\n    ),\n\n    getLeafColumns: memo(\n      () => [column.columns],\n      (subColumns: Column<TData, unknown>[]) => {\n        if (subColumns.length === 0) return [column as Column<TData, unknown>]\n        const result: Column<TData, unknown>[] = []\n        for (const sub of subColumns) {\n          result.push(...sub.getLeafColumns())\n        }\n        return result\n      },\n      { key: `${id}_getLeafColumns` },\n    ),\n\n    // Sorting\n    getIsSorted: () => {\n      const sorting = table.getState().sorting\n      const sort = sorting?.find((s) => s.id === id)\n      return sort ? (sort.desc ? 'desc' : 'asc') : false\n    },\n    getNextSortingOrder: () => {\n      const current = column.getIsSorted()\n      if (!current) return 'asc'\n      if (current === 'asc') return 'desc'\n      return false\n    },\n    getCanSort: () => {\n      return ext.enableSorting !== false\n    },\n    getCanMultiSort: () => {\n      return true\n    },\n    getSortIndex: () => {\n      const sorting = table.getState().sorting\n      return sorting?.findIndex((s) => s.id === id) ?? -1\n    },\n\n    // T1-04: Wire sortingFn from column def\n    getSortingFn: (): SortingFn<TData> => {\n      const resolved = resolveSortingFn<TData>(\n        ext.sortingFn as string | SortingFn<TData> | undefined,\n        table.options.sortingFns,\n      )\n      if (resolved) return resolved\n\n      // Auto-detect: fall back to built-in 'auto' which uses alphanumeric\n      return column.getAutoSortingFn()\n    },\n\n    getAutoSortingFn: (): SortingFn<TData> => {\n      // Default to alphanumeric sorting\n      return sortingFns.alphanumeric as SortingFn<TData>\n    },\n\n    getAutoSortDir: () => {\n      return 'asc'\n    },\n    clearSorting: () => {\n      table.setSorting((old) => old.filter((s) => s.id !== id))\n    },\n    toggleSorting: (desc?: boolean, isMulti?: boolean) => {\n      // Header-click path (no explicit direction, single-sort): cycle through\n      // the 3-state order none -> asc -> desc -> (removed | back to asc).\n      // Removal on the final step is gated by `enableSortingRemoval`; when it is\n      // falsy the column toggles between asc and desc only. Explicit-desc and\n      // multi-sort callers keep their existing set/append semantics below.\n      if (desc === undefined && !isMulti) {\n        table.setSorting((old) => {\n          const existing = old.find((s) => s.id === id)\n          if (!existing) return [{ id, desc: false }]\n          if (!existing.desc) return [{ id, desc: true }]\n          if (table.options.enableSortingRemoval) {\n            return old.filter((s) => s.id !== id)\n          }\n          return [{ id, desc: false }]\n        })\n        return\n      }\n\n      table.setSorting((old) => {\n        const existing = old.find((s) => s.id === id)\n        const resolvedDesc = desc ?? (existing ? !existing.desc : false)\n\n        if (isMulti) {\n          if (existing) {\n            return old.map((s) => (s.id === id ? { ...s, desc: resolvedDesc } : s))\n          }\n          return [...old, { id, desc: resolvedDesc }]\n        }\n\n        return [{ id, desc: resolvedDesc }]\n      })\n    },\n    getToggleSortingHandler: () => {\n      if (!column.getCanSort()) return undefined\n      return (e: unknown) => {\n        const isMulti =\n          e && typeof e === 'object' && 'shiftKey' in e\n            ? !!(e as { shiftKey: boolean }).shiftKey\n            : false\n        column.toggleSorting(undefined, isMulti)\n      }\n    },\n\n    // Filtering\n    getIsFiltered: () => {\n      const filters = table.getState().columnFilters\n      return filters?.some((f) => f.id === id) ?? false\n    },\n    getFilterValue: () => {\n      const filters = table.getState().columnFilters\n      return filters?.find((f) => f.id === id)?.value\n    },\n    setFilterValue: (value: unknown) => {\n      table.setColumnFilters((old) => {\n        const existing = old.find((f) => f.id === id)\n        if (existing) {\n          if (value === undefined || value === '') {\n            return old.filter((f) => f.id !== id)\n          }\n          return old.map((f) => (f.id === id ? { ...f, value } : f))\n        }\n        if (value === undefined || value === '') return old\n        return [...old, { id, value }]\n      })\n    },\n    getCanFilter: () => {\n      return ext.enableColumnFilter !== false\n    },\n    getCanGlobalFilter: () => {\n      return ext.enableGlobalFilter !== false\n    },\n\n    // T1-04: Wire filterFn from column def\n    getFilterFn: (): FilterFn<TData> | undefined => {\n      return resolveFilterFn<TData>(\n        ext.filterFn as string | FilterFn<TData> | undefined,\n        table.options.filterFns,\n      )\n    },\n\n    getAutoFilterFn: (): FilterFn<TData> | undefined => {\n      // Default to includesString filter\n      return filterFns.includesString as FilterFn<TData>\n    },\n\n    getFilterIndex: () => {\n      const filters = table.getState().columnFilters\n      return filters?.findIndex((f) => f.id === id) ?? -1\n    },\n\n    // Visibility\n    getIsVisible: () => {\n      const visibility = table.getState().columnVisibility\n      return visibility?.[id] !== false\n    },\n    getCanHide: () => {\n      return ext.enableHiding !== false\n    },\n    toggleVisibility: (value?: boolean) => {\n      const resolved = value ?? !column.getIsVisible()\n\n      // If hiding (resolved === false), check guards\n      if (resolved === false) {\n        // lockVisible: column-level lock prevents hiding\n        if (ext.lockVisible) return\n\n        // suppressDragHidesColumns: prevent hiding during active column drag\n        // Default is true when not explicitly set\n        const suppress = table.options.suppressDragHidesColumns !== false\n        if (suppress && table.getIsColumnDragActive()) return\n      }\n\n      table.setColumnVisibility((old) => ({\n        ...old,\n        [id]: resolved,\n      }))\n    },\n    getToggleVisibilityHandler: () => {\n      return (_e: unknown) => {\n        column.toggleVisibility()\n      }\n    },\n\n    // Pinning\n    getIsPinned: () => {\n      const pinning = table.getState().columnPinning\n      if (pinning?.left?.includes(id)) return 'left'\n      if (pinning?.right?.includes(id)) return 'right'\n      return false\n    },\n    getCanPin: () => {\n      return ext.enablePinning !== false\n    },\n    pin: (position: ColumnPinningPosition) => {\n      table.setColumnPinning((old) => {\n        const left = (old.left ?? []).filter((c) => c !== id)\n        const right = (old.right ?? []).filter((c) => c !== id)\n        if (position === 'left') left.push(id)\n        if (position === 'right') right.push(id)\n        return { left, right }\n      })\n    },\n    getPinnedIndex: () => {\n      const pinning = table.getState().columnPinning\n      const position = column.getIsPinned()\n      if (!position) return -1\n      const list = position === 'left' ? pinning.left : pinning.right\n      return list?.indexOf(id) ?? -1\n    },\n\n    // Resizing\n    getCanResize: () => {\n      return ext.enableResizing !== false\n    },\n    getIsResizing: () => {\n      return table.getState().columnSizingInfo?.isResizingColumn === id\n    },\n    resetSize: () => {\n      table.setColumnSizing((old) => {\n        const next = { ...old }\n        delete next[id]\n        return next\n      })\n    },\n\n    // Reordering\n    getCanReorder: () => {\n      // Disabled by an explicit per-column opt-out, or by the table option,\n      // or for placeholder/group columns (no leaf id to reorder).\n      if (ext.enableReorder === false) return false\n      if (table.options.enableColumnReorder === false) return false\n      return true\n    },\n\n    // Faceting\n    getFacetedRowModel,\n    getFacetedUniqueValues: () => {\n      const facetedRows = getFacetedRowModel().rows\n      const values = new Map<unknown, number>()\n\n      for (const row of facetedRows) {\n        const value = row.getValue(id)\n        if (Array.isArray(value)) {\n          for (const item of value) {\n            values.set(item, (values.get(item) ?? 0) + 1)\n          }\n          continue\n        }\n        values.set(value, (values.get(value) ?? 0) + 1)\n      }\n\n      return values\n    },\n    getFacetedMinMaxValues: () => {\n      const facetedRows = getFacetedRowModel().rows\n      let min: number | undefined\n      let max: number | undefined\n\n      for (const row of facetedRows) {\n        const value = row.getValue<number | string>(id)\n        const numeric = typeof value === 'number' ? value : Number(value)\n        if (!Number.isFinite(numeric)) continue\n        min = min == null ? numeric : Math.min(min, numeric)\n        max = max == null ? numeric : Math.max(max, numeric)\n      }\n\n      return min == null || max == null ? undefined : [min, max]\n    },\n\n    // Grouping\n    getIsGrouped: () => {\n      return table.getState().grouping?.includes(id) ?? false\n    },\n    getGroupedIndex: () => {\n      return table.getState().grouping?.indexOf(id) ?? -1\n    },\n    getCanGroup: () => {\n      return ext.enableGrouping !== false\n    },\n    toggleGrouping: () => {\n      table.setGrouping((old) => {\n        if (old.includes(id)) return old.filter((g) => g !== id)\n        return [...old, id]\n      })\n    },\n    getAutoAggregationFn: () => undefined,\n    getAggregationFn: (): AggregationFn<TData> | undefined => {\n      const agg = columnDef.aggregationFn\n      if (!agg) return undefined\n      if (typeof agg === 'function') return agg as AggregationFn<TData>\n      const fn = (aggregationFns as Record<string, AggregationFn<RowData>>)[agg as string]\n      return fn as AggregationFn<TData> | undefined\n    },\n  }\n\n  // Set up accessor function\n  if ('accessorFn' in columnDef && columnDef.accessorFn) {\n    column.accessorFn = columnDef.accessorFn\n  } else if ('accessorKey' in columnDef && columnDef.accessorKey) {\n    const key = columnDef.accessorKey as string\n    const parts = key.split('.')\n    const tooDeep = parts.length > MAX_ACCESSOR_DEPTH\n    if (tooDeep) {\n      console.error(`[yable] accessor path too deep (>${MAX_ACCESSOR_DEPTH} segments): ${key}`)\n    }\n    column.accessorFn = (row: TData) => {\n      if (tooDeep) return undefined as unknown as TValue\n      let value: unknown = row\n      for (const part of parts) {\n        if (value == null) return undefined as unknown as TValue\n        value = (value as Record<string, unknown>)[part]\n      }\n      return value as TValue\n    }\n  }\n\n  return column\n}\n","// @zvndev/yable-core — per-column editConfig.commit dispatch\n//\n// Shared by every commit path (single-cell `stopEdit`, full-row\n// `commitRowEdit`, and `commitAllPending`) so a column's `editConfig.commit`\n// fires exactly once per committed cell, regardless of how the commit was\n// triggered.\n\nimport type { RowData, Table, Row, ColumnDefExtensions } from '../types'\n\n/**\n * Fire each committed cell's per-column `editConfig.commit(row, value)` hook.\n *\n * @param table   The table instance.\n * @param changes Committed values, keyed `{ [rowId]: { [columnId]: value } }`\n *                — the same shape as the `onEditCommit` payload.\n */\nexport function fireColumnCommitHooks<TData extends RowData>(\n  table: Table<TData>,\n  changes: Record<string, Record<string, unknown>>,\n): void {\n  for (const rowId of Object.keys(changes)) {\n    const cells = changes[rowId]\n    if (!cells) continue\n\n    // Resolve the (pre-commit) row lazily and once per row — only when at least\n    // one of its columns actually defines a commit hook.\n    let row: Row<TData> | undefined\n    let rowResolved = false\n\n    for (const columnId of Object.keys(cells)) {\n      const column = table.getColumn(columnId)\n      if (!column) continue\n\n      const editConfig = (\n        column.columnDef as typeof column.columnDef & Partial<ColumnDefExtensions<TData>>\n      ).editConfig\n      const commit = editConfig?.commit\n      if (!commit) continue\n\n      if (!rowResolved) {\n        try {\n          row = table.getRow(rowId, true)\n        } catch {\n          row = undefined\n        }\n        rowResolved = true\n      }\n      if (row) commit(row, cells[columnId])\n    }\n  }\n}\n","// @zvndev/yable-core — Header Group Model\n\nimport type { RowData, Header, HeaderGroup, HeaderContext, Column, Table } from '../types'\n\nfunction clampColumnSize<TData extends RowData, TValue>(\n  column: Column<TData, TValue>,\n  size: number,\n): number {\n  const { minSize, maxSize, resizeMaxSize } = column.columnDef\n  let next = Math.max(size, 30)\n\n  // User drag-resize is capped by `resizeMaxSize` (defaults to `maxSize`), so a\n  // column can be given a `maxSize` for auto-size discipline while still being\n  // draggable past it. `maxSize` continues to cap auto-sizing/stretch elsewhere.\n  const resizeMax = typeof resizeMaxSize === 'number' ? resizeMaxSize : maxSize\n\n  if (typeof minSize === 'number') next = Math.max(next, minSize)\n  if (typeof resizeMax === 'number' && !(typeof minSize === 'number' && minSize > resizeMax)) {\n    next = Math.min(next, resizeMax)\n  }\n\n  return next\n}\n\nfunction resolveResizeSizes<TData extends RowData>(\n  leafColumns: Column<TData, unknown>[],\n  startSizes: Map<string, number>,\n  delta: number,\n): Record<string, number> {\n  if (leafColumns.length === 0) return {}\n  if (leafColumns.length === 1) {\n    const column = leafColumns[0]!\n    return {\n      [column.id]: clampColumnSize(column, (startSizes.get(column.id) ?? column.getSize()) + delta),\n    }\n  }\n\n  const totalStart = leafColumns.reduce(\n    (sum, column) => sum + (startSizes.get(column.id) ?? column.getSize()),\n    0,\n  )\n  const next: Record<string, number> = {}\n\n  for (const column of leafColumns) {\n    const startSize = startSizes.get(column.id) ?? column.getSize()\n    const share = totalStart > 0 ? startSize / totalStart : 1 / leafColumns.length\n    next[column.id] = clampColumnSize(column, startSize + delta * share)\n  }\n\n  return next\n}\n\nexport function createHeader<TData extends RowData, TValue = unknown>(\n  table: Table<TData>,\n  column: Column<TData, TValue>,\n  opts: {\n    id?: string\n    index: number\n    depth: number\n    isPlaceholder?: boolean\n    placeholderId?: string\n    colSpan: number\n    rowSpan: number\n    headerGroup: HeaderGroup<TData>\n    subHeaders: Header<TData, unknown>[]\n  },\n): Header<TData, TValue> {\n  const id = opts.id ?? column.id\n\n  const header: Header<TData, TValue> = {\n    id,\n    column,\n    index: opts.index,\n    depth: opts.depth,\n    isPlaceholder: opts.isPlaceholder ?? false,\n    placeholderId: opts.placeholderId,\n    colSpan: opts.colSpan,\n    rowSpan: opts.rowSpan,\n    headerGroup: opts.headerGroup,\n    subHeaders: opts.subHeaders,\n\n    getSize: () => {\n      // Sum of all leaf column sizes for this header\n      const leafColumns = column.getLeafColumns()\n      return leafColumns.reduce((sum, col) => sum + col.getSize(), 0)\n    },\n\n    getStart: () => {\n      return column.getStart()\n    },\n\n    getContext: (): HeaderContext<TData, TValue> => ({\n      table,\n      header,\n      column,\n    }),\n\n    getLeafHeaders: () => {\n      const leaves: Header<TData, unknown>[] = []\n      const recurse = (h: Header<TData, unknown>) => {\n        if (h.subHeaders.length === 0) {\n          leaves.push(h)\n        } else {\n          for (const sub of h.subHeaders) {\n            recurse(sub)\n          }\n        }\n      }\n      recurse(header as Header<TData, unknown>)\n      return leaves\n    },\n\n    getResizeHandler: () => {\n      if (!column.getCanResize()) return undefined\n\n      return (event: unknown) => {\n        const e = event as MouseEvent | TouchEvent\n        const startX =\n          'touches' in e ? (e as TouchEvent).touches[0]!.clientX : (e as MouseEvent).clientX\n        const startSize = header.getSize()\n        const resizeMode = table.options.columnResizeMode ?? 'onChange'\n        const directionMultiplier = table.options.columnResizeDirection === 'rtl' ? -1 : 1\n        const leafColumns = header\n          .getLeafHeaders()\n          .map((leaf) => leaf.column)\n          .filter((leafColumn) => leafColumn.getCanResize())\n        const startSizes = new Map(\n          leafColumns.map((leafColumn) => [leafColumn.id, leafColumn.getSize()]),\n        )\n\n        const applySizing = (delta: number) => {\n          const nextSizes = resolveResizeSizes(leafColumns, startSizes, delta)\n          table.setColumnSizing((old) => ({\n            ...old,\n            ...nextSizes,\n          }))\n        }\n\n        const onMove = (moveEvent: MouseEvent | TouchEvent) => {\n          moveEvent.preventDefault()\n          const currentX =\n            'touches' in moveEvent\n              ? (moveEvent as TouchEvent).touches[0]!.clientX\n              : (moveEvent as MouseEvent).clientX\n          const delta = (currentX - startX) * directionMultiplier\n\n          table.setColumnSizingInfo((old) => ({\n            ...old,\n            deltaOffset: delta,\n            deltaPercentage: startSize > 0 ? delta / startSize : 0,\n          }))\n\n          if (resizeMode === 'onChange') {\n            applySizing(delta)\n          }\n        }\n\n        const onEnd = (endEvent?: MouseEvent | TouchEvent) => {\n          document.removeEventListener('mousemove', onMove)\n          document.removeEventListener('mouseup', onEnd)\n          document.removeEventListener('touchmove', onMove as EventListener)\n          document.removeEventListener('touchend', onEnd)\n\n          if (resizeMode === 'onEnd') {\n            let delta = table.getState().columnSizingInfo.deltaOffset ?? 0\n            if (endEvent) {\n              const currentX =\n                'changedTouches' in endEvent\n                  ? (endEvent as TouchEvent).changedTouches[0]?.clientX\n                  : (endEvent as MouseEvent).clientX\n              if (typeof currentX === 'number') {\n                delta = (currentX - startX) * directionMultiplier\n              }\n            }\n            applySizing(delta)\n          }\n\n          table.setColumnSizingInfo((old) => ({\n            ...old,\n            isResizingColumn: false,\n          }))\n        }\n\n        table.setColumnSizingInfo((old) => ({\n          ...old,\n          isResizingColumn: column.id,\n          startOffset: startX,\n          startSize,\n          deltaOffset: 0,\n          deltaPercentage: 0,\n          columnSizingStart: leafColumns.map((leafColumn) => [\n            leafColumn.id,\n            startSizes.get(leafColumn.id) ?? leafColumn.getSize(),\n          ]),\n        }))\n\n        document.addEventListener('mousemove', onMove)\n        document.addEventListener('mouseup', onEnd)\n        document.addEventListener('touchmove', onMove as EventListener)\n        document.addEventListener('touchend', onEnd)\n      }\n    },\n  }\n\n  return header\n}\n\nexport function buildHeaderGroups<TData extends RowData>(\n  table: Table<TData>,\n  allColumns: Column<TData, unknown>[],\n): HeaderGroup<TData>[] {\n  // Build leaf-level header group first\n  const maxDepth = allColumns.reduce((max, col) => Math.max(max, col.depth), 0)\n\n  const headerGroups: HeaderGroup<TData>[] = []\n\n  // Apply user-controlled column order. The order list may not include every\n  // column (e.g. saved before a new column was added), so unknown ids fall to\n  // the end in their original definition order.\n  const order = table.getState().columnOrder\n  const sortByOrder = (cols: Column<TData, unknown>[]) => {\n    if (!order || order.length === 0) return cols\n    const orderMap = new Map<string, number>(order.map((id, i) => [id, i]))\n    return [...cols].sort((a, b) => {\n      const ai = orderMap.get(a.id) ?? Infinity\n      const bi = orderMap.get(b.id) ?? Infinity\n      return ai - bi\n    })\n  }\n\n  // For simple flat columns (no groups), just create one header group\n  if (maxDepth === 0) {\n    const headerGroup: HeaderGroup<TData> = {\n      id: '0',\n      depth: 0,\n      headers: [],\n    }\n\n    headerGroup.headers = sortByOrder(allColumns)\n      .filter((col) => col.getIsVisible())\n      .map((column, index) =>\n        createHeader(table, column, {\n          index,\n          depth: 0,\n          colSpan: 1,\n          rowSpan: 1,\n          headerGroup,\n          subHeaders: [],\n        }),\n      )\n\n    headerGroups.push(headerGroup)\n  } else {\n    // Multi-level headers — walk from root to leaves\n    for (let depth = 0; depth <= maxDepth; depth++) {\n      const headerGroup: HeaderGroup<TData> = {\n        id: String(depth),\n        depth,\n        headers: [],\n      }\n\n      const columnsAtDepth = allColumns.filter((col) => col.depth === depth)\n\n      headerGroup.headers = columnsAtDepth\n        .filter((col) => col.getIsVisible() || col.columns.length > 0)\n        .map((column, index) =>\n          createHeader(table, column, {\n            index,\n            depth,\n            colSpan: column.getLeafColumns().filter((l) => l.getIsVisible()).length,\n            rowSpan: column.columns.length ? 1 : maxDepth - depth + 1,\n            headerGroup,\n            subHeaders: [],\n          }),\n        )\n\n      headerGroups.push(headerGroup)\n    }\n  }\n\n  return headerGroups\n}\n","// @zvndev/yable-core — Typed Event Emitter\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- interfaces without index signatures (e.g. YableEventMap) don't satisfy Record<string, unknown>\nexport class EventEmitterImpl<TEventMap extends Record<string, any>> {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- handler variance: Set stores typed handlers keyed by event name\n  private listeners = new Map<keyof TEventMap, Set<(payload: any) => void>>()\n\n  on<K extends keyof TEventMap>(event: K, handler: (payload: TEventMap[K]) => void): () => void {\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, new Set())\n    }\n    this.listeners.get(event)!.add(handler)\n\n    // Return unsubscribe function\n    return () => this.off(event, handler)\n  }\n\n  off<K extends keyof TEventMap>(event: K, handler: (payload: TEventMap[K]) => void): void {\n    this.listeners.get(event)?.delete(handler)\n  }\n\n  emit<K extends keyof TEventMap>(event: K, payload: TEventMap[K]): void {\n    const handlers = this.listeners.get(event)\n    if (!handlers) return\n    for (const handler of handlers) {\n      handler(payload)\n    }\n  }\n\n  removeAllListeners(event?: keyof TEventMap): void {\n    if (event) {\n      this.listeners.delete(event)\n    } else {\n      this.listeners.clear()\n    }\n  }\n}\n","// @zvndev/yable-core — Default English Locale\n\nexport interface YableLocale {\n  // Pagination\n  paginationOf: string\n  paginationRows: string\n  paginationNoResults: string\n  paginationFirstPage: string\n  paginationLastPage: string\n  paginationPreviousPage: string\n  paginationNextPage: string\n  paginationPage: string\n\n  // Search / Filter\n  searchPlaceholder: string\n  searchAriaLabel: string\n  filterEquals: string\n  filterContains: string\n  filterStartsWith: string\n  filterEndsWith: string\n  filterEmpty: string\n  filterNotEmpty: string\n  filterBetween: string\n  clearFilter: string\n  clearAllFilters: string\n\n  // Sorting\n  sortAscending: string\n  sortDescending: string\n  sortClear: string\n\n  // Selection\n  selectAll: string\n  selectRow: string\n  selectedCount: string\n\n  // Column menu\n  columnMenuPin: string\n  columnMenuPinLeft: string\n  columnMenuPinRight: string\n  columnMenuUnpin: string\n  columnMenuHide: string\n  columnMenuAutoSize: string\n  columnMenuResetSize: string\n\n  // Context menu\n  contextMenuCopy: string\n  contextMenuCut: string\n  contextMenuPaste: string\n  contextMenuExport: string\n  contextMenuExportCsv: string\n  contextMenuExportJson: string\n\n  // Status bar\n  statusBarTotal: string\n  statusBarFiltered: string\n  statusBarSelected: string\n\n  // Empty states\n  emptyNoData: string\n  emptyNoResults: string\n  emptyNoDataDetail: string\n  emptyNoResultsDetail: string\n\n  // Loading\n  loadingText: string\n\n  // Sidebar\n  sidebarColumns: string\n  sidebarFilters: string\n  sidebarSearchColumns: string\n  sidebarShowAll: string\n  sidebarHideAll: string\n\n  // Print\n  printTitle: string\n\n  // Misc\n  close: string\n  apply: string\n  cancel: string\n  reset: string\n}\n\nexport const en: YableLocale = {\n  // Pagination\n  paginationOf: 'of',\n  paginationRows: 'rows',\n  paginationNoResults: 'No results',\n  paginationFirstPage: 'First page',\n  paginationLastPage: 'Last page',\n  paginationPreviousPage: 'Previous page',\n  paginationNextPage: 'Next page',\n  paginationPage: 'Page',\n\n  // Search / Filter\n  searchPlaceholder: 'Search...',\n  searchAriaLabel: 'Search table',\n  filterEquals: 'Equals',\n  filterContains: 'Contains',\n  filterStartsWith: 'Starts with',\n  filterEndsWith: 'Ends with',\n  filterEmpty: 'Is empty',\n  filterNotEmpty: 'Is not empty',\n  filterBetween: 'Between',\n  clearFilter: 'Clear filter',\n  clearAllFilters: 'Clear all filters',\n\n  // Sorting\n  sortAscending: 'Sort ascending',\n  sortDescending: 'Sort descending',\n  sortClear: 'Clear sort',\n\n  // Selection\n  selectAll: 'Select all',\n  selectRow: 'Select row',\n  selectedCount: 'selected',\n\n  // Column menu\n  columnMenuPin: 'Pin column',\n  columnMenuPinLeft: 'Pin left',\n  columnMenuPinRight: 'Pin right',\n  columnMenuUnpin: 'Unpin',\n  columnMenuHide: 'Hide column',\n  columnMenuAutoSize: 'Auto-size',\n  columnMenuResetSize: 'Reset size',\n\n  // Context menu\n  contextMenuCopy: 'Copy',\n  contextMenuCut: 'Cut',\n  contextMenuPaste: 'Paste',\n  contextMenuExport: 'Export',\n  contextMenuExportCsv: 'Export as CSV',\n  contextMenuExportJson: 'Export as JSON',\n\n  // Status bar\n  statusBarTotal: 'Total',\n  statusBarFiltered: 'Filtered',\n  statusBarSelected: 'Selected',\n\n  // Empty states\n  emptyNoData: 'No data',\n  emptyNoResults: 'No results found',\n  emptyNoDataDetail: 'There are no rows to display.',\n  emptyNoResultsDetail: 'Try adjusting your search or filter criteria.',\n\n  // Loading\n  loadingText: 'Loading...',\n\n  // Sidebar\n  sidebarColumns: 'Columns',\n  sidebarFilters: 'Filters',\n  sidebarSearchColumns: 'Search columns...',\n  sidebarShowAll: 'Show all',\n  sidebarHideAll: 'Hide all',\n\n  // Print\n  printTitle: 'Print',\n\n  // Misc\n  close: 'Close',\n  apply: 'Apply',\n  cancel: 'Cancel',\n  reset: 'Reset',\n}\n","// @zvndev/yable-core — Locale System\n// Provides default English locale with the ability to override any string.\n\nimport { en, type YableLocale } from './en'\n\n/** Deep partial type for locale overrides */\nexport type PartialLocale = Partial<YableLocale>\n\n/** Current resolved locale */\nlet _currentLocale: YableLocale = { ...en }\n\n/**\n * Merge a partial locale with the default English locale.\n * Only provided keys are overridden; everything else stays English.\n */\nexport function createLocale(overrides: PartialLocale): YableLocale {\n  return { ...en, ...overrides }\n}\n\n/**\n * Set the global default locale. Affects all tables that don't specify\n * their own locale.\n */\nexport function setDefaultLocale(overrides: PartialLocale): void {\n  _currentLocale = createLocale(overrides)\n}\n\n/**\n * Get the current default locale.\n */\nexport function getDefaultLocale(): YableLocale {\n  return _currentLocale\n}\n\n/**\n * Reset the locale to default English.\n */\nexport function resetLocale(): void {\n  _currentLocale = { ...en }\n}\n\nexport type { YableLocale }\n","// @zvndev/yable-core — Keyboard Navigation Feature\n// Focused-cell state helpers plus spreadsheet-style navigation rules.\n\nimport { clamp } from '../utils'\nimport type {\n  Column,\n  KeyboardNavigationAction,\n  KeyboardNavigationCell,\n  Row,\n  RowData,\n  Table,\n} from '../types'\n\nexport interface ResolvedKeyboardNavigationCell<TData extends RowData> {\n  cell: KeyboardNavigationCell\n  row: Row<TData>\n  column: Column<TData, unknown>\n}\n\nfunction getRowsAndColumns<TData extends RowData>(\n  table: Table<TData>,\n): {\n  rows: Row<TData>[]\n  columns: Column<TData, unknown>[]\n} {\n  return {\n    rows: table.getRowModel().rows,\n    columns: table.getVisibleLeafColumns(),\n  }\n}\n\nexport function getFirstKeyboardCell<TData extends RowData>(\n  table: Table<TData>,\n): KeyboardNavigationCell | null {\n  const { rows, columns } = getRowsAndColumns(table)\n  if (rows.length === 0 || columns.length === 0) return null\n  return { rowIndex: 0, columnIndex: 0 }\n}\n\nexport function getLastKeyboardCell<TData extends RowData>(\n  table: Table<TData>,\n): KeyboardNavigationCell | null {\n  const { rows, columns } = getRowsAndColumns(table)\n  if (rows.length === 0 || columns.length === 0) return null\n  return {\n    rowIndex: rows.length - 1,\n    columnIndex: columns.length - 1,\n  }\n}\n\nexport function normalizeFocusedCell<TData extends RowData>(\n  table: Table<TData>,\n  cell: KeyboardNavigationCell | null | undefined,\n): KeyboardNavigationCell | null {\n  if (!cell) return null\n\n  const { rows, columns } = getRowsAndColumns(table)\n  if (rows.length === 0 || columns.length === 0) return null\n\n  return {\n    rowIndex: clamp(cell.rowIndex, 0, rows.length - 1),\n    columnIndex: clamp(cell.columnIndex, 0, columns.length - 1),\n  }\n}\n\nexport function getResolvedFocusedCell<TData extends RowData>(\n  table: Table<TData>,\n  cell: KeyboardNavigationCell | null | undefined,\n): ResolvedKeyboardNavigationCell<TData> | null {\n  const normalized = normalizeFocusedCell(table, cell)\n  if (!normalized) return null\n\n  const { rows, columns } = getRowsAndColumns(table)\n  const row = rows[normalized.rowIndex]\n  const column = columns[normalized.columnIndex]\n\n  if (!row || !column) return null\n\n  return {\n    cell: normalized,\n    row,\n    column,\n  }\n}\n\nexport function getCellPositionByIds<TData extends RowData>(\n  table: Table<TData>,\n  rowId: string,\n  columnId: string,\n): KeyboardNavigationCell | null {\n  const { rows, columns } = getRowsAndColumns(table)\n  const rowIndex = rows.findIndex((row) => row.id === rowId)\n  const columnIndex = columns.findIndex((column) => column.id === columnId)\n\n  if (rowIndex < 0 || columnIndex < 0) return null\n\n  return { rowIndex, columnIndex }\n}\n\nexport function canCellEnterEditMode<TData extends RowData>(\n  table: Table<TData>,\n  row: Row<TData>,\n  column: Column<TData, unknown>,\n): boolean {\n  if (table.options.enableCellEditing === false) return false\n\n  const def = column.columnDef as {\n    editable?: boolean | ((row: Row<TData>) => boolean)\n    editConfig?: unknown\n  }\n\n  const editable = def.editable\n  if (typeof editable === 'function') {\n    return editable(row)\n  }\n\n  // Infer editable: true when editConfig is present and editable is not explicitly false\n  if (editable === undefined && def.editConfig != null) {\n    return true\n  }\n\n  return !!editable\n}\n\nfunction getInitialFocusedCell<TData extends RowData>(\n  table: Table<TData>,\n  action: KeyboardNavigationAction,\n): KeyboardNavigationCell | null {\n  if (action.type === 'tab' && action.shiftKey) {\n    return getLastKeyboardCell(table)\n  }\n\n  if (action.type === 'end' && action.ctrlKey) {\n    return getLastKeyboardCell(table)\n  }\n\n  return getFirstKeyboardCell(table)\n}\n\nfunction getDisplayValue<TData extends RowData>(\n  table: Table<TData>,\n  row: Row<TData>,\n  column: Column<TData, unknown>,\n): unknown {\n  const pending = table.getPendingValue(row.id, column.id)\n  if (pending !== undefined) return pending\n  return row.getValue(column.id)\n}\n\nfunction isEmptyValue(value: unknown): boolean {\n  if (value == null) return true\n  if (typeof value === 'string') return value.trim() === ''\n  return false\n}\n\nfunction getBoundaryCell<TData extends RowData>(\n  table: Table<TData>,\n  current: KeyboardNavigationCell,\n  direction: 'up' | 'down' | 'left' | 'right',\n): KeyboardNavigationCell | null {\n  const { rows, columns } = getRowsAndColumns(table)\n  if (rows.length === 0 || columns.length === 0) return null\n\n  const vertical = direction === 'up' || direction === 'down'\n  const step = direction === 'up' || direction === 'left' ? -1 : 1\n  const currentRow = rows[current.rowIndex]\n  const currentColumn = columns[current.columnIndex]\n\n  if (!currentRow || !currentColumn) return null\n\n  const currentValue = getDisplayValue(table, currentRow, currentColumn)\n  const currentEmpty = isEmptyValue(currentValue)\n\n  let lastIndex = vertical ? current.rowIndex : current.columnIndex\n  let nextIndex = lastIndex + step\n  const maxIndex = vertical ? rows.length - 1 : columns.length - 1\n\n  while (nextIndex >= 0 && nextIndex <= maxIndex) {\n    const rowIndex = vertical ? nextIndex : current.rowIndex\n    const columnIndex = vertical ? current.columnIndex : nextIndex\n    const row = rows[rowIndex]\n    const column = columns[columnIndex]\n\n    if (!row || !column) break\n\n    const empty = isEmptyValue(getDisplayValue(table, row, column))\n\n    if (currentEmpty) {\n      if (!empty) {\n        return { rowIndex, columnIndex }\n      }\n\n      lastIndex = nextIndex\n      nextIndex += step\n      continue\n    }\n\n    if (empty) {\n      return vertical\n        ? { rowIndex: lastIndex, columnIndex: current.columnIndex }\n        : { rowIndex: current.rowIndex, columnIndex: lastIndex }\n    }\n\n    lastIndex = nextIndex\n    nextIndex += step\n  }\n\n  return vertical\n    ? { rowIndex: lastIndex, columnIndex: current.columnIndex }\n    : { rowIndex: current.rowIndex, columnIndex: lastIndex }\n}\n\nexport function getNextFocusedCell<TData extends RowData>(\n  table: Table<TData>,\n  current: KeyboardNavigationCell | null | undefined,\n  action: KeyboardNavigationAction,\n): KeyboardNavigationCell | null {\n  const base = normalizeFocusedCell(table, current) ?? getInitialFocusedCell(table, action)\n  if (!base) return null\n\n  const { rows, columns } = getRowsAndColumns(table)\n  if (rows.length === 0 || columns.length === 0) return null\n\n  switch (action.type) {\n    case 'arrow':\n      if (action.ctrlKey) {\n        return getBoundaryCell(table, base, action.direction)\n      }\n\n      if (action.direction === 'up') {\n        return normalizeFocusedCell(table, {\n          rowIndex: base.rowIndex - 1,\n          columnIndex: base.columnIndex,\n        })\n      }\n\n      if (action.direction === 'down') {\n        return normalizeFocusedCell(table, {\n          rowIndex: base.rowIndex + 1,\n          columnIndex: base.columnIndex,\n        })\n      }\n\n      if (action.direction === 'left') {\n        return normalizeFocusedCell(table, {\n          rowIndex: base.rowIndex,\n          columnIndex: base.columnIndex - 1,\n        })\n      }\n\n      return normalizeFocusedCell(table, {\n        rowIndex: base.rowIndex,\n        columnIndex: base.columnIndex + 1,\n      })\n\n    case 'tab': {\n      const flatIndex = base.rowIndex * columns.length + base.columnIndex\n      const nextFlatIndex = action.shiftKey ? flatIndex - 1 : flatIndex + 1\n      const clampedFlatIndex = clamp(nextFlatIndex, 0, rows.length * columns.length - 1)\n\n      return {\n        rowIndex: Math.floor(clampedFlatIndex / columns.length),\n        columnIndex: clampedFlatIndex % columns.length,\n      }\n    }\n\n    case 'home':\n      if (action.ctrlKey) {\n        return getFirstKeyboardCell(table)\n      }\n\n      return {\n        rowIndex: base.rowIndex,\n        columnIndex: 0,\n      }\n\n    case 'end':\n      if (action.ctrlKey) {\n        return getLastKeyboardCell(table)\n      }\n\n      return {\n        rowIndex: base.rowIndex,\n        columnIndex: columns.length - 1,\n      }\n\n    case 'page': {\n      const pageDelta = action.direction === 'down' ? action.pageSize : -action.pageSize\n      return normalizeFocusedCell(table, {\n        rowIndex: base.rowIndex + pageDelta,\n        columnIndex: base.columnIndex,\n      })\n    }\n  }\n}\n","// @zvndev/yable-core — Clipboard Feature\n// Copy (Ctrl+C), Cut (Ctrl+X), Paste (Ctrl+V) with configurable delimiters.\n\nimport type { RowData, Table, Row, Column, ColumnDefExtensions } from '../types'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SerializeOptions {\n  /** Column delimiter. Default: '\\t' */\n  delimiter: string\n  /** Row delimiter. Default: '\\n' */\n  rowDelimiter: string\n  /** Include column headers as first row. Default: false */\n  includeHeaders: boolean\n}\n\nexport interface ParseOptions {\n  /** Column delimiter. Default: '\\t' */\n  delimiter: string\n  /** Row delimiter. Default: '\\n' */\n  rowDelimiter: string\n}\n\n// ---------------------------------------------------------------------------\n// Serialize cells to clipboard text (TSV by default)\n// ---------------------------------------------------------------------------\n\n/**\n * Converts rows and columns into a delimited string suitable for clipboard.\n * By default uses tab-separated values for Excel compatibility.\n */\nexport function serializeCells<TData extends RowData>(\n  rows: Row<TData>[],\n  columns: Column<TData, unknown>[],\n  options: SerializeOptions,\n): string {\n  const { delimiter, rowDelimiter, includeHeaders } = options\n  const lines: string[] = []\n\n  // Optional header row\n  if (includeHeaders) {\n    const headerLine = columns\n      .map((col) => {\n        const header = typeof col.columnDef.header === 'string' ? col.columnDef.header : col.id\n        return escapeDelimited(header, delimiter)\n      })\n      .join(delimiter)\n    lines.push(headerLine)\n  }\n\n  // Data rows\n  for (const row of rows) {\n    const cellValues = columns.map((col) => {\n      const value = row.getValue(col.id)\n      return escapeDelimited(formatCellValue(value), delimiter)\n    })\n    lines.push(cellValues.join(delimiter))\n  }\n\n  return lines.join(rowDelimiter)\n}\n\n// ---------------------------------------------------------------------------\n// Parse clipboard text into 2D array\n// ---------------------------------------------------------------------------\n\n/**\n * Parses a delimited text string (typically from clipboard) into a 2D array\n * of string values.\n */\nexport function parseClipboardText(text: string, options: ParseOptions): string[][] {\n  const { delimiter, rowDelimiter } = options\n\n  if (!text || text.trim() === '') return []\n\n  const rows = text.split(rowDelimiter)\n\n  // Remove trailing empty row (common with clipboard)\n  if (rows.length > 0 && rows[rows.length - 1]!.trim() === '') {\n    rows.pop()\n  }\n\n  return rows.map((row) => {\n    // Handle quoted values (e.g., from Excel)\n    const cells: string[] = []\n    let current = ''\n    let inQuotes = false\n\n    for (let i = 0; i < row.length; i++) {\n      const char = row[i]!\n\n      if (inQuotes) {\n        if (char === '\"') {\n          // Check for escaped quote\n          if (i + 1 < row.length && row[i + 1] === '\"') {\n            current += '\"'\n            i++ // Skip next quote\n          } else {\n            inQuotes = false\n          }\n        } else {\n          current += char\n        }\n      } else {\n        if (char === '\"') {\n          inQuotes = true\n        } else if (char === delimiter || (delimiter === '\\t' && char === '\\t')) {\n          cells.push(current)\n          current = ''\n        } else {\n          current += char\n        }\n      }\n    }\n\n    cells.push(current)\n    return cells\n  })\n}\n\n// ---------------------------------------------------------------------------\n// Apply parsed clipboard data to target cells\n// ---------------------------------------------------------------------------\n\n/**\n * Applies a 2D array of values to the table starting from the target cell.\n * Returns the list of affected cells.\n */\nexport function applyCellPaste<TData extends RowData>(\n  table: Table<TData>,\n  data: string[][],\n  targetRowId: string,\n  targetColumnId: string,\n  rows: Row<TData>[],\n  columns: Column<TData, unknown>[],\n): { rowId: string; columnId: string; value: unknown }[] {\n  const pastedCells: { rowId: string; columnId: string; value: unknown }[] = []\n\n  // Find the starting position\n  const startRowIndex = rows.findIndex((r) => r.id === targetRowId)\n  const startColIndex = columns.findIndex((c) => c.id === targetColumnId)\n\n  if (startRowIndex === -1 || startColIndex === -1) return pastedCells\n\n  for (let rowOffset = 0; rowOffset < data.length; rowOffset++) {\n    const rowData = data[rowOffset]\n    if (!rowData) continue\n\n    const targetRowIndex = startRowIndex + rowOffset\n    if (targetRowIndex >= rows.length) break\n\n    const targetRow = rows[targetRowIndex]!\n\n    for (let colOffset = 0; colOffset < rowData.length; colOffset++) {\n      const targetColIndex = startColIndex + colOffset\n      if (targetColIndex >= columns.length) break\n\n      const targetCol = columns[targetColIndex]!\n      const value = rowData[colOffset]!\n\n      // Check if the column is editable\n      const editable = (targetCol.columnDef as Partial<ColumnDefExtensions<TData>>).editable\n      if (editable === false) continue\n\n      // Parse value based on column edit config\n      const editConfig = (targetCol.columnDef as Partial<ColumnDefExtensions<TData>>).editConfig\n      let parsedValue: unknown = value\n\n      if (editConfig?.parse) {\n        try {\n          parsedValue = editConfig.parse(value)\n        } catch {\n          parsedValue = value\n        }\n      } else if (editConfig?.type === 'number') {\n        const num = Number(value)\n        parsedValue = isNaN(num) ? value : num\n      }\n\n      table.setPendingValue(targetRow.id, targetCol.id, parsedValue)\n      pastedCells.push({\n        rowId: targetRow.id,\n        columnId: targetCol.id,\n        value: parsedValue,\n      })\n    }\n  }\n\n  return pastedCells\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatCellValue(value: unknown): string {\n  if (value == null) return ''\n  if (value instanceof Date) return value.toISOString()\n  return String(value)\n}\n\nfunction escapeDelimited(value: string, delimiter: string): string {\n  // If the value contains the delimiter, quotes, or newlines, wrap in quotes\n  if (\n    value.includes(delimiter) ||\n    value.includes('\"') ||\n    value.includes('\\n') ||\n    value.includes('\\r')\n  ) {\n    return `\"${value.replace(/\"/g, '\"\"')}\"`\n  }\n  return value\n}\n","// @zvndev/yable-core — Cell range selection helpers\n\nimport type { CellRange, KeyboardNavigationCell, RowData, Table } from '../types'\n\nexport interface NormalizedCellRange {\n  top: number\n  right: number\n  bottom: number\n  left: number\n}\n\nexport function createCellRange(\n  start: KeyboardNavigationCell,\n  end: KeyboardNavigationCell = start,\n): CellRange {\n  return { start, end }\n}\n\nexport function normalizeCellRange(range: CellRange): NormalizedCellRange {\n  return {\n    top: Math.min(range.start.rowIndex, range.end.rowIndex),\n    right: Math.max(range.start.columnIndex, range.end.columnIndex),\n    bottom: Math.max(range.start.rowIndex, range.end.rowIndex),\n    left: Math.min(range.start.columnIndex, range.end.columnIndex),\n  }\n}\n\nexport function getTopLeftCell(range: CellRange): KeyboardNavigationCell {\n  const normalized = normalizeCellRange(range)\n  return {\n    rowIndex: normalized.top,\n    columnIndex: normalized.left,\n  }\n}\n\nexport function isCellInRange(range: CellRange, rowIndex: number, columnIndex: number): boolean {\n  const normalized = normalizeCellRange(range)\n  return (\n    rowIndex >= normalized.top &&\n    rowIndex <= normalized.bottom &&\n    columnIndex >= normalized.left &&\n    columnIndex <= normalized.right\n  )\n}\n\nexport function isSingleCellRange(range: CellRange | null | undefined): boolean {\n  if (!range) return false\n  return (\n    range.start.rowIndex === range.end.rowIndex && range.start.columnIndex === range.end.columnIndex\n  )\n}\n\nexport function clampCellToTable<TData extends RowData>(\n  table: Table<TData>,\n  cell: KeyboardNavigationCell | null | undefined,\n): KeyboardNavigationCell | null {\n  if (!cell) return null\n\n  const rowCount = table.getRowModel().rows.length\n  const columnCount = table.getVisibleLeafColumns().length\n\n  if (rowCount === 0 || columnCount === 0) return null\n\n  return {\n    rowIndex: Math.min(Math.max(cell.rowIndex, 0), rowCount - 1),\n    columnIndex: Math.min(Math.max(cell.columnIndex, 0), columnCount - 1),\n  }\n}\n\nexport function getCellSelectionKey(range: CellRange | null, isDragging: boolean): string {\n  if (!range) return isDragging ? 'dragging:none' : 'none'\n\n  const normalized = normalizeCellRange(range)\n  return `${normalized.top}:${normalized.left}:${normalized.bottom}:${normalized.right}:${isDragging ? 'dragging' : 'idle'}`\n}\n","// @zvndev/yable-core — CommitError\n//\n// Throw from `onCommit` to put specific cells into the `error` state.\n// `throw new Error('msg')` puts ALL cells in the batch into error;\n// `throw new CommitError({...})` puts only the listed cells into error\n// and lets the rest succeed.\n\n/** rowId → colId → human-readable message */\nexport type CommitErrorCells = Record<string, Record<string, string>>\n\nexport class CommitError extends Error {\n  cells: CommitErrorCells\n\n  constructor(cells: CommitErrorCells, message?: string) {\n    super(message ?? '[yable E012] CommitError: handler threw or rejected')\n    this.name = 'CommitError'\n    this.cells = cells\n    // Maintain prototype chain across down-compilation\n    Object.setPrototypeOf(this, CommitError.prototype)\n  }\n}\n","// @zvndev/yable-core — CommitCoordinator\n//\n// Pure factory: takes a tiny store interface and returns the dispatch/settle\n// surface used by the table. Free of any Table<TData> dependency so it can\n// be unit-tested with a plain object literal store.\n//\n// Design rationale lives at:\n// docs/superpowers/specs/2026-04-07-data-update-patterns-design.md\n\nimport type { RowData } from '../../types'\nimport type { CommitsSlice, CommitRecord, CellPatch, CommitResult, OnCommitFn } from './types'\nimport { CommitError } from './CommitError'\n\n// ---------------------------------------------------------------------------\n// Store interface — implemented by table.ts in production, by test fixtures\n// in unit tests.\n// ---------------------------------------------------------------------------\n\nexport interface CommitStore {\n  getSlice: () => CommitsSlice\n  setSlice: (next: CommitsSlice) => void\n  /** Read the most-recent saved value for a cell (from rowData, NOT pending). */\n  getSavedValue: (rowId: string, columnId: string) => unknown\n  /** Read the full row snapshot. May return undefined if the row is gone. */\n  getRow: (rowId: string) => unknown\n  /** True if the row currently exists in the row model. */\n  rowExists: (rowId: string) => boolean\n}\n\nexport interface CoordinatorOptions {\n  /** Table-level commit handler. May be undefined. */\n  onCommit?: OnCommitFn<RowData>\n  /**\n   * Per-column commit override. Coordinator calls this to find a per-cell\n   * handler; if it returns undefined, the table-level `onCommit` is used.\n   */\n  resolveColumnCommit?: (columnId: string) => OnCommitFn<RowData> | undefined\n  /** Default 'failed'. */\n  rowCommitRetryMode?: 'failed' | 'batch'\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction shallowEqualValue(a: unknown, b: unknown): boolean {\n  if (Object.is(a, b)) return true\n  if (a == null || b == null) return false\n  if (typeof a !== 'object' || typeof b !== 'object') return false\n  const ak = Object.keys(a as object)\n  const bk = Object.keys(b as object)\n  if (ak.length !== bk.length) return false\n  for (const k of ak) {\n    if (!Object.is((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]))\n      return false\n  }\n  return true\n}\n\nfunction setCell(\n  slice: CommitsSlice,\n  rowId: string,\n  columnId: string,\n  next: CommitRecord,\n): CommitsSlice {\n  const cells = { ...slice.cells }\n  const row = { ...(cells[rowId] ?? {}) }\n  row[columnId] = next\n  cells[rowId] = row\n  return { ...slice, cells }\n}\n\nfunction deleteCell(slice: CommitsSlice, rowId: string, columnId: string): CommitsSlice {\n  if (!slice.cells[rowId]?.[columnId]) return slice\n  const cells = { ...slice.cells }\n  const row = { ...cells[rowId] }\n  delete row[columnId]\n  if (Object.keys(row).length === 0) {\n    delete cells[rowId]\n  } else {\n    cells[rowId] = row\n  }\n  return { ...slice, cells }\n}\n\n// ---------------------------------------------------------------------------\n// createCommitCoordinator\n// ---------------------------------------------------------------------------\n\nexport function createCommitCoordinator(store: CommitStore, opts: CoordinatorOptions) {\n  /** Allocate the next opId, mutating the slice via store.setSlice. */\n  function allocateOpId(): number {\n    const slice = store.getSlice()\n    const opId = slice.nextOpId\n    store.setSlice({ ...slice, nextOpId: opId + 1 })\n    return opId\n  }\n\n  /** Return the live record for a cell, or undefined. */\n  function getRecord(rowId: string, columnId: string): CommitRecord | undefined {\n    return store.getSlice().cells[rowId]?.[columnId]\n  }\n\n  /**\n   * Dispatch a batch of patches. Splits the batch by handler (table-level vs\n   * per-column override) and runs each split independently in parallel.\n   */\n  async function dispatch(incoming: Omit<CellPatch, 'signal' | 'row'>[]): Promise<void> {\n    if (incoming.length === 0) return\n\n    // Split by which handler will be used\n    const groups = new Map<OnCommitFn<RowData>, typeof incoming>()\n    for (const patch of incoming) {\n      const handler = opts.resolveColumnCommit?.(patch.columnId) ?? opts.onCommit\n      if (!handler) continue // No handler defined → silently no-op\n      const list = groups.get(handler) ?? []\n      list.push(patch)\n      groups.set(handler, list)\n    }\n\n    const tasks: Promise<void>[] = []\n    for (const [handler, patches] of groups) {\n      tasks.push(runOne(handler, patches))\n    }\n    await Promise.all(tasks)\n  }\n\n  async function runOne(\n    handler: OnCommitFn<RowData>,\n    incoming: Omit<CellPatch, 'signal' | 'row'>[],\n  ): Promise<void> {\n    // 1. Allocate one opId per cell. Each cell gets its own AbortController so\n    //    later edits to the same cell can abort the in-flight handler.\n    const opIds = new Map<string, number>() // `${rowId}:${colId}` → opId\n    const controllers = new Map<string, AbortController>()\n    for (const patch of incoming) {\n      // Abort any prior in-flight controller for this cell\n      const prior = getRecord(patch.rowId, patch.columnId)\n      prior?.abortController.abort()\n\n      const opId = allocateOpId()\n      const ctrl = new AbortController()\n      const key = `${patch.rowId}:${patch.columnId}`\n      opIds.set(key, opId)\n      controllers.set(key, ctrl)\n\n      const next: CommitRecord = {\n        status: 'pending',\n        pendingValue: patch.value,\n        previousValue: patch.previousValue,\n        opId,\n        abortController: ctrl,\n      }\n      store.setSlice(setCell(store.getSlice(), patch.rowId, patch.columnId, next))\n    }\n\n    // 2. Build the patches passed to the consumer (with row + signal).\n    const richPatches: CellPatch[] = incoming.map((p) => {\n      const key = `${p.rowId}:${p.columnId}`\n      return {\n        rowId: p.rowId,\n        columnId: p.columnId,\n        value: p.value,\n        previousValue: p.previousValue,\n        row: store.getRow(p.rowId) as RowData,\n        signal: controllers.get(key)!.signal,\n      }\n    })\n\n    // 3. Call the handler.\n    let result: CommitResult | undefined\n    let thrown: unknown\n    try {\n      result = (await handler(richPatches)) ?? undefined\n    } catch (err) {\n      thrown = err\n    }\n\n    // 4. Settle. Drop any cell whose opId no longer matches (it was overwritten\n    //    by a newer dispatch — the newer one owns the cell now).\n    for (const patch of incoming) {\n      const key = `${patch.rowId}:${patch.columnId}`\n      const myOpId = opIds.get(key)!\n      const live = getRecord(patch.rowId, patch.columnId)\n      if (!live || live.opId !== myOpId) continue // stale → drop\n\n      if (thrown) {\n        // Distinguish CommitError vs generic Error\n        if (thrown instanceof CommitError) {\n          const msg = thrown.cells[patch.rowId]?.[patch.columnId]\n          if (msg) {\n            // This cell is in the error map → mark error\n            store.setSlice(\n              setCell(store.getSlice(), patch.rowId, patch.columnId, {\n                ...live,\n                status: 'error',\n                errorMessage: msg,\n              }),\n            )\n          } else {\n            // This cell was in the batch but not the error map → succeeded\n            store.setSlice(deleteCell(store.getSlice(), patch.rowId, patch.columnId))\n          }\n        } else {\n          const msg = thrown instanceof Error ? thrown.message : String(thrown)\n          store.setSlice(\n            setCell(store.getSlice(), patch.rowId, patch.columnId, {\n              ...live,\n              status: 'error',\n              errorMessage: msg,\n            }),\n          )\n        }\n      } else {\n        // Success — apply optional resolved value, then clear\n        const resolved =\n          result && 'resolved' in result\n            ? result.resolved?.[patch.rowId]?.[patch.columnId]\n            : undefined\n        // Either way clear the entry. Auto-clear sweep handles the case\n        // where the consumer's data store hasn't yet caught up to the\n        // resolved value — it'll noop if pending == saved.\n        void resolved\n        store.setSlice(deleteCell(store.getSlice(), patch.rowId, patch.columnId))\n      }\n    }\n  }\n\n  /** Re-dispatch the patch from a single cell's stored record. */\n  async function retry(rowId: string, columnId: string): Promise<void> {\n    const live = getRecord(rowId, columnId)\n    if (!live) return\n    const previousValue = store.getSavedValue(rowId, columnId)\n    await dispatch([\n      {\n        rowId,\n        columnId,\n        value: live.pendingValue,\n        previousValue,\n      },\n    ])\n  }\n\n  function dismiss(rowId: string, columnId: string): void {\n    const live = getRecord(rowId, columnId)\n    if (!live) return\n    live.abortController.abort()\n    store.setSlice(deleteCell(store.getSlice(), rowId, columnId))\n  }\n\n  function dismissAll(): void {\n    const slice = store.getSlice()\n    for (const rowId of Object.keys(slice.cells)) {\n      for (const colId of Object.keys(slice.cells[rowId]!)) {\n        slice.cells[rowId]![colId]!.abortController.abort()\n      }\n    }\n    store.setSlice({ ...slice, cells: {} })\n  }\n\n  /**\n   * Sweep: clear non-pending cells whose pending value now matches the saved\n   * value (e.g. after a refetch). O(n) over commits.cells, NOT all rows.\n   */\n  function runAutoClearSweep(): void {\n    const slice = store.getSlice()\n    let next = slice\n    let changed = false\n    for (const rowId of Object.keys(slice.cells)) {\n      for (const colId of Object.keys(slice.cells[rowId]!)) {\n        const rec = slice.cells[rowId]![colId]!\n        if (rec.status === 'pending') continue\n        const saved = store.getSavedValue(rowId, colId)\n        if (shallowEqualValue(rec.pendingValue, saved)) {\n          next = deleteCell(next, rowId, colId)\n          changed = true\n        }\n      }\n    }\n    if (changed) store.setSlice(next)\n  }\n\n  /** GC entries for rows that no longer exist. */\n  function runOrphanedGc(): void {\n    const slice = store.getSlice()\n    let next = slice\n    let changed = false\n    for (const rowId of Object.keys(slice.cells)) {\n      if (!store.rowExists(rowId)) {\n        const cells = { ...next.cells }\n        // Abort all controllers in the orphaned row\n        for (const colId of Object.keys(cells[rowId]!)) {\n          cells[rowId]![colId]!.abortController.abort()\n        }\n        delete cells[rowId]\n        next = { ...next, cells }\n        changed = true\n      }\n    }\n    if (changed) store.setSlice(next)\n  }\n\n  /**\n   * Conflict detection sweep: a non-pending cell whose previousValue no\n   * longer matches the saved value (and whose pending value also doesn't\n   * match) is in conflict.\n   */\n  function runConflictDetection(): void {\n    const slice = store.getSlice()\n    let next = slice\n    let changed = false\n    for (const rowId of Object.keys(slice.cells)) {\n      for (const colId of Object.keys(slice.cells[rowId]!)) {\n        const rec = slice.cells[rowId]![colId]!\n        if (rec.status === 'pending') continue\n        const saved = store.getSavedValue(rowId, colId)\n        if (\n          !shallowEqualValue(rec.previousValue, saved) &&\n          !shallowEqualValue(rec.pendingValue, saved)\n        ) {\n          next = setCell(next, rowId, colId, {\n            ...rec,\n            status: 'conflict',\n            conflictWith: saved,\n          })\n          changed = true\n        }\n      }\n    }\n    if (changed) store.setSlice(next)\n  }\n\n  /** Read the merged render value: pending shadows saved when present. */\n  function getRenderValue(rowId: string, columnId: string): unknown {\n    const rec = getRecord(rowId, columnId)\n    if (rec) return rec.pendingValue\n    return store.getSavedValue(rowId, columnId)\n  }\n\n  function getCellStatus(\n    rowId: string,\n    columnId: string,\n  ): 'idle' | 'pending' | 'error' | 'conflict' {\n    return getRecord(rowId, columnId)?.status ?? 'idle'\n  }\n\n  return {\n    dispatch,\n    retry,\n    dismiss,\n    dismissAll,\n    runAutoClearSweep,\n    runOrphanedGc,\n    runConflictDetection,\n    getRenderValue,\n    getCellStatus,\n    getRecord,\n  }\n}\n\nexport type CommitCoordinator = ReturnType<typeof createCommitCoordinator>\n","// @zvndev/yable-core — Undo/Redo Feature\n// Configurable undo/redo stack for cell value changes.\n\nimport type { RowData, Table } from '../types'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UndoAction {\n  type: 'cell-edit'\n  rowId: string\n  columnId: string\n  oldValue: unknown\n  newValue: unknown\n  timestamp: number\n}\n\nexport interface UndoRedoState {\n  undoStack: UndoAction[]\n  redoStack: UndoAction[]\n  maxSize: number\n}\n\nexport interface UndoRedoOptions {\n  /** Maximum number of undo actions to keep. Default: 50 */\n  undoStackSize?: number\n  /** Enable undo/redo. Default: true when options are provided */\n  enableUndoRedo?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// UndoStack Class\n// ---------------------------------------------------------------------------\n\nexport class UndoStack {\n  private undoStack: UndoAction[] = []\n  private redoStack: UndoAction[] = []\n  private maxSize: number\n\n  constructor(maxSize: number = 50) {\n    this.maxSize = maxSize\n  }\n\n  push(action: UndoAction): void {\n    this.undoStack.push(action)\n\n    // Trim stack if it exceeds max size\n    if (this.undoStack.length > this.maxSize) {\n      this.undoStack = this.undoStack.slice(this.undoStack.length - this.maxSize)\n    }\n\n    // Clear redo stack on new action (standard undo/redo behavior)\n    this.redoStack = []\n  }\n\n  undo(): UndoAction | undefined {\n    const action = this.undoStack.pop()\n    if (action) {\n      this.redoStack.push(action)\n    }\n    return action\n  }\n\n  redo(): UndoAction | undefined {\n    const action = this.redoStack.pop()\n    if (action) {\n      this.undoStack.push(action)\n    }\n    return action\n  }\n\n  canUndo(): boolean {\n    return this.undoStack.length > 0\n  }\n\n  canRedo(): boolean {\n    return this.redoStack.length > 0\n  }\n\n  clear(): void {\n    this.undoStack = []\n    this.redoStack = []\n  }\n\n  getState(): UndoRedoState {\n    return {\n      undoStack: [...this.undoStack],\n      redoStack: [...this.redoStack],\n      maxSize: this.maxSize,\n    }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Integration helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an UndoStack instance and wires it into the table's setPendingValue\n * so that every cell edit is automatically tracked.\n */\nexport function createUndoRedoIntegration<TData extends RowData>(\n  table: Table<TData>,\n  options?: UndoRedoOptions,\n): {\n  undoStack: UndoStack\n  undo: () => void\n  redo: () => void\n  canUndo: () => boolean\n  canRedo: () => boolean\n  clearUndoHistory: () => void\n} {\n  const maxSize = options?.undoStackSize ?? 50\n  const stack = new UndoStack(maxSize)\n\n  // Store the original setPendingValue so we can wrap it\n  const originalSetPendingValue = table.setPendingValue.bind(table)\n\n  // Wrap setPendingValue to track undo actions\n  table.setPendingValue = (rowId: string, columnId: string, value: unknown) => {\n    // Capture old value before applying\n    const oldValue =\n      table.getPendingValue(rowId, columnId) ??\n      (() => {\n        try {\n          const row = table.getRow(rowId, true)\n          return row.getValue(columnId)\n        } catch {\n          return undefined\n        }\n      })()\n\n    // Push onto undo stack\n    stack.push({\n      type: 'cell-edit',\n      rowId,\n      columnId,\n      oldValue,\n      newValue: value,\n      timestamp: Date.now(),\n    })\n\n    // Call original\n    originalSetPendingValue(rowId, columnId, value)\n  }\n\n  const undo = () => {\n    const action = stack.undo()\n    if (!action) return\n\n    // Apply the old value\n    originalSetPendingValue(action.rowId, action.columnId, action.oldValue)\n\n    // Emit undo event\n    table.events.emit('undo', {\n      action,\n      state: stack.getState(),\n    })\n  }\n\n  const redo = () => {\n    const action = stack.redo()\n    if (!action) return\n\n    // Apply the new value\n    originalSetPendingValue(action.rowId, action.columnId, action.newValue)\n\n    // Emit redo event\n    table.events.emit('redo', {\n      action,\n      state: stack.getState(),\n    })\n  }\n\n  return {\n    undoStack: stack,\n    undo,\n    redo,\n    canUndo: () => stack.canUndo(),\n    canRedo: () => stack.canRedo(),\n    clearUndoHistory: () => stack.clear(),\n  }\n}\n","// @zvndev/yable-core — Fill Handle Feature\n// Drag corner to auto-fill cells with pattern detection.\n\nimport type { RowData, Table, Row, Column, ColumnDefExtensions } from '../types'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type FillPattern =\n  | { type: 'constant'; value: unknown }\n  | { type: 'sequence'; start: number; step: number }\n  | { type: 'date-sequence'; startMs: number; stepMs: number }\n  | { type: 'repeat'; values: unknown[] }\n\n// ---------------------------------------------------------------------------\n// Pattern Detection\n// ---------------------------------------------------------------------------\n\n/**\n * Detects the fill pattern from a list of source values.\n * Supports: sequential numbers, dates, repeating values, constant.\n */\nexport function detectPattern(values: unknown[]): FillPattern {\n  if (values.length === 0) {\n    return { type: 'constant', value: '' }\n  }\n\n  if (values.length === 1) {\n    const v = values[0]\n    // Single number: increment by 1\n    if (typeof v === 'number') {\n      return { type: 'sequence', start: v, step: 1 }\n    }\n    // Single date: increment by 1 day\n    if (v instanceof Date) {\n      return { type: 'date-sequence', startMs: v.getTime(), stepMs: 86400000 }\n    }\n    return { type: 'constant', value: v }\n  }\n\n  // Check if all values are numbers\n  const allNumbers = values.every((v) => typeof v === 'number' && !isNaN(v as number))\n  if (allNumbers) {\n    const nums = values as number[]\n    // Check for constant step\n    const step = nums[1]! - nums[0]!\n    const isArithmetic = nums.every((n, i) => {\n      if (i === 0) return true\n      return Math.abs(n - nums[i - 1]! - step) < 1e-10\n    })\n\n    if (isArithmetic) {\n      return { type: 'sequence', start: nums[0]!, step }\n    }\n  }\n\n  // Check if all values are numeric strings\n  const allNumericStrings = values.every(\n    (v) => typeof v === 'string' && v.trim() !== '' && !isNaN(Number(v)),\n  )\n  if (allNumericStrings) {\n    const nums = values.map((v) => Number(v))\n    const step = nums[1]! - nums[0]!\n    const isArithmetic = nums.every((n, i) => {\n      if (i === 0) return true\n      return Math.abs(n - nums[i - 1]! - step) < 1e-10\n    })\n\n    if (isArithmetic) {\n      return { type: 'sequence', start: nums[0]!, step }\n    }\n  }\n\n  // Check if all values are dates\n  const allDates = values.every((v) => v instanceof Date && !isNaN(v.getTime()))\n  if (allDates) {\n    const dates = values as Date[]\n    const stepMs = dates[1]!.getTime() - dates[0]!.getTime()\n    const isDateSequence = dates.every((d, i) => {\n      if (i === 0) return true\n      return Math.abs(d.getTime() - dates[i - 1]!.getTime() - stepMs) < 1000\n    })\n\n    if (isDateSequence) {\n      return { type: 'date-sequence', startMs: dates[0]!.getTime(), stepMs }\n    }\n  }\n\n  // Check if all values are date strings (YYYY-MM-DD)\n  const allDateStrings = values.every((v) => typeof v === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(v))\n  if (allDateStrings) {\n    const dates = (values as string[]).map((v) => new Date(v))\n    if (dates.every((d) => !isNaN(d.getTime())) && dates.length >= 2) {\n      const stepMs = dates[1]!.getTime() - dates[0]!.getTime()\n      return { type: 'date-sequence', startMs: dates[0]!.getTime(), stepMs }\n    }\n  }\n\n  // Check for repeating pattern\n  if (values.length >= 2) {\n    // Try pattern lengths from 1 to half the array\n    for (let patternLen = 1; patternLen <= Math.floor(values.length / 2); patternLen++) {\n      const pattern = values.slice(0, patternLen)\n      const isRepeating = values.every((v, i) => {\n        const expected = pattern[i % patternLen]\n        return String(v) === String(expected)\n      })\n\n      if (isRepeating) {\n        return { type: 'repeat', values: pattern }\n      }\n    }\n  }\n\n  // Default: repeat all values as a pattern\n  return { type: 'repeat', values: [...values] }\n}\n\n// ---------------------------------------------------------------------------\n// Generate Fill Values\n// ---------------------------------------------------------------------------\n\n/**\n * Generates fill values based on a detected pattern.\n *\n * @param pattern - The detected pattern\n * @param count - Number of values to generate\n * @param sourceLength - Number of source values used to detect the pattern\n */\nexport function generateFillValues(\n  pattern: FillPattern,\n  count: number,\n  sourceLength: number,\n): unknown[] {\n  const result: unknown[] = []\n\n  for (let i = 0; i < count; i++) {\n    switch (pattern.type) {\n      case 'constant':\n        result.push(pattern.value)\n        break\n\n      case 'sequence':\n        result.push(pattern.start + pattern.step * (sourceLength + i))\n        break\n\n      case 'date-sequence': {\n        const ms = pattern.startMs + pattern.stepMs * (sourceLength + i)\n        result.push(new Date(ms))\n        break\n      }\n\n      case 'repeat':\n        result.push(pattern.values[(sourceLength + i) % pattern.values.length])\n        break\n    }\n  }\n\n  return result\n}\n\n// ---------------------------------------------------------------------------\n// Fill Range Integration\n// ---------------------------------------------------------------------------\n\n/**\n * Fills a target range based on values in the source range, using pattern\n * detection. Returns the list of filled cells.\n */\nexport function detectAndFill<TData extends RowData>(\n  table: Table<TData>,\n  sourceRange: { startRow: number; startCol: number; endRow: number; endCol: number },\n  targetRange: { startRow: number; startCol: number; endRow: number; endCol: number },\n  rows: Row<TData>[],\n  columns: Column<TData, unknown>[],\n): { rowId: string; columnId: string; value: unknown }[] {\n  const filledCells: { rowId: string; columnId: string; value: unknown }[] = []\n\n  // Process each column in the range\n  const colStart = Math.min(sourceRange.startCol, targetRange.startCol)\n  const colEnd = Math.max(sourceRange.endCol, targetRange.endCol)\n\n  for (let colIdx = colStart; colIdx <= colEnd; colIdx++) {\n    if (colIdx >= columns.length) break\n    const column = columns[colIdx]!\n\n    // Check if column is editable\n    const editable = (\n      column.columnDef as typeof column.columnDef & Partial<ColumnDefExtensions<TData>>\n    ).editable\n    if (editable === false) continue\n\n    // Gather source values for this column\n    const sourceValues: unknown[] = []\n    for (let rowIdx = sourceRange.startRow; rowIdx <= sourceRange.endRow; rowIdx++) {\n      if (rowIdx >= rows.length) break\n      sourceValues.push(rows[rowIdx]!.getValue(column.id))\n    }\n\n    if (sourceValues.length === 0) continue\n\n    // Detect pattern\n    const pattern = detectPattern(sourceValues)\n\n    // Determine target rows (the rows NOT in the source range)\n    const targetRows: number[] = []\n    for (let rowIdx = targetRange.startRow; rowIdx <= targetRange.endRow; rowIdx++) {\n      if (rowIdx < sourceRange.startRow || rowIdx > sourceRange.endRow) {\n        targetRows.push(rowIdx)\n      }\n    }\n\n    if (targetRows.length === 0) continue\n\n    // Generate fill values\n    const fillValues = generateFillValues(pattern, targetRows.length, sourceValues.length)\n\n    // Apply values\n    for (let i = 0; i < targetRows.length; i++) {\n      const rowIdx = targetRows[i]!\n      if (rowIdx >= rows.length) break\n\n      const row = rows[rowIdx]!\n      let value = fillValues[i]\n\n      // Format dates back to string if source was string dates\n      if (value instanceof Date && typeof sourceValues[0] === 'string') {\n        value = value.toISOString().split('T')[0]\n      }\n\n      table.setPendingValue(row.id, column.id, value)\n      filledCells.push({ rowId: row.id, columnId: column.id, value })\n    }\n  }\n\n  return filledCells\n}\n","// @zvndev/yable-core — Row Grouping\n// Builds grouped row models from flat (filtered+sorted) rows by one or more\n// columns (`state.grouping`), creating synthetic group header rows whose cells\n// expose the group value and per-column aggregates.\n//\n// The model exposes two row lists with distinct contracts:\n//   - `rows`: the FLATTENED, VISIBLE list (group headers interleaved with their\n//     expanded descendants, per `state.expanded`) — what the renderer maps over.\n//   - `flatRows`: EVERY row (all group headers + all leaf rows), independent of\n//     expansion — what selection/iteration consumers (e.g. select-all) walk so\n//     collapsed leaves remain reachable.\n\nimport type { RowData, Row, Table, RowModel } from '../types'\nimport { createRow } from '../core/row'\n\nfunction isExpanded(id: string, expanded: Record<string, boolean> | true): boolean {\n  return expanded === true || (typeof expanded === 'object' && !!expanded[id])\n}\n\n/**\n * Build a flattened grouped row model from already filtered+sorted leaf rows.\n * When `grouping` is empty the input rows are returned unchanged.\n */\nexport function getGroupedRowModel<TData extends RowData>(\n  table: Table<TData>,\n  sortedRows: Row<TData>[],\n  grouping: string[],\n  expanded: Record<string, boolean> | true,\n): RowModel<TData> {\n  if (!grouping || grouping.length === 0) {\n    const rowsById: Record<string, Row<TData>> = {}\n    for (const r of sortedRows) rowsById[r.id] = r\n    return { rows: sortedRows, flatRows: sortedRows, rowsById }\n  }\n\n  let counter = 0\n  // Every synthetic group row created across all levels (collapse-independent).\n  const allGroupRows: Row<TData>[] = []\n\n  // Recursively build the group tree. At `level >= grouping.length` the input\n  // rows are the leaves and are returned as-is.\n  function build(rows: Row<TData>[], level: number, parentId: string | undefined): Row<TData>[] {\n    if (level >= grouping.length) return rows\n\n    const colId = grouping[level]!\n    // Bucket by the RAW group value (not its string form) so distinct objects,\n    // `null` vs `\"null\"`, `1` vs `\"1\"`, etc. never collapse into one group.\n    const order: unknown[] = []\n    const buckets = new Map<unknown, { value: unknown; rows: Row<TData>[] }>()\n\n    for (const r of rows) {\n      const value = r.getValue(colId)\n      let bucket = buckets.get(value)\n      if (!bucket) {\n        bucket = { value, rows: [] }\n        buckets.set(value, bucket)\n        order.push(value)\n      }\n      bucket.rows.push(r)\n    }\n\n    // Ancestor grouping columns whose value every leaf in this group shares.\n    const ancestorCols = grouping.slice(0, level)\n\n    const groupRows: Row<TData>[] = []\n    let bucketIndex = 0\n    for (const value of order) {\n      const bucket = buckets.get(value)!\n      // Collision-free id: a per-bucket index disambiguates even when distinct\n      // values share a `String(value)` form (e.g. objects), and the parent id —\n      // itself built this way — keeps the path unique across levels. The\n      // `colId:value` prefix stays human-readable for debugging.\n      const segment = `${colId}:${String(value)}~${bucketIndex}`\n      const groupId = parentId ? `${parentId}/${segment}` : segment\n      bucketIndex++\n\n      const leafRows = bucket.rows // every data row in this group (across deeper levels)\n      const childTree = build(bucket.rows, level + 1, groupId)\n\n      const groupRow = createRow(table, groupId, {} as TData, counter++, level, childTree, parentId)\n      groupRow.groupingColumnId = colId\n      groupRow.groupingValue = bucket.value\n      groupRow.getLeafRows = () => leafRows\n      // Group header rows are never directly selectable.\n      groupRow.getCanSelect = () => false\n      // The synthetic row has no backing data: serve the group value for the\n      // grouping column, the shared value for any ancestor grouping column, and\n      // the aggregate for any column with an aggregationFn.\n      groupRow.getValue = ((cId: string) => {\n        if (cId === colId) return bucket.value\n        if (ancestorCols.includes(cId)) return leafRows[0]?.getValue(cId)\n        const col = table.getColumn(cId)\n        const aggFn = col?.getAggregationFn?.()\n        if (aggFn) {\n          try {\n            return aggFn(cId, leafRows, childTree)\n          } catch (err) {\n            console.error(`[yable E060] aggregationFn threw for column \"${cId}\":`, err)\n            return undefined\n          }\n        }\n        return undefined\n      }) as Row<TData>['getValue']\n\n      allGroupRows.push(groupRow)\n      groupRows.push(groupRow)\n    }\n    return groupRows\n  }\n\n  const tree = build(sortedRows, 0, undefined)\n\n  // Flatten to VISIBLE rows, descending into expanded group rows only.\n  const rows: Row<TData>[] = []\n  function flatten(list: Row<TData>[]) {\n    for (const r of list) {\n      rows.push(r)\n      if (r.getIsGrouped() && r.subRows.length > 0 && isExpanded(r.id, expanded)) {\n        flatten(r.subRows)\n      }\n    }\n  }\n  flatten(tree)\n\n  // flatRows = every group row + every leaf row, regardless of expansion, so\n  // selection/iteration consumers can reach collapsed leaves.\n  const flatRows: Row<TData>[] = [...allGroupRows, ...sortedRows]\n  const rowsById: Record<string, Row<TData>> = {}\n  for (const r of flatRows) rowsById[r.id] = r\n\n  return { rows, flatRows, rowsById }\n}\n","// @zvndev/yable-core — Formula Tokenizer & AST Builder\n// Parses formula strings like \"=SUM(A1:A10) + B2 * 3\" into an AST.\n\n// ---------------------------------------------------------------------------\n// Token Types\n// ---------------------------------------------------------------------------\n\nexport type TokenType =\n  | 'number'\n  | 'string'\n  | 'cellRef'\n  | 'rangeRef'\n  | 'function'\n  | 'operator'\n  | 'paren_open'\n  | 'paren_close'\n  | 'comma'\n  | 'boolean'\n\nexport interface Token {\n  type: TokenType\n  value: string\n  position: number\n}\n\n// ---------------------------------------------------------------------------\n// AST Node Types\n// ---------------------------------------------------------------------------\n\nexport type ASTNode =\n  | NumberNode\n  | StringNode\n  | BooleanNode\n  | CellRefNode\n  | RangeRefNode\n  | BinaryOpNode\n  | UnaryOpNode\n  | FunctionCallNode\n\nexport interface NumberNode {\n  type: 'number'\n  value: number\n}\n\nexport interface StringNode {\n  type: 'string'\n  value: string\n}\n\nexport interface BooleanNode {\n  type: 'boolean'\n  value: boolean\n}\n\nexport interface CellRefNode {\n  type: 'cellRef'\n  ref: string // e.g., 'A1'\n}\n\nexport interface RangeRefNode {\n  type: 'rangeRef'\n  ref: string // e.g., 'A1:A10'\n}\n\nexport interface BinaryOpNode {\n  type: 'binaryOp'\n  operator: string\n  left: ASTNode\n  right: ASTNode\n}\n\nexport interface UnaryOpNode {\n  type: 'unaryOp'\n  operator: string\n  operand: ASTNode\n}\n\nexport interface FunctionCallNode {\n  type: 'functionCall'\n  name: string\n  args: ASTNode[]\n}\n\n// ---------------------------------------------------------------------------\n// Tokenizer\n// ---------------------------------------------------------------------------\n\nconst OPERATORS = new Set(['+', '-', '*', '/', '^', '%', '>', '<', '=', '!', '&'])\nconst CELL_REF_PATTERN = /^[A-Za-z]+\\d+/\nconst RANGE_PATTERN = /^[A-Za-z]+\\d+:[A-Za-z]+\\d+/\nconst NUMBER_PATTERN = /^\\d+\\.?\\d*/\nconst STRING_PATTERN = /^\"([^\"]*(?:\"\"[^\"]*)*)\"/\nconst FUNCTION_PATTERN = /^[A-Za-z_]\\w*(?=\\()/\nconst BOOLEAN_PATTERN = /^(TRUE|FALSE)\\b/i\nconst COMPARISON_OPERATORS = ['>=', '<=', '<>', '!=', '>', '<', '=']\n\nexport const MAX_FORMULA_LENGTH = 10_000\n\nexport function tokenize(formula: string): Token[] {\n  if (formula.length > MAX_FORMULA_LENGTH) {\n    throw new FormulaError(`Formula exceeds maximum length of ${MAX_FORMULA_LENGTH} characters`)\n  }\n\n  const tokens: Token[] = []\n\n  // Remove leading '=' if present\n  let input = formula.startsWith('=') ? formula.slice(1) : formula\n  let position = formula.startsWith('=') ? 1 : 0\n\n  while (input.length > 0) {\n    // Skip whitespace\n    const wsMatch = input.match(/^\\s+/)\n    if (wsMatch) {\n      input = input.slice(wsMatch[0].length)\n      position += wsMatch[0].length\n      continue\n    }\n\n    // Boolean\n    const boolMatch = input.match(BOOLEAN_PATTERN)\n    if (boolMatch) {\n      tokens.push({ type: 'boolean', value: boolMatch[0].toUpperCase(), position })\n      input = input.slice(boolMatch[0].length)\n      position += boolMatch[0].length\n      continue\n    }\n\n    // Function name (must come before cell ref since they overlap)\n    const funcMatch = input.match(FUNCTION_PATTERN)\n    if (funcMatch) {\n      tokens.push({ type: 'function', value: funcMatch[0].toUpperCase(), position })\n      input = input.slice(funcMatch[0].length)\n      position += funcMatch[0].length\n      continue\n    }\n\n    // Range reference (must come before cell ref since range includes cell ref)\n    const rangeMatch = input.match(RANGE_PATTERN)\n    if (rangeMatch) {\n      tokens.push({ type: 'rangeRef', value: rangeMatch[0].toUpperCase(), position })\n      input = input.slice(rangeMatch[0].length)\n      position += rangeMatch[0].length\n      continue\n    }\n\n    // Cell reference\n    const cellMatch = input.match(CELL_REF_PATTERN)\n    if (cellMatch) {\n      tokens.push({ type: 'cellRef', value: cellMatch[0].toUpperCase(), position })\n      input = input.slice(cellMatch[0].length)\n      position += cellMatch[0].length\n      continue\n    }\n\n    // Number\n    const numMatch = input.match(NUMBER_PATTERN)\n    if (numMatch) {\n      tokens.push({ type: 'number', value: numMatch[0], position })\n      input = input.slice(numMatch[0].length)\n      position += numMatch[0].length\n      continue\n    }\n\n    // String literal\n    const strMatch = input.match(STRING_PATTERN)\n    if (strMatch) {\n      const raw = strMatch[1]!.replace(/\"\"/g, '\"')\n      tokens.push({ type: 'string', value: raw, position })\n      input = input.slice(strMatch[0].length)\n      position += strMatch[0].length\n      continue\n    }\n\n    // Multi-character comparison operators\n    let foundComparison = false\n    for (const op of COMPARISON_OPERATORS) {\n      if (input.startsWith(op)) {\n        tokens.push({ type: 'operator', value: op, position })\n        input = input.slice(op.length)\n        position += op.length\n        foundComparison = true\n        break\n      }\n    }\n    if (foundComparison) continue\n\n    // Single character operators\n    const char = input[0]!\n    if (OPERATORS.has(char)) {\n      tokens.push({ type: 'operator', value: char, position })\n      input = input.slice(1)\n      position++\n      continue\n    }\n\n    // Parentheses\n    if (char === '(') {\n      tokens.push({ type: 'paren_open', value: '(', position })\n      input = input.slice(1)\n      position++\n      continue\n    }\n\n    if (char === ')') {\n      tokens.push({ type: 'paren_close', value: ')', position })\n      input = input.slice(1)\n      position++\n      continue\n    }\n\n    // Comma\n    if (char === ',') {\n      tokens.push({ type: 'comma', value: ',', position })\n      input = input.slice(1)\n      position++\n      continue\n    }\n\n    // Unknown character\n    throw new FormulaError(`Unexpected character '${char}' at position ${position}`)\n  }\n\n  return tokens\n}\n\n// ---------------------------------------------------------------------------\n// Parser (Recursive Descent)\n// ---------------------------------------------------------------------------\n\n// Operator precedence (lower number = lower precedence)\nconst PRECEDENCE: Record<string, number> = {\n  '=': 1,\n  '<>': 1,\n  '!=': 1,\n  '<': 2,\n  '>': 2,\n  '<=': 2,\n  '>=': 2,\n  '&': 3, // String concatenation\n  '+': 4,\n  '-': 4,\n  '*': 5,\n  '/': 5,\n  '%': 5,\n  '^': 6,\n}\n\nconst MAX_PARSE_DEPTH = 100\n\nexport class FormulaParser {\n  private tokens: Token[]\n  private pos: number\n  private depth: number\n\n  constructor(tokens: Token[]) {\n    this.tokens = tokens\n    this.pos = 0\n    this.depth = 0\n  }\n\n  parse(): ASTNode {\n    const node = this.parseExpression(0)\n\n    if (this.pos < this.tokens.length) {\n      throw new FormulaError(\n        `Unexpected token '${this.tokens[this.pos]!.value}' at position ${this.tokens[this.pos]!.position}`,\n      )\n    }\n\n    return node\n  }\n\n  private guardDepth(): void {\n    this.depth++\n    if (this.depth > MAX_PARSE_DEPTH) {\n      throw new FormulaError(\n        `Formula exceeds maximum nesting depth of ${MAX_PARSE_DEPTH}. Simplify the expression.`,\n      )\n    }\n  }\n\n  private parseExpression(minPrec: number): ASTNode {\n    this.guardDepth()\n    let left = this.parseUnary()\n\n    while (this.pos < this.tokens.length) {\n      const token = this.tokens[this.pos]!\n\n      if (token.type !== 'operator') break\n\n      const prec = PRECEDENCE[token.value]\n      if (prec === undefined || prec < minPrec) break\n\n      this.pos++\n      const right = this.parseExpression(prec + 1)\n\n      left = {\n        type: 'binaryOp',\n        operator: token.value,\n        left,\n        right,\n      }\n    }\n\n    return left\n  }\n\n  private parseUnary(): ASTNode {\n    const token = this.tokens[this.pos]\n\n    // Unary minus or plus\n    if (token && token.type === 'operator' && (token.value === '-' || token.value === '+')) {\n      this.pos++\n      const operand = this.parseUnary()\n      return {\n        type: 'unaryOp',\n        operator: token.value,\n        operand,\n      }\n    }\n\n    return this.parsePrimary()\n  }\n\n  private parsePrimary(): ASTNode {\n    const token = this.tokens[this.pos]\n\n    if (!token) {\n      throw new FormulaError('Unexpected end of formula')\n    }\n\n    // Number\n    if (token.type === 'number') {\n      this.pos++\n      return { type: 'number', value: parseFloat(token.value) }\n    }\n\n    // String\n    if (token.type === 'string') {\n      this.pos++\n      return { type: 'string', value: token.value }\n    }\n\n    // Boolean\n    if (token.type === 'boolean') {\n      this.pos++\n      return { type: 'boolean', value: token.value === 'TRUE' }\n    }\n\n    // Function call\n    if (token.type === 'function') {\n      return this.parseFunctionCall()\n    }\n\n    // Range reference\n    if (token.type === 'rangeRef') {\n      this.pos++\n      return { type: 'rangeRef', ref: token.value }\n    }\n\n    // Cell reference\n    if (token.type === 'cellRef') {\n      this.pos++\n      return { type: 'cellRef', ref: token.value }\n    }\n\n    // Parenthesized expression\n    if (token.type === 'paren_open') {\n      this.pos++\n      const expr = this.parseExpression(0)\n\n      const closeToken = this.tokens[this.pos]\n      if (!closeToken || closeToken.type !== 'paren_close') {\n        throw new FormulaError('Missing closing parenthesis')\n      }\n      this.pos++\n\n      return expr\n    }\n\n    throw new FormulaError(`Unexpected token '${token.value}' at position ${token.position}`)\n  }\n\n  private parseFunctionCall(): FunctionCallNode {\n    const nameToken = this.tokens[this.pos]!\n    this.pos++\n\n    // Expect open paren\n    const openParen = this.tokens[this.pos]\n    if (!openParen || openParen.type !== 'paren_open') {\n      throw new FormulaError(`Expected '(' after function '${nameToken.value}'`)\n    }\n    this.pos++\n\n    // Parse arguments\n    const args: ASTNode[] = []\n\n    // Check for empty function call\n    if (this.pos < this.tokens.length && this.tokens[this.pos]!.type === 'paren_close') {\n      this.pos++\n      return { type: 'functionCall', name: nameToken.value, args }\n    }\n\n    // Parse first argument\n    args.push(this.parseExpression(0))\n\n    // Parse remaining arguments separated by commas\n    while (this.pos < this.tokens.length && this.tokens[this.pos]!.type === 'comma') {\n      this.pos++ // Skip comma\n      args.push(this.parseExpression(0))\n    }\n\n    // Expect close paren\n    const closeParen = this.tokens[this.pos]\n    if (!closeParen || closeParen.type !== 'paren_close') {\n      throw new FormulaError(`Expected ')' after function arguments in '${nameToken.value}'`)\n    }\n    this.pos++\n\n    return { type: 'functionCall', name: nameToken.value, args }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Parses a formula string into an AST.\n * Formula should start with '=' (which will be stripped).\n */\nexport function parseFormula(formula: string): ASTNode {\n  const tokens = tokenize(formula)\n  const parser = new FormulaParser(tokens)\n  return parser.parse()\n}\n\n// ---------------------------------------------------------------------------\n// Error\n// ---------------------------------------------------------------------------\n\nexport class FormulaError extends Error {\n  constructor(message: string) {\n    super(message)\n    this.name = 'FormulaError'\n  }\n}\n","// @zvndev/yable-core — Built-in Formula Functions\n// SUM, AVG, COUNT, MIN, MAX, IF, CONCAT, ROUND, ABS\n\nimport { FormulaError } from './parser'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type FormulaFunction = (args: unknown[]) => unknown\n\n// ---------------------------------------------------------------------------\n// Built-in Functions\n// ---------------------------------------------------------------------------\n\n/**\n * SUM(values...) — Adds all numeric values.\n * Ignores non-numeric values.\n */\nfunction SUM(args: unknown[]): number {\n  return flattenArgs(args).reduce<number>((sum, v) => {\n    const n = toNumber(v)\n    return sum + (isNaN(n) ? 0 : n)\n  }, 0)\n}\n\n/**\n * AVG(values...) / AVERAGE(values...) — Average of numeric values.\n */\nfunction AVG(args: unknown[]): number {\n  const flat = flattenArgs(args)\n  const nums = flat.map(toNumber).filter((n) => !isNaN(n))\n  if (nums.length === 0) return 0\n  return nums.reduce((a, b) => a + b, 0) / nums.length\n}\n\n/**\n * COUNT(values...) — Counts numeric values.\n */\nfunction COUNT(args: unknown[]): number {\n  return flattenArgs(args).filter((v) => {\n    if (v == null || v === '') return false\n    return !isNaN(toNumber(v))\n  }).length\n}\n\n/**\n * COUNTA(values...) — Counts non-empty values.\n */\nfunction COUNTA(args: unknown[]): number {\n  return flattenArgs(args).filter((v) => v != null && v !== '').length\n}\n\n/**\n * MIN(values...) — Minimum numeric value.\n */\nfunction MIN(args: unknown[]): number {\n  const nums = flattenArgs(args).map(toNumber).filter((n) => !isNaN(n))\n  if (nums.length === 0) return 0\n  return Math.min(...nums)\n}\n\n/**\n * MAX(values...) — Maximum numeric value.\n */\nfunction MAX(args: unknown[]): number {\n  const nums = flattenArgs(args).map(toNumber).filter((n) => !isNaN(n))\n  if (nums.length === 0) return 0\n  return Math.max(...nums)\n}\n\n/**\n * IF(condition, trueValue, falseValue)\n */\nfunction IF(args: unknown[]): unknown {\n  if (args.length < 2) {\n    throw new FormulaError('IF requires at least 2 arguments')\n  }\n\n  const condition = args[0]\n  const trueValue = args[1]\n  const falseValue = args.length > 2 ? args[2] : false\n\n  return toBool(condition) ? trueValue : falseValue\n}\n\n/**\n * CONCAT(values...) — Concatenates all values as strings.\n */\nfunction CONCAT(args: unknown[]): string {\n  return flattenArgs(args).map((v) => String(v ?? '')).join('')\n}\n\n/**\n * ROUND(number, [digits])\n */\nfunction ROUND(args: unknown[]): number {\n  if (args.length < 1) {\n    throw new FormulaError('ROUND requires at least 1 argument')\n  }\n\n  const num = toNumber(args[0])\n  const digits = args.length > 1 ? toNumber(args[1]) : 0\n\n  if (isNaN(num)) return NaN\n  if (isNaN(digits)) return NaN\n\n  const factor = Math.pow(10, Math.floor(digits))\n  return Math.round(num * factor) / factor\n}\n\n/**\n * ABS(number) — Absolute value.\n */\nfunction ABS(args: unknown[]): number {\n  if (args.length < 1) {\n    throw new FormulaError('ABS requires 1 argument')\n  }\n\n  return Math.abs(toNumber(args[0]))\n}\n\n/**\n * FLOOR(number) — Round down.\n */\nfunction FLOOR(args: unknown[]): number {\n  if (args.length < 1) {\n    throw new FormulaError('FLOOR requires 1 argument')\n  }\n\n  return Math.floor(toNumber(args[0]))\n}\n\n/**\n * CEILING(number) — Round up.\n */\nfunction CEILING(args: unknown[]): number {\n  if (args.length < 1) {\n    throw new FormulaError('CEILING requires 1 argument')\n  }\n\n  return Math.ceil(toNumber(args[0]))\n}\n\n/**\n * POWER(base, exponent) — Raises base to exponent.\n */\nfunction POWER(args: unknown[]): number {\n  if (args.length < 2) {\n    throw new FormulaError('POWER requires 2 arguments')\n  }\n\n  return Math.pow(toNumber(args[0]), toNumber(args[1]))\n}\n\n/**\n * SQRT(number) — Square root.\n */\nfunction SQRT(args: unknown[]): number {\n  if (args.length < 1) {\n    throw new FormulaError('SQRT requires 1 argument')\n  }\n\n  const n = toNumber(args[0])\n  if (n < 0) throw new FormulaError('SQRT of negative number')\n  return Math.sqrt(n)\n}\n\n/**\n * LEN(text) — Length of string.\n */\nfunction LEN(args: unknown[]): number {\n  if (args.length < 1) {\n    throw new FormulaError('LEN requires 1 argument')\n  }\n\n  return String(args[0] ?? '').length\n}\n\n/**\n * UPPER(text) — Convert to uppercase.\n */\nfunction UPPER(args: unknown[]): string {\n  if (args.length < 1) {\n    throw new FormulaError('UPPER requires 1 argument')\n  }\n\n  return String(args[0] ?? '').toUpperCase()\n}\n\n/**\n * LOWER(text) — Convert to lowercase.\n */\nfunction LOWER(args: unknown[]): string {\n  if (args.length < 1) {\n    throw new FormulaError('LOWER requires 1 argument')\n  }\n\n  return String(args[0] ?? '').toLowerCase()\n}\n\n// ---------------------------------------------------------------------------\n// Function Registry\n// ---------------------------------------------------------------------------\n\nexport const builtInFunctions: Record<string, FormulaFunction> = {\n  SUM,\n  AVG,\n  AVERAGE: AVG,\n  COUNT,\n  COUNTA,\n  MIN,\n  MAX,\n  IF,\n  CONCAT,\n  CONCATENATE: CONCAT,\n  ROUND,\n  ABS,\n  FLOOR,\n  CEILING,\n  CEIL: CEILING,\n  POWER,\n  POW: POWER,\n  SQRT,\n  LEN,\n  UPPER,\n  LOWER,\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction toNumber(value: unknown): number {\n  if (typeof value === 'number') return value\n  if (typeof value === 'boolean') return value ? 1 : 0\n  if (typeof value === 'string') {\n    if (value.trim() === '') return 0\n    const n = Number(value)\n    return n\n  }\n  return NaN\n}\n\nfunction toBool(value: unknown): boolean {\n  if (typeof value === 'boolean') return value\n  if (typeof value === 'number') return value !== 0\n  if (typeof value === 'string') return value.length > 0\n  return !!value\n}\n\n/** T1-08: Maximum recursion depth for flattenArgs */\nconst MAX_FLATTEN_DEPTH = 50\n\n/**\n * Flattens nested arrays (from range references) into a single array.\n * Depth-limited to prevent stack overflow from deeply nested structures.\n */\nfunction flattenArgs(args: unknown[], depth: number = 0): unknown[] {\n  if (depth > MAX_FLATTEN_DEPTH) {\n    throw new FormulaError(\n      `flattenArgs exceeds maximum recursion depth of ${MAX_FLATTEN_DEPTH}. Data structure is too deeply nested.`\n    )\n  }\n\n  const result: unknown[] = []\n\n  for (const arg of args) {\n    if (Array.isArray(arg)) {\n      result.push(...flattenArgs(arg, depth + 1))\n    } else {\n      result.push(arg)\n    }\n  }\n\n  return result\n}\n","// @zvndev/yable-core — Formula AST Evaluator\n// Evaluates an AST node, resolving cell references against the table.\n\nimport type { ASTNode } from './parser'\nimport { FormulaError } from './parser'\nimport { builtInFunctions } from './functions'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Cell value resolver: given a cell reference string (e.g., 'A1'),\n * returns the cell's computed value.\n */\nexport type CellValueResolver = (ref: string) => unknown\n\n/**\n * Range value resolver: given a range reference string (e.g., 'A1:A10'),\n * returns an array of cell values.\n */\nexport type RangeValueResolver = (rangeRef: string) => unknown[]\n\n// ---------------------------------------------------------------------------\n// Evaluator\n// ---------------------------------------------------------------------------\n\n/** T1-07: Maximum recursion depth for formula evaluation */\nconst MAX_EVAL_DEPTH = 100\n\n/**\n * Evaluates a formula AST node, resolving cell references using the provided\n * resolver functions.\n *\n * @param node - The AST node to evaluate\n * @param getCellValue - Resolves cell references to values\n * @param getRangeValues - Resolves range references to arrays of values\n * @param _depth - Internal recursion depth counter (do not pass manually)\n */\nexport function evaluate(\n  node: ASTNode,\n  getCellValue: CellValueResolver,\n  getRangeValues: RangeValueResolver,\n  _depth: number = 0,\n): unknown {\n  if (_depth > MAX_EVAL_DEPTH) {\n    throw new FormulaError(\n      `[yable E008] Formula evaluation exceeds maximum recursion depth of ${MAX_EVAL_DEPTH}. Check for circular references or overly complex expressions.`,\n    )\n  }\n\n  const nextDepth = _depth + 1\n\n  switch (node.type) {\n    case 'number':\n      return node.value\n\n    case 'string':\n      return node.value\n\n    case 'boolean':\n      return node.value\n\n    case 'cellRef':\n      return getCellValue(node.ref)\n\n    case 'rangeRef':\n      return getRangeValues(node.ref)\n\n    case 'unaryOp':\n      return evaluateUnaryOp(node.operator, node.operand, getCellValue, getRangeValues, nextDepth)\n\n    case 'binaryOp':\n      return evaluateBinaryOp(\n        node.operator,\n        node.left,\n        node.right,\n        getCellValue,\n        getRangeValues,\n        nextDepth,\n      )\n\n    case 'functionCall':\n      return evaluateFunctionCall(node.name, node.args, getCellValue, getRangeValues, nextDepth)\n\n    default: {\n      const exhaustive: never = node\n      throw new FormulaError(\n        `[yable E013] Unknown AST node type: ${(exhaustive as { type: string }).type}`,\n      )\n    }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Operators\n// ---------------------------------------------------------------------------\n\nfunction evaluateUnaryOp(\n  operator: string,\n  operand: ASTNode,\n  getCellValue: CellValueResolver,\n  getRangeValues: RangeValueResolver,\n  depth: number,\n): unknown {\n  const value = evaluate(operand, getCellValue, getRangeValues, depth)\n\n  switch (operator) {\n    case '-':\n      return -toNum(value)\n    case '+':\n      return +toNum(value)\n    default:\n      throw new FormulaError(`Unknown unary operator: ${operator}`)\n  }\n}\n\nfunction evaluateBinaryOp(\n  operator: string,\n  left: ASTNode,\n  right: ASTNode,\n  getCellValue: CellValueResolver,\n  getRangeValues: RangeValueResolver,\n  depth: number,\n): unknown {\n  const leftVal = evaluate(left, getCellValue, getRangeValues, depth)\n  const rightVal = evaluate(right, getCellValue, getRangeValues, depth)\n\n  switch (operator) {\n    case '+':\n      return toNum(leftVal) + toNum(rightVal)\n    case '-':\n      return toNum(leftVal) - toNum(rightVal)\n    case '*':\n      return toNum(leftVal) * toNum(rightVal)\n    case '/': {\n      const divisor = toNum(rightVal)\n      if (divisor === 0) throw new FormulaError('#DIV/0!')\n      return toNum(leftVal) / divisor\n    }\n    case '^':\n      return Math.pow(toNum(leftVal), toNum(rightVal))\n    case '%':\n      return toNum(leftVal) % toNum(rightVal)\n    case '&':\n      return String(leftVal ?? '') + String(rightVal ?? '')\n\n    // Comparison operators\n    case '=':\n      return leftVal === rightVal || toNum(leftVal) === toNum(rightVal)\n    case '<>':\n    case '!=':\n      return leftVal !== rightVal && toNum(leftVal) !== toNum(rightVal)\n    case '>':\n      return toNum(leftVal) > toNum(rightVal)\n    case '<':\n      return toNum(leftVal) < toNum(rightVal)\n    case '>=':\n      return toNum(leftVal) >= toNum(rightVal)\n    case '<=':\n      return toNum(leftVal) <= toNum(rightVal)\n\n    default:\n      throw new FormulaError(`Unknown operator: ${operator}`)\n  }\n}\n\nfunction evaluateFunctionCall(\n  name: string,\n  args: ASTNode[],\n  getCellValue: CellValueResolver,\n  getRangeValues: RangeValueResolver,\n  depth: number,\n): unknown {\n  const fn = builtInFunctions[name]\n\n  if (!fn) {\n    throw new FormulaError(`[yable E007] Unknown function: ${name}`)\n  }\n\n  // Evaluate each argument\n  const evaluatedArgs = args.map((arg) => evaluate(arg, getCellValue, getRangeValues, depth))\n\n  return fn(evaluatedArgs)\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction toNum(value: unknown): number {\n  if (typeof value === 'number') return value\n  if (typeof value === 'boolean') return value ? 1 : 0\n  if (typeof value === 'string') {\n    if (value.trim() === '') return 0\n    const n = Number(value)\n    return isNaN(n) ? 0 : n\n  }\n  return 0\n}\n","// @zvndev/yable-core — Formula Cell Reference Parser\n// Converts between A1-style references and {row, col} coordinates.\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CellReference {\n  row: number // 0-based row index\n  col: number // 0-based column index\n}\n\nexport interface CellRange {\n  start: CellReference\n  end: CellReference\n}\n\n// ---------------------------------------------------------------------------\n// Column letter <-> index conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Converts a 0-based column index to a column letter (A, B, ..., Z, AA, AB, ...).\n */\nexport function columnIndexToLetter(index: number): string {\n  let result = ''\n  let n = index\n\n  while (n >= 0) {\n    result = String.fromCharCode((n % 26) + 65) + result\n    n = Math.floor(n / 26) - 1\n  }\n\n  return result\n}\n\n/**\n * Converts a column letter (A, B, ..., Z, AA, AB, ...) to a 0-based column index.\n */\nexport function letterToColumnIndex(letter: string): number {\n  let result = 0\n  const upper = letter.toUpperCase()\n\n  for (let i = 0; i < upper.length; i++) {\n    result = result * 26 + (upper.charCodeAt(i) - 64)\n  }\n\n  return result - 1 // Convert to 0-based\n}\n\n// ---------------------------------------------------------------------------\n// Cell reference parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Regex for a single cell reference: column letter(s) + row number.\n * e.g., A1, B3, AA10, ZZ100\n */\nconst CELL_REF_REGEX = /^([A-Za-z]+)(\\d+)$/\n\n/**\n * Parses an A1-style cell reference string into row and column indices.\n * Row numbers in A1 notation are 1-based, but we return 0-based indices.\n *\n * @example parseCellRef('A1') => { row: 0, col: 0 }\n * @example parseCellRef('B3') => { row: 2, col: 1 }\n */\nexport function parseCellRef(ref: string): CellReference | null {\n  const match = ref.match(CELL_REF_REGEX)\n  if (!match) return null\n\n  const colLetter = match[1]!\n  const rowNum = parseInt(match[2]!, 10)\n\n  if (isNaN(rowNum) || rowNum < 1) return null\n\n  return {\n    row: rowNum - 1, // Convert 1-based to 0-based\n    col: letterToColumnIndex(colLetter),\n  }\n}\n\n/**\n * Converts a CellReference back to an A1-style string.\n *\n * @example cellRefToString({ row: 0, col: 0 }) => 'A1'\n * @example cellRefToString({ row: 2, col: 1 }) => 'B3'\n */\nexport function cellRefToString(ref: CellReference): string {\n  return `${columnIndexToLetter(ref.col)}${ref.row + 1}`\n}\n\n/**\n * Regex for a range reference: A1:B2\n */\nconst RANGE_REF_REGEX = /^([A-Za-z]+\\d+):([A-Za-z]+\\d+)$/\n\n/**\n * Parses a range reference string (e.g., 'A1:B10') into start and end cell references.\n */\nexport function parseRangeRef(ref: string): CellRange | null {\n  const match = ref.match(RANGE_REF_REGEX)\n  if (!match) return null\n\n  const start = parseCellRef(match[1]!)\n  const end = parseCellRef(match[2]!)\n\n  if (!start || !end) return null\n\n  return {\n    start: {\n      row: Math.min(start.row, end.row),\n      col: Math.min(start.col, end.col),\n    },\n    end: {\n      row: Math.max(start.row, end.row),\n      col: Math.max(start.col, end.col),\n    },\n  }\n}\n\n/**\n * Expands a range into an array of individual cell references.\n */\nexport function expandRange(range: CellRange): CellReference[] {\n  const cells: CellReference[] = []\n\n  for (let row = range.start.row; row <= range.end.row; row++) {\n    for (let col = range.start.col; col <= range.end.col; col++) {\n      cells.push({ row, col })\n    }\n  }\n\n  return cells\n}\n\n/**\n * Extracts all cell references and range references from a formula string.\n * Returns them as CellReference arrays.\n */\nexport function extractReferences(formula: string): CellReference[] {\n  const refs: CellReference[] = []\n  // Remove the leading '=' if present\n  const expr = formula.startsWith('=') ? formula.slice(1) : formula\n\n  // Match range references first (A1:B2)\n  const rangeRegex = /([A-Za-z]+\\d+):([A-Za-z]+\\d+)/g\n  let rangeMatch: RegExpExecArray | null\n  const rangeSpans: [number, number][] = []\n\n  while ((rangeMatch = rangeRegex.exec(expr)) !== null) {\n    const range = parseRangeRef(rangeMatch[0])\n    if (range) {\n      refs.push(...expandRange(range))\n      rangeSpans.push([rangeMatch.index, rangeMatch.index + rangeMatch[0].length])\n    }\n  }\n\n  // Match single cell references, skipping those inside ranges\n  const cellRegex = /([A-Za-z]+)(\\d+)/g\n  let cellMatch: RegExpExecArray | null\n\n  while ((cellMatch = cellRegex.exec(expr)) !== null) {\n    // Skip if this match is inside a range span\n    const pos = cellMatch.index\n    const isInRange = rangeSpans.some(\n      ([start, end]) => pos >= start && pos < end\n    )\n    if (isInRange) continue\n\n    // Skip if it looks like a function name (letters only, no digits would mean it's not a cell)\n    const full = cellMatch[0]\n    const ref = parseCellRef(full)\n    if (ref) {\n      refs.push(ref)\n    }\n  }\n\n  return refs\n}\n","// @zvndev/yable-core — Formula Engine\n// Manages formulas, dependency tracking, topological sort, and circular reference detection.\n\nimport type { RowData, Table } from '../../types'\nimport { parseFormula, FormulaError } from './parser'\nimport { evaluate } from './evaluator'\nimport {\n  parseCellRef,\n  parseRangeRef,\n  expandRange,\n  cellRefToString,\n  extractReferences,\n} from './cellRef'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface FormulaEntry {\n  formula: string       // Raw formula string (with leading '=')\n  cellId: string        // Table cell ID: `${rowId}_${columnId}`\n  rowId: string\n  columnId: string\n  dependencies: string[] // Cell IDs this formula depends on\n}\n\n// ---------------------------------------------------------------------------\n// FormulaEngine\n// ---------------------------------------------------------------------------\n\nexport class FormulaEngine<TData extends RowData = any> {\n  private table: Table<TData>\n  private formulas: Map<string, FormulaEntry> = new Map()\n  private computedValues: Map<string, unknown> = new Map()\n  private errors: Map<string, string> = new Map()\n\n  constructor(table: Table<TData>) {\n    this.table = table\n  }\n\n  // -----------------------------------------------------------------------\n  // Public API\n  // -----------------------------------------------------------------------\n\n  /**\n   * Sets a formula on a cell. If the value starts with '=', it's treated as\n   * a formula; otherwise, it's stored as a regular value.\n   */\n  setFormula(rowId: string, columnId: string, formula: string): void {\n    const cellId = `${rowId}_${columnId}`\n\n    if (!formula.startsWith('=')) {\n      // Not a formula — remove any existing formula for this cell\n      this.formulas.delete(cellId)\n      this.computedValues.delete(cellId)\n      this.errors.delete(cellId)\n      return\n    }\n\n    // Extract dependencies\n    const deps = this.extractDependencies(formula)\n\n    const entry: FormulaEntry = {\n      formula,\n      cellId,\n      rowId,\n      columnId,\n      dependencies: deps,\n    }\n\n    this.formulas.set(cellId, entry)\n\n    // Check for circular references\n    const circular = this.detectCircular(cellId)\n    if (circular) {\n      this.errors.set(cellId, '#CIRCULAR!')\n      this.computedValues.set(cellId, '#CIRCULAR!')\n      return\n    }\n\n    // Evaluate the formula\n    this.evaluateCell(cellId)\n  }\n\n  /**\n   * Gets the raw formula string for a cell.\n   */\n  getFormula(rowId: string, columnId: string): string | undefined {\n    const cellId = `${rowId}_${columnId}`\n    return this.formulas.get(cellId)?.formula\n  }\n\n  /**\n   * Gets the computed value for a cell.\n   */\n  getComputedValue(rowId: string, columnId: string): unknown {\n    const cellId = `${rowId}_${columnId}`\n    return this.computedValues.get(cellId)\n  }\n\n  /**\n   * Gets the error message for a cell, if any.\n   */\n  getError(rowId: string, columnId: string): string | undefined {\n    const cellId = `${rowId}_${columnId}`\n    return this.errors.get(cellId)\n  }\n\n  /**\n   * Evaluates all formulas in dependency order.\n   */\n  evaluateAll(): void {\n    // Get evaluation order via topological sort\n    const order = this.topologicalSort()\n\n    for (const cellId of order) {\n      this.evaluateCell(cellId)\n    }\n  }\n\n  /**\n   * Checks if a cell has a formula.\n   */\n  hasFormula(rowId: string, columnId: string): boolean {\n    return this.formulas.has(`${rowId}_${columnId}`)\n  }\n\n  // -----------------------------------------------------------------------\n  // Dependency Extraction\n  // -----------------------------------------------------------------------\n\n  /**\n   * Extracts cell IDs that a formula depends on.\n   * Converts A1-style references to table cell IDs using the table's rows/columns.\n   */\n  private extractDependencies(formula: string): string[] {\n    const refs = extractReferences(formula)\n    const deps: string[] = []\n    const rows = this.table.getCoreRowModel().rows\n    const columns = this.table.getVisibleLeafColumns()\n\n    for (const ref of refs) {\n      if (ref.row < rows.length && ref.col < columns.length) {\n        const row = rows[ref.row]!\n        const col = columns[ref.col]!\n        deps.push(`${row.id}_${col.id}`)\n      }\n    }\n\n    return [...new Set(deps)]\n  }\n\n  // -----------------------------------------------------------------------\n  // Circular Reference Detection\n  // -----------------------------------------------------------------------\n\n  /**\n   * Detects if adding/updating a formula for `cellId` creates a circular\n   * dependency. Uses DFS cycle detection.\n   */\n  private detectCircular(startCellId: string): boolean {\n    const visited = new Set<string>()\n    const stack = new Set<string>()\n\n    const hasCycle = (cellId: string): boolean => {\n      if (stack.has(cellId)) return true // Back edge = cycle\n      if (visited.has(cellId)) return false // Already fully explored\n\n      visited.add(cellId)\n      stack.add(cellId)\n\n      const entry = this.formulas.get(cellId)\n      if (entry) {\n        for (const dep of entry.dependencies) {\n          if (hasCycle(dep)) return true\n        }\n      }\n\n      stack.delete(cellId)\n      return false\n    }\n\n    return hasCycle(startCellId)\n  }\n\n  // -----------------------------------------------------------------------\n  // Topological Sort\n  // -----------------------------------------------------------------------\n\n  /**\n   * Returns cell IDs in topological order (dependencies before dependents).\n   * Uses Kahn's algorithm.\n   */\n  private topologicalSort(): string[] {\n    const inDegree = new Map<string, number>()\n    const graph = new Map<string, Set<string>>() // dep -> dependents\n\n    // Initialize\n    for (const [cellId, entry] of this.formulas) {\n      if (!inDegree.has(cellId)) {\n        inDegree.set(cellId, 0)\n      }\n\n      for (const dep of entry.dependencies) {\n        if (!graph.has(dep)) {\n          graph.set(dep, new Set())\n        }\n        graph.get(dep)!.add(cellId)\n\n        inDegree.set(cellId, (inDegree.get(cellId) ?? 0) + 1)\n      }\n    }\n\n    // Find nodes with no incoming edges\n    const queue: string[] = []\n    for (const [cellId, degree] of inDegree) {\n      if (degree === 0) {\n        queue.push(cellId)\n      }\n    }\n\n    // Also add formula cells that have no tracked in-degree\n    for (const cellId of this.formulas.keys()) {\n      if (!inDegree.has(cellId) || inDegree.get(cellId) === 0) {\n        if (!queue.includes(cellId)) {\n          queue.push(cellId)\n        }\n      }\n    }\n\n    const result: string[] = []\n    const processed = new Set<string>()\n\n    while (queue.length > 0) {\n      const cellId = queue.shift()!\n      if (processed.has(cellId)) continue\n      processed.add(cellId)\n\n      if (this.formulas.has(cellId)) {\n        result.push(cellId)\n      }\n\n      const dependents = graph.get(cellId)\n      if (dependents) {\n        for (const dep of dependents) {\n          const newDegree = (inDegree.get(dep) ?? 1) - 1\n          inDegree.set(dep, newDegree)\n          if (newDegree === 0) {\n            queue.push(dep)\n          }\n        }\n      }\n    }\n\n    // Any remaining formula cells (e.g., circular) that weren't processed\n    for (const cellId of this.formulas.keys()) {\n      if (!processed.has(cellId)) {\n        result.push(cellId)\n      }\n    }\n\n    return result\n  }\n\n  // -----------------------------------------------------------------------\n  // Cell Evaluation\n  // -----------------------------------------------------------------------\n\n  /**\n   * Evaluates a single formula cell and stores the result.\n   */\n  private evaluateCell(cellId: string): void {\n    const entry = this.formulas.get(cellId)\n    if (!entry) return\n\n    // Check if already marked as circular\n    if (this.errors.get(cellId) === '#CIRCULAR!') return\n\n    try {\n      const ast = parseFormula(entry.formula)\n\n      const getCellValue = (ref: string): unknown => {\n        return this.resolveCellRef(ref)\n      }\n\n      const getRangeValues = (rangeRef: string): unknown[] => {\n        return this.resolveRangeRef(rangeRef)\n      }\n\n      const result = evaluate(ast, getCellValue, getRangeValues)\n\n      this.computedValues.set(cellId, result)\n      this.errors.delete(cellId)\n\n      // Store computed value as pending value so the table can read it\n      this.table.setPendingValue(entry.rowId, entry.columnId, result)\n    } catch (error) {\n      const message = error instanceof FormulaError\n        ? error.message\n        : error instanceof Error\n          ? `#ERROR! ${error.message}`\n          : '#ERROR!'\n\n      this.errors.set(cellId, message)\n      this.computedValues.set(cellId, message)\n    }\n  }\n\n  // -----------------------------------------------------------------------\n  // Cell/Range Resolution\n  // -----------------------------------------------------------------------\n\n  /**\n   * Resolves an A1-style cell reference to the cell's value.\n   */\n  private resolveCellRef(ref: string): unknown {\n    const parsed = parseCellRef(ref)\n    if (!parsed) return undefined\n\n    const rows = this.table.getCoreRowModel().rows\n    const columns = this.table.getVisibleLeafColumns()\n\n    if (parsed.row >= rows.length || parsed.col >= columns.length) {\n      return undefined\n    }\n\n    const row = rows[parsed.row]!\n    const col = columns[parsed.col]!\n    const cellId = `${row.id}_${col.id}`\n\n    // Check if there's a computed formula value for this cell\n    if (this.computedValues.has(cellId)) {\n      return this.computedValues.get(cellId)\n    }\n\n    // Check pending values\n    const pendingValue = this.table.getPendingValue(row.id, col.id)\n    if (pendingValue !== undefined) {\n      return pendingValue\n    }\n\n    // Fall back to the raw row value\n    return row.getValue(col.id)\n  }\n\n  /**\n   * Resolves a range reference (e.g., 'A1:A10') to an array of values.\n   */\n  private resolveRangeRef(rangeRef: string): unknown[] {\n    const parsed = parseRangeRef(rangeRef)\n    if (!parsed) return []\n\n    const cells = expandRange(parsed)\n    return cells.map((cell) => {\n      const ref = cellRefToString(cell)\n      return this.resolveCellRef(ref)\n    })\n  }\n}\n","// @zvndev/yable-core — createTable() — Main Engine\n\nimport type {\n  RowData,\n  Table,\n  TableOptions,\n  TableOptionsResolved,\n  TableState,\n  ColumnDef,\n  ColumnDefExtensions,\n  Column,\n  Row,\n  RowModel,\n  HeaderGroup,\n  Header,\n  Updater,\n  ExportOptions,\n  SortingState,\n  ColumnFiltersState,\n  PaginationState,\n  RowSelectionState,\n  CellRange,\n  VisibilityState,\n  ColumnOrderState,\n  ColumnPinningState,\n  ColumnSizingState,\n  ColumnSizingInfoState,\n  ExpandedState,\n  RowPinningState,\n  GroupingState,\n  EditingState,\n  KeyboardNavigationAction,\n  KeyboardNavigationCell,\n  KeyboardNavigationState,\n  YableEventMap,\n} from '../types'\nimport { functionalUpdate, memo, makeStateUpdater } from '../utils'\nimport { createColumn } from './column'\nimport { createRow } from './row'\nimport { fireColumnCommitHooks } from './editCommitHooks'\nimport { buildHeaderGroups } from './headers'\nimport { EventEmitterImpl } from '../events/EventEmitter'\nimport { getDefaultLocale } from '../i18n/locales'\nimport type { YableLocale } from '../i18n/en'\nimport {\n  getCellPositionByIds,\n  getNextFocusedCell,\n  normalizeFocusedCell,\n} from '../features/keyboardNavigation'\nimport { applyCellPaste, parseClipboardText, serializeCells } from '../features/clipboard'\nimport {\n  clampCellToTable,\n  createCellRange,\n  isCellInRange,\n  normalizeCellRange,\n} from '../features/selection'\nimport { createCommitCoordinator } from '../features/commits/coordinator'\nimport type { CommitCoordinator, CoordinatorOptions } from '../features/commits/coordinator'\nimport type { CellPatch, CommitsSlice } from '../features/commits/types'\nimport { createFullRowEditingIntegration } from '../features/fullRowEditing'\nimport { createRowDragIntegration } from '../features/rowDragging'\nimport { createUndoRedoIntegration } from '../features/undoRedo'\nimport { detectAndFill } from '../features/fillHandle'\nimport { getPivotRowModel } from '../features/pivot'\nimport type { PivotConfig as PivotEngineConfig } from '../features/pivot'\nimport { getTreeRowModel, type TreeNode } from '../features/treeData'\nimport { getGroupedRowModel as buildGroupedRowModel } from '../features/grouping'\nimport { FormulaEngine } from '../features/formulas/engine'\n\n// ---------------------------------------------------------------------------\n// Private commit coordinator storage — avoids `(table as any).__commitCoordinator`\n// ---------------------------------------------------------------------------\n\nconst commitCoordinatorMap = new WeakMap<Table<RowData>, CommitCoordinator>()\n\n// Re-export resolvers for convenience (they live in resolvers.ts to avoid circular deps)\nexport { resolveSortingFn, resolveFilterFn } from './resolvers'\n\n/** Package-internal access to the commit coordinator for a given table instance. */\nexport function getCommitCoordinator(table: Table<RowData>): CommitCoordinator | undefined {\n  return commitCoordinatorMap.get(table)\n}\n\ninterface ColumnSizingItem {\n  id: string\n  min: number\n  max: number | undefined\n  weight: number\n}\n\nfunction getColumnSizingBounds<TData extends RowData>(\n  column: Column<TData, unknown>,\n): { min: number; max: number | undefined } {\n  const def = column.columnDef as Partial<ColumnDefExtensions<TData, unknown>>\n  const min = typeof def.minSize === 'number' && Number.isFinite(def.minSize) ? def.minSize : 0\n  const max =\n    typeof def.maxSize === 'number' && Number.isFinite(def.maxSize) ? def.maxSize : undefined\n  const normalizedMin = Math.max(0, min)\n\n  return {\n    min: normalizedMin,\n    max: typeof max === 'number' && max >= normalizedMin ? max : undefined,\n  }\n}\n\nfunction getColumnFlex<TData extends RowData>(column: Column<TData, unknown>): number {\n  const def = column.columnDef as Partial<ColumnDefExtensions<TData, unknown>>\n  const flex = def.flex\n  return typeof flex === 'number' && Number.isFinite(flex) && flex > 0 ? flex : 0\n}\n\nfunction distributeColumnSizes(\n  items: ColumnSizingItem[],\n  targetWidth: number,\n): Map<string, number> {\n  const sizes = new Map<string, number>()\n  let active = [...items]\n  let remaining = Math.max(0, targetWidth)\n\n  while (active.length > 0) {\n    const totalWeight = active.reduce((sum, item) => sum + item.weight, 0)\n    const useEqualWeights = totalWeight <= 0\n    const proposed: { item: ColumnSizingItem; size: number }[] = []\n    let clampedSizeTotal = 0\n    let didClamp = false\n\n    for (const item of active) {\n      const ratio = useEqualWeights ? 1 / active.length : item.weight / totalWeight\n      const rawSize = remaining * ratio\n\n      if (rawSize < item.min) {\n        sizes.set(item.id, item.min)\n        clampedSizeTotal += item.min\n        didClamp = true\n        continue\n      }\n\n      if (typeof item.max === 'number' && rawSize > item.max) {\n        sizes.set(item.id, item.max)\n        clampedSizeTotal += item.max\n        didClamp = true\n        continue\n      }\n\n      proposed.push({ item, size: rawSize })\n    }\n\n    if (!didClamp) {\n      for (const { item, size } of proposed) {\n        sizes.set(item.id, size)\n      }\n      break\n    }\n\n    remaining -= clampedSizeTotal\n    active = proposed.map(({ item }) => item)\n  }\n\n  return sizes\n}\n\n// ---------------------------------------------------------------------------\n// Initial State\n// ---------------------------------------------------------------------------\n\nconst getInitialState = (): TableState => ({\n  sorting: [],\n  columnFilters: [],\n  globalFilter: '',\n  pagination: { pageIndex: 0, pageSize: 10 },\n  rowSelection: {},\n  cellSelection: { range: null, anchor: null, isDragging: false },\n  columnVisibility: {},\n  columnOrder: [],\n  columnPinning: { left: [], right: [] },\n  columnSizing: {},\n  columnSizingInfo: {\n    isResizingColumn: false,\n    startOffset: null,\n    startSize: null,\n    deltaOffset: null,\n    deltaPercentage: null,\n    columnSizingStart: [],\n  },\n  expanded: {},\n  rowPinning: { top: [], bottom: [] },\n  grouping: [],\n  editing: { activeCell: undefined, pendingValues: {} },\n  commits: { cells: {}, nextOpId: 1 },\n  keyboardNavigation: { focusedCell: null },\n  undoRedo: { undoStack: [], redoStack: [], maxSize: 50 },\n  fillHandle: { isDragging: false },\n  formulas: { enabled: false, formulas: {}, computedValues: {}, errors: {} },\n  rowDrag: { draggingRowId: null, overRowId: null, dropPosition: null },\n  pivot: {\n    enabled: false,\n    config: { rowFields: [], columnFields: [], valueFields: [] },\n    expandedRowGroups: {},\n    expandedColumnGroups: {},\n  },\n})\n\n// ---------------------------------------------------------------------------\n// Locale support on Table interface (augmentation)\n// ---------------------------------------------------------------------------\n\n// (locale support is added directly to the table instance below)\n\n// ---------------------------------------------------------------------------\n// createTable\n// ---------------------------------------------------------------------------\n\nexport function createTable<TData extends RowData>(options: TableOptions<TData>): Table<TData> {\n  // T1-05: Guard data\n  const safeData = options.data ?? []\n  const safeColumns = options.columns ?? []\n\n  const events = new EventEmitterImpl<YableEventMap<TData>>()\n\n  // Resolve options with defaults\n  const resolvedOptions: TableOptionsResolved<TData> = {\n    state: {},\n    onStateChange: () => {},\n    renderFallbackValue: null,\n    enableSorting: true,\n    enableFilters: true,\n    enableColumnFilters: true,\n    enableGlobalFilter: true,\n    enableRowSelection: true,\n    enableMultiRowSelection: true,\n    enableSubRowSelection: true,\n    enableRowClickSelection: false,\n    enableCellSelection: true,\n    enableRowPinning: false,\n    enableColumnResizing: true,\n    enableColumnReorder: true,\n    enableHiding: true,\n    enableGrouping: false,\n    enableExpanding: true,\n    enableKeyboardNavigation: true,\n    manualSorting: false,\n    manualFiltering: false,\n    manualPagination: false,\n    manualGrouping: false,\n    manualExpanding: false,\n    autoResetPageIndex: true,\n    sortDescFirst: false,\n    enableMultiSort: true,\n    enableSortingRemoval: true,\n    maxMultiSortColCount: Number.MAX_SAFE_INTEGER,\n    isMultiSortEvent: (e: unknown) => {\n      if (e && typeof e === 'object' && 'shiftKey' in e) {\n        return !!(e as { shiftKey: boolean }).shiftKey\n      }\n      return false\n    },\n    columnResizeMode: 'onChange',\n    columnResizeDirection: 'ltr',\n    debugAll: false,\n    debugHeaders: false,\n    debugTable: false,\n    debugColumns: false,\n    debugRows: false,\n    ...options,\n    data: safeData,\n    columns: safeColumns,\n  } as TableOptionsResolved<TData>\n\n  // Internal state (used when no external state is provided)\n  let _internalState: TableState = getInitialState()\n\n  // T1-10: per-instance warning flag\n  let _largeDatasetWarned = false\n\n  // Column drag state — mutable flag, not part of serializable TableState\n  let _columnDragActive = false\n\n  // ---------------------------------------------------------------------------\n  // Table Instance\n  // ---------------------------------------------------------------------------\n\n  const table: Table<TData> = {\n    options: resolvedOptions,\n\n    // State\n    getState: (): TableState => {\n      return {\n        ...getInitialState(),\n        ..._internalState,\n        ...resolvedOptions.state,\n      }\n    },\n    setState: (updater: Updater<TableState>) => {\n      const newState = functionalUpdate(updater, table.getState())\n      _internalState = newState\n      resolvedOptions.onStateChange(updater)\n    },\n    setOptions: (newOpts: Updater<TableOptionsResolved<TData>>) => {\n      const updated = functionalUpdate(newOpts, resolvedOptions)\n      Object.assign(resolvedOptions, updated)\n    },\n    reset: () => {\n      _internalState = getInitialState()\n      resolvedOptions.onStateChange(() => getInitialState())\n    },\n\n    // Column API — populated below\n    getAllColumns: (): Column<TData, unknown>[] => [],\n    getAllFlatColumns: (): Column<TData, unknown>[] => [],\n    getAllLeafColumns: (): Column<TData, unknown>[] => [],\n    getColumn: (_columnId: string): Column<TData, unknown> | undefined => undefined,\n    getVisibleFlatColumns: (): Column<TData, unknown>[] => [],\n    getVisibleLeafColumns: (): Column<TData, unknown>[] => [],\n    getLeftVisibleLeafColumns: (): Column<TData, unknown>[] => [],\n    getRightVisibleLeafColumns: (): Column<TData, unknown>[] => [],\n    getCenterVisibleLeafColumns: (): Column<TData, unknown>[] => [],\n\n    // Header API — populated below\n    getHeaderGroups: (): HeaderGroup<TData>[] => [],\n    getLeftHeaderGroups: (): HeaderGroup<TData>[] => [],\n    getRightHeaderGroups: (): HeaderGroup<TData>[] => [],\n    getCenterHeaderGroups: (): HeaderGroup<TData>[] => [],\n    getFooterGroups: (): HeaderGroup<TData>[] => [],\n    getLeftFooterGroups: (): HeaderGroup<TData>[] => [],\n    getRightFooterGroups: (): HeaderGroup<TData>[] => [],\n    getCenterFooterGroups: (): HeaderGroup<TData>[] => [],\n\n    // Row Model API — populated below\n    getCoreRowModel: (): RowModel<TData> => ({ rows: [], flatRows: [], rowsById: {} }),\n    getRowModel: (): RowModel<TData> => ({ rows: [], flatRows: [], rowsById: {} }),\n    getRow: (id: string, _searchAll?: boolean): Row<TData> => {\n      throw new Error(`[yable E003] Row with id \"${id}\" not found.`)\n    },\n    getFilteredRowModel: (): RowModel<TData> => ({ rows: [], flatRows: [], rowsById: {} }),\n    getPreFilteredRowModel: (): RowModel<TData> => ({ rows: [], flatRows: [], rowsById: {} }),\n    getSortedRowModel: (): RowModel<TData> => ({ rows: [], flatRows: [], rowsById: {} }),\n    getPreSortedRowModel: (): RowModel<TData> => ({ rows: [], flatRows: [], rowsById: {} }),\n    getPaginationRowModel: (): RowModel<TData> => ({ rows: [], flatRows: [], rowsById: {} }),\n    getPrePaginationRowModel: (): RowModel<TData> => ({ rows: [], flatRows: [], rowsById: {} }),\n    getGroupedRowModel: (): RowModel<TData> => ({ rows: [], flatRows: [], rowsById: {} }),\n    getPreGroupedRowModel: (): RowModel<TData> => ({ rows: [], flatRows: [], rowsById: {} }),\n    getPreExpandedRowModel: (): RowModel<TData> => ({ rows: [], flatRows: [], rowsById: {} }),\n\n    // Pagination\n    getPageCount: (): number => {\n      const state = table.getState()\n      if (resolvedOptions.pageCount !== undefined) return resolvedOptions.pageCount\n      const rowModel = table.getPrePaginationRowModel()\n      return Math.ceil(rowModel.rows.length / state.pagination.pageSize)\n    },\n    getCanPreviousPage: (): boolean => table.getState().pagination.pageIndex > 0,\n    getCanNextPage: (): boolean => {\n      const state = table.getState()\n      return state.pagination.pageIndex < table.getPageCount() - 1\n    },\n    previousPage: () => {\n      table.setPageIndex((old: number) => Math.max(old - 1, 0))\n    },\n    nextPage: () => {\n      table.setPageIndex((old: number) => Math.min(old + 1, table.getPageCount() - 1))\n    },\n    firstPage: () => table.setPageIndex(0),\n    lastPage: () => table.setPageIndex(table.getPageCount() - 1),\n    getRowCount: (): number => {\n      return resolvedOptions.rowCount ?? table.getPrePaginationRowModel().rows.length\n    },\n    setPageIndex: (updater: Updater<number>) => {\n      table.setPagination((old: PaginationState) => {\n        const newPageIndex = functionalUpdate(updater, old.pageIndex)\n        return { ...old, pageIndex: newPageIndex }\n      })\n    },\n    setPageSize: (size: number) => {\n      table.setPagination((old: PaginationState) => ({ ...old, pageSize: size, pageIndex: 0 }))\n    },\n    resetPageIndex: (defaultState?: boolean) => {\n      table.setPageIndex(defaultState ? 0 : table.getState().pagination.pageIndex)\n    },\n    resetPageSize: (defaultState?: boolean) => {\n      table.setPageSize(defaultState ? 10 : table.getState().pagination.pageSize)\n    },\n    resetPagination: (defaultState?: boolean) => {\n      table.setPagination(\n        defaultState ? { pageIndex: 0, pageSize: 10 } : table.getState().pagination,\n      )\n    },\n\n    // Sorting API (placeholder — wired below)\n    setSorting: (_updater: Updater<SortingState>) => {},\n    resetSorting: (defaultState?: boolean) => {\n      table.setSorting(defaultState ? [] : table.getState().sorting)\n    },\n\n    // Filtering API (placeholder — wired below)\n    setColumnFilters: (_updater: Updater<ColumnFiltersState>) => {},\n    resetColumnFilters: (defaultState?: boolean) => {\n      table.setColumnFilters(defaultState ? [] : table.getState().columnFilters)\n    },\n    setGlobalFilter: (_updater: Updater<string>) => {},\n    resetGlobalFilter: (defaultState?: boolean) => {\n      table.setGlobalFilter(defaultState ? '' : table.getState().globalFilter)\n    },\n\n    // Selection API\n    getSelectedRowModel: (): RowModel<TData> => {\n      const selection = table.getState().rowSelection\n      const rowModel = table.getRowModel()\n      const rows = rowModel.flatRows.filter((row: Row<TData>) => selection[row.id])\n      return {\n        rows,\n        flatRows: rows,\n        rowsById: Object.fromEntries(rows.map((r: Row<TData>) => [r.id, r])),\n      }\n    },\n    getFilteredSelectedRowModel: (): RowModel<TData> => table.getSelectedRowModel(),\n    getGroupedSelectedRowModel: (): RowModel<TData> => table.getSelectedRowModel(),\n    getIsAllRowsSelected: (): boolean => {\n      const rowModel = table.getRowModel()\n      const selection = table.getState().rowSelection\n      // Only selectable rows count — synthetic group headers are never selected.\n      const selectable = rowModel.flatRows.filter((row: Row<TData>) => row.getCanSelect())\n      return selectable.length > 0 && selectable.every((row: Row<TData>) => selection[row.id])\n    },\n    getIsSomeRowsSelected: (): boolean => {\n      const selection = table.getState().rowSelection\n      return Object.keys(selection).length > 0 && !table.getIsAllRowsSelected()\n    },\n    getIsAllPageRowsSelected: (): boolean => {\n      const rowModel = table.getRowModel()\n      const selection = table.getState().rowSelection\n      const selectable = rowModel.rows.filter((row: Row<TData>) => row.getCanSelect())\n      return selectable.length > 0 && selectable.every((row: Row<TData>) => selection[row.id])\n    },\n    getIsSomePageRowsSelected: (): boolean => {\n      const rowModel = table.getRowModel()\n      const selection = table.getState().rowSelection\n      return (\n        rowModel.rows.some((row: Row<TData>) => selection[row.id]) &&\n        !table.getIsAllPageRowsSelected()\n      )\n    },\n    toggleAllRowsSelected: (value?: boolean) => {\n      const rowModel = table.getPrePaginationRowModel()\n      table.setRowSelection((old: RowSelectionState) => {\n        const next = { ...old }\n        const shouldSelect = value ?? !table.getIsAllRowsSelected()\n        for (const row of rowModel.flatRows) {\n          // Skip rows that aren't selectable (e.g. synthetic group headers) so\n          // select-all never writes unselectable ids into the selection state.\n          if (!row.getCanSelect()) continue\n          if (shouldSelect) {\n            next[row.id] = true\n          } else {\n            delete next[row.id]\n          }\n        }\n        return next\n      })\n    },\n    toggleAllPageRowsSelected: (value?: boolean) => {\n      const rowModel = table.getRowModel()\n      table.setRowSelection((old: RowSelectionState) => {\n        const next = { ...old }\n        const shouldSelect = value ?? !table.getIsAllPageRowsSelected()\n        for (const row of rowModel.rows) {\n          if (!row.getCanSelect()) continue\n          if (shouldSelect) {\n            next[row.id] = true\n          } else {\n            delete next[row.id]\n          }\n        }\n        return next\n      })\n    },\n    getToggleAllRowsSelectedHandler: () => {\n      return (_e: unknown) => {\n        table.toggleAllRowsSelected()\n      }\n    },\n    getToggleAllPageRowsSelectedHandler: () => {\n      return (_e: unknown) => {\n        table.toggleAllPageRowsSelected()\n      }\n    },\n    setRowSelection: (_updater: Updater<RowSelectionState>) => {},\n    resetRowSelection: (defaultState?: boolean) => {\n      table.setRowSelection(defaultState ? {} : table.getState().rowSelection)\n    },\n    getCellSelectionRange: (): CellRange | null => table.getState().cellSelection?.range ?? null,\n    clearCellSelection: () => {\n      table.setState((old: TableState) => ({\n        ...old,\n        cellSelection: {\n          ...(old.cellSelection ?? { range: null, anchor: null, isDragging: false }),\n          range: null,\n          isDragging: false,\n        },\n      }))\n    },\n    selectCell: (\n      cell: KeyboardNavigationCell,\n      options?: { extend?: boolean; keepAnchor?: boolean },\n    ) => {\n      const clamped = clampCellToTable(table, cell)\n      if (!clamped) {\n        table.clearCellSelection()\n        return\n      }\n\n      table.setState((old: TableState) => {\n        const previousSelection = old.cellSelection ?? {\n          range: null,\n          anchor: null,\n          isDragging: false,\n        }\n        const anchor =\n          options?.extend && previousSelection.anchor\n            ? previousSelection.anchor\n            : options?.keepAnchor\n              ? (previousSelection.anchor ?? clamped)\n              : clamped\n\n        return {\n          ...old,\n          cellSelection: {\n            range: createCellRange(anchor, clamped),\n            anchor,\n            isDragging: false,\n          },\n        }\n      })\n    },\n    startCellRangeSelection: (cell: KeyboardNavigationCell, options?: { extend?: boolean }) => {\n      const clamped = clampCellToTable(table, cell)\n      if (!clamped) {\n        table.clearCellSelection()\n        return\n      }\n\n      table.setState((old: TableState) => {\n        const previousSelection = old.cellSelection ?? {\n          range: null,\n          anchor: null,\n          isDragging: false,\n        }\n        const anchor =\n          options?.extend && previousSelection.anchor ? previousSelection.anchor : clamped\n\n        return {\n          ...old,\n          cellSelection: {\n            range: createCellRange(anchor, clamped),\n            anchor,\n            isDragging: true,\n          },\n        }\n      })\n    },\n    updateCellRangeSelection: (cell: KeyboardNavigationCell) => {\n      const clamped = clampCellToTable(table, cell)\n      if (!clamped) return\n\n      table.setState((old: TableState) => {\n        const previousSelection = old.cellSelection ?? {\n          range: null,\n          anchor: null,\n          isDragging: false,\n        }\n        if (!previousSelection.range && !previousSelection.isDragging) return old\n\n        const anchor = previousSelection.anchor ?? clamped\n        return {\n          ...old,\n          cellSelection: {\n            ...previousSelection,\n            range: createCellRange(anchor, clamped),\n          },\n        }\n      })\n    },\n    endCellRangeSelection: () => {\n      table.setState((old: TableState) => ({\n        ...old,\n        cellSelection: {\n          ...(old.cellSelection ?? { range: null, anchor: null, isDragging: false }),\n          isDragging: false,\n        },\n      }))\n    },\n    getIsCellSelected: (rowIndex: number, columnIndex: number) => {\n      const range = table.getCellSelectionRange()\n      return range ? isCellInRange(range, rowIndex, columnIndex) : false\n    },\n    getCellSelectionEdges: (rowIndex: number, columnIndex: number) => {\n      const range = table.getCellSelectionRange()\n      if (!range || !isCellInRange(range, rowIndex, columnIndex)) {\n        return null\n      }\n\n      const normalized = normalizeCellRange(range)\n      return {\n        top: rowIndex === normalized.top,\n        right: columnIndex === normalized.right,\n        bottom: rowIndex === normalized.bottom,\n        left: columnIndex === normalized.left,\n      }\n    },\n\n    // Visibility API\n    setColumnVisibility: (_updater: Updater<VisibilityState>) => {},\n    resetColumnVisibility: (defaultState?: boolean) => {\n      table.setColumnVisibility(defaultState ? {} : table.getState().columnVisibility)\n    },\n    toggleAllColumnsVisible: (value?: boolean) => {\n      const allColumns = table.getAllLeafColumns()\n      table.setColumnVisibility((old: VisibilityState) => {\n        const next = { ...old }\n        const shouldShow = value ?? !table.getIsAllColumnsVisible()\n        for (const col of allColumns) {\n          next[col.id] = shouldShow\n        }\n        return next\n      })\n    },\n    getIsAllColumnsVisible: (): boolean => {\n      return table.getAllLeafColumns().every((col: Column<TData, unknown>) => col.getIsVisible())\n    },\n    getIsSomeColumnsVisible: (): boolean => {\n      return table.getAllLeafColumns().some((col: Column<TData, unknown>) => col.getIsVisible())\n    },\n\n    // Column Order API\n    setColumnOrder: (_updater: Updater<ColumnOrderState>) => {},\n    resetColumnOrder: (defaultState?: boolean) => {\n      table.setColumnOrder(defaultState ? [] : table.getState().columnOrder)\n    },\n\n    // Column Pinning API\n    setColumnPinning: (_updater: Updater<ColumnPinningState>) => {},\n    resetColumnPinning: (defaultState?: boolean) => {\n      table.setColumnPinning(\n        defaultState ? { left: [], right: [] } : table.getState().columnPinning,\n      )\n    },\n    getIsSomeColumnsPinned: (position?: 'left' | 'right'): boolean => {\n      const pinning = table.getState().columnPinning\n      if (position === 'left') return (pinning.left?.length ?? 0) > 0\n      if (position === 'right') return (pinning.right?.length ?? 0) > 0\n      return (pinning.left?.length ?? 0) > 0 || (pinning.right?.length ?? 0) > 0\n    },\n\n    // Column Sizing API\n    setColumnSizing: (_updater: Updater<ColumnSizingState>) => {},\n    setColumnSizingInfo: (_updater: Updater<ColumnSizingInfoState>) => {},\n    resetColumnSizing: (defaultState?: boolean) => {\n      table.setColumnSizing(defaultState ? {} : table.getState().columnSizing)\n    },\n    sizeColumnsToFit: (width: number) => {\n      if (!Number.isFinite(width)) return\n\n      const targetWidth = Math.max(0, width)\n      const visibleColumns = table.getVisibleLeafColumns()\n      if (visibleColumns.length === 0) return\n\n      const nextSizing: ColumnSizingState = {}\n      const flexItems: ColumnSizingItem[] = []\n      let fixedTotal = 0\n\n      for (const column of visibleColumns) {\n        const flex = getColumnFlex(column)\n        const currentSize = column.getSize()\n        const bounds = getColumnSizingBounds(column)\n\n        if (flex > 0) {\n          flexItems.push({\n            id: column.id,\n            min: bounds.min,\n            max: bounds.max,\n            weight: flex,\n          })\n        } else {\n          nextSizing[column.id] = currentSize\n          fixedTotal += currentSize\n        }\n      }\n\n      if (flexItems.length > 0) {\n        const distributed = distributeColumnSizes(flexItems, targetWidth - fixedTotal)\n        for (const [id, size] of distributed) {\n          nextSizing[id] = size\n        }\n      } else {\n        const scaledItems = visibleColumns.map((column): ColumnSizingItem => {\n          const currentSize = column.getSize()\n          const bounds = getColumnSizingBounds(column)\n          return {\n            id: column.id,\n            min: bounds.min,\n            max: bounds.max,\n            weight: currentSize > 0 ? currentSize : 1,\n          }\n        })\n        const distributed = distributeColumnSizes(scaledItems, targetWidth)\n        for (const [id, size] of distributed) {\n          nextSizing[id] = size\n        }\n      }\n\n      table.setColumnSizing((old) => ({\n        ...old,\n        ...nextSizing,\n      }))\n    },\n    getTotalSize: (): number => {\n      return table\n        .getVisibleFlatColumns()\n        .reduce((sum: number, col: Column<TData, unknown>) => sum + col.getSize(), 0)\n    },\n    getLeftTotalSize: (): number => {\n      return table\n        .getLeftVisibleLeafColumns()\n        .reduce((sum: number, col: Column<TData, unknown>) => sum + col.getSize(), 0)\n    },\n    getRightTotalSize: (): number => {\n      return table\n        .getRightVisibleLeafColumns()\n        .reduce((sum: number, col: Column<TData, unknown>) => sum + col.getSize(), 0)\n    },\n    getCenterTotalSize: (): number => {\n      return table\n        .getCenterVisibleLeafColumns()\n        .reduce((sum: number, col: Column<TData, unknown>) => sum + col.getSize(), 0)\n    },\n\n    // Expanding API\n    setExpanded: (_updater: Updater<ExpandedState>) => {},\n    resetExpanded: (defaultState?: boolean) => {\n      table.setExpanded(defaultState ? {} : table.getState().expanded)\n    },\n    toggleAllRowsExpanded: (expanded?: boolean) => {\n      const shouldExpand = expanded ?? !table.getIsAllRowsExpanded()\n      if (shouldExpand) {\n        const rowModel = table.getPreExpandedRowModel()\n        const expandedState: Record<string, boolean> = {}\n        for (const row of rowModel.flatRows) {\n          if (row.subRows.length > 0) {\n            expandedState[row.id] = true\n          }\n        }\n        table.setExpanded(expandedState)\n      } else {\n        table.setExpanded({})\n      }\n    },\n    getCanSomeRowsExpand: (): boolean => {\n      return table.getPreExpandedRowModel().flatRows.some((r: Row<TData>) => r.getCanExpand())\n    },\n    getIsAllRowsExpanded: (): boolean => {\n      const rowModel = table.getPreExpandedRowModel()\n      const expanded = table.getState().expanded\n      if (expanded === true) return true\n      const expandableRows = rowModel.flatRows.filter((r: Row<TData>) => r.subRows.length > 0)\n      if (expandableRows.length === 0) return false\n      const expandedRecord = expanded as Record<string, boolean>\n      return expandableRows.every((r: Row<TData>) => expandedRecord[r.id])\n    },\n    getIsSomeRowsExpanded: (): boolean => {\n      const expanded = table.getState().expanded\n      if (expanded === true) return true\n      return Object.keys(expanded as Record<string, boolean>).length > 0\n    },\n    getExpandedDepth: (): number => {\n      const expanded = table.getState().expanded\n      if (expanded === true) return Infinity\n      let maxDepth = 0\n      const expandedRecord = expanded as Record<string, boolean>\n      const rowModel = table.getPreExpandedRowModel()\n      for (const row of rowModel.flatRows) {\n        if (expandedRecord[row.id]) {\n          maxDepth = Math.max(maxDepth, row.depth)\n        }\n      }\n      return maxDepth\n    },\n    getExpandedRowModel: (): RowModel<TData> => table.getCoreRowModel(),\n\n    // Row Pinning API\n    setRowPinning: (_updater: Updater<RowPinningState>) => {},\n    resetRowPinning: (defaultState?: boolean) => {\n      table.setRowPinning(defaultState ? { top: [], bottom: [] } : table.getState().rowPinning)\n    },\n    getTopRows: (): Row<TData>[] => {\n      const pinning = table.getState().rowPinning\n      const rowModel = table.getCoreRowModel()\n      return (pinning.top ?? [])\n        .map((id: string) => rowModel.rowsById[id])\n        .filter((row: Row<TData> | undefined): row is Row<TData> => row !== undefined)\n    },\n    getBottomRows: (): Row<TData>[] => {\n      const pinning = table.getState().rowPinning\n      const rowModel = table.getCoreRowModel()\n      return (pinning.bottom ?? [])\n        .map((id: string) => rowModel.rowsById[id])\n        .filter((row: Row<TData> | undefined): row is Row<TData> => row !== undefined)\n    },\n    getCenterRows: (): Row<TData>[] => {\n      const pinning = table.getState().rowPinning\n      const rowModel = table.getRowModel()\n      const pinned = new Set([...(pinning.top ?? []), ...(pinning.bottom ?? [])])\n      return rowModel.rows.filter((row: Row<TData>) => !pinned.has(row.id))\n    },\n\n    // Grouping API\n    setGrouping: (_updater: Updater<GroupingState>) => {},\n    resetGrouping: (defaultState?: boolean) => {\n      table.setGrouping(defaultState ? [] : table.getState().grouping)\n    },\n\n    // Internal — T1-11: _features kept on the interface for forward-compatibility\n    // but not wired to a plugin system yet\n    _features: [],\n    initialState: getInitialState(),\n\n    // Editing API\n    setEditing: (_updater: Updater<EditingState>) => {},\n    startEditing: (rowId: string, columnId: string) => {\n      const focusedCell = getCellPositionByIds(table, rowId, columnId)\n      if (focusedCell) {\n        table.setFocusedCell(focusedCell)\n      }\n\n      table.setEditing((old: EditingState) => ({\n        ...old,\n        activeCell: { rowId, columnId },\n      }))\n    },\n    commitEdit: () => {\n      const editing = table.getState().editing\n      if (!editing?.activeCell) return\n\n      const { rowId, columnId } = editing.activeCell\n\n      // Capture cursor position so we can keep focus on the cell after commit\n      const focusedCell = getCellPositionByIds(table, rowId, columnId)\n\n      // Read the pending value (may be undefined if user pressed Enter without changes)\n      const pendingValue = editing.pendingValues?.[rowId]?.[columnId]\n      const hasPending = pendingValue !== undefined\n\n      // Clear active cell first so the input unmounts. Also drop the pending\n      // value for this cell since the coordinator now owns it.\n      table.setEditing((old: EditingState) => {\n        const nextPending: Record<string, Record<string, unknown>> = {\n          ...(old.pendingValues ?? {}),\n        }\n        if (hasPending && nextPending[rowId]) {\n          const row: Record<string, unknown> = { ...nextPending[rowId] }\n          delete row[columnId]\n          if (Object.keys(row).length === 0) {\n            delete nextPending[rowId]\n          } else {\n            nextPending[rowId] = row\n          }\n        }\n        return {\n          ...old,\n          activeCell: undefined,\n          pendingValues: nextPending,\n        }\n      })\n\n      if (focusedCell) {\n        table.setFocusedCell(focusedCell)\n      }\n\n      // Per-column commit hooks fire for every committed cell, independent of\n      // the table-level onCommit/onEditCommit handler below.\n      if (hasPending) {\n        fireColumnCommitHooks(table, { [rowId]: { [columnId]: pendingValue } })\n      }\n\n      // If onCommit is defined and autoCommit !== false, dispatch through the\n      // coordinator. Otherwise (legacy mode), fire the existing onEditCommit hook.\n      const opts = table.options\n      const autoCommit = opts.autoCommit !== false\n      if (hasPending && opts.onCommit && autoCommit) {\n        let previousValue: unknown\n        try {\n          previousValue = table.getRow(rowId, true).getValue(columnId)\n        } catch {\n          previousValue = undefined\n        }\n        // Fire-and-forget — coordinator updates the slice asynchronously,\n        // and the table re-renders via state changes\n        void commitCoordinatorMap\n          .get(table as Table<RowData>)\n          ?.dispatch([{ rowId, columnId, value: pendingValue, previousValue }])\n      } else if (hasPending && opts.onEditCommit) {\n        // Legacy fallback\n        opts.onEditCommit({ [rowId]: { [columnId]: pendingValue } as Partial<TData> })\n      }\n    },\n    cancelEdit: () => {\n      const editing = table.getState().editing\n      const focusedCell = editing?.activeCell\n        ? getCellPositionByIds(table, editing.activeCell.rowId, editing.activeCell.columnId)\n        : null\n\n      table.setEditing((old: EditingState) => ({\n        ...old,\n        activeCell: undefined,\n      }))\n\n      if (focusedCell) {\n        table.setFocusedCell(focusedCell)\n      }\n    },\n    resetEditing: (defaultState?: boolean) => {\n      table.setEditing(\n        defaultState ? { activeCell: undefined, pendingValues: {} } : table.getState().editing,\n      )\n    },\n    setPendingValue: (rowId: string, columnId: string, value: unknown) => {\n      table.setEditing((old: EditingState) => ({\n        ...old,\n        pendingValues: {\n          ...old.pendingValues,\n          [rowId]: {\n            ...(old.pendingValues[rowId] ?? {}),\n            [columnId]: value,\n          },\n        },\n      }))\n    },\n    getPendingValue: (rowId: string, columnId: string): unknown | undefined => {\n      const editing = table.getState().editing\n      return editing.pendingValues?.[rowId]?.[columnId]\n    },\n    getPendingRow: (rowId: string): Partial<TData> | undefined => {\n      const editing = table.getState().editing\n      return editing.pendingValues?.[rowId] as Partial<TData> | undefined\n    },\n    getAllPendingChanges: (): Record<string, Partial<TData>> => {\n      const editing = table.getState().editing\n      return (editing.pendingValues ?? {}) as Record<string, Partial<TData>>\n    },\n    hasPendingChanges: (): boolean => {\n      return Object.keys(table.getAllPendingChanges()).length > 0\n    },\n    isValid: (): boolean => {\n      return Object.keys(table.getValidationErrors()).length === 0\n    },\n    commitAllPending: () => {\n      const changes = table.getAllPendingChanges()\n      fireColumnCommitHooks(table, changes)\n      resolvedOptions.onEditCommit?.(changes)\n      table.setEditing((old: EditingState) => ({\n        ...old,\n        pendingValues: {},\n      }))\n    },\n    discardAllPending: () => {\n      table.setEditing((old: EditingState) => ({\n        ...old,\n        pendingValues: {},\n      }))\n    },\n    getValidationErrors: (): Record<string, Record<string, string>> => {\n      // Compute validation errors on the fly from the current pending edits by\n      // running each column's editConfig.validate against its pending value.\n      const result: Record<string, Record<string, string>> = {}\n      try {\n        const pendingValues = table.getState().editing?.pendingValues ?? {}\n\n        for (const rowId of Object.keys(pendingValues)) {\n          const rowPending = pendingValues[rowId]\n          if (!rowPending) continue\n\n          // Resolve the row once per pending row; validators receive it. If the\n          // row no longer exists, skip validation rather than throwing.\n          let row: Row<TData> | undefined\n          try {\n            row = table.getRow(rowId, true)\n          } catch {\n            row = undefined\n          }\n          if (!row) continue\n\n          for (const columnId of Object.keys(rowPending)) {\n            const column = table.getColumn(columnId)\n            if (!column) continue\n\n            const editConfig = (\n              column.columnDef as ColumnDef<TData> & Partial<ColumnDefExtensions<TData>>\n            ).editConfig\n            const validate = editConfig?.validate\n            if (!validate) continue\n\n            try {\n              const error = validate(rowPending[columnId], row)\n              if (error) {\n                if (!result[rowId]) result[rowId] = {}\n                result[rowId]![columnId] = error\n              }\n            } catch (err) {\n              console.error(\n                `[yable] editConfig.validate threw for column \"${columnId}\", row \"${rowId}\":`,\n                err,\n              )\n            }\n          }\n        }\n      } catch (err) {\n        console.error('[yable] getValidationErrors failed:', err)\n      }\n      return result\n    },\n\n    // Async commit API (Task #10) — wired below after the literal\n    getCellRenderValue: () => undefined,\n    getCellStatus: () => 'idle',\n    getCellErrorMessage: () => undefined,\n    getCellConflictWith: () => undefined,\n    commit: async () => {},\n    retryCommit: async () => {},\n    dismissCommit: () => {},\n    dismissAllCommits: () => {},\n\n    // Keyboard Navigation API\n    setKeyboardNavigation: (_updater: Updater<KeyboardNavigationState>) => {},\n    getFocusedCell: () => {\n      return normalizeFocusedCell(table, table.getState().keyboardNavigation?.focusedCell)\n    },\n    setFocusedCell: (cell: KeyboardNavigationCell | null) => {\n      const normalized = normalizeFocusedCell(table, cell)\n      table.setKeyboardNavigation((old: KeyboardNavigationState) => ({\n        ...old,\n        focusedCell: normalized,\n      }))\n    },\n    clearFocusedCell: () => {\n      table.setKeyboardNavigation((old: KeyboardNavigationState) => ({\n        ...old,\n        focusedCell: null,\n      }))\n    },\n    moveFocus: (action: KeyboardNavigationAction) => {\n      const nextCell = getNextFocusedCell(table, table.getFocusedCell(), action)\n      table.setFocusedCell(nextCell)\n      return nextCell\n    },\n    resetKeyboardNavigation: (defaultState?: boolean) => {\n      table.setKeyboardNavigation(\n        defaultState ? { focusedCell: null } : table.getState().keyboardNavigation,\n      )\n    },\n\n    // Clipboard API — wired below after row/column models are available\n    copyToClipboard: () => '',\n    pasteFromClipboard: () => {},\n    cutCells: () => '',\n\n    // Export API\n    exportData: (opts?: ExportOptions): string => {\n      const rowModel = opts?.allRows ? table.getPrePaginationRowModel() : table.getRowModel()\n      const columns = opts?.columns\n        ? table\n            .getAllLeafColumns()\n            .filter((col: Column<TData, unknown>) => opts.columns!.includes(col.id))\n        : table.getVisibleLeafColumns()\n\n      if (opts?.format === 'json' || !opts?.format) {\n        const data = rowModel.rows.map((row: Row<TData>) => {\n          const obj: Record<string, unknown> = {}\n          for (const col of columns) {\n            obj[col.id] = row.getValue(col.id)\n          }\n          return obj\n        })\n        return JSON.stringify(data, null, 2)\n      }\n\n      if (opts?.format === 'csv') {\n        const headers = columns.map((col: Column<TData, unknown>) => {\n          const header = typeof col.columnDef.header === 'string' ? col.columnDef.header : col.id\n          return escapeCSV(header)\n        })\n\n        const rows = rowModel.rows.map((row: Row<TData>) =>\n          columns\n            .map((col: Column<TData, unknown>) => escapeCSV(String(row.getValue(col.id) ?? '')))\n            .join(','),\n        )\n\n        return [headers.join(','), ...rows].join('\\n')\n      }\n\n      return ''\n    },\n\n    // Pagination state setters (placeholder — wired below)\n    setPagination: (_updater: Updater<PaginationState>) => {},\n\n    // Events\n    events,\n\n    // T1-06: Locale support\n    getLocaleString: (key: string): string => {\n      // Check for per-table locale option first\n      const tableLocale = (\n        resolvedOptions as TableOptionsResolved<TData> & { locale?: Partial<YableLocale> }\n      ).locale\n      if (tableLocale && key in tableLocale) {\n        const value = (tableLocale as Record<string, string>)[key]\n        if (value !== undefined) return value\n      }\n      // Fall back to global default locale\n      return (getDefaultLocale() as unknown as Record<string, string>)[key] ?? key\n    },\n\n    // Column Drag State (used by suppressDragHidesColumns)\n    setColumnDragActive: (active: boolean) => {\n      _columnDragActive = active\n    },\n    getIsColumnDragActive: () => _columnDragActive,\n\n    // Smart column width — signal any active `autoColumnWidth` sizing (wired in\n    // the React layer via `table.events`) to re-measure now.\n    remeasureColumns: (reason?: string) => {\n      events.emit('columns:remeasure', { reason })\n    },\n\n    // Stubs for externally-wired features — filled in by integration functions\n    // (undoRedo, fillHandle, formulas, rowDragging, fullRowEditing, pivot)\n    undo: () => {},\n    redo: () => {},\n    canUndo: () => false,\n    canRedo: () => false,\n    clearUndoHistory: () => {},\n    fillRange: () => {},\n    setFormula: () => {},\n    getFormula: () => undefined,\n    evaluateFormulas: () => {},\n    moveRow: () => {},\n    startRowEditing: () => {},\n    commitRowEdit: () => {},\n    cancelRowEdit: () => {},\n    isRowEditing: () => false,\n    getEditingRows: () => [],\n    getEditableColumnIds: () => [],\n    getPivotRowModel: (): RowModel<TData> => ({ rows: [], flatRows: [], rowsById: {} }),\n  }\n\n  // ---------------------------------------------------------------------------\n  // Wire up state updaters to use table instance\n  // ---------------------------------------------------------------------------\n\n  // makeStateUpdater requires loosely-typed setState/getState/options due to its\n  // mapped-type signature. Cast the table to satisfy the parameter shape.\n  const wireUpdater = <V>(key: keyof TableState) => {\n    return makeStateUpdater(key, table as Parameters<typeof makeStateUpdater>[1]) as (\n      updater: Updater<V>,\n    ) => void\n  }\n\n  table.setSorting = wireUpdater<SortingState>('sorting')\n  table.setColumnFilters = wireUpdater<ColumnFiltersState>('columnFilters')\n  table.setGlobalFilter = wireUpdater<string>('globalFilter')\n  const setRowSelectionBase = wireUpdater<RowSelectionState>('rowSelection')\n  table.setRowSelection = (updater: Updater<RowSelectionState>) => {\n    const previous = table.getState().rowSelection\n    const next = functionalUpdate(updater, previous)\n    setRowSelectionBase(next)\n    table.events.emit('selection:change', {\n      selection: next,\n      selectedRows: table\n        .getPrePaginationRowModel()\n        .flatRows.filter((row: Row<TData>) => next[row.id]),\n    })\n  }\n  table.setColumnVisibility = wireUpdater<VisibilityState>('columnVisibility')\n  table.setColumnOrder = wireUpdater<ColumnOrderState>('columnOrder')\n  table.setColumnPinning = wireUpdater<ColumnPinningState>('columnPinning')\n  table.setColumnSizing = wireUpdater<ColumnSizingState>('columnSizing')\n  table.setColumnSizingInfo = wireUpdater<ColumnSizingInfoState>('columnSizingInfo')\n  table.setExpanded = wireUpdater<ExpandedState>('expanded')\n  table.setRowPinning = wireUpdater<RowPinningState>('rowPinning')\n  table.setGrouping = wireUpdater<GroupingState>('grouping')\n  table.setEditing = wireUpdater<EditingState>('editing')\n  table.setKeyboardNavigation = wireUpdater<KeyboardNavigationState>('keyboardNavigation')\n  table.setPagination = wireUpdater<PaginationState>('pagination')\n\n  // ---------------------------------------------------------------------------\n  // Column Processing — T1-01: Build columnMap for O(1) lookup\n  // ---------------------------------------------------------------------------\n\n  const processColumns = memo(\n    () => [resolvedOptions.columns, resolvedOptions.state?.columnOrder],\n    (columnDefs: ColumnDef<TData>[]) => {\n      const allColumns: Column<TData, unknown>[] = []\n      const allFlatColumns: Column<TData, unknown>[] = []\n      const columnMap = new Map<string, Column<TData, unknown>>()\n\n      const processColumnDef = (\n        colDef: ColumnDef<TData>,\n        depth: number,\n        parent?: Column<TData, unknown>,\n      ): Column<TData, unknown> => {\n        // Merge defaultColumnDef under the column def — column-specific values win\n        const mergedColDef = resolvedOptions.defaultColumnDef\n          ? ({ ...resolvedOptions.defaultColumnDef, ...colDef } as ColumnDef<TData>)\n          : colDef\n        const column = createColumn(table, mergedColDef, depth, parent)\n        allColumns.push(column)\n        columnMap.set(column.id, column)\n\n        if ('columns' in colDef && colDef.columns?.length) {\n          column.columns = colDef.columns.map((subDef: ColumnDef<TData>) =>\n            processColumnDef(subDef, depth + 1, column),\n          )\n        } else {\n          allFlatColumns.push(column)\n        }\n\n        return column\n      }\n\n      const topLevel = columnDefs.map((def: ColumnDef<TData>) => processColumnDef(def, 0))\n\n      return {\n        topLevel,\n        allColumns,\n        allFlatColumns,\n        allLeafColumns: allFlatColumns,\n        columnMap,\n      }\n    },\n    { key: 'processColumns' },\n  )\n\n  table.getAllColumns = () => processColumns().allColumns\n  table.getAllFlatColumns = () => processColumns().allFlatColumns\n  table.getAllLeafColumns = () => processColumns().allLeafColumns\n  // T1-01: O(1) column lookup via Map instead of linear .find()\n  table.getColumn = (id: string) => processColumns().columnMap.get(id)\n\n  // Visible columns with ordering and pinning\n  table.getVisibleFlatColumns = memo(\n    () => [\n      table.getAllLeafColumns(),\n      table.getState().columnVisibility,\n      table.getState().columnOrder,\n    ],\n    (allLeaf: Column<TData, unknown>[]) => {\n      let cols = allLeaf.filter((col: Column<TData, unknown>) => col.getIsVisible())\n      const order = table.getState().columnOrder\n      if (order.length) {\n        const orderMap = new Map<string, number>(order.map((id: string, i: number) => [id, i]))\n        cols = cols.sort((a: Column<TData, unknown>, b: Column<TData, unknown>) => {\n          const ai: number = orderMap.get(a.id) ?? Infinity\n          const bi: number = orderMap.get(b.id) ?? Infinity\n          return ai - bi\n        })\n      }\n      return cols\n    },\n    { key: 'getVisibleFlatColumns' },\n  )\n\n  table.getVisibleLeafColumns = table.getVisibleFlatColumns\n\n  table.getLeftVisibleLeafColumns = memo(\n    () => [table.getVisibleFlatColumns(), table.getState().columnPinning],\n    (visible: Column<TData, unknown>[]) => {\n      const pinned = table.getState().columnPinning.left ?? []\n      return visible.filter((col) => pinned.includes(col.id))\n    },\n    { key: 'getLeftVisibleLeafColumns' },\n  )\n\n  table.getRightVisibleLeafColumns = memo(\n    () => [table.getVisibleFlatColumns(), table.getState().columnPinning],\n    (visible: Column<TData, unknown>[]) => {\n      const pinned = table.getState().columnPinning.right ?? []\n      return visible.filter((col) => pinned.includes(col.id))\n    },\n    { key: 'getRightVisibleLeafColumns' },\n  )\n\n  table.getCenterVisibleLeafColumns = memo(\n    () => [table.getVisibleFlatColumns(), table.getState().columnPinning],\n    (visible: Column<TData, unknown>[]) => {\n      const left = new Set(table.getState().columnPinning.left ?? [])\n      const right = new Set(table.getState().columnPinning.right ?? [])\n      return visible.filter((col) => !left.has(col.id) && !right.has(col.id))\n    },\n    { key: 'getCenterVisibleLeafColumns' },\n  )\n\n  // ---------------------------------------------------------------------------\n  // Header Groups\n  // ---------------------------------------------------------------------------\n\n  table.getHeaderGroups = memo(\n    () => [\n      table.getAllColumns(),\n      table.getState().columnVisibility,\n      table.getState().columnPinning,\n      table.getState().columnOrder,\n    ],\n    () => buildHeaderGroups(table, processColumns().topLevel),\n    { key: 'getHeaderGroups' },\n  )\n\n  table.getLeftHeaderGroups = memo(\n    () => [table.getHeaderGroups(), table.getState().columnPinning],\n    (groups: HeaderGroup<TData>[]) => {\n      const leftIds = new Set(table.getState().columnPinning.left ?? [])\n      if (leftIds.size === 0) return []\n      return groups.map((group: HeaderGroup<TData>) => ({\n        ...group,\n        headers: group.headers.filter((h: Header<TData, unknown>) => leftIds.has(h.column.id)),\n      }))\n    },\n    { key: 'getLeftHeaderGroups' },\n  )\n\n  table.getRightHeaderGroups = memo(\n    () => [table.getHeaderGroups(), table.getState().columnPinning],\n    (groups: HeaderGroup<TData>[]) => {\n      const rightIds = new Set(table.getState().columnPinning.right ?? [])\n      if (rightIds.size === 0) return []\n      return groups.map((group: HeaderGroup<TData>) => ({\n        ...group,\n        headers: group.headers.filter((h: Header<TData, unknown>) => rightIds.has(h.column.id)),\n      }))\n    },\n    { key: 'getRightHeaderGroups' },\n  )\n\n  table.getCenterHeaderGroups = memo(\n    () => [table.getHeaderGroups(), table.getState().columnPinning],\n    (groups: HeaderGroup<TData>[]) => {\n      const leftIds = new Set(table.getState().columnPinning.left ?? [])\n      const rightIds = new Set(table.getState().columnPinning.right ?? [])\n      return groups.map((group: HeaderGroup<TData>) => ({\n        ...group,\n        headers: group.headers.filter(\n          (h: Header<TData, unknown>) => !leftIds.has(h.column.id) && !rightIds.has(h.column.id),\n        ),\n      }))\n    },\n    { key: 'getCenterHeaderGroups' },\n  )\n\n  table.getFooterGroups = () => [...table.getHeaderGroups()].reverse()\n  table.getLeftFooterGroups = () => [...table.getLeftHeaderGroups()].reverse()\n  table.getRightFooterGroups = () => [...table.getRightHeaderGroups()].reverse()\n  table.getCenterFooterGroups = () => [...table.getCenterHeaderGroups()].reverse()\n\n  // ---------------------------------------------------------------------------\n  // Row Model Pipeline\n  // ---------------------------------------------------------------------------\n\n  // 1. Core Row Model — raw data -> Row[]\n  table.getCoreRowModel = memo(\n    // Tree data re-flattens whenever the expanded set changes, so its memo key\n    // includes `expanded`. The flat path keeps the original `[data]` key to\n    // avoid re-running on unrelated expansion state.\n    () =>\n      resolvedOptions.treeData && resolvedOptions.getDataPath\n        ? [resolvedOptions.data, table.getState().expanded]\n        : [resolvedOptions.data],\n    (data: TData[]) => {\n      // T1-05: guard against null/undefined data\n      const safeData = data ?? []\n\n      // Tree data: build a hierarchical row model from `getDataPath`. Filter\n      // and sort stages below re-enter the tree pipeline so hierarchy is\n      // preserved instead of operating over already-flattened visible rows.\n      if (resolvedOptions.treeData && resolvedOptions.getDataPath) {\n        return getTreeRowModel(table, safeData, resolvedOptions.getDataPath)\n      }\n\n      // T1-10: Large dataset warning\n      if (\n        safeData.length > 10_000 &&\n        !resolvedOptions.enableVirtualization &&\n        !_largeDatasetWarned\n      ) {\n        _largeDatasetWarned = true\n        console.warn(\n          `Yable: Rendering ${safeData.length} rows without virtualization. Consider enabling virtualization for better performance.`,\n        )\n      }\n\n      const rows: Row<TData>[] = safeData.map((original: TData, index: number) => {\n        let id: string\n        if (resolvedOptions.getRowId) {\n          // T1-09: Wrap user callback in try-catch\n          try {\n            id = resolvedOptions.getRowId(original, index)\n          } catch (err) {\n            console.error(`[yable] getRowId threw for row at index ${index}:`, err)\n            id = String(index)\n          }\n        } else {\n          id = String(index)\n        }\n\n        return createRow(table, id, original, index, 0)\n      })\n\n      const flatRows = rows\n      const rowsById: Record<string, Row<TData>> = {}\n      for (const row of flatRows) {\n        rowsById[row.id] = row\n      }\n\n      return { rows, flatRows, rowsById }\n    },\n    { key: 'getCoreRowModel' },\n  )\n\n  // 2. Pre-filter = core\n  table.getPreFilteredRowModel = table.getCoreRowModel\n\n  // 3. Filtered Row Model\n  table.getFilteredRowModel = memo(\n    () => [table.getCoreRowModel(), table.getState().columnFilters, table.getState().globalFilter],\n    (coreModel: RowModel<TData>) => {\n      if (resolvedOptions.manualFiltering) return coreModel\n\n      const columnFilters = table.getState().columnFilters\n      const globalFilter = table.getState().globalFilter\n\n      if (columnFilters.length === 0 && !globalFilter) return coreModel\n\n      if (resolvedOptions.treeData && resolvedOptions.getDataPath) {\n        return getTreeRowModel(table, resolvedOptions.data ?? [], resolvedOptions.getDataPath, {\n          filterNode: (node) =>\n            rowPassesFilters(table, createTreeNodeRow(table, node), columnFilters, globalFilter),\n        })\n      }\n\n      let filtered = coreModel.rows\n\n      // Apply column filters\n      filtered = filtered.filter((row: Row<TData>) =>\n        rowPassesColumnFilters(table, row, columnFilters),\n      )\n\n      // Apply global filter\n      filtered = filtered.filter((row: Row<TData>) =>\n        rowPassesGlobalFilter(table, row, globalFilter),\n      )\n\n      const rowsById: Record<string, Row<TData>> = {}\n      for (const row of filtered) {\n        rowsById[row.id] = row\n      }\n\n      return { rows: filtered, flatRows: filtered, rowsById }\n    },\n    { key: 'getFilteredRowModel' },\n  )\n\n  // 4. Pre-sort = filtered\n  table.getPreSortedRowModel = table.getFilteredRowModel\n\n  // 5. Sorted Row Model\n  table.getSortedRowModel = memo(\n    () => [table.getFilteredRowModel(), table.getState().sorting],\n    (filteredModel: RowModel<TData>) => {\n      // `postSortRows` (AG-parity) may reorder the final rows even when no\n      // column sorting is active — e.g. keeping child rows under their parents.\n      const postSortRows = resolvedOptions.postSortRows\n      const applyPostSort = (rows: Row<TData>[]): Row<TData>[] | null => {\n        if (!postSortRows) return null\n        const arr = rows.slice()\n        const returned = postSortRows(arr)\n        return Array.isArray(returned) ? returned : arr\n      }\n\n      const buildModel = (rows: Row<TData>[]): RowModel<TData> => {\n        const rowsById: Record<string, Row<TData>> = {}\n        for (const row of rows) {\n          rowsById[row.id] = row\n        }\n        return { rows, flatRows: rows, rowsById }\n      }\n\n      if (resolvedOptions.manualSorting) return filteredModel\n\n      const sorting = table.getState().sorting\n      const hasSorting = sorting.length > 0\n\n      if ((hasSorting || postSortRows) && resolvedOptions.treeData && resolvedOptions.getDataPath) {\n        const columnFilters = table.getState().columnFilters\n        const globalFilter = table.getState().globalFilter\n        const hasFilters = columnFilters.length > 0 || Boolean(globalFilter)\n\n        const treeModel = getTreeRowModel(\n          table,\n          resolvedOptions.data ?? [],\n          resolvedOptions.getDataPath,\n          {\n            filterNode: hasFilters\n              ? (node) =>\n                  rowPassesFilters(\n                    table,\n                    createTreeNodeRow(table, node),\n                    columnFilters,\n                    globalFilter,\n                  )\n              : undefined,\n            compareNodes: hasSorting ? createTreeNodeComparator(table, sorting) : undefined,\n          },\n        )\n        const posted = applyPostSort(treeModel.rows)\n        return posted ? buildModel(posted) : treeModel\n      }\n\n      if (!hasSorting) {\n        const posted = applyPostSort(filteredModel.rows)\n        return posted ? buildModel(posted) : filteredModel\n      }\n\n      const sorted = [...filteredModel.rows].sort((a, b) =>\n        compareRowsBySorting(table, a, b, sorting),\n      )\n\n      return buildModel(applyPostSort(sorted) ?? sorted)\n    },\n    { key: 'getSortedRowModel' },\n  )\n\n  // 5b. Grouped Row Model — when `state.grouping` is non-empty, produce a\n  // flattened model of synthetic group header rows (with per-column aggregates)\n  // interleaved with their expanded descendant rows.\n  table.getPreGroupedRowModel = table.getSortedRowModel\n  table.getGroupedRowModel = memo(\n    () => [table.getSortedRowModel(), table.getState().grouping, table.getState().expanded],\n    (sortedModel: RowModel<TData>) =>\n      buildGroupedRowModel(\n        table,\n        sortedModel.rows,\n        table.getState().grouping ?? [],\n        table.getState().expanded as Record<string, boolean>,\n      ),\n    { key: 'getGroupedRowModel' },\n  )\n\n  // 6. Pre-pagination = grouped (when grouping active) else sorted\n  table.getPrePaginationRowModel = () =>\n    (table.getState().grouping?.length ?? 0) > 0\n      ? table.getGroupedRowModel()\n      : table.getSortedRowModel()\n\n  // 7. Paginated Row Model\n  table.getPaginationRowModel = memo(\n    () => [table.getPrePaginationRowModel(), table.getState().pagination],\n    (preModel: RowModel<TData>) => {\n      if (resolvedOptions.manualPagination) return preModel\n\n      // Row virtualization renders the full (sorted/grouped) dataset directly.\n      // If client pagination also sliced here, the virtualizer would only ever\n      // receive one page (the default 10 rows) — making virtualization look\n      // broken with no error. Bypass the slice so `enableVirtualization` works\n      // over the whole dataset without a `pageSize: Infinity` workaround. See\n      // issue #54. (`manualPagination` above still wins — the server controls\n      // the page there.)\n      if (resolvedOptions.enableVirtualization) return preModel\n\n      const { pageIndex, pageSize } = table.getState().pagination\n      // Clamp the page at read time: when filtering/data changes shrink the row\n      // set below the current page, render the last valid page instead of an\n      // empty out-of-range slice (the stored pageIndex is left untouched).\n      const lastPage =\n        pageSize > 0 ? Math.max(0, Math.ceil(preModel.rows.length / pageSize) - 1) : 0\n      const safePageIndex = Math.min(Math.max(0, pageIndex), lastPage)\n      const start = safePageIndex * pageSize\n      const end = start + pageSize\n      const paginated = preModel.rows.slice(start, end)\n\n      const rowsById: Record<string, Row<TData>> = {}\n      for (const row of paginated) {\n        rowsById[row.id] = row\n      }\n\n      return { rows: paginated, flatRows: paginated, rowsById }\n    },\n    { key: 'getPaginationRowModel' },\n  )\n\n  // Final row model = paginated\n  table.getRowModel = table.getPaginationRowModel\n\n  // getRow\n  table.getRow = (id: string, searchAll?: boolean) => {\n    const model = searchAll ? table.getCoreRowModel() : table.getRowModel()\n    const row = model.rowsById[id]\n    if (!row) {\n      throw new Error(`[yable E003] Row with id \"${id}\" not found.`)\n    }\n    return row\n  }\n\n  // Pre-expanded and pre-grouped models. Pre-grouped = the sorted model\n  // (grouping runs after sorting), matching the `getGroupedRowModel` pipeline.\n  table.getPreExpandedRowModel = table.getSortedRowModel\n  table.getPreGroupedRowModel = table.getSortedRowModel\n\n  // ---------------------------------------------------------------------------\n  // Commit Coordinator (Task #10)\n  // ---------------------------------------------------------------------------\n\n  const setCommitsSlice = (next: CommitsSlice) => {\n    table.setState((old: TableState) => ({ ...old, commits: next }))\n  }\n\n  let lastDataRef: unknown = resolvedOptions.data\n\n  const commitCoordinator = createCommitCoordinator(\n    {\n      getSlice: () => table.getState().commits,\n      setSlice: setCommitsSlice,\n      getSavedValue: (rowId: string, columnId: string) => {\n        try {\n          const row = table.getRow(rowId, true)\n          return row.getValue(columnId)\n        } catch {\n          return undefined\n        }\n      },\n      getRow: (rowId: string) => {\n        try {\n          return table.getRow(rowId, true).original\n        } catch {\n          return undefined\n        }\n      },\n      rowExists: (rowId: string) => {\n        try {\n          table.getRow(rowId, true)\n          return true\n        } catch {\n          return false\n        }\n      },\n    },\n    {\n      onCommit: resolvedOptions.onCommit as CoordinatorOptions['onCommit'],\n      resolveColumnCommit: (columnId: string) => {\n        const col = table.getColumn(columnId)\n        type ColDefWithCommit = ColumnDef<TData> & { commit?: CoordinatorOptions['onCommit'] }\n        const def = col?.columnDef as ColDefWithCommit | undefined\n        return def?.commit\n      },\n      rowCommitRetryMode: resolvedOptions.rowCommitRetryMode ?? 'failed',\n    },\n  )\n\n  commitCoordinatorMap.set(table as Table<RowData>, commitCoordinator)\n\n  // Wire new table methods (override the literal stubs)\n  table.getCellRenderValue = (rowId: string, columnId: string) => {\n    const status = commitCoordinator.getCellStatus(rowId, columnId)\n    if (status !== 'idle') {\n      return commitCoordinator.getRenderValue(rowId, columnId)\n    }\n    try {\n      return table.getRow(rowId, true).getValue(columnId)\n    } catch {\n      return undefined\n    }\n  }\n\n  table.getCellStatus = (rowId: string, columnId: string) =>\n    commitCoordinator.getCellStatus(rowId, columnId)\n\n  table.getCellErrorMessage = (rowId: string, columnId: string) =>\n    commitCoordinator.getRecord(rowId, columnId)?.errorMessage\n\n  table.getCellConflictWith = (rowId: string, columnId: string) =>\n    commitCoordinator.getRecord(rowId, columnId)?.conflictWith\n\n  table.commit = async () => {\n    // When autoCommit is true, the coordinator has already fired everything;\n    // there's nothing buffered. When autoCommit is false, the existing\n    // pendingValues from the editing slice are flushed through the coordinator.\n    const editing = table.getState().editing\n    const pendingValues: Record<string, Record<string, unknown>> = editing.pendingValues ?? {}\n    const patches: Omit<CellPatch, 'signal' | 'row'>[] = []\n    for (const rowId of Object.keys(pendingValues)) {\n      for (const colId of Object.keys(pendingValues[rowId]!)) {\n        let previousValue: unknown\n        try {\n          previousValue = table.getRow(rowId, true).getValue(colId)\n        } catch {\n          previousValue = undefined\n        }\n        patches.push({\n          rowId,\n          columnId: colId,\n          value: pendingValues[rowId]![colId],\n          previousValue,\n        })\n      }\n    }\n    if (patches.length === 0) return\n    await commitCoordinator.dispatch(patches)\n    table.setEditing((old: EditingState) => ({ ...old, pendingValues: {} }))\n  }\n\n  table.retryCommit = async (rowId: string, columnId: string) => {\n    await commitCoordinator.retry(rowId, columnId)\n  }\n\n  table.dismissCommit = (rowId: string, columnId: string) => {\n    commitCoordinator.dismiss(rowId, columnId)\n  }\n\n  table.dismissAllCommits = () => {\n    commitCoordinator.dismissAll()\n  }\n\n  // Sweep triggers — fire on data ref change\n  const originalSetOptions = table.setOptions\n  table.setOptions = (updater: Updater<TableOptionsResolved<TData>>) => {\n    originalSetOptions(updater)\n    const data = table.options.data\n    if (data !== lastDataRef) {\n      lastDataRef = data\n      commitCoordinator.runOrphanedGc()\n      commitCoordinator.runAutoClearSweep()\n      commitCoordinator.runConflictDetection()\n    }\n  }\n\n  const resolveClipboardOptions = (options?: {\n    delimiter?: string\n    rowDelimiter?: string\n    includeHeaders?: boolean\n  }) => ({\n    delimiter: options?.delimiter ?? '\\t',\n    rowDelimiter: options?.rowDelimiter ?? '\\n',\n    includeHeaders: options?.includeHeaders ?? false,\n  })\n\n  const buildCopiedCells = (\n    rows: Row<TData>[],\n    columns: Column<TData, unknown>[],\n  ): { rowId: string; columnId: string; value: unknown }[] =>\n    rows.flatMap((row) =>\n      columns.map((column) => ({\n        rowId: row.id,\n        columnId: column.id,\n        value: row.getValue(column.id),\n      })),\n    )\n\n  table.copyToClipboard = (options?: {\n    delimiter?: string\n    rowDelimiter?: string\n    includeHeaders?: boolean\n  }) => {\n    const resolved = resolveClipboardOptions(options)\n    const rowModel = table.getRowModel()\n    const visibleColumns = table.getVisibleLeafColumns()\n    const range = table.getCellSelectionRange()\n\n    let rows: Row<TData>[] = []\n    let columns: Column<TData, unknown>[] = []\n\n    if (range) {\n      const normalized = normalizeCellRange(range)\n      rows = rowModel.rows.slice(normalized.top, normalized.bottom + 1)\n      columns = visibleColumns.slice(normalized.left, normalized.right + 1)\n    } else {\n      const selection = table.getState().rowSelection\n      rows = rowModel.rows.filter((row: Row<TData>) => selection[row.id])\n      columns = visibleColumns\n\n      if (rows.length === 0) {\n        const focusedCell = table.getFocusedCell()\n        if (focusedCell) {\n          const row = rowModel.rows[focusedCell.rowIndex]\n          const column = visibleColumns[focusedCell.columnIndex]\n          if (row && column) {\n            rows = [row]\n            columns = [column]\n          }\n        }\n      }\n    }\n\n    if (rows.length === 0 || columns.length === 0) {\n      return ''\n    }\n\n    const text = serializeCells(rows, columns, resolved)\n    table.events.emit('clipboard:copy', {\n      text,\n      cells: buildCopiedCells(rows, columns),\n    })\n    return text\n  }\n\n  table.pasteFromClipboard = (\n    text: string,\n    targetRowId: string,\n    targetColumnId: string,\n    options?: {\n      delimiter?: string\n      rowDelimiter?: string\n      includeHeaders?: boolean\n    },\n  ) => {\n    const resolved = resolveClipboardOptions(options)\n    const data = parseClipboardText(text, resolved)\n    if (data.length === 0) return\n\n    const pastedCells = applyCellPaste(\n      table,\n      data,\n      targetRowId,\n      targetColumnId,\n      table.getRowModel().rows,\n      table.getVisibleLeafColumns(),\n    )\n\n    table.events.emit('clipboard:paste', {\n      text,\n      cells: pastedCells,\n    })\n  }\n\n  table.cutCells = (options?: {\n    delimiter?: string\n    rowDelimiter?: string\n    includeHeaders?: boolean\n  }) => {\n    const text = table.copyToClipboard(options)\n    if (!text) return text\n\n    const range = table.getCellSelectionRange()\n    const rowModel = table.getRowModel()\n    const visibleColumns = table.getVisibleLeafColumns()\n    let rows: Row<TData>[] = []\n    let columns: Column<TData, unknown>[] = []\n\n    if (range) {\n      const normalized = normalizeCellRange(range)\n      rows = rowModel.rows.slice(normalized.top, normalized.bottom + 1)\n      columns = visibleColumns.slice(normalized.left, normalized.right + 1)\n    } else {\n      const focusedCell = table.getFocusedCell()\n      if (focusedCell) {\n        const row = rowModel.rows[focusedCell.rowIndex]\n        const column = visibleColumns[focusedCell.columnIndex]\n        if (row && column) {\n          rows = [row]\n          columns = [column]\n        }\n      }\n    }\n\n    const cutCells = buildCopiedCells(rows, columns)\n    for (const cell of cutCells) {\n      const column = table.getColumn(cell.columnId)\n      if ((column?.columnDef as { editable?: boolean } | undefined)?.editable === false) {\n        continue\n      }\n      table.setPendingValue(cell.rowId, cell.columnId, '')\n    }\n\n    table.events.emit('clipboard:cut', {\n      text,\n      cells: cutCells,\n    })\n\n    return text\n  }\n\n  // ---------------------------------------------------------------------------\n  // Feature Engine Integrations (0.5.1)\n  //\n  // The methods below were declared as literal no-op stubs in the table object\n  // literal so the instance satisfies the Table type. Here we override them with\n  // their real engines — mirroring the commit-coordinator overrides above.\n  // ---------------------------------------------------------------------------\n\n  // Undo/redo wraps table.setPendingValue, so it MUST be installed before the\n  // formula and fill engines (which write through setPendingValue) so their\n  // writes are tracked. Only wired when explicitly enabled — otherwise the\n  // no-op stubs remain (undo/redo stays inert).\n  if (resolvedOptions.enableUndoRedo) {\n    const undoRedo = createUndoRedoIntegration(table, {\n      undoStackSize: resolvedOptions.undoStackSize,\n    })\n    table.undo = undoRedo.undo\n    table.redo = undoRedo.redo\n    table.canUndo = undoRedo.canUndo\n    table.canRedo = undoRedo.canRedo\n    table.clearUndoHistory = undoRedo.clearUndoHistory\n  }\n\n  // Full-row editing — coordinates per-cell editing through the commit\n  // coordinator (single dispatch per row commit).\n  const rowEditing = createFullRowEditingIntegration(table)\n  table.startRowEditing = rowEditing.startRowEditing\n  table.commitRowEdit = rowEditing.commitRowEdit\n  table.cancelRowEdit = rowEditing.cancelRowEdit\n  table.isRowEditing = rowEditing.isRowEditing\n  table.getEditingRows = () => Array.from(rowEditing.getEditingRows())\n  table.getEditableColumnIds = rowEditing.getEditableColumns\n\n  // Row drag / reorder. `resolvedOptions` is mutated in place by setOptions, so\n  // getData reads the live data array and setData swaps it (invalidating the\n  // core row-model memo). onRowReorder is forwarded off the `row:reorder` event\n  // (emitted by both `moveRow` and drag-end) so every reorder path notifies the\n  // consumer exactly once.\n  const rowDrag = createRowDragIntegration(table, {\n    getData: () => resolvedOptions.data,\n    setData: (data) => table.setOptions((prev) => ({ ...prev, data })),\n  })\n  table.moveRow = rowDrag.moveRow\n  table.events.on('row:reorder', (event) => resolvedOptions.onRowReorder?.(event))\n\n  // Pivot row model accessor. The returned rows carry their aggregates on\n  // `.original`; framework adapters can register generated pivot column defs\n  // when they need to render the row model directly.\n  table.getPivotRowModel = () => {\n    const stateConfig = table.getState().pivot.config\n    const config = stateConfig.valueFields.length > 0 ? stateConfig : resolvedOptions.pivotConfig\n\n    return getPivotRowModel(\n      table,\n      resolvedOptions.data,\n      // The public PivotConfig widens `aggregation` to `string`; the engine\n      // narrows to known fn names and treats unknown names as no-op (null).\n      (config ?? {\n        rowFields: [],\n        columnFields: [],\n        valueFields: [],\n      }) as PivotEngineConfig,\n    ).rowModel\n  }\n\n  // Fill handle — detect a pattern from the source range and fill the target.\n  table.fillRange = (sourceRange, targetRange) => {\n    detectAndFill(\n      table,\n      sourceRange,\n      targetRange,\n      table.getRowModel().rows,\n      table.getVisibleLeafColumns(),\n    )\n  }\n\n  // Formula engine. Bound AFTER undo/redo wraps setPendingValue so computed\n  // writes are undoable. cell.getValue() surfaces the computed value for any\n  // raw cell whose value starts with '='.\n  const formulaEngine = new FormulaEngine(table)\n  table.setFormula = (rowId, columnId, formula) =>\n    formulaEngine.setFormula(rowId, columnId, formula)\n  table.getFormula = (rowId, columnId) => formulaEngine.getFormula(rowId, columnId)\n  table.evaluateFormulas = () => formulaEngine.evaluateAll()\n\n  return table\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction defaultCompare(a: unknown, b: unknown): number {\n  if (a === b) return 0\n  if (a == null) return -1\n  if (b == null) return 1\n\n  if (typeof a === 'number' && typeof b === 'number') return a - b\n  if (typeof a === 'string' && typeof b === 'string') return a.localeCompare(b)\n  if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime()\n  if (typeof a === 'boolean' && typeof b === 'boolean') return a === b ? 0 : a ? 1 : -1\n\n  return String(a).localeCompare(String(b))\n}\n\nfunction rowPassesFilters<TData extends RowData>(\n  table: Table<TData>,\n  row: Row<TData>,\n  columnFilters: ColumnFiltersState,\n  globalFilter: unknown,\n): boolean {\n  return (\n    rowPassesColumnFilters(table, row, columnFilters) &&\n    rowPassesGlobalFilter(table, row, globalFilter)\n  )\n}\n\nfunction rowPassesColumnFilters<TData extends RowData>(\n  table: Table<TData>,\n  row: Row<TData>,\n  columnFilters: ColumnFiltersState,\n): boolean {\n  for (const filter of columnFilters) {\n    // T1-05: Skip invalid column IDs silently\n    const column = table.getColumn(filter.id)\n    if (!column) continue\n\n    const filterFn = column.getFilterFn()\n\n    if (filterFn) {\n      // T1-09: Wrap user-provided filterFn in try-catch\n      try {\n        if (!filterFn(row, filter.id, filter.value, () => {})) {\n          return false\n        }\n        continue\n      } catch (err) {\n        console.error(\n          `[yable E010] filterFn threw for column \"${filter.id}\", row \"${row.id}\":`,\n          err,\n        )\n        continue // safe default: include the row for this filter\n      }\n    }\n\n    const value = row.getValue(filter.id)\n    if (Array.isArray(filter.value)) {\n      if (!filter.value.some((candidate: unknown) => value === candidate)) {\n        return false\n      }\n      continue\n    }\n\n    // Default string include filter\n    if (\n      !String(value ?? '')\n        .toLowerCase()\n        .includes(String(filter.value ?? '').toLowerCase())\n    ) {\n      return false\n    }\n  }\n\n  return true\n}\n\nfunction rowPassesGlobalFilter<TData extends RowData>(\n  table: Table<TData>,\n  row: Row<TData>,\n  globalFilter: unknown,\n): boolean {\n  if (!globalFilter) return true\n\n  const searchStr = String(globalFilter).toLowerCase()\n  return table.getAllLeafColumns().some((col: Column<TData, unknown>) => {\n    const value = row.getValue(col.id)\n    return String(value ?? '')\n      .toLowerCase()\n      .includes(searchStr)\n  })\n}\n\nfunction createTreeNodeRow<TData extends RowData>(\n  table: Table<TData>,\n  node: TreeNode<TData>,\n): Row<TData> {\n  return createRow(table, node.key, node.data, 0, node.depth, [], undefined)\n}\n\nfunction createTreeNodeComparator<TData extends RowData>(\n  table: Table<TData>,\n  sorting: SortingState,\n): (a: TreeNode<TData>, b: TreeNode<TData>) => number {\n  const rows = new Map<string, Row<TData>>()\n  const getRow = (node: TreeNode<TData>) => {\n    let row = rows.get(node.key)\n    if (!row) {\n      row = createTreeNodeRow(table, node)\n      rows.set(node.key, row)\n    }\n    return row\n  }\n\n  return (a, b) => compareRowsBySorting(table, getRow(a), getRow(b), sorting)\n}\n\nfunction compareRowsBySorting<TData extends RowData>(\n  table: Table<TData>,\n  a: Row<TData>,\n  b: Row<TData>,\n  sorting: SortingState,\n): number {\n  for (const sort of sorting) {\n    // T1-05: Skip invalid column IDs silently\n    const column = table.getColumn(sort.id)\n    if (!column) continue\n\n    // Custom sort function\n    const sortFn = column.getSortingFn()\n    if (sortFn) {\n      // T1-09: Wrap user-provided sortFn in try-catch\n      try {\n        const result = sortFn(a, b, sort.id)\n        if (result !== 0) return sort.desc ? -result : result\n        continue\n      } catch (err) {\n        console.error(`[yable E011] sortingFn threw for column \"${sort.id}\":`, err)\n        continue // safe default: treat as equal\n      }\n    }\n\n    // Default comparison\n    const aVal = a.getValue(sort.id)\n    const bVal = b.getValue(sort.id)\n    const result = defaultCompare(aVal, bVal)\n    if (result !== 0) return sort.desc ? -result : result\n  }\n  return 0\n}\n\nfunction escapeCSV(value: string): string {\n  if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n    return `\"${value.replace(/\"/g, '\"\"')}\"`\n  }\n  return value\n}\n","// @zvndev/yable-core — Full Row Editing Feature\n// All editable cells in a row edit simultaneously.\n// Tab moves between cells within the row, Enter commits, Escape cancels.\n\nimport type { RowData, Table, ColumnDefExtensions, EditingState, YableEventMap } from '../types'\nimport { getCommitCoordinator } from '../core/table'\nimport { fireColumnCommitHooks } from '../core/editCommitHooks'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface RowEditingState {\n  /** Set of row IDs currently being edited */\n  editingRows: Set<string>\n}\n\nexport interface RowEditStartEvent<TData extends RowData> {\n  rowId: string\n  row: import('../types').Row<TData>\n}\n\nexport interface RowEditCommitEvent<TData extends RowData> {\n  rowId: string\n  row: import('../types').Row<TData>\n  values: Record<string, unknown>\n}\n\nexport interface RowEditCancelEvent<TData extends RowData> {\n  rowId: string\n  row: import('../types').Row<TData>\n}\n\n// ---------------------------------------------------------------------------\n// Full Row Editing Integration\n// ---------------------------------------------------------------------------\n\n/**\n * Creates row-level editing capabilities that coordinate with per-cell editing.\n * This adds `startRowEditing`, `commitRowEdit`, and `cancelRowEdit` methods.\n */\nexport function createFullRowEditingIntegration<TData extends RowData>(\n  table: Table<TData>,\n): {\n  /** Get set of currently editing row IDs */\n  getEditingRows: () => Set<string>\n  /** Start editing all editable cells in a row */\n  startRowEditing: (rowId: string) => void\n  /** Commit all pending values for a row */\n  commitRowEdit: (rowId: string) => void\n  /** Cancel editing for a row, discarding pending values */\n  cancelRowEdit: (rowId: string) => void\n  /** Check if a row is being edited */\n  isRowEditing: (rowId: string) => boolean\n  /** Get editable column IDs for a row */\n  getEditableColumns: (rowId: string) => string[]\n} {\n  const getEditingRows = () => new Set(table.getState().editing.editingRows ?? [])\n\n  const setRowEditing = (rowId: string, editing: boolean) => {\n    table.setEditing((old: EditingState) => {\n      const editingRows = new Set(old.editingRows ?? [])\n      if (editing) {\n        editingRows.add(rowId)\n      } else {\n        editingRows.delete(rowId)\n      }\n\n      return {\n        ...old,\n        editingRows: Array.from(editingRows),\n      }\n    })\n  }\n\n  const getEditableColumns = (rowId: string): string[] => {\n    const columns = table.getAllLeafColumns()\n    let row: import('../types').Row<TData>\n    try {\n      row = table.getRow(rowId, true)\n    } catch {\n      return []\n    }\n\n    return columns\n      .filter((col) => {\n        const def = col.columnDef as typeof col.columnDef & Partial<ColumnDefExtensions<TData>>\n        const editable = def.editable\n        if (typeof editable === 'function') return editable(row)\n        // Infer editable: true when editConfig is present and editable is not explicitly false\n        if (editable === undefined && def.editConfig != null) return true\n        return !!editable\n      })\n      .map((col) => col.id)\n  }\n\n  const startRowEditing = (rowId: string) => {\n    let row: import('../types').Row<TData>\n    try {\n      row = table.getRow(rowId, true)\n    } catch {\n      return\n    }\n\n    setRowEditing(rowId, true)\n\n    // Initialize pending values for all editable columns with current values\n    const editableColumnIds = getEditableColumns(rowId)\n    for (const colId of editableColumnIds) {\n      const currentPending = table.getPendingValue(rowId, colId)\n      if (currentPending === undefined) {\n        table.setPendingValue(rowId, colId, row.getValue(colId))\n      }\n    }\n\n    // Set the first editable cell as active\n    if (editableColumnIds.length > 0) {\n      table.startEditing(rowId, editableColumnIds[0]!)\n    }\n\n    table.events.emit('row:edit:start', {\n      rowId,\n      row,\n    } as YableEventMap<TData>['row:edit:start'])\n  }\n\n  const commitRowEdit = (rowId: string) => {\n    let row: import('../types').Row<TData>\n    try {\n      row = table.getRow(rowId, true)\n    } catch {\n      setRowEditing(rowId, false)\n      return\n    }\n\n    // Gather all pending values for this row\n    const pendingRow = table.getPendingRow(rowId)\n    const values: Record<string, unknown> = pendingRow ? { ...pendingRow } : {}\n\n    // Validate all editable columns\n    const editableColumnIds = getEditableColumns(rowId)\n    const errors: Record<string, string> = {}\n\n    for (const colId of editableColumnIds) {\n      const column = table.getColumn(colId)\n      if (!column) continue\n\n      const editConfig = (\n        column.columnDef as typeof column.columnDef & Partial<ColumnDefExtensions<TData>>\n      ).editConfig\n      if (editConfig?.validate) {\n        const value = values[colId] ?? row.getValue(colId)\n        const error = editConfig.validate(value, row)\n        if (error) {\n          errors[colId] = error\n        }\n      }\n    }\n\n    // If there are validation errors, don't commit\n    if (Object.keys(errors).length > 0) {\n      return\n    }\n\n    // Clean up editing state\n    setRowEditing(rowId, false)\n\n    // NOTE: do NOT call table.commitEdit() here. commitEdit() dispatches the\n    // active cell on its own (through onCommit/onEditCommit), and the row-level\n    // dispatch below already includes that cell's pending value in `values`.\n    // Calling both fired the consumer's save handler twice for one row commit —\n    // once with a partial payload (just the active cell), once with the full\n    // row. The active cell's editing state is cleared by the setEditing() call\n    // at the end of this function instead.\n\n    // Per-column commit hooks fire for every committed cell, independent of the\n    // table-level onCommit/onEditCommit handler below.\n    fireColumnCommitHooks(table, { [rowId]: values })\n\n    // Dispatch through CommitCoordinator if onCommit is defined; otherwise\n    // fall back to the legacy onEditCommit hook.\n    const opts = table.options\n    if (opts.onCommit) {\n      const coordinator = getCommitCoordinator(table as Table<RowData>)\n      if (coordinator) {\n        const patches = editableColumnIds.map((colId) => {\n          let previousValue: unknown\n          try {\n            previousValue = row.getValue(colId)\n          } catch {\n            previousValue = undefined\n          }\n          return {\n            rowId,\n            columnId: colId,\n            value: values[colId],\n            previousValue,\n          }\n        })\n        // Fire and forget — the coordinator owns the lifecycle\n        void coordinator.dispatch(patches)\n      }\n    } else if (opts.onEditCommit) {\n      opts.onEditCommit({ [rowId]: values as Partial<TData> })\n    }\n\n    // Clear pending values for this row\n    table.setEditing((old: EditingState) => {\n      const pendingValues = { ...(old.pendingValues ?? {}) }\n      delete pendingValues[rowId]\n      return {\n        ...old,\n        pendingValues,\n        activeCell: old.activeCell?.rowId === rowId ? undefined : old.activeCell,\n      }\n    })\n\n    table.events.emit('row:edit:commit', {\n      rowId,\n      row,\n      values,\n    } as YableEventMap<TData>['row:edit:commit'])\n  }\n\n  const cancelRowEdit = (rowId: string) => {\n    let row: import('../types').Row<TData>\n    try {\n      row = table.getRow(rowId, true)\n    } catch {\n      setRowEditing(rowId, false)\n      return\n    }\n\n    setRowEditing(rowId, false)\n\n    // Clear pending values for this row\n    table.setEditing((old: EditingState) => {\n      const pendingValues = { ...(old.pendingValues ?? {}) }\n      delete pendingValues[rowId]\n      return {\n        ...old,\n        pendingValues,\n        activeCell: old.activeCell?.rowId === rowId ? undefined : old.activeCell,\n      }\n    })\n\n    table.events.emit('row:edit:cancel', {\n      rowId,\n      row,\n    } as YableEventMap<TData>['row:edit:cancel'])\n  }\n\n  const isRowEditing = (rowId: string) => getEditingRows().has(rowId)\n\n  return {\n    getEditingRows,\n    startRowEditing,\n    commitRowEdit,\n    cancelRowEdit,\n    isRowEditing,\n    getEditableColumns,\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Keyboard Navigation Helper\n// ---------------------------------------------------------------------------\n\n/**\n * Handle keyboard events for row editing.\n * - Tab / Shift+Tab: move between editable cells within the row\n * - Enter: commit row edit\n * - Escape: cancel row edit\n */\nexport function handleRowEditKeyDown<TData extends RowData>(\n  e: KeyboardEvent,\n  rowId: string,\n  table: Table<TData>,\n  integration: ReturnType<typeof createFullRowEditingIntegration<TData>>,\n): void {\n  if (!integration.isRowEditing(rowId)) return\n\n  if (e.key === 'Enter') {\n    e.preventDefault()\n    integration.commitRowEdit(rowId)\n    return\n  }\n\n  if (e.key === 'Escape') {\n    e.preventDefault()\n    integration.cancelRowEdit(rowId)\n    return\n  }\n\n  if (e.key === 'Tab') {\n    e.preventDefault()\n    const editableColumns = integration.getEditableColumns(rowId)\n    if (editableColumns.length === 0) return\n\n    const editing = table.getState().editing\n    const currentColId = editing?.activeCell?.columnId\n    const currentIndex = currentColId ? editableColumns.indexOf(currentColId) : -1\n\n    let nextIndex: number\n    if (e.shiftKey) {\n      // Move backward\n      nextIndex = currentIndex <= 0 ? editableColumns.length - 1 : currentIndex - 1\n    } else {\n      // Move forward\n      nextIndex = currentIndex >= editableColumns.length - 1 ? 0 : currentIndex + 1\n    }\n\n    const nextColId = editableColumns[nextIndex]\n    if (nextColId) {\n      table.startEditing(rowId, nextColId)\n    }\n  }\n}\n"]}