@mk-kit/ui 0.52.0 → 0.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"mk-kit-ui-table.mjs","sources":["../../../projects/mk-kit/table/table/table-row-detail.ts","../../../projects/mk-kit/table/table/table-cell.ts","../../../projects/mk-kit/table/export.ts","../../../projects/mk-kit/table/table/table.ts","../../../projects/mk-kit/table/table/table.html","../../../projects/mk-kit/table/sort/sort.ts","../../../projects/mk-kit/table/sort/sort-header.ts","../../../projects/mk-kit/table/sort/sort-header.html","../../../projects/mk-kit/table/data-source.ts","../../../projects/mk-kit/table/index.ts","../../../projects/mk-kit/table/mk-kit-ui-table.ts"],"sourcesContent":["import { Directive, TemplateRef, inject } from '@angular/core';\n\n/**\n * Marks an `<ng-template>` as the expandable detail content for {@link MkTable}\n * rows. The template's implicit context is the row object, so consumers can\n * destructure it with `let-row`:\n *\n * ```html\n * <mk-table [columns]=\"cols\" [data]=\"rows()\" expandable>\n * <ng-template mkTableRowDetail let-row>\n * <dl>… {{ row.notes }} …</dl>\n * </ng-template>\n * </mk-table>\n * ```\n */\n@Directive({\n selector: '[mkTableRowDetail]',\n})\nexport class MkTableRowDetail<T = unknown> {\n /** The projected detail template, rendered once per expanded row. */\n readonly template = inject<TemplateRef<{ $implicit: T }>>(TemplateRef);\n}\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\n\n/** Context handed to an `[mkTableCell]` template. */\nexport interface MkTableCellContext<T = unknown> {\n /** The cell's raw value (the row's property named by the column key). */\n $implicit: unknown;\n /** The whole row, for cells that need more than one field. */\n row: T;\n}\n\n/**\n * Marks an `<ng-template>` as the renderer for one column's cells, named by the\n * column `key`. Without it a cell can only be text — `MkTableColumn.format`\n * returns a string — so anything richer (a status tag, an avatar, a progress\n * bar, an action button) meant abandoning `mk-table` for a hand-rolled\n * `<table>`.\n *\n * The value is the template's implicit context and the row is available as\n * `let-row`:\n *\n * ```html\n * <mk-table [columns]=\"cols\" [data]=\"rows()\">\n * <ng-template mkTableCell=\"status\" let-value let-row=\"row\">\n * <mk-tag [tone]=\"toneFor(value)\">{{ label(value) }}</mk-tag>\n * </ng-template>\n * </mk-table>\n * ```\n *\n * A column with both a template and a `format` uses the template; `format`\n * still applies to sorting/export paths that need a string.\n */\n@Directive({\n selector: '[mkTableCell]',\n})\nexport class MkTableCell<T = unknown> {\n /** Column key whose cells this template renders. */\n readonly mkTableCell = input.required<string>();\n\n /** The projected template, rendered once per cell in that column. */\n readonly template =\n inject<TemplateRef<MkTableCellContext<T>>>(TemplateRef);\n}\n","/**\n * CSV export — turn rows into RFC 4180 text and hand it to the browser as a\n * download. Framework-free so it also serves data that never touched a table.\n */\n\n/** A column to export: the row property, its header, and an optional formatter. */\nexport interface MkCsvColumn<T = Record<string, unknown>> {\n /** Property key on each row object supplying the cell value. */\n key: string;\n /** Header text; defaults to `key`. */\n header?: string;\n /** Formatter turning the raw value into cell text (same shape as `MkTableColumn.format`). */\n format?: (value: unknown, row: T) => string;\n}\n\nexport interface MkCsvOptions {\n /** Field separator (default `,`; use `;` for locales whose Excel expects it). */\n delimiter?: string;\n /** Emit the header row first (default `true`). */\n header?: boolean;\n /** Line terminator (default `\\r\\n`, per RFC 4180). */\n newline?: string;\n /**\n * Prefix a UTF-8 byte-order mark (default `true`) so Excel reads accented\n * characters correctly. Only affects the downloaded file / returned text.\n */\n bom?: boolean;\n /**\n * Neutralise spreadsheet formula injection (default `true`): a text cell\n * starting with `=`, `+`, `-`, `@`, tab or CR is prefixed with `'` so a\n * malicious value cannot execute when opened in Excel / Sheets. Numbers\n * are never touched, so `-5` stays `-5`.\n */\n sanitize?: boolean;\n /** Property holding child rows; when set, trees are flattened depth-first. */\n childrenKey?: string;\n}\n\n/** Options for {@link mkExportCsv}. */\nexport interface MkCsvExportOptions extends MkCsvOptions {\n /** File name for the download (default `export.csv`; `.csv` is appended if missing). */\n filename?: string;\n}\n\nconst NEEDS_QUOTES = /[\"\\r\\n]/;\nconst FORMULA_LEAD = /^[=+\\-@\\t\\r]/;\n\n/** Escape one cell for CSV. */\nfunction csvCell(value: unknown, delimiter: string, sanitize: boolean): string {\n if (value == null) return '';\n let text: string;\n if (typeof value === 'string') {\n text = sanitize && FORMULA_LEAD.test(value) ? `'${value}` : value;\n } else if (value instanceof Date) {\n text = value.toISOString();\n } else if (typeof value === 'object') {\n text = JSON.stringify(value);\n } else {\n text = String(value);\n }\n return NEEDS_QUOTES.test(text) || text.includes(delimiter) || /^\\s|\\s$/.test(text)\n ? `\"${text.replace(/\"/g, '\"\"')}\"`\n : text;\n}\n\n/**\n * Serialise `rows` as CSV text.\n *\n * Without `columns` every key of the first row is exported in its own order.\n * Column formatters are applied, so what the user saw in the table is what\n * lands in the file.\n */\nexport function mkToCsv<T>(\n rows: readonly T[],\n columns?: readonly MkCsvColumn<T>[],\n options: MkCsvOptions = {},\n): string {\n const delimiter = options.delimiter ?? ',';\n const newline = options.newline ?? '\\r\\n';\n const sanitize = options.sanitize ?? true;\n const cols: readonly MkCsvColumn<T>[] =\n columns ??\n Object.keys((rows[0] ?? {}) as object)\n .filter((key) => key !== options.childrenKey)\n .map((key) => ({ key }));\n\n const flat: T[] = [];\n const walk = (list: readonly T[]): void => {\n for (const row of list) {\n flat.push(row);\n const children = options.childrenKey\n ? (row as Record<string, unknown>)[options.childrenKey]\n : null;\n if (Array.isArray(children)) walk(children as T[]);\n }\n };\n walk(rows);\n\n const lines: string[] = [];\n if (options.header ?? true) {\n lines.push(cols.map((c) => csvCell(c.header ?? c.key, delimiter, sanitize)).join(delimiter));\n }\n for (const row of flat) {\n lines.push(\n cols\n .map((c) => {\n const raw = (row as Record<string, unknown>)[c.key];\n const value = c.format ? c.format(raw, row) : raw;\n return csvCell(value, delimiter, sanitize);\n })\n .join(delimiter),\n );\n }\n return (options.bom ?? true ? '' : '') + lines.join(newline) + newline;\n}\n\n/**\n * Trigger a browser download of `text` as a file. No-op outside a DOM\n * (server-side rendering); returns whether a download was started.\n */\nexport function mkDownloadText(\n text: string,\n filename: string,\n type = 'text/csv;charset=utf-8',\n): boolean {\n if (typeof document === 'undefined' || typeof URL?.createObjectURL !== 'function') return false;\n const url = URL.createObjectURL(new Blob([text], { type }));\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.rel = 'noopener';\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n a.remove();\n // Give the click a tick to grab the blob before the URL is released.\n setTimeout(() => URL.revokeObjectURL(url), 0);\n return true;\n}\n\n/**\n * Serialise `rows` as CSV and download it. Returns the CSV text so callers\n * can also keep it (tests, previews, uploads).\n */\nexport function mkExportCsv<T>(\n rows: readonly T[],\n columns?: readonly MkCsvColumn<T>[],\n options: MkCsvExportOptions = {},\n): string {\n const csv = mkToCsv(rows, columns, options);\n let filename = options.filename ?? 'export.csv';\n if (!/\\.csv$/i.test(filename)) filename += '.csv';\n mkDownloadText(csv, filename);\n return csv;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n PLATFORM_ID,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n contentChild,\n contentChildren,\n effect,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { DOCUMENT, NgTemplateOutlet, isPlatformBrowser } from '@angular/common';\nimport { MkLiveAnnouncer } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MkCheckbox } from '@mk-kit/ui/checkbox';\nimport { MkTableRowDetail } from './table-row-detail';\nimport { MkTableCell } from './table-cell';\nimport { mkDownloadText, mkToCsv, type MkCsvColumn, type MkCsvExportOptions } from '../export';\n\n/** Horizontal text alignment for a table column. */\nexport type MkTableAlign = 'start' | 'center' | 'end';\n/** Sort direction; `none` means unsorted. */\nexport type MkSortDirection = 'asc' | 'desc' | 'none';\n/** Row vertical density. */\nexport type MkTableDensity = 'comfortable' | 'compact';\n\n/** Which control a column's header filter renders (see {@link MkTableColumn.filter}). */\nexport type MkTableFilterKind = 'text' | 'select' | 'number' | 'date';\n\n/** One option of a `select` header filter. */\nexport interface MkTableFilterOption {\n /** The value compared against the cell (by `String()` equality). */\n value: unknown;\n /** Visible option text. */\n label: string;\n}\n\n/**\n * An inclusive range accepted as the value of a `number` or `date` filter\n * (dates as `YYYY-MM-DD`, `Date` or a timestamp). Either bound may be omitted.\n */\nexport interface MkTableFilterRange<V = number | string | Date> {\n min?: V | null;\n max?: V | null;\n}\n\n/**\n * Active header filters keyed by column key: a string for `text`, an option\n * value for `select`, a number / date (`>=`) or a {@link MkTableFilterRange}\n * for `number` and `date`. Empty strings and `null` mean \"no filter\".\n */\nexport type MkTableFilters = Record<string, unknown>;\n\n/** Column definition for {@link MkTable}. */\nexport interface MkTableColumn<T = Record<string, unknown>> {\n /** Property key on each row object supplying the cell value. */\n key: string;\n /** Visible column header text. */\n header: string;\n /** Allow sorting by this column. */\n sortable?: boolean;\n /** Cell/header alignment (default `start`). */\n align?: MkTableAlign;\n /** Fixed column width (any CSS length). */\n width?: string;\n /** Optional formatter turning the raw value into display text. */\n format?: (value: unknown, row: T) => string;\n /** Allow the user to drag-resize this column (needs `resizableColumns`). */\n resizable?: boolean;\n /** Make this column's cells inline-editable (double-click / Enter). */\n editable?: boolean;\n /** Pin (freeze) this column to a side while the body scrolls horizontally. */\n pinned?: 'left' | 'right';\n /** Minimum width in px when resizing (default 60). */\n minWidth?: number;\n /**\n * What becomes of this column when the table stacks into cards\n * (see {@link MkTable.stackAt}). Omitted, the column renders as a labelled\n * field: its `header` on one side, its value on the other.\n *\n * - `'title'` — the card's heading. No label; the value identifies the\n * record at a glance (an order number, a product name). Mark one, or two\n * if something short belongs beside it such as a status or a total.\n * - `'footer'` — pinned to the bottom of the card, full width and unlabelled.\n * Where an actions cell belongs: buttons read as buttons, rather than as\n * the answer to a label.\n * - `'hide'` — not rendered at all. Not merely invisible: the cell is never\n * created, so a screen reader does not read it either. For columns that\n * only earn their place while scanning a grid, and especially for anything\n * an expandable row detail already repeats.\n */\n stack?: 'title' | 'footer' | 'hide';\n /**\n * The header-row filter control for this column (rendered when the table is\n * {@link MkTable.filterable}). Omitted, a filterable table gives the column a\n * text filter; `false` leaves its filter cell empty.\n *\n * - `'text'` — case-insensitive *contains* on the displayed (formatted) text.\n * - `'select'` — equality against one of {@link filterOptions}; without\n * options, the distinct values found in `data`.\n * - `'number'` / `'date'` — the control keeps rows whose value is **≥** the\n * entry. Set `{ min, max }` through {@link MkTable.filters} for an\n * inclusive range. Dates compare by local calendar day.\n */\n filter?: MkTableFilterKind | false;\n /**\n * Options of a `select` filter — strings / numbers, or `{ value, label }`.\n * Omitted: every distinct value of the column in `data`, sorted.\n */\n filterOptions?: readonly (string | number | MkTableFilterOption)[];\n /** Placeholder of the filter control (text: `i18n.filter`; number / date: `i18n.filterMin`). */\n filterPlaceholder?: string;\n}\n\n/** Payload emitted by {@link MkTable.sortChange}. */\nexport interface MkSortChange {\n /** Column key sorted by. */\n key: string;\n /** Resulting direction (`none` when sorting was cleared). */\n direction: MkSortDirection;\n}\n\n/** Payload emitted by {@link MkTable.columnResize} after a column resize. */\nexport interface MkColumnResize {\n /** The resized column's key. */\n key: string;\n /** The new width in pixels. */\n width: number;\n}\n\n/** Payload emitted by {@link MkTable.cellEdit} when an editable cell is saved. */\nexport interface MkCellEdit<T = Record<string, unknown>> {\n /** The edited row. */\n row: T;\n /** The column key that was edited. */\n key: string;\n /** The new (string) value the user entered. */\n value: string;\n}\n\n/** A group of rows produced by {@link MkTable.groupBy}. */\nexport interface MkTableGroup<T = Record<string, unknown>> {\n /** The shared group value. */\n key: unknown;\n /** Display label for the group header. */\n label: string;\n /** The rows in this group, in display (sorted) order. */\n rows: T[];\n}\n\n/** Payload emitted by {@link MkTable.groupToggle}. */\n/** Payload of `(treeToggle)`: a parent row was expanded or collapsed. */\nexport interface MkTreeToggle<T = Record<string, unknown>> {\n /** The parent row. */\n row: T;\n /** Whether its child rows are now shown. */\n expanded: boolean;\n}\n\nexport interface MkGroupToggle {\n /** The toggled group's value. */\n key: unknown;\n /** Whether the group is now collapsed. */\n collapsed: boolean;\n}\n\n/** Options for {@link MkTable.getExportRows} — which rows and columns to export. */\nexport interface MkTableExportRowsOptions {\n /** Export only the selected rows (default: every row). */\n selectedOnly?: boolean;\n /** Restrict to these column keys, in table order (default: every column). */\n columns?: readonly string[];\n}\n\n/** What {@link MkTable.getExportRows} returns: the rows and the columns to write them with. */\nexport interface MkTableExportRows<T> {\n /**\n * The rows in display order — sorted the way they are shown, tree children\n * flattened under their parent (expanded or not), selection applied when\n * `selectedOnly` was set.\n */\n rows: T[];\n /**\n * The columns in the table's current (user-reordered) order, restricted to\n * the requested keys, each with its header and formatter.\n */\n columns: MkCsvColumn<T>[];\n}\n\n/** Options for {@link MkTable.exportCsv}. */\nexport interface MkTableExportOptions extends MkCsvExportOptions, MkTableExportRowsOptions {\n /** Start the browser download (default `true`); `false` just returns the text. */\n download?: boolean;\n}\n\n/** Hard floor (px) for column resize when a column sets no `minWidth`. */\nconst MIN_COL_WIDTH = 60;\n/**\n * Row height (px) assumed by `virtual` until the first row is measured: the\n * comfortable density row — `--mk-space-3` padding twice around a\n * `--mk-font-size-sm` line, plus the 1px row border.\n */\nconst DEFAULT_ROW_HEIGHT = 44;\n/** Rows rendered before the viewport has been measured (SSR, first paint). */\nconst UNMEASURED_VIEWPORT_ROWS = 20;\n\nconst ISO_DAY = /^\\d{4}-\\d{2}-\\d{2}/;\n\n/** Local calendar day (`YYYY-MM-DD`) of a Date, ISO string or timestamp. */\nfunction dayKey(value: unknown): string | null {\n if (value == null || value === '') return null;\n if (typeof value === 'string' && ISO_DAY.test(value)) return value.slice(0, 10);\n const d = value instanceof Date ? value : new Date(value as string | number);\n if (Number.isNaN(d.getTime())) return null;\n const pad = (n: number): string => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\n/** Whether a filter value is a `{ min, max }` range rather than a single bound. */\nfunction isFilterRange(v: unknown): v is MkTableFilterRange<unknown> {\n return (\n typeof v === 'object' && v !== null && !(v instanceof Date) && ('min' in v || 'max' in v)\n );\n}\n\n/** `null`, `''` and empty ranges all mean \"no filter on this column\". */\nfunction isEmptyFilter(v: unknown): boolean {\n if (v == null || v === '') return true;\n if (isFilterRange(v)) return isEmptyFilter(v.min) && isEmptyFilter(v.max);\n return false;\n}\n\n/** Drop the empty entries of a filter map (`null` when nothing is left). */\nexport function mkCompactFilters(\n filters: MkTableFilters | null | undefined,\n): MkTableFilters | null {\n if (!filters) return null;\n const out: MkTableFilters = {};\n let any = false;\n for (const key of Object.keys(filters)) {\n if (isEmptyFilter(filters[key])) continue;\n out[key] = filters[key];\n any = true;\n }\n return any ? out : null;\n}\n/** Upper bound advertised on resize separators (`aria-valuemax`). */\nconst MAX_COL_WIDTH = 2000;\n\n/** One rendered tbody entry: either a group header or a data row. */\ntype MkTableItem<T> =\n | { kind: 'group'; group: MkTableGroup<T> }\n | {\n kind: 'row';\n row: T;\n /** Nesting depth in tree mode (0 for roots and for flat tables). */\n depth: number;\n /** Whether the row has child rows (tree mode). */\n hasChildren: boolean;\n /** Whether its children are currently shown (tree mode). */\n expanded: boolean;\n };\n\n/**\n * Table — a themed data table built on a native `<table>` for accessibility.\n * Supply `columns` and `data`; opt into sortable columns, sticky header,\n * zebra striping, hover and density. Sorting is fully keyboard operable\n * (Enter/Space on a header) and announces changes via {@link MkLiveAnnouncer}.\n * `virtual` windows the rows of very large tables; `filterable` adds a\n * per-column filter row (`[(filters)]`).\n *\n * ```html\n * <mk-table\n * [columns]=\"columns\"\n * [data]=\"rows()\"\n * stickyHeader\n * zebra\n * (sortChange)=\"onSort($event)\"\n * (rowClick)=\"open($event)\" />\n * ```\n */\n/**\n * Shared collator for string sorting. Created lazily at module scope rather\n * than as a `static` class field: a static initializer that *calls* something\n * stops Angular's build optimizer from marking the class IIFE as pure, which\n * pinned `MkTable` — and, through it, the whole table entry point — into every\n * bundle that imported any export of `@mk-kit/ui/table`.\n */\nlet collator: Intl.Collator | undefined;\nconst sortCollator = (): Intl.Collator => (collator ??= new Intl.Collator());\n\n@Component({\n selector: 'mk-table',\n templateUrl: './table.html',\n styleUrl: './table.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkCheckbox, NgTemplateOutlet],\n host: {\n class: 'mk-table',\n '[class.mk-table--sticky]': 'stickyHeader() || isVirtual()',\n '[class.mk-table--virtual]': 'isVirtual()',\n '[class.mk-table--filterable]': 'filterable() && !stacked()',\n '[class.mk-table--zebra]': 'zebra()',\n '[class.mk-table--hover]': 'hover()',\n '[class.mk-table--compact]': \"density() === 'compact'\",\n '[class.mk-table--clickable]': 'clickableRows()',\n '[class.mk-table--selectable]': 'selectable()',\n '[class.mk-table--expandable]': 'expandable()',\n '[class.mk-table--grouped]': 'groupBy() !== null',\n '[class.mk-table--stacked]': 'stacked()',\n },\n})\nexport class MkTable<T = Record<string, unknown>> {\n private readonly announcer = inject(MkLiveAnnouncer);\n protected readonly i18n = inject(MK_I18N);\n private readonly document = inject(DOCUMENT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly destroyRef = inject(DestroyRef);\n\n /**\n * True while the table is narrower than {@link stackAt} and rendering cards.\n *\n * Driven by the element's own width rather than the viewport's: the question\n * \"do these columns fit\" is about the space the table HAS, not the size of\n * the screen. A table in a sidebar or a dialog should stack while the window\n * around it is enormous.\n */\n protected readonly stacked = signal(false);\n\n constructor() {\n // Keep the sticky offsets (filter row under the header row, group headers\n // under the thead) in sync with the rendered heights — they shift with\n // density, sticky mode, the filter row and grouping itself.\n effect(() => {\n this.stickyHeader();\n this.density();\n this.groupBy();\n this.filterable();\n this.virtual();\n afterNextRender(\n { read: () => this.applyStickyOffsets() },\n { injector: this.injector },\n );\n });\n\n // Virtual mode: after every render that could change what is on screen,\n // read back the real row / detail heights and the viewport, so the\n // spacers and the window stay honest for whatever density is in force.\n afterRenderEffect({\n read: () => {\n if (!this.isVirtual()) return;\n this.windowRange();\n this.density();\n this.expandedKeys();\n const el = this.scroller()?.nativeElement;\n if (el) untracked(() => this.measureViewport(el));\n },\n });\n\n // Announce how many rows a change of filters left (the visible count).\n let firstFilters = true;\n effect(() => {\n this.filters();\n if (firstFilters) {\n firstFilters = false;\n return;\n }\n untracked(() => {\n if (!this.clientFilter()) return;\n this.announcer.announce(this.i18n.resultsCount(this.allRows().length));\n });\n });\n\n // Watch the host's width against `stackAt`. ResizeObserver rather than\n // matchMedia because the trigger is the element's width, not the window's.\n // Skipped entirely on the server and wherever the API is missing, leaving\n // `stacked` false — the grid is the safe fallback, since it renders the\n // same data with nothing dropped.\n afterNextRender(\n {\n read: () => {\n if (!this.isBrowser || typeof ResizeObserver === 'undefined') return;\n const el = this.host.nativeElement;\n const observer = new ResizeObserver(([entry]) => {\n const limit = this.stackAt();\n this.stacked.set(limit > 0 && entry.contentRect.width < limit);\n });\n observer.observe(el);\n // The scroller's height is the virtual viewport; the table grows or\n // shrinks when a density change re-sizes its rows.\n const scroller = this.scroller()?.nativeElement;\n const viewport = new ResizeObserver(() => {\n if (scroller && this.isVirtual()) this.measureViewport(scroller);\n });\n if (scroller) {\n viewport.observe(scroller);\n const table = scroller.querySelector('table');\n if (table) viewport.observe(table);\n }\n this.destroyRef.onDestroy(() => {\n observer.disconnect();\n viewport.disconnect();\n });\n },\n },\n { injector: this.injector },\n );\n }\n\n /**\n * Measures the header row and the thead and exposes them as the sticky\n * offsets of the filter row and of the group rows.\n */\n private applyStickyOffsets(): void {\n const host = this.host.nativeElement;\n const sticky = this.stickyHeader() || this.isVirtual();\n if (this.filterable()) {\n const headRow = host.querySelector('thead > tr');\n const h = sticky && headRow ? headRow.getBoundingClientRect().height : 0;\n host.style.setProperty('--_filter-top', `${Math.round(h)}px`);\n }\n if (this.groupBy() == null) return;\n const thead = host.querySelector('thead');\n const h = sticky && thead ? thead.getBoundingClientRect().height : 0;\n host.style.setProperty('--_group-top', `${Math.round(h)}px`);\n }\n\n /** Column definitions (order = display order). */\n readonly columns = input.required<MkTableColumn<T>[]>();\n /** Row objects to render. */\n readonly data = input<T[]>([]);\n /** Pin the header to the top of the scroll container. */\n readonly stickyHeader = input(false, { transform: booleanAttribute });\n /** Alternate row background for readability. */\n readonly zebra = input(false, { transform: booleanAttribute });\n /** Highlight rows on hover. */\n readonly hover = input(true, { transform: booleanAttribute });\n /** Row density. */\n readonly density = input<MkTableDensity>('comfortable');\n /**\n * Width in px below which each row renders as a CARD instead of a table row.\n * `0` (default) never stacks.\n *\n * Measured on the table's own container, not the viewport — a table in a\n * narrow sidebar should stack on a desktop, and a table on a tablet in\n * landscape should not. Per-column behaviour is set with\n * {@link MkTableColumn.stack}.\n *\n * A grid cannot survive a phone: eight columns become eight unreadable\n * slivers, and horizontal scrolling loses the row you were reading. Cards\n * keep one record together and put its header beside each value.\n */\n readonly stackAt = input(0, { transform: numberAttribute });\n /** Style rows as clickable and emit `rowClick`. */\n readonly clickableRows = input(false, { transform: booleanAttribute });\n /** Message shown when there are no rows. */\n readonly emptyMessage = input(this.i18n.noData);\n /** Render a leading checkbox column for row selection. */\n readonly selectable = input(false, { transform: booleanAttribute });\n /**\n * Two-way bound array of selected rows. Use `[(selected)]` to bind, or read\n * `selectionChange`. Rows are compared by {@link trackKey} when set, else by\n * referential identity.\n */\n readonly selected = model<T[]>([]);\n /**\n * Property name identifying a row for selection equality. When omitted rows\n * are matched by reference.\n */\n readonly trackKey = input<string>();\n\n /**\n * Optional per-row CSS class: called with each row, the returned string is\n * appended to the row's class list (falsy → none). For state the consumer\n * owns — an \"active in the side panel\" highlight, an unread accent — that\n * `selectable`'s own selected style doesn't cover.\n */\n readonly rowClass = input<((row: T) => string | null | undefined) | null>(\n null,\n );\n\n /** Resolved class for a row (empty string when no `rowClass` is set). */\n protected rowClassFor(row: T): string {\n return this.rowClass()?.(row) ?? '';\n }\n /**\n * Render a leading expander column. Each row can reveal a detail panel\n * supplied via an `<ng-template mkTableRowDetail let-row>`.\n */\n readonly expandable = input(false, { transform: booleanAttribute });\n /** Allow only one row expanded at a time (accordion). */\n readonly singleExpand = input(false, { transform: booleanAttribute });\n /** Enable drag-to-resize on columns marked `resizable` (data-grid pro). */\n readonly resizableColumns = input(false, { transform: booleanAttribute });\n /** Enable drag-to-reorder of column headers (data-grid pro). */\n readonly reorderableColumns = input(false, { transform: booleanAttribute });\n /**\n * Group rows by a column key or an accessor. Renders a collapsible group\n * header row (sticky, with a row count) above each group. Sorting still\n * applies within groups; groups follow their first row's sorted position.\n */\n readonly groupBy = input<string | ((row: T) => unknown) | null>(null);\n /** Formats a group header label; defaults to `String(value)`. */\n readonly groupLabel = input<\n ((value: unknown, rows: T[]) => string) | null\n >(null);\n\n // --- Virtualisation inputs -------------------------------------------------\n /**\n * Render only the rows in view (plus {@link overscan}) — for tables of\n * thousands of rows. The `<table>` scrolls inside its own box sized by\n * {@link height} / {@link maxHeight} (`max-height: 60vh` when neither is\n * set) with the header pinned; spacer rows keep the scrollbar honest.\n *\n * Works with sorting, selection (select-all still covers every row), tree\n * rows, grouping (group headers are rows too), expandable detail rows (their\n * height is measured once rendered; an unmeasured detail counts as one row)\n * and the header filter row. Falls back to the full render while stacked\n * into cards. Export and select-all always see every row, not the window.\n */\n readonly virtual = input(false, { transform: booleanAttribute });\n /**\n * Height (px) of one row in virtual mode. Leave unset to have it measured\n * from the first rendered row — which follows `density` and\n * `data-mk-density` automatically — starting from 44 (comfortable).\n */\n readonly rowHeight = input<number | null, unknown>(null, {\n transform: (v) => (v == null || v === '' ? null : numberAttribute(v)),\n });\n /** Rows rendered beyond each edge of the viewport in virtual mode. */\n readonly overscan = input(6, { transform: numberAttribute });\n /** Fixed height of the scroll box (CSS length, or px as a number). */\n readonly height = input<string | number | null>(null);\n /** Maximum height of the scroll box (CSS length, or px as a number). */\n readonly maxHeight = input<string | number | null>(null);\n\n // --- Filter row inputs -----------------------------------------------------\n /**\n * Render a second header row with a filter control per column — a text\n * box, a select, a number or a date field as the column's\n * {@link MkTableColumn.filter} says. Values live in {@link filters}.\n */\n readonly filterable = input(false, { transform: booleanAttribute });\n /**\n * The active filters, keyed by column key (`[(filters)]`; `filtersChange`\n * emits the whole map on every edit). Text filters hold the typed string,\n * select filters the chosen option value, number / date filters the lower\n * bound or a `{ min, max }` range. Set programmatically to pre-filter.\n */\n readonly filters = model<MkTableFilters>({});\n /**\n * Filter rows in the browser (default). Turn off when the server applies\n * the filters — `MkTableDataSource.setFilters($event)` on `filtersChange` —\n * so the page it returns is shown as-is.\n */\n readonly clientFilter = input(true, { transform: booleanAttribute });\n\n /** Emitted when the sort column/direction changes. */\n readonly sortChange = output<MkSortChange>();\n /** Emitted when a row is clicked (enable via `clickableRows`). */\n readonly rowClick = output<T>();\n /** Emitted with the new selection whenever it changes (enable via `selectable`). */\n readonly selectionChange = output<T[]>();\n /** Emitted with the currently expanded rows whenever they change. */\n readonly expandedChange = output<T[]>();\n /** Emitted when a column is resized (px). */\n readonly columnResize = output<MkColumnResize>();\n /** Emitted with the new column key order after a reorder. */\n readonly columnReorder = output<string[]>();\n /** Emitted when an inline-editable cell is saved. */\n readonly cellEdit = output<MkCellEdit<T>>();\n /** Emitted when a group header is expanded or collapsed. */\n readonly groupToggle = output<MkGroupToggle>();\n /**\n * Tree rows: the property on each row holding its child rows (`T[]`). When\n * set, the table renders a tree grid — child rows are indented under their\n * parent behind an expand toggle in the first column, sorting applies per\n * sibling group, and ArrowRight / ArrowLeft on a row open / close it.\n */\n readonly childrenKey = input<string | null>(null);\n /** Emitted when a parent row is expanded or collapsed (tree mode). */\n readonly treeToggle = output<MkTreeToggle<T>>();\n\n /** User-set column widths (px), keyed by column key. */\n private readonly colWidths = signal<Record<string, number>>({});\n /** User-set column order (keys); `null` = the input order. */\n private readonly colOrder = signal<string[] | null>(null);\n /** The cell currently being inline-edited. */\n protected readonly editing = signal<{ index: number; key: string } | null>(\n null,\n );\n\n /** Columns in display order, honouring any user reordering. */\n protected readonly orderedColumns = computed<MkTableColumn<T>[]>(() => {\n const cols = this.columns();\n const order = this.colOrder();\n if (!order) return cols;\n const byKey = new Map(cols.map((c) => [c.key, c]));\n const ordered = order.map((k) => byKey.get(k)).filter((c): c is MkTableColumn<T> => !!c);\n // Append any columns not present in the saved order (e.g. newly added).\n const seen = new Set(order);\n for (const c of cols) if (!seen.has(c.key)) ordered.push(c);\n return ordered;\n });\n\n // ── Stacked (card) layout ────────────────────────────────────────────────\n // Three slots, so a card reads as a record rather than as a form: a heading\n // line, labelled fields, and actions along the bottom. Columns keep their\n // configured order within each slot.\n\n /** Columns forming the card's heading line. */\n protected readonly stackTitleColumns = computed(() =>\n this.orderedColumns().filter((c) => c.stack === 'title'),\n );\n /** Columns rendered as `label / value` rows in the card body. */\n protected readonly stackFieldColumns = computed(() =>\n this.orderedColumns().filter((c) => !c.stack),\n );\n /** Columns pinned to the bottom of the card, unlabelled. */\n protected readonly stackFooterColumns = computed(() =>\n this.orderedColumns().filter((c) => c.stack === 'footer'),\n );\n\n /**\n * Whether a stacked cell should show its column header as a label.\n *\n * An empty header means the column never had a name to show — an actions or\n * chevron column — and an empty label box would just be a gap the reader has\n * to account for.\n */\n protected hasStackLabel(col: MkTableColumn<T>): boolean {\n return !!col.header?.trim();\n }\n\n /** The rendered width for a column, if the user resized it. */\n protected colStyleWidth(col: MkTableColumn<T>): string | null {\n // A card has one column, so a per-column width — configured or dragged —\n // would pin the value box to a grid width that no longer exists.\n if (this.stacked()) return null;\n const w = this.colWidths()[col.key];\n if (w != null) return `${w}px`;\n return col.width ?? null;\n }\n\n /** Sticky offsets for every pinned column, computed once per layout change. */\n private readonly pinnedOffsets = computed<Map<string, number>>(() => {\n const map = new Map<string, number>();\n const cols = this.orderedColumns();\n const widths = this.colWidths();\n // Account for the leading select / expander columns at the inline start.\n let left = (this.selectable() ? 44 : 0) + (this.expandable() ? 44 : 0);\n for (const c of cols) {\n if (c.pinned !== 'left') continue;\n map.set(c.key, left);\n left += widths[c.key] ?? this.numericWidth(c);\n }\n let right = 0;\n for (let i = cols.length - 1; i >= 0; i--) {\n const c = cols[i];\n if (c.pinned !== 'right') continue;\n map.set(c.key, right);\n right += widths[c.key] ?? this.numericWidth(c);\n }\n return map;\n });\n\n /** Sticky offset (px) for a pinned column. */\n protected pinnedOffset(col: MkTableColumn<T>): number {\n return this.pinnedOffsets().get(col.key) ?? 0;\n }\n\n /** Pinning freezes a column against horizontal scroll. Cards do not scroll\n * sideways, so both the class and its inline offset are suppressed. */\n protected isPinned(col: MkTableColumn<T>, side: 'left' | 'right'): boolean {\n return !this.stacked() && col.pinned === side;\n }\n\n private numericWidth(col: MkTableColumn<T>): number {\n const w = col.width ? parseInt(col.width, 10) : NaN;\n return Number.isFinite(w) ? w : 150;\n }\n\n // --- Column resize --------------------------------------------------------\n private resizeKey: string | null = null;\n private resizeStartX = 0;\n private resizeStartW = 0;\n private resizeMin = MIN_COL_WIDTH;\n /** +1 in LTR, -1 in RTL — dragging toward the inline-end always widens. */\n private resizeSign: 1 | -1 = 1;\n\n /** Whether the table currently renders right-to-left (SSR-safe). */\n private isRtl(): boolean {\n const view = this.document.defaultView;\n if (!view) return false;\n return view.getComputedStyle(this.host.nativeElement).direction === 'rtl';\n }\n\n private resizeRaf: number | null = null;\n private pendingResizeX = 0;\n\n /** Begin a drag-resize from a header handle. */\n protected startResize(event: PointerEvent, col: MkTableColumn<T>): void {\n if (!this.resizableColumns() || !col.resizable) return;\n event.preventDefault();\n event.stopPropagation();\n const th = (event.target as HTMLElement).closest('th') as HTMLElement | null;\n this.resizeKey = col.key;\n this.resizeStartX = event.clientX;\n this.resizeSign = this.isRtl() ? -1 : 1;\n this.resizeStartW =\n this.colWidths()[col.key] ?? th?.getBoundingClientRect().width ?? this.numericWidth(col);\n this.resizeMin = col.minWidth ?? MIN_COL_WIDTH;\n this.document.addEventListener('pointermove', this.onResizeMove);\n this.document.addEventListener('pointerup', this.onResizeEnd);\n this.document.addEventListener('pointercancel', this.onResizeEnd);\n }\n\n /** rAF-coalesced: at most one width write (and CD pass) per frame. */\n private readonly onResizeMove = (event: PointerEvent): void => {\n if (!this.resizeKey) return;\n this.pendingResizeX = event.clientX;\n if (this.resizeRaf != null) return;\n this.resizeRaf = this.document.defaultView?.requestAnimationFrame(() => {\n this.resizeRaf = null;\n this.applyPendingResize();\n }) ?? null;\n };\n\n private applyPendingResize(): void {\n if (!this.resizeKey) return;\n const width = Math.max(\n this.resizeMin,\n Math.round(\n this.resizeStartW +\n this.resizeSign * (this.pendingResizeX - this.resizeStartX),\n ),\n );\n this.colWidths.update((w) => ({ ...w, [this.resizeKey as string]: width }));\n }\n\n private readonly onResizeEnd = (): void => {\n if (this.resizeRaf != null) {\n // Flush (don't drop) the last pending move so a fast drag lands exactly.\n this.document.defaultView?.cancelAnimationFrame(this.resizeRaf);\n this.resizeRaf = null;\n this.applyPendingResize();\n }\n if (this.resizeKey) {\n const col = this.columns().find((c) => c.key === this.resizeKey);\n const width =\n this.colWidths()[this.resizeKey] ?? Math.round(this.resizeStartW);\n this.columnResize.emit({ key: this.resizeKey, width });\n if (col) this.announcer.announce(this.i18n.columnWidth(col.header, width));\n }\n this.resizeKey = null;\n this.document.removeEventListener('pointermove', this.onResizeMove);\n this.document.removeEventListener('pointerup', this.onResizeEnd);\n this.document.removeEventListener('pointercancel', this.onResizeEnd);\n };\n\n /** Keyboard column resize on the focused separator (APG window splitter). */\n protected onResizeKeydown(event: KeyboardEvent, col: MkTableColumn<T>): void {\n if (!this.resizableColumns() || !col.resizable) return;\n const step = event.shiftKey ? 1 : 10;\n let delta = 0;\n if (event.key === 'ArrowLeft') delta = -step;\n else if (event.key === 'ArrowRight') delta = step;\n else return;\n // Mirror in RTL so pressing toward the inline-end always grows the column.\n if (this.isRtl()) delta = -delta;\n event.preventDefault();\n event.stopPropagation();\n const min = col.minWidth ?? MIN_COL_WIDTH;\n const th = (event.target as HTMLElement).closest('th');\n const current =\n this.colWidths()[col.key] ??\n th?.getBoundingClientRect().width ??\n this.numericWidth(col);\n const width = Math.max(min, Math.round(current + delta));\n this.colWidths.update((w) => ({ ...w, [col.key]: width }));\n this.columnResize.emit({ key: col.key, width });\n this.announcer.announce(this.i18n.columnWidth(col.header, width));\n }\n\n /** The current width of a column, for the separator's aria-valuenow. */\n protected resizeValueNow(col: MkTableColumn<T>): number {\n return Math.round(this.colWidths()[col.key] ?? this.numericWidth(col));\n }\n\n /** The resize floor for a column, for the separator's aria-valuemin. */\n protected resizeValueMin(col: MkTableColumn<T>): number {\n return col.minWidth ?? MIN_COL_WIDTH;\n }\n\n /** Advertised resize ceiling (aria-valuemax) — a sane constant bound. */\n protected readonly resizeValueMax = MAX_COL_WIDTH;\n\n ngOnDestroy(): void {\n if (this.resizeRaf != null) {\n this.document.defaultView?.cancelAnimationFrame(this.resizeRaf);\n this.resizeRaf = null;\n }\n this.document.removeEventListener('pointermove', this.onResizeMove);\n this.document.removeEventListener('pointerup', this.onResizeEnd);\n this.document.removeEventListener('pointercancel', this.onResizeEnd);\n }\n\n // --- Column reorder (native drag) -----------------------------------------\n protected readonly dragKey = signal<string | null>(null);\n\n protected onColDragStart(event: DragEvent, col: MkTableColumn<T>): void {\n if (!this.reorderableColumns()) return;\n this.dragKey.set(col.key);\n event.dataTransfer?.setData('text/plain', col.key);\n if (event.dataTransfer) event.dataTransfer.effectAllowed = 'move';\n }\n\n protected onColDragOver(event: DragEvent): void {\n if (this.reorderableColumns() && this.dragKey()) event.preventDefault();\n }\n\n protected onColDrop(event: DragEvent, target: MkTableColumn<T>): void {\n const from = this.dragKey();\n this.dragKey.set(null);\n if (!from || from === target.key) return;\n event.preventDefault();\n const order = this.orderedColumns().map((c) => c.key);\n const toIdx = order.indexOf(target.key);\n this.moveColumn(from, toIdx);\n }\n\n protected onColDragEnd(): void {\n this.dragKey.set(null);\n }\n\n /** Move a column to `toIdx` in the display order and announce it. */\n private moveColumn(key: string, toIdx: number): void {\n const order = this.orderedColumns().map((c) => c.key);\n const fromIdx = order.indexOf(key);\n if (fromIdx < 0 || toIdx < 0 || toIdx >= order.length || fromIdx === toIdx) {\n return;\n }\n order.splice(toIdx, 0, order.splice(fromIdx, 1)[0]);\n this.colOrder.set(order);\n this.columnReorder.emit(order);\n const col = this.columns().find((c) => c.key === key);\n if (col) {\n this.announcer.announce(\n this.i18n.columnMoved(col.header, toIdx + 1, order.length),\n );\n }\n }\n\n /** Keyboard column reorder: Alt+Arrow moves the focused header. */\n protected onReorderKeydown(event: KeyboardEvent, col: MkTableColumn<T>): void {\n if (!this.reorderableColumns() || col.pinned || !event.altKey) return;\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n // Swallow the combo even when the move is a no-op (first column moved\n // further left, last moved right) — otherwise Alt+Arrow falls through to\n // the browser's history Back/Forward and navigates away from the grid.\n event.preventDefault();\n const order = this.orderedColumns().map((c) => c.key);\n const idx = order.indexOf(col.key);\n if (event.key === 'ArrowLeft' && idx > 0) {\n this.moveColumn(col.key, idx - 1);\n } else if (event.key === 'ArrowRight' && idx < order.length - 1) {\n this.moveColumn(col.key, idx + 1);\n }\n }\n\n // --- Inline cell edit -----------------------------------------------------\n protected isEditing(index: number, col: MkTableColumn<T>): boolean {\n const e = this.editing();\n return !!e && e.index === index && e.key === col.key;\n }\n\n /** The cell element being edited, so focus can be restored after. */\n private editingCell: HTMLElement | null = null;\n\n /** The inline-edit input, focused once it renders. */\n private readonly editInput =\n viewChild<ElementRef<HTMLInputElement>>('editInput');\n\n protected startEdit(index: number, col: MkTableColumn<T>, event?: Event): void {\n if (!col.editable) return;\n event?.stopPropagation();\n this.editingCell =\n ((event?.target as HTMLElement | null)?.closest('td') as HTMLElement | null) ??\n null;\n this.editing.set({ index, key: col.key });\n // Explicit focus once the input exists — a dynamically inserted\n // `autofocus` attribute is not honoured after initial page load.\n afterNextRender(() => this.editInput()?.nativeElement.focus(), {\n injector: this.injector,\n });\n }\n\n /** Keyboard path into edit mode (Enter / F2 on a focused editable cell). */\n protected onCellKeydown(\n event: KeyboardEvent,\n index: number,\n col: MkTableColumn<T>,\n ): void {\n if (!col.editable || this.isEditing(index, col)) return;\n if (event.key === 'Enter' || event.key === 'F2') {\n event.preventDefault();\n event.stopPropagation();\n this.startEdit(index, col, event);\n }\n }\n\n protected commitEdit(\n row: T,\n col: MkTableColumn<T>,\n value: string,\n restoreFocus = false,\n ): void {\n this.editing.set(null);\n this.cellEdit.emit({ row, key: col.key, value });\n this.announcer.announce(this.i18n.cellSaved(value));\n if (restoreFocus) this.editingCell?.focus();\n this.editingCell = null;\n }\n\n protected cancelEdit(restoreFocus = false): void {\n this.editing.set(null);\n if (restoreFocus) this.editingCell?.focus();\n this.editingCell = null;\n }\n\n protected onEditKeydown(\n event: KeyboardEvent,\n row: T,\n col: MkTableColumn<T>,\n ): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.commitEdit(row, col, (event.target as HTMLInputElement).value, true);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.cancelEdit(true);\n }\n }\n\n /** The projected row-detail template (enable via `expandable`). */\n protected readonly rowDetail = contentChild(MkTableRowDetail);\n\n /** Per-column cell templates, projected as `<ng-template mkTableCell=\"key\">`. */\n private readonly cellTemplates = contentChildren(MkTableCell);\n private readonly cellTemplateByKey = computed(() => {\n const map = new Map<string, MkTableCell>();\n for (const t of this.cellTemplates()) map.set(t.mkTableCell(), t);\n return map;\n });\n\n /** The template registered for a column, or null to fall back to text. */\n protected cellTemplateFor(key: string) {\n return this.cellTemplateByKey().get(key)?.template ?? null;\n }\n\n private readonly sortKey = signal<string | null>(null);\n private readonly sortDir = signal<Exclude<MkSortDirection, 'none'> | null>(\n null,\n );\n /** Stable id prefix so each detail row can be referenced by aria-controls. */\n private readonly detailIdBase = mkUniqueId('mk-table-detail');\n\n /** Total rendered columns, including the select and expander columns. */\n protected readonly totalColumns = computed(\n () =>\n this.columns().length +\n (this.selectable() ? 1 : 0) +\n (this.expandable() ? 1 : 0),\n );\n\n /**\n * Shared locale-sensitive collator for string sorting. `localeCompare`\n * re-resolves locale data on every call; one cached `Intl.Collator` makes\n * large-table sorts several-fold faster with the same default-locale order.\n */\n /** Data sorted by the active column, or the input order when unsorted. */\n protected readonly sortedData = computed<T[]>(() =>\n this.sortRows(this.filteredData()),\n );\n\n // --- Filtering ---------------------------------------------------------------\n /** The filter control a column renders, or `null` for none. */\n protected filterKind(col: MkTableColumn<T>): MkTableFilterKind | null {\n if (col.filter === false) return null;\n return col.filter ?? 'text';\n }\n\n /** One predicate per active filter, or `null` when nothing is filtered. */\n private readonly rowPredicate = computed<((row: T) => boolean) | null>(() => {\n if (!this.clientFilter()) return null;\n const filters = this.filters();\n const tests: ((row: T) => boolean)[] = [];\n for (const col of this.columns()) {\n const value = filters[col.key];\n if (col.filter === false || isEmptyFilter(value)) continue;\n tests.push(this.columnTest(col, value));\n }\n if (!tests.length) return null;\n return (row) => tests.every((test) => test(row));\n });\n\n /** Build the predicate for one column's filter value. */\n private columnTest(col: MkTableColumn<T>, value: unknown): (row: T) => boolean {\n const raw = (row: T): unknown => (row as Record<string, unknown>)[col.key];\n switch (col.filter) {\n case 'select': {\n const wanted = String(value);\n return (row) => String(raw(row) ?? '') === wanted;\n }\n case 'number': {\n const [lo, hi] = isFilterRange(value) ? [value.min, value.max] : [value, null];\n const min = isEmptyFilter(lo) ? null : Number(lo);\n const max = isEmptyFilter(hi) ? null : Number(hi);\n return (row) => {\n const v = raw(row);\n const n = typeof v === 'number' ? v : Number(v);\n if (v == null || v === '' || Number.isNaN(n)) return false;\n return (min == null || n >= min) && (max == null || n <= max);\n };\n }\n case 'date': {\n const [lo, hi] = isFilterRange(value) ? [value.min, value.max] : [value, null];\n const min = dayKey(lo);\n const max = dayKey(hi);\n return (row) => {\n const day = dayKey(raw(row));\n if (!day) return false;\n return (!min || day >= min) && (!max || day <= max);\n };\n }\n default: {\n const needle = String(value).trim().toLowerCase();\n if (!needle) return () => true;\n return (row) => this.cellText(row, col).toLowerCase().includes(needle);\n }\n }\n }\n\n /**\n * Tree mode: which rows survive the filters — a row is kept when it matches\n * or any descendant does, so a matching child keeps its parents.\n */\n private readonly treeKeep = computed<Map<T, boolean>>(() => {\n const keep = this.rowPredicate();\n const map = new Map<T, boolean>();\n if (!keep || !this.childrenKey()) return map;\n const walk = (row: T): boolean => {\n let any = keep(row);\n for (const child of this.childrenOf(row)) if (walk(child)) any = true;\n map.set(row, any);\n return any;\n };\n for (const row of this.data()) walk(row);\n return map;\n });\n\n /** The input rows with the active filters applied (input order). */\n private readonly filteredData = computed<T[]>(() => {\n const keep = this.rowPredicate();\n const data = this.data();\n if (!keep) return data;\n if (!this.childrenKey()) return data.filter(keep);\n const kept = this.treeKeep();\n return data.filter((row) => kept.get(row) === true);\n });\n\n /** The child rows of `row` that survive the filters (tree mode). */\n private visibleChildrenOf(row: T): T[] {\n const children = this.childrenOf(row);\n if (!children.length || !this.rowPredicate()) return children;\n const kept = this.treeKeep();\n return children.filter((child) => kept.get(child) === true);\n }\n\n /** Options of every `select` filter, keyed by column (derived when unset). */\n private readonly selectOptions = computed<Map<string, MkTableFilterOption[]>>(() => {\n const map = new Map<string, MkTableFilterOption[]>();\n for (const col of this.columns()) {\n if (col.filter !== 'select') continue;\n if (col.filterOptions) {\n map.set(\n col.key,\n col.filterOptions.map((o) =>\n typeof o === 'object' ? o : { value: o, label: String(o) },\n ),\n );\n continue;\n }\n const seen = new Map<string, unknown>();\n const walk = (rows: T[]): void => {\n for (const row of rows) {\n const v = (row as Record<string, unknown>)[col.key];\n if (v != null && v !== '') seen.set(String(v), v);\n walk(this.childrenOf(row));\n }\n };\n walk(this.data());\n map.set(\n col.key,\n [...seen.entries()]\n .sort(([a], [b]) => sortCollator().compare(a, b))\n .map(([label, value]) => ({ value, label })),\n );\n }\n return map;\n });\n\n /** The options a column's select filter offers. */\n protected filterOptionsFor(col: MkTableColumn<T>): MkTableFilterOption[] {\n return this.selectOptions().get(col.key) ?? [];\n }\n\n /** Whether `option` is the column's current select-filter value. */\n protected isFilterOption(col: MkTableColumn<T>, option: MkTableFilterOption): boolean {\n const v = this.filters()[col.key];\n return !isEmptyFilter(v) && String(v) === String(option.value);\n }\n\n /** Whether a column has an active filter. */\n protected hasFilter(key: string): boolean {\n return !isEmptyFilter(this.filters()[key]);\n }\n\n /** The text a column's filter box shows (a range shows its lower bound). */\n protected filterText(key: string): string {\n const v = this.filters()[key];\n if (isEmptyFilter(v)) return '';\n const shown = isFilterRange(v) ? v.min : v;\n if (shown instanceof Date) return dayKey(shown) ?? '';\n return shown == null ? '' : String(shown);\n }\n\n /** Accessible name of a column's filter control. */\n protected filterLabel(col: MkTableColumn<T>): string {\n return this.i18n.filterColumn(col.header || col.key);\n }\n\n /** Placeholder of a column's filter control. */\n protected filterPlaceholder(col: MkTableColumn<T>): string {\n if (col.filterPlaceholder != null) return col.filterPlaceholder;\n return this.filterKind(col) === 'text' ? this.i18n.filter : this.i18n.filterMin;\n }\n\n /**\n * Set one column's filter (`null` / `''` clears it). Updates\n * {@link filters} and emits `filtersChange`; a no-op when unchanged.\n */\n setFilter(key: string, value: unknown): void {\n const current = this.filters();\n const empty = isEmptyFilter(value);\n if (empty ? !(key in current) : Object.is(current[key], value)) return;\n const next = { ...current };\n if (empty) delete next[key];\n else next[key] = value;\n this.filters.set(next);\n }\n\n /** Clear one column's filter. */\n clearFilter(key: string): void {\n this.setFilter(key, null);\n }\n\n /** Clear every filter. */\n clearFilters(): void {\n if (Object.keys(this.filters()).length) this.filters.set({});\n }\n\n /** Text / number / date filter box input. */\n protected onFilterInput(col: MkTableColumn<T>, event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n if (col.filter === 'number') {\n const n = text === '' ? NaN : Number(text);\n this.setFilter(col.key, Number.isNaN(n) ? null : n);\n } else {\n this.setFilter(col.key, text);\n }\n }\n\n /** Select filter change: map the option string back to its original value. */\n protected onFilterSelect(col: MkTableColumn<T>, event: Event): void {\n const chosen = (event.target as HTMLSelectElement).value;\n const option = this.filterOptionsFor(col).find((o) => String(o.value) === chosen);\n this.setFilter(col.key, chosen === '' || !option ? null : option.value);\n }\n\n /** Escape in a filter box clears that filter (and stays in the box). */\n protected onFilterKeydown(col: MkTableColumn<T>, event: KeyboardEvent): void {\n if (event.key !== 'Escape' || !this.hasFilter(col.key)) return;\n event.preventDefault();\n event.stopPropagation();\n this.clearFilter(col.key);\n }\n\n /** Header rows above the body (for `aria-rowindex`). */\n protected readonly headerRows = computed(\n () => 1 + (this.filterable() && !this.stacked() ? 1 : 0),\n );\n\n /** Sort one sibling group by the active column (input order when unsorted). */\n private sortRows(rows: T[]): T[] {\n const key = this.sortKey();\n const dir = this.sortDir();\n if (!key || !dir) return rows;\n const compare = (a: T, b: T): number => {\n const av = (a as Record<string, unknown>)[key];\n const bv = (b as Record<string, unknown>)[key];\n if (av == null && bv == null) return 0;\n if (av == null) return -1;\n if (bv == null) return 1;\n if (typeof av === 'number' && typeof bv === 'number') return av - bv;\n return sortCollator().compare(String(av), String(bv));\n };\n // Negate the comparator for desc (instead of reversing) so the sort stays\n // stable and null ordering is consistent in both directions.\n return [...rows].sort(dir === 'desc' ? (a, b) => -compare(a, b) : compare);\n }\n\n /** `aria-sort` value for a header cell. */\n protected ariaSort(col: MkTableColumn<T>): string | null {\n if (!col.sortable) return null;\n if (this.sortKey() !== col.key) return 'none';\n return this.sortDir() === 'asc' ? 'ascending' : 'descending';\n }\n\n /** Glyph indicating a column's sort state. */\n protected sortGlyph(col: MkTableColumn<T>): string {\n if (this.sortKey() !== col.key) return '↕';\n return this.sortDir() === 'asc' ? '↑' : '↓';\n }\n\n /** Raw cell value, handed to an `[mkTableCell]` template unformatted. */\n protected cellValue(row: T, col: MkTableColumn<T>): unknown {\n return (row as Record<string, unknown>)[col.key];\n }\n\n /** Rendered text for a cell, applying the column formatter if present. */\n protected cellText(row: T, col: MkTableColumn<T>): string {\n const raw = (row as Record<string, unknown>)[col.key];\n if (col.format) return col.format(raw, row);\n return raw == null ? '' : String(raw);\n }\n\n protected onSort(col: MkTableColumn<T>): void {\n if (!col.sortable) return;\n let direction: MkSortDirection;\n if (this.sortKey() !== col.key) {\n this.sortKey.set(col.key);\n this.sortDir.set('asc');\n direction = 'asc';\n } else if (this.sortDir() === 'asc') {\n this.sortDir.set('desc');\n direction = 'desc';\n } else {\n // desc -> cleared\n this.sortKey.set(null);\n this.sortDir.set(null);\n direction = 'none';\n }\n this.sortChange.emit({ key: col.key, direction });\n this.announcer.announce(\n direction === 'none'\n ? this.i18n.sortingCleared(col.header)\n : this.i18n.sortedBy(col.header, direction),\n );\n }\n\n protected onRowClick(row: T): void {\n if (this.clickableRows()) this.rowClick.emit(row);\n }\n\n /** Keyboard activation for clickable rows (Enter / Space) and tree keys. */\n protected onRowKeydown(event: KeyboardEvent, row: T): void {\n if (this.onTreeKeydown(event, row)) return;\n if (!this.clickableRows()) return;\n if (event.target !== event.currentTarget) return; // ignore inner controls\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.rowClick.emit(row);\n }\n }\n\n /** Stable row identity for `@for` tracking (trackKey when set, else the row). */\n protected trackRow = (row: T): unknown => this.rowKey(row);\n\n /** Leading cell text used to label per-row controls for screen readers. */\n protected rowLabel(row: T): string {\n const first = this.orderedColumns()[0];\n return first ? this.cellText(row, first) : '';\n }\n\n // --- Selection ------------------------------------------------------------\n private rowKey(row: T): unknown {\n const key = this.trackKey();\n return key ? (row as Record<string, unknown>)[key] : row;\n }\n\n /** Selected row keys as a Set — O(1) membership per cell per CD pass. */\n private readonly selectedKeys = computed<Set<unknown>>(\n () => new Set(this.selected().map((r) => this.rowKey(r))),\n );\n\n /** Whether `row` is currently selected. */\n protected isSelected(row: T): boolean {\n return this.selectedKeys().has(this.rowKey(row));\n }\n\n /**\n * Every data row, in display order, ignoring tree expansion — what\n * \"select all\" and the header checkbox reason about. Equals `sortedData`\n * for flat tables.\n */\n private readonly allRows = computed<T[]>(() => {\n if (!this.childrenKey()) return this.sortedData();\n const out: T[] = [];\n const walk = (rows: T[]): void => {\n for (const row of this.sortRows(rows)) {\n out.push(row);\n walk(this.visibleChildrenOf(row));\n }\n };\n walk(this.filteredData());\n return out;\n });\n\n /** True when every visible row is selected. */\n protected readonly allSelected = computed<boolean>(() => {\n const rows = this.allRows();\n const keys = this.selectedKeys();\n return rows.length > 0 && rows.every((row) => keys.has(this.rowKey(row)));\n });\n\n /** True when some — but not all — visible rows are selected. */\n protected readonly someSelected = computed<boolean>(() => {\n const keys = this.selectedKeys();\n return (\n this.allRows().some((row) => keys.has(this.rowKey(row))) &&\n !this.allSelected()\n );\n });\n\n private commitSelection(next: T[]): void {\n this.selected.set(next);\n this.selectionChange.emit(next);\n }\n\n /** Toggle a single row's selection without triggering `rowClick`. */\n protected toggleRow(row: T): void {\n const rk = this.rowKey(row);\n const current = this.selected();\n const next = this.selectedKeys().has(rk)\n ? current.filter((r) => this.rowKey(r) !== rk)\n : [...current, row];\n this.commitSelection(next);\n }\n\n /** Select or deselect all rows (every tree row, expanded or not). */\n protected toggleAll(): void {\n const rows = this.allRows();\n const current = this.selected();\n if (this.allSelected()) {\n const visible = new Set(rows.map((r) => this.rowKey(r)));\n this.commitSelection(current.filter((r) => !visible.has(this.rowKey(r))));\n } else {\n const has = new Set(current.map((r) => this.rowKey(r)));\n this.commitSelection([\n ...current,\n ...rows.filter((r) => !has.has(this.rowKey(r))),\n ]);\n }\n }\n\n // --- Grouping ---------------------------------------------------------------\n /** Group values currently collapsed. */\n private readonly collapsedGroups = signal<Set<unknown>>(new Set());\n\n /** Rows grouped by {@link groupBy}, or `null` when grouping is off. */\n protected readonly groups = computed<MkTableGroup<T>[] | null>(() => {\n const by = this.groupBy();\n if (by == null) return null;\n const accessor =\n typeof by === 'function'\n ? by\n : (row: T) => (row as Record<string, unknown>)[by];\n const map = new Map<unknown, T[]>();\n for (const row of this.sortedData()) {\n const key = accessor(row);\n const bucket = map.get(key);\n if (bucket) bucket.push(row);\n else map.set(key, [row]);\n }\n const label = this.groupLabel();\n return [...map.entries()].map(([key, rows]) => ({\n key,\n label: label ? label(key, rows) : String(key),\n rows,\n }));\n });\n\n /**\n * The tbody render list: group headers interleaved with their (expanded)\n * rows when grouping is on, else just the sorted rows.\n */\n protected readonly displayItems = computed<MkTableItem<T>[]>(() => {\n const groups = this.groups();\n const items: MkTableItem<T>[] = [];\n if (!groups) {\n this.pushRows(items, this.sortedData(), 0);\n return items;\n }\n const collapsed = this.collapsedGroups();\n for (const group of groups) {\n items.push({ kind: 'group', group });\n if (!collapsed.has(group.key)) this.pushRows(items, group.rows, 0);\n }\n return items;\n });\n\n /**\n * Append `rows` as render items. In tree mode each row is followed by its\n * (sorted) children while it is expanded, one level deeper.\n */\n private pushRows(items: MkTableItem<T>[], rows: T[], depth: number): void {\n const tree = !!this.childrenKey();\n const expandedKeys = this.treeExpanded();\n for (const row of rows) {\n const children = tree ? this.visibleChildrenOf(row) : [];\n const hasChildren = children.length > 0;\n const expanded = hasChildren && expandedKeys.has(this.rowKey(row));\n items.push({ kind: 'row', row, depth, hasChildren, expanded });\n if (expanded) this.pushRows(items, this.sortRows(children), depth + 1);\n }\n }\n\n /** The child rows of `row` (tree mode), or an empty list. */\n private childrenOf(row: T): T[] {\n const key = this.childrenKey();\n if (!key) return [];\n const value = (row as Record<string, unknown>)[key];\n return Array.isArray(value) ? (value as T[]) : [];\n }\n\n // --- Row virtualisation -------------------------------------------------------\n // Own windowing rather than `mk-virtual-scroll` from `@mk-kit/ui/data`: the\n // rows must stay real `<tr>`s inside the one `<table>` (column widths,\n // sticky header, selection, a11y), the window has to know about group and\n // detail rows, and importing the data entry point would drag ~680 KiB of\n // unrelated components into every table consumer's dependency graph.\n\n /** The scroll box around the table. */\n private readonly scroller = viewChild<ElementRef<HTMLElement>>('scroller');\n\n /** Virtual mode in force (cards always render in full). */\n protected readonly isVirtual = computed(() => this.virtual() && !this.stacked());\n\n /** Current scroll offset of the scroll box (virtual mode). */\n private readonly scrollTop = signal(0);\n /** Measured height of the scroll box (0 until measured / on the server). */\n private readonly viewportHeight = signal(0);\n /** Measured height of the thead — the sticky header hides that much of the top. */\n private readonly headHeight = signal(0);\n /** Row height read back from the first rendered row. */\n private readonly measuredRowHeight = signal<number | null>(null);\n /** Measured heights of expanded detail rows, by row key. */\n private readonly detailHeights = signal<Map<unknown, number>>(new Map());\n\n /** The row height virtual mode lays rows out with. */\n protected readonly effectiveRowHeight = computed(\n () => this.rowHeight() ?? this.measuredRowHeight() ?? DEFAULT_ROW_HEIGHT,\n );\n\n private cssLength(v: string | number | null): string | null {\n if (v == null || v === '') return null;\n return typeof v === 'number' ? `${v}px` : v;\n }\n\n /** `height` of the scroll box. */\n protected readonly scrollHeight = computed(() => this.cssLength(this.height()));\n /** `max-height` of the scroll box (60vh in virtual mode with no size given). */\n protected readonly scrollMaxHeight = computed(() => {\n const max = this.cssLength(this.maxHeight());\n if (max) return max;\n return this.isVirtual() && this.height() == null ? '60vh' : null;\n });\n\n /**\n * Top offset of every display item, or `null` while every item is exactly\n * one row tall (the common case — then offsets are plain multiplication).\n * Only expanded detail rows make heights vary.\n */\n private readonly itemOffsets = computed<Float64Array | null>(() => {\n if (!this.isVirtual() || !this.expandable() || !this.rowDetail()) return null;\n const expanded = this.expandedKeys();\n if (!expanded.size) return null;\n const items = this.displayItems();\n const rh = this.effectiveRowHeight();\n const details = this.detailHeights();\n const offsets = new Float64Array(items.length + 1);\n let y = 0;\n for (let i = 0; i < items.length; i++) {\n offsets[i] = y;\n y += rh;\n const item = items[i];\n if (item.kind === 'row') {\n const key = this.rowKey(item.row);\n if (expanded.has(key)) y += details.get(key) ?? rh;\n }\n }\n offsets[items.length] = y;\n return offsets;\n });\n\n /** Full height of the body, spacers included. */\n private readonly totalHeight = computed(() => {\n const offsets = this.itemOffsets();\n if (offsets) return offsets[offsets.length - 1];\n return this.displayItems().length * this.effectiveRowHeight();\n });\n\n /** Top offset (px) of display item `index`. */\n private offsetOf(index: number): number {\n const offsets = this.itemOffsets();\n return offsets\n ? offsets[Math.min(index, offsets.length - 1)]\n : index * this.effectiveRowHeight();\n }\n\n /** Index of the display item covering the body offset `y`. */\n private indexAt(y: number): number {\n const count = this.displayItems().length;\n if (count === 0) return 0;\n const offsets = this.itemOffsets();\n if (!offsets) {\n return Math.min(count - 1, Math.max(0, Math.floor(y / this.effectiveRowHeight())));\n }\n let lo = 0;\n let hi = count - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (offsets[mid] <= y) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n }\n\n /** The `[start, end)` slice of display items currently rendered. */\n protected readonly windowRange = computed<{ start: number; end: number }>(\n () => {\n const count = this.displayItems().length;\n if (!this.isVirtual()) return { start: 0, end: count };\n const over = Math.max(0, this.overscan());\n const vh = this.viewportHeight();\n const top = Math.max(0, this.scrollTop() - this.headHeight());\n const first = this.indexAt(top);\n const last = vh > 0 ? this.indexAt(top + vh) : first + UNMEASURED_VIEWPORT_ROWS;\n return {\n start: Math.max(0, first - over),\n end: Math.min(count, last + 1 + over),\n };\n },\n { equal: (a, b) => a.start === b.start && a.end === b.end },\n );\n\n /** Display index of the first rendered item. */\n protected readonly windowStart = computed(() => this.windowRange().start);\n\n /** The items the tbody renders: the window in virtual mode, else all. */\n protected readonly renderedItems = computed<MkTableItem<T>[]>(() => {\n const items = this.displayItems();\n if (!this.isVirtual()) return items;\n const { start, end } = this.windowRange();\n return items.slice(start, end);\n });\n\n /** Height (px) of the spacer above the window. */\n protected readonly topSpace = computed(() =>\n this.isVirtual() ? this.offsetOf(this.windowRange().start) : 0,\n );\n /** Height (px) of the spacer below the window. */\n protected readonly bottomSpace = computed(() =>\n this.isVirtual()\n ? Math.max(0, this.totalHeight() - this.offsetOf(this.windowRange().end))\n : 0,\n );\n\n /** Scroll box scrolled: move the window. */\n protected onScroll(event: Event): void {\n if (!this.isVirtual()) return;\n this.scrollTop.set((event.target as HTMLElement).scrollTop);\n }\n\n /**\n * Read the viewport, thead, first-row and detail-row heights back from the\n * DOM. Heights are accepted only when they move by more than a pixel:\n * collapsed table borders make the same row measure 44 or 44.5 depending\n * on where it sits, and letting that flip the row height would shift a\n * 10,000-row body by thousands of pixels on every window change. A density\n * change (44 → 36 or 52) still gets through.\n */\n private measureViewport(el: HTMLElement): void {\n const settled = (next: number, current: number | null): boolean =>\n current != null && Math.abs(next - current) <= 1;\n const vh = el.clientHeight;\n if (vh > 0 && vh !== this.viewportHeight()) this.viewportHeight.set(vh);\n const thead = el.querySelector('thead');\n const hh = thead ? thead.getBoundingClientRect().height : 0;\n if (!settled(hh, this.headHeight())) this.headHeight.set(hh);\n if (this.rowHeight() == null) {\n const row = el.querySelector('tr.mk-table__row:not(.mk-table__row--empty)');\n const rh = row ? row.getBoundingClientRect().height : 0;\n if (rh > 0 && !settled(rh, this.measuredRowHeight())) this.measuredRowHeight.set(rh);\n }\n if (!this.expandable()) return;\n const items = this.displayItems();\n let next: Map<unknown, number> | null = null;\n for (const detail of el.querySelectorAll<HTMLElement>('tr.mk-table__detail-row')) {\n const index = Number(detail.dataset['index']);\n const item = items[index];\n if (!item || item.kind !== 'row') continue;\n const h = detail.getBoundingClientRect().height;\n if (!(h > 0)) continue;\n const key = this.rowKey(item.row);\n if (settled(h, this.detailHeights().get(key) ?? null)) continue;\n next ??= new Map(this.detailHeights());\n next.set(key, h);\n }\n if (next) this.detailHeights.set(next);\n }\n\n /**\n * Scroll a row into view. A number is the row's **display index** — its\n * position among the rendered rows, group headers included, after sorting,\n * filtering and tree expansion; anything else is a row key (the `trackKey`\n * value, or the row object when there is none). Pass `'key'` to look a\n * numeric key up. Returns `false` when the row is not currently displayed\n * (filtered out, under a collapsed parent or group).\n *\n * In virtual mode the row lands at the top of the viewport, just under the\n * header; otherwise it is scrolled to the nearest edge.\n */\n scrollToRow(\n target: unknown,\n by: 'index' | 'key' = typeof target === 'number' ? 'index' : 'key',\n ): boolean {\n const items = this.displayItems();\n const index =\n by === 'index'\n ? (target as number)\n : items.findIndex((it) => it.kind === 'row' && this.rowKey(it.row) === target);\n if (!Number.isInteger(index) || index < 0 || index >= items.length) return false;\n const el = this.scroller()?.nativeElement;\n if (!el) return false;\n if (this.isVirtual()) {\n const vh = this.viewportHeight();\n const max = vh > 0 ? Math.max(0, this.totalHeight() + this.headHeight() - vh) : Infinity;\n const top = Math.min(this.offsetOf(index), max);\n el.scrollTop = top;\n this.scrollTop.set(top);\n } else {\n const row = el.querySelector<HTMLElement>(`tbody > tr[data-index=\"${index}\"]`);\n row?.scrollIntoView?.({ block: 'nearest' });\n }\n return true;\n }\n\n // --- Tree rows ------------------------------------------------------------\n /** Keys of parent rows whose children are shown. */\n private readonly treeExpanded = signal<Set<unknown>>(new Set());\n\n /** Whether a parent row's children are currently shown (tree mode). */\n isTreeExpanded(row: T): boolean {\n return this.treeExpanded().has(this.rowKey(row));\n }\n\n /** Show or hide a parent row's children (tree mode). */\n toggleTreeRow(row: T, event?: Event): void {\n event?.stopPropagation();\n if (this.childrenOf(row).length === 0) return;\n this.setTreeExpanded(row, !this.isTreeExpanded(row));\n }\n\n /** Expand every parent row (tree mode). */\n expandAllRows(): void {\n const keys = new Set<unknown>();\n const walk = (rows: T[]): void => {\n for (const row of rows) {\n const children = this.childrenOf(row);\n if (children.length) {\n keys.add(this.rowKey(row));\n walk(children);\n }\n }\n };\n walk(this.data());\n this.treeExpanded.set(keys);\n }\n\n /** Collapse every parent row (tree mode). */\n collapseAllRows(): void {\n this.treeExpanded.set(new Set());\n }\n\n // --- Export -----------------------------------------------------------------\n /**\n * The rows and columns an export writes — exactly what {@link exportCsv}\n * serialises, for other formats (XLSX, PDF, the clipboard, …): rows in\n * display order with the current sort and header {@link filters} applied\n * (every matching row, never just the virtual window) and tree children\n * (`childrenKey`) flattened under their parent whether or not they are\n * expanded, optionally only the selected ones; columns in the table's\n * current order, restricted to `options.columns` when given, each carrying\n * its header and `format` so what the user saw is what gets written.\n *\n * ```ts\n * const { rows, columns } = table.getExportRows({ selectedOnly: true });\n * const sheet = rows.map((row) =>\n * Object.fromEntries(columns.map((c) => [c.header ?? c.key, c.format ? c.format(row[c.key], row) : row[c.key]])),\n * );\n * ```\n */\n getExportRows(options: MkTableExportRowsOptions = {}): MkTableExportRows<T> {\n let rows = this.allRows();\n if (options.selectedOnly) {\n const keys = this.selectedKeys();\n rows = rows.filter((r) => keys.has(this.rowKey(r)));\n }\n const only = options.columns ? new Set(options.columns) : null;\n const columns = this.orderedColumns()\n .filter((c) => !only || only.has(c.key))\n .map((c) => ({ key: c.key, header: c.header, format: c.format }));\n return { rows, columns };\n }\n\n /**\n * The table's rows as CSV: current column order, column formatters applied,\n * sorted and filtered the way they are shown, tree children flattened under\n * their parent whether or not they are expanded. Downloads the file (default name\n * `table.csv`) and returns the text. Built on {@link getExportRows}.\n */\n exportCsv(options: MkTableExportOptions = {}): string {\n const { rows, columns } = this.getExportRows(options);\n // The rows are already flat, so no childrenKey is passed through.\n const csv = mkToCsv(rows, columns, { ...options, childrenKey: undefined });\n if (options.download !== false) {\n let filename = options.filename ?? 'table.csv';\n if (!/\\.csv$/i.test(filename)) filename += '.csv';\n mkDownloadText(csv, filename);\n }\n return csv;\n }\n\n private setTreeExpanded(row: T, expanded: boolean): void {\n const rk = this.rowKey(row);\n if (this.treeExpanded().has(rk) === expanded) return;\n const next = new Set(this.treeExpanded());\n if (expanded) next.add(rk);\n else next.delete(rk);\n this.treeExpanded.set(next);\n this.treeToggle.emit({ row, expanded });\n }\n\n /**\n * ArrowRight opens and ArrowLeft closes a parent row's children (swapped in\n * RTL). Handled for keys pressed on the row itself or on its tree toggle.\n */\n protected onTreeKeydown(event: KeyboardEvent, row: T): boolean {\n if (!this.childrenKey() || this.childrenOf(row).length === 0) return false;\n const rtl = this.document.defaultView?.getComputedStyle(this.host.nativeElement).direction === 'rtl';\n const openKey = rtl ? 'ArrowLeft' : 'ArrowRight';\n const closeKey = rtl ? 'ArrowRight' : 'ArrowLeft';\n if (event.key === openKey && !this.isTreeExpanded(row)) {\n event.preventDefault();\n this.setTreeExpanded(row, true);\n return true;\n }\n if (event.key === closeKey && this.isTreeExpanded(row)) {\n event.preventDefault();\n this.setTreeExpanded(row, false);\n return true;\n }\n return false;\n }\n\n /** `@for` identity: group headers by value, rows by {@link trackRow}. */\n protected trackItem = (item: MkTableItem<T>): unknown =>\n item.kind === 'group' ? `mk-group:${String(item.group.key)}` : this.rowKey(item.row);\n\n /** Whether a group is currently collapsed. */\n protected isGroupCollapsed(key: unknown): boolean {\n return this.collapsedGroups().has(key);\n }\n\n /** Collapse or expand a group header. */\n protected onGroupToggle(group: MkTableGroup<T>): void {\n const next = new Set(this.collapsedGroups());\n const collapsed = !next.has(group.key);\n if (collapsed) next.add(group.key);\n else next.delete(group.key);\n this.collapsedGroups.set(next);\n this.groupToggle.emit({ key: group.key, collapsed });\n }\n\n /** Collapse every group. */\n collapseAllGroups(): void {\n const groups = this.groups();\n if (groups) this.collapsedGroups.set(new Set(groups.map((g) => g.key)));\n }\n\n /** Expand every group. */\n expandAllGroups(): void {\n this.collapsedGroups.set(new Set());\n }\n\n // --- Expansion ------------------------------------------------------------\n private readonly expandedKeys = signal<Set<unknown>>(new Set());\n\n /** Whether `row`'s detail panel is currently expanded. */\n protected isExpanded(row: T): boolean {\n return this.expandedKeys().has(this.rowKey(row));\n }\n\n /** The DOM id of a row's detail panel (for `aria-controls`). */\n protected detailId(index: number): string {\n return `${this.detailIdBase}-${index}`;\n }\n\n /** Toggle a row's detail panel, honouring `singleExpand`. */\n protected toggleExpand(row: T, event?: Event): void {\n event?.stopPropagation();\n const rk = this.rowKey(row);\n const open = this.expandedKeys().has(rk);\n const next = this.singleExpand() ? new Set<unknown>() : new Set(this.expandedKeys());\n if (open) next.delete(rk);\n else next.add(rk);\n this.expandedKeys.set(next);\n this.expandedChange.emit(\n this.data().filter((r) => next.has(this.rowKey(r))),\n );\n }\n}\n","<div\n #scroller\n class=\"mk-table__scroll\"\n [style.height]=\"scrollHeight()\"\n [style.max-height]=\"scrollMaxHeight()\"\n [attr.data-row-height]=\"isVirtual() ? effectiveRowHeight() : null\"\n (scroll)=\"onScroll($event)\"\n>\n <!-- Explicit roles ONLY while stacked: `display: block` strips a table\n element of its implicit role, so without these a card layout stops\n being announced as tabular data at all. Redundant in the grid, so\n they are left off there rather than duplicating what the element\n already says. -->\n <table\n class=\"mk-table__table\"\n [attr.role]=\"childrenKey() ? 'treegrid' : stacked() ? 'table' : null\"\n [attr.aria-rowcount]=\"isVirtual() ? displayItems().length + headerRows() : null\"\n >\n <thead class=\"mk-table__head\" [attr.role]=\"stacked() ? 'rowgroup' : null\">\n <tr>\n @if (expandable()) {\n <th scope=\"col\" class=\"mk-table__th mk-table__th--expand\">\n <span class=\"mk-visually-hidden\">{{ i18n.expandHeader }}</span>\n </th>\n }\n @if (selectable()) {\n <th scope=\"col\" class=\"mk-table__th mk-table__th--select\">\n <mk-checkbox\n [aria-label]=\"i18n.selectAllRows\"\n [checked]=\"allSelected()\"\n [indeterminate]=\"someSelected()\"\n (checkedChange)=\"toggleAll()\"\n />\n </th>\n }\n @for (col of orderedColumns(); track col.key) {\n <th\n scope=\"col\"\n class=\"mk-table__th\"\n [class.mk-table__th--sortable]=\"col.sortable\"\n [class.mk-table__th--pinned]=\"col.pinned\"\n [class.mk-table__th--pinned-right]=\"col.pinned === 'right'\"\n [class.mk-table__th--dragging]=\"dragKey() === col.key\"\n [style.width]=\"colStyleWidth(col)\"\n [style.inset-inline-start.px]=\"col.pinned === 'left' ? pinnedOffset(col) : null\"\n [style.inset-inline-end.px]=\"col.pinned === 'right' ? pinnedOffset(col) : null\"\n [attr.data-align]=\"col.align ?? 'start'\"\n [attr.aria-sort]=\"ariaSort(col)\"\n [attr.draggable]=\"reorderableColumns() && !col.pinned ? true : null\"\n (dragstart)=\"onColDragStart($event, col)\"\n (dragover)=\"onColDragOver($event)\"\n (drop)=\"onColDrop($event, col)\"\n (dragend)=\"onColDragEnd()\"\n >\n @if (col.sortable || (reorderableColumns() && !col.pinned)) {\n <button\n type=\"button\"\n class=\"mk-table__th-button\"\n [class.mk-table__th-button--static]=\"!col.sortable\"\n (click)=\"onSort(col)\"\n (keydown)=\"onReorderKeydown($event, col)\"\n >\n <span class=\"mk-table__th-label\">{{ col.header }}</span>\n @if (col.sortable) {\n <span class=\"mk-table__sort\" aria-hidden=\"true\">{{ sortGlyph(col) }}</span>\n }\n </button>\n } @else {\n <span class=\"mk-table__th-inner\">\n <span class=\"mk-table__th-label\">{{ col.header }}</span>\n </span>\n }\n @if (resizableColumns() && col.resizable) {\n <span\n class=\"mk-table__resize\"\n role=\"separator\"\n tabindex=\"0\"\n aria-orientation=\"vertical\"\n [attr.aria-label]=\"i18n.resizeColumn\"\n [attr.aria-valuemin]=\"resizeValueMin(col)\"\n [attr.aria-valuenow]=\"resizeValueNow(col)\"\n [attr.aria-valuemax]=\"resizeValueMax\"\n (pointerdown)=\"startResize($event, col)\"\n (keydown)=\"onResizeKeydown($event, col)\"\n (click)=\"$event.stopPropagation()\"\n ></span>\n }\n </th>\n }\n </tr>\n @if (filterable() && !stacked()) {\n <!-- Filter row: native controls styled with tokens, so the table entry\n point stays free of the forms / datetime entries. -->\n <tr class=\"mk-table__filter-row\">\n @if (expandable()) {\n <td class=\"mk-table__filter-cell mk-table__th--expand\"></td>\n }\n @if (selectable()) {\n <td class=\"mk-table__filter-cell mk-table__th--select\"></td>\n }\n @for (col of orderedColumns(); track col.key) {\n @let kind = filterKind(col);\n <td\n class=\"mk-table__filter-cell\"\n [class.mk-table__th--pinned]=\"col.pinned\"\n [class.mk-table__th--pinned-right]=\"col.pinned === 'right'\"\n [style.width]=\"colStyleWidth(col)\"\n [style.inset-inline-start.px]=\"col.pinned === 'left' ? pinnedOffset(col) : null\"\n [style.inset-inline-end.px]=\"col.pinned === 'right' ? pinnedOffset(col) : null\"\n >\n @if (kind === 'select') {\n <select\n class=\"mk-table__filter-control mk-table__filter-select\"\n [class.mk-table__filter-control--active]=\"hasFilter(col.key)\"\n [attr.data-filter-key]=\"col.key\"\n [attr.aria-label]=\"filterLabel(col)\"\n (change)=\"onFilterSelect(col, $event)\"\n >\n <option value=\"\" [selected]=\"!hasFilter(col.key)\">\n {{ col.filterPlaceholder ?? i18n.filterAny }}\n </option>\n @for (option of filterOptionsFor(col); track $index) {\n <option [value]=\"option.value\" [selected]=\"isFilterOption(col, option)\">\n {{ option.label }}\n </option>\n }\n </select>\n } @else if (kind) {\n <span class=\"mk-table__filter\" [class.mk-table__filter--active]=\"hasFilter(col.key)\">\n <input\n class=\"mk-table__filter-control mk-table__filter-input\"\n [type]=\"kind === 'text' ? 'search' : kind\"\n [attr.inputmode]=\"kind === 'number' ? 'decimal' : null\"\n [attr.data-filter-key]=\"col.key\"\n [attr.aria-label]=\"filterLabel(col)\"\n [attr.placeholder]=\"filterPlaceholder(col)\"\n [value]=\"filterText(col.key)\"\n (input)=\"onFilterInput(col, $event)\"\n (keydown)=\"onFilterKeydown(col, $event)\"\n />\n @if (hasFilter(col.key)) {\n <button\n type=\"button\"\n class=\"mk-table__filter-clear\"\n [attr.aria-label]=\"i18n.clearFilter(col.header || col.key)\"\n (click)=\"clearFilter(col.key)\"\n >\n <span aria-hidden=\"true\">×</span>\n </button>\n }\n </span>\n }\n </td>\n }\n </tr>\n }\n </thead>\n <tbody class=\"mk-table__body\" [attr.role]=\"stacked() ? 'rowgroup' : null\">\n @if (isVirtual() && topSpace() > 0) {\n <tr class=\"mk-table__spacer\" aria-hidden=\"true\">\n <td [attr.colspan]=\"totalColumns()\" [style.height.px]=\"topSpace()\"></td>\n </tr>\n }\n @for (item of renderedItems(); track trackItem(item); let i = $index) {\n @let idx = windowStart() + i;\n @if (item.kind === 'group') {\n <tr\n class=\"mk-table__group-row\"\n [attr.role]=\"stacked() ? 'row' : null\"\n [attr.data-index]=\"idx\"\n [attr.aria-rowindex]=\"isVirtual() ? idx + headerRows() + 1 : null\"\n >\n <th\n class=\"mk-table__group\"\n scope=\"colgroup\"\n [attr.role]=\"stacked() ? 'rowheader' : null\"\n [attr.colspan]=\"totalColumns()\"\n >\n <button\n type=\"button\"\n class=\"mk-table__group-toggle\"\n [attr.aria-expanded]=\"!isGroupCollapsed(item.group.key)\"\n (click)=\"onGroupToggle(item.group)\"\n >\n <span\n class=\"mk-table__expander-icon\"\n [class.mk-table__expander-icon--open]=\"!isGroupCollapsed(item.group.key)\"\n aria-hidden=\"true\"\n >›</span\n >\n <span class=\"mk-visually-hidden\">{{\n isGroupCollapsed(item.group.key) ? i18n.expandGroup : i18n.collapseGroup\n }}</span>\n <span class=\"mk-table__group-label\">{{ item.group.label }}</span>\n <span class=\"mk-table__group-count\">{{\n i18n.groupCount(item.group.rows.length)\n }}</span>\n </button>\n </th>\n </tr>\n } @else {\n <ng-container>\n <tr\n class=\"mk-table__row\"\n [attr.role]=\"stacked() || childrenKey() ? 'row' : null\"\n [class]=\"rowClassFor(item.row)\"\n [class.mk-table__row--selected]=\"selectable() && isSelected(item.row)\"\n [class.mk-table__row--expanded]=\"expandable() && isExpanded(item.row)\"\n [class.mk-table__row--parent]=\"item.hasChildren\"\n [class.mk-table__row--even]=\"isVirtual() && idx % 2 === 1\"\n [style.--mk-tree-depth]=\"childrenKey() ? item.depth : null\"\n [style.margin-inline-start.px]=\"stacked() && item.depth ? item.depth * 16 : null\"\n [attr.data-index]=\"idx\"\n [attr.aria-rowindex]=\"isVirtual() ? idx + headerRows() + 1 : null\"\n [attr.aria-level]=\"childrenKey() ? item.depth + 1 : null\"\n [attr.aria-expanded]=\"item.hasChildren ? item.expanded : null\"\n [attr.tabindex]=\"clickableRows() ? 0 : null\"\n (click)=\"onRowClick(item.row)\"\n (keydown)=\"onRowKeydown($event, item.row)\"\n >\n @if (expandable()) {\n <td\n class=\"mk-table__td mk-table__td--expand\"\n [attr.role]=\"stacked() ? 'cell' : null\"\n (click)=\"$event.stopPropagation()\"\n >\n <button\n type=\"button\"\n class=\"mk-table__expander\"\n [class.mk-table__expander--open]=\"isExpanded(item.row)\"\n [attr.aria-expanded]=\"isExpanded(item.row)\"\n [attr.aria-controls]=\"detailId(idx)\"\n [attr.aria-label]=\"isExpanded(item.row) ? i18n.collapseRow : i18n.expandRow\"\n (click)=\"toggleExpand(item.row, $event)\"\n >\n <span class=\"mk-table__expander-icon\" aria-hidden=\"true\">›</span>\n </button>\n </td>\n }\n @if (selectable()) {\n <td\n class=\"mk-table__td mk-table__td--select\"\n [attr.role]=\"stacked() ? 'cell' : null\"\n (click)=\"$event.stopPropagation()\"\n >\n <mk-checkbox\n [aria-label]=\"i18n.selectRow(rowLabel(item.row))\"\n [checked]=\"isSelected(item.row)\"\n (checkedChange)=\"toggleRow(item.row)\"\n />\n </td>\n }\n @if (!stacked()) {\n @for (col of orderedColumns(); track col.key; let first = $first) {\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ col, row: item.row, i: idx, slot: null, tree: first ? item : null }\"\n />\n }\n } @else {\n <!-- Card layout. Same <td> elements, restyled — keeping the table\n DOM means selection, expansion, inline edit and every cell\n template keep working, since all of them reach for a `td`. -->\n @for (col of stackTitleColumns(); track col.key; let first = $first) {\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ col, row: item.row, i: idx, slot: 'title', tree: first ? item : null }\"\n />\n }\n @for (col of stackFieldColumns(); track col.key) {\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ col, row: item.row, i: idx, slot: 'field' }\"\n />\n }\n @for (col of stackFooterColumns(); track col.key) {\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ col, row: item.row, i: idx, slot: 'footer' }\"\n />\n }\n }\n </tr>\n @if (expandable() && isExpanded(item.row) && rowDetail()) {\n <tr\n class=\"mk-table__detail-row\"\n [attr.role]=\"stacked() ? 'row' : null\"\n [attr.data-index]=\"idx\"\n >\n <td\n class=\"mk-table__detail\"\n [id]=\"detailId(idx)\"\n [attr.role]=\"stacked() ? 'cell' : null\"\n [attr.colspan]=\"totalColumns()\"\n >\n <div class=\"mk-table__detail-inner\">\n <ng-container\n [ngTemplateOutlet]=\"rowDetail()!.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item.row }\"\n />\n </div>\n </td>\n </tr>\n }\n </ng-container>\n }\n } @empty {\n <tr class=\"mk-table__row mk-table__row--empty\" [attr.role]=\"stacked() ? 'row' : null\">\n <td\n class=\"mk-table__empty\"\n [attr.role]=\"stacked() ? 'cell' : null\"\n [attr.colspan]=\"totalColumns()\"\n >\n <ng-content select=\"[mkTableEmpty]\">{{ emptyMessage() }}</ng-content>\n </td>\n </tr>\n }\n @if (isVirtual() && bottomSpace() > 0) {\n <tr class=\"mk-table__spacer\" aria-hidden=\"true\">\n <td [attr.colspan]=\"totalColumns()\" [style.height.px]=\"bottomSpace()\"></td>\n </tr>\n }\n </tbody>\n </table>\n</div>\n\n<!-- One cell, rendered by both layouts. `slot` is null in the grid and\n 'title' | 'field' | 'footer' in a card; everything else — the editor, the\n consumer's mkTableCell template, the formatted fallback — is identical, so\n a card can never drift from the grid it replaces. -->\n<ng-template #cellTpl let-col=\"col\" let-row=\"row\" let-i=\"i\" let-slot=\"slot\" let-tree=\"tree\">\n <td\n class=\"mk-table__td\"\n [class.mk-table__td--tree]=\"!!tree && !!childrenKey()\"\n [class.mk-table__td--pinned]=\"isPinned(col, 'left') || isPinned(col, 'right')\"\n [class.mk-table__td--pinned-right]=\"isPinned(col, 'right')\"\n [class.mk-table__td--editable]=\"col.editable\"\n [class.mk-table__td--stack-title]=\"slot === 'title'\"\n [class.mk-table__td--stack-field]=\"slot === 'field'\"\n [class.mk-table__td--stack-footer]=\"slot === 'footer'\"\n [style.width]=\"colStyleWidth(col)\"\n [style.inset-inline-start.px]=\"isPinned(col, 'left') ? pinnedOffset(col) : null\"\n [style.inset-inline-end.px]=\"isPinned(col, 'right') ? pinnedOffset(col) : null\"\n [attr.data-align]=\"col.align ?? 'start'\"\n [attr.tabindex]=\"col.editable ? 0 : null\"\n [attr.role]=\"stacked() ? 'cell' : null\"\n (dblclick)=\"startEdit(i, col, $event)\"\n (keydown)=\"onCellKeydown($event, i, col)\"\n >\n @if (slot === 'field' && hasStackLabel(col)) {\n <!-- The column header, moved beside the value. Not aria-hidden: the\n <thead> is display:none while stacked, so this label is the only\n thing naming the value for a screen reader. -->\n <span class=\"mk-table__cell-label\">{{ col.header }}</span>\n }\n @if (tree && childrenKey()) {\n <!-- Tree toggle (or a spacer on leaves) ahead of the first cell's value,\n so the indent and the caret read as one column. -->\n @if (tree.hasChildren) {\n <button\n type=\"button\"\n class=\"mk-table__tree-toggle\"\n [class.mk-table__tree-toggle--open]=\"tree.expanded\"\n [attr.aria-expanded]=\"tree.expanded\"\n [attr.aria-label]=\"tree.expanded ? i18n.collapseTreeRow : i18n.expandTreeRow\"\n (click)=\"toggleTreeRow(row, $event)\"\n >\n <span class=\"mk-table__expander-icon\" [class.mk-table__expander-icon--open]=\"tree.expanded\" aria-hidden=\"true\">›</span>\n </button>\n } @else {\n <span class=\"mk-table__tree-spacer\" aria-hidden=\"true\"></span>\n }\n }\n <span class=\"mk-table__cell-value\">\n @if (isEditing(i, col)) {\n <input\n #editInput\n class=\"mk-table__cell-input\"\n [value]=\"cellText(row, col)\"\n [attr.aria-label]=\"col.header\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onEditKeydown($event, row, col)\"\n (blur)=\"commitEdit(row, col, $any($event.target).value)\"\n />\n } @else if (cellTemplateFor(col.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: cellValue(row, col), row }\"\n />\n } @else {\n {{ cellText(row, col) }}\n @if (col.editable) {\n <span class=\"mk-visually-hidden\">{{ i18n.editCell }}</span>\n }\n }\n </span>\n </td>\n</ng-template>\n","import {\n Directive,\n booleanAttribute,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { MkLiveAnnouncer } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkSortDirection } from '../table/table';\n\n/** Current sort state emitted by {@link MkSort.mkSortChange}. */\nexport interface MkSortState {\n /** Id of the column being sorted by (empty when cleared). */\n active: string;\n /** Sort direction (`none` when cleared). */\n direction: MkSortDirection;\n}\n\n/**\n * The minimal shape {@link MkSort} needs from a header. Implemented by\n * {@link MkSortHeader}; declared separately so the coordinator does not depend\n * on the header's concrete type (avoids a circular import).\n */\nexport interface MkSortable {\n id(): string;\n start(): 'asc' | 'desc' | undefined;\n disabled(): boolean;\n sortLabel(): string;\n}\n\n/**\n * Sort coordinator — apply `mkSort` to a table (or any container) to track\n * which column is sorted and in which direction. It holds no data: register\n * headers with `mkSortHeader`, then re-sort your rows in the\n * `(mkSortChange)` handler. Mirrors the Angular Material `matSort` model but\n * signal-based.\n *\n * Clicking a header cycles asc → desc → unsorted (set `mkSortDisableClear` to\n * cycle asc ↔ desc only). `mkSortStart` flips the initial direction.\n *\n * ```html\n * <table mkSort mkSortActive=\"name\" mkSortDirection=\"asc\"\n * (mkSortChange)=\"sortData($event)\">\n * <thead><tr>\n * <th mkSortHeader=\"name\">Name</th>\n * <th mkSortHeader=\"size\" mkSortHeaderStart=\"desc\">Size</th>\n * </tr></thead>\n * …\n * </table>\n * ```\n */\n@Directive({\n selector: '[mkSort]',\n exportAs: 'mkSort',\n})\nexport class MkSort {\n private readonly announcer = inject(MkLiveAnnouncer);\n private readonly i18n = inject(MK_I18N);\n\n /** Id of the currently sorted column (two-way; empty when unsorted). */\n readonly active = model<string>('', { alias: 'mkSortActive' });\n /** Current sort direction (two-way). */\n readonly direction = model<MkSortDirection>('none', {\n alias: 'mkSortDirection',\n });\n /** Direction the first click on a header applies. Default `asc`. */\n readonly start = input<'asc' | 'desc'>('asc', { alias: 'mkSortStart' });\n /** Disable sorting for every header. */\n readonly disabled = input(false, {\n transform: booleanAttribute,\n alias: 'mkSortDisabled',\n });\n /** Remove the \"unsorted\" step so headers cycle asc ↔ desc only. */\n readonly disableClear = input(false, {\n transform: booleanAttribute,\n alias: 'mkSortDisableClear',\n });\n\n /** Emits the new sort state whenever a header is activated. */\n readonly sortChange = output<MkSortState>({ alias: 'mkSortChange' });\n\n /** Advance the sort state for the given header (called on click/keyboard). */\n sort(header: MkSortable): void {\n if (this.disabled() || header.disabled()) return;\n const id = header.id();\n if (this.active() !== id) {\n this.active.set(id);\n this.direction.set(this.startFor(header));\n } else {\n const next = this.nextDirection(header, this.direction());\n this.direction.set(next);\n if (next === 'none') this.active.set('');\n }\n const state: MkSortState = {\n active: this.active(),\n direction: this.direction(),\n };\n this.sortChange.emit(state);\n this.announce(header, state.direction);\n }\n\n /** Whether the given column id is the active, non-cleared sort. */\n isActive(id: string): boolean {\n return this.active() === id && this.direction() !== 'none';\n }\n\n private startFor(header: MkSortable): MkSortDirection {\n return header.start() ?? this.start();\n }\n\n private nextDirection(\n header: MkSortable,\n current: MkSortDirection,\n ): MkSortDirection {\n const order: MkSortDirection[] =\n this.startFor(header) === 'desc' ? ['desc', 'asc'] : ['asc', 'desc'];\n if (!this.disableClear()) order.push('none');\n const index = order.indexOf(current);\n return order[(index + 1) % order.length];\n }\n\n private announce(header: MkSortable, direction: MkSortDirection): void {\n const label = header.sortLabel() || header.id();\n const message =\n direction === 'none'\n ? this.i18n.sortingCleared(label)\n : this.i18n.sortedBy(label, direction === 'asc' ? 'asc' : 'desc');\n this.announcer.announce(message, 'polite');\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport type { MkSortDirection } from '../table/table';\nimport { MkSort, MkSortable } from './sort';\n\n/**\n * Sort header — attach `mkSortHeader` to a header cell (`<th>`) inside an\n * element carrying `mkSort`. It wraps the projected header text in a real\n * `<button>` (so assistive tech hears an operable control), adds a directional\n * arrow (faint on hover, solid when active), reflects `aria-sort` on the cell,\n * and toggles the sort on click or Enter/Space.\n *\n * ```html\n * <th mkSortHeader=\"email\" mkSortHeaderLabel=\"Email address\">Email</th>\n * ```\n */\n@Component({\n selector: '[mkSortHeader]',\n templateUrl: './sort-header.html',\n styleUrl: './sort-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-sort-header',\n '[class.mk-sort-header--active]': 'isActive()',\n '[class.mk-sort-header--disabled]': 'isDisabled()',\n '[attr.aria-sort]': 'ariaSort()',\n },\n})\nexport class MkSortHeader implements MkSortable {\n private readonly sort = inject(MkSort);\n\n /** Column id this header sorts by (the `mkSortHeader` value). */\n readonly id = input('', { alias: 'mkSortHeader' });\n /** Per-header override for the initial sort direction. */\n readonly start = input<'asc' | 'desc' | undefined>(undefined, {\n alias: 'mkSortHeaderStart',\n });\n /** Disable sorting for just this header. */\n readonly disabled = input(false, {\n transform: booleanAttribute,\n alias: 'mkSortHeaderDisabled',\n });\n /** Accessible label used in sort announcements (defaults to the id). */\n readonly sortLabel = input('', { alias: 'mkSortHeaderLabel' });\n\n /** Disabled if this header or the whole `mkSort` is disabled. */\n readonly isDisabled = computed(() => this.disabled() || this.sort.disabled());\n /** Whether this header is the active, non-cleared sort. */\n readonly isActive = computed(() => this.sort.isActive(this.id()));\n /** Active direction, or `none` when this header is not the active sort. */\n readonly direction = computed<MkSortDirection>(() =>\n this.isActive() ? this.sort.direction() : 'none',\n );\n /** `aria-sort` value for the header cell. */\n protected readonly ariaSort = computed(() => {\n if (!this.isActive()) return 'none';\n return this.sort.direction() === 'asc' ? 'ascending' : 'descending';\n });\n\n protected toggle(): void {\n if (!this.isDisabled()) this.sort.sort(this);\n }\n}\n","<!-- A real <button> rather than a clickable th: the cell keeps aria-sort,\n the button provides the operable-control semantics (and native\n Enter/Space activation) a screen-reader user expects. -->\n<button\n type=\"button\"\n class=\"mk-sort-header__button\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n>\n <span class=\"mk-sort-header__label\"><ng-content /></span>\n @if (!isDisabled()) {\n <span\n class=\"mk-sort-header__arrow\"\n [class.mk-sort-header__arrow--active]=\"isActive()\"\n [class.mk-sort-header__arrow--desc]=\"direction() === 'desc'\"\n aria-hidden=\"true\"\n ></span>\n }\n</button>\n","import { DestroyRef, Signal, computed, inject, signal } from '@angular/core';\nimport type { Observable, Unsubscribable } from 'rxjs';\nimport { mkQueryCompact, type MkQueryGroup } from '@mk-kit/ui/core';\nimport { mkCompactFilters, type MkSortChange, type MkTableFilters } from './table/table';\nimport type { MkSort, MkSortState } from './sort/sort';\n\n/** The request handed to a {@link MkDataFetcher} on every load. */\nexport interface MkDataRequest {\n /** 1-based page index, matching `mk-pagination`. */\n page: number;\n /** Number of rows per page. */\n pageSize: number;\n /** Active sort, or `null` when unsorted (cleared sorts normalise to `null`). */\n sort: MkSortState | null;\n /** Free-text filter query (`''` = none). */\n filter: string;\n /** Structured filter from `mk-query-builder` (`null` = none). Compacted: no empty groups or unfinished rules. */\n query: MkQueryGroup | null;\n /**\n * Per-column filters from `mk-table`'s header filter row (`null` = none),\n * keyed by column key with empty entries dropped — see\n * {@link MkTableDataSource.setFilters}.\n */\n filters: MkTableFilters | null;\n}\n\n/** One page of server data returned by a {@link MkDataFetcher}. */\nexport interface MkDataPage<T> {\n /** The rows for the requested page. */\n rows: T[];\n /** Total number of rows across ALL pages (drives the pager). */\n total: number;\n}\n\n/**\n * Loads one page of data for a {@link MkDataRequest}. May return a `Promise`\n * (e.g. `fetch`) or an `Observable` (e.g. `HttpClient`); an Observable is\n * treated as single-shot — the first emission wins and the subscription is\n * released.\n */\nexport type MkDataFetcher<T> = (\n req: MkDataRequest,\n) => Promise<MkDataPage<T>> | Observable<MkDataPage<T>>;\n\n/** Construction options for {@link MkTableDataSource}. */\nexport interface MkTableDataSourceOptions {\n /** Initial rows per page (default 10, matching `mk-pagination`). */\n pageSize?: number;\n /** Debounce for {@link MkTableDataSource.setFilter} in ms (default 300). */\n filterDebounce?: number;\n}\n\n/** Default debounce applied to {@link MkTableDataSource.setFilter}. */\nconst DEFAULT_FILTER_DEBOUNCE = 300;\n/** Default page size, matching `mk-pagination`. */\nconst DEFAULT_PAGE_SIZE = 10;\n\n/** Normalise any of the kit's sort payload shapes to `MkSortState | null`. */\nfunction normalizeSort(\n sort: MkSortState | MkSortChange | null | undefined,\n): MkSortState | null {\n if (!sort) return null;\n const active = 'active' in sort ? sort.active : sort.key;\n if (!active || sort.direction === 'none') return null;\n return { active, direction: sort.direction };\n}\n\n/** Whether two normalised sort states describe the same ordering. */\nfunction sameSort(a: MkSortState | null, b: MkSortState | null): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return a.active === b.active && a.direction === b.direction;\n}\n\n/** JSON with object keys sorted, so `{ a, b }` and `{ b, a }` compare equal. */\nfunction canonicalJson(value: unknown): string {\n return JSON.stringify(value, (_key, v: unknown) =>\n v && typeof v === 'object' && !Array.isArray(v)\n ? Object.fromEntries(\n Object.keys(v as object)\n .sort()\n .map((k) => [k, (v as Record<string, unknown>)[k]]),\n )\n : v,\n );\n}\n\n/** Duck-typed Observable check, so rxjs is a type-only dependency here. */\nfunction isSubscribable<T>(\n value: Promise<T> | Observable<T>,\n): value is Observable<T> {\n return typeof (value as Observable<T>).subscribe === 'function';\n}\n\n/**\n * Server-side data adapter for `mk-table` — the page/sort/filter plumbing every\n * admin screen otherwise hand-rolls. A plain class (no component, no injection\n * required): give it a fetcher and bind its signals; every setter re-queries\n * the server and **stale responses never overwrite newer state** (latest-wins).\n *\n * - `setFilter` is debounced (default 300 ms); page, sort and page size load\n * immediately. Sort, filter and page-size changes reset to page 1.\n * - `rows` keeps its previous value while loading and on error, so the table\n * never blanks mid-transition; `error` is cleared by the next successful\n * load.\n * - Created in an injection context (a component field initialiser) it hooks\n * `DestroyRef` and cleans up automatically; anywhere else, call\n * {@link destroy} yourself.\n *\n * ```ts\n * interface User { id: number; name: string; email: string; }\n *\n * @Component({\n * imports: [MkTable, MkPagination, MkInput],\n * template: `\n * <input\n * mkInput\n * type=\"search\"\n * placeholder=\"Search users…\"\n * (input)=\"ds.setFilter($any($event.target).value)\"\n * />\n *\n * <mk-table\n * [columns]=\"columns\"\n * [data]=\"ds.rows()\"\n * (sortChange)=\"ds.setSort($event)\"\n * />\n * @if (ds.error()) { <p role=\"alert\">Failed to load.</p> }\n * @if (ds.empty()) { <p>No users match.</p> }\n *\n * <mk-pagination\n * [total]=\"ds.total()\"\n * [pageSize]=\"ds.pageSize()\"\n * [page]=\"ds.page()\"\n * (pageChange)=\"ds.setPage($event)\"\n * />\n * `,\n * })\n * export class UsersPage {\n * private readonly http = inject(HttpClient);\n *\n * readonly columns: MkTableColumn<User>[] = [\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'email', header: 'Email', sortable: true },\n * ];\n *\n * // Field initialiser = injection context, so cleanup is automatic.\n * readonly ds = new MkTableDataSource<User>(\n * (req) =>\n * this.http.get<MkDataPage<User>>('/api/users', {\n * params: {\n * page: req.page,\n * size: req.pageSize,\n * q: req.filter,\n * ...(req.sort && {\n * sort: `${req.sort.active},${req.sort.direction}`,\n * }),\n * },\n * }),\n * { pageSize: 20 },\n * );\n * }\n * ```\n *\n * With a custom `mkSort` table, forward the directive instead of binding:\n *\n * ```ts\n * private readonly sort = viewChild.required(MkSort);\n * constructor() {\n * afterNextRender(() => this.ds.connectSort(this.sort()));\n * }\n * ```\n */\nexport class MkTableDataSource<T> {\n private readonly fetcher: MkDataFetcher<T>;\n private readonly debounceMs: number;\n\n private readonly _rows = signal<T[]>([]);\n private readonly _total = signal(0);\n private readonly _loading = signal(false);\n private readonly _error = signal<unknown | null>(null);\n private readonly _page = signal(1);\n private readonly _pageSize = signal(DEFAULT_PAGE_SIZE);\n private readonly _sort = signal<MkSortState | null>(null);\n private readonly _filter = signal('');\n private readonly _query = signal<MkQueryGroup | null>(null);\n private readonly _filters = signal<MkTableFilters | null>(null);\n\n /** Rows of the current page (`[]` until the first load lands). */\n readonly rows = this._rows.asReadonly();\n /** Total row count across all pages (feed to `mk-pagination`'s `total`). */\n readonly total = this._total.asReadonly();\n /** True while the LATEST request is in flight. */\n readonly loading = this._loading.asReadonly();\n /** The last load's error, or `null`; cleared by the next successful load. */\n readonly error = this._error.asReadonly();\n /** Current 1-based page. */\n readonly page = this._page.asReadonly();\n /** Current page size. */\n readonly pageSize = this._pageSize.asReadonly();\n /** Current sort, or `null` when unsorted. */\n readonly sort = this._sort.asReadonly();\n /** Current filter query (updates immediately, even while debouncing). */\n readonly filter = this._filter.asReadonly();\n /** Current structured query, or `null`. */\n readonly query = this._query.asReadonly();\n /** Current per-column filters, or `null`. */\n readonly filters = this._filters.asReadonly();\n /** True when a settled load reported no rows at all. */\n readonly empty: Signal<boolean> = computed(\n () => !this._loading() && this._total() === 0,\n );\n\n /** Monotonic request id — settles from older epochs are discarded. */\n private epoch = 0;\n /** Subscription to an in-flight Observable fetch, if any. */\n private activeSub: Unsubscribable | null = null;\n /** Pending filter-debounce timer. */\n private filterTimer: ReturnType<typeof setTimeout> | null = null;\n /** Subscriptions created by {@link connectSort}, keyed for idempotence. */\n private readonly sortSubs = new Map<MkSort, Unsubscribable>();\n private destroyed = false;\n\n constructor(fetcher: MkDataFetcher<T>, opts?: MkTableDataSourceOptions) {\n this.fetcher = fetcher;\n this.debounceMs = opts?.filterDebounce ?? DEFAULT_FILTER_DEBOUNCE;\n if (opts?.pageSize != null) this._pageSize.set(opts.pageSize);\n\n // Auto-cleanup when constructed in an injection context (a component\n // field initialiser). Outside one, inject() throws and the consumer owns\n // calling destroy().\n try {\n inject(DestroyRef).onDestroy(() => this.destroy());\n } catch {\n // Not in an injection context — manual destroy().\n }\n\n this.load();\n }\n\n /** Jump to a 1-based page and load it immediately. */\n setPage(page: number): void {\n const next = Math.max(1, Math.floor(page));\n if (next === this._page()) return;\n this._page.set(next);\n this.load();\n }\n\n /** Change the page size; resets to page 1 and loads immediately. */\n setPageSize(size: number): void {\n const next = Math.max(1, Math.floor(size));\n if (next === this._pageSize()) return;\n this._pageSize.set(next);\n this._page.set(1);\n this.load();\n }\n\n /**\n * Change the sort; resets to page 1 and loads immediately. Accepts either\n * the `mkSort` directive's {@link MkSortState} or `mk-table`'s\n * {@link MkSortChange} payload; a cleared sort (`direction: 'none'` or an\n * empty column id) normalises to `null`. A no-op when the sort is unchanged.\n */\n setSort(sort: MkSortState | MkSortChange | null): void {\n const next = normalizeSort(sort);\n if (sameSort(next, this._sort())) return;\n this._sort.set(next);\n this._page.set(1);\n this.load();\n }\n\n /**\n * Change the free-text filter. The `filter` signal updates (and the page\n * resets to 1) immediately, but the request is debounced — `refresh()`\n * flushes it early. A no-op when the query is unchanged.\n */\n setFilter(query: string): void {\n if (query === this._filter()) return;\n this._filter.set(query);\n this._page.set(1);\n this.cancelDebounce();\n if (this.destroyed) return;\n this.filterTimer = setTimeout(() => {\n this.filterTimer = null;\n this.load();\n }, this.debounceMs);\n }\n\n /**\n * Set (or clear with `null`) the structured query from `mk-query-builder`.\n * Empty groups and unfinished rules are dropped before the request; a query\n * with nothing left is sent as `null`. Resets to page 1 and loads at once.\n */\n setQuery(query: MkQueryGroup | null): void {\n const compact = query ? mkQueryCompact(query) : null;\n const next = compact && compact.rules.length ? compact : null;\n if (JSON.stringify(next) === JSON.stringify(this._query())) return;\n this._query.set(next);\n this._page.set(1);\n this.load();\n }\n\n /**\n * Set (or clear with `null` / `{}`) the per-column filters from `mk-table`'s\n * header filter row — bind `(filtersChange)=\"ds.setFilters($event)\"` and\n * turn the table's `clientFilter` off. Empty entries are dropped before the\n * request; nothing left is sent as `null`. Resets to page 1 and loads at\n * once (the table already debounces nothing, so debounce the fetcher if\n * your API needs it). A no-op when unchanged.\n */\n setFilters(filters: MkTableFilters | null): void {\n const next = mkCompactFilters(filters);\n if (canonicalJson(next) === canonicalJson(this._filters())) return;\n this._filters.set(next);\n this._page.set(1);\n this.load();\n }\n\n /**\n * Re-run the current request immediately (e.g. after a mutation). Flushes a\n * pending debounced filter, since the request reads the live filter value.\n */\n refresh(): void {\n this.load();\n }\n\n /**\n * Pipe an `mkSort` directive's changes into {@link setSort}. Idempotent per\n * directive instance; all subscriptions are released by {@link destroy}.\n */\n connectSort(sort: MkSort): void {\n if (this.destroyed || this.sortSubs.has(sort)) return;\n this.sortSubs.set(\n sort,\n sort.sortChange.subscribe((state) => this.setSort(state)),\n );\n }\n\n /**\n * Cancel pending work: the debounce timer, any in-flight Observable fetch,\n * and `connectSort` subscriptions. In-flight Promise settles are discarded.\n * Called automatically on host destroy when created in an injection context.\n */\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.epoch++; // Anything still in flight settles stale.\n this.cancelDebounce();\n this.unsubscribeActive();\n for (const sub of this.sortSubs.values()) sub.unsubscribe();\n this.sortSubs.clear();\n this._loading.set(false);\n }\n\n /** Start a load for the current request state; supersedes any in flight. */\n private load(): void {\n if (this.destroyed) return;\n this.cancelDebounce();\n this.unsubscribeActive();\n const epoch = ++this.epoch;\n this._loading.set(true);\n const req: MkDataRequest = {\n page: this._page(),\n pageSize: this._pageSize(),\n sort: this._sort(),\n filter: this._filter(),\n query: this._query(),\n filters: this._filters(),\n };\n let result: Promise<MkDataPage<T>> | Observable<MkDataPage<T>>;\n try {\n result = this.fetcher(req);\n } catch (err) {\n this.settleError(epoch, err);\n return;\n }\n if (isSubscribable(result)) {\n this.runObservable(result, epoch);\n } else {\n result.then(\n (page) => this.settleSuccess(epoch, page),\n (err) => this.settleError(epoch, err),\n );\n }\n }\n\n /** Subscribe single-shot: first emission (or error) settles, then release. */\n private runObservable(source: Observable<MkDataPage<T>>, epoch: number): void {\n let done = false;\n let sync = true;\n const sub = source.subscribe({\n next: (page) => {\n if (done) return;\n done = true;\n this.settleSuccess(epoch, page);\n if (!sync) this.clearSub(sub);\n },\n error: (err) => {\n if (done) return;\n done = true;\n this.settleError(epoch, err);\n if (!sync) this.clearSub(sub);\n },\n });\n sync = false;\n if (done) sub.unsubscribe();\n else this.activeSub = sub;\n }\n\n /** Apply a successful settle, unless a newer request superseded it. */\n private settleSuccess(epoch: number, page: MkDataPage<T>): void {\n if (epoch !== this.epoch || this.destroyed) return;\n this._rows.set(page.rows);\n this._total.set(page.total);\n this._error.set(null);\n this._loading.set(false);\n }\n\n /** Record a failed settle (rows/total untouched), unless superseded. */\n private settleError(epoch: number, err: unknown): void {\n if (epoch !== this.epoch || this.destroyed) return;\n this._error.set(err);\n this._loading.set(false);\n }\n\n private cancelDebounce(): void {\n if (this.filterTimer != null) {\n clearTimeout(this.filterTimer);\n this.filterTimer = null;\n }\n }\n\n private unsubscribeActive(): void {\n if (this.activeSub) {\n this.activeSub.unsubscribe();\n this.activeSub = null;\n }\n }\n\n private clearSub(sub: Unsubscribable): void {\n if (this.activeSub === sub) this.activeSub = null;\n sub.unsubscribe();\n }\n}\n","/**\n * @mk-kit/ui/table — the data table, grid features and sort directives.\n */\nexport * from './table';\nexport * from './sort';\nexport * from './data-source';\nexport * from './export';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mk-kit-ui-table.mjs","sources":["../../../projects/mk-kit/table/table/table-row-detail.ts","../../../projects/mk-kit/table/table/table-cell.ts","../../../projects/mk-kit/table/export.ts","../../../projects/mk-kit/table/table/table.ts","../../../projects/mk-kit/table/table/table.html","../../../projects/mk-kit/table/sort/sort.ts","../../../projects/mk-kit/table/sort/sort-header.ts","../../../projects/mk-kit/table/sort/sort-header.html","../../../projects/mk-kit/table/data-source.ts","../../../projects/mk-kit/table/index.ts","../../../projects/mk-kit/table/mk-kit-ui-table.ts"],"sourcesContent":["import { Directive, TemplateRef, inject } from '@angular/core';\n\n/**\n * Marks an `<ng-template>` as the expandable detail content for {@link MkTable}\n * rows. The template's implicit context is the row object, so consumers can\n * destructure it with `let-row`:\n *\n * ```html\n * <mk-table [columns]=\"cols\" [data]=\"rows()\" expandable>\n * <ng-template mkTableRowDetail let-row>\n * <dl>… {{ row.notes }} …</dl>\n * </ng-template>\n * </mk-table>\n * ```\n */\n@Directive({\n selector: '[mkTableRowDetail]',\n})\nexport class MkTableRowDetail<T = unknown> {\n /** The projected detail template, rendered once per expanded row. */\n readonly template = inject<TemplateRef<{ $implicit: T }>>(TemplateRef);\n}\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\n\n/** Context handed to an `[mkTableCell]` template. */\nexport interface MkTableCellContext<T = unknown> {\n /** The cell's raw value (the row's property named by the column key). */\n $implicit: unknown;\n /** The whole row, for cells that need more than one field. */\n row: T;\n}\n\n/**\n * Marks an `<ng-template>` as the renderer for one column's cells, named by the\n * column `key`. Without it a cell can only be text — `MkTableColumn.format`\n * returns a string — so anything richer (a status tag, an avatar, a progress\n * bar, an action button) meant abandoning `mk-table` for a hand-rolled\n * `<table>`.\n *\n * The value is the template's implicit context and the row is available as\n * `let-row`:\n *\n * ```html\n * <mk-table [columns]=\"cols\" [data]=\"rows()\">\n * <ng-template mkTableCell=\"status\" let-value let-row=\"row\">\n * <mk-tag [tone]=\"toneFor(value)\">{{ label(value) }}</mk-tag>\n * </ng-template>\n * </mk-table>\n * ```\n *\n * A column with both a template and a `format` uses the template; `format`\n * still applies to sorting/export paths that need a string.\n */\n@Directive({\n selector: '[mkTableCell]',\n})\nexport class MkTableCell<T = unknown> {\n /** Column key whose cells this template renders. */\n readonly mkTableCell = input.required<string>();\n\n /** The projected template, rendered once per cell in that column. */\n readonly template =\n inject<TemplateRef<MkTableCellContext<T>>>(TemplateRef);\n}\n","/**\n * CSV export — turn rows into RFC 4180 text and hand it to the browser as a\n * download. Framework-free so it also serves data that never touched a table.\n */\n\n/** A column to export: the row property, its header, and an optional formatter. */\nexport interface MkCsvColumn<T = Record<string, unknown>> {\n /** Property key on each row object supplying the cell value. */\n key: string;\n /** Header text; defaults to `key`. */\n header?: string;\n /** Formatter turning the raw value into cell text (same shape as `MkTableColumn.format`). */\n format?: (value: unknown, row: T) => string;\n}\n\nexport interface MkCsvOptions {\n /** Field separator (default `,`; use `;` for locales whose Excel expects it). */\n delimiter?: string;\n /** Emit the header row first (default `true`). */\n header?: boolean;\n /** Line terminator (default `\\r\\n`, per RFC 4180). */\n newline?: string;\n /**\n * Prefix a UTF-8 byte-order mark (default `true`) so Excel reads accented\n * characters correctly. Only affects the downloaded file / returned text.\n */\n bom?: boolean;\n /**\n * Neutralise spreadsheet formula injection (default `true`): a text cell\n * starting with `=`, `+`, `-`, `@`, tab or CR is prefixed with `'` so a\n * malicious value cannot execute when opened in Excel / Sheets. Numbers\n * are never touched, so `-5` stays `-5`.\n */\n sanitize?: boolean;\n /** Property holding child rows; when set, trees are flattened depth-first. */\n childrenKey?: string;\n}\n\n/** Options for {@link mkExportCsv}. */\nexport interface MkCsvExportOptions extends MkCsvOptions {\n /** File name for the download (default `export.csv`; `.csv` is appended if missing). */\n filename?: string;\n}\n\nconst NEEDS_QUOTES = /[\"\\r\\n]/;\nconst FORMULA_LEAD = /^[=+\\-@\\t\\r]/;\n\n/** Escape one cell for CSV. */\nfunction csvCell(value: unknown, delimiter: string, sanitize: boolean): string {\n if (value == null) return '';\n let text: string;\n if (typeof value === 'string') {\n text = sanitize && FORMULA_LEAD.test(value) ? `'${value}` : value;\n } else if (value instanceof Date) {\n text = value.toISOString();\n } else if (typeof value === 'object') {\n text = JSON.stringify(value);\n } else {\n text = String(value);\n }\n return NEEDS_QUOTES.test(text) || text.includes(delimiter) || /^\\s|\\s$/.test(text)\n ? `\"${text.replace(/\"/g, '\"\"')}\"`\n : text;\n}\n\n/**\n * Serialise `rows` as CSV text.\n *\n * Without `columns` every key of the first row is exported in its own order.\n * Column formatters are applied, so what the user saw in the table is what\n * lands in the file.\n */\nexport function mkToCsv<T>(\n rows: readonly T[],\n columns?: readonly MkCsvColumn<T>[],\n options: MkCsvOptions = {},\n): string {\n const delimiter = options.delimiter ?? ',';\n const newline = options.newline ?? '\\r\\n';\n const sanitize = options.sanitize ?? true;\n const cols: readonly MkCsvColumn<T>[] =\n columns ??\n Object.keys((rows[0] ?? {}) as object)\n .filter((key) => key !== options.childrenKey)\n .map((key) => ({ key }));\n\n const flat: T[] = [];\n const walk = (list: readonly T[]): void => {\n for (const row of list) {\n flat.push(row);\n const children = options.childrenKey\n ? (row as Record<string, unknown>)[options.childrenKey]\n : null;\n if (Array.isArray(children)) walk(children as T[]);\n }\n };\n walk(rows);\n\n const lines: string[] = [];\n if (options.header ?? true) {\n lines.push(cols.map((c) => csvCell(c.header ?? c.key, delimiter, sanitize)).join(delimiter));\n }\n for (const row of flat) {\n lines.push(\n cols\n .map((c) => {\n const raw = (row as Record<string, unknown>)[c.key];\n const value = c.format ? c.format(raw, row) : raw;\n return csvCell(value, delimiter, sanitize);\n })\n .join(delimiter),\n );\n }\n return (options.bom ?? true ? '' : '') + lines.join(newline) + newline;\n}\n\n/**\n * Trigger a browser download of `text` as a file. No-op outside a DOM\n * (server-side rendering); returns whether a download was started.\n */\nexport function mkDownloadText(\n text: string,\n filename: string,\n type = 'text/csv;charset=utf-8',\n): boolean {\n if (typeof document === 'undefined' || typeof URL?.createObjectURL !== 'function') return false;\n const url = URL.createObjectURL(new Blob([text], { type }));\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.rel = 'noopener';\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n a.remove();\n // Give the click a tick to grab the blob before the URL is released.\n setTimeout(() => URL.revokeObjectURL(url), 0);\n return true;\n}\n\n/**\n * Serialise `rows` as CSV and download it. Returns the CSV text so callers\n * can also keep it (tests, previews, uploads).\n */\nexport function mkExportCsv<T>(\n rows: readonly T[],\n columns?: readonly MkCsvColumn<T>[],\n options: MkCsvExportOptions = {},\n): string {\n const csv = mkToCsv(rows, columns, options);\n let filename = options.filename ?? 'export.csv';\n if (!/\\.csv$/i.test(filename)) filename += '.csv';\n mkDownloadText(csv, filename);\n return csv;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n PLATFORM_ID,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n contentChild,\n contentChildren,\n effect,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { DOCUMENT, NgTemplateOutlet, isPlatformBrowser } from '@angular/common';\nimport { MkLiveAnnouncer } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MkCheckbox } from '@mk-kit/ui/checkbox';\nimport { MkTableRowDetail } from './table-row-detail';\nimport { MkTableCell } from './table-cell';\nimport { mkDownloadText, mkToCsv, type MkCsvColumn, type MkCsvExportOptions } from '../export';\n\n/** Horizontal text alignment for a table column. */\nexport type MkTableAlign = 'start' | 'center' | 'end';\n/** Sort direction; `none` means unsorted. */\nexport type MkSortDirection = 'asc' | 'desc' | 'none';\n/** Row vertical density. */\nexport type MkTableDensity = 'comfortable' | 'compact';\n\n/** Which control a column's header filter renders (see {@link MkTableColumn.filter}). */\nexport type MkTableFilterKind = 'text' | 'select' | 'number' | 'date';\n\n/** One option of a `select` header filter. */\nexport interface MkTableFilterOption {\n /** The value compared against the cell (by `String()` equality). */\n value: unknown;\n /** Visible option text. */\n label: string;\n}\n\n/**\n * An inclusive range accepted as the value of a `number` or `date` filter\n * (dates as `YYYY-MM-DD`, `Date` or a timestamp). Either bound may be omitted.\n */\nexport interface MkTableFilterRange<V = number | string | Date> {\n min?: V | null;\n max?: V | null;\n}\n\n/**\n * Active header filters keyed by column key: a string for `text`, an option\n * value for `select`, a number / date (`>=`) or a {@link MkTableFilterRange}\n * for `number` and `date`. Empty strings and `null` mean \"no filter\".\n */\nexport type MkTableFilters = Record<string, unknown>;\n\n/** Column definition for {@link MkTable}. */\nexport interface MkTableColumn<T = Record<string, unknown>> {\n /** Property key on each row object supplying the cell value. */\n key: string;\n /** Visible column header text. */\n header: string;\n /** Allow sorting by this column. */\n sortable?: boolean;\n /** Cell/header alignment (default `start`). */\n align?: MkTableAlign;\n /** Fixed column width (any CSS length). */\n width?: string;\n /** Optional formatter turning the raw value into display text. */\n format?: (value: unknown, row: T) => string;\n /** Allow the user to drag-resize this column (needs `resizableColumns`). */\n resizable?: boolean;\n /** Make this column's cells inline-editable (double-click / Enter). */\n editable?: boolean;\n /** Pin (freeze) this column to a side while the body scrolls horizontally. */\n pinned?: 'left' | 'right';\n /** Minimum width in px when resizing (default 60). */\n minWidth?: number;\n /**\n * What becomes of this column when the table stacks into cards\n * (see {@link MkTable.stackAt}). Omitted, the column renders as a labelled\n * field: its `header` on one side, its value on the other.\n *\n * - `'title'` — the card's heading. No label; the value identifies the\n * record at a glance (an order number, a product name). Mark one, or two\n * if something short belongs beside it such as a status or a total.\n * - `'footer'` — pinned to the bottom of the card, full width and unlabelled.\n * Where an actions cell belongs: buttons read as buttons, rather than as\n * the answer to a label.\n * - `'hide'` — not rendered at all. Not merely invisible: the cell is never\n * created, so a screen reader does not read it either. For columns that\n * only earn their place while scanning a grid, and especially for anything\n * an expandable row detail already repeats.\n */\n stack?: 'title' | 'footer' | 'hide';\n /**\n * The header-row filter control for this column (rendered when the table is\n * {@link MkTable.filterable}). Omitted, a filterable table gives the column a\n * text filter; `false` leaves its filter cell empty.\n *\n * - `'text'` — case-insensitive *contains* on the displayed (formatted) text.\n * - `'select'` — equality against one of {@link filterOptions}; without\n * options, the distinct values found in `data`.\n * - `'number'` / `'date'` — the control keeps rows whose value is **≥** the\n * entry. Set `{ min, max }` through {@link MkTable.filters} for an\n * inclusive range. Dates compare by local calendar day.\n */\n filter?: MkTableFilterKind | false;\n /**\n * Options of a `select` filter — strings / numbers, or `{ value, label }`.\n * Omitted: every distinct value of the column in `data`, sorted.\n */\n filterOptions?: readonly (string | number | MkTableFilterOption)[];\n /** Placeholder of the filter control (text: `i18n.filter`; number / date: `i18n.filterMin`). */\n filterPlaceholder?: string;\n}\n\n/** Payload emitted by {@link MkTable.sortChange}. */\nexport interface MkSortChange {\n /** Column key sorted by. */\n key: string;\n /** Resulting direction (`none` when sorting was cleared). */\n direction: MkSortDirection;\n}\n\n/** Payload emitted by {@link MkTable.columnResize} after a column resize. */\nexport interface MkColumnResize {\n /** The resized column's key. */\n key: string;\n /** The new width in pixels. */\n width: number;\n}\n\n/** Payload emitted by {@link MkTable.cellEdit} when an editable cell is saved. */\nexport interface MkCellEdit<T = Record<string, unknown>> {\n /** The edited row. */\n row: T;\n /** The column key that was edited. */\n key: string;\n /** The new (string) value the user entered. */\n value: string;\n}\n\n/** A group of rows produced by {@link MkTable.groupBy}. */\nexport interface MkTableGroup<T = Record<string, unknown>> {\n /** The shared group value. */\n key: unknown;\n /** Display label for the group header. */\n label: string;\n /** The rows in this group, in display (sorted) order. */\n rows: T[];\n}\n\n/** Payload emitted by {@link MkTable.groupToggle}. */\n/** Payload of `(treeToggle)`: a parent row was expanded or collapsed. */\nexport interface MkTreeToggle<T = Record<string, unknown>> {\n /** The parent row. */\n row: T;\n /** Whether its child rows are now shown. */\n expanded: boolean;\n}\n\nexport interface MkGroupToggle {\n /** The toggled group's value. */\n key: unknown;\n /** Whether the group is now collapsed. */\n collapsed: boolean;\n}\n\n/** Options for {@link MkTable.getExportRows} — which rows and columns to export. */\nexport interface MkTableExportRowsOptions {\n /** Export only the selected rows (default: every row). */\n selectedOnly?: boolean;\n /** Restrict to these column keys, in table order (default: every column). */\n columns?: readonly string[];\n}\n\n/** What {@link MkTable.getExportRows} returns: the rows and the columns to write them with. */\nexport interface MkTableExportRows<T> {\n /**\n * The rows in display order — sorted the way they are shown, tree children\n * flattened under their parent (expanded or not), selection applied when\n * `selectedOnly` was set.\n */\n rows: T[];\n /**\n * The columns in the table's current (user-reordered) order, restricted to\n * the requested keys, each with its header and formatter.\n */\n columns: MkCsvColumn<T>[];\n}\n\n/** Options for {@link MkTable.exportCsv}. */\nexport interface MkTableExportOptions extends MkCsvExportOptions, MkTableExportRowsOptions {\n /** Start the browser download (default `true`); `false` just returns the text. */\n download?: boolean;\n}\n\n/** Hard floor (px) for column resize when a column sets no `minWidth`. */\nconst MIN_COL_WIDTH = 60;\n/**\n * Row height (px) assumed by `virtual` until the first row is measured: the\n * comfortable density row — `--mk-space-3` padding twice around a\n * `--mk-font-size-sm` line, plus the 1px row border.\n */\nconst DEFAULT_ROW_HEIGHT = 44;\n/** Rows rendered before the viewport has been measured (SSR, first paint). */\nconst UNMEASURED_VIEWPORT_ROWS = 20;\n\nconst ISO_DAY = /^\\d{4}-\\d{2}-\\d{2}/;\n\n/** Local calendar day (`YYYY-MM-DD`) of a Date, ISO string or timestamp. */\nfunction dayKey(value: unknown): string | null {\n if (value == null || value === '') return null;\n if (typeof value === 'string' && ISO_DAY.test(value)) return value.slice(0, 10);\n const d = value instanceof Date ? value : new Date(value as string | number);\n if (Number.isNaN(d.getTime())) return null;\n const pad = (n: number): string => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\n/** Whether a filter value is a `{ min, max }` range rather than a single bound. */\nfunction isFilterRange(v: unknown): v is MkTableFilterRange<unknown> {\n return (\n typeof v === 'object' && v !== null && !(v instanceof Date) && ('min' in v || 'max' in v)\n );\n}\n\n/** `null`, `''` and empty ranges all mean \"no filter on this column\". */\nfunction isEmptyFilter(v: unknown): boolean {\n if (v == null || v === '') return true;\n if (isFilterRange(v)) return isEmptyFilter(v.min) && isEmptyFilter(v.max);\n return false;\n}\n\n/** Drop the empty entries of a filter map (`null` when nothing is left). */\nexport function mkCompactFilters(\n filters: MkTableFilters | null | undefined,\n): MkTableFilters | null {\n if (!filters) return null;\n const out: MkTableFilters = {};\n let any = false;\n for (const key of Object.keys(filters)) {\n if (isEmptyFilter(filters[key])) continue;\n out[key] = filters[key];\n any = true;\n }\n return any ? out : null;\n}\n/** Upper bound advertised on resize separators (`aria-valuemax`). */\nconst MAX_COL_WIDTH = 2000;\n\n/** One rendered tbody entry: either a group header or a data row. */\ntype MkTableItem<T> =\n | { kind: 'group'; group: MkTableGroup<T> }\n | {\n kind: 'row';\n row: T;\n /** Nesting depth in tree mode (0 for roots and for flat tables). */\n depth: number;\n /** Whether the row has child rows (tree mode). */\n hasChildren: boolean;\n /** Whether its children are currently shown (tree mode). */\n expanded: boolean;\n };\n\n/**\n * Table — a themed data table built on a native `<table>` for accessibility.\n * Supply `columns` and `data`; opt into sortable columns, sticky header,\n * zebra striping, hover and density. Sorting is fully keyboard operable\n * (Enter/Space on a header) and announces changes via {@link MkLiveAnnouncer}.\n * `virtual` windows the rows of very large tables; `filterable` adds a\n * per-column filter row (`[(filters)]`).\n *\n * ```html\n * <mk-table\n * [columns]=\"columns\"\n * [data]=\"rows()\"\n * stickyHeader\n * zebra\n * (sortChange)=\"onSort($event)\"\n * (rowClick)=\"open($event)\" />\n * ```\n */\n/**\n * Shared collator for string sorting. Created lazily at module scope rather\n * than as a `static` class field: a static initializer that *calls* something\n * stops Angular's build optimizer from marking the class IIFE as pure, which\n * pinned `MkTable` — and, through it, the whole table entry point — into every\n * bundle that imported any export of `@mk-kit/ui/table`.\n */\nlet collator: Intl.Collator | undefined;\nconst sortCollator = (): Intl.Collator => (collator ??= new Intl.Collator());\n\n@Component({\n selector: 'mk-table',\n templateUrl: './table.html',\n styleUrl: './table.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkCheckbox, NgTemplateOutlet],\n host: {\n class: 'mk-table',\n '[class.mk-table--sticky]': 'stickyHeader() || isVirtual()',\n '[class.mk-table--virtual]': 'isVirtual()',\n '[class.mk-table--filterable]': 'filterable() && !stacked()',\n '[class.mk-table--zebra]': 'zebra()',\n '[class.mk-table--hover]': 'hover()',\n '[class.mk-table--compact]': \"density() === 'compact'\",\n '[class.mk-table--clickable]': 'clickableRows()',\n '[class.mk-table--selectable]': 'selectable()',\n '[class.mk-table--expandable]': 'expandable()',\n '[class.mk-table--grouped]': 'groupBy() !== null',\n '[class.mk-table--stacked]': 'stacked()',\n },\n})\nexport class MkTable<T = Record<string, unknown>> {\n private readonly announcer = inject(MkLiveAnnouncer);\n protected readonly i18n = inject(MK_I18N);\n private readonly document = inject(DOCUMENT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly destroyRef = inject(DestroyRef);\n\n /**\n * True while the table is narrower than {@link stackAt} and rendering cards.\n *\n * Driven by the element's own width rather than the viewport's: the question\n * \"do these columns fit\" is about the space the table HAS, not the size of\n * the screen. A table in a sidebar or a dialog should stack while the window\n * around it is enormous.\n */\n protected readonly stacked = signal(false);\n\n constructor() {\n // Keep the sticky offsets (filter row under the header row, group headers\n // under the thead) in sync with the rendered heights — they shift with\n // density, sticky mode, the filter row and grouping itself.\n effect(() => {\n this.stickyHeader();\n this.density();\n this.groupBy();\n this.filterable();\n this.virtual();\n afterNextRender(\n { read: () => this.applyStickyOffsets() },\n { injector: this.injector },\n );\n });\n\n // Virtual mode: after every render that could change what is on screen,\n // read back the real row / detail heights and the viewport, so the\n // spacers and the window stay honest for whatever density is in force.\n afterRenderEffect({\n read: () => {\n if (!this.isVirtual()) return;\n this.windowRange();\n this.density();\n this.expandedKeys();\n const el = this.scroller()?.nativeElement;\n if (el) untracked(() => this.measureViewport(el));\n },\n });\n\n // Announce how many rows a change of filters left (the visible count).\n let firstFilters = true;\n effect(() => {\n this.filters();\n if (firstFilters) {\n firstFilters = false;\n return;\n }\n untracked(() => {\n if (!this.clientFilter()) return;\n this.announcer.announce(this.i18n.resultsCount(this.allRows().length));\n });\n });\n\n // Watch the host's width against `stackAt`. ResizeObserver rather than\n // matchMedia because the trigger is the element's width, not the window's.\n // Skipped entirely on the server and wherever the API is missing, leaving\n // `stacked` false — the grid is the safe fallback, since it renders the\n // same data with nothing dropped.\n afterNextRender(\n {\n read: () => {\n if (!this.isBrowser || typeof ResizeObserver === 'undefined') return;\n const el = this.host.nativeElement;\n const observer = new ResizeObserver(([entry]) => {\n const limit = this.stackAt();\n this.stacked.set(limit > 0 && entry.contentRect.width < limit);\n });\n observer.observe(el);\n // The scroller's height is the virtual viewport; the table grows or\n // shrinks when a density change re-sizes its rows.\n const scroller = this.scroller()?.nativeElement;\n const viewport = new ResizeObserver(() => {\n if (scroller && this.isVirtual()) this.measureViewport(scroller);\n });\n if (scroller) {\n viewport.observe(scroller);\n const table = scroller.querySelector('table');\n if (table) viewport.observe(table);\n }\n this.destroyRef.onDestroy(() => {\n observer.disconnect();\n viewport.disconnect();\n });\n },\n },\n { injector: this.injector },\n );\n }\n\n /**\n * Measures the header row and the thead and exposes them as the sticky\n * offsets of the filter row and of the group rows.\n */\n private applyStickyOffsets(): void {\n const host = this.host.nativeElement;\n const sticky = this.stickyHeader() || this.isVirtual();\n if (this.filterable()) {\n const headRow = host.querySelector('thead > tr');\n const h = sticky && headRow ? headRow.getBoundingClientRect().height : 0;\n host.style.setProperty('--_filter-top', `${Math.round(h)}px`);\n }\n if (this.groupBy() == null) return;\n const thead = host.querySelector('thead');\n const h = sticky && thead ? thead.getBoundingClientRect().height : 0;\n host.style.setProperty('--_group-top', `${Math.round(h)}px`);\n }\n\n /** Column definitions (order = display order). */\n readonly columns = input.required<MkTableColumn<T>[]>();\n /** Row objects to render. */\n readonly data = input<T[]>([]);\n /** Pin the header to the top of the scroll container. */\n readonly stickyHeader = input(false, { transform: booleanAttribute });\n /** Alternate row background for readability. */\n readonly zebra = input(false, { transform: booleanAttribute });\n /** Highlight rows on hover. */\n readonly hover = input(true, { transform: booleanAttribute });\n /** Row density. */\n readonly density = input<MkTableDensity>('comfortable');\n /**\n * Width in px below which each row renders as a CARD instead of a table row.\n * `0` (default) never stacks.\n *\n * Measured on the table's own container, not the viewport — a table in a\n * narrow sidebar should stack on a desktop, and a table on a tablet in\n * landscape should not. Per-column behaviour is set with\n * {@link MkTableColumn.stack}.\n *\n * A grid cannot survive a phone: eight columns become eight unreadable\n * slivers, and horizontal scrolling loses the row you were reading. Cards\n * keep one record together and put its header beside each value.\n */\n readonly stackAt = input(0, { transform: numberAttribute });\n /** Style rows as clickable and emit `rowClick`. */\n readonly clickableRows = input(false, { transform: booleanAttribute });\n /** Message shown when there are no rows. */\n readonly emptyMessage = input(this.i18n.noData);\n /** Render a leading checkbox column for row selection. */\n readonly selectable = input(false, { transform: booleanAttribute });\n /**\n * Two-way bound array of selected rows. Use `[(selected)]` to bind, or read\n * `selectionChange`. Rows are compared by {@link trackKey} when set, else by\n * referential identity.\n */\n readonly selected = model<T[]>([]);\n /**\n * Property name identifying a row for selection equality. When omitted rows\n * are matched by reference.\n */\n readonly trackKey = input<string>();\n\n /**\n * Optional per-row CSS class: called with each row, the returned string is\n * appended to the row's class list (falsy → none). For state the consumer\n * owns — an \"active in the side panel\" highlight, an unread accent — that\n * `selectable`'s own selected style doesn't cover.\n */\n readonly rowClass = input<((row: T) => string | null | undefined) | null>(\n null,\n );\n\n /** Resolved class for a row (empty string when no `rowClass` is set). */\n protected rowClassFor(row: T): string {\n return this.rowClass()?.(row) ?? '';\n }\n /**\n * Render a leading expander column. Each row can reveal a detail panel\n * supplied via an `<ng-template mkTableRowDetail let-row>`.\n */\n readonly expandable = input(false, { transform: booleanAttribute });\n /** Allow only one row expanded at a time (accordion). */\n readonly singleExpand = input(false, { transform: booleanAttribute });\n /** Enable drag-to-resize on columns marked `resizable` (data-grid pro). */\n readonly resizableColumns = input(false, { transform: booleanAttribute });\n /** Enable drag-to-reorder of column headers (data-grid pro). */\n readonly reorderableColumns = input(false, { transform: booleanAttribute });\n /**\n * Group rows by a column key or an accessor. Renders a collapsible group\n * header row (sticky, with a row count) above each group. Sorting still\n * applies within groups; groups follow their first row's sorted position.\n */\n readonly groupBy = input<string | ((row: T) => unknown) | null>(null);\n /** Formats a group header label; defaults to `String(value)`. */\n readonly groupLabel = input<\n ((value: unknown, rows: T[]) => string) | null\n >(null);\n\n // --- Virtualisation inputs -------------------------------------------------\n /**\n * Render only the rows in view (plus {@link overscan}) — for tables of\n * thousands of rows. The `<table>` scrolls inside its own box sized by\n * {@link height} / {@link maxHeight} (`max-height: 60vh` when neither is\n * set) with the header pinned; spacer rows keep the scrollbar honest.\n *\n * Works with sorting, selection (select-all still covers every row), tree\n * rows, grouping (group headers are rows too), expandable detail rows (their\n * height is measured once rendered; an unmeasured detail counts as one row)\n * and the header filter row. Falls back to the full render while stacked\n * into cards. Export and select-all always see every row, not the window.\n */\n readonly virtual = input(false, { transform: booleanAttribute });\n /**\n * Height (px) of one row in virtual mode. Leave unset to have it measured\n * from the first rendered row — which follows `density` and\n * `data-mk-density` automatically — starting from 44 (comfortable).\n */\n readonly rowHeight = input<number | null, unknown>(null, {\n transform: (v) => (v == null || v === '' ? null : numberAttribute(v)),\n });\n /** Rows rendered beyond each edge of the viewport in virtual mode. */\n readonly overscan = input(6, { transform: numberAttribute });\n /** Fixed height of the scroll box (CSS length, or px as a number). */\n readonly height = input<string | number | null>(null);\n /** Maximum height of the scroll box (CSS length, or px as a number). */\n readonly maxHeight = input<string | number | null>(null);\n\n // --- Filter row inputs -----------------------------------------------------\n /**\n * Render a second header row with a filter control per column — a text\n * box, a select, a number or a date field as the column's\n * {@link MkTableColumn.filter} says. Values live in {@link filters}.\n */\n readonly filterable = input(false, { transform: booleanAttribute });\n /**\n * The active filters, keyed by column key (`[(filters)]`; `filtersChange`\n * emits the whole map on every edit). Text filters hold the typed string,\n * select filters the chosen option value, number / date filters the lower\n * bound or a `{ min, max }` range. Set programmatically to pre-filter.\n */\n readonly filters = model<MkTableFilters>({});\n /**\n * Filter rows in the browser (default). Turn off when the server applies\n * the filters — `MkTableDataSource.setFilters($event)` on `filtersChange` —\n * so the page it returns is shown as-is.\n */\n readonly clientFilter = input(true, { transform: booleanAttribute });\n\n /** Emitted when the sort column/direction changes. */\n readonly sortChange = output<MkSortChange>();\n /** Emitted when a row is clicked (enable via `clickableRows`). */\n readonly rowClick = output<T>();\n /** Emitted with the new selection whenever it changes (enable via `selectable`). */\n readonly selectionChange = output<T[]>();\n /** Emitted with the currently expanded rows whenever they change. */\n readonly expandedChange = output<T[]>();\n /** Emitted when a column is resized (px). */\n readonly columnResize = output<MkColumnResize>();\n /** Emitted with the new column key order after a reorder. */\n readonly columnReorder = output<string[]>();\n /** Emitted when an inline-editable cell is saved. */\n readonly cellEdit = output<MkCellEdit<T>>();\n /** Emitted when a group header is expanded or collapsed. */\n readonly groupToggle = output<MkGroupToggle>();\n /**\n * Tree rows: the property on each row holding its child rows (`T[]`). When\n * set, the table renders a tree grid — child rows are indented under their\n * parent behind an expand toggle in the first column, sorting applies per\n * sibling group, and ArrowRight / ArrowLeft on a row open / close it.\n */\n readonly childrenKey = input<string | null>(null);\n /** Emitted when a parent row is expanded or collapsed (tree mode). */\n readonly treeToggle = output<MkTreeToggle<T>>();\n\n /** User-set column widths (px), keyed by column key. */\n private readonly colWidths = signal<Record<string, number>>({});\n /** User-set column order (keys); `null` = the input order. */\n private readonly colOrder = signal<string[] | null>(null);\n /** The cell currently being inline-edited. */\n protected readonly editing = signal<{ index: number; key: string } | null>(\n null,\n );\n\n /** Columns in display order, honouring any user reordering. */\n protected readonly orderedColumns = computed<MkTableColumn<T>[]>(() => {\n const cols = this.columns();\n const order = this.colOrder();\n if (!order) return cols;\n const byKey = new Map(cols.map((c) => [c.key, c]));\n const ordered = order.map((k) => byKey.get(k)).filter((c): c is MkTableColumn<T> => !!c);\n // Append any columns not present in the saved order (e.g. newly added).\n const seen = new Set(order);\n for (const c of cols) if (!seen.has(c.key)) ordered.push(c);\n return ordered;\n });\n\n // ── Stacked (card) layout ────────────────────────────────────────────────\n // Three slots, so a card reads as a record rather than as a form: a heading\n // line, labelled fields, and actions along the bottom. Columns keep their\n // configured order within each slot.\n\n /** Columns forming the card's heading line. */\n protected readonly stackTitleColumns = computed(() =>\n this.orderedColumns().filter((c) => c.stack === 'title'),\n );\n /** Columns rendered as `label / value` rows in the card body. */\n protected readonly stackFieldColumns = computed(() =>\n this.orderedColumns().filter((c) => !c.stack),\n );\n /** Columns pinned to the bottom of the card, unlabelled. */\n protected readonly stackFooterColumns = computed(() =>\n this.orderedColumns().filter((c) => c.stack === 'footer'),\n );\n\n /**\n * Whether a stacked cell should show its column header as a label.\n *\n * An empty header means the column never had a name to show — an actions or\n * chevron column — and an empty label box would just be a gap the reader has\n * to account for.\n */\n protected hasStackLabel(col: MkTableColumn<T>): boolean {\n return !!col.header?.trim();\n }\n\n /** The rendered width for a column, if the user resized it. */\n protected colStyleWidth(col: MkTableColumn<T>): string | null {\n // A card has one column, so a per-column width — configured or dragged —\n // would pin the value box to a grid width that no longer exists.\n if (this.stacked()) return null;\n const w = this.colWidths()[col.key];\n if (w != null) return `${w}px`;\n return col.width ?? null;\n }\n\n /** Sticky offsets for every pinned column, computed once per layout change. */\n private readonly pinnedOffsets = computed<Map<string, number>>(() => {\n const map = new Map<string, number>();\n const cols = this.orderedColumns();\n const widths = this.colWidths();\n // Account for the leading select / expander columns at the inline start.\n let left = (this.selectable() ? 44 : 0) + (this.expandable() ? 44 : 0);\n for (const c of cols) {\n if (c.pinned !== 'left') continue;\n map.set(c.key, left);\n left += widths[c.key] ?? this.numericWidth(c);\n }\n let right = 0;\n for (let i = cols.length - 1; i >= 0; i--) {\n const c = cols[i];\n if (c.pinned !== 'right') continue;\n map.set(c.key, right);\n right += widths[c.key] ?? this.numericWidth(c);\n }\n return map;\n });\n\n /** Sticky offset (px) for a pinned column. */\n protected pinnedOffset(col: MkTableColumn<T>): number {\n return this.pinnedOffsets().get(col.key) ?? 0;\n }\n\n /** Pinning freezes a column against horizontal scroll. Cards do not scroll\n * sideways, so both the class and its inline offset are suppressed. */\n protected isPinned(col: MkTableColumn<T>, side: 'left' | 'right'): boolean {\n return !this.stacked() && col.pinned === side;\n }\n\n private numericWidth(col: MkTableColumn<T>): number {\n const w = col.width ? parseInt(col.width, 10) : NaN;\n return Number.isFinite(w) ? w : 150;\n }\n\n // --- Column resize --------------------------------------------------------\n private resizeKey: string | null = null;\n private resizeStartX = 0;\n private resizeStartW = 0;\n private resizeMin = MIN_COL_WIDTH;\n /** +1 in LTR, -1 in RTL — dragging toward the inline-end always widens. */\n private resizeSign: 1 | -1 = 1;\n\n /** Whether the table currently renders right-to-left (SSR-safe). */\n private isRtl(): boolean {\n const view = this.document.defaultView;\n if (!view) return false;\n return view.getComputedStyle(this.host.nativeElement).direction === 'rtl';\n }\n\n private resizeRaf: number | null = null;\n private pendingResizeX = 0;\n\n /** Begin a drag-resize from a header handle. */\n protected startResize(event: PointerEvent, col: MkTableColumn<T>): void {\n if (!this.resizableColumns() || !col.resizable) return;\n event.preventDefault();\n event.stopPropagation();\n const th = (event.target as HTMLElement).closest('th') as HTMLElement | null;\n this.resizeKey = col.key;\n this.resizeStartX = event.clientX;\n this.resizeSign = this.isRtl() ? -1 : 1;\n this.resizeStartW =\n this.colWidths()[col.key] ?? th?.getBoundingClientRect().width ?? this.numericWidth(col);\n this.resizeMin = col.minWidth ?? MIN_COL_WIDTH;\n this.document.addEventListener('pointermove', this.onResizeMove);\n this.document.addEventListener('pointerup', this.onResizeEnd);\n this.document.addEventListener('pointercancel', this.onResizeEnd);\n }\n\n /** rAF-coalesced: at most one width write (and CD pass) per frame. */\n private readonly onResizeMove = (event: PointerEvent): void => {\n if (!this.resizeKey) return;\n this.pendingResizeX = event.clientX;\n if (this.resizeRaf != null) return;\n this.resizeRaf = this.document.defaultView?.requestAnimationFrame(() => {\n this.resizeRaf = null;\n this.applyPendingResize();\n }) ?? null;\n };\n\n private applyPendingResize(): void {\n if (!this.resizeKey) return;\n const width = Math.max(\n this.resizeMin,\n Math.round(\n this.resizeStartW +\n this.resizeSign * (this.pendingResizeX - this.resizeStartX),\n ),\n );\n this.colWidths.update((w) => ({ ...w, [this.resizeKey as string]: width }));\n }\n\n private readonly onResizeEnd = (): void => {\n if (this.resizeRaf != null) {\n // Flush (don't drop) the last pending move so a fast drag lands exactly.\n this.document.defaultView?.cancelAnimationFrame(this.resizeRaf);\n this.resizeRaf = null;\n this.applyPendingResize();\n }\n if (this.resizeKey) {\n const col = this.columns().find((c) => c.key === this.resizeKey);\n const width =\n this.colWidths()[this.resizeKey] ?? Math.round(this.resizeStartW);\n this.columnResize.emit({ key: this.resizeKey, width });\n if (col) this.announcer.announce(this.i18n.columnWidth(col.header, width));\n }\n this.resizeKey = null;\n this.document.removeEventListener('pointermove', this.onResizeMove);\n this.document.removeEventListener('pointerup', this.onResizeEnd);\n this.document.removeEventListener('pointercancel', this.onResizeEnd);\n };\n\n /** Keyboard column resize on the focused separator (APG window splitter). */\n protected onResizeKeydown(event: KeyboardEvent, col: MkTableColumn<T>): void {\n if (!this.resizableColumns() || !col.resizable) return;\n const step = event.shiftKey ? 1 : 10;\n let delta = 0;\n if (event.key === 'ArrowLeft') delta = -step;\n else if (event.key === 'ArrowRight') delta = step;\n else return;\n // Mirror in RTL so pressing toward the inline-end always grows the column.\n if (this.isRtl()) delta = -delta;\n event.preventDefault();\n event.stopPropagation();\n const min = col.minWidth ?? MIN_COL_WIDTH;\n const th = (event.target as HTMLElement).closest('th');\n const current =\n this.colWidths()[col.key] ??\n th?.getBoundingClientRect().width ??\n this.numericWidth(col);\n const width = Math.max(min, Math.round(current + delta));\n this.colWidths.update((w) => ({ ...w, [col.key]: width }));\n this.columnResize.emit({ key: col.key, width });\n this.announcer.announce(this.i18n.columnWidth(col.header, width));\n }\n\n /** The current width of a column, for the separator's aria-valuenow. */\n protected resizeValueNow(col: MkTableColumn<T>): number {\n return Math.round(this.colWidths()[col.key] ?? this.numericWidth(col));\n }\n\n /** The resize floor for a column, for the separator's aria-valuemin. */\n protected resizeValueMin(col: MkTableColumn<T>): number {\n return col.minWidth ?? MIN_COL_WIDTH;\n }\n\n /** Advertised resize ceiling (aria-valuemax) — a sane constant bound. */\n protected readonly resizeValueMax = MAX_COL_WIDTH;\n\n ngOnDestroy(): void {\n if (this.resizeRaf != null) {\n this.document.defaultView?.cancelAnimationFrame(this.resizeRaf);\n this.resizeRaf = null;\n }\n this.document.removeEventListener('pointermove', this.onResizeMove);\n this.document.removeEventListener('pointerup', this.onResizeEnd);\n this.document.removeEventListener('pointercancel', this.onResizeEnd);\n }\n\n // --- Column reorder (native drag) -----------------------------------------\n protected readonly dragKey = signal<string | null>(null);\n\n protected onColDragStart(event: DragEvent, col: MkTableColumn<T>): void {\n if (!this.reorderableColumns()) return;\n this.dragKey.set(col.key);\n event.dataTransfer?.setData('text/plain', col.key);\n if (event.dataTransfer) event.dataTransfer.effectAllowed = 'move';\n }\n\n protected onColDragOver(event: DragEvent): void {\n if (this.reorderableColumns() && this.dragKey()) event.preventDefault();\n }\n\n protected onColDrop(event: DragEvent, target: MkTableColumn<T>): void {\n const from = this.dragKey();\n this.dragKey.set(null);\n if (!from || from === target.key) return;\n event.preventDefault();\n const order = this.orderedColumns().map((c) => c.key);\n const toIdx = order.indexOf(target.key);\n this.moveColumn(from, toIdx);\n }\n\n protected onColDragEnd(): void {\n this.dragKey.set(null);\n }\n\n /** Move a column to `toIdx` in the display order and announce it. */\n private moveColumn(key: string, toIdx: number): void {\n const order = this.orderedColumns().map((c) => c.key);\n const fromIdx = order.indexOf(key);\n if (fromIdx < 0 || toIdx < 0 || toIdx >= order.length || fromIdx === toIdx) {\n return;\n }\n order.splice(toIdx, 0, order.splice(fromIdx, 1)[0]);\n this.colOrder.set(order);\n this.columnReorder.emit(order);\n const col = this.columns().find((c) => c.key === key);\n if (col) {\n this.announcer.announce(\n this.i18n.columnMoved(col.header, toIdx + 1, order.length),\n );\n }\n }\n\n /** Keyboard column reorder: Alt+Arrow moves the focused header. */\n protected onReorderKeydown(event: KeyboardEvent, col: MkTableColumn<T>): void {\n if (!this.reorderableColumns() || col.pinned || !event.altKey) return;\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n // Swallow the combo even when the move is a no-op (first column moved\n // further left, last moved right) — otherwise Alt+Arrow falls through to\n // the browser's history Back/Forward and navigates away from the grid.\n event.preventDefault();\n const order = this.orderedColumns().map((c) => c.key);\n const idx = order.indexOf(col.key);\n if (event.key === 'ArrowLeft' && idx > 0) {\n this.moveColumn(col.key, idx - 1);\n } else if (event.key === 'ArrowRight' && idx < order.length - 1) {\n this.moveColumn(col.key, idx + 1);\n }\n }\n\n // --- Inline cell edit -----------------------------------------------------\n protected isEditing(index: number, col: MkTableColumn<T>): boolean {\n const e = this.editing();\n return !!e && e.index === index && e.key === col.key;\n }\n\n /** The cell element being edited, so focus can be restored after. */\n private editingCell: HTMLElement | null = null;\n\n /** The inline-edit input, focused once it renders. */\n private readonly editInput =\n viewChild<ElementRef<HTMLInputElement>>('editInput');\n\n protected startEdit(index: number, col: MkTableColumn<T>, event?: Event): void {\n if (!col.editable) return;\n event?.stopPropagation();\n this.editingCell =\n ((event?.target as HTMLElement | null)?.closest('td') as HTMLElement | null) ??\n null;\n this.editing.set({ index, key: col.key });\n // Explicit focus once the input exists — a dynamically inserted\n // `autofocus` attribute is not honoured after initial page load.\n afterNextRender(() => this.editInput()?.nativeElement.focus(), {\n injector: this.injector,\n });\n }\n\n /** Keyboard path into edit mode (Enter / F2 on a focused editable cell). */\n protected onCellKeydown(\n event: KeyboardEvent,\n index: number,\n col: MkTableColumn<T>,\n ): void {\n if (!col.editable || this.isEditing(index, col)) return;\n if (event.key === 'Enter' || event.key === 'F2') {\n event.preventDefault();\n event.stopPropagation();\n this.startEdit(index, col, event);\n }\n }\n\n protected commitEdit(\n row: T,\n col: MkTableColumn<T>,\n value: string,\n restoreFocus = false,\n ): void {\n this.editing.set(null);\n this.cellEdit.emit({ row, key: col.key, value });\n this.announcer.announce(this.i18n.cellSaved(value));\n if (restoreFocus) this.editingCell?.focus();\n this.editingCell = null;\n }\n\n protected cancelEdit(restoreFocus = false): void {\n this.editing.set(null);\n if (restoreFocus) this.editingCell?.focus();\n this.editingCell = null;\n }\n\n protected onEditKeydown(\n event: KeyboardEvent,\n row: T,\n col: MkTableColumn<T>,\n ): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.commitEdit(row, col, (event.target as HTMLInputElement).value, true);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.cancelEdit(true);\n }\n }\n\n /** The projected row-detail template (enable via `expandable`). */\n protected readonly rowDetail = contentChild(MkTableRowDetail);\n\n /** Per-column cell templates, projected as `<ng-template mkTableCell=\"key\">`. */\n private readonly cellTemplates = contentChildren(MkTableCell);\n private readonly cellTemplateByKey = computed(() => {\n const map = new Map<string, MkTableCell>();\n for (const t of this.cellTemplates()) map.set(t.mkTableCell(), t);\n return map;\n });\n\n /** The template registered for a column, or null to fall back to text. */\n protected cellTemplateFor(key: string) {\n return this.cellTemplateByKey().get(key)?.template ?? null;\n }\n\n private readonly sortKey = signal<string | null>(null);\n private readonly sortDir = signal<Exclude<MkSortDirection, 'none'> | null>(\n null,\n );\n /** Stable id prefix so each detail row can be referenced by aria-controls. */\n private readonly detailIdBase = mkUniqueId('mk-table-detail');\n\n /** Total rendered columns, including the select and expander columns. */\n protected readonly totalColumns = computed(\n () =>\n this.columns().length +\n (this.selectable() ? 1 : 0) +\n (this.expandable() ? 1 : 0),\n );\n\n /**\n * Shared locale-sensitive collator for string sorting. `localeCompare`\n * re-resolves locale data on every call; one cached `Intl.Collator` makes\n * large-table sorts several-fold faster with the same default-locale order.\n */\n /** Data sorted by the active column, or the input order when unsorted. */\n protected readonly sortedData = computed<T[]>(() =>\n this.sortRows(this.filteredData()),\n );\n\n // --- Filtering ---------------------------------------------------------------\n /** The filter control a column renders, or `null` for none. */\n protected filterKind(col: MkTableColumn<T>): MkTableFilterKind | null {\n if (col.filter === false) return null;\n return col.filter ?? 'text';\n }\n\n /** One predicate per active filter, or `null` when nothing is filtered. */\n private readonly rowPredicate = computed<((row: T) => boolean) | null>(() => {\n if (!this.clientFilter()) return null;\n const filters = this.filters();\n const tests: ((row: T) => boolean)[] = [];\n for (const col of this.columns()) {\n const value = filters[col.key];\n if (col.filter === false || isEmptyFilter(value)) continue;\n tests.push(this.columnTest(col, value));\n }\n if (!tests.length) return null;\n return (row) => tests.every((test) => test(row));\n });\n\n /** Build the predicate for one column's filter value. */\n private columnTest(col: MkTableColumn<T>, value: unknown): (row: T) => boolean {\n const raw = (row: T): unknown => (row as Record<string, unknown>)[col.key];\n switch (col.filter) {\n case 'select': {\n const wanted = String(value);\n return (row) => String(raw(row) ?? '') === wanted;\n }\n case 'number': {\n const [lo, hi] = isFilterRange(value) ? [value.min, value.max] : [value, null];\n const min = isEmptyFilter(lo) ? null : Number(lo);\n const max = isEmptyFilter(hi) ? null : Number(hi);\n return (row) => {\n const v = raw(row);\n const n = typeof v === 'number' ? v : Number(v);\n if (v == null || v === '' || Number.isNaN(n)) return false;\n return (min == null || n >= min) && (max == null || n <= max);\n };\n }\n case 'date': {\n const [lo, hi] = isFilterRange(value) ? [value.min, value.max] : [value, null];\n const min = dayKey(lo);\n const max = dayKey(hi);\n return (row) => {\n const day = dayKey(raw(row));\n if (!day) return false;\n return (!min || day >= min) && (!max || day <= max);\n };\n }\n default: {\n const needle = String(value).trim().toLowerCase();\n if (!needle) return () => true;\n return (row) => this.cellText(row, col).toLowerCase().includes(needle);\n }\n }\n }\n\n /**\n * Tree mode: which rows survive the filters — a row is kept when it matches\n * or any descendant does, so a matching child keeps its parents.\n */\n private readonly treeKeep = computed<Map<T, boolean>>(() => {\n const keep = this.rowPredicate();\n const map = new Map<T, boolean>();\n if (!keep || !this.childrenKey()) return map;\n const walk = (row: T): boolean => {\n let any = keep(row);\n for (const child of this.childrenOf(row)) if (walk(child)) any = true;\n map.set(row, any);\n return any;\n };\n for (const row of this.data()) walk(row);\n return map;\n });\n\n /** The input rows with the active filters applied (input order). */\n private readonly filteredData = computed<T[]>(() => {\n const keep = this.rowPredicate();\n const data = this.data();\n if (!keep) return data;\n if (!this.childrenKey()) return data.filter(keep);\n const kept = this.treeKeep();\n return data.filter((row) => kept.get(row) === true);\n });\n\n /** The child rows of `row` that survive the filters (tree mode). */\n private visibleChildrenOf(row: T): T[] {\n const children = this.childrenOf(row);\n if (!children.length || !this.rowPredicate()) return children;\n const kept = this.treeKeep();\n return children.filter((child) => kept.get(child) === true);\n }\n\n /** Options of every `select` filter, keyed by column (derived when unset). */\n private readonly selectOptions = computed<Map<string, MkTableFilterOption[]>>(() => {\n const map = new Map<string, MkTableFilterOption[]>();\n for (const col of this.columns()) {\n if (col.filter !== 'select') continue;\n if (col.filterOptions) {\n map.set(\n col.key,\n col.filterOptions.map((o) =>\n typeof o === 'object' ? o : { value: o, label: String(o) },\n ),\n );\n continue;\n }\n const seen = new Map<string, unknown>();\n const walk = (rows: T[]): void => {\n for (const row of rows) {\n const v = (row as Record<string, unknown>)[col.key];\n if (v != null && v !== '') seen.set(String(v), v);\n walk(this.childrenOf(row));\n }\n };\n walk(this.data());\n map.set(\n col.key,\n [...seen.entries()]\n .sort(([a], [b]) => sortCollator().compare(a, b))\n .map(([label, value]) => ({ value, label })),\n );\n }\n return map;\n });\n\n /** The options a column's select filter offers. */\n protected filterOptionsFor(col: MkTableColumn<T>): MkTableFilterOption[] {\n return this.selectOptions().get(col.key) ?? [];\n }\n\n /** Whether `option` is the column's current select-filter value. */\n protected isFilterOption(col: MkTableColumn<T>, option: MkTableFilterOption): boolean {\n const v = this.filters()[col.key];\n return !isEmptyFilter(v) && String(v) === String(option.value);\n }\n\n /** Whether a column has an active filter. */\n protected hasFilter(key: string): boolean {\n return !isEmptyFilter(this.filters()[key]);\n }\n\n /** The text a column's filter box shows (a range shows its lower bound). */\n protected filterText(key: string): string {\n const v = this.filters()[key];\n if (isEmptyFilter(v)) return '';\n const shown = isFilterRange(v) ? v.min : v;\n if (shown instanceof Date) return dayKey(shown) ?? '';\n return shown == null ? '' : String(shown);\n }\n\n /** Accessible name of a column's filter control. */\n protected filterLabel(col: MkTableColumn<T>): string {\n return this.i18n.filterColumn(col.header || col.key);\n }\n\n /** Placeholder of a column's filter control. */\n protected filterPlaceholder(col: MkTableColumn<T>): string {\n if (col.filterPlaceholder != null) return col.filterPlaceholder;\n return this.filterKind(col) === 'text' ? this.i18n.filter : this.i18n.filterMin;\n }\n\n /**\n * Set one column's filter (`null` / `''` clears it). Updates\n * {@link filters} and emits `filtersChange`; a no-op when unchanged.\n */\n setFilter(key: string, value: unknown): void {\n const current = this.filters();\n const empty = isEmptyFilter(value);\n if (empty ? !(key in current) : Object.is(current[key], value)) return;\n const next = { ...current };\n if (empty) delete next[key];\n else next[key] = value;\n this.filters.set(next);\n }\n\n /** Clear one column's filter. */\n clearFilter(key: string): void {\n this.setFilter(key, null);\n }\n\n /** Clear every filter. */\n clearFilters(): void {\n if (Object.keys(this.filters()).length) this.filters.set({});\n }\n\n /** Text / number / date filter box input. */\n protected onFilterInput(col: MkTableColumn<T>, event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n if (col.filter === 'number') {\n const n = text === '' ? NaN : Number(text);\n this.setFilter(col.key, Number.isNaN(n) ? null : n);\n } else {\n this.setFilter(col.key, text);\n }\n }\n\n /** Select filter change: map the option string back to its original value. */\n protected onFilterSelect(col: MkTableColumn<T>, event: Event): void {\n const chosen = (event.target as HTMLSelectElement).value;\n const option = this.filterOptionsFor(col).find((o) => String(o.value) === chosen);\n this.setFilter(col.key, chosen === '' || !option ? null : option.value);\n }\n\n /** Escape in a filter box clears that filter (and stays in the box). */\n protected onFilterKeydown(col: MkTableColumn<T>, event: KeyboardEvent): void {\n if (event.key !== 'Escape' || !this.hasFilter(col.key)) return;\n event.preventDefault();\n event.stopPropagation();\n this.clearFilter(col.key);\n }\n\n /** Header rows above the body (for `aria-rowindex`). */\n protected readonly headerRows = computed(\n () => 1 + (this.filterable() && !this.stacked() ? 1 : 0),\n );\n\n /** Sort one sibling group by the active column (input order when unsorted). */\n private sortRows(rows: T[]): T[] {\n const key = this.sortKey();\n const dir = this.sortDir();\n if (!key || !dir) return rows;\n const compare = (a: T, b: T): number => {\n const av = (a as Record<string, unknown>)[key];\n const bv = (b as Record<string, unknown>)[key];\n if (av == null && bv == null) return 0;\n if (av == null) return -1;\n if (bv == null) return 1;\n if (typeof av === 'number' && typeof bv === 'number') return av - bv;\n return sortCollator().compare(String(av), String(bv));\n };\n // Negate the comparator for desc (instead of reversing) so the sort stays\n // stable and null ordering is consistent in both directions.\n return [...rows].sort(dir === 'desc' ? (a, b) => -compare(a, b) : compare);\n }\n\n /** `aria-sort` value for a header cell. */\n protected ariaSort(col: MkTableColumn<T>): string | null {\n if (!col.sortable) return null;\n if (this.sortKey() !== col.key) return 'none';\n return this.sortDir() === 'asc' ? 'ascending' : 'descending';\n }\n\n /** Glyph indicating a column's sort state. */\n protected sortGlyph(col: MkTableColumn<T>): string {\n if (this.sortKey() !== col.key) return '↕';\n return this.sortDir() === 'asc' ? '↑' : '↓';\n }\n\n /** Raw cell value, handed to an `[mkTableCell]` template unformatted. */\n protected cellValue(row: T, col: MkTableColumn<T>): unknown {\n return (row as Record<string, unknown>)[col.key];\n }\n\n /** Rendered text for a cell, applying the column formatter if present. */\n protected cellText(row: T, col: MkTableColumn<T>): string {\n const raw = (row as Record<string, unknown>)[col.key];\n if (col.format) return col.format(raw, row);\n return raw == null ? '' : String(raw);\n }\n\n protected onSort(col: MkTableColumn<T>): void {\n if (!col.sortable) return;\n let direction: MkSortDirection;\n if (this.sortKey() !== col.key) {\n this.sortKey.set(col.key);\n this.sortDir.set('asc');\n direction = 'asc';\n } else if (this.sortDir() === 'asc') {\n this.sortDir.set('desc');\n direction = 'desc';\n } else {\n // desc -> cleared\n this.sortKey.set(null);\n this.sortDir.set(null);\n direction = 'none';\n }\n this.sortChange.emit({ key: col.key, direction });\n this.announcer.announce(\n direction === 'none'\n ? this.i18n.sortingCleared(col.header)\n : this.i18n.sortedBy(col.header, direction),\n );\n }\n\n protected onRowClick(row: T): void {\n if (this.clickableRows()) this.rowClick.emit(row);\n }\n\n /** Keyboard activation for clickable rows (Enter / Space) and tree keys. */\n protected onRowKeydown(event: KeyboardEvent, row: T): void {\n if (this.onTreeKeydown(event, row)) return;\n if (!this.clickableRows()) return;\n if (event.target !== event.currentTarget) return; // ignore inner controls\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.rowClick.emit(row);\n }\n }\n\n /** Stable row identity for `@for` tracking (trackKey when set, else the row). */\n protected trackRow = (row: T): unknown => this.rowKey(row);\n\n /** Leading cell text used to label per-row controls for screen readers. */\n protected rowLabel(row: T): string {\n const first = this.orderedColumns()[0];\n return first ? this.cellText(row, first) : '';\n }\n\n // --- Selection ------------------------------------------------------------\n private rowKey(row: T): unknown {\n const key = this.trackKey();\n return key ? (row as Record<string, unknown>)[key] : row;\n }\n\n /** Selected row keys as a Set — O(1) membership per cell per CD pass. */\n private readonly selectedKeys = computed<Set<unknown>>(\n () => new Set(this.selected().map((r) => this.rowKey(r))),\n );\n\n /** Whether `row` is currently selected. */\n protected isSelected(row: T): boolean {\n return this.selectedKeys().has(this.rowKey(row));\n }\n\n /**\n * Every data row, in display order, ignoring tree expansion — what\n * \"select all\" and the header checkbox reason about. Equals `sortedData`\n * for flat tables.\n */\n private readonly allRows = computed<T[]>(() => {\n if (!this.childrenKey()) return this.sortedData();\n const out: T[] = [];\n const walk = (rows: T[]): void => {\n for (const row of this.sortRows(rows)) {\n out.push(row);\n walk(this.visibleChildrenOf(row));\n }\n };\n walk(this.filteredData());\n return out;\n });\n\n /** True when every visible row is selected. */\n protected readonly allSelected = computed<boolean>(() => {\n const rows = this.allRows();\n const keys = this.selectedKeys();\n return rows.length > 0 && rows.every((row) => keys.has(this.rowKey(row)));\n });\n\n /** True when some — but not all — visible rows are selected. */\n protected readonly someSelected = computed<boolean>(() => {\n const keys = this.selectedKeys();\n return (\n this.allRows().some((row) => keys.has(this.rowKey(row))) &&\n !this.allSelected()\n );\n });\n\n private commitSelection(next: T[]): void {\n this.selected.set(next);\n this.selectionChange.emit(next);\n }\n\n /** Toggle a single row's selection without triggering `rowClick`. */\n protected toggleRow(row: T): void {\n const rk = this.rowKey(row);\n const current = this.selected();\n const next = this.selectedKeys().has(rk)\n ? current.filter((r) => this.rowKey(r) !== rk)\n : [...current, row];\n this.commitSelection(next);\n }\n\n /** Select or deselect all rows (every tree row, expanded or not). */\n protected toggleAll(): void {\n const rows = this.allRows();\n const current = this.selected();\n if (this.allSelected()) {\n const visible = new Set(rows.map((r) => this.rowKey(r)));\n this.commitSelection(current.filter((r) => !visible.has(this.rowKey(r))));\n } else {\n const has = new Set(current.map((r) => this.rowKey(r)));\n this.commitSelection([\n ...current,\n ...rows.filter((r) => !has.has(this.rowKey(r))),\n ]);\n }\n }\n\n // --- Grouping ---------------------------------------------------------------\n /** Group values currently collapsed. */\n private readonly collapsedGroups = signal<Set<unknown>>(new Set());\n\n /** Rows grouped by {@link groupBy}, or `null` when grouping is off. */\n protected readonly groups = computed<MkTableGroup<T>[] | null>(() => {\n const by = this.groupBy();\n if (by == null) return null;\n const accessor =\n typeof by === 'function'\n ? by\n : (row: T) => (row as Record<string, unknown>)[by];\n const map = new Map<unknown, T[]>();\n for (const row of this.sortedData()) {\n const key = accessor(row);\n const bucket = map.get(key);\n if (bucket) bucket.push(row);\n else map.set(key, [row]);\n }\n const label = this.groupLabel();\n return [...map.entries()].map(([key, rows]) => ({\n key,\n label: label ? label(key, rows) : String(key),\n rows,\n }));\n });\n\n /**\n * The tbody render list: group headers interleaved with their (expanded)\n * rows when grouping is on, else just the sorted rows.\n */\n protected readonly displayItems = computed<MkTableItem<T>[]>(() => {\n const groups = this.groups();\n const items: MkTableItem<T>[] = [];\n if (!groups) {\n this.pushRows(items, this.sortedData(), 0);\n return items;\n }\n const collapsed = this.collapsedGroups();\n for (const group of groups) {\n items.push({ kind: 'group', group });\n if (!collapsed.has(group.key)) this.pushRows(items, group.rows, 0);\n }\n return items;\n });\n\n /**\n * Append `rows` as render items. In tree mode each row is followed by its\n * (sorted) children while it is expanded, one level deeper.\n */\n private pushRows(items: MkTableItem<T>[], rows: T[], depth: number): void {\n const tree = !!this.childrenKey();\n const expandedKeys = this.treeExpanded();\n for (const row of rows) {\n const children = tree ? this.visibleChildrenOf(row) : [];\n const hasChildren = children.length > 0;\n const expanded = hasChildren && expandedKeys.has(this.rowKey(row));\n items.push({ kind: 'row', row, depth, hasChildren, expanded });\n if (expanded) this.pushRows(items, this.sortRows(children), depth + 1);\n }\n }\n\n /** The child rows of `row` (tree mode), or an empty list. */\n private childrenOf(row: T): T[] {\n const key = this.childrenKey();\n if (!key) return [];\n const value = (row as Record<string, unknown>)[key];\n return Array.isArray(value) ? (value as T[]) : [];\n }\n\n // --- Row virtualisation -------------------------------------------------------\n // Own windowing rather than `mk-virtual-scroll` from `@mk-kit/ui/data`: the\n // rows must stay real `<tr>`s inside the one `<table>` (column widths,\n // sticky header, selection, a11y), the window has to know about group and\n // detail rows, and importing the data entry point would drag ~680 KiB of\n // unrelated components into every table consumer's dependency graph.\n\n /** The scroll box around the table. */\n private readonly scroller = viewChild<ElementRef<HTMLElement>>('scroller');\n\n /** Virtual mode in force (cards always render in full). */\n protected readonly isVirtual = computed(() => this.virtual() && !this.stacked());\n\n /** Current scroll offset of the scroll box (virtual mode). */\n private readonly scrollTop = signal(0);\n /** Measured height of the scroll box (0 until measured / on the server). */\n private readonly viewportHeight = signal(0);\n /** Measured height of the thead — the sticky header hides that much of the top. */\n private readonly headHeight = signal(0);\n /** Row height read back from the first rendered row. */\n private readonly measuredRowHeight = signal<number | null>(null);\n /** Measured heights of expanded detail rows, by row key. */\n private readonly detailHeights = signal<Map<unknown, number>>(new Map());\n\n /** The row height virtual mode lays rows out with. */\n protected readonly effectiveRowHeight = computed(\n () => this.rowHeight() ?? this.measuredRowHeight() ?? DEFAULT_ROW_HEIGHT,\n );\n\n private cssLength(v: string | number | null): string | null {\n if (v == null || v === '') return null;\n return typeof v === 'number' ? `${v}px` : v;\n }\n\n /** `height` of the scroll box. */\n protected readonly scrollHeight = computed(() => this.cssLength(this.height()));\n /** `max-height` of the scroll box (60vh in virtual mode with no size given). */\n protected readonly scrollMaxHeight = computed(() => {\n const max = this.cssLength(this.maxHeight());\n if (max) return max;\n return this.isVirtual() && this.height() == null ? '60vh' : null;\n });\n\n /**\n * Top offset of every display item, or `null` while every item is exactly\n * one row tall (the common case — then offsets are plain multiplication).\n * Only expanded detail rows make heights vary.\n */\n private readonly itemOffsets = computed<Float64Array | null>(() => {\n if (!this.isVirtual() || !this.expandable() || !this.rowDetail()) return null;\n const expanded = this.expandedKeys();\n if (!expanded.size) return null;\n const items = this.displayItems();\n const rh = this.effectiveRowHeight();\n const details = this.detailHeights();\n const offsets = new Float64Array(items.length + 1);\n let y = 0;\n for (let i = 0; i < items.length; i++) {\n offsets[i] = y;\n y += rh;\n const item = items[i];\n if (item.kind === 'row') {\n const key = this.rowKey(item.row);\n if (expanded.has(key)) y += details.get(key) ?? rh;\n }\n }\n offsets[items.length] = y;\n return offsets;\n });\n\n /** Full height of the body, spacers included. */\n private readonly totalHeight = computed(() => {\n const offsets = this.itemOffsets();\n if (offsets) return offsets[offsets.length - 1];\n return this.displayItems().length * this.effectiveRowHeight();\n });\n\n /** Top offset (px) of display item `index`. */\n private offsetOf(index: number): number {\n const offsets = this.itemOffsets();\n return offsets\n ? offsets[Math.min(index, offsets.length - 1)]\n : index * this.effectiveRowHeight();\n }\n\n /** Index of the display item covering the body offset `y`. */\n private indexAt(y: number): number {\n const count = this.displayItems().length;\n if (count === 0) return 0;\n const offsets = this.itemOffsets();\n if (!offsets) {\n return Math.min(count - 1, Math.max(0, Math.floor(y / this.effectiveRowHeight())));\n }\n let lo = 0;\n let hi = count - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (offsets[mid] <= y) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n }\n\n /** The `[start, end)` slice of display items currently rendered. */\n protected readonly windowRange = computed<{ start: number; end: number }>(\n () => {\n const count = this.displayItems().length;\n if (!this.isVirtual()) return { start: 0, end: count };\n const over = Math.max(0, this.overscan());\n const vh = this.viewportHeight();\n const top = Math.max(0, this.scrollTop() - this.headHeight());\n const first = this.indexAt(top);\n const last = vh > 0 ? this.indexAt(top + vh) : first + UNMEASURED_VIEWPORT_ROWS;\n return {\n start: Math.max(0, first - over),\n end: Math.min(count, last + 1 + over),\n };\n },\n { equal: (a, b) => a.start === b.start && a.end === b.end },\n );\n\n /** Display index of the first rendered item. */\n protected readonly windowStart = computed(() => this.windowRange().start);\n\n /** The items the tbody renders: the window in virtual mode, else all. */\n protected readonly renderedItems = computed<MkTableItem<T>[]>(() => {\n const items = this.displayItems();\n if (!this.isVirtual()) return items;\n const { start, end } = this.windowRange();\n return items.slice(start, end);\n });\n\n /** Height (px) of the spacer above the window. */\n protected readonly topSpace = computed(() =>\n this.isVirtual() ? this.offsetOf(this.windowRange().start) : 0,\n );\n /** Height (px) of the spacer below the window. */\n protected readonly bottomSpace = computed(() =>\n this.isVirtual()\n ? Math.max(0, this.totalHeight() - this.offsetOf(this.windowRange().end))\n : 0,\n );\n\n /** Scroll box scrolled: move the window. */\n protected onScroll(event: Event): void {\n if (!this.isVirtual()) return;\n this.scrollTop.set((event.target as HTMLElement).scrollTop);\n }\n\n /**\n * Read the viewport, thead, first-row and detail-row heights back from the\n * DOM. Heights are accepted only when they move by more than a pixel:\n * collapsed table borders make the same row measure 44 or 44.5 depending\n * on where it sits, and letting that flip the row height would shift a\n * 10,000-row body by thousands of pixels on every window change. A density\n * change (44 → 36 or 52) still gets through.\n */\n private measureViewport(el: HTMLElement): void {\n const settled = (next: number, current: number | null): boolean =>\n current != null && Math.abs(next - current) <= 1;\n const vh = el.clientHeight;\n if (vh > 0 && vh !== this.viewportHeight()) this.viewportHeight.set(vh);\n const thead = el.querySelector('thead');\n const hh = thead ? thead.getBoundingClientRect().height : 0;\n if (!settled(hh, this.headHeight())) this.headHeight.set(hh);\n if (this.rowHeight() == null) {\n const row = el.querySelector('tr.mk-table__row:not(.mk-table__row--empty)');\n const rh = row ? row.getBoundingClientRect().height : 0;\n if (rh > 0 && !settled(rh, this.measuredRowHeight())) this.measuredRowHeight.set(rh);\n }\n if (!this.expandable()) return;\n const items = this.displayItems();\n let next: Map<unknown, number> | null = null;\n for (const detail of el.querySelectorAll<HTMLElement>('tr.mk-table__detail-row')) {\n const index = Number(detail.dataset['index']);\n const item = items[index];\n if (!item || item.kind !== 'row') continue;\n const h = detail.getBoundingClientRect().height;\n if (!(h > 0)) continue;\n const key = this.rowKey(item.row);\n if (settled(h, this.detailHeights().get(key) ?? null)) continue;\n next ??= new Map(this.detailHeights());\n next.set(key, h);\n }\n if (next) this.detailHeights.set(next);\n }\n\n /**\n * Scroll a row into view. A number is the row's **display index** — its\n * position among the rendered rows, group headers included, after sorting,\n * filtering and tree expansion; anything else is a row key (the `trackKey`\n * value, or the row object when there is none). Pass `'key'` to look a\n * numeric key up. Returns `false` when the row is not currently displayed\n * (filtered out, under a collapsed parent or group).\n *\n * In virtual mode the row lands at the top of the viewport, just under the\n * header; otherwise it is scrolled to the nearest edge.\n */\n scrollToRow(\n target: unknown,\n by: 'index' | 'key' = typeof target === 'number' ? 'index' : 'key',\n ): boolean {\n const items = this.displayItems();\n const index =\n by === 'index'\n ? (target as number)\n : items.findIndex((it) => it.kind === 'row' && this.rowKey(it.row) === target);\n if (!Number.isInteger(index) || index < 0 || index >= items.length) return false;\n const el = this.scroller()?.nativeElement;\n if (!el) return false;\n if (this.isVirtual()) {\n const vh = this.viewportHeight();\n const max = vh > 0 ? Math.max(0, this.totalHeight() + this.headHeight() - vh) : Infinity;\n const top = Math.min(this.offsetOf(index), max);\n el.scrollTop = top;\n this.scrollTop.set(top);\n } else {\n const row = el.querySelector<HTMLElement>(`tbody > tr[data-index=\"${index}\"]`);\n row?.scrollIntoView?.({ block: 'nearest' });\n }\n return true;\n }\n\n // --- Tree rows ------------------------------------------------------------\n /** Keys of parent rows whose children are shown. */\n private readonly treeExpanded = signal<Set<unknown>>(new Set());\n\n /** Whether a parent row's children are currently shown (tree mode). */\n isTreeExpanded(row: T): boolean {\n return this.treeExpanded().has(this.rowKey(row));\n }\n\n /** Show or hide a parent row's children (tree mode). */\n toggleTreeRow(row: T, event?: Event): void {\n event?.stopPropagation();\n if (this.childrenOf(row).length === 0) return;\n this.setTreeExpanded(row, !this.isTreeExpanded(row));\n }\n\n /** Expand every parent row (tree mode). */\n expandAllRows(): void {\n const keys = new Set<unknown>();\n const walk = (rows: T[]): void => {\n for (const row of rows) {\n const children = this.childrenOf(row);\n if (children.length) {\n keys.add(this.rowKey(row));\n walk(children);\n }\n }\n };\n walk(this.data());\n this.treeExpanded.set(keys);\n }\n\n /** Collapse every parent row (tree mode). */\n collapseAllRows(): void {\n this.treeExpanded.set(new Set());\n }\n\n // --- Export -----------------------------------------------------------------\n /**\n * The rows and columns an export writes — exactly what {@link exportCsv}\n * serialises, for other formats (XLSX, PDF, the clipboard, …): rows in\n * display order with the current sort and header {@link filters} applied\n * (every matching row, never just the virtual window) and tree children\n * (`childrenKey`) flattened under their parent whether or not they are\n * expanded, optionally only the selected ones; columns in the table's\n * current order, restricted to `options.columns` when given, each carrying\n * its header and `format` so what the user saw is what gets written.\n *\n * ```ts\n * const { rows, columns } = table.getExportRows({ selectedOnly: true });\n * const sheet = rows.map((row) =>\n * Object.fromEntries(columns.map((c) => [c.header ?? c.key, c.format ? c.format(row[c.key], row) : row[c.key]])),\n * );\n * ```\n */\n getExportRows(options: MkTableExportRowsOptions = {}): MkTableExportRows<T> {\n let rows = this.allRows();\n if (options.selectedOnly) {\n const keys = this.selectedKeys();\n rows = rows.filter((r) => keys.has(this.rowKey(r)));\n }\n const only = options.columns ? new Set(options.columns) : null;\n const columns = this.orderedColumns()\n .filter((c) => !only || only.has(c.key))\n .map((c) => ({ key: c.key, header: c.header, format: c.format }));\n return { rows, columns };\n }\n\n /**\n * The table's rows as CSV: current column order, column formatters applied,\n * sorted and filtered the way they are shown, tree children flattened under\n * their parent whether or not they are expanded. Downloads the file (default name\n * `table.csv`) and returns the text. Built on {@link getExportRows}.\n */\n exportCsv(options: MkTableExportOptions = {}): string {\n const { rows, columns } = this.getExportRows(options);\n // The rows are already flat, so no childrenKey is passed through.\n const csv = mkToCsv(rows, columns, { ...options, childrenKey: undefined });\n if (options.download !== false) {\n let filename = options.filename ?? 'table.csv';\n if (!/\\.csv$/i.test(filename)) filename += '.csv';\n mkDownloadText(csv, filename);\n }\n return csv;\n }\n\n private setTreeExpanded(row: T, expanded: boolean): void {\n const rk = this.rowKey(row);\n if (this.treeExpanded().has(rk) === expanded) return;\n const next = new Set(this.treeExpanded());\n if (expanded) next.add(rk);\n else next.delete(rk);\n this.treeExpanded.set(next);\n this.treeToggle.emit({ row, expanded });\n }\n\n /**\n * ArrowRight opens and ArrowLeft closes a parent row's children (swapped in\n * RTL). Handled for keys pressed on the row itself or on its tree toggle.\n */\n protected onTreeKeydown(event: KeyboardEvent, row: T): boolean {\n if (!this.childrenKey() || this.childrenOf(row).length === 0) return false;\n const rtl = this.document.defaultView?.getComputedStyle(this.host.nativeElement).direction === 'rtl';\n const openKey = rtl ? 'ArrowLeft' : 'ArrowRight';\n const closeKey = rtl ? 'ArrowRight' : 'ArrowLeft';\n if (event.key === openKey && !this.isTreeExpanded(row)) {\n event.preventDefault();\n this.setTreeExpanded(row, true);\n return true;\n }\n if (event.key === closeKey && this.isTreeExpanded(row)) {\n event.preventDefault();\n this.setTreeExpanded(row, false);\n return true;\n }\n return false;\n }\n\n /** `@for` identity: group headers by value, rows by {@link trackRow}. */\n protected trackItem = (item: MkTableItem<T>): unknown =>\n item.kind === 'group' ? `mk-group:${String(item.group.key)}` : this.rowKey(item.row);\n\n /** Whether a group is currently collapsed. */\n protected isGroupCollapsed(key: unknown): boolean {\n return this.collapsedGroups().has(key);\n }\n\n /** Collapse or expand a group header. */\n protected onGroupToggle(group: MkTableGroup<T>): void {\n const next = new Set(this.collapsedGroups());\n const collapsed = !next.has(group.key);\n if (collapsed) next.add(group.key);\n else next.delete(group.key);\n this.collapsedGroups.set(next);\n this.groupToggle.emit({ key: group.key, collapsed });\n }\n\n /** Collapse every group. */\n collapseAllGroups(): void {\n const groups = this.groups();\n if (groups) this.collapsedGroups.set(new Set(groups.map((g) => g.key)));\n }\n\n /** Expand every group. */\n expandAllGroups(): void {\n this.collapsedGroups.set(new Set());\n }\n\n // --- Expansion ------------------------------------------------------------\n private readonly expandedKeys = signal<Set<unknown>>(new Set());\n\n /** Whether `row`'s detail panel is currently expanded. */\n protected isExpanded(row: T): boolean {\n return this.expandedKeys().has(this.rowKey(row));\n }\n\n /** The DOM id of a row's detail panel (for `aria-controls`). */\n protected detailId(index: number): string {\n return `${this.detailIdBase}-${index}`;\n }\n\n /** Toggle a row's detail panel, honouring `singleExpand`. */\n protected toggleExpand(row: T, event?: Event): void {\n event?.stopPropagation();\n const rk = this.rowKey(row);\n const open = this.expandedKeys().has(rk);\n const next = this.singleExpand() ? new Set<unknown>() : new Set(this.expandedKeys());\n if (open) next.delete(rk);\n else next.add(rk);\n this.expandedKeys.set(next);\n this.expandedChange.emit(\n this.data().filter((r) => next.has(this.rowKey(r))),\n );\n }\n}\n","<div\n #scroller\n class=\"mk-table__scroll\"\n [style.height]=\"scrollHeight()\"\n [style.max-height]=\"scrollMaxHeight()\"\n [attr.data-row-height]=\"isVirtual() ? effectiveRowHeight() : null\"\n (scroll)=\"onScroll($event)\"\n>\n <!-- Explicit roles ONLY while stacked: `display: block` strips a table\n element of its implicit role, so without these a card layout stops\n being announced as tabular data at all. Redundant in the grid, so\n they are left off there rather than duplicating what the element\n already says. -->\n <table\n class=\"mk-table__table\"\n [attr.role]=\"childrenKey() ? 'treegrid' : stacked() ? 'table' : null\"\n [attr.aria-rowcount]=\"isVirtual() ? displayItems().length + headerRows() : null\"\n >\n <thead class=\"mk-table__head\" [attr.role]=\"stacked() ? 'rowgroup' : null\">\n <tr>\n @if (expandable()) {\n <th scope=\"col\" class=\"mk-table__th mk-table__th--expand\">\n <span class=\"mk-visually-hidden\">{{ i18n.expandHeader }}</span>\n </th>\n }\n @if (selectable()) {\n <th scope=\"col\" class=\"mk-table__th mk-table__th--select\">\n <mk-checkbox\n [aria-label]=\"i18n.selectAllRows\"\n [checked]=\"allSelected()\"\n [indeterminate]=\"someSelected()\"\n (checkedChange)=\"toggleAll()\"\n />\n </th>\n }\n @for (col of orderedColumns(); track col.key) {\n <th\n scope=\"col\"\n class=\"mk-table__th\"\n [class.mk-table__th--sortable]=\"col.sortable\"\n [class.mk-table__th--pinned]=\"col.pinned\"\n [class.mk-table__th--pinned-right]=\"col.pinned === 'right'\"\n [class.mk-table__th--dragging]=\"dragKey() === col.key\"\n [style.width]=\"colStyleWidth(col)\"\n [style.inset-inline-start.px]=\"col.pinned === 'left' ? pinnedOffset(col) : null\"\n [style.inset-inline-end.px]=\"col.pinned === 'right' ? pinnedOffset(col) : null\"\n [attr.data-align]=\"col.align ?? 'start'\"\n [attr.aria-sort]=\"ariaSort(col)\"\n [attr.draggable]=\"reorderableColumns() && !col.pinned ? true : null\"\n (dragstart)=\"onColDragStart($event, col)\"\n (dragover)=\"onColDragOver($event)\"\n (drop)=\"onColDrop($event, col)\"\n (dragend)=\"onColDragEnd()\"\n >\n @if (col.sortable || (reorderableColumns() && !col.pinned)) {\n <button\n type=\"button\"\n class=\"mk-table__th-button\"\n [class.mk-table__th-button--static]=\"!col.sortable\"\n (click)=\"onSort(col)\"\n (keydown)=\"onReorderKeydown($event, col)\"\n >\n <span class=\"mk-table__th-label\">{{ col.header }}</span>\n @if (col.sortable) {\n <span class=\"mk-table__sort\" aria-hidden=\"true\">{{ sortGlyph(col) }}</span>\n }\n </button>\n } @else {\n <span class=\"mk-table__th-inner\">\n <span class=\"mk-table__th-label\">{{ col.header }}</span>\n </span>\n }\n @if (resizableColumns() && col.resizable) {\n <span\n class=\"mk-table__resize\"\n role=\"separator\"\n tabindex=\"0\"\n aria-orientation=\"vertical\"\n [attr.aria-label]=\"i18n.resizeColumn\"\n [attr.aria-valuemin]=\"resizeValueMin(col)\"\n [attr.aria-valuenow]=\"resizeValueNow(col)\"\n [attr.aria-valuemax]=\"resizeValueMax\"\n (pointerdown)=\"startResize($event, col)\"\n (keydown)=\"onResizeKeydown($event, col)\"\n (click)=\"$event.stopPropagation()\"\n ></span>\n }\n </th>\n }\n </tr>\n @if (filterable() && !stacked()) {\n <!-- Filter row: native controls styled with tokens, so the table entry\n point stays free of the forms / datetime entries. -->\n <tr class=\"mk-table__filter-row\">\n @if (expandable()) {\n <td class=\"mk-table__filter-cell mk-table__th--expand\"></td>\n }\n @if (selectable()) {\n <td class=\"mk-table__filter-cell mk-table__th--select\"></td>\n }\n @for (col of orderedColumns(); track col.key) {\n @let kind = filterKind(col);\n <td\n class=\"mk-table__filter-cell\"\n [class.mk-table__th--pinned]=\"col.pinned\"\n [class.mk-table__th--pinned-right]=\"col.pinned === 'right'\"\n [style.width]=\"colStyleWidth(col)\"\n [style.inset-inline-start.px]=\"col.pinned === 'left' ? pinnedOffset(col) : null\"\n [style.inset-inline-end.px]=\"col.pinned === 'right' ? pinnedOffset(col) : null\"\n >\n @if (kind === 'select') {\n <select\n class=\"mk-table__filter-control mk-table__filter-select\"\n [class.mk-table__filter-control--active]=\"hasFilter(col.key)\"\n [attr.data-filter-key]=\"col.key\"\n [attr.aria-label]=\"filterLabel(col)\"\n (change)=\"onFilterSelect(col, $event)\"\n >\n <option value=\"\" [selected]=\"!hasFilter(col.key)\">\n {{ col.filterPlaceholder ?? i18n.filterAny }}\n </option>\n @for (option of filterOptionsFor(col); track $index) {\n <option [value]=\"option.value\" [selected]=\"isFilterOption(col, option)\">\n {{ option.label }}\n </option>\n }\n </select>\n } @else if (kind) {\n <span class=\"mk-table__filter\" [class.mk-table__filter--active]=\"hasFilter(col.key)\">\n <input\n class=\"mk-table__filter-control mk-table__filter-input\"\n [type]=\"kind === 'text' ? 'search' : kind\"\n [attr.inputmode]=\"kind === 'number' ? 'decimal' : null\"\n [attr.data-filter-key]=\"col.key\"\n [attr.aria-label]=\"filterLabel(col)\"\n [attr.placeholder]=\"filterPlaceholder(col)\"\n [value]=\"filterText(col.key)\"\n (input)=\"onFilterInput(col, $event)\"\n (keydown)=\"onFilterKeydown(col, $event)\"\n />\n @if (hasFilter(col.key)) {\n <button\n type=\"button\"\n class=\"mk-table__filter-clear\"\n [attr.aria-label]=\"i18n.clearFilter(col.header || col.key)\"\n (click)=\"clearFilter(col.key)\"\n >\n <span aria-hidden=\"true\">×</span>\n </button>\n }\n </span>\n }\n </td>\n }\n </tr>\n }\n </thead>\n <tbody class=\"mk-table__body\" [attr.role]=\"stacked() ? 'rowgroup' : null\">\n @if (isVirtual() && topSpace() > 0) {\n <tr class=\"mk-table__spacer\" aria-hidden=\"true\">\n <td [attr.colspan]=\"totalColumns()\" [style.height.px]=\"topSpace()\"></td>\n </tr>\n }\n @for (item of renderedItems(); track trackItem(item); let i = $index) {\n @let idx = windowStart() + i;\n @if (item.kind === 'group') {\n <tr\n class=\"mk-table__group-row\"\n [attr.role]=\"stacked() ? 'row' : null\"\n [attr.data-index]=\"idx\"\n [attr.aria-rowindex]=\"isVirtual() ? idx + headerRows() + 1 : null\"\n >\n <th\n class=\"mk-table__group\"\n scope=\"colgroup\"\n [attr.role]=\"stacked() ? 'rowheader' : null\"\n [attr.colspan]=\"totalColumns()\"\n >\n <button\n type=\"button\"\n class=\"mk-table__group-toggle\"\n [attr.aria-expanded]=\"!isGroupCollapsed(item.group.key)\"\n (click)=\"onGroupToggle(item.group)\"\n >\n <span\n class=\"mk-table__expander-icon\"\n [class.mk-table__expander-icon--open]=\"!isGroupCollapsed(item.group.key)\"\n aria-hidden=\"true\"\n >›</span\n >\n <span class=\"mk-visually-hidden\">{{\n isGroupCollapsed(item.group.key) ? i18n.expandGroup : i18n.collapseGroup\n }}</span>\n <span class=\"mk-table__group-label\">{{ item.group.label }}</span>\n <span class=\"mk-table__group-count\">{{\n i18n.groupCount(item.group.rows.length)\n }}</span>\n </button>\n </th>\n </tr>\n } @else {\n <ng-container>\n <tr\n class=\"mk-table__row\"\n [attr.role]=\"stacked() || childrenKey() ? 'row' : null\"\n [class]=\"rowClassFor(item.row)\"\n [class.mk-table__row--selected]=\"selectable() && isSelected(item.row)\"\n [class.mk-table__row--expanded]=\"expandable() && isExpanded(item.row)\"\n [class.mk-table__row--parent]=\"item.hasChildren\"\n [class.mk-table__row--even]=\"isVirtual() && idx % 2 === 1\"\n [style.--mk-tree-depth]=\"childrenKey() ? item.depth : null\"\n [style.margin-inline-start.px]=\"stacked() && item.depth ? item.depth * 16 : null\"\n [attr.data-index]=\"idx\"\n [attr.aria-rowindex]=\"isVirtual() ? idx + headerRows() + 1 : null\"\n [attr.aria-level]=\"childrenKey() ? item.depth + 1 : null\"\n [attr.aria-expanded]=\"item.hasChildren ? item.expanded : null\"\n [attr.tabindex]=\"clickableRows() ? 0 : null\"\n (click)=\"onRowClick(item.row)\"\n (keydown)=\"onRowKeydown($event, item.row)\"\n >\n @if (expandable()) {\n <td\n class=\"mk-table__td mk-table__td--expand\"\n [attr.role]=\"stacked() ? 'cell' : null\"\n (click)=\"$event.stopPropagation()\"\n >\n <button\n type=\"button\"\n class=\"mk-table__expander\"\n [class.mk-table__expander--open]=\"isExpanded(item.row)\"\n [attr.aria-expanded]=\"isExpanded(item.row)\"\n [attr.aria-controls]=\"detailId(idx)\"\n [attr.aria-label]=\"isExpanded(item.row) ? i18n.collapseRow : i18n.expandRow\"\n (click)=\"toggleExpand(item.row, $event)\"\n >\n <span class=\"mk-table__expander-icon\" aria-hidden=\"true\">›</span>\n </button>\n </td>\n }\n @if (selectable()) {\n <td\n class=\"mk-table__td mk-table__td--select\"\n [attr.role]=\"stacked() ? 'cell' : null\"\n (click)=\"$event.stopPropagation()\"\n >\n <mk-checkbox\n [aria-label]=\"i18n.selectRow(rowLabel(item.row))\"\n [checked]=\"isSelected(item.row)\"\n (checkedChange)=\"toggleRow(item.row)\"\n />\n </td>\n }\n @if (!stacked()) {\n @for (col of orderedColumns(); track col.key; let first = $first) {\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ col, row: item.row, i: idx, slot: null, tree: first ? item : null }\"\n />\n }\n } @else {\n <!-- Card layout. Same <td> elements, restyled — keeping the table\n DOM means selection, expansion, inline edit and every cell\n template keep working, since all of them reach for a `td`. -->\n @for (col of stackTitleColumns(); track col.key; let first = $first) {\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ col, row: item.row, i: idx, slot: 'title', tree: first ? item : null }\"\n />\n }\n @for (col of stackFieldColumns(); track col.key) {\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ col, row: item.row, i: idx, slot: 'field' }\"\n />\n }\n @for (col of stackFooterColumns(); track col.key) {\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ col, row: item.row, i: idx, slot: 'footer' }\"\n />\n }\n }\n </tr>\n @if (expandable() && isExpanded(item.row) && rowDetail()) {\n <tr\n class=\"mk-table__detail-row\"\n [attr.role]=\"stacked() ? 'row' : null\"\n [attr.data-index]=\"idx\"\n >\n <td\n class=\"mk-table__detail\"\n [id]=\"detailId(idx)\"\n [attr.role]=\"stacked() ? 'cell' : null\"\n [attr.colspan]=\"totalColumns()\"\n >\n <div class=\"mk-table__detail-inner\">\n <ng-container\n [ngTemplateOutlet]=\"rowDetail()!.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item.row }\"\n />\n </div>\n </td>\n </tr>\n }\n </ng-container>\n }\n } @empty {\n <tr class=\"mk-table__row mk-table__row--empty\" [attr.role]=\"stacked() ? 'row' : null\">\n <td\n class=\"mk-table__empty\"\n [attr.role]=\"stacked() ? 'cell' : null\"\n [attr.colspan]=\"totalColumns()\"\n >\n <ng-content select=\"[mkTableEmpty]\">{{ emptyMessage() }}</ng-content>\n </td>\n </tr>\n }\n @if (isVirtual() && bottomSpace() > 0) {\n <tr class=\"mk-table__spacer\" aria-hidden=\"true\">\n <td [attr.colspan]=\"totalColumns()\" [style.height.px]=\"bottomSpace()\"></td>\n </tr>\n }\n </tbody>\n </table>\n</div>\n\n<!-- One cell, rendered by both layouts. `slot` is null in the grid and\n 'title' | 'field' | 'footer' in a card; everything else — the editor, the\n consumer's mkTableCell template, the formatted fallback — is identical, so\n a card can never drift from the grid it replaces. -->\n<ng-template #cellTpl let-col=\"col\" let-row=\"row\" let-i=\"i\" let-slot=\"slot\" let-tree=\"tree\">\n <td\n class=\"mk-table__td\"\n [class.mk-table__td--tree]=\"!!tree && !!childrenKey()\"\n [class.mk-table__td--pinned]=\"isPinned(col, 'left') || isPinned(col, 'right')\"\n [class.mk-table__td--pinned-right]=\"isPinned(col, 'right')\"\n [class.mk-table__td--editable]=\"col.editable\"\n [class.mk-table__td--stack-title]=\"slot === 'title'\"\n [class.mk-table__td--stack-field]=\"slot === 'field'\"\n [class.mk-table__td--stack-footer]=\"slot === 'footer'\"\n [style.width]=\"colStyleWidth(col)\"\n [style.inset-inline-start.px]=\"isPinned(col, 'left') ? pinnedOffset(col) : null\"\n [style.inset-inline-end.px]=\"isPinned(col, 'right') ? pinnedOffset(col) : null\"\n [attr.data-align]=\"col.align ?? 'start'\"\n [attr.tabindex]=\"col.editable ? 0 : null\"\n [attr.role]=\"stacked() ? 'cell' : null\"\n (dblclick)=\"startEdit(i, col, $event)\"\n (keydown)=\"onCellKeydown($event, i, col)\"\n >\n @if (slot === 'field' && hasStackLabel(col)) {\n <!-- The column header, moved beside the value. Not aria-hidden: the\n <thead> is display:none while stacked, so this label is the only\n thing naming the value for a screen reader. -->\n <span class=\"mk-table__cell-label\">{{ col.header }}</span>\n }\n @if (tree && childrenKey()) {\n <!-- Tree toggle (or a spacer on leaves) ahead of the first cell's value,\n so the indent and the caret read as one column. -->\n @if (tree.hasChildren) {\n <button\n type=\"button\"\n class=\"mk-table__tree-toggle\"\n [class.mk-table__tree-toggle--open]=\"tree.expanded\"\n [attr.aria-expanded]=\"tree.expanded\"\n [attr.aria-label]=\"tree.expanded ? i18n.collapseTreeRow : i18n.expandTreeRow\"\n (click)=\"toggleTreeRow(row, $event)\"\n >\n <span class=\"mk-table__expander-icon\" [class.mk-table__expander-icon--open]=\"tree.expanded\" aria-hidden=\"true\">›</span>\n </button>\n } @else {\n <span class=\"mk-table__tree-spacer\" aria-hidden=\"true\"></span>\n }\n }\n <span class=\"mk-table__cell-value\">\n @if (isEditing(i, col)) {\n <input\n #editInput\n class=\"mk-table__cell-input\"\n [value]=\"cellText(row, col)\"\n [attr.aria-label]=\"col.header\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onEditKeydown($event, row, col)\"\n (blur)=\"commitEdit(row, col, $any($event.target).value)\"\n />\n } @else if (cellTemplateFor(col.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: cellValue(row, col), row }\"\n />\n } @else {\n {{ cellText(row, col) }}\n @if (col.editable) {\n <span class=\"mk-visually-hidden\">{{ i18n.editCell }}</span>\n }\n }\n </span>\n </td>\n</ng-template>\n","import {\n Directive,\n booleanAttribute,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { MkLiveAnnouncer } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkSortDirection } from '../table/table';\n\n/** Current sort state emitted by {@link MkSort.mkSortChange}. */\nexport interface MkSortState {\n /** Id of the column being sorted by (empty when cleared). */\n active: string;\n /** Sort direction (`none` when cleared). */\n direction: MkSortDirection;\n}\n\n/**\n * The minimal shape {@link MkSort} needs from a header. Implemented by\n * {@link MkSortHeader}; declared separately so the coordinator does not depend\n * on the header's concrete type (avoids a circular import).\n */\nexport interface MkSortable {\n id(): string;\n start(): 'asc' | 'desc' | undefined;\n disabled(): boolean;\n sortLabel(): string;\n}\n\n/**\n * Sort coordinator — apply `mkSort` to a table (or any container) to track\n * which column is sorted and in which direction. It holds no data: register\n * headers with `mkSortHeader`, then re-sort your rows in the\n * `(mkSortChange)` handler. Mirrors the Angular Material `matSort` model but\n * signal-based.\n *\n * Clicking a header cycles asc → desc → unsorted (set `mkSortDisableClear` to\n * cycle asc ↔ desc only). `mkSortStart` flips the initial direction.\n *\n * ```html\n * <table mkSort mkSortActive=\"name\" mkSortDirection=\"asc\"\n * (mkSortChange)=\"sortData($event)\">\n * <thead><tr>\n * <th mkSortHeader=\"name\">Name</th>\n * <th mkSortHeader=\"size\" mkSortHeaderStart=\"desc\">Size</th>\n * </tr></thead>\n * …\n * </table>\n * ```\n */\n@Directive({\n selector: '[mkSort]',\n exportAs: 'mkSort',\n})\nexport class MkSort {\n private readonly announcer = inject(MkLiveAnnouncer);\n private readonly i18n = inject(MK_I18N);\n\n /** Id of the currently sorted column (two-way; empty when unsorted). */\n readonly active = model<string>('', { alias: 'mkSortActive' });\n /** Current sort direction (two-way). */\n readonly direction = model<MkSortDirection>('none', {\n alias: 'mkSortDirection',\n });\n /** Direction the first click on a header applies. Default `asc`. */\n readonly start = input<'asc' | 'desc'>('asc', { alias: 'mkSortStart' });\n /** Disable sorting for every header. */\n readonly disabled = input(false, {\n transform: booleanAttribute,\n alias: 'mkSortDisabled',\n });\n /** Remove the \"unsorted\" step so headers cycle asc ↔ desc only. */\n readonly disableClear = input(false, {\n transform: booleanAttribute,\n alias: 'mkSortDisableClear',\n });\n\n /** Emits the new sort state whenever a header is activated. */\n readonly sortChange = output<MkSortState>({ alias: 'mkSortChange' });\n\n /** Advance the sort state for the given header (called on click/keyboard). */\n sort(header: MkSortable): void {\n if (this.disabled() || header.disabled()) return;\n const id = header.id();\n if (this.active() !== id) {\n this.active.set(id);\n this.direction.set(this.startFor(header));\n } else {\n const next = this.nextDirection(header, this.direction());\n this.direction.set(next);\n if (next === 'none') this.active.set('');\n }\n const state: MkSortState = {\n active: this.active(),\n direction: this.direction(),\n };\n this.sortChange.emit(state);\n this.announce(header, state.direction);\n }\n\n /** Whether the given column id is the active, non-cleared sort. */\n isActive(id: string): boolean {\n return this.active() === id && this.direction() !== 'none';\n }\n\n private startFor(header: MkSortable): MkSortDirection {\n return header.start() ?? this.start();\n }\n\n private nextDirection(\n header: MkSortable,\n current: MkSortDirection,\n ): MkSortDirection {\n const order: MkSortDirection[] =\n this.startFor(header) === 'desc' ? ['desc', 'asc'] : ['asc', 'desc'];\n if (!this.disableClear()) order.push('none');\n const index = order.indexOf(current);\n return order[(index + 1) % order.length];\n }\n\n private announce(header: MkSortable, direction: MkSortDirection): void {\n const label = header.sortLabel() || header.id();\n const message =\n direction === 'none'\n ? this.i18n.sortingCleared(label)\n : this.i18n.sortedBy(label, direction === 'asc' ? 'asc' : 'desc');\n this.announcer.announce(message, 'polite');\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport type { MkSortDirection } from '../table/table';\nimport { MkSort, MkSortable } from './sort';\n\n/**\n * Sort header — attach `mkSortHeader` to a header cell (`<th>`) inside an\n * element carrying `mkSort`. It wraps the projected header text in a real\n * `<button>` (so assistive tech hears an operable control), adds a directional\n * arrow (faint on hover, solid when active), reflects `aria-sort` on the cell,\n * and toggles the sort on click or Enter/Space.\n *\n * ```html\n * <th mkSortHeader=\"email\" mkSortHeaderLabel=\"Email address\">Email</th>\n * ```\n */\n@Component({\n selector: '[mkSortHeader]',\n templateUrl: './sort-header.html',\n styleUrl: './sort-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-sort-header',\n '[class.mk-sort-header--active]': 'isActive()',\n '[class.mk-sort-header--disabled]': 'isDisabled()',\n '[attr.aria-sort]': 'ariaSort()',\n },\n})\nexport class MkSortHeader implements MkSortable {\n private readonly sort = inject(MkSort);\n\n /** Column id this header sorts by (the `mkSortHeader` value). */\n readonly id = input('', { alias: 'mkSortHeader' });\n /** Per-header override for the initial sort direction. */\n readonly start = input<'asc' | 'desc' | undefined>(undefined, {\n alias: 'mkSortHeaderStart',\n });\n /** Disable sorting for just this header. */\n readonly disabled = input(false, {\n transform: booleanAttribute,\n alias: 'mkSortHeaderDisabled',\n });\n /** Accessible label used in sort announcements (defaults to the id). */\n readonly sortLabel = input('', { alias: 'mkSortHeaderLabel' });\n\n /** Disabled if this header or the whole `mkSort` is disabled. */\n readonly isDisabled = computed(() => this.disabled() || this.sort.disabled());\n /** Whether this header is the active, non-cleared sort. */\n readonly isActive = computed(() => this.sort.isActive(this.id()));\n /** Active direction, or `none` when this header is not the active sort. */\n readonly direction = computed<MkSortDirection>(() =>\n this.isActive() ? this.sort.direction() : 'none',\n );\n /** `aria-sort` value for the header cell. */\n protected readonly ariaSort = computed(() => {\n if (!this.isActive()) return 'none';\n return this.sort.direction() === 'asc' ? 'ascending' : 'descending';\n });\n\n protected toggle(): void {\n if (!this.isDisabled()) this.sort.sort(this);\n }\n}\n","<!-- A real <button> rather than a clickable th: the cell keeps aria-sort,\n the button provides the operable-control semantics (and native\n Enter/Space activation) a screen-reader user expects. -->\n<button\n type=\"button\"\n class=\"mk-sort-header__button\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n>\n <span class=\"mk-sort-header__label\"><ng-content /></span>\n @if (!isDisabled()) {\n <span\n class=\"mk-sort-header__arrow\"\n [class.mk-sort-header__arrow--active]=\"isActive()\"\n [class.mk-sort-header__arrow--desc]=\"direction() === 'desc'\"\n aria-hidden=\"true\"\n ></span>\n }\n</button>\n","import { DestroyRef, Signal, computed, inject, signal } from '@angular/core';\nimport type { Observable, Unsubscribable } from 'rxjs';\nimport { mkQueryCompact, type MkQueryGroup } from '@mk-kit/ui/core';\nimport { mkCompactFilters, type MkSortChange, type MkTableFilters } from './table/table';\nimport type { MkSort, MkSortState } from './sort/sort';\n\n/** The request handed to a {@link MkDataFetcher} on every load. */\nexport interface MkDataRequest {\n /** 1-based page index, matching `mk-pagination`. */\n page: number;\n /** Number of rows per page. */\n pageSize: number;\n /** Active sort, or `null` when unsorted (cleared sorts normalise to `null`). */\n sort: MkSortState | null;\n /** Free-text filter query (`''` = none). */\n filter: string;\n /** Structured filter from `mk-query-builder` (`null` = none). Compacted: no empty groups or unfinished rules. */\n query: MkQueryGroup | null;\n /**\n * Per-column filters from `mk-table`'s header filter row (`null` = none),\n * keyed by column key with empty entries dropped — see\n * {@link MkTableDataSource.setFilters}.\n */\n filters: MkTableFilters | null;\n}\n\n/** One page of server data returned by a {@link MkDataFetcher}. */\nexport interface MkDataPage<T> {\n /** The rows for the requested page. */\n rows: T[];\n /** Total number of rows across ALL pages (drives the pager). */\n total: number;\n}\n\n/**\n * Loads one page of data for a {@link MkDataRequest}. May return a `Promise`\n * (e.g. `fetch`) or an `Observable` (e.g. `HttpClient`); an Observable is\n * treated as single-shot — the first emission wins and the subscription is\n * released.\n */\nexport type MkDataFetcher<T> = (\n req: MkDataRequest,\n) => Promise<MkDataPage<T>> | Observable<MkDataPage<T>>;\n\n/** Construction options for {@link MkTableDataSource}. */\nexport interface MkTableDataSourceOptions {\n /** Initial rows per page (default 10, matching `mk-pagination`). */\n pageSize?: number;\n /** Debounce for {@link MkTableDataSource.setFilter} in ms (default 300). */\n filterDebounce?: number;\n}\n\n/** Default debounce applied to {@link MkTableDataSource.setFilter}. */\nconst DEFAULT_FILTER_DEBOUNCE = 300;\n/** Default page size, matching `mk-pagination`. */\nconst DEFAULT_PAGE_SIZE = 10;\n\n/** Normalise any of the kit's sort payload shapes to `MkSortState | null`. */\nfunction normalizeSort(\n sort: MkSortState | MkSortChange | null | undefined,\n): MkSortState | null {\n if (!sort) return null;\n const active = 'active' in sort ? sort.active : sort.key;\n if (!active || sort.direction === 'none') return null;\n return { active, direction: sort.direction };\n}\n\n/** Whether two normalised sort states describe the same ordering. */\nfunction sameSort(a: MkSortState | null, b: MkSortState | null): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return a.active === b.active && a.direction === b.direction;\n}\n\n/** JSON with object keys sorted, so `{ a, b }` and `{ b, a }` compare equal. */\nfunction canonicalJson(value: unknown): string {\n return JSON.stringify(value, (_key, v: unknown) =>\n v && typeof v === 'object' && !Array.isArray(v)\n ? Object.fromEntries(\n Object.keys(v as object)\n .sort()\n .map((k) => [k, (v as Record<string, unknown>)[k]]),\n )\n : v,\n );\n}\n\n/** Duck-typed Observable check, so rxjs is a type-only dependency here. */\nfunction isSubscribable<T>(\n value: Promise<T> | Observable<T>,\n): value is Observable<T> {\n return typeof (value as Observable<T>).subscribe === 'function';\n}\n\n/**\n * Server-side data adapter for `mk-table` — the page/sort/filter plumbing every\n * admin screen otherwise hand-rolls. A plain class (no component, no injection\n * required): give it a fetcher and bind its signals; every setter re-queries\n * the server and **stale responses never overwrite newer state** (latest-wins).\n *\n * - `setFilter` is debounced (default 300 ms); page, sort and page size load\n * immediately. Sort, filter and page-size changes reset to page 1.\n * - `rows` keeps its previous value while loading and on error, so the table\n * never blanks mid-transition; `error` is cleared by the next successful\n * load.\n * - Created in an injection context (a component field initialiser) it hooks\n * `DestroyRef` and cleans up automatically; anywhere else, call\n * {@link destroy} yourself.\n *\n * ```ts\n * interface User { id: number; name: string; email: string; }\n *\n * @Component({\n * imports: [MkTable, MkPagination, MkInput],\n * template: `\n * <input\n * mkInput\n * type=\"search\"\n * placeholder=\"Search users…\"\n * (input)=\"ds.setFilter($any($event.target).value)\"\n * />\n *\n * <mk-table\n * [columns]=\"columns\"\n * [data]=\"ds.rows()\"\n * (sortChange)=\"ds.setSort($event)\"\n * />\n * @if (ds.error()) { <p role=\"alert\">Failed to load.</p> }\n * @if (ds.empty()) { <p>No users match.</p> }\n *\n * <mk-pagination\n * [total]=\"ds.total()\"\n * [pageSize]=\"ds.pageSize()\"\n * [page]=\"ds.page()\"\n * (pageChange)=\"ds.setPage($event)\"\n * />\n * `,\n * })\n * export class UsersPage {\n * private readonly http = inject(HttpClient);\n *\n * readonly columns: MkTableColumn<User>[] = [\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'email', header: 'Email', sortable: true },\n * ];\n *\n * // Field initialiser = injection context, so cleanup is automatic.\n * readonly ds = new MkTableDataSource<User>(\n * (req) =>\n * this.http.get<MkDataPage<User>>('/api/users', {\n * params: {\n * page: req.page,\n * size: req.pageSize,\n * q: req.filter,\n * ...(req.sort && {\n * sort: `${req.sort.active},${req.sort.direction}`,\n * }),\n * },\n * }),\n * { pageSize: 20 },\n * );\n * }\n * ```\n *\n * With a custom `mkSort` table, forward the directive instead of binding:\n *\n * ```ts\n * private readonly sort = viewChild.required(MkSort);\n * constructor() {\n * afterNextRender(() => this.ds.connectSort(this.sort()));\n * }\n * ```\n */\nexport class MkTableDataSource<T> {\n private readonly fetcher: MkDataFetcher<T>;\n private readonly debounceMs: number;\n\n private readonly _rows = signal<T[]>([]);\n private readonly _total = signal(0);\n private readonly _loading = signal(false);\n private readonly _error = signal<unknown | null>(null);\n private readonly _page = signal(1);\n private readonly _pageSize = signal(DEFAULT_PAGE_SIZE);\n private readonly _sort = signal<MkSortState | null>(null);\n private readonly _filter = signal('');\n private readonly _query = signal<MkQueryGroup | null>(null);\n private readonly _filters = signal<MkTableFilters | null>(null);\n\n /** Rows of the current page (`[]` until the first load lands). */\n readonly rows = this._rows.asReadonly();\n /** Total row count across all pages (feed to `mk-pagination`'s `total`). */\n readonly total = this._total.asReadonly();\n /** True while the LATEST request is in flight. */\n readonly loading = this._loading.asReadonly();\n /** The last load's error, or `null`; cleared by the next successful load. */\n readonly error = this._error.asReadonly();\n /** Current 1-based page. */\n readonly page = this._page.asReadonly();\n /** Current page size. */\n readonly pageSize = this._pageSize.asReadonly();\n /** Current sort, or `null` when unsorted. */\n readonly sort = this._sort.asReadonly();\n /** Current filter query (updates immediately, even while debouncing). */\n readonly filter = this._filter.asReadonly();\n /** Current structured query, or `null`. */\n readonly query = this._query.asReadonly();\n /** Current per-column filters, or `null`. */\n readonly filters = this._filters.asReadonly();\n /** True when a settled load reported no rows at all. */\n readonly empty: Signal<boolean> = computed(\n () => !this._loading() && this._total() === 0,\n );\n\n /** Monotonic request id — settles from older epochs are discarded. */\n private epoch = 0;\n /** Subscription to an in-flight Observable fetch, if any. */\n private activeSub: Unsubscribable | null = null;\n /** Pending filter-debounce timer. */\n private filterTimer: ReturnType<typeof setTimeout> | null = null;\n /** Subscriptions created by {@link connectSort}, keyed for idempotence. */\n private readonly sortSubs = new Map<MkSort, Unsubscribable>();\n private destroyed = false;\n\n constructor(fetcher: MkDataFetcher<T>, opts?: MkTableDataSourceOptions) {\n this.fetcher = fetcher;\n this.debounceMs = opts?.filterDebounce ?? DEFAULT_FILTER_DEBOUNCE;\n if (opts?.pageSize != null) this._pageSize.set(opts.pageSize);\n\n // Auto-cleanup when constructed in an injection context (a component\n // field initialiser). Outside one, inject() throws and the consumer owns\n // calling destroy().\n try {\n inject(DestroyRef).onDestroy(() => this.destroy());\n } catch {\n // Not in an injection context — manual destroy().\n }\n\n this.load();\n }\n\n /** Jump to a 1-based page and load it immediately. */\n setPage(page: number): void {\n const next = Math.max(1, Math.floor(page));\n if (next === this._page()) return;\n this._page.set(next);\n this.load();\n }\n\n /** Change the page size; resets to page 1 and loads immediately. */\n setPageSize(size: number): void {\n const next = Math.max(1, Math.floor(size));\n if (next === this._pageSize()) return;\n this._pageSize.set(next);\n this._page.set(1);\n this.load();\n }\n\n /**\n * Change the sort; resets to page 1 and loads immediately. Accepts either\n * the `mkSort` directive's {@link MkSortState} or `mk-table`'s\n * {@link MkSortChange} payload; a cleared sort (`direction: 'none'` or an\n * empty column id) normalises to `null`. A no-op when the sort is unchanged.\n */\n setSort(sort: MkSortState | MkSortChange | null): void {\n const next = normalizeSort(sort);\n if (sameSort(next, this._sort())) return;\n this._sort.set(next);\n this._page.set(1);\n this.load();\n }\n\n /**\n * Change the free-text filter. The `filter` signal updates (and the page\n * resets to 1) immediately, but the request is debounced — `refresh()`\n * flushes it early. A no-op when the query is unchanged.\n */\n setFilter(query: string): void {\n if (query === this._filter()) return;\n this._filter.set(query);\n this._page.set(1);\n this.cancelDebounce();\n if (this.destroyed) return;\n this.filterTimer = setTimeout(() => {\n this.filterTimer = null;\n this.load();\n }, this.debounceMs);\n }\n\n /**\n * Set (or clear with `null`) the structured query from `mk-query-builder`.\n * Empty groups and unfinished rules are dropped before the request; a query\n * with nothing left is sent as `null`. Resets to page 1 and loads at once.\n */\n setQuery(query: MkQueryGroup | null): void {\n const compact = query ? mkQueryCompact(query) : null;\n const next = compact && compact.rules.length ? compact : null;\n if (JSON.stringify(next) === JSON.stringify(this._query())) return;\n this._query.set(next);\n this._page.set(1);\n this.load();\n }\n\n /**\n * Set (or clear with `null` / `{}`) the per-column filters from `mk-table`'s\n * header filter row — bind `(filtersChange)=\"ds.setFilters($event)\"` and\n * turn the table's `clientFilter` off. Empty entries are dropped before the\n * request; nothing left is sent as `null`. Resets to page 1 and loads at\n * once (the table already debounces nothing, so debounce the fetcher if\n * your API needs it). A no-op when unchanged.\n */\n setFilters(filters: MkTableFilters | null): void {\n const next = mkCompactFilters(filters);\n if (canonicalJson(next) === canonicalJson(this._filters())) return;\n this._filters.set(next);\n this._page.set(1);\n this.load();\n }\n\n /**\n * Re-run the current request immediately (e.g. after a mutation). Flushes a\n * pending debounced filter, since the request reads the live filter value.\n */\n refresh(): void {\n this.load();\n }\n\n /**\n * Back to page 1 and load — the \"filters changed outside the search box\"\n * case. Unlike {@link setPage}, this loads even when already on page 1, so\n * callers no longer need `page() === 1 ? refresh() : setPage(1)`.\n */\n reload(): void {\n this._page.set(1);\n this.load();\n }\n\n /**\n * Pipe an `mkSort` directive's changes into {@link setSort}. Idempotent per\n * directive instance; all subscriptions are released by {@link destroy}.\n */\n connectSort(sort: MkSort): void {\n if (this.destroyed || this.sortSubs.has(sort)) return;\n this.sortSubs.set(\n sort,\n sort.sortChange.subscribe((state) => this.setSort(state)),\n );\n }\n\n /**\n * Cancel pending work: the debounce timer, any in-flight Observable fetch,\n * and `connectSort` subscriptions. In-flight Promise settles are discarded.\n * Called automatically on host destroy when created in an injection context.\n */\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.epoch++; // Anything still in flight settles stale.\n this.cancelDebounce();\n this.unsubscribeActive();\n for (const sub of this.sortSubs.values()) sub.unsubscribe();\n this.sortSubs.clear();\n this._loading.set(false);\n }\n\n /** Start a load for the current request state; supersedes any in flight. */\n private load(): void {\n if (this.destroyed) return;\n this.cancelDebounce();\n this.unsubscribeActive();\n const epoch = ++this.epoch;\n this._loading.set(true);\n const req: MkDataRequest = {\n page: this._page(),\n pageSize: this._pageSize(),\n sort: this._sort(),\n filter: this._filter(),\n query: this._query(),\n filters: this._filters(),\n };\n let result: Promise<MkDataPage<T>> | Observable<MkDataPage<T>>;\n try {\n result = this.fetcher(req);\n } catch (err) {\n this.settleError(epoch, err);\n return;\n }\n if (isSubscribable(result)) {\n this.runObservable(result, epoch);\n } else {\n result.then(\n (page) => this.settleSuccess(epoch, page),\n (err) => this.settleError(epoch, err),\n );\n }\n }\n\n /** Subscribe single-shot: first emission (or error) settles, then release. */\n private runObservable(source: Observable<MkDataPage<T>>, epoch: number): void {\n let done = false;\n let sync = true;\n const sub = source.subscribe({\n next: (page) => {\n if (done) return;\n done = true;\n this.settleSuccess(epoch, page);\n if (!sync) this.clearSub(sub);\n },\n error: (err) => {\n if (done) return;\n done = true;\n this.settleError(epoch, err);\n if (!sync) this.clearSub(sub);\n },\n });\n sync = false;\n if (done) sub.unsubscribe();\n else this.activeSub = sub;\n }\n\n /** Apply a successful settle, unless a newer request superseded it. */\n private settleSuccess(epoch: number, page: MkDataPage<T>): void {\n if (epoch !== this.epoch || this.destroyed) return;\n this._rows.set(page.rows);\n this._total.set(page.total);\n this._error.set(null);\n this._loading.set(false);\n }\n\n /** Record a failed settle (rows/total untouched), unless superseded. */\n private settleError(epoch: number, err: unknown): void {\n if (epoch !== this.epoch || this.destroyed) return;\n this._error.set(err);\n this._loading.set(false);\n }\n\n private cancelDebounce(): void {\n if (this.filterTimer != null) {\n clearTimeout(this.filterTimer);\n this.filterTimer = null;\n }\n }\n\n private unsubscribeActive(): void {\n if (this.activeSub) {\n this.activeSub.unsubscribe();\n this.activeSub = null;\n }\n }\n\n private clearSub(sub: Unsubscribable): void {\n if (this.activeSub === sub) this.activeSub = null;\n sub.unsubscribe();\n }\n}\n\n/** Options for {@link mkClientFetcher}. */\nexport interface MkClientFetcherOptions<T> {\n /** Row matcher for `setFilter` text; default: case-insensitive substring over every string/number field. */\n match?: (row: T, query: string) => boolean;\n /** Comparator for an active sort; default: locale compare on `row[sort.active]`. */\n compare?: (a: T, b: T, sort: MkSortState) => number;\n}\n\n/**\n * In-memory {@link MkDataFetcher}: filter, sort and slice a full row set that\n * the app already holds (an API that returns everything). Lets a client-side\n * list use {@link MkTableDataSource} — same pager, footer and API as a\n * server-paged one — without hand-rolling `filtered/sorted/paged` computeds.\n *\n * ```ts\n * ds = new MkTableDataSource(mkClientFetcher(() => this.rows()));\n * ```\n */\nexport function mkClientFetcher<T>(\n rows: () => readonly T[],\n opts: MkClientFetcherOptions<T> = {},\n): (req: MkDataRequest) => Promise<MkDataPage<T>> {\n const match =\n opts.match ??\n ((row: T, q: string) =>\n Object.values(row as Record<string, unknown>).some((v) =>\n (typeof v === 'string' || typeof v === 'number') &&\n String(v).toLowerCase().includes(q),\n ));\n const compare =\n opts.compare ??\n ((a: T, b: T, sort: MkSortState) => {\n const av = (a as Record<string, unknown>)[sort.active];\n const bv = (b as Record<string, unknown>)[sort.active];\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n if (typeof av === 'number' && typeof bv === 'number') return av - bv;\n return String(av).localeCompare(String(bv), undefined, { numeric: true, sensitivity: 'base' });\n });\n return (req) => {\n const q = req.filter.trim().toLowerCase();\n let out = q ? rows().filter((r) => match(r, q)) : [...rows()];\n if (req.sort && req.sort.direction !== 'none') {\n const dir = req.sort.direction === 'desc' ? -1 : 1;\n out = [...out].sort((a, b) => dir * compare(a, b, req.sort as MkSortState));\n }\n const start = (req.page - 1) * req.pageSize;\n return Promise.resolve({ rows: out.slice(start, start + req.pageSize), total: out.length });\n };\n}\n","/**\n * @mk-kit/ui/table — the data table, grid features and sort directives.\n */\nexport * from './table';\nexport * from './sort';\nexport * from './data-source';\nexport * from './export';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}