@orkestrel/table 0.0.12 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,6 +17,8 @@ import type { TableSchema } from '@orkestrel/table';
17
17
  export declare function createTableBinding(element: HTMLTableElement, document: TableInterface, options?: TableBindingOptions): TableBindingInterface;
18
18
 
19
19
  /** Checks whether a caught value is a native table binding error.
20
+ * @remarks
21
+ * Recognizes self-branded errors across copies and subclasses and refuses transparent proxies.
20
22
  * @param value - The caught value.
21
23
  * @returns Whether the value is a binding error.
22
24
  */
@@ -1,7 +1,7 @@
1
- import { attempt, isInstance, parseJSON, parseNumber } from "@orkestrel/contract";
1
+ import { INTRINSICS, attempt, holds, parseJSON, parseNumber } from "@orkestrel/contract";
2
2
  import { extractKey, matchesTableRow, parseRows, parseTable } from "../core/index.js";
3
3
  import { Emitter } from "@orkestrel/emitter";
4
- //#region src/browser/errors.ts
4
+ // src/browser/errors.ts
5
5
  /** Represents a native table binding failure with a machine-readable code. */
6
6
  var TableBindingError = class extends Error {
7
7
  code;
@@ -11,19 +11,24 @@ var TableBindingError = class extends Error {
11
11
  */
12
12
  constructor(code, message) {
13
13
  super(message);
14
+ INTRINSICS.define(this, Symbol.for("@orkestrel/table.TableBindingError"), { value: this });
14
15
  this.name = "TableBindingError";
15
16
  this.code = code;
16
17
  }
17
18
  };
18
19
  /** Checks whether a caught value is a native table binding error.
20
+ * @remarks
21
+ * Recognizes self-branded errors across copies and subclasses and refuses transparent proxies.
19
22
  * @param value - The caught value.
20
23
  * @returns Whether the value is a binding error.
21
24
  */
22
25
  function isTableBindingError(value) {
23
- return isInstance(value, TableBindingError);
26
+ return holds(() => {
27
+ if (!(value instanceof Error) || INTRINSICS.prototype(value) === Error.prototype) return false;
28
+ return INTRINSICS.describe(value, Symbol.for("@orkestrel/table.TableBindingError"))?.value === value && INTRINSICS.reflect.read(value, "code") === "STRUCTURE";
29
+ });
24
30
  }
25
- //#endregion
26
- //#region src/browser/helpers.ts
31
+ // src/browser/helpers.ts
27
32
  /** Reads declared header metadata and explicit row keys into a validated core projection.
28
33
  * @param element - A native table with data-table-key naming its identity column.
29
34
  * @returns The schema and rows, validated together before any mutation.
@@ -94,8 +99,7 @@ function readTableRows(schema, elements) {
94
99
  if (rows === void 0) throw new TableBindingError("STRUCTURE", "Native row keys or cells are invalid");
95
100
  return rows;
96
101
  }
97
- //#endregion
98
- //#region src/browser/TableBinding.ts
102
+ // src/browser/TableBinding.ts
99
103
  /** Retains keyed native rows while projecting every core table manager. */
100
104
  var TableBinding = class {
101
105
  #element;
@@ -335,13 +339,7 @@ var TableBinding = class {
335
339
  for (const row of view) {
336
340
  const key = extractKey(this.#document.schema, row);
337
341
  if (key === void 0) continue;
338
- let node = this.#rows.get(key);
339
- if (node === void 0) {
340
- if (this.#options.row === void 0) throw new TableBindingError("STRUCTURE", "An authored document row has no native row");
341
- node = this.#element.ownerDocument.createElement("tr");
342
- node.setAttribute("data-table-key", key);
343
- this.#rows.set(key, node);
344
- }
342
+ const node = this.#rows.get(key) ?? this.#createRow(key);
345
343
  if (this.#options.row !== void 0 && !matchesTableRow(this.#values.get(key), row)) {
346
344
  this.#options.row(node, row);
347
345
  if (this.destroyed) return;
@@ -367,6 +365,20 @@ var TableBinding = class {
367
365
  this.#observe();
368
366
  if (this.#records.length > 0) this.#enqueue();
369
367
  }
368
+ #createRow(key) {
369
+ if (this.#options.row === void 0) throw new TableBindingError("STRUCTURE", "An authored document row has no native row");
370
+ const node = this.#element.ownerDocument.createElement("tr");
371
+ node.setAttribute("data-table-key", key);
372
+ this.#rows.set(key, node);
373
+ return node;
374
+ }
375
+ #createDetail(key) {
376
+ const detail = this.#element.ownerDocument.createElement("tr");
377
+ detail.id = `table-detail-${crypto.randomUUID()}`;
378
+ detail.insertCell().colSpan = Math.max(1, this.#rows.get(key)?.cells.length ?? this.#document.schema.columns.length);
379
+ this.#details.set(key, detail);
380
+ return detail;
381
+ }
370
382
  #restoreFocus(focused, hidden = false) {
371
383
  if (focused !== void 0 && this.#element.ownerDocument.activeElement !== focused && (this.#element.ownerDocument.activeElement === this.#element.ownerDocument.body || this.#element.ownerDocument.activeElement === null)) {
372
384
  if (focused.isConnected) focused.focus({ preventScroll: true });
@@ -380,13 +392,7 @@ var TableBinding = class {
380
392
  }
381
393
  #detail(key, row) {
382
394
  if (this.#options.detail === void 0 || !this.#document.expansion.keys.has(key)) return void 0;
383
- let detail = this.#details.get(key);
384
- if (detail === void 0) {
385
- detail = this.#element.ownerDocument.createElement("tr");
386
- detail.id = `table-detail-${crypto.randomUUID()}`;
387
- detail.insertCell().colSpan = Math.max(1, this.#rows.get(key)?.cells.length ?? this.#document.schema.columns.length);
388
- this.#details.set(key, detail);
389
- }
395
+ const detail = this.#details.get(key) ?? this.#createDetail(key);
390
396
  if (!matchesTableRow(this.#detailValues.get(key), row)) {
391
397
  this.#options.detail(detail, row);
392
398
  if (!this.destroyed) this.#detailValues.set(key, row);
@@ -402,11 +408,9 @@ var TableBinding = class {
402
408
  this.#observe();
403
409
  }
404
410
  #attribute(element, name, value) {
405
- let attributes = this.#attributes.get(element);
406
- if (attributes === void 0) {
407
- attributes = /* @__PURE__ */ new Map();
408
- this.#attributes.set(element, attributes);
409
- }
411
+ if (!this.#attributes.has(element)) this.#attributes.set(element, /* @__PURE__ */ new Map());
412
+ const attributes = this.#attributes.get(element);
413
+ if (attributes === void 0) return;
410
414
  const entry = attributes.get(name);
411
415
  if (entry === void 0) attributes.set(name, {
412
416
  original: element.getAttribute(name),
@@ -650,8 +654,7 @@ var TableBinding = class {
650
654
  });
651
655
  }
652
656
  };
653
- //#endregion
654
- //#region src/browser/factories.ts
657
+ // src/browser/factories.ts
655
658
  /** Creates a native table binding with one retained row owner.
656
659
  * @param element - The native table to bind.
657
660
  * @param document - The borrowed core document.
@@ -661,7 +664,6 @@ var TableBinding = class {
661
664
  function createTableBinding(element, document, options) {
662
665
  return new TableBinding(element, document, options);
663
666
  }
664
- //#endregion
665
667
  export { TableBinding, TableBindingError, createTableBinding, isTableBindingError, readTable, readTableRows, readTableSchema };
666
668
 
667
669
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/browser/errors.ts","../../../src/browser/helpers.ts","../../../src/browser/TableBinding.ts","../../../src/browser/factories.ts"],"sourcesContent":["import type { TableBindingErrorCode } from './types.js'\nimport { isInstance } from '@orkestrel/contract'\n\n/** Represents a native table binding failure with a machine-readable code. */\nexport class TableBindingError extends Error {\n\treadonly code: TableBindingErrorCode\n\n\t/** Creates a binding failure.\n\t * @param code - The failed boundary.\n\t * @param message - The explanation.\n\t */\n\tconstructor(code: TableBindingErrorCode, message: string) {\n\t\tsuper(message)\n\t\tthis.name = 'TableBindingError'\n\t\tthis.code = code\n\t}\n}\n\n/** Checks whether a caught value is a native table binding error.\n * @param value - The caught value.\n * @returns Whether the value is a binding error.\n */\nexport function isTableBindingError(value: unknown): value is TableBindingError {\n\treturn isInstance(value, TableBindingError)\n}\n","import type { TableProjection } from './types.js'\nimport type { TableRow, TableSchema } from '@src/core'\nimport { parseJSON } from '@orkestrel/contract'\nimport { parseRows, parseTable } from '@src/core'\nimport { TableBindingError } from './errors.js'\n\n/** Reads declared header metadata and explicit row keys into a validated core projection.\n * @param element - A native table with data-table-key naming its identity column.\n * @returns The schema and rows, validated together before any mutation.\n * @throws A binding error when metadata, identities, or cells are malformed.\n * @example\n * ```ts\n * import { createTable } from '@orkestrel/table'\n * import { readTable } from '@orkestrel/table/browser'\n * const element = document.createElement('table')\n * element.setAttribute('data-table-key', 'id')\n * element.innerHTML = '<thead><tr><th data-table-column=\"id\" data-table-cell=\"text\">Reference</th></tr></thead><tbody></tbody>'\n * const projection = readTable(element)\n * const table = createTable(projection.schema, { rows: projection.rows })\n * ```\n */\nexport function readTable(element: HTMLTableElement): TableProjection {\n\tconst schema = readTableSchema(element)\n\treturn { schema, rows: readTableRows(schema, Array.from(element.tBodies[0]?.rows ?? [])) }\n}\n\n/** Reads and validates explicit native header metadata.\n * @param element - The table declaring its identity column and cell kinds.\n * @returns The core schema described by the native headers.\n */\nexport function readTableSchema(element: HTMLTableElement): TableSchema {\n\tconst columns = Array.from(element.tHead?.querySelectorAll('th[data-table-column]') ?? [])\n\t\t.filter((header) => header.closest('table') === element)\n\t\t.map((header) => ({\n\t\t\tkey: header.getAttribute('data-table-column'),\n\t\t\tcell: header.getAttribute('data-table-cell'),\n\t\t\tlabel: header.textContent?.trim() ?? '',\n\t\t\t...(header.hasAttribute('data-table-choices')\n\t\t\t\t? { choices: parseJSON(header.getAttribute('data-table-choices') ?? '') }\n\t\t\t\t: {}),\n\t\t}))\n\tconst schema = parseTable({ key: element.getAttribute('data-table-key'), columns })\n\tif (schema === undefined || element.tBodies.length !== 1)\n\t\tthrow new TableBindingError(\n\t\t\t'STRUCTURE',\n\t\t\t'Declare one body, an identity column, and valid header metadata',\n\t\t)\n\treturn schema\n}\n\n/** Reads explicit keys and declared direct cells against a core schema.\n * @param schema - The declared columns and identity column.\n * @param elements - Data rows belonging to one table, including retained detached rows.\n * @returns Validated rows in the supplied order.\n * @throws A binding error for duplicate keys, undeclared cells, or malformed values.\n */\nexport function readTableRows(\n\tschema: TableSchema,\n\telements: readonly HTMLTableRowElement[],\n): readonly TableRow[] {\n\tconst candidates = elements.map((element) => {\n\t\tconst cells: Record<string, unknown> = { [schema.key]: element.getAttribute('data-table-key') }\n\t\tconst seen = new Set<string>()\n\t\tfor (const cell of element.cells) {\n\t\t\tconst column = cell.getAttribute('data-table-column')\n\t\t\tif (column === null) continue\n\t\t\tif (seen.has(column))\n\t\t\t\tthrow new TableBindingError('STRUCTURE', 'A row repeats a declared cell')\n\t\t\tseen.add(column)\n\t\t\tconst value = cell.querySelector('data[value], time[datetime]')\n\t\t\tconst text =\n\t\t\t\tvalue?.closest('table') === element.closest('table')\n\t\t\t\t\t? (value?.getAttribute('value') ?? value?.getAttribute('datetime') ?? '')\n\t\t\t\t\t: (cell.textContent ?? '')\n\t\t\tif (column === schema.key && text !== cells[schema.key])\n\t\t\t\tthrow new TableBindingError('STRUCTURE', 'The identity cell disagrees with its row key')\n\t\t\tObject.defineProperty(cells, column, { value: text, enumerable: true, configurable: true })\n\t\t}\n\t\treturn cells\n\t})\n\tconst rows = parseRows(schema, candidates)\n\tif (rows === undefined)\n\t\tthrow new TableBindingError('STRUCTURE', 'Native row keys or cells are invalid')\n\treturn rows\n}\n","import type { EmitterInterface } from '@orkestrel/emitter'\nimport type { TableInterface, TableRow } from '@src/core'\nimport type {\n\tTableBindingEventMap,\n\tTableBindingInterface,\n\tTableBindingOptions,\n\tTableExpansion,\n\tTableRange,\n} from './types.js'\nimport { attempt, parseNumber } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\nimport { extractKey, matchesTableRow } from '@src/core'\nimport { TableBindingError } from './errors.js'\nimport { readTableRows, readTableSchema } from './helpers.js'\n\n/** Retains keyed native rows while projecting every core table manager. */\nexport class TableBinding implements TableBindingInterface {\n\treadonly #element: HTMLTableElement\n\treadonly #document: TableInterface\n\treadonly #options: TableBindingOptions\n\treadonly #body: HTMLTableSectionElement\n\treadonly #scope: HTMLElement\n\treadonly #emitter: Emitter<TableBindingEventMap>\n\treadonly #lifetime = new AbortController()\n\treadonly #observer: MutationObserver\n\treadonly #rows = new Map<string, HTMLTableRowElement>()\n\treadonly #values = new Map<string, TableRow>()\n\treadonly #details = new Map<string, HTMLTableRowElement>()\n\treadonly #detailValues = new Map<string, TableRow>()\n\treadonly #visible = new Set<HTMLTableRowElement>()\n\treadonly #attributes = new Map<\n\t\tElement,\n\t\tMap<string, { readonly original: string | null; value: string | null }>\n\t>()\n\treadonly #checks = new Map<\n\t\tHTMLInputElement,\n\t\t{ readonly checked: boolean; readonly indeterminate: boolean; value: boolean; mixed: boolean }\n\t>()\n\treadonly #controlValues = new Map<\n\t\tHTMLSelectElement | HTMLOutputElement,\n\t\t{ readonly original: string; value: string }\n\t>()\n\treadonly #schedule = this.#enqueue.bind(this)\n\treadonly #subscriptions: Array<() => void> = []\n\t#pending: ReturnType<typeof setTimeout> | undefined\n\t#announcement: ReturnType<typeof setTimeout> | undefined\n\t#range: string | undefined\n\t#rendering = false\n\t#requesting = false\n\t#records: MutationRecord[] = []\n\n\t/** Creates a native binding over a borrowed document.\n\t * @param element - The table whose body the binding owns.\n\t * @param document - The core document retained by the caller.\n\t * @param options - Row ownership, detail renderer, controls, and listeners.\n\t */\n\tconstructor(\n\t\telement: HTMLTableElement,\n\t\tdocument: TableInterface,\n\t\toptions: TableBindingOptions = {},\n\t) {\n\t\tif (element.tBodies.length !== 1 || document.destroyed)\n\t\t\tthrow new TableBindingError('STRUCTURE', 'Bind one table body to a live document')\n\t\tconst body = element.tBodies[0]\n\t\tif (body === undefined) throw new TableBindingError('STRUCTURE', 'The table has no body')\n\t\tthis.#element = element\n\t\tthis.#document = document\n\t\tthis.#options = { ...options }\n\t\tthis.#body = body\n\t\tthis.#scope = options.scope ?? element\n\t\tif (!this.#scope.contains(element))\n\t\t\tthrow new TableBindingError('STRUCTURE', 'The scope must contain the table')\n\t\tthis.#emitter = new Emitter<TableBindingEventMap>({\n\t\t\t...(options.on === undefined ? {} : { on: options.on }),\n\t\t\t...(options.error === undefined ? {} : { error: options.error }),\n\t\t})\n\t\tthis.#observer = new MutationObserver((records) => {\n\t\t\tthis.#records.push(...records)\n\t\t\tthis.#enqueue()\n\t\t})\n\t\tif (options.row === undefined) {\n\t\t\tthis.#validateSchema()\n\t\t\tconst elements = Array.from(body.rows)\n\t\t\tconst rows = readTableRows(document.schema, elements)\n\t\t\tif (\n\t\t\t\trows.length !== document.rows.rows().length ||\n\t\t\t\trows.some((row) => {\n\t\t\t\t\tconst key = extractKey(document.schema, row)\n\t\t\t\t\treturn key === undefined || !matchesTableRow(document.rows.row(key), row)\n\t\t\t\t})\n\t\t\t)\n\t\t\t\tthrow new TableBindingError('STRUCTURE', 'Authored rows must match the supplied document')\n\t\t\tfor (const [index, row] of rows.entries()) {\n\t\t\t\tconst key = extractKey(document.schema, row)\n\t\t\t\tconst node = elements[index]\n\t\t\t\tif (key !== undefined && node !== undefined) this.#rows.set(key, node)\n\t\t\t}\n\t\t} else if (body.rows.length > 0) {\n\t\t\tthrow new TableBindingError('STRUCTURE', 'Model rendering requires an empty body')\n\t\t}\n\t\tfor (const event of [\n\t\t\t'write',\n\t\t\t'remove',\n\t\t\t'sort',\n\t\t\t'filter',\n\t\t\t'select',\n\t\t\t'expand',\n\t\t\t'paginate',\n\t\t\t'clear',\n\t\t] as const) {\n\t\t\tdocument.emitter.on(event, this.#schedule)\n\t\t\tthis.#subscriptions.push(() => document.emitter.off(event, this.#schedule))\n\t\t}\n\t\tthis.#scope.addEventListener('click', (event) => this.#click(event), {\n\t\t\tsignal: this.#lifetime.signal,\n\t\t})\n\t\tthis.#scope.addEventListener('change', (event) => this.#change(event), {\n\t\t\tsignal: this.#lifetime.signal,\n\t\t})\n\t\tthis.#observe()\n\t\tthis.refresh()\n\t}\n\n\tget element(): HTMLTableElement {\n\t\treturn this.#element\n\t}\n\tget document(): TableInterface {\n\t\treturn this.#document\n\t}\n\tget destroyed(): boolean {\n\t\treturn this.#lifetime.signal.aborted\n\t}\n\tget emitter(): EmitterInterface<TableBindingEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\t/** Reconciles native input and retries rendering against the current document. */\n\trefresh(): void {\n\t\tif (this.destroyed) return\n\t\tif (this.#rendering) {\n\t\t\tthis.#enqueue()\n\t\t\treturn\n\t\t}\n\t\tif (this.#pending !== undefined) clearTimeout(this.#pending)\n\t\tthis.#pending = undefined\n\t\tthis.#rendering = true\n\t\tconst outcome = attempt(() => {\n\t\t\tthis.#records.push(...this.#observer.takeRecords())\n\t\t\tif (this.#options.row === undefined && this.#records.length > 0) this.#reconcile()\n\t\t\tif (!this.destroyed) this.#render()\n\t\t})\n\t\tif (!outcome.success && !this.destroyed) this.#emitter.emit('error', outcome.error)\n\t\telse if (!this.destroyed) this.#emitter.emit('render')\n\t\tthis.#rendering = false\n\t}\n\n\t/** Releases native resources and restores authored state while retaining the core document. */\n\tdestroy(): void {\n\t\tif (this.destroyed) return\n\t\tconst active = this.#element.ownerDocument.activeElement\n\t\tconst focused =\n\t\t\tactive instanceof HTMLElement && [...this.#rows.values()].some((row) => row.contains(active))\n\t\t\t\t? active\n\t\t\t\t: undefined\n\t\tthis.#lifetime.abort()\n\t\tif (this.#pending !== undefined) clearTimeout(this.#pending)\n\t\tthis.#pending = undefined\n\t\tthis.#observer.disconnect()\n\t\tif (this.#announcement !== undefined) clearTimeout(this.#announcement)\n\t\tthis.#announcement = undefined\n\t\tfor (const unsubscribe of this.#subscriptions) unsubscribe()\n\t\tthis.#subscriptions.length = 0\n\t\tfor (const detail of this.#details.values()) detail.remove()\n\t\tif (this.#options.row === undefined) {\n\t\t\tfor (const row of this.#document.rows.rows()) {\n\t\t\t\tconst key = extractKey(this.#document.schema, row)\n\t\t\t\tconst node = key === undefined ? undefined : this.#rows.get(key)\n\t\t\t\tif (node !== undefined) this.#place(node, null)\n\t\t\t}\n\t\t}\n\t\tfor (const element of this.#attributes.keys()) this.#release(element)\n\t\tfor (const input of this.#checks.keys()) this.#release(input)\n\t\tfor (const [control, state] of this.#controlValues)\n\t\t\tif (control.value === state.value) control.value = state.original\n\t\tthis.#restoreFocus(focused)\n\t\tthis.#rows.clear()\n\t\tthis.#values.clear()\n\t\tthis.#details.clear()\n\t\tthis.#detailValues.clear()\n\t\tthis.#attributes.clear()\n\t\tthis.#checks.clear()\n\t\tthis.#controlValues.clear()\n\t\tthis.#visible.clear()\n\t\tthis.#records = []\n\t\tthis.#emitter.destroy()\n\t}\n\n\t#enqueue(): void {\n\t\tif (this.destroyed || this.#pending !== undefined) return\n\t\tthis.#pending = setTimeout(() => {\n\t\t\tthis.#pending = undefined\n\t\t\tthis.refresh()\n\t\t}, 0)\n\t}\n\n\t#observe(): void {\n\t\tif (this.destroyed || this.#options.row !== undefined) return\n\t\tthis.#records.push(...this.#observer.takeRecords())\n\t\tthis.#observer.disconnect()\n\t\tthis.#observer.observe(this.#element, {\n\t\t\tchildList: true,\n\t\t\tcharacterData: true,\n\t\t\tsubtree: true,\n\t\t\tattributes: true,\n\t\t\tattributeFilter: [\n\t\t\t\t'data-table-key',\n\t\t\t\t'data-table-column',\n\t\t\t\t'data-table-cell',\n\t\t\t\t'data-table-choices',\n\t\t\t\t'value',\n\t\t\t\t'datetime',\n\t\t\t],\n\t\t})\n\t\tfor (const node of this.#rows.values())\n\t\t\tif (node.parentElement !== this.#body)\n\t\t\t\tthis.#observer.observe(node, {\n\t\t\t\t\tchildList: true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t\tsubtree: true,\n\t\t\t\t\tattributes: true,\n\t\t\t\t\tattributeFilter: ['data-table-key', 'data-table-column', 'value', 'datetime'],\n\t\t\t\t})\n\t}\n\n\t#validateSchema(): void {\n\t\tconst schema = readTableSchema(this.#element)\n\t\tif (\n\t\t\tschema.key !== this.#document.schema.key ||\n\t\t\tschema.columns.length !== this.#document.schema.columns.length ||\n\t\t\tschema.columns.some((column, index) => {\n\t\t\t\tconst declared = this.#document.schema.columns[index]\n\t\t\t\treturn (\n\t\t\t\t\tdeclared?.key !== column.key ||\n\t\t\t\t\tdeclared.cell !== column.cell ||\n\t\t\t\t\t(column.cell === 'choice' &&\n\t\t\t\t\t\tdeclared.cell === 'choice' &&\n\t\t\t\t\t\tJSON.stringify(column.choices) !== JSON.stringify(declared.choices))\n\t\t\t\t)\n\t\t\t})\n\t\t)\n\t\t\tthrow new TableBindingError('STRUCTURE', 'Header metadata must match the supplied schema')\n\t}\n\n\t#reconcile(): void {\n\t\tthis.#validateSchema()\n\t\tconst retained = Array.from(this.#rows).filter(\n\t\t\t([, node]) => !this.#visible.has(node) || node.parentElement === this.#body,\n\t\t)\n\t\tconst elements = retained.map(([, node]) => node)\n\t\tfor (const node of this.#body.rows)\n\t\t\tif (!elements.includes(node) && !Array.from(this.#details.values()).includes(node))\n\t\t\t\telements.push(node)\n\t\tconst rows = readTableRows(this.#document.schema, elements)\n\t\tthis.#records = []\n\t\tconst keys = new Set(this.#keys(rows))\n\t\tconst additions: TableRow[] = []\n\t\tconst replacements: TableRow[] = []\n\t\tfor (const row of rows) {\n\t\t\tconst key = extractKey(this.#document.schema, row)\n\t\t\tif (key !== undefined && this.#document.rows.row(key) === undefined) additions.push(row)\n\t\t\telse replacements.push(row)\n\t\t}\n\t\tthis.#document.rows.replace(replacements)\n\t\tif (this.destroyed) return\n\t\tthis.#document.rows.add(additions)\n\t\tif (this.destroyed) return\n\t\tfor (const key of this.#rows.keys())\n\t\t\tif (!keys.has(key)) {\n\t\t\t\tthis.#document.rows.remove(key)\n\t\t\t\tif (this.destroyed) return\n\t\t\t}\n\t\tfor (const [index, row] of rows.entries()) {\n\t\t\tconst key = extractKey(this.#document.schema, row)\n\t\t\tconst node = elements[index]\n\t\t\tif (key !== undefined && node !== undefined) this.#rows.set(key, node)\n\t\t}\n\t}\n\n\t#render(): void {\n\t\tconst active = this.#element.ownerDocument.activeElement\n\t\tconst focused =\n\t\t\tactive instanceof HTMLElement &&\n\t\t\t[...this.#rows.values(), ...this.#details.values()].some((row) => row.contains(active))\n\t\t\t\t? active\n\t\t\t\t: undefined\n\t\tconst stored = this.#document.rows.rows()\n\t\tconst keys = new Set(this.#keys(stored))\n\t\tfor (const [key, node] of this.#rows)\n\t\t\tif (!keys.has(key)) {\n\t\t\t\tthis.#place(node)\n\t\t\t\tthis.#release(node)\n\t\t\t\tconst detail = this.#details.get(key)\n\t\t\t\tif (detail !== undefined) this.#place(detail)\n\t\t\t\tthis.#rows.delete(key)\n\t\t\t\tthis.#values.delete(key)\n\t\t\t\tthis.#details.delete(key)\n\t\t\t\tthis.#detailValues.delete(key)\n\t\t\t}\n\t\tconst view = this.#document.view\n\t\tconst ordered: HTMLTableRowElement[] = []\n\t\tfor (const row of view) {\n\t\t\tconst key = extractKey(this.#document.schema, row)\n\t\t\tif (key === undefined) continue\n\t\t\tlet node = this.#rows.get(key)\n\t\t\tif (node === undefined) {\n\t\t\t\tif (this.#options.row === undefined)\n\t\t\t\t\tthrow new TableBindingError('STRUCTURE', 'An authored document row has no native row')\n\t\t\t\tnode = this.#element.ownerDocument.createElement('tr')\n\t\t\t\tnode.setAttribute('data-table-key', key)\n\t\t\t\tthis.#rows.set(key, node)\n\t\t\t}\n\t\t\tif (this.#options.row !== undefined && !matchesTableRow(this.#values.get(key), row)) {\n\t\t\t\tthis.#options.row(node, row)\n\t\t\t\tif (this.destroyed) return\n\t\t\t\tthis.#values.set(key, row)\n\t\t\t}\n\t\t\tordered.push(node)\n\t\t\tconst detail = this.#detail(key, row)\n\t\t\tif (this.destroyed) return\n\t\t\tif (detail !== undefined) ordered.push(detail)\n\t\t\tthis.#controls(node, key, detail)\n\t\t}\n\t\tfor (const node of [...this.#rows.values(), ...this.#details.values()])\n\t\t\tif (!ordered.includes(node) && node.parentElement === this.#body) this.#place(node)\n\t\tfor (const [index, node] of ordered.entries())\n\t\t\tif (this.#body.rows[index] !== node) this.#place(node, this.#body.rows[index] ?? null)\n\t\tthis.#visible.clear()\n\t\tfor (const node of this.#rows.values())\n\t\t\tif (node.parentElement === this.#body) this.#visible.add(node)\n\t\tthis.#headers()\n\t\tif (this.destroyed) return\n\t\tthis.#pages(view)\n\t\tif (this.destroyed) return\n\t\tthis.#pager()\n\t\tif (this.destroyed) return\n\t\tthis.#restoreFocus(focused, true)\n\t\tthis.#observe()\n\t\tif (this.#records.length > 0) this.#enqueue()\n\t}\n\n\t#restoreFocus(focused: HTMLElement | undefined, hidden = false): void {\n\t\tif (\n\t\t\tfocused !== undefined &&\n\t\t\tthis.#element.ownerDocument.activeElement !== focused &&\n\t\t\t(this.#element.ownerDocument.activeElement === this.#element.ownerDocument.body ||\n\t\t\t\tthis.#element.ownerDocument.activeElement === null)\n\t\t) {\n\t\t\tif (focused.isConnected) focused.focus({ preventScroll: true })\n\t\t\telse if (hidden) this.#focusTable()\n\t\t}\n\t}\n\n\t#focusTable(): void {\n\t\tthis.#attribute(this.#element, 'tabindex', '-1')\n\t\tif (\n\t\t\t!this.#element.hasAttribute('aria-label') &&\n\t\t\t!this.#element.hasAttribute('aria-labelledby') &&\n\t\t\tthis.#element.caption === null\n\t\t)\n\t\t\tthis.#attribute(this.#element, 'aria-label', this.#document.schema.label ?? 'Table')\n\t\tthis.#element.focus({ preventScroll: true })\n\t}\n\n\t#detail(key: string, row: TableRow): HTMLTableRowElement | undefined {\n\t\tif (this.#options.detail === undefined || !this.#document.expansion.keys.has(key))\n\t\t\treturn undefined\n\t\tlet detail = this.#details.get(key)\n\t\tif (detail === undefined) {\n\t\t\tdetail = this.#element.ownerDocument.createElement('tr')\n\t\t\tdetail.id = `table-detail-${crypto.randomUUID()}`\n\t\t\tdetail.insertCell().colSpan = Math.max(\n\t\t\t\t1,\n\t\t\t\tthis.#rows.get(key)?.cells.length ?? this.#document.schema.columns.length,\n\t\t\t)\n\t\t\tthis.#details.set(key, detail)\n\t\t}\n\t\tif (!matchesTableRow(this.#detailValues.get(key), row)) {\n\t\t\tthis.#options.detail(detail, row)\n\t\t\tif (!this.destroyed) this.#detailValues.set(key, row)\n\t\t}\n\t\treturn detail\n\t}\n\n\t#place(node: HTMLTableRowElement, before?: HTMLTableRowElement | null): void {\n\t\tthis.#records.push(...this.#observer.takeRecords())\n\t\tthis.#observer.disconnect()\n\t\tif (before === undefined) node.remove()\n\t\telse if (\n\t\t\ttypeof this.#body.moveBefore === 'function' &&\n\t\t\tnode.isConnected &&\n\t\t\tthis.#body.isConnected\n\t\t)\n\t\t\tthis.#body.moveBefore(node, before)\n\t\telse this.#body.insertBefore(node, before)\n\t\tthis.#observe()\n\t}\n\n\t#attribute(element: Element, name: string, value: string | null): void {\n\t\tlet attributes = this.#attributes.get(element)\n\t\tif (attributes === undefined) {\n\t\t\tattributes = new Map()\n\t\t\tthis.#attributes.set(element, attributes)\n\t\t}\n\t\tconst entry = attributes.get(name)\n\t\tif (entry === undefined) attributes.set(name, { original: element.getAttribute(name), value })\n\t\telse entry.value = value\n\t\tif (value === null) element.removeAttribute(name)\n\t\telse if (element.getAttribute(name) !== value) element.setAttribute(name, value)\n\t}\n\n\t#release(root: Element): void {\n\t\tfor (const [element, attributes] of this.#attributes)\n\t\t\tif (root.contains(element)) {\n\t\t\t\tfor (const [name, entry] of attributes)\n\t\t\t\t\tif (element.getAttribute(name) === entry.value) {\n\t\t\t\t\t\tif (entry.original === null) element.removeAttribute(name)\n\t\t\t\t\t\telse element.setAttribute(name, entry.original)\n\t\t\t\t\t}\n\t\t\t\tthis.#attributes.delete(element)\n\t\t\t}\n\t\tfor (const [input, state] of this.#checks)\n\t\t\tif (root.contains(input)) {\n\t\t\t\tif (input.checked === state.value) input.checked = state.checked\n\t\t\t\tif (input.indeterminate === state.mixed) input.indeterminate = state.indeterminate\n\t\t\t\tthis.#checks.delete(input)\n\t\t\t}\n\t}\n\n\t#check(input: HTMLInputElement, value: boolean, mixed: boolean): void {\n\t\tconst state = this.#checks.get(input)\n\t\tif (state === undefined)\n\t\t\tthis.#checks.set(input, {\n\t\t\t\tchecked: input.checked,\n\t\t\t\tindeterminate: input.indeterminate,\n\t\t\t\tvalue,\n\t\t\t\tmixed,\n\t\t\t})\n\t\telse {\n\t\t\tstate.value = value\n\t\t\tstate.mixed = mixed\n\t\t}\n\t\tinput.checked = value\n\t\tinput.indeterminate = mixed\n\t}\n\n\t#controls(node: HTMLTableRowElement, key: string, detail: HTMLTableRowElement | undefined): void {\n\t\tconst table = node.closest('table')\n\t\tfor (const input of node.querySelectorAll('input[type=\"checkbox\"][data-table-select]'))\n\t\t\tif (input instanceof HTMLInputElement && input.closest('table') === table)\n\t\t\t\tthis.#check(input, this.#document.selection.keys.has(key), false)\n\t\tfor (const button of node.querySelectorAll(\n\t\t\t'button[data-table-expand]:not([data-table-expand=\"page\"])',\n\t\t))\n\t\t\tif (button.closest('table') === table) {\n\t\t\t\tthis.#attribute(button, 'aria-expanded', String(this.#document.expansion.keys.has(key)))\n\t\t\t\tthis.#attribute(button, 'aria-controls', detail?.id ?? null)\n\t\t\t}\n\t}\n\n\t#headers(): void {\n\t\tconst orders = this.#document.sort.orders()\n\t\tfor (const button of this.#element.tHead?.querySelectorAll('button[data-table-sort]') ?? []) {\n\t\t\tif (button.closest('table') !== this.#element) continue\n\t\t\tconst header = button.closest('th')\n\t\t\tif (header === null) continue\n\t\t\tconst column = button.getAttribute('data-table-sort')\n\t\t\tconst index = orders.findIndex((order) => order.column === column)\n\t\t\tconst order = orders[index]\n\t\t\tconst description =\n\t\t\t\torder === undefined\n\t\t\t\t\t? null\n\t\t\t\t\t: (this.#options.describe?.sort?.({\n\t\t\t\t\t\t\tcolumn: order.column,\n\t\t\t\t\t\t\tdirection: order.direction,\n\t\t\t\t\t\t\tpriority: index + 1,\n\t\t\t\t\t\t\tcount: orders.length,\n\t\t\t\t\t\t}) ?? `Sort priority ${index + 1} of ${orders.length}, ${order.direction}`)\n\t\t\tif (this.destroyed) return\n\t\t\tthis.#attribute(\n\t\t\t\theader,\n\t\t\t\t'aria-sort',\n\t\t\t\tindex === 0 && order !== undefined ? order.direction : null,\n\t\t\t)\n\t\t\tthis.#attribute(button, 'aria-description', description)\n\t\t}\n\t}\n\n\t#pages(view: readonly TableRow[]): void {\n\t\tconst keys = this.#keys(view)\n\t\tfor (const button of this.#scoped('button[data-table-expand=\"page\"]')) {\n\t\t\tthis.#attribute(\n\t\t\t\tbutton,\n\t\t\t\t'aria-expanded',\n\t\t\t\tString(keys.length > 0 && keys.every((key) => this.#document.expansion.keys.has(key))),\n\t\t\t)\n\t\t\tif (button instanceof HTMLButtonElement) this.#disable(button, keys.length === 0)\n\t\t\tif (this.destroyed) return\n\t\t}\n\t\tconst selected = view.filter((row) => {\n\t\t\tconst key = extractKey(this.#document.schema, row)\n\t\t\treturn key !== undefined && this.#document.selection.keys.has(key)\n\t\t}).length\n\t\tfor (const input of this.#scope.querySelectorAll('input[type=\"checkbox\"][data-table-page]'))\n\t\t\tif (\n\t\t\t\tinput instanceof HTMLInputElement &&\n\t\t\t\t(input.closest('table') === null || input.closest('table') === this.#element)\n\t\t\t)\n\t\t\t\tthis.#check(\n\t\t\t\t\tinput,\n\t\t\t\t\tview.length > 0 && selected === view.length,\n\t\t\t\t\tselected > 0 && selected < view.length,\n\t\t\t\t)\n\t}\n\n\t#scoped(selector: string): readonly HTMLElement[] {\n\t\treturn Array.from(this.#scope.querySelectorAll<HTMLElement>(selector)).filter((control) => {\n\t\t\tconst table = control.closest('table')\n\t\t\treturn table === null || table === this.#element\n\t\t})\n\t}\n\n\t#disable(button: HTMLButtonElement, disabled: boolean, sibling?: HTMLButtonElement): void {\n\t\tif (disabled && this.#element.ownerDocument.activeElement === button) {\n\t\t\tif (sibling !== undefined) sibling.focus({ preventScroll: true })\n\t\t\telse this.#focusTable()\n\t\t}\n\t\tif (!this.destroyed) this.#attribute(button, 'disabled', disabled ? '' : null)\n\t}\n\n\t#value(control: HTMLSelectElement | HTMLOutputElement, value: string): void {\n\t\tconst state = this.#controlValues.get(control)\n\t\tif (state === undefined) this.#controlValues.set(control, { original: control.value, value })\n\t\telse state.value = value\n\t\tif (control.value !== value) control.value = value\n\t}\n\n\t#readRange(): TableRange {\n\t\tconst pagination = this.#document.pagination\n\t\tconst length = this.#document.view.length\n\t\treturn {\n\t\t\tfirst: length === 0 ? 0 : pagination.offset + 1,\n\t\t\tlast: length === 0 ? 0 : pagination.offset + length,\n\t\t\tcount: this.#document.count,\n\t\t\tpage: pagination.page,\n\t\t\tpages: pagination.count,\n\t\t\tlimit: pagination.limit,\n\t\t}\n\t}\n\n\t#pager(): void {\n\t\tconst range = this.#readRange()\n\t\tconst buttons = this.#scoped(\n\t\t\t'button[data-table-move=\"previous\"], button[data-table-move=\"next\"]',\n\t\t).filter((button) => button instanceof HTMLButtonElement)\n\t\tconst enabled = buttons.filter((button) =>\n\t\t\tbutton.getAttribute('data-table-move') === 'previous'\n\t\t\t\t? range.page > 1\n\t\t\t\t: range.page < range.pages,\n\t\t)\n\t\tfor (const button of enabled) this.#disable(button, false)\n\t\tfor (const button of buttons) {\n\t\t\tif (!enabled.includes(button))\n\t\t\t\tthis.#disable(\n\t\t\t\t\tbutton,\n\t\t\t\t\ttrue,\n\t\t\t\t\tenabled.find(\n\t\t\t\t\t\t(sibling) =>\n\t\t\t\t\t\t\tsibling.getAttribute('data-table-move') !== button.getAttribute('data-table-move'),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\tif (this.destroyed) return\n\t\t}\n\t\tfor (const select of this.#scoped('select[data-table-limit]'))\n\t\t\tif (select instanceof HTMLSelectElement)\n\t\t\t\tthis.#value(select, range.limit === undefined ? '' : String(range.limit))\n\t\tconst signature = JSON.stringify(range)\n\t\tif (signature === this.#range) return\n\t\tconst outputs = this.#scoped('output[data-table-range]').filter(\n\t\t\t(output) => output instanceof HTMLOutputElement,\n\t\t)\n\t\tconst description =\n\t\t\tthis.#options.describe?.range?.(range) ?? `${range.first} to ${range.last} of ${range.count}`\n\t\tif (this.destroyed) return\n\t\tif (signature !== JSON.stringify(this.#readRange())) {\n\t\t\tthis.#enqueue()\n\t\t\treturn\n\t\t}\n\t\tthis.#range = signature\n\t\tif (this.#announcement !== undefined) clearTimeout(this.#announcement)\n\t\tfor (const output of outputs) this.#value(output, '')\n\t\tthis.#announcement = setTimeout(() => {\n\t\t\tthis.#announcement = undefined\n\t\t\tif (this.destroyed) return\n\t\t\tif (signature !== JSON.stringify(this.#readRange())) {\n\t\t\t\tthis.#range = undefined\n\t\t\t\tthis.#enqueue()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfor (const output of outputs)\n\t\t\t\tif (this.#scoped('output[data-table-range]').includes(output))\n\t\t\t\t\tthis.#value(output, description)\n\t\t}, 0)\n\t}\n\n\t#click(event: MouseEvent): void {\n\t\tif (!(event.target instanceof Element) || this.destroyed || this.#requesting) return\n\t\tconst button = event.target.closest('button')\n\t\tif (\n\t\t\t!(button instanceof HTMLButtonElement) ||\n\t\t\tbutton.disabled ||\n\t\t\t(button.closest('table') !== null && button.closest('table') !== this.#element)\n\t\t)\n\t\t\treturn\n\t\tconst outcome = attempt(() => {\n\t\t\tconst move = button.getAttribute('data-table-move')\n\t\t\tif (move === 'previous' || move === 'next') {\n\t\t\t\tthis.#document.pagination.move(\n\t\t\t\t\tthis.#document.pagination.page + (move === 'previous' ? -1 : 1),\n\t\t\t\t)\n\t\t\t} else if (button.getAttribute('data-table-expand') === 'page') {\n\t\t\t\tconst keys = this.#keys(this.#document.view)\n\t\t\t\tconst closing =\n\t\t\t\t\tkeys.length > 0 && keys.every((key) => this.#document.expansion.keys.has(key))\n\t\t\t\tconst changing = keys.filter((key) => this.#document.expansion.keys.has(key) === closing)\n\t\t\t\tif (\n\t\t\t\t\tchanging.length > 0 &&\n\t\t\t\t\t!this.#request(changing.map((key) => ({ key, expanded: !closing })))\n\t\t\t\t)\n\t\t\t\t\treturn\n\t\t\t\tif (closing) this.#document.expansion.clear(keys)\n\t\t\t\telse this.#document.expansion.expand(keys)\n\t\t\t} else if (button.hasAttribute('data-table-sort') && this.#element.tHead?.contains(button)) {\n\t\t\t\tconst column = button.getAttribute('data-table-sort')\n\t\t\t\tif (column === null || !this.#document.schema.columns.some((entry) => entry.key === column))\n\t\t\t\t\tthrow new TableBindingError('STRUCTURE', 'The sort button names no column')\n\t\t\t\tconst direction = this.#document.sort.order(column)?.direction\n\t\t\t\tconst orders =\n\t\t\t\t\tdirection === 'descending'\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\t\t\t\tdirection:\n\t\t\t\t\t\t\t\t\t\tdirection === undefined ? ('ascending' as const) : ('descending' as const),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]\n\t\t\t\tconst request = new CustomEvent('table-sort', { cancelable: true, detail: orders })\n\t\t\t\tthis.#requesting = true\n\t\t\t\tthis.#emitter.emit('sort', request)\n\t\t\t\tthis.#requesting = false\n\t\t\t\tif (request.defaultPrevented || this.destroyed) return\n\t\t\t\tthis.#document.sort.remove()\n\t\t\t\tif (!this.destroyed) this.#document.sort.set(orders)\n\t\t\t} else if (button.hasAttribute('data-table-expand')) {\n\t\t\t\tconst row = button.closest('tr')\n\t\t\t\tconst key = Array.from(this.#rows).find(([, node]) => node === row)?.[0]\n\t\t\t\tif (key === undefined) return\n\t\t\t\tconst expanded = !this.#document.expansion.keys.has(key)\n\t\t\t\tif (!this.#request([{ key, expanded }])) return\n\t\t\t\tif (expanded) this.#document.expansion.expand(key)\n\t\t\t\telse this.#document.expansion.clear(key)\n\t\t\t}\n\t\t})\n\t\tif (!outcome.success) this.#emitter.emit('error', outcome.error)\n\t}\n\n\t#request(detail: readonly TableExpansion[]): boolean {\n\t\tconst request = new CustomEvent('table-expand', { cancelable: true, detail })\n\t\tthis.#requesting = true\n\t\tthis.#emitter.emit('expand', request)\n\t\tthis.#requesting = false\n\t\treturn !request.defaultPrevented && !this.destroyed\n\t}\n\n\t#change(event: Event): void {\n\t\tconst input = event.target\n\t\tif (input instanceof HTMLSelectElement && input.hasAttribute('data-table-limit')) {\n\t\t\tif (\n\t\t\t\tinput.disabled ||\n\t\t\t\tthis.destroyed ||\n\t\t\t\t!this.#scoped('select[data-table-limit]').includes(input)\n\t\t\t)\n\t\t\t\treturn\n\t\t\tconst outcome = attempt(() => {\n\t\t\t\tconst limit = input.value === '' ? undefined : parseNumber(input.value)\n\t\t\t\tif (input.value !== '' && (limit === undefined || limit <= 0 || !Number.isInteger(limit)))\n\t\t\t\t\tthrow new TableBindingError(\n\t\t\t\t\t\t'STRUCTURE',\n\t\t\t\t\t\t'The page limit must be a positive integer or empty',\n\t\t\t\t\t)\n\t\t\t\tthis.#document.pagination.resize(limit)\n\t\t\t})\n\t\t\tif (!outcome.success) this.#emitter.emit('error', outcome.error)\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\t!(input instanceof HTMLInputElement) ||\n\t\t\tinput.type !== 'checkbox' ||\n\t\t\tinput.disabled ||\n\t\t\tthis.destroyed\n\t\t)\n\t\t\treturn\n\t\tconst table = input.closest('table')\n\t\tif (table !== null && table !== this.#element) return\n\t\tconst outcome = attempt(() => {\n\t\t\tif (input.hasAttribute('data-table-page')) {\n\t\t\t\tconst keys = this.#keys(this.#document.view)\n\t\t\t\tif (input.checked) this.#document.selection.select(keys)\n\t\t\t\telse this.#document.selection.clear(keys)\n\t\t\t} else if (input.hasAttribute('data-table-select') && table === this.#element) {\n\t\t\t\tconst key = Array.from(this.#rows).find(([, node]) => node === input.closest('tr'))?.[0]\n\t\t\t\tif (key !== undefined) {\n\t\t\t\t\tif (input.checked) this.#document.selection.select(key)\n\t\t\t\t\telse this.#document.selection.clear(key)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\tif (!outcome.success) this.#emitter.emit('error', outcome.error)\n\t}\n\n\t#keys(rows: readonly TableRow[]): readonly string[] {\n\t\treturn rows.flatMap((row) => {\n\t\t\tconst key = extractKey(this.#document.schema, row)\n\t\t\treturn key === undefined ? [] : [key]\n\t\t})\n\t}\n}\n","import type { TableInterface } from '@src/core'\nimport type { TableBindingInterface, TableBindingOptions } from './types.js'\nimport { TableBinding } from './TableBinding.js'\n\n/** Creates a native table binding with one retained row owner.\n * @param element - The native table to bind.\n * @param document - The borrowed core document.\n * @param options - Renderers, scoped controls, and listeners.\n * @returns The native binding.\n */\nexport function createTableBinding(\n\telement: HTMLTableElement,\n\tdocument: TableInterface,\n\toptions?: TableBindingOptions,\n): TableBindingInterface {\n\treturn new TableBinding(element, document, options)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/browser/errors.ts","../../../src/browser/helpers.ts","../../../src/browser/TableBinding.ts","../../../src/browser/factories.ts"],"sourcesContent":["import type { TableBindingErrorCode } from './types.js'\nimport { holds, INTRINSICS } from '@orkestrel/contract'\n\n/** Represents a native table binding failure with a machine-readable code. */\nexport class TableBindingError extends Error {\n\treadonly code: TableBindingErrorCode\n\n\t/** Creates a binding failure.\n\t * @param code - The failed boundary.\n\t * @param message - The explanation.\n\t */\n\tconstructor(code: TableBindingErrorCode, message: string) {\n\t\tsuper(message)\n\t\tINTRINSICS.define(this, Symbol.for('@orkestrel/table.TableBindingError'), { value: this })\n\t\tthis.name = 'TableBindingError'\n\t\tthis.code = code\n\t}\n}\n\n/** Checks whether a caught value is a native table binding error.\n * @remarks\n * Recognizes self-branded errors across copies and subclasses and refuses transparent proxies.\n * @param value - The caught value.\n * @returns Whether the value is a binding error.\n */\nexport function isTableBindingError(value: unknown): value is TableBindingError {\n\treturn holds(() => {\n\t\tif (!(value instanceof Error) || INTRINSICS.prototype(value) === Error.prototype) return false\n\t\tconst brand = INTRINSICS.describe(value, Symbol.for('@orkestrel/table.TableBindingError'))\n\t\treturn brand?.value === value && INTRINSICS.reflect.read(value, 'code') === 'STRUCTURE'\n\t})\n}\n","import type { TableProjection } from './types.js'\nimport type { TableRow, TableSchema } from '@src/core'\nimport { parseJSON } from '@orkestrel/contract'\nimport { parseRows, parseTable } from '@src/core'\nimport { TableBindingError } from './errors.js'\n\n/** Reads declared header metadata and explicit row keys into a validated core projection.\n * @param element - A native table with data-table-key naming its identity column.\n * @returns The schema and rows, validated together before any mutation.\n * @throws A binding error when metadata, identities, or cells are malformed.\n * @example\n * ```ts\n * import { createTable } from '@orkestrel/table'\n * import { readTable } from '@orkestrel/table/browser'\n * const element = document.createElement('table')\n * element.setAttribute('data-table-key', 'id')\n * element.innerHTML = '<thead><tr><th data-table-column=\"id\" data-table-cell=\"text\">Reference</th></tr></thead><tbody></tbody>'\n * const projection = readTable(element)\n * const table = createTable(projection.schema, { rows: projection.rows })\n * ```\n */\nexport function readTable(element: HTMLTableElement): TableProjection {\n\tconst schema = readTableSchema(element)\n\treturn { schema, rows: readTableRows(schema, Array.from(element.tBodies[0]?.rows ?? [])) }\n}\n\n/** Reads and validates explicit native header metadata.\n * @param element - The table declaring its identity column and cell kinds.\n * @returns The core schema described by the native headers.\n */\nexport function readTableSchema(element: HTMLTableElement): TableSchema {\n\tconst columns = Array.from(element.tHead?.querySelectorAll('th[data-table-column]') ?? [])\n\t\t.filter((header) => header.closest('table') === element)\n\t\t.map((header) => ({\n\t\t\tkey: header.getAttribute('data-table-column'),\n\t\t\tcell: header.getAttribute('data-table-cell'),\n\t\t\tlabel: header.textContent?.trim() ?? '',\n\t\t\t...(header.hasAttribute('data-table-choices')\n\t\t\t\t? { choices: parseJSON(header.getAttribute('data-table-choices') ?? '') }\n\t\t\t\t: {}),\n\t\t}))\n\tconst schema = parseTable({ key: element.getAttribute('data-table-key'), columns })\n\tif (schema === undefined || element.tBodies.length !== 1)\n\t\tthrow new TableBindingError(\n\t\t\t'STRUCTURE',\n\t\t\t'Declare one body, an identity column, and valid header metadata',\n\t\t)\n\treturn schema\n}\n\n/** Reads explicit keys and declared direct cells against a core schema.\n * @param schema - The declared columns and identity column.\n * @param elements - Data rows belonging to one table, including retained detached rows.\n * @returns Validated rows in the supplied order.\n * @throws A binding error for duplicate keys, undeclared cells, or malformed values.\n */\nexport function readTableRows(\n\tschema: TableSchema,\n\telements: readonly HTMLTableRowElement[],\n): readonly TableRow[] {\n\tconst candidates = elements.map((element) => {\n\t\tconst cells: Record<string, unknown> = { [schema.key]: element.getAttribute('data-table-key') }\n\t\tconst seen = new Set<string>()\n\t\tfor (const cell of element.cells) {\n\t\t\tconst column = cell.getAttribute('data-table-column')\n\t\t\tif (column === null) continue\n\t\t\tif (seen.has(column))\n\t\t\t\tthrow new TableBindingError('STRUCTURE', 'A row repeats a declared cell')\n\t\t\tseen.add(column)\n\t\t\tconst value = cell.querySelector('data[value], time[datetime]')\n\t\t\tconst text =\n\t\t\t\tvalue?.closest('table') === element.closest('table')\n\t\t\t\t\t? (value?.getAttribute('value') ?? value?.getAttribute('datetime') ?? '')\n\t\t\t\t\t: (cell.textContent ?? '')\n\t\t\tif (column === schema.key && text !== cells[schema.key])\n\t\t\t\tthrow new TableBindingError('STRUCTURE', 'The identity cell disagrees with its row key')\n\t\t\tObject.defineProperty(cells, column, { value: text, enumerable: true, configurable: true })\n\t\t}\n\t\treturn cells\n\t})\n\tconst rows = parseRows(schema, candidates)\n\tif (rows === undefined)\n\t\tthrow new TableBindingError('STRUCTURE', 'Native row keys or cells are invalid')\n\treturn rows\n}\n","import type { EmitterInterface } from '@orkestrel/emitter'\nimport type { TableInterface, TableRow } from '@src/core'\nimport type {\n\tTableBindingEventMap,\n\tTableBindingInterface,\n\tTableBindingOptions,\n\tTableExpansion,\n\tTableRange,\n} from './types.js'\nimport { attempt, parseNumber } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\nimport { extractKey, matchesTableRow } from '@src/core'\nimport { TableBindingError } from './errors.js'\nimport { readTableRows, readTableSchema } from './helpers.js'\n\n/** Retains keyed native rows while projecting every core table manager. */\nexport class TableBinding implements TableBindingInterface {\n\treadonly #element: HTMLTableElement\n\treadonly #document: TableInterface\n\treadonly #options: TableBindingOptions\n\treadonly #body: HTMLTableSectionElement\n\treadonly #scope: HTMLElement\n\treadonly #emitter: Emitter<TableBindingEventMap>\n\treadonly #lifetime = new AbortController()\n\treadonly #observer: MutationObserver\n\treadonly #rows = new Map<string, HTMLTableRowElement>()\n\treadonly #values = new Map<string, TableRow>()\n\treadonly #details = new Map<string, HTMLTableRowElement>()\n\treadonly #detailValues = new Map<string, TableRow>()\n\treadonly #visible = new Set<HTMLTableRowElement>()\n\treadonly #attributes = new Map<\n\t\tElement,\n\t\tMap<string, { readonly original: string | null; value: string | null }>\n\t>()\n\treadonly #checks = new Map<\n\t\tHTMLInputElement,\n\t\t{ readonly checked: boolean; readonly indeterminate: boolean; value: boolean; mixed: boolean }\n\t>()\n\treadonly #controlValues = new Map<\n\t\tHTMLSelectElement | HTMLOutputElement,\n\t\t{ readonly original: string; value: string }\n\t>()\n\treadonly #schedule = this.#enqueue.bind(this)\n\treadonly #subscriptions: Array<() => void> = []\n\t#pending: ReturnType<typeof setTimeout> | undefined\n\t#announcement: ReturnType<typeof setTimeout> | undefined\n\t#range: string | undefined\n\t#rendering = false\n\t#requesting = false\n\t#records: MutationRecord[] = []\n\n\t/** Creates a native binding over a borrowed document.\n\t * @param element - The table whose body the binding owns.\n\t * @param document - The core document retained by the caller.\n\t * @param options - Row ownership, detail renderer, controls, and listeners.\n\t */\n\tconstructor(\n\t\telement: HTMLTableElement,\n\t\tdocument: TableInterface,\n\t\toptions: TableBindingOptions = {},\n\t) {\n\t\tif (element.tBodies.length !== 1 || document.destroyed)\n\t\t\tthrow new TableBindingError('STRUCTURE', 'Bind one table body to a live document')\n\t\tconst body = element.tBodies[0]\n\t\tif (body === undefined) throw new TableBindingError('STRUCTURE', 'The table has no body')\n\t\tthis.#element = element\n\t\tthis.#document = document\n\t\tthis.#options = { ...options }\n\t\tthis.#body = body\n\t\tthis.#scope = options.scope ?? element\n\t\tif (!this.#scope.contains(element))\n\t\t\tthrow new TableBindingError('STRUCTURE', 'The scope must contain the table')\n\t\tthis.#emitter = new Emitter<TableBindingEventMap>({\n\t\t\t...(options.on === undefined ? {} : { on: options.on }),\n\t\t\t...(options.error === undefined ? {} : { error: options.error }),\n\t\t})\n\t\tthis.#observer = new MutationObserver((records) => {\n\t\t\tthis.#records.push(...records)\n\t\t\tthis.#enqueue()\n\t\t})\n\t\tif (options.row === undefined) {\n\t\t\tthis.#validateSchema()\n\t\t\tconst elements = Array.from(body.rows)\n\t\t\tconst rows = readTableRows(document.schema, elements)\n\t\t\tif (\n\t\t\t\trows.length !== document.rows.rows().length ||\n\t\t\t\trows.some((row) => {\n\t\t\t\t\tconst key = extractKey(document.schema, row)\n\t\t\t\t\treturn key === undefined || !matchesTableRow(document.rows.row(key), row)\n\t\t\t\t})\n\t\t\t)\n\t\t\t\tthrow new TableBindingError('STRUCTURE', 'Authored rows must match the supplied document')\n\t\t\tfor (const [index, row] of rows.entries()) {\n\t\t\t\tconst key = extractKey(document.schema, row)\n\t\t\t\tconst node = elements[index]\n\t\t\t\tif (key !== undefined && node !== undefined) this.#rows.set(key, node)\n\t\t\t}\n\t\t} else if (body.rows.length > 0) {\n\t\t\tthrow new TableBindingError('STRUCTURE', 'Model rendering requires an empty body')\n\t\t}\n\t\tfor (const event of [\n\t\t\t'write',\n\t\t\t'remove',\n\t\t\t'sort',\n\t\t\t'filter',\n\t\t\t'select',\n\t\t\t'expand',\n\t\t\t'paginate',\n\t\t\t'clear',\n\t\t] as const) {\n\t\t\tdocument.emitter.on(event, this.#schedule)\n\t\t\tthis.#subscriptions.push(() => document.emitter.off(event, this.#schedule))\n\t\t}\n\t\tthis.#scope.addEventListener('click', (event) => this.#click(event), {\n\t\t\tsignal: this.#lifetime.signal,\n\t\t})\n\t\tthis.#scope.addEventListener('change', (event) => this.#change(event), {\n\t\t\tsignal: this.#lifetime.signal,\n\t\t})\n\t\tthis.#observe()\n\t\tthis.refresh()\n\t}\n\n\tget element(): HTMLTableElement {\n\t\treturn this.#element\n\t}\n\tget document(): TableInterface {\n\t\treturn this.#document\n\t}\n\tget destroyed(): boolean {\n\t\treturn this.#lifetime.signal.aborted\n\t}\n\tget emitter(): EmitterInterface<TableBindingEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\t/** Reconciles native input and retries rendering against the current document. */\n\trefresh(): void {\n\t\tif (this.destroyed) return\n\t\tif (this.#rendering) {\n\t\t\tthis.#enqueue()\n\t\t\treturn\n\t\t}\n\t\tif (this.#pending !== undefined) clearTimeout(this.#pending)\n\t\tthis.#pending = undefined\n\t\tthis.#rendering = true\n\t\tconst outcome = attempt(() => {\n\t\t\tthis.#records.push(...this.#observer.takeRecords())\n\t\t\tif (this.#options.row === undefined && this.#records.length > 0) this.#reconcile()\n\t\t\tif (!this.destroyed) this.#render()\n\t\t})\n\t\tif (!outcome.success && !this.destroyed) this.#emitter.emit('error', outcome.error)\n\t\telse if (!this.destroyed) this.#emitter.emit('render')\n\t\tthis.#rendering = false\n\t}\n\n\t/** Releases native resources and restores authored state while retaining the core document. */\n\tdestroy(): void {\n\t\tif (this.destroyed) return\n\t\tconst active = this.#element.ownerDocument.activeElement\n\t\tconst focused =\n\t\t\tactive instanceof HTMLElement && [...this.#rows.values()].some((row) => row.contains(active))\n\t\t\t\t? active\n\t\t\t\t: undefined\n\t\tthis.#lifetime.abort()\n\t\tif (this.#pending !== undefined) clearTimeout(this.#pending)\n\t\tthis.#pending = undefined\n\t\tthis.#observer.disconnect()\n\t\tif (this.#announcement !== undefined) clearTimeout(this.#announcement)\n\t\tthis.#announcement = undefined\n\t\tfor (const unsubscribe of this.#subscriptions) unsubscribe()\n\t\tthis.#subscriptions.length = 0\n\t\tfor (const detail of this.#details.values()) detail.remove()\n\t\tif (this.#options.row === undefined) {\n\t\t\tfor (const row of this.#document.rows.rows()) {\n\t\t\t\tconst key = extractKey(this.#document.schema, row)\n\t\t\t\tconst node = key === undefined ? undefined : this.#rows.get(key)\n\t\t\t\tif (node !== undefined) this.#place(node, null)\n\t\t\t}\n\t\t}\n\t\tfor (const element of this.#attributes.keys()) this.#release(element)\n\t\tfor (const input of this.#checks.keys()) this.#release(input)\n\t\tfor (const [control, state] of this.#controlValues)\n\t\t\tif (control.value === state.value) control.value = state.original\n\t\tthis.#restoreFocus(focused)\n\t\tthis.#rows.clear()\n\t\tthis.#values.clear()\n\t\tthis.#details.clear()\n\t\tthis.#detailValues.clear()\n\t\tthis.#attributes.clear()\n\t\tthis.#checks.clear()\n\t\tthis.#controlValues.clear()\n\t\tthis.#visible.clear()\n\t\tthis.#records = []\n\t\tthis.#emitter.destroy()\n\t}\n\n\t#enqueue(): void {\n\t\tif (this.destroyed || this.#pending !== undefined) return\n\t\tthis.#pending = setTimeout(() => {\n\t\t\tthis.#pending = undefined\n\t\t\tthis.refresh()\n\t\t}, 0)\n\t}\n\n\t#observe(): void {\n\t\tif (this.destroyed || this.#options.row !== undefined) return\n\t\tthis.#records.push(...this.#observer.takeRecords())\n\t\tthis.#observer.disconnect()\n\t\tthis.#observer.observe(this.#element, {\n\t\t\tchildList: true,\n\t\t\tcharacterData: true,\n\t\t\tsubtree: true,\n\t\t\tattributes: true,\n\t\t\tattributeFilter: [\n\t\t\t\t'data-table-key',\n\t\t\t\t'data-table-column',\n\t\t\t\t'data-table-cell',\n\t\t\t\t'data-table-choices',\n\t\t\t\t'value',\n\t\t\t\t'datetime',\n\t\t\t],\n\t\t})\n\t\tfor (const node of this.#rows.values())\n\t\t\tif (node.parentElement !== this.#body)\n\t\t\t\tthis.#observer.observe(node, {\n\t\t\t\t\tchildList: true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t\tsubtree: true,\n\t\t\t\t\tattributes: true,\n\t\t\t\t\tattributeFilter: ['data-table-key', 'data-table-column', 'value', 'datetime'],\n\t\t\t\t})\n\t}\n\n\t#validateSchema(): void {\n\t\tconst schema = readTableSchema(this.#element)\n\t\tif (\n\t\t\tschema.key !== this.#document.schema.key ||\n\t\t\tschema.columns.length !== this.#document.schema.columns.length ||\n\t\t\tschema.columns.some((column, index) => {\n\t\t\t\tconst declared = this.#document.schema.columns[index]\n\t\t\t\treturn (\n\t\t\t\t\tdeclared?.key !== column.key ||\n\t\t\t\t\tdeclared.cell !== column.cell ||\n\t\t\t\t\t(column.cell === 'choice' &&\n\t\t\t\t\t\tdeclared.cell === 'choice' &&\n\t\t\t\t\t\tJSON.stringify(column.choices) !== JSON.stringify(declared.choices))\n\t\t\t\t)\n\t\t\t})\n\t\t)\n\t\t\tthrow new TableBindingError('STRUCTURE', 'Header metadata must match the supplied schema')\n\t}\n\n\t#reconcile(): void {\n\t\tthis.#validateSchema()\n\t\tconst retained = Array.from(this.#rows).filter(\n\t\t\t([, node]) => !this.#visible.has(node) || node.parentElement === this.#body,\n\t\t)\n\t\tconst elements = retained.map(([, node]) => node)\n\t\tfor (const node of this.#body.rows)\n\t\t\tif (!elements.includes(node) && !Array.from(this.#details.values()).includes(node))\n\t\t\t\telements.push(node)\n\t\tconst rows = readTableRows(this.#document.schema, elements)\n\t\tthis.#records = []\n\t\tconst keys = new Set(this.#keys(rows))\n\t\tconst additions: TableRow[] = []\n\t\tconst replacements: TableRow[] = []\n\t\tfor (const row of rows) {\n\t\t\tconst key = extractKey(this.#document.schema, row)\n\t\t\tif (key !== undefined && this.#document.rows.row(key) === undefined) additions.push(row)\n\t\t\telse replacements.push(row)\n\t\t}\n\t\tthis.#document.rows.replace(replacements)\n\t\tif (this.destroyed) return\n\t\tthis.#document.rows.add(additions)\n\t\tif (this.destroyed) return\n\t\tfor (const key of this.#rows.keys())\n\t\t\tif (!keys.has(key)) {\n\t\t\t\tthis.#document.rows.remove(key)\n\t\t\t\tif (this.destroyed) return\n\t\t\t}\n\t\tfor (const [index, row] of rows.entries()) {\n\t\t\tconst key = extractKey(this.#document.schema, row)\n\t\t\tconst node = elements[index]\n\t\t\tif (key !== undefined && node !== undefined) this.#rows.set(key, node)\n\t\t}\n\t}\n\n\t#render(): void {\n\t\tconst active = this.#element.ownerDocument.activeElement\n\t\tconst focused =\n\t\t\tactive instanceof HTMLElement &&\n\t\t\t[...this.#rows.values(), ...this.#details.values()].some((row) => row.contains(active))\n\t\t\t\t? active\n\t\t\t\t: undefined\n\t\tconst stored = this.#document.rows.rows()\n\t\tconst keys = new Set(this.#keys(stored))\n\t\tfor (const [key, node] of this.#rows)\n\t\t\tif (!keys.has(key)) {\n\t\t\t\tthis.#place(node)\n\t\t\t\tthis.#release(node)\n\t\t\t\tconst detail = this.#details.get(key)\n\t\t\t\tif (detail !== undefined) this.#place(detail)\n\t\t\t\tthis.#rows.delete(key)\n\t\t\t\tthis.#values.delete(key)\n\t\t\t\tthis.#details.delete(key)\n\t\t\t\tthis.#detailValues.delete(key)\n\t\t\t}\n\t\tconst view = this.#document.view\n\t\tconst ordered: HTMLTableRowElement[] = []\n\t\tfor (const row of view) {\n\t\t\tconst key = extractKey(this.#document.schema, row)\n\t\t\tif (key === undefined) continue\n\t\t\tconst node = this.#rows.get(key) ?? this.#createRow(key)\n\t\t\tif (this.#options.row !== undefined && !matchesTableRow(this.#values.get(key), row)) {\n\t\t\t\tthis.#options.row(node, row)\n\t\t\t\tif (this.destroyed) return\n\t\t\t\tthis.#values.set(key, row)\n\t\t\t}\n\t\t\tordered.push(node)\n\t\t\tconst detail = this.#detail(key, row)\n\t\t\tif (this.destroyed) return\n\t\t\tif (detail !== undefined) ordered.push(detail)\n\t\t\tthis.#controls(node, key, detail)\n\t\t}\n\t\tfor (const node of [...this.#rows.values(), ...this.#details.values()])\n\t\t\tif (!ordered.includes(node) && node.parentElement === this.#body) this.#place(node)\n\t\tfor (const [index, node] of ordered.entries())\n\t\t\tif (this.#body.rows[index] !== node) this.#place(node, this.#body.rows[index] ?? null)\n\t\tthis.#visible.clear()\n\t\tfor (const node of this.#rows.values())\n\t\t\tif (node.parentElement === this.#body) this.#visible.add(node)\n\t\tthis.#headers()\n\t\tif (this.destroyed) return\n\t\tthis.#pages(view)\n\t\tif (this.destroyed) return\n\t\tthis.#pager()\n\t\tif (this.destroyed) return\n\t\tthis.#restoreFocus(focused, true)\n\t\tthis.#observe()\n\t\tif (this.#records.length > 0) this.#enqueue()\n\t}\n\n\t#createRow(key: string): HTMLTableRowElement {\n\t\tif (this.#options.row === undefined)\n\t\t\tthrow new TableBindingError('STRUCTURE', 'An authored document row has no native row')\n\t\tconst node = this.#element.ownerDocument.createElement('tr')\n\t\tnode.setAttribute('data-table-key', key)\n\t\tthis.#rows.set(key, node)\n\t\treturn node\n\t}\n\n\t#createDetail(key: string): HTMLTableRowElement {\n\t\tconst detail = this.#element.ownerDocument.createElement('tr')\n\t\tdetail.id = `table-detail-${crypto.randomUUID()}`\n\t\tdetail.insertCell().colSpan = Math.max(\n\t\t\t1,\n\t\t\tthis.#rows.get(key)?.cells.length ?? this.#document.schema.columns.length,\n\t\t)\n\t\tthis.#details.set(key, detail)\n\t\treturn detail\n\t}\n\n\t#restoreFocus(focused: HTMLElement | undefined, hidden = false): void {\n\t\tif (\n\t\t\tfocused !== undefined &&\n\t\t\tthis.#element.ownerDocument.activeElement !== focused &&\n\t\t\t(this.#element.ownerDocument.activeElement === this.#element.ownerDocument.body ||\n\t\t\t\tthis.#element.ownerDocument.activeElement === null)\n\t\t) {\n\t\t\tif (focused.isConnected) focused.focus({ preventScroll: true })\n\t\t\telse if (hidden) this.#focusTable()\n\t\t}\n\t}\n\n\t#focusTable(): void {\n\t\tthis.#attribute(this.#element, 'tabindex', '-1')\n\t\tif (\n\t\t\t!this.#element.hasAttribute('aria-label') &&\n\t\t\t!this.#element.hasAttribute('aria-labelledby') &&\n\t\t\tthis.#element.caption === null\n\t\t)\n\t\t\tthis.#attribute(this.#element, 'aria-label', this.#document.schema.label ?? 'Table')\n\t\tthis.#element.focus({ preventScroll: true })\n\t}\n\n\t#detail(key: string, row: TableRow): HTMLTableRowElement | undefined {\n\t\tif (this.#options.detail === undefined || !this.#document.expansion.keys.has(key))\n\t\t\treturn undefined\n\t\tconst detail = this.#details.get(key) ?? this.#createDetail(key)\n\t\tif (!matchesTableRow(this.#detailValues.get(key), row)) {\n\t\t\tthis.#options.detail(detail, row)\n\t\t\tif (!this.destroyed) this.#detailValues.set(key, row)\n\t\t}\n\t\treturn detail\n\t}\n\n\t#place(node: HTMLTableRowElement, before?: HTMLTableRowElement | null): void {\n\t\tthis.#records.push(...this.#observer.takeRecords())\n\t\tthis.#observer.disconnect()\n\t\tif (before === undefined) node.remove()\n\t\telse if (\n\t\t\ttypeof this.#body.moveBefore === 'function' &&\n\t\t\tnode.isConnected &&\n\t\t\tthis.#body.isConnected\n\t\t)\n\t\t\tthis.#body.moveBefore(node, before)\n\t\telse this.#body.insertBefore(node, before)\n\t\tthis.#observe()\n\t}\n\n\t#attribute(element: Element, name: string, value: string | null): void {\n\t\tif (!this.#attributes.has(element)) this.#attributes.set(element, new Map())\n\t\tconst attributes = this.#attributes.get(element)\n\t\tif (attributes === undefined) return\n\t\tconst entry = attributes.get(name)\n\t\tif (entry === undefined) attributes.set(name, { original: element.getAttribute(name), value })\n\t\telse entry.value = value\n\t\tif (value === null) element.removeAttribute(name)\n\t\telse if (element.getAttribute(name) !== value) element.setAttribute(name, value)\n\t}\n\n\t#release(root: Element): void {\n\t\tfor (const [element, attributes] of this.#attributes)\n\t\t\tif (root.contains(element)) {\n\t\t\t\tfor (const [name, entry] of attributes)\n\t\t\t\t\tif (element.getAttribute(name) === entry.value) {\n\t\t\t\t\t\tif (entry.original === null) element.removeAttribute(name)\n\t\t\t\t\t\telse element.setAttribute(name, entry.original)\n\t\t\t\t\t}\n\t\t\t\tthis.#attributes.delete(element)\n\t\t\t}\n\t\tfor (const [input, state] of this.#checks)\n\t\t\tif (root.contains(input)) {\n\t\t\t\tif (input.checked === state.value) input.checked = state.checked\n\t\t\t\tif (input.indeterminate === state.mixed) input.indeterminate = state.indeterminate\n\t\t\t\tthis.#checks.delete(input)\n\t\t\t}\n\t}\n\n\t#check(input: HTMLInputElement, value: boolean, mixed: boolean): void {\n\t\tconst state = this.#checks.get(input)\n\t\tif (state === undefined)\n\t\t\tthis.#checks.set(input, {\n\t\t\t\tchecked: input.checked,\n\t\t\t\tindeterminate: input.indeterminate,\n\t\t\t\tvalue,\n\t\t\t\tmixed,\n\t\t\t})\n\t\telse {\n\t\t\tstate.value = value\n\t\t\tstate.mixed = mixed\n\t\t}\n\t\tinput.checked = value\n\t\tinput.indeterminate = mixed\n\t}\n\n\t#controls(node: HTMLTableRowElement, key: string, detail: HTMLTableRowElement | undefined): void {\n\t\tconst table = node.closest('table')\n\t\tfor (const input of node.querySelectorAll('input[type=\"checkbox\"][data-table-select]'))\n\t\t\tif (input instanceof HTMLInputElement && input.closest('table') === table)\n\t\t\t\tthis.#check(input, this.#document.selection.keys.has(key), false)\n\t\tfor (const button of node.querySelectorAll(\n\t\t\t'button[data-table-expand]:not([data-table-expand=\"page\"])',\n\t\t))\n\t\t\tif (button.closest('table') === table) {\n\t\t\t\tthis.#attribute(button, 'aria-expanded', String(this.#document.expansion.keys.has(key)))\n\t\t\t\tthis.#attribute(button, 'aria-controls', detail?.id ?? null)\n\t\t\t}\n\t}\n\n\t#headers(): void {\n\t\tconst orders = this.#document.sort.orders()\n\t\tfor (const button of this.#element.tHead?.querySelectorAll('button[data-table-sort]') ?? []) {\n\t\t\tif (button.closest('table') !== this.#element) continue\n\t\t\tconst header = button.closest('th')\n\t\t\tif (header === null) continue\n\t\t\tconst column = button.getAttribute('data-table-sort')\n\t\t\tconst index = orders.findIndex((order) => order.column === column)\n\t\t\tconst order = orders[index]\n\t\t\tconst description =\n\t\t\t\torder === undefined\n\t\t\t\t\t? null\n\t\t\t\t\t: (this.#options.describe?.sort?.({\n\t\t\t\t\t\t\tcolumn: order.column,\n\t\t\t\t\t\t\tdirection: order.direction,\n\t\t\t\t\t\t\tpriority: index + 1,\n\t\t\t\t\t\t\tcount: orders.length,\n\t\t\t\t\t\t}) ?? `Sort priority ${index + 1} of ${orders.length}, ${order.direction}`)\n\t\t\tif (this.destroyed) return\n\t\t\tthis.#attribute(\n\t\t\t\theader,\n\t\t\t\t'aria-sort',\n\t\t\t\tindex === 0 && order !== undefined ? order.direction : null,\n\t\t\t)\n\t\t\tthis.#attribute(button, 'aria-description', description)\n\t\t}\n\t}\n\n\t#pages(view: readonly TableRow[]): void {\n\t\tconst keys = this.#keys(view)\n\t\tfor (const button of this.#scoped('button[data-table-expand=\"page\"]')) {\n\t\t\tthis.#attribute(\n\t\t\t\tbutton,\n\t\t\t\t'aria-expanded',\n\t\t\t\tString(keys.length > 0 && keys.every((key) => this.#document.expansion.keys.has(key))),\n\t\t\t)\n\t\t\tif (button instanceof HTMLButtonElement) this.#disable(button, keys.length === 0)\n\t\t\tif (this.destroyed) return\n\t\t}\n\t\tconst selected = view.filter((row) => {\n\t\t\tconst key = extractKey(this.#document.schema, row)\n\t\t\treturn key !== undefined && this.#document.selection.keys.has(key)\n\t\t}).length\n\t\tfor (const input of this.#scope.querySelectorAll('input[type=\"checkbox\"][data-table-page]'))\n\t\t\tif (\n\t\t\t\tinput instanceof HTMLInputElement &&\n\t\t\t\t(input.closest('table') === null || input.closest('table') === this.#element)\n\t\t\t)\n\t\t\t\tthis.#check(\n\t\t\t\t\tinput,\n\t\t\t\t\tview.length > 0 && selected === view.length,\n\t\t\t\t\tselected > 0 && selected < view.length,\n\t\t\t\t)\n\t}\n\n\t#scoped(selector: string): readonly HTMLElement[] {\n\t\treturn Array.from(this.#scope.querySelectorAll<HTMLElement>(selector)).filter((control) => {\n\t\t\tconst table = control.closest('table')\n\t\t\treturn table === null || table === this.#element\n\t\t})\n\t}\n\n\t#disable(button: HTMLButtonElement, disabled: boolean, sibling?: HTMLButtonElement): void {\n\t\tif (disabled && this.#element.ownerDocument.activeElement === button) {\n\t\t\tif (sibling !== undefined) sibling.focus({ preventScroll: true })\n\t\t\telse this.#focusTable()\n\t\t}\n\t\tif (!this.destroyed) this.#attribute(button, 'disabled', disabled ? '' : null)\n\t}\n\n\t#value(control: HTMLSelectElement | HTMLOutputElement, value: string): void {\n\t\tconst state = this.#controlValues.get(control)\n\t\tif (state === undefined) this.#controlValues.set(control, { original: control.value, value })\n\t\telse state.value = value\n\t\tif (control.value !== value) control.value = value\n\t}\n\n\t#readRange(): TableRange {\n\t\tconst pagination = this.#document.pagination\n\t\tconst length = this.#document.view.length\n\t\treturn {\n\t\t\tfirst: length === 0 ? 0 : pagination.offset + 1,\n\t\t\tlast: length === 0 ? 0 : pagination.offset + length,\n\t\t\tcount: this.#document.count,\n\t\t\tpage: pagination.page,\n\t\t\tpages: pagination.count,\n\t\t\tlimit: pagination.limit,\n\t\t}\n\t}\n\n\t#pager(): void {\n\t\tconst range = this.#readRange()\n\t\tconst buttons = this.#scoped(\n\t\t\t'button[data-table-move=\"previous\"], button[data-table-move=\"next\"]',\n\t\t).filter((button) => button instanceof HTMLButtonElement)\n\t\tconst enabled = buttons.filter((button) =>\n\t\t\tbutton.getAttribute('data-table-move') === 'previous'\n\t\t\t\t? range.page > 1\n\t\t\t\t: range.page < range.pages,\n\t\t)\n\t\tfor (const button of enabled) this.#disable(button, false)\n\t\tfor (const button of buttons) {\n\t\t\tif (!enabled.includes(button))\n\t\t\t\tthis.#disable(\n\t\t\t\t\tbutton,\n\t\t\t\t\ttrue,\n\t\t\t\t\tenabled.find(\n\t\t\t\t\t\t(sibling) =>\n\t\t\t\t\t\t\tsibling.getAttribute('data-table-move') !== button.getAttribute('data-table-move'),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\tif (this.destroyed) return\n\t\t}\n\t\tfor (const select of this.#scoped('select[data-table-limit]'))\n\t\t\tif (select instanceof HTMLSelectElement)\n\t\t\t\tthis.#value(select, range.limit === undefined ? '' : String(range.limit))\n\t\tconst signature = JSON.stringify(range)\n\t\tif (signature === this.#range) return\n\t\tconst outputs = this.#scoped('output[data-table-range]').filter(\n\t\t\t(output) => output instanceof HTMLOutputElement,\n\t\t)\n\t\tconst description =\n\t\t\tthis.#options.describe?.range?.(range) ?? `${range.first} to ${range.last} of ${range.count}`\n\t\tif (this.destroyed) return\n\t\tif (signature !== JSON.stringify(this.#readRange())) {\n\t\t\tthis.#enqueue()\n\t\t\treturn\n\t\t}\n\t\tthis.#range = signature\n\t\tif (this.#announcement !== undefined) clearTimeout(this.#announcement)\n\t\tfor (const output of outputs) this.#value(output, '')\n\t\tthis.#announcement = setTimeout(() => {\n\t\t\tthis.#announcement = undefined\n\t\t\tif (this.destroyed) return\n\t\t\tif (signature !== JSON.stringify(this.#readRange())) {\n\t\t\t\tthis.#range = undefined\n\t\t\t\tthis.#enqueue()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfor (const output of outputs)\n\t\t\t\tif (this.#scoped('output[data-table-range]').includes(output))\n\t\t\t\t\tthis.#value(output, description)\n\t\t}, 0)\n\t}\n\n\t#click(event: MouseEvent): void {\n\t\tif (!(event.target instanceof Element) || this.destroyed || this.#requesting) return\n\t\tconst button = event.target.closest('button')\n\t\tif (\n\t\t\t!(button instanceof HTMLButtonElement) ||\n\t\t\tbutton.disabled ||\n\t\t\t(button.closest('table') !== null && button.closest('table') !== this.#element)\n\t\t)\n\t\t\treturn\n\t\tconst outcome = attempt(() => {\n\t\t\tconst move = button.getAttribute('data-table-move')\n\t\t\tif (move === 'previous' || move === 'next') {\n\t\t\t\tthis.#document.pagination.move(\n\t\t\t\t\tthis.#document.pagination.page + (move === 'previous' ? -1 : 1),\n\t\t\t\t)\n\t\t\t} else if (button.getAttribute('data-table-expand') === 'page') {\n\t\t\t\tconst keys = this.#keys(this.#document.view)\n\t\t\t\tconst closing =\n\t\t\t\t\tkeys.length > 0 && keys.every((key) => this.#document.expansion.keys.has(key))\n\t\t\t\tconst changing = keys.filter((key) => this.#document.expansion.keys.has(key) === closing)\n\t\t\t\tif (\n\t\t\t\t\tchanging.length > 0 &&\n\t\t\t\t\t!this.#request(changing.map((key) => ({ key, expanded: !closing })))\n\t\t\t\t)\n\t\t\t\t\treturn\n\t\t\t\tif (closing) this.#document.expansion.clear(keys)\n\t\t\t\telse this.#document.expansion.expand(keys)\n\t\t\t} else if (button.hasAttribute('data-table-sort') && this.#element.tHead?.contains(button)) {\n\t\t\t\tconst column = button.getAttribute('data-table-sort')\n\t\t\t\tif (column === null || !this.#document.schema.columns.some((entry) => entry.key === column))\n\t\t\t\t\tthrow new TableBindingError('STRUCTURE', 'The sort button names no column')\n\t\t\t\tconst direction = this.#document.sort.order(column)?.direction\n\t\t\t\tconst orders =\n\t\t\t\t\tdirection === 'descending'\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\t\t\t\tdirection:\n\t\t\t\t\t\t\t\t\t\tdirection === undefined ? ('ascending' as const) : ('descending' as const),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]\n\t\t\t\tconst request = new CustomEvent('table-sort', { cancelable: true, detail: orders })\n\t\t\t\tthis.#requesting = true\n\t\t\t\tthis.#emitter.emit('sort', request)\n\t\t\t\tthis.#requesting = false\n\t\t\t\tif (request.defaultPrevented || this.destroyed) return\n\t\t\t\tthis.#document.sort.remove()\n\t\t\t\tif (!this.destroyed) this.#document.sort.set(orders)\n\t\t\t} else if (button.hasAttribute('data-table-expand')) {\n\t\t\t\tconst row = button.closest('tr')\n\t\t\t\tconst key = Array.from(this.#rows).find(([, node]) => node === row)?.[0]\n\t\t\t\tif (key === undefined) return\n\t\t\t\tconst expanded = !this.#document.expansion.keys.has(key)\n\t\t\t\tif (!this.#request([{ key, expanded }])) return\n\t\t\t\tif (expanded) this.#document.expansion.expand(key)\n\t\t\t\telse this.#document.expansion.clear(key)\n\t\t\t}\n\t\t})\n\t\tif (!outcome.success) this.#emitter.emit('error', outcome.error)\n\t}\n\n\t#request(detail: readonly TableExpansion[]): boolean {\n\t\tconst request = new CustomEvent('table-expand', { cancelable: true, detail })\n\t\tthis.#requesting = true\n\t\tthis.#emitter.emit('expand', request)\n\t\tthis.#requesting = false\n\t\treturn !request.defaultPrevented && !this.destroyed\n\t}\n\n\t#change(event: Event): void {\n\t\tconst input = event.target\n\t\tif (input instanceof HTMLSelectElement && input.hasAttribute('data-table-limit')) {\n\t\t\tif (\n\t\t\t\tinput.disabled ||\n\t\t\t\tthis.destroyed ||\n\t\t\t\t!this.#scoped('select[data-table-limit]').includes(input)\n\t\t\t)\n\t\t\t\treturn\n\t\t\tconst outcome = attempt(() => {\n\t\t\t\tconst limit = input.value === '' ? undefined : parseNumber(input.value)\n\t\t\t\tif (input.value !== '' && (limit === undefined || limit <= 0 || !Number.isInteger(limit)))\n\t\t\t\t\tthrow new TableBindingError(\n\t\t\t\t\t\t'STRUCTURE',\n\t\t\t\t\t\t'The page limit must be a positive integer or empty',\n\t\t\t\t\t)\n\t\t\t\tthis.#document.pagination.resize(limit)\n\t\t\t})\n\t\t\tif (!outcome.success) this.#emitter.emit('error', outcome.error)\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\t!(input instanceof HTMLInputElement) ||\n\t\t\tinput.type !== 'checkbox' ||\n\t\t\tinput.disabled ||\n\t\t\tthis.destroyed\n\t\t)\n\t\t\treturn\n\t\tconst table = input.closest('table')\n\t\tif (table !== null && table !== this.#element) return\n\t\tconst outcome = attempt(() => {\n\t\t\tif (input.hasAttribute('data-table-page')) {\n\t\t\t\tconst keys = this.#keys(this.#document.view)\n\t\t\t\tif (input.checked) this.#document.selection.select(keys)\n\t\t\t\telse this.#document.selection.clear(keys)\n\t\t\t} else if (input.hasAttribute('data-table-select') && table === this.#element) {\n\t\t\t\tconst key = Array.from(this.#rows).find(([, node]) => node === input.closest('tr'))?.[0]\n\t\t\t\tif (key !== undefined) {\n\t\t\t\t\tif (input.checked) this.#document.selection.select(key)\n\t\t\t\t\telse this.#document.selection.clear(key)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\tif (!outcome.success) this.#emitter.emit('error', outcome.error)\n\t}\n\n\t#keys(rows: readonly TableRow[]): readonly string[] {\n\t\treturn rows.flatMap((row) => {\n\t\t\tconst key = extractKey(this.#document.schema, row)\n\t\t\treturn key === undefined ? [] : [key]\n\t\t})\n\t}\n}\n","import type { TableInterface } from '@src/core'\nimport type { TableBindingInterface, TableBindingOptions } from './types.js'\nimport { TableBinding } from './TableBinding.js'\n\n/** Creates a native table binding with one retained row owner.\n * @param element - The native table to bind.\n * @param document - The borrowed core document.\n * @param options - Renderers, scoped controls, and listeners.\n * @returns The native binding.\n */\nexport function createTableBinding(\n\telement: HTMLTableElement,\n\tdocument: TableInterface,\n\toptions?: TableBindingOptions,\n): TableBindingInterface {\n\treturn new TableBinding(element, document, options)\n}\n"],"mappings":"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"}