@alfadocs/ui-kit-debug 1.125.3 → 1.127.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{balance-badge-cell-DtxbGJcA.js → balance-badge-cell-BtFge7Y6.js} +3 -3
- package/dist/_chunks/{balance-badge-cell-DtxbGJcA.js.map → balance-badge-cell-BtFge7Y6.js.map} +1 -1
- package/dist/_chunks/{bill-line-table-HrynB7ND.js → bill-line-table-BRxX0Awq.js} +2 -2
- package/dist/_chunks/{bill-line-table-HrynB7ND.js.map → bill-line-table-BRxX0Awq.js.map} +1 -1
- package/dist/_chunks/{calendar-appointment-editor-dialog-CiCmsBCH.js → calendar-appointment-editor-dialog-B-zYgCgH.js} +2 -2
- package/dist/_chunks/{calendar-appointment-editor-dialog-CiCmsBCH.js.map → calendar-appointment-editor-dialog-B-zYgCgH.js.map} +1 -1
- package/dist/_chunks/{data-grid-C71BhGDw.js → data-grid-bzvkQ3kc.js} +446 -423
- package/dist/_chunks/data-grid-bzvkQ3kc.js.map +1 -0
- package/dist/_chunks/{data-table-DhYx-hCD.js → data-table-BCfkcPti.js} +2 -2
- package/dist/_chunks/{data-table-DhYx-hCD.js.map → data-table-BCfkcPti.js.map} +1 -1
- package/dist/_chunks/{default-tabs-RvCI5uN0.js → default-tabs-yEfqAPuT.js} +3 -3
- package/dist/_chunks/{default-tabs-RvCI5uN0.js.map → default-tabs-yEfqAPuT.js.map} +1 -1
- package/dist/_chunks/{file-manager-DNq-sEsy.js → file-manager-Dpwv0qs-.js} +2 -2
- package/dist/_chunks/{file-manager-DNq-sEsy.js.map → file-manager-Dpwv0qs-.js.map} +1 -1
- package/dist/_chunks/{heatmap-BurtKmeu.js → heatmap-Ds5DJBUL.js} +2 -2
- package/dist/_chunks/{heatmap-BurtKmeu.js.map → heatmap-Ds5DJBUL.js.map} +1 -1
- package/dist/_chunks/{invoice-upload-list-C95s5Q7m.js → invoice-upload-list-CgS_TBuX.js} +12 -12
- package/dist/_chunks/invoice-upload-list-CgS_TBuX.js.map +1 -0
- package/dist/_chunks/{link-cell-renderer-BEaLczk2.js → link-cell-renderer-CC9VHU68.js} +2 -2
- package/dist/_chunks/{link-cell-renderer-BEaLczk2.js.map → link-cell-renderer-CC9VHU68.js.map} +1 -1
- package/dist/_chunks/{muscle-scheme-C9dnSxzw.js → muscle-scheme-TgnoZGDA.js} +725 -590
- package/dist/_chunks/muscle-scheme-TgnoZGDA.js.map +1 -0
- package/dist/_chunks/{parts-CcyRkB8t.js → parts-tGzYz0uG.js} +42 -36
- package/dist/_chunks/parts-tGzYz0uG.js.map +1 -0
- package/dist/_chunks/{toolbar-Dznu_Dou.js → toolbar-Co46MEn9.js} +3 -3
- package/dist/_chunks/{toolbar-Dznu_Dou.js.map → toolbar-Co46MEn9.js.map} +1 -1
- package/dist/_chunks/warehouse-load-summary-DkAKXcw0.js +289 -0
- package/dist/_chunks/warehouse-load-summary-DkAKXcw0.js.map +1 -0
- package/dist/agent-catalog.json +7 -7
- package/dist/browser-support.js +1 -1
- package/dist/components/_shared/table-toolbar/parts.d.ts.map +1 -1
- package/dist/components/bill-line-table/index.js +1 -1
- package/dist/components/bill-table/index.js +1 -1
- package/dist/components/data-grid/data-grid.variants.d.ts +3 -1
- package/dist/components/data-grid/data-grid.variants.d.ts.map +1 -1
- package/dist/components/data-grid/header.d.ts.map +1 -1
- package/dist/components/data-grid/index.js +2 -2
- package/dist/components/data-table/index.js +2 -2
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/invoice-upload-list/columns.d.ts.map +1 -1
- package/dist/components/invoice-upload-list/index.js +1 -1
- package/dist/components/muscle-scheme/index.js +1 -1
- package/dist/components/muscle-scheme/muscle-scheme-data.d.ts +3 -2
- package/dist/components/muscle-scheme/muscle-scheme-data.d.ts.map +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/warehouse-load-summary/index.js +1 -1
- package/dist/components/warehouse-load-summary/types.d.ts +6 -0
- package/dist/components/warehouse-load-summary/types.d.ts.map +1 -1
- package/dist/components/warehouse-load-summary/warehouse-load-summary.d.ts +1 -1
- package/dist/components/warehouse-load-summary/warehouse-load-summary.d.ts.map +1 -1
- package/dist/core.css +1 -1
- package/dist/host-legacy.css +9 -0
- package/dist/i18n/locales/ar.d.ts +32 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +19 -2
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +32 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +16 -2
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +32 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +18 -1
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +32 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +19 -2
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +32 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +18 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +32 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +16 -2
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +32 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +19 -2
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +32 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +18 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +32 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +16 -2
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +32 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +16 -2
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +32 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +19 -2
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +32 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +18 -1
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +32 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +21 -1
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +32 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +21 -1
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +32 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +18 -1
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +32 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +16 -2
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +32 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +16 -2
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +32 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +16 -2
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +13 -13
- package/dist/locales/ar.json +33 -1
- package/dist/locales/de.json +33 -1
- package/dist/locales/el.json +33 -1
- package/dist/locales/en.json +33 -1
- package/dist/locales/es.json +33 -1
- package/dist/locales/fr.json +33 -1
- package/dist/locales/hi.json +33 -1
- package/dist/locales/it.json +33 -1
- package/dist/locales/ja.json +33 -1
- package/dist/locales/nl.json +33 -1
- package/dist/locales/pl.json +33 -1
- package/dist/locales/pt.json +33 -1
- package/dist/locales/ro.json +33 -1
- package/dist/locales/ru.json +33 -1
- package/dist/locales/sq.json +33 -1
- package/dist/locales/sv.json +33 -1
- package/dist/locales/tr.json +33 -1
- package/dist/locales/zh.json +33 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/data-grid-C71BhGDw.js.map +0 -1
- package/dist/_chunks/invoice-upload-list-C95s5Q7m.js.map +0 -1
- package/dist/_chunks/muscle-scheme-C9dnSxzw.js.map +0 -1
- package/dist/_chunks/parts-CcyRkB8t.js.map +0 -1
- package/dist/_chunks/warehouse-load-summary-D88M4Ii7.js +0 -255
- package/dist/_chunks/warehouse-load-summary-D88M4Ii7.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table-DhYx-hCD.js","sources":["../../src/components/data-table/header-min-width.ts","../../src/components/_shared/table-toolbar/seam.ts","../../src/components/data-table/expanded-row-renderer.tsx","../../src/components/data-table/filters/filter-kind.ts","../../src/components/data-table/filters/text-filter.tsx","../../src/components/data-table/ag-toolbar-seam.ts","../../src/components/data-table/toolbar.tsx","../../src/components/data-table/hooks/use-presentational-aria-fix.ts","../../src/components/data-table/data-table.agent.ts","../../src/components/data-table/ag-grid-locale.ts","../../src/components/data-table/data-table.tsx"],"sourcesContent":["import type { ColDef, ColGroupDef } from 'ag-grid-community';\n\n/** Room a header cell needs beside its text: side padding and the sort icon. */\nexport const HEADER_CELL_EXTRA_PX = 52;\n\n/** The longest run of characters a wrapped header cannot break. */\nexport function longestWord(text: string): string {\n let best = '';\n for (const word of text.split(/\\s+/)) {\n if (word.length > best.length) best = word;\n }\n return best;\n}\n\ntype AnyDef<T> = ColDef<T> | ColGroupDef<T>;\n\n/**\n * Raises `minWidth` on every column whose header wraps (`wrapHeaderText`) to\n * the width of its longest word, so a word never splits across two lines.\n * A column that is already wider keeps its own `minWidth`. When the columns\n * together are wider than the grid, the grid scrolls sideways.\n */\nexport function withHeaderMinWidths<T>(\n defs: readonly AnyDef<T>[],\n measure: ((word: string) => number) | null,\n): AnyDef<T>[] {\n if (!measure) return defs as AnyDef<T>[];\n return defs.map((def) => {\n if ('children' in def && def.children) {\n return { ...def, children: withHeaderMinWidths(def.children, measure) };\n }\n const col = def as ColDef<T>;\n if (!col.wrapHeaderText || typeof col.headerName !== 'string') return col;\n const word = longestWord(col.headerName);\n if (!word) return col;\n const floor = Math.ceil(measure(word)) + HEADER_CELL_EXTRA_PX;\n return floor > (col.minWidth ?? 0) ? { ...col, minWidth: floor } : col;\n });\n}\n\n/**\n * A function that measures a word as the grid's header text paints it, using\n * a probe inside the themed grid root so the header font, weight, case and\n * letter spacing all apply.\n */\nexport function createHeaderMeasure(\n root: HTMLElement,\n): (word: string) => number {\n return (word) => {\n const probe = document.createElement('span');\n probe.className = 'ag-header-cell-text';\n probe.textContent = word;\n // Imperative probe, removed at once: not a rendered inline style.\n probe.style.cssText =\n 'position:absolute;visibility:hidden;white-space:nowrap;inline-size:auto;';\n root.appendChild(probe);\n const width = probe.getBoundingClientRect().width;\n probe.remove();\n return width;\n };\n}\n","/* -------------------------------------------------------------------- */\n/* Table toolbar seam: the contract between the kit's toolbar parts and */\n/* a table engine. */\n/* */\n/* Engine-agnostic. Nothing here names AG Grid or TanStack, so the shared */\n/* parts in this folder can serve DataTable (through an AG-backed seam in */\n/* `data-table/ag-toolbar-seam.ts`) and DataGrid (through the seam built */\n/* in `data-grid/toolbar-seam.ts`) without either engine's runtime. */\n/* */\n/* Types and contract constants only. Frozen for the Phase 1 build: */\n/* change it only through the lead. */\n/* -------------------------------------------------------------------- */\n\n/* ------------------------------------------------------------------ */\n/* Filter models: the kit vocabulary */\n/* */\n/* The same five shapes DataTable's filters use today */\n/* (`data-table/filters/*.tsx`), so a saved tab, an agent call or a */\n/* toolbar chip reads one model in either table. DataTable's text, */\n/* number, select and date-range filters re-export these types; its */\n/* typeahead model is its own declaration, held equal to the copy here */\n/* by a type test (`describe-filter.test.ts`). */\n/* ------------------------------------------------------------------ */\n\n/** Text operators (`data-table/filters/text-filter.tsx:40-45`). */\nexport type TextFilterOperator =\n | 'contains'\n | 'equals'\n | 'startsWith'\n | 'endsWith'\n | 'notContains';\n\n/** `{ type, filter }` (`data-table/filters/text-filter.tsx:47-50`). */\nexport interface TextFilterModel {\n type: TextFilterOperator;\n filter: string;\n}\n\n/** Number operators, AG `agNumberColumnFilter` vocabulary\n * (`data-table/filters/number-filter.tsx:41-50`). */\nexport type NumberFilterOperator =\n | 'equals'\n | 'notEqual'\n | 'greaterThan'\n | 'greaterThanOrEqual'\n | 'lessThan'\n | 'lessThanOrEqual'\n | 'inRange'\n | 'blank'\n | 'notBlank';\n\n/** `{ type, filter?, filterTo? }` (`data-table/filters/number-filter.tsx:52-58`).\n * `inRange` may carry only one bound. */\nexport interface NumberFilterModel {\n type: NumberFilterOperator;\n filter?: number;\n filterTo?: number;\n}\n\n/** Set membership (`data-table/filters/select-filter.tsx:47-50`). Values are\n * the option values, never translated labels. */\nexport interface SelectFilterModel {\n type: 'set';\n values: Array<string | number>;\n}\n\n/** Calendar days as `YYYY-MM-DD`; either bound may be open\n * (`data-table/filters/date-range-filter.tsx:30-34`). */\nexport interface DateRangeFilterModel {\n type: 'inRange';\n dateFrom: string | null;\n dateTo: string | null;\n}\n\n/** One chosen value (`data-table/filters/typeahead-filter.tsx:41-44`).\n * DataTable only; DataGrid has no typeahead filter in Phase 1. Kept here so\n * FilterChips can describe it for both engines. A type test in\n * `describe-filter.test.ts` keeps it equal to DataTable's declaration. */\nexport interface TypeaheadFilterModel {\n type: 'equals';\n value: string;\n}\n\n/** Any kit column filter model. */\nexport type TableColumnFilterModel =\n | TextFilterModel\n | NumberFilterModel\n | SelectFilterModel\n | DateRangeFilterModel\n | TypeaheadFilterModel;\n\n/** The filter kinds a toolbar may meet on a column. */\nexport type TableFilterKind =\n | 'text'\n | 'number'\n | 'select'\n | 'dateRange'\n | 'typeahead';\n\n/**\n * Every active filter, keyed by column id. The same shape as\n * `DataTableHandle.getFilter()` (`data-table/data-table.tsx:118`). DataGrid\n * may also carry host keys here (filters the host evaluates on its server,\n * with no column); their values are opaque to the toolbar.\n */\nexport type TableFilterModelMap = Record<string, unknown>;\n\n/** A FacetFilter pill value. `null` clears the facet. */\nexport type TableFacetValue = string | number | boolean;\n\n/* ------------------------------------------------------------------ */\n/* Columns, export and action context */\n/* ------------------------------------------------------------------ */\n\n/** What ColumnToggle, FilterChips and the export builders need to know about\n * one column. Utility columns (selection, expander) are never listed. */\nexport interface TableToolbarColumn {\n /** Column id (a developer constant, not row data). */\n id: string;\n /** Plain, translated column name. */\n label: string;\n visible: boolean;\n /** False for the row-header column and columns declared not hideable. */\n canHide: boolean;\n /** False for columns declared not reorderable. */\n canMove: boolean;\n pinned: 'start' | 'end' | false;\n /** The column's filter kind, or `null` when it has no filter. */\n filterKind: TableFilterKind | null;\n /** False for columns declared not pinnable: ColumnToggle refuses a drop\n * that would change their pin side. Absent (AG seam) = pinnable. */\n canPin?: boolean;\n /** Header group the column belongs to; a move may not take it out of its\n * group. Absent (AG seam) or `null` = no group. */\n groupId?: string | null;\n /** `true` while privacy mode hides this column's values (DataGrid: any\n * `privacy` with `privacyMode` on). FilterChips then names the column\n * only, never the filter value. While any column is masked, the\n * quick-search text counts as personal too (it may be a name, as the\n * DataGrid agent treats it): the quick-search chip shows its label only\n * and QuickSearch never paints a query it did not receive from the\n * user's own typing. Absent (AG seam) = not masked. */\n masked?: boolean;\n /** `true` for a column privacy mode removes from view (DataGrid\n * `privacy: 'hide'` with `privacyMode` on). ColumnToggle leaves it out\n * of its list (design 3.9). Absent (AG seam) = not hidden by privacy. */\n hiddenByPrivacy?: boolean;\n /** Select columns: the option labels, so a chip says \"To load\" rather\n * than the value `toLoad`. Labels are translated by the host. Absent\n * (AG seam) = chips show the raw values, as in kit 1.112. */\n filterOptions?: ReadonlyArray<{ value: string | number; label: string }>;\n}\n\n/** One exported cell: formatted text, a number (kept numeric for XLSX), or\n * empty. Privacy-masked cells carry the mask text, never the value. */\nexport type TableExportCell = string | number | null;\n\n/**\n * Rows for CSV, XLSX, PDF and custom export handlers.\n *\n * `rows` holds every row after filters and sorting and before pagination,\n * never only the virtualised window or the current page, except when the\n * engine cannot reach them (DataGrid server mode), where `scope` says so.\n */\nexport interface TableExportSnapshot {\n /** `'all-filtered'`: every filtered, sorted row. `'current-page'`: the\n * engine holds only one page (server mode). */\n scope: 'all-filtered' | 'current-page';\n /** Visible, exportable columns in display order. */\n columns: ReadonlyArray<{ id: string; label: string; align: 'start' | 'end' }>;\n /** `id` is the opaque row id; `cells` follow `columns`. */\n rows: ReadonlyArray<{ id: string; cells: ReadonlyArray<TableExportCell> }>;\n /** The totals row, when the table shows one, as a separate line. */\n totals: ReadonlyArray<TableExportCell> | null;\n}\n\n/** What BulkAction and a custom ExportMenu item receive (engine-agnostic).\n * Ids only: no row objects, no engine API. */\nexport interface ToolbarActionContext {\n selectedRowIds: readonly string[];\n getExportSnapshot: () => TableExportSnapshot | undefined;\n}\n\n/* ------------------------------------------------------------------ */\n/* The seam */\n/* ------------------------------------------------------------------ */\n\n/** What changed, for `subscribe`. `'rows'` covers new data and paging. */\nexport type TableToolbarChangeKind =\n | 'filter'\n | 'quickFilter'\n | 'selection'\n | 'columns'\n | 'rows';\n\n/**\n * Behaviour switches that let the shared parts serve both engines. The AG\n * seam declares `DATA_TABLE_TOOLBAR_FEATURES` (below): since kit 1.113 all\n * three are `true` for DataTable too (Product decision, 4 Nov 2026), which\n * fixes two DataTable toolbar bugs and adds keyboard reorder. Setting a flag\n * back to `false` there restores the 1.112 behaviour for that part.\n */\nexport interface TableToolbarFeatures {\n /** QuickSearch and FacetFilter follow external changes (tabs, chips,\n * agents, a programmatic clear). AG seam: `true` (fixes QuickSearch\n * keeping its text after an external clear; FacetFilter reads its pill\n * from `getFacet`). DataGrid: `true`. When `false`, both keep local\n * state (1.112 behaviour, `data-table/toolbar.tsx:429,723`). */\n syncsFilterInputs: boolean;\n /** The built-in CSV, XLSX and PDF items can reach every filtered row.\n * AG seam: `true`. DataGrid: `true` in client mode, `false` in server\n * mode, where the built-ins render disabled with a reason and only\n * `custom` items run. */\n exportsAllRows: boolean;\n /** ColumnToggle shows Move up and Move down buttons per column (the\n * keyboard path to reordering, through `moveColumn`). AG seam: `true`\n * (fixes the missing keyboard reorder). DataGrid: `true`. Its \"Reset\n * columns\" button needs `resetColumns` as well (absent: not shown). */\n keyboardReorder: boolean;\n /** FilterChips formats number filter values with the kit's\n * `formatNumber` and calendar days with the kit's short day format, in\n * the UI language. It also names select options by their labels, says\n * \"From\" or \"To\" for an open date bound, names a text operator in the\n * text filter menu's words and joins column and value through\n * `dataTable.filterChips.chip`. AG seam: absent (1.112 chip text).\n * DataGrid: `true`. */\n formatsFilterValues?: boolean;\n /** ColumnToggle announces a move, pin or unpin through its own polite\n * status region. For an engine with no announcer of its own. AG seam:\n * `true`. DataGrid: absent, because its announcer already says it. */\n toolbarAnnouncesColumnMoves?: boolean;\n}\n\n/**\n * The features the DataTable (AG-backed) seam declares\n * (`data-table/ag-toolbar-seam.ts`). All three DataTable toolbar fixes are\n * on from kit 1.113 (CHANGELOG \"Fixed\"). The third fix, FacetFilter's\n * model on select columns, has no flag: it is how the AG seam implements\n * `setFacet` and `getFacet` (see those members).\n */\nexport const DATA_TABLE_TOOLBAR_FEATURES: Readonly<TableToolbarFeatures> = {\n syncsFilterInputs: true,\n exportsAllRows: true,\n keyboardReorder: true,\n toolbarAnnouncesColumnMoves: true,\n};\n\n/**\n * The only way a toolbar part reaches a table. Every method is synchronous\n * and safe to call before the engine is ready (`isReady()` false): reads\n * return empty values and writes are ignored.\n */\nexport interface TableToolbarSeam {\n readonly features: TableToolbarFeatures;\n\n /** `true` once the engine can answer. DataGrid: from its first render.\n * AG: once `getApi()` resolves. */\n isReady(): boolean;\n /**\n * Fires after any change of the given kind, including programmatic ones.\n * Replaces the 50 ms polls in today's toolbar (`toolbar.tsx:608-629`).\n * Safe to call before ready: the seam binds late and returns an\n * unsubscribe that always works. Fires `'columns'` whenever any column's\n * `masked` or `hiddenByPrivacy` value changes (privacy mode switched),\n * so no part keeps showing text it read before.\n */\n subscribe(listener: (kind: TableToolbarChangeKind) => void): () => void;\n\n /* ---- ColumnToggle ---- */\n\n /** Display order: start-pinned first, centre, end-pinned last. */\n getColumns(): TableToolbarColumn[];\n /** A user choice: the engine records the column as user-touched. */\n setColumnVisible(id: string, visible: boolean): void;\n /** ColumnToggle's \"Reset columns\": declared order, visibility, pins and\n * widths, and forget the saved column state. DataGrid:\n * `resetColumnState()`. Absent on the AG seam in 1.113 (DataTable's\n * saved column state and responsive baseline need their own change), so\n * DataTable's ColumnToggle shows Move up and Move down without Reset. */\n resetColumns?(): void;\n /**\n * Moves a column so that its final index in `getColumns()` is `toIndex`\n * (remove, then insert). It takes the pin side of the column that sat at\n * `toIndex` before the move (today's rule, `data-table/toolbar.tsx:1068-1071`).\n * A refused move (not reorderable; not pinnable but the side would change;\n * leaves its group) is a no-op. The AG seam maps `toIndex` through the\n * target column's id, because AG `moveColumns` indexes count hidden and\n * utility columns. The 12.3 contract harness covers both seams.\n */\n moveColumn(id: string, toIndex: number): void;\n\n /* ---- QuickSearch, FilterChips, FacetFilter ---- */\n\n getQuickFilter(): string;\n setQuickFilter(text: string): void;\n /** Every active filter, column keys and host keys alike. */\n getFilterModel(): TableFilterModelMap;\n /** Sets or clears (`null`) one key. Chips clear host keys this way too.\n * The DataGrid seam builds it as read-modify-write over the handle\n * (`getFilter`, change one key, `setFilter`); that is safe because the\n * handle's reads return the last write even for controlled filters, so\n * two calls in one tick both survive. */\n setColumnFilter(id: string, model: TableColumnFilterModel | null): void;\n /** Clears every column filter, every host key and the quick filter. */\n clearAllFilters(): void;\n /** One-value facet. AG seam (from 1.113): on a column whose filter is\n * the kit `SelectFilter` (`filterKind: 'select'`) and a string or number\n * value, writes `{ type: 'set', values: [value] }`, because 1.112's\n * `{ type: 'equals', filter }` was a silent no-op there\n * (`select-filter.tsx:183-184`); on any other column it writes\n * `{ type: 'equals', filter }` as before (`toolbar.tsx:731-741`).\n * DataGrid writes\n * `{ type: 'set', values: [value] }`; in client mode `id` must be a column\n * with `filter: { kind: 'select' }` (else a DEV warning and no write),\n * because v9 evaluates a column with the fn of its own filter kind; in\n * server mode a host key is also accepted. */\n setFacet(id: string, value: TableFacetValue | null): void;\n /** The active facet value, when the engine can read it back: what a\n * `setFacet` on this id would have written, else `null`. AG seam (from\n * 1.113): a `set` model with exactly one value gives that value, an\n * `equals` model gives its `filter`, anything else `null`. When absent,\n * or `features.syncsFilterInputs` is `false`, FacetFilter keeps its own\n * pill state. */\n getFacet?(id: string): TableFacetValue | null;\n /** Chip label for a host key that has no column (DataGrid\n * `filterLabels`). Absent on the AG seam. A host-key chip shows this\n * label only, never the value (opaque, and possibly personal data). */\n getFilterLabel?(key: string): string | undefined;\n\n /* ---- BulkAction ---- */\n\n getSelectionCount(): number;\n /** Opaque row ids. AG seam skips expanded-detail rows. */\n getSelectedRowIds(): string[];\n\n /* ---- ExportMenu, Print ---- */\n\n /** `undefined` before ready. */\n getExportSnapshot(): TableExportSnapshot | undefined;\n /** CSV download. AG seam: `exportDataAsCsv()` with no argument when\n * `fileName` is absent (today's output, `data-table/toolbar.tsx:222, 922`),\n * `exportDataAsCsv({ fileName })` when given. DataGrid: the kit CSV\n * writer over `getExportSnapshot()`, default name from the caption. */\n exportCsv(fileName?: string): void;\n /** Prints every filtered row, never only the virtualised window. */\n print(): void | Promise<void>;\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useRef,\n type ComponentType,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\n\n/* ------------------------------------------------------------------ */\n/* Expandable row — Community-only accordion row */\n/* */\n/* AG Grid Community has no master/detail, so DataTable interleaves ONE */\n/* synthetic node right after the expanded row and renders it as a */\n/* full-width row. The synthetic node is seeded with the parent's field */\n/* values (so sort + filter keep it with its parent) plus a private */\n/* marker naming the parent id. Everything in this module is keyed off */\n/* that marker. */\n/* ------------------------------------------------------------------ */\n\n/** Private marker written onto the synthetic detail node's data. */\nexport const EXPANDED_ROW_MARKER = '__dsDetailOf';\n\n/** Row class stamped on the synthetic detail row (styled in ag-grid-theme.css). */\nexport const EXPANDED_ROW_CLASS = 'ds-data-table-expanded-row';\n\nconst EXPANDED_ROW_ID_SUFFIX = '::detail';\n\n/** What Enter on the AG Grid-focused detail row hands focus to. */\nconst FOCUSABLE_SELECTOR =\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n\nexport type ExpandedRowDetail<TData> = TData & {\n [EXPANDED_ROW_MARKER]: string;\n};\n\n/**\n * True when `data` is the synthetic detail node DataTable interleaves\n * beneath the expanded row. Custom export / iteration code that walks\n * `api.forEachNode*` should skip these.\n */\nexport function isExpandedRowDetail<TData>(\n data: TData | null | undefined,\n): data is ExpandedRowDetail<TData> {\n return (\n typeof data === 'object' &&\n data !== null &&\n typeof (data as Record<string, unknown>)[EXPANDED_ROW_MARKER] === 'string'\n );\n}\n\n/** Row id AG Grid sees for the detail node beneath `parentId`. */\nexport function expandedRowDetailId(parentId: string): string {\n return `${parentId}${EXPANDED_ROW_ID_SUFFIX}`;\n}\n\n/**\n * True when a `row-id` read off the DOM belongs to the synthetic detail\n * row rather than a record. The DOM-side twin of `isExpandedRowDetail`.\n */\nexport function isExpandedRowDetailId(rowId: string): boolean {\n return rowId.endsWith(EXPANDED_ROW_ID_SUFFIX);\n}\n\n/** Build the synthetic node: the parent's values plus the marker. */\nexport function seedExpandedRowDetail<TData>(\n parent: TData,\n parentId: string,\n): ExpandedRowDetail<TData> {\n return { ...parent, [EXPANDED_ROW_MARKER]: parentId };\n}\n\n/* ------------------------------------------------------------------ */\n/* Context — DataTable feeds the renderer without going through */\n/* fullWidthCellRendererParams (those are read once at row creation). */\n/* ------------------------------------------------------------------ */\n\nexport interface ExpandedRowContextValue<TData = unknown> {\n renderExpandedRow: ((row: TData) => ReactNode) | undefined;\n onExpandedRowChange: ((id: string | null) => void) | undefined;\n /** The one open row — the renderer hands its original object to `renderExpandedRow`. */\n expanded: { id: string; row: TData } | null;\n /** Measured detail heights by detail row id; served back through `getRowHeight`. */\n heights: Map<string, number>;\n /** Consumer's own full-width renderer, honoured for non-detail full-width rows. */\n fallbackRenderer: ComponentType<CustomCellRendererProps<TData>> | undefined;\n}\n\nexport const ExpandedRowContext = createContext<ExpandedRowContextValue | null>(\n null,\n);\n\n/* ------------------------------------------------------------------ */\n/* Renderer */\n/* ------------------------------------------------------------------ */\n\n/**\n * `fullWidthCellRenderer` for the synthetic detail node. Measures its own\n * content (Community has no auto-height for full-width rows) and pushes\n * the height into the node. Escape — on the grid-focused row or anywhere\n * inside the surface — asks the consumer to close; Enter on the row moves\n * focus into the content.\n */\nexport function ExpandedRowRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData>,\n) {\n const ctx = useContext(\n ExpandedRowContext,\n ) as ExpandedRowContextValue<TData> | null;\n const { t } = useTranslation('ui');\n const rootRef = useRef<HTMLDivElement>(null);\n const { data, node, api } = props;\n const isDetail = isExpandedRowDetail(data);\n const heights = ctx?.heights;\n const detailId = node.id;\n // Read through a ref so the native row listener below binds once.\n const ctxRef = useRef(ctx);\n ctxRef.current = ctx;\n\n useEffect(() => {\n const el = rootRef.current;\n if (!el || !isDetail || !heights || detailId == null) return;\n let last = heights.get(detailId) ?? 0;\n const apply = () => {\n const px = Math.ceil(el.getBoundingClientRect().height);\n if (px <= 0 || px === last) return;\n last = px;\n heights.set(detailId, px);\n node.setRowHeight(px);\n api.onRowHeightChanged();\n };\n apply();\n const observer = new ResizeObserver(apply);\n observer.observe(el);\n return () => observer.disconnect();\n }, [api, detailId, heights, isDetail, node]);\n\n // Arrow / Tab navigation focuses the `.ag-row` itself — the parent of\n // this surface — so React's onKeyDown below never sees those keys.\n useEffect(() => {\n const el = rootRef.current;\n const row = el?.parentElement;\n if (!el || !row || !isDetail) return;\n const onKey = (event: globalThis.KeyboardEvent) => {\n if (event.target !== row || event.defaultPrevented) return;\n if (event.key === 'Escape') {\n event.stopPropagation();\n ctxRef.current?.onExpandedRowChange?.(null);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n const first = el.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n (first ?? el).focus();\n }\n };\n row.addEventListener('keydown', onKey);\n return () => row.removeEventListener('keydown', onKey);\n }, [isDetail]);\n\n if (!isDetail) {\n const Fallback = ctx?.fallbackRenderer;\n return Fallback ? <Fallback {...props} /> : null;\n }\n\n const parentId = data[EXPANDED_ROW_MARKER];\n // Prefer the untouched parent object; fall back to stripping the marker\n // when the grid renders a detail whose parent has already changed.\n let row: TData;\n if (ctx?.expanded && ctx.expanded.id === parentId) {\n row = ctx.expanded.row;\n } else {\n const { [EXPANDED_ROW_MARKER]: _marker, ...rest } = data;\n row = rest as TData;\n }\n\n // A Radix layer (tooltip, menu, select) that dismissed on this Escape\n // has already called preventDefault — one keypress closes one thing.\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n event.stopPropagation();\n ctx?.onExpandedRowChange?.(null);\n };\n\n return (\n <div\n ref={rootRef}\n role=\"gridcell\"\n tabIndex={-1}\n data-component=\"data-table-expanded-row\"\n data-expanded-row-of={parentId}\n className=\"ds-data-table-expanded-row-surface\"\n onKeyDown={handleKeyDown}\n >\n {/* Visually hidden, not aria-label: a gridcell names from its\n author first, and a label would hide the content from the row. */}\n <span className=\"ds:sr-only\">{t('dataTable.expandedRow')}</span>\n {ctx?.renderExpandedRow?.(row)}\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Which kit filter a ColDef's `filter` is, without importing the filter. */\n/* */\n/* The AG toolbar seam needs to know a column's filter kind. Comparing */\n/* `def.filter === DateRangeFilter` would make DataTable import every */\n/* filter, and with them DateRangePicker, MultiSelect and Autocomplete. */\n/* Each filter module registers itself here instead. A filter that was */\n/* never imported cannot sit on a ColDef, so the answer is the same. */\n/* -------------------------------------------------------------------- */\n\nimport type { TableFilterKind } from '../../_shared/table-toolbar/seam';\n\nconst kinds = new WeakMap<object, TableFilterKind>();\n\n/** Called once by each kit filter module, next to its component. */\nexport function registerTableFilterKind(\n component: object,\n kind: TableFilterKind,\n): void {\n kinds.set(component, kind);\n}\n\n/** The kit filter kind of a ColDef `filter` value, or `null`. */\nexport function registeredTableFilterKind(\n filter: unknown,\n): TableFilterKind | null {\n if (typeof filter !== 'function' && (typeof filter !== 'object' || !filter))\n return null;\n return kinds.get(filter) ?? null;\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport type {\n CustomFilterProps,\n CustomFloatingFilterProps,\n} from 'ag-grid-react';\nimport { useGridFilter } from 'ag-grid-react';\nimport type { IFilter } from 'ag-grid-community';\nimport { useTranslation } from 'react-i18next';\nimport i18next from 'i18next';\nimport { Search, X } from 'lucide-react';\nimport { StateBackedTextInput } from '../../_shared/state-backed-text-input';\nimport { Select, type SelectOption } from '../../select';\nimport { Button } from '../../button';\nimport type {\n TextFilterModel,\n TextFilterOperator,\n} from '../../_shared/table-toolbar/seam';\nimport {\n coerceToString,\n makeTextMatcher as makeMatcher,\n} from '../../_shared/table-filters/predicates';\n\n/**\n * Custom AG Grid filter component — text-comparison filter.\n *\n * Fills the gap left by `agTextColumnFilter`'s stock browser-skinned\n * input by wrapping the kit's `<TextInput>` and `<Select>` so the\n * column-header menu (`TextFilter`) and the inline floating row\n * (`TextFloatingFilter`) match the DS form language.\n *\n * Wire on a colDef:\n * ```tsx\n * {\n * field: 'description',\n * filter: TextFilter,\n * floatingFilter: true,\n * floatingFilterComponent: TextFloatingFilter,\n * filterParams: { defaultOperator: 'contains' },\n * }\n * ```\n *\n * Model shape `{ type, filter }` mirrors AG Grid's `agTextColumnFilter`\n * text-operator vocabulary (`contains`, `equals`, `startsWith`,\n * `endsWith`, `notContains`) so server-side adapters that already\n * understand the stock filter can read this one identically.\n */\n\n// The model types are the kit's shared table vocabulary (one declaration\n// for DataTable and DataGrid); re-exported here under their old names.\nexport type {\n TextFilterModel,\n TextFilterOperator,\n} from '../../_shared/table-toolbar/seam';\n\nexport interface TextFilterParams {\n placeholder?: string;\n defaultOperator?: TextFilterOperator;\n}\n\nconst OPERATORS: TextFilterOperator[] = [\n 'contains',\n 'equals',\n 'startsWith',\n 'endsWith',\n 'notContains',\n];\n\nexport function TextFilter(\n props: CustomFilterProps<unknown, unknown, TextFilterModel> &\n TextFilterParams,\n) {\n const { model, onModelChange, getValue, placeholder, defaultOperator } =\n props;\n const { t } = useTranslation('ui');\n\n const initialOperator: TextFilterOperator =\n model?.type ?? defaultOperator ?? 'contains';\n const [operator, setOperator] = useState<TextFilterOperator>(initialOperator);\n const [draft, setDraft] = useState<string>(model?.filter ?? '');\n\n // Hydrate local state when AG Grid pushes an external model change\n // (e.g. consumer calls api.setFilterModel programmatically).\n useEffect(() => {\n setOperator(model?.type ?? defaultOperator ?? 'contains');\n setDraft(model?.filter ?? '');\n }, [model, defaultOperator]);\n\n const matcher = useMemo(() => makeMatcher(i18next.language), []);\n\n useGridFilter({\n doesFilterPass: (params) => {\n const active = model;\n if (!active || active.filter === '') return true;\n const value = coerceToString(getValue(params.node));\n if (value === null) return false;\n switch (active.type) {\n case 'equals':\n return matcher.equals(value, active.filter);\n case 'contains':\n return matcher.contains(value, active.filter);\n case 'startsWith':\n return matcher.startsWith(value, active.filter);\n case 'endsWith':\n return matcher.endsWith(value, active.filter);\n case 'notContains':\n return !matcher.contains(value, active.filter);\n default:\n return true;\n }\n },\n });\n\n function apply() {\n const trimmed = draft.trim();\n if (trimmed === '') {\n onModelChange(null);\n return;\n }\n onModelChange({ type: operator, filter: draft });\n }\n\n function clear() {\n setDraft('');\n setOperator(defaultOperator ?? 'contains');\n onModelChange(null);\n }\n\n const operatorOptions: SelectOption<TextFilterOperator>[] = OPERATORS.map(\n (op) => ({\n value: op,\n label: t(`dataTable.textFilter.operators.${op}`),\n }),\n );\n\n const placeholderLabel = placeholder ?? t('dataTable.textFilter.placeholder');\n\n return (\n <div\n data-component=\"text-filter\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)] ds:min-w-[240px]\"\n >\n <Select<TextFilterOperator>\n size=\"sm\"\n options={operatorOptions}\n value={operator}\n onValueChange={(next) => {\n if (next === '') return;\n setOperator(next);\n }}\n aria-label={t('dataTable.textFilter.operators.contains')}\n />\n <StateBackedTextInput\n size=\"sm\"\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n apply();\n }\n }}\n placeholder={placeholderLabel}\n aria-label={placeholderLabel}\n startAdornment={<Search aria-hidden=\"true\" className=\"ds:size-4\" />}\n />\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)] ds:border-t ds:border-[var(--border)]\">\n <Button intent=\"ghost\" size=\"sm\" onClick={clear} type=\"button\">\n {t('dataTable.textFilter.clear')}\n </Button>\n <Button intent=\"primary\" size=\"sm\" onClick={apply} type=\"button\">\n {t('dataTable.textFilter.apply')}\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Floating-filter companion for `TextFilter`.\n *\n * Renders a `<TextInput size=\"sm\">` directly as the inline floating\n * filter — leading search icon, optional trailing clear button, fixed\n * operator (the popover version owns operator selection so the inline\n * row stays compact).\n *\n * Commits debounce at 200ms; empty input commits `null` so the grid\n * stops filtering as soon as the field is blank.\n */\nexport function TextFloatingFilter(\n props: CustomFloatingFilterProps<IFilter, unknown, unknown, TextFilterModel>,\n) {\n const { model, onModelChange, column } = props;\n const { t } = useTranslation('ui');\n\n const filterParams =\n (column?.getColDef?.()?.filterParams as TextFilterParams | undefined) ?? {};\n const defaultOperator: TextFilterOperator =\n filterParams.defaultOperator ?? 'contains';\n const placeholderLabel =\n filterParams.placeholder ?? t('dataTable.textFilter.placeholder');\n\n const [draft, setDraft] = useState<string>(model?.filter ?? '');\n\n // Hydrate when the model changes externally (programmatic reset).\n useEffect(() => {\n setDraft(model?.filter ?? '');\n }, [model?.filter]);\n\n // Debounced commit. Avoids hammering AG Grid with a model push on\n // every keystroke; 200ms matches the kit's other deferred-input\n // patterns. A bare setTimeout + cleanup is sufficient — no third-party\n // debounce hook required.\n useEffect(() => {\n // Avoid spurious commits when the local draft already matches the\n // applied model (e.g. just-hydrated initial mount).\n if (draft === (model?.filter ?? '')) return;\n\n const timer = setTimeout(() => {\n if (draft === '') {\n if (model) onModelChange(null);\n return;\n }\n onModelChange({ type: defaultOperator, filter: draft });\n }, 200);\n\n return () => clearTimeout(timer);\n }, [draft, defaultOperator, model, onModelChange]);\n\n function clearImmediate() {\n setDraft('');\n if (model) onModelChange(null);\n }\n\n return (\n <div data-component=\"text-floating-filter\" className=\"ds:w-full\">\n <StateBackedTextInput\n size=\"sm\"\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n placeholder={placeholderLabel}\n aria-label={placeholderLabel}\n startAdornment={<Search aria-hidden=\"true\" className=\"ds:size-4\" />}\n endAdornment={\n draft.length > 0 ? (\n <button\n type=\"button\"\n aria-label={t('dataTable.textFilter.clear')}\n onClick={clearImmediate}\n className=\"ds:pointer-events-auto ds:flex ds:items-center ds:text-[var(--muted-foreground)] ds:hover:text-[var(--foreground)] ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none\"\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n ) : undefined\n }\n />\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* The AG Grid implementation of the table toolbar seam (DataTable). */\n/* */\n/* Every seam call is the GridApi call DataTable's toolbar made before */\n/* the parts moved to `_shared/table-toolbar/` (design § 7.3), so */\n/* DataTable behaves as in kit 1.112 apart from the three fixes Product */\n/* switched on for 1.113 (`DATA_TABLE_TOOLBAR_FEATURES`): QuickSearch */\n/* follows an external clear, FacetFilter writes a `set` model on */\n/* SelectFilter columns and reads its pill back, and ColumnToggle can */\n/* reorder from the keyboard. */\n/* -------------------------------------------------------------------- */\n\nimport type { Column, ColDef, GridApi, IRowNode } from 'ag-grid-community';\nimport {\n DATA_TABLE_TOOLBAR_FEATURES,\n type TableColumnFilterModel,\n type TableExportCell,\n type TableExportSnapshot,\n type TableFacetValue,\n type TableFilterKind,\n type TableToolbarChangeKind,\n type TableToolbarColumn,\n type TableToolbarSeam,\n} from '../_shared/table-toolbar/seam';\nimport { isExpandedRowDetail } from './expanded-row-renderer';\n// The other kit filters are recognised through `registeredTableFilterKind`,\n// not imported: importing them would ship DateRangePicker, MultiSelect and\n// Autocomplete with every DataTable. TextFilter is DataTable's default.\nimport { registeredTableFilterKind } from './filters/filter-kind';\nimport { TextFilter } from './filters/text-filter';\n\n/** What the AG seam reads from DataTable on every call. */\nexport interface AgToolbarSeamDeps {\n /** The live grid API; `undefined` until the grid is ready. */\n getApi: () => GridApi | undefined;\n /** Rows selected now (expanded-detail rows excluded). */\n selectionCount: number;\n onPrint: () => void;\n /** Columns the user showed or hid from the toolbar (AG's visibility API\n * cannot carry a source). */\n markColumnsUserTouched?: (colIds: readonly string[]) => void;\n}\n\n/** The seam plus the hook DataTable uses to hand it fresh props. */\nexport interface AgToolbarSeamController {\n seam: TableToolbarSeam;\n /** Call during render with the latest props, so parts rendered in the\n * same pass read them. Emits nothing. */\n update(deps: AgToolbarSeamDeps): void;\n /** Tell subscribers something changed (call from an effect, e.g. after\n * the selection count changed). */\n notify(kind: TableToolbarChangeKind): void;\n}\n\n/** How long to wait between looks for a grid that is not ready yet\n * (`toolbar.tsx` 1.112 used the same 50 ms poll). */\nexport const AG_SEAM_POLL_MS = 50;\n\nconst apiBySeam = new WeakMap<TableToolbarSeam, () => GridApi | undefined>();\n\n/** @internal The GridApi behind an AG seam, for DataTable's AG-typed\n * callbacks (`BulkAction.onClick(api)`, custom export items). */\nexport function agApiOf(seam: TableToolbarSeam): GridApi | undefined {\n return apiBySeam.get(seam)?.();\n}\n\nconst ALL_KINDS: readonly TableToolbarChangeKind[] = [\n 'filter',\n 'quickFilter',\n 'selection',\n 'columns',\n 'rows',\n];\n\nfunction filterKindOf(def: ColDef | undefined): TableFilterKind | null {\n const filter = def?.filter as unknown;\n if (!filter) return null;\n if (filter === TextFilter || filter === 'agTextColumnFilter') return 'text';\n if (filter === 'agNumberColumnFilter') return 'number';\n return registeredTableFilterKind(filter);\n}\n\n/** Whether the host lets the column move: AG checks `suppressMovable` and\n * `lockPosition` only in its drag UI, never in `moveColumns`. */\nfunction canMoveOf(def: ColDef | undefined): boolean {\n return !def?.suppressMovable && !def?.lockPosition;\n}\n\n/** Whether the host lets the column change pin side: AG checks\n * `lockPinned` only in its menus, never in `setColumnsPinned`. */\nfunction canPinOf(def: ColDef | undefined): boolean {\n return !def?.lockPinned;\n}\n\nfunction pinnedOf(col: Column): 'start' | 'end' | false {\n const pinned = col.getPinned();\n return pinned === 'left' ? 'start' : pinned === 'right' ? 'end' : false;\n}\n\n/** AG columns in display order (pinned start, centre, pinned end), the\n * utility columns (`ag-Grid-*` with no `hide`) left out. */\nfunction listColumns(api: GridApi): Column[] {\n // getAllGridColumns() reflects the live/displayed order (incl. a persisted\n // reorder); getColumns() returns columnDefs order. The grid shows its\n // pinned groups first and last whatever their position in that list, so\n // the list groups the same way.\n const pinRank = (col: Column): number =>\n col.getPinned() === 'left' ? 0 : col.getPinned() === 'right' ? 2 : 1;\n return [...(api.getAllGridColumns() ?? [])]\n .sort((a, b) => pinRank(a) - pinRank(b))\n .filter(\n (col) =>\n !(\n col.getColDef().hide === undefined &&\n col.getColId().startsWith('ag-Grid-')\n ),\n );\n}\n\nfunction exportCell(value: unknown): TableExportCell {\n if (value === null || value === undefined) return null;\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n return String(value);\n}\n\nfunction alignOf(def: ColDef | undefined): 'start' | 'end' {\n const type = def?.type;\n const types = Array.isArray(type) ? type : type ? [type] : [];\n return types.includes('numericColumn') || types.includes('rightAligned')\n ? 'end'\n : 'start';\n}\n\n/**\n * Builds DataTable's toolbar seam. `initial` is read again through\n * `update`, so one seam lives as long as its DataTable.\n */\nexport function createAgToolbarSeam(\n initial: AgToolbarSeamDeps,\n): AgToolbarSeamController {\n let deps = initial;\n const getApi = (): GridApi | undefined => {\n const api = deps.getApi();\n return api && !api.isDestroyed() ? api : undefined;\n };\n\n /* ---- change events: late binding, one poll, one set of listeners ---- */\n\n const listeners = new Set<(kind: TableToolbarChangeKind) => void>();\n let bound: { api: GridApi; detach: () => void } | null = null;\n let timer: number | undefined;\n\n const emit = (kind: TableToolbarChangeKind): void => {\n for (const listener of [...listeners]) listener(kind);\n };\n\n const bind = (api: GridApi): void => {\n const onFilter = (): void => {\n emit('filter');\n emit('quickFilter');\n };\n const onColumns = (): void => emit('columns');\n const onRows = (): void => emit('rows');\n api.addEventListener('filterChanged', onFilter);\n api.addEventListener('columnVisible', onColumns);\n api.addEventListener('columnMoved', onColumns);\n api.addEventListener('columnPinned', onColumns);\n api.addEventListener('modelUpdated', onRows);\n bound = {\n api,\n detach: () => {\n if (api.isDestroyed()) return;\n api.removeEventListener('filterChanged', onFilter);\n api.removeEventListener('columnVisible', onColumns);\n api.removeEventListener('columnMoved', onColumns);\n api.removeEventListener('columnPinned', onColumns);\n api.removeEventListener('modelUpdated', onRows);\n },\n };\n // Late binding: whoever subscribed before the grid was ready reads\n // everything once now.\n for (const kind of ALL_KINDS) emit(kind);\n };\n\n const ensureBound = (): void => {\n const api = getApi();\n if (bound && bound.api === api) return;\n if (bound) {\n bound.detach();\n bound = null;\n }\n if (api) {\n if (timer !== undefined) {\n window.clearInterval(timer);\n timer = undefined;\n }\n bind(api);\n return;\n }\n if (timer === undefined && typeof window !== 'undefined') {\n timer = window.setInterval(() => {\n if (getApi()) ensureBound();\n }, AG_SEAM_POLL_MS);\n }\n };\n\n const release = (): void => {\n if (listeners.size > 0) return;\n if (timer !== undefined) {\n window.clearInterval(timer);\n timer = undefined;\n }\n bound?.detach();\n bound = null;\n };\n\n /* ---- the seam ---- */\n\n const seam: TableToolbarSeam = {\n features: DATA_TABLE_TOOLBAR_FEATURES,\n\n isReady: () => getApi() !== undefined,\n\n subscribe(listener) {\n listeners.add(listener);\n ensureBound();\n return () => {\n listeners.delete(listener);\n release();\n };\n },\n\n getColumns(): TableToolbarColumn[] {\n const api = getApi();\n if (!api) return [];\n return listColumns(api).map((col) => {\n const def = col.getColDef();\n return {\n id: col.getColId(),\n label: api.getDisplayNameForColumn(col, null) || col.getColId(),\n visible: col.isVisible(),\n canHide: true,\n canMove: canMoveOf(def),\n canPin: canPinOf(def),\n pinned: pinnedOf(col),\n filterKind: filterKindOf(def),\n };\n });\n },\n\n setColumnVisible(id, visible) {\n const api = getApi();\n if (!api) return;\n api.setColumnsVisible([id], visible);\n // The grid tags this write `api` like any other; tell the table it was\n // the user so the choice persists and stays theirs.\n deps.markColumnsUserTouched?.([id]);\n },\n\n moveColumn(id, toIndex) {\n const api = getApi();\n if (!api) return;\n // `toIndex` counts the toolbar's list; AG's `moveColumns` index counts\n // hidden and utility columns too, so map through the target's id. A\n // move across a pin boundary is ignored by AG unless the column's pin\n // first matches its destination.\n const target = listColumns(api)[toIndex];\n if (!target || target.getColId() === id) return;\n const toColId = target.getColId();\n const gridColumns = api.getAllGridColumns();\n const from = gridColumns.find((c) => c.getColId() === id);\n if (!from) return;\n // The seam refuses what the host locked, as `moveColumn` promises:\n // AG itself would unpin a `lockPinned` column or move a\n // `suppressMovable` one.\n const fromDef = from.getColDef();\n if (!canMoveOf(fromDef)) return;\n const sideChanges =\n (from.getPinned() ?? null) !== (target.getPinned() ?? null);\n if (sideChanges && !canPinOf(fromDef)) return;\n if (sideChanges) {\n api.setColumnsPinned([id], target.getPinned() ?? null);\n }\n const agIndex = api\n .getAllGridColumns()\n .findIndex((c) => c.getColId() === toColId);\n if (agIndex >= 0) api.moveColumns([id], agIndex);\n },\n\n getQuickFilter() {\n const qf = getApi()?.getGridOption('quickFilterText');\n return typeof qf === 'string' ? qf : '';\n },\n\n setQuickFilter(text) {\n // `setGridOption` is the public path in AG Grid v33+ for changing any\n // grid option after init. AG fires `filterChanged` when the parsed\n // text changes, which is what QuickSearch and FilterChips follow.\n getApi()?.setGridOption('quickFilterText', text);\n },\n\n getFilterModel() {\n return getApi()?.getFilterModel() ?? {};\n },\n\n setColumnFilter(id, model) {\n const api = getApi();\n if (!api) return;\n // The model, never `destroyFilter()`: destroying the instance drops\n // the filter without pushing a model change, so a floating filter goes\n // on showing the value it no longer applies.\n void api.setColumnFilterModel(id, model);\n api.onFilterChanged();\n },\n\n clearAllFilters() {\n const api = getApi();\n if (!api) return;\n api.setFilterModel(null);\n api.setGridOption('quickFilterText', '');\n },\n\n setFacet(id, value) {\n const api = getApi();\n if (!api) return;\n if (value === null) {\n void api.setColumnFilterModel(id, null);\n api.onFilterChanged();\n return;\n }\n const def = api.getColumn(id)?.getColDef();\n // SelectFilter evaluates `set` models only; the 1.112 `equals` model\n // was a silent no-op there.\n const model:\n | TableColumnFilterModel\n | { type: 'equals'; filter: TableFacetValue } =\n registeredTableFilterKind(def?.filter) === 'select' &&\n (typeof value === 'string' || typeof value === 'number')\n ? { type: 'set', values: [value] }\n : { type: 'equals', filter: value };\n void api.setColumnFilterModel(id, model);\n api.onFilterChanged();\n },\n\n getFacet(id) {\n const model = getApi()?.getColumnFilterModel(id) as\n | Record<string, unknown>\n | null\n | undefined;\n if (!model || typeof model !== 'object') return null;\n if (model.type === 'set') {\n const values = model.values;\n if (Array.isArray(values) && values.length === 1) {\n const v: unknown = values[0];\n return typeof v === 'string' || typeof v === 'number' ? v : null;\n }\n return null;\n }\n if (model.type === 'equals' && 'filter' in model) {\n const v = model.filter;\n return typeof v === 'string' ||\n typeof v === 'number' ||\n typeof v === 'boolean'\n ? v\n : null;\n }\n return null;\n },\n\n getSelectionCount: () => deps.selectionCount,\n\n getSelectedRowIds() {\n const api = getApi();\n if (!api) return [];\n return api\n .getSelectedNodes()\n .filter((node) => !isExpandedRowDetail(node.data))\n .map((node) => node.id)\n .filter((id): id is string => typeof id === 'string');\n },\n\n getExportSnapshot(): TableExportSnapshot | undefined {\n const api = getApi();\n if (!api) return undefined;\n // Display order, as the contract asks: `getColumns()` is columnDefs\n // order and ignores a reorder.\n const columns = listColumns(api).filter((col) => col.isVisible());\n // A number the formatter leaves as plain digits stays numeric (AG's\n // inferred number type formats `97.5` as the text \"97.5\"), so Excel\n // and the export snapshot keep a number; real formatting wins.\n const cellsOf = (node: IRowNode): TableExportCell[] =>\n columns.map((col) => {\n const raw: unknown = api.getCellValue({ rowNode: node, colKey: col });\n const shown: unknown = api.getCellValue({\n rowNode: node,\n colKey: col,\n useFormatter: true,\n });\n if (typeof raw === 'number' && String(raw) === String(shown)) {\n return exportCell(raw);\n }\n return exportCell(shown);\n });\n const rows: { id: string; cells: TableExportCell[] }[] = [];\n api.forEachNodeAfterFilterAndSort((node) => {\n if (!node.data || isExpandedRowDetail(node.data)) return;\n rows.push({ id: node.id ?? '', cells: cellsOf(node) });\n });\n const totalsNode =\n api.getPinnedBottomRowCount() > 0\n ? api.getPinnedBottomRow(0)\n : undefined;\n return {\n scope: 'all-filtered',\n columns: columns.map((col) => ({\n id: col.getColId(),\n label: api.getDisplayNameForColumn(col, null) ?? col.getColId(),\n align: alignOf(col.getColDef()),\n })),\n rows,\n totals: totalsNode ? cellsOf(totalsNode) : null,\n };\n },\n\n exportCsv(fileName) {\n const api = getApi();\n if (!api) return;\n // No argument when no name is given: the CSV DataTable wrote in 1.112.\n if (fileName) api.exportDataAsCsv({ fileName });\n else api.exportDataAsCsv();\n },\n\n print: () => deps.onPrint(),\n };\n\n apiBySeam.set(seam, getApi);\n\n return {\n seam,\n update(next) {\n deps = next;\n },\n notify: emit,\n };\n}\n","/* -------------------------------------------------------------------- */\n/* DataTable.Toolbar: the shared table toolbar parts over AG Grid. */\n/* */\n/* The parts live in `_shared/table-toolbar/` and talk to the table */\n/* through `TableToolbarSeam`; DataTable's seam is AG-backed */\n/* (`./ag-toolbar-seam.ts`). This file keeps every 1.112 export, prop */\n/* type and display name, and adds thin wrappers where a public callback */\n/* still receives the AG Grid API (BulkAction, ExportMenu.Item `custom`, */\n/* the deprecated ExportCsv and ExportPdf). */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type MouseEvent,\n type MouseEventHandler,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Download, FileText } from 'lucide-react';\nimport type { GridApi } from 'ag-grid-community';\nimport type { ButtonProps } from '../button/button';\nimport { IconButton, type IconButtonProps } from '../button/icon-button';\nimport { TableToolbarProvider } from '../_shared/table-toolbar/context';\nimport {\n resolveTokenToRgb,\n writeTablePdf,\n writeTableXlsx,\n type TableExportTable,\n} from '../_shared/table-toolbar/export-files';\nimport { createTableToolbarParts } from '../_shared/table-toolbar/parts';\nimport { agApiOf, createAgToolbarSeam } from './ag-toolbar-seam';\n\nexport { resolveTokenToRgb };\n\nconst parts = createTableToolbarParts({\n prefix: 'DataTable.Toolbar',\n missingProvider: (caller) =>\n `${caller} must be rendered inside <DataTable.Toolbar> as a descendant of <DataTable>.`,\n});\n\n/* ------------------------------------------------------------------ */\n/* Provider */\n/* ------------------------------------------------------------------ */\n\nexport interface ToolbarProviderProps {\n getApi: () => GridApi | undefined;\n selectionCount: number;\n onPrint: () => void;\n markColumnsUserTouched?: (colIds: readonly string[]) => void;\n children: ReactNode;\n}\n\n/** Builds one AG-backed toolbar seam per DataTable and provides it. */\nexport function ToolbarProvider({\n getApi,\n selectionCount,\n onPrint,\n markColumnsUserTouched,\n children,\n}: ToolbarProviderProps) {\n const deps = { getApi, selectionCount, onPrint, markColumnsUserTouched };\n const [controller] = useState(() => createAgToolbarSeam(deps));\n // Fresh props before the parts below read them in this same render.\n controller.update(deps);\n const mounted = useRef(false);\n useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n return;\n }\n controller.notify('selection');\n }, [controller, selectionCount]);\n return (\n <TableToolbarProvider seam={controller.seam}>\n {children}\n </TableToolbarProvider>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Prop types (unchanged from 1.112) */\n/* ------------------------------------------------------------------ */\n\nexport type ToolbarRootProps = HTMLAttributes<HTMLDivElement>;\n\ntype ToolbarIconButtonProps = Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick'\n> & {\n /** Accessible label: becomes the tooltip text and `aria-label`. */\n label?: string;\n};\n\nexport interface ExportCsvProps extends ToolbarIconButtonProps {\n /** Optional override: receives the live AG Grid API. */\n onExport?: (api: GridApi) => void;\n}\n\nexport interface ExportPdfProps extends ToolbarIconButtonProps {\n /**\n * Optional override for the default PDF generation. When omitted, clicking\n * the button calls the built-in handler (`defaultExportPdf`) which\n * dynamic-imports `jspdf` + `jspdf-autotable` and produces a paged PDF\n * of the current sort/filter state. Supply your own to plug in a\n * server-side PDF generator or a custom layout.\n */\n onClick?: (api: GridApi | undefined) => void;\n /** Filename for the generated PDF (default `data-table-export.pdf`). */\n fileName?: string;\n}\n\nexport type PrintProps = ToolbarIconButtonProps;\n\nexport interface QuickSearchProps {\n /** Placeholder text. Falls back to `t('dataTable.quickSearch.placeholder')`. */\n placeholder?: string;\n /** Debounce ms before pushing to AG Grid. Defaults to 150 ms. */\n debounceMs?: number;\n}\n\nexport interface RefreshButtonProps extends Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick'\n> {\n /** Called when the user clicks Refresh. */\n onRefresh: () => void;\n /** Accessible label. Falls back to `t('dataTable.refresh')`. */\n label?: string;\n}\n\nexport interface FacetFilterOption<TValue = string> {\n value: TValue | null;\n label: string;\n}\n\nexport interface FacetFilterProps<TValue = string> {\n /** Column field to filter on. */\n field: string;\n /** Options shown as pills. `value: null` clears the filter. */\n options: FacetFilterOption<TValue>[];\n /** Accessible label for the pill group. */\n label?: string;\n}\n\nexport type ExportFormat = 'csv' | 'xlsx' | 'pdf' | 'custom';\n\nexport interface ExportMenuItemProps {\n /** Built-in format or `custom` for consumer-supplied handler. */\n format: ExportFormat;\n /** Label override. Built-in formats default to `t('dataTable.export.{format}')`. */\n label?: string;\n /** Consumer handler: required for `format: 'custom'`. */\n onClick?: (api: GridApi | undefined) => void;\n /** File-name override (only used by built-in formats). */\n fileName?: string;\n}\n\nexport interface ExportMenuProps extends Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick' | 'children'\n> {\n /** Custom menu items. When omitted, renders the default CSV+Excel+PDF trio. */\n children?: ReactNode;\n /** Accessible label for the trigger. */\n label?: string;\n}\n\nexport interface ColumnToggleProps extends Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick' | 'children'\n> {\n label?: string;\n /** Override the trigger glyph (defaults to the Columns3Cog icon). */\n icon?: ReactNode;\n /** Extra content rendered below the column list (e.g. a settings switch). */\n footer?: ReactNode;\n /** Extra content rendered above the column list, directly under the title\n * (e.g. a grouping switch). */\n header?: ReactNode;\n}\n\nexport interface BulkActionProps extends Omit<\n ButtonProps,\n 'onClick' | 'children' | 'startIcon' | 'intent'\n> {\n label: string;\n icon?: ReactNode;\n onClick: (api: GridApi | undefined) => void;\n variant?: 'default' | 'destructive';\n}\n\n/* ------------------------------------------------------------------ */\n/* Built-in PDF and Excel handlers over the AG Grid API */\n/* ------------------------------------------------------------------ */\n\n/** Visible columns and every row after filter and sort, formatted the way\n * the grid shows them. `headerFallback` names a column with no display\n * name (PDF: empty, Excel: the column id, as in 1.112). */\nfunction agExportTable(\n api: GridApi,\n headerFallback: 'empty' | 'colId',\n): TableExportTable {\n const visibleColumns = (api.getColumns() ?? []).filter((col) =>\n col.isVisible(),\n );\n const headers = visibleColumns.map(\n (col) =>\n api.getDisplayNameForColumn(col, null) ??\n (headerFallback === 'colId' ? col.getColId() : ''),\n );\n // AG Grid Community supports forEachNodeAfterFilterAndSort on the\n // client-side row model, the only model this wrapper exposes.\n const rows: unknown[][] = [];\n api.forEachNodeAfterFilterAndSort((node) => {\n if (!node.data) return;\n rows.push(\n visibleColumns.map((col) =>\n api.getCellValue({ rowNode: node, colKey: col, useFormatter: true }),\n ),\n );\n });\n return { headers, rows };\n}\n\ninterface DefaultExportPdfOptions {\n fileName: string;\n}\n\n/**\n * Default Export PDF handler. Exported for tests and for consumers who want\n * to call it from a custom `onClick` (e.g. to add a logo or signature).\n */\nexport async function defaultExportPdf(\n api: GridApi | undefined,\n options: DefaultExportPdfOptions,\n): Promise<void> {\n if (!api) return;\n await writeTablePdf(agExportTable(api, 'empty'), options);\n}\n\nasync function defaultExportXlsx(\n api: GridApi | undefined,\n options: { fileName: string },\n): Promise<void> {\n if (!api) return;\n await writeTableXlsx(agExportTable(api, 'colId'), options);\n}\n\n/* ------------------------------------------------------------------ */\n/* AG-shaped wrappers */\n/* ------------------------------------------------------------------ */\n\nconst ExportCsv = forwardRef<HTMLButtonElement, ExportCsvProps>(\n ({ label, onExport, intent = 'outline', ...props }, ref) => {\n const { t } = useTranslation('ui');\n const seam = parts.useSeam('ExportCsv');\n // The props leave out onClick, but a wrapper that clones its children\n // may inject one: compose it, never let it replace the export (1.112\n // spread it over the handler, so the button did nothing).\n const { onClick, ...rest } = props as typeof props & {\n onClick?: MouseEventHandler<HTMLButtonElement>;\n };\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n const api = agApiOf(seam);\n if (!api) return;\n if (onExport) onExport(api);\n else seam.exportCsv();\n },\n [seam, onExport, onClick],\n );\n\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Download aria-hidden />}\n tooltip={label ?? t('dataTable.exportCsv')}\n {...rest}\n onClick={handleClick}\n />\n );\n },\n);\nExportCsv.displayName = 'DataTable.Toolbar.ExportCsv';\n\nconst ExportPdf = forwardRef<HTMLButtonElement, ExportPdfProps>(\n ({ label, onClick, fileName, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation('ui');\n const seam = parts.useSeam('ExportPdf');\n const handleClick = useCallback(() => {\n const api = agApiOf(seam);\n if (onClick) {\n onClick(api);\n return;\n }\n // Fire-and-forget: errors bubble to the console for now; consumers\n // who need to surface them should supply their own `onClick`.\n void defaultExportPdf(api, {\n fileName: fileName ?? 'data-table-export.pdf',\n });\n }, [seam, onClick, fileName]);\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<FileText aria-hidden />}\n tooltip={label ?? t('dataTable.exportPdf')}\n onClick={handleClick}\n {...rest}\n />\n );\n },\n);\nExportPdf.displayName = 'DataTable.Toolbar.ExportPdf';\n\nconst FacetFilter = <TValue extends string | number | boolean = string>({\n field,\n options,\n label,\n}: FacetFilterProps<TValue>) => (\n <parts.FacetFilter field={field} options={options} label={label} />\n);\n(FacetFilter as { displayName?: string }).displayName =\n 'DataTable.Toolbar.FacetFilter';\n\nconst DEFAULT_EXPORT_ITEMS: ExportFormat[] = ['csv', 'xlsx', 'pdf'];\n\nconst ExportMenuItem = ({\n format,\n label,\n onClick,\n fileName,\n}: ExportMenuItemProps) => {\n const seam = parts.useSeam('ExportMenu.Item');\n const handleSelect = useCallback(() => {\n const api = agApiOf(seam);\n if (format === 'csv') {\n seam.exportCsv(fileName);\n return;\n }\n if (format === 'pdf') {\n void defaultExportPdf(api, {\n fileName: fileName ?? 'data-table-export.pdf',\n });\n return;\n }\n if (format === 'xlsx') {\n void defaultExportXlsx(api, {\n fileName: fileName ?? 'data-table-export.xlsx',\n });\n return;\n }\n // custom: the consumer is required to handle it.\n onClick?.(api);\n }, [seam, format, fileName, onClick]);\n return (\n <parts.ExportMenuItemBase\n format={format}\n label={label}\n onSelect={handleSelect}\n />\n );\n};\nExportMenuItem.displayName = 'DataTable.Toolbar.ExportMenu.Item';\n\n// forwardRef + rest-spread so the trigger IconButton receives the props an\n// IconButtonGroup clones onto its children (ref, tabIndex, onFocus, intent),\n// which its roving tabindex needs.\nconst ExportMenu = forwardRef<HTMLButtonElement, ExportMenuProps>(\n ({ children, ...rest }, ref) => (\n <parts.ExportMenu ref={ref} {...rest}>\n {children ??\n DEFAULT_EXPORT_ITEMS.map((f) => <ExportMenuItem key={f} format={f} />)}\n </parts.ExportMenu>\n ),\n);\nExportMenu.displayName = 'DataTable.Toolbar.ExportMenu';\n\nconst BulkAction = forwardRef<HTMLButtonElement, BulkActionProps>(\n ({ onClick, ...rest }, ref) => {\n const seam = parts.useSeam('BulkAction');\n return (\n <parts.BulkAction\n ref={ref}\n onAction={() => onClick(agApiOf(seam))}\n {...rest}\n />\n );\n },\n);\nBulkAction.displayName = 'DataTable.Toolbar.BulkAction';\n\n/* ------------------------------------------------------------------ */\n/* Assembled namespace: mounted on DataTable.Toolbar downstream */\n/* ------------------------------------------------------------------ */\n\n// These leaves render a single DS <IconButton> trigger, so IconButtonGroup\n// accepts them as direct children (see its rendersIconButton DEV check).\nfor (const leaf of [ExportCsv, ExportPdf, ExportMenu]) {\n (leaf as { rendersIconButton?: boolean }).rendersIconButton = true;\n}\n\nconst ExportMenuNamespace = Object.assign(ExportMenu, {\n Item: ExportMenuItem,\n});\n\nexport const Toolbar = Object.assign(parts.Root, {\n FilterBar: parts.FilterBar,\n Actions: parts.Actions,\n /** @deprecated Use `Toolbar.ExportMenu` with a `csv` item. */\n ExportCsv,\n /** @deprecated Use `Toolbar.ExportMenu` with a `pdf` item. */\n ExportPdf,\n Print: parts.Print,\n ColumnToggle: parts.ColumnToggle,\n BulkAction,\n QuickSearch: parts.QuickSearch,\n Refresh: parts.Refresh,\n FilterChips: parts.FilterChips,\n FacetFilter,\n ExportMenu: ExportMenuNamespace,\n});\n","import { useEffect, type RefObject } from 'react';\n\nconst PRESENTATIONAL_ROLES = new Set(['presentation', 'none']);\nconst SELECTOR =\n '[role=\"presentation\"][aria-hidden], [role=\"none\"][aria-hidden]';\n\n/** `aria-hidden=\"false\"` on a presentational wrapper is a spec no-op — it\n * cannot un-hide anything — but it makes the element a named child of the\n * grid's ARIA tree. Dropping it is invisible to AT and to AG Grid. */\nfunction stripNoOpAriaHidden(el: Element): void {\n const role = el.getAttribute('role');\n if (role === null || !PRESENTATIONAL_ROLES.has(role)) return;\n if (el.getAttribute('aria-hidden') !== 'false') return;\n el.removeAttribute('aria-hidden');\n}\n\n/**\n * Repairs the one ARIA defect AG Grid's pinned viewport introduces.\n *\n * Pinning a column makes AG Grid write `aria-hidden=\"false\"` onto the\n * `role=\"presentation\"` pinned column and spanned-cell containers. axe's\n * `aria-required-children` treats any presentational element carrying a\n * global ARIA attribute as an *owned* child rather than transparent, so the\n * `role=\"grid\"` root and the pinned `role=\"rowgroup\"` viewport both report\n * \"Element has children which are not allowed: [role=presentation]\". Nothing\n * is wrong with the tree itself — only the no-op attribute.\n *\n * The observer watches `aria-hidden` alone, inside the grid root only, and\n * removes it only where the value is exactly `\"false\"` and the element is\n * presentational. `aria-hidden=\"true\"` is never touched, so every genuine\n * hide AG Grid performs still stands.\n */\nexport function usePresentationalAriaFix(\n rootRef: RefObject<HTMLElement | null>,\n enabled = true,\n): void {\n useEffect(() => {\n const root = rootRef.current;\n if (!enabled || !root || typeof MutationObserver === 'undefined') return;\n\n const sweep = () => {\n for (const el of root.querySelectorAll(SELECTOR)) stripNoOpAriaHidden(el);\n };\n sweep();\n\n const observer = new MutationObserver((records) => {\n for (const record of records) {\n if (record.type === 'attributes') {\n stripNoOpAriaHidden(record.target as Element);\n } else {\n for (const added of record.addedNodes) {\n if (!(added instanceof Element)) continue;\n stripNoOpAriaHidden(added);\n for (const el of added.querySelectorAll(SELECTOR)) {\n stripNoOpAriaHidden(el);\n }\n }\n }\n }\n });\n observer.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: ['aria-hidden'],\n });\n return () => observer.disconnect();\n }, [rootRef, enabled]);\n}\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — DataTable. */\n/* */\n/* Operations work against the curated `DataTableHandle`, never the raw */\n/* ag-grid `GridApi` (consumers needing the raw API call `getRawApi()`). */\n/* See `src/docs/26-agent-readiness.mdx` §15. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { DataTableHandle, DataTableSortEntry } from './data-table';\n\nexport const dataTableAgent: AgentAdapter<DataTableHandle> = {\n id: 'data-table',\n capabilities: [\n 'select_single',\n 'select_multiple',\n 'range_pick',\n 'filter',\n 'sort',\n 'paginate',\n ],\n state: {\n selection: {\n type: 'string[]',\n descriptionKey: 'ui.agent.dataTable.state.selection',\n description: 'Row ids of currently-selected rows.',\n read: (handle) => handle.getSelection(),\n },\n filter: {\n type: 'object',\n descriptionKey: 'ui.agent.dataTable.state.filter',\n description: 'Current ag-grid filter model, keyed by column id.',\n read: (handle) => handle.getFilter(),\n },\n sort: {\n type: 'Array<{ colId, sort }>',\n descriptionKey: 'ui.agent.dataTable.state.sort',\n description: 'Active sort, in priority order.',\n read: (handle) => handle.getSort(),\n },\n currentPage: {\n type: 'number',\n descriptionKey: 'ui.agent.dataTable.state.currentPage',\n description: 'Zero-indexed page number.',\n read: (handle) => handle.getCurrentPage(),\n },\n expandedRowId: {\n type: 'string | null',\n descriptionKey: 'ui.agent.dataTable.state.expandedRowId',\n description:\n 'Id of the row whose inline detail is open (expandable row), or null.',\n read: (handle) => handle.getExpandedRowId(),\n },\n },\n actions: {\n select_rows: {\n // Transient grid selection (data-table convention) — stays read.\n safety: 'read',\n argsType: '{ ids: string[] }',\n argsSchema: {\n type: 'object',\n properties: {\n ids: {\n type: 'array',\n items: { type: 'string' },\n description: 'Row ids to select (replaces the current selection).',\n },\n },\n required: ['ids'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.selectRows',\n description: 'Replace the current selection with the given row ids.',\n examples: [\n { args: { ids: ['r-1', 'r-2'] }, note: 'Select the first two rows.' },\n ],\n invoke: (handle, args: { ids: string[] }) => {\n handle.setSelection(args.ids);\n },\n },\n select_range: {\n safety: 'read',\n argsType: '{ fromId: string, toId: string }',\n argsSchema: {\n type: 'object',\n properties: {\n fromId: { type: 'string', description: 'Start row id (inclusive).' },\n toId: { type: 'string', description: 'End row id (inclusive).' },\n },\n required: ['fromId', 'toId'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.selectRange',\n description:\n 'Select every row between fromId and toId, inclusive, in current sort order.',\n invoke: (handle, args: { fromId: string; toId: string }) => {\n handle.selectRange(args.fromId, args.toId);\n },\n },\n clear_selection: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.clearSelection',\n description: 'Deselect all rows.',\n invoke: (handle) => {\n handle.clearSelection();\n },\n },\n get_selection: {\n safety: 'read',\n returns: 'string[]',\n returnsSchema: { type: 'array', items: { type: 'string' } },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.getSelection',\n description: 'Return the row ids of the currently-selected rows.',\n invoke: (handle) => handle.getSelection(),\n },\n apply_filter: {\n safety: 'read',\n argsType: '{ model: Record<string, unknown> }',\n argsSchema: {\n type: 'object',\n properties: {\n model: {\n type: 'object',\n description:\n 'ag-grid filter model keyed by column id. Opaque per-column filter shapes; replaces the current model.',\n additionalProperties: true,\n },\n },\n required: ['model'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.applyFilter',\n description: 'Replace the filter model with the given object.',\n invoke: (handle, args: { model: Record<string, unknown> }) => {\n handle.setFilter(args.model);\n },\n },\n sort_by: {\n safety: 'read',\n argsType: '{ model: DataTableSortEntry[] }',\n argsSchema: {\n type: 'object',\n properties: {\n model: {\n type: 'array',\n description: 'Sort entries in priority order.',\n items: {\n type: 'object',\n properties: {\n colId: { type: 'string', description: 'Column id to sort by.' },\n sort: { enum: ['asc', 'desc'], description: 'Sort direction.' },\n },\n required: ['colId', 'sort'],\n },\n },\n },\n required: ['model'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.sortBy',\n description:\n 'Replace the active sort with the given list (priority order).',\n examples: [\n {\n args: { model: [{ colId: 'name', sort: 'asc' }] },\n note: 'Sort by name ascending.',\n },\n ],\n invoke: (handle, args: { model: DataTableSortEntry[] }) => {\n handle.setSort(args.model);\n },\n },\n go_to_page: {\n safety: 'read',\n argsType: '{ page: number }',\n argsSchema: {\n type: 'object',\n properties: {\n page: {\n type: 'integer',\n minimum: 0,\n description: 'Zero-indexed page number.',\n },\n },\n required: ['page'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.goToPage',\n description: 'Navigate to the given zero-indexed page.',\n invoke: (handle, args: { page: number }) => {\n handle.goToPage(args.page);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'data-table',\n description: 'Marks the DataTable wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'gridId',\n description:\n 'Sourced from the gridId prop. Required to address a specific table from the agent.',\n },\n item: {\n attr: 'row-id',\n description:\n 'Native ag-grid row-id attribute on each rendered record row. When an expandable row is open, one extra full-width row with row-id `<parentId>::detail` is the accordion detail, not a record — its cell carries data-component=\"data-table-expanded-row\" and data-expanded-row-of=\"<parentId>\"; skip it when enumerating rows (isExpandedRowDetailId). Selection is performed via the curated handle, not by DOM mutation.',\n },\n },\n};\n","import type { TFunction } from 'i18next';\nimport type { GetLocaleTextParams } from 'ag-grid-community';\nimport { formatLocale } from '../_shared/intl-locale';\n\n/** AG Grid Community native UI, audited against 35.2.1. Consumer keys win. */\nexport function createAgGridLocaleText(\n t: TFunction<'ui'>,\n language: string,\n overrides?: Record<string, string>,\n): (params: GetLocaleTextParams) => string {\n const formatLanguage = formatLocale(language);\n const month = new Intl.DateTimeFormat(formatLanguage, {\n calendar: 'gregory',\n month: 'long',\n timeZone: 'UTC',\n });\n const parts = new Intl.NumberFormat(formatLanguage).formatToParts(1000.1);\n const text: Record<string, (values: readonly string[]) => string> = {\n ariaIndeterminate: () => t('dataTable.agGrid.ariaIndeterminate'),\n ariaChecked: () => t('dataTable.agGrid.ariaChecked'),\n ariaUnchecked: () => t('dataTable.agGrid.ariaUnchecked'),\n applyFilter: () => t('dataTable.agGrid.applyFilter'),\n clearFilter: () => t('dataTable.agGrid.clearFilter'),\n resetFilter: () => t('dataTable.agGrid.resetFilter'),\n cancelFilter: () => t('dataTable.agGrid.cancelFilter'),\n textFilter: () => t('dataTable.agGrid.textFilter'),\n numberFilter: () => t('dataTable.agGrid.numberFilter'),\n bigintFilter: () => t('dataTable.agGrid.bigintFilter'),\n dateFilter: () => t('dataTable.agGrid.dateFilter'),\n setFilter: () => t('dataTable.agGrid.setFilter'),\n filterOoo: () => t('dataTable.agGrid.filterOoo'),\n empty: () => t('dataTable.agGrid.empty'),\n equals: () => t('dataTable.agGrid.equals'),\n notEqual: () => t('dataTable.agGrid.notEqual'),\n lessThan: () => t('dataTable.agGrid.lessThan'),\n greaterThan: () => t('dataTable.agGrid.greaterThan'),\n inRange: () => t('dataTable.agGrid.inRange'),\n inRangeStart: () => t('dataTable.agGrid.inRangeStart'),\n inRangeEnd: () => t('dataTable.agGrid.inRangeEnd'),\n lessThanOrEqual: () => t('dataTable.agGrid.lessThanOrEqual'),\n greaterThanOrEqual: () => t('dataTable.agGrid.greaterThanOrEqual'),\n contains: () => t('dataTable.agGrid.contains'),\n notContains: () => t('dataTable.agGrid.notContains'),\n startsWith: () => t('dataTable.agGrid.startsWith'),\n endsWith: () => t('dataTable.agGrid.endsWith'),\n blank: () => t('dataTable.agGrid.blank'),\n notBlank: () => t('dataTable.agGrid.notBlank'),\n before: () => t('dataTable.agGrid.before'),\n after: () => t('dataTable.agGrid.after'),\n andCondition: () => t('dataTable.agGrid.andCondition'),\n orCondition: () => t('dataTable.agGrid.orCondition'),\n dateFormatOoo: () => 'yyyy-mm-dd',\n filterSummaryInactive: () => t('dataTable.agGrid.filterSummaryInactive'),\n filterSummaryContains: () => t('dataTable.agGrid.filterSummaryContains'),\n filterSummaryNotContains: () =>\n t('dataTable.agGrid.filterSummaryNotContains'),\n filterSummaryTextEquals: () =>\n t('dataTable.agGrid.filterSummaryTextEquals'),\n filterSummaryTextNotEqual: () =>\n t('dataTable.agGrid.filterSummaryTextNotEqual'),\n filterSummaryStartsWith: () =>\n t('dataTable.agGrid.filterSummaryStartsWith'),\n filterSummaryEndsWith: () => t('dataTable.agGrid.filterSummaryEndsWith'),\n filterSummaryBlank: () => t('dataTable.agGrid.filterSummaryBlank'),\n filterSummaryNotBlank: () => t('dataTable.agGrid.filterSummaryNotBlank'),\n filterSummaryEquals: () => '=',\n filterSummaryNotEqual: () => '!=',\n filterSummaryGreaterThan: () => '>',\n filterSummaryGreaterThanOrEqual: () => '>=',\n filterSummaryLessThan: () => '<',\n filterSummaryLessThanOrEqual: () => '<=',\n filterSummaryInRange: () => t('dataTable.agGrid.filterSummaryInRange'),\n yesterday: () => t('dataTable.agGrid.yesterday'),\n today: () => t('dataTable.agGrid.today'),\n tomorrow: () => t('dataTable.agGrid.tomorrow'),\n last7Days: () => t('dataTable.agGrid.last7Days'),\n lastWeek: () => t('dataTable.agGrid.lastWeek'),\n thisWeek: () => t('dataTable.agGrid.thisWeek'),\n nextWeek: () => t('dataTable.agGrid.nextWeek'),\n last30Days: () => t('dataTable.agGrid.last30Days'),\n lastMonth: () => t('dataTable.agGrid.lastMonth'),\n thisMonth: () => t('dataTable.agGrid.thisMonth'),\n nextMonth: () => t('dataTable.agGrid.nextMonth'),\n last90Days: () => t('dataTable.agGrid.last90Days'),\n lastQuarter: () => t('dataTable.agGrid.lastQuarter'),\n thisQuarter: () => t('dataTable.agGrid.thisQuarter'),\n nextQuarter: () => t('dataTable.agGrid.nextQuarter'),\n lastYear: () => t('dataTable.agGrid.lastYear'),\n thisYear: () => t('dataTable.agGrid.thisYear'),\n yearToDate: () => t('dataTable.agGrid.yearToDate'),\n nextYear: () => t('dataTable.agGrid.nextYear'),\n last6Months: () => t('dataTable.agGrid.last6Months'),\n last12Months: () => t('dataTable.agGrid.last12Months'),\n last24Months: () => t('dataTable.agGrid.last24Months'),\n filterSummaryInRangeValues: (values) => `(${values[0]}, ${values[1]})`,\n filterSummaryTextQuote: (values) => `\"${values[0]}\"`,\n minDateValidation: (values) =>\n t('dataTable.agGrid.minDateValidation', { var0: values[0] }),\n maxDateValidation: (values) =>\n t('dataTable.agGrid.maxDateValidation', { var0: values[0] }),\n strictMinValueValidation: (values) =>\n t('dataTable.agGrid.strictMinValueValidation', { var0: values[0] }),\n strictMaxValueValidation: (values) =>\n t('dataTable.agGrid.strictMaxValueValidation', { var0: values[0] }),\n ariaSortableColumn: () => t('dataTable.agGrid.ariaSortableColumn'),\n ariaMenuColumn: () => t('dataTable.agGrid.ariaMenuColumn'),\n ariaFilterColumn: () => t('dataTable.agGrid.ariaFilterColumn'),\n ariaColumnFiltered: () => t('dataTable.agGrid.ariaColumnFiltered'),\n ariaColumnCellSelection: () =>\n t('dataTable.agGrid.ariaColumnCellSelection'),\n rowDragRows: () => t('dataTable.agGrid.rowDragRows'),\n rowDragRow: () => t('dataTable.agGrid.rowDragRow'),\n ariaColumnGroupCellSelection: () =>\n t('dataTable.agGrid.ariaColumnGroupCellSelection'),\n ariaToggleCellValue: () => t('dataTable.agGrid.ariaToggleCellValue'),\n loadingError: () => t('dataTable.agGrid.loadingError'),\n ariaSkeletonCellLoadingFailed: () =>\n t('dataTable.agGrid.ariaSkeletonCellLoadingFailed'),\n ariaDeferSkeletonCellLoading: () =>\n t('dataTable.agGrid.ariaDeferSkeletonCellLoading'),\n ariaSkeletonCellLoading: () =>\n t('dataTable.agGrid.ariaSkeletonCellLoading'),\n invalidDate: () => t('dataTable.agGrid.invalidDate'),\n invalidNumber: () => t('dataTable.agGrid.invalidNumber'),\n invalidBigInt: () => t('dataTable.agGrid.invalidBigInt'),\n ariaValidationErrorPrefix: () =>\n t('dataTable.agGrid.ariaValidationErrorPrefix'),\n exportingOoo: () => t('dataTable.agGrid.exportingOoo'),\n loadingOoo: () => t('dataTable.agGrid.loadingOoo'),\n noMatchingRows: () => t('dataTable.agGrid.noMatchingRows'),\n noRowsToShow: () => t('dataTable.agGrid.noRowsToShow'),\n ariaLabelTooltip: () => t('dataTable.agGrid.ariaLabelTooltip'),\n tooltipValidationErrorSeparator: () => '. ',\n ariaInputEditor: () => t('dataTable.agGrid.ariaInputEditor'),\n maxLengthValidation: (values) =>\n t('dataTable.agGrid.maxLengthValidation', { var0: values[0] }),\n minValueValidation: (values) =>\n t('dataTable.agGrid.minValueValidation', { var0: values[0] }),\n maxValueValidation: (values) =>\n t('dataTable.agGrid.maxValueValidation', { var0: values[0] }),\n invalidSelectionValidation: () =>\n t('dataTable.agGrid.invalidSelectionValidation'),\n ariaPendingChange: () => t('dataTable.agGrid.ariaPendingChange'),\n ariaFilterMenuOpen: () => t('dataTable.agGrid.ariaFilterMenuOpen'),\n january: () => month.format(new Date(Date.UTC(2026, 0, 1))),\n february: () => month.format(new Date(Date.UTC(2026, 1, 1))),\n march: () => month.format(new Date(Date.UTC(2026, 2, 1))),\n april: () => month.format(new Date(Date.UTC(2026, 3, 1))),\n may: () => month.format(new Date(Date.UTC(2026, 4, 1))),\n june: () => month.format(new Date(Date.UTC(2026, 5, 1))),\n july: () => month.format(new Date(Date.UTC(2026, 6, 1))),\n august: () => month.format(new Date(Date.UTC(2026, 7, 1))),\n september: () => month.format(new Date(Date.UTC(2026, 8, 1))),\n october: () => month.format(new Date(Date.UTC(2026, 9, 1))),\n november: () => month.format(new Date(Date.UTC(2026, 10, 1))),\n december: () => month.format(new Date(Date.UTC(2026, 11, 1))),\n ariaLabelColumnMenu: () => t('dataTable.agGrid.ariaLabelColumnMenu'),\n ariaLabelColumnFilter: () => t('dataTable.agGrid.ariaLabelColumnFilter'),\n ariaFilterInput: () => t('dataTable.agGrid.ariaFilterInput'),\n ariaFilterFromValue: () => t('dataTable.agGrid.ariaFilterFromValue'),\n ariaFilterValue: () => t('dataTable.agGrid.ariaFilterValue'),\n ariaFilterToValue: () => t('dataTable.agGrid.ariaFilterToValue'),\n ariaFilteringOperator: () => t('dataTable.agGrid.ariaFilteringOperator'),\n ariaDateFilterInput: () => t('dataTable.agGrid.ariaDateFilterInput'),\n thousandSeparator: () =>\n parts.find((part) => part.type === 'group')?.value ?? '',\n decimalSeparator: () =>\n parts.find((part) => part.type === 'decimal')?.value ?? '',\n pageSizeSelectorLabel: () => t('dataTable.agGrid.pageSizeSelectorLabel'),\n ariaPageSizeSelectorLabel: () =>\n t('dataTable.agGrid.ariaPageSizeSelectorLabel'),\n to: () => t('dataTable.to'),\n of: () => t('dataTable.of'),\n firstPage: () => t('dataTable.firstPage'),\n previousPage: () => t('dataTable.previousPage'),\n page: () => t('dataTable.page'),\n nextPage: () => t('dataTable.nextPage'),\n lastPage: () => t('dataTable.lastPage'),\n pageLastRowUnknown: () => '?',\n more: () => t('dataTable.agGrid.more'),\n ariaRowSelectAll: () => t('dataTable.agGrid.ariaRowSelectAll'),\n ariaHeaderSelection: () => t('dataTable.agGrid.ariaHeaderSelection'),\n ariaLabelSelectField: () => t('dataTable.agGrid.ariaLabelSelectField'),\n ariaRowToggleSelection: () => t('dataTable.agGrid.ariaRowToggleSelection'),\n ariaRowSelectionDisabled: () =>\n t('dataTable.agGrid.ariaRowSelectionDisabled'),\n ariaRowDeselect: () => t('dataTable.agGrid.ariaRowDeselect'),\n ariaRowSelect: () => t('dataTable.agGrid.ariaRowSelect'),\n };\n return ({ key, defaultValue, variableValues = [] }) => {\n if (overrides && Object.hasOwn(overrides, key)) {\n let index = 0;\n return overrides[key].replace(\n /\\$\\{variable\\}/g,\n (token) => variableValues[index++] ?? token,\n );\n }\n // Unknown keys belong to a consumer extension or a different vendor version.\n return Object.hasOwn(text, key) ? text[key](variableValues) : defaultValue;\n };\n}\n","import 'ag-grid-community/styles/ag-grid.css';\n// Font-only — `@font-face { agGridQuartz }` for the icon glyphs. We\n// deliberately do NOT import `ag-theme-quartz.css`: that file scopes ~90\n// CSS variables to `.ag-theme-quartz` and hardcodes colors / IBM Plex Sans\n// / 8px grid, which fight the design-system tokens. `ag-grid-theme.css`\n// below is a standalone bridge that defines every var AG Grid references,\n// mapped to DS tokens.\nimport 'ag-grid-community/styles/agGridQuartzFont.css';\nimport '../../tokens/ag-grid-theme.css';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { Skeleton } from '../skeleton';\nimport { EmptyState } from '../empty-state';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AgGridReact } from 'ag-grid-react';\nimport {\n AllCommunityModule,\n ModuleRegistry,\n type ColDef,\n type ColGroupDef,\n type ColumnMovedEvent,\n type ColumnPinnedEvent,\n type ColumnResizedEvent,\n type ColumnState,\n type ColumnVisibleEvent,\n type CsvExportParams,\n type ExcelExportParams,\n type FilterChangedEvent,\n type GetRowIdParams,\n type GridApi,\n type GridOptions,\n type GridState,\n type IRowNode,\n type IsFullWidthRowParams,\n type NewColumnsLoadedEvent,\n type PostSortRowsParams,\n type RowClassParams,\n type RowHeightParams,\n type ShouldRowBeSkippedParams,\n type SortChangedEvent,\n} from 'ag-grid-community';\nimport { IconButtonGroup } from '../icon-button-group';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { createHeaderMeasure, withHeaderMinWidths } from './header-min-width';\nimport { Toolbar, ToolbarProvider } from './toolbar';\nimport { TextFilter, TextFloatingFilter } from './filters/text-filter';\nimport { usePresentationalAriaFix } from './hooks/use-presentational-aria-fix';\nimport {\n EXPANDED_ROW_CLASS,\n EXPANDED_ROW_MARKER,\n ExpandedRowContext,\n ExpandedRowRenderer,\n expandedRowDetailId,\n isExpandedRowDetail,\n seedExpandedRowDetail,\n type ExpandedRowContextValue,\n} from './expanded-row-renderer';\nimport { useAgentRegistration } from '../../agent';\nimport { usePrefersReducedMotion, useTheme } from '../../hooks';\nimport { dataTableAgent } from './data-table.agent';\nimport { createAgGridLocaleText } from './ag-grid-locale';\n\n// AG Grid v33+ requires module registration before any grid renders.\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst dataTableVariants = cva('ag-theme-alfadocs ds:w-full', {\n variants: {\n density: {\n default: '',\n compact: 'data-table-compact',\n expanded: 'data-table-expanded',\n },\n bordered: {\n true: '',\n false: 'ds:[--ag-borders:none]',\n },\n },\n defaultVariants: {\n density: 'default',\n bordered: true,\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* Curated imperative handle — agent-readiness contract */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableSortEntry {\n colId: string;\n sort: 'asc' | 'desc';\n}\n\n/**\n * Curated handle exposed via `forwardRef`. Replaces the legacy raw `GridApi`\n * forwarding — see `src/docs/26-agent-readiness.mdx` §15. Consumers needing\n * the unwrapped ag-grid API call `getRawApi()`.\n */\nexport interface DataTableHandle<TData = unknown> {\n getSelection: () => string[];\n setSelection: (ids: string[]) => void;\n selectRange: (fromId: string, toId: string) => void;\n clearSelection: () => void;\n getFilter: () => Record<string, unknown>;\n setFilter: (model: Record<string, unknown>) => void;\n /**\n * Columns whose visibility the user set by hand (ColumnToggle, column menu,\n * drag). Persisted with the column state under `gridId`; a responsive\n * baseline must leave them alone.\n */\n getUserTouchedColumns: () => string[];\n /**\n * Record columns as user-set — for programmatic writes that stand in for the\n * user (a saved view), so they persist and stop being auto-managed.\n */\n markColumnsUserTouched: (colIds: readonly string[]) => void;\n getSort: () => DataTableSortEntry[];\n setSort: (model: DataTableSortEntry[]) => void;\n getCurrentPage: () => number;\n goToPage: (page: number) => void;\n /** Id of the row whose detail is open (`expandedRowId`), or `null`. */\n getExpandedRowId: () => string | null;\n getRawApi: () => GridApi<TData> | undefined;\n}\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableProps<TData = unknown> extends Omit<\n VariantProps<typeof dataTableVariants>,\n 'density'\n> {\n /**\n * Column definitions — accepts a mix of leaf `ColDef`s and header\n * `ColGroupDef`s (for two-row grouped headers via `children: [...]`).\n */\n columnDefs: (ColDef<TData> | ColGroupDef<TData>)[];\n rowData?: TData[];\n rowSelection?: 'single' | 'multiple';\n pagination?: boolean;\n paginationPageSize?: number;\n /**\n * Page-size dropdown options shown in the AG Grid pagination panel.\n * Pass `false` to hide the dropdown entirely. Default: `[10, 25, 50, 100]`.\n */\n paginationPageSizeSelector?: number[] | false;\n gridId?: string;\n onSelectionChanged?: (rows: TData[]) => void;\n onSortChanged?: (event: SortChangedEvent<TData>) => void;\n onFilterChanged?: (event: FilterChangedEvent<TData>) => void;\n noRowsOverlay?: ComponentType;\n loadingOverlay?: ComponentType;\n gridOptions?: GridOptions<TData>;\n /** Grid height as a Tailwind height class, e.g. `\"h-[500px]\"` or `\"h-[var(--data-table-height)]\"` */\n heightClass?: string;\n className?: string;\n\n /** Row height preset. `expanded` adds headroom for complex cells (balances, tag lists). */\n density?: 'compact' | 'default' | 'expanded';\n\n /** Map row → class name. Use together with `data-table-row-success/warning/error` for tinted rows. */\n getRowClass?: (params: RowClassParams<TData>) => string | undefined;\n /** Rows pinned at the bottom of the grid. Use `useTotalRow()` to compute a totals row. */\n pinnedBottomRowData?: TData[];\n /**\n * Leave the pinned rows out while there are no rows, so an empty table\n * shows its message and no \"Total 0\" line. Default false: the pinned rows\n * stay, and the message sits in the body above them.\n */\n hidePinnedWhenEmpty?: boolean;\n\n /** Print-optimised mode — hides toolbar, disables pagination, renders every row. */\n printMode?: boolean;\n\n /**\n * Controlled: the id (per `gridOptions.getRowId`) of the ONE row whose\n * detail is open. Requires `gridOptions.getRowId`. Not supported together\n * with `rowSelection=\"multiple\"` in v1.\n */\n expandedRowId?: string | null;\n /**\n * Rendered as a full-width row directly beneath the expanded row. Must\n * derive everything from the row — the grid may unmount it when scrolled\n * out of view, so the content has to be stateless.\n */\n renderExpandedRow?: (row: TData) => ReactNode;\n /**\n * The detail asked to close (Escape inside it, or the consumer's own close\n * control). The consumer owns the state and the focus return.\n */\n onExpandedRowChange?: (id: string | null) => void;\n\n /** Composable toolbar — renders `<DataTable.Toolbar>…</DataTable.Toolbar>` above the grid. */\n children?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Loading overlay */\n/* ------------------------------------------------------------------ */\n\nfunction DefaultLoadingOverlay() {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-md)]\"\n >\n {Array.from({ length: 5 }).map((_, i) => (\n <Skeleton\n key={i}\n variant=\"rectangular\"\n className=\"ds:h-[var(--min-target-size)] ds:w-full\"\n />\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* No-rows overlay — wired to the DS EmptyState component */\n/* ------------------------------------------------------------------ */\n\nfunction DefaultNoRowsOverlay() {\n const { t } = useTranslation('ui');\n return (\n <EmptyState\n variant=\"no-results\"\n size=\"sm\"\n title={t('dataTable.noRows')}\n description={t('dataTable.noRowsDescription')}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Column persistence helpers */\n/* ------------------------------------------------------------------ */\n\n/* Persisted envelope. v2 keeps visibility and pinning alongside order / width;\n * the pre-1.10 bare array carried order / width only and still loads that way.\n * Pins are physical (`left` / `right`), so a snapshot taken under one text\n * direction must not pin columns to the wrong edge under the other: the\n * envelope records the direction and pins are dropped on a mismatch. */\ntype TextDirection = 'ltr' | 'rtl';\n\ninterface PersistedColumnState {\n v: 2;\n dir: TextDirection;\n state: ColumnState[];\n /** Columns whose visibility the user set by hand — theirs from now on. */\n touched?: string[];\n}\n\ninterface LoadedColumnState {\n state: ColumnState[];\n touched: string[];\n}\n\n/** The column properties a user gesture can own, per column. */\ntype UserColumnState = Partial<\n Pick<ColumnState, 'hide' | 'pinned' | 'width' | 'flex'>\n>;\ntype UserColumnProperty = keyof UserColumnState;\n\nfunction stripPins(state: ColumnState[]): ColumnState[] {\n return state.map(({ pinned: _pinned, ...rest }) => rest);\n}\n\nfunction stripVisibilityAndPins(state: ColumnState[]): ColumnState[] {\n return state.map(({ hide: _hide, pinned: _pinned, ...rest }) => rest);\n}\n\nfunction loadColumnState(\n gridId: string,\n dir: TextDirection,\n): LoadedColumnState | null {\n try {\n const raw = localStorage.getItem(`data-table-col-state:${gridId}`);\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n return {\n state: stripVisibilityAndPins(parsed as ColumnState[]),\n touched: [],\n };\n }\n if (typeof parsed !== 'object' || parsed === null) return null;\n const envelope = parsed as Partial<PersistedColumnState>;\n if (envelope.v !== 2 || !Array.isArray(envelope.state)) return null;\n return {\n state: envelope.dir === dir ? envelope.state : stripPins(envelope.state),\n touched: Array.isArray(envelope.touched)\n ? envelope.touched.filter((id): id is string => typeof id === 'string')\n : [],\n };\n } catch {\n return null;\n }\n}\n\nfunction saveColumnState(\n gridId: string,\n api: GridApi,\n dir: TextDirection,\n touched: ReadonlySet<string>,\n) {\n try {\n const envelope: PersistedColumnState = {\n v: 2,\n dir,\n state: api.getColumnState(),\n touched: [...touched],\n };\n localStorage.setItem(\n `data-table-col-state:${gridId}`,\n JSON.stringify(envelope),\n );\n } catch {\n // localStorage may be unavailable in some environments\n }\n}\n\n/* Column events fired by layout/code rather than a user gesture — flex\n * re-layout, autosize, API calls (incl. the responsive hook). These must not\n * write to the persisted state or every mount would snapshot itself. */\nconst PROGRAMMATIC_COLUMN_SOURCES = new Set<string>([\n 'api',\n 'flex',\n 'gridInitializing',\n 'gridOptionsChanged',\n 'autosizeColumns',\n 'sizeColumnsToFit',\n]);\n\n/* ------------------------------------------------------------------ */\n/* DataTable */\n/* ------------------------------------------------------------------ */\n\nfunction DataTableInner<TData = unknown>(\n props: DataTableProps<TData>,\n ref: React.ForwardedRef<DataTableHandle<TData>>,\n) {\n const {\n columnDefs,\n rowData,\n rowSelection,\n pagination = false,\n paginationPageSize = 25,\n paginationPageSizeSelector = [10, 25, 50, 100],\n gridId,\n onSelectionChanged,\n onSortChanged,\n onFilterChanged,\n noRowsOverlay,\n loadingOverlay,\n gridOptions,\n density,\n bordered,\n heightClass = 'ds:h-[500px]',\n className,\n getRowClass,\n pinnedBottomRowData,\n hidePinnedWhenEmpty = false,\n printMode = false,\n expandedRowId,\n renderExpandedRow,\n onExpandedRowChange,\n children,\n } = props;\n\n const expansionEnabled =\n expandedRowId !== undefined || renderExpandedRow !== undefined;\n const consumerGetRowId = gridOptions?.getRowId;\n if (expansionEnabled && !consumerGetRowId) {\n throw new Error(\n 'DataTable: `expandedRowId` / `renderExpandedRow` require `gridOptions.getRowId` — the expanded row is addressed by row id, not by index.',\n );\n }\n\n const { t, i18n } = useTranslation('ui');\n const agGridRef = useRef<AgGridReact<TData>>(null);\n const gridRootRef = useRef<HTMLDivElement>(null);\n // Pinned columns otherwise fail axe `aria-required-children`.\n usePresentationalAriaFix(gridRootRef);\n const [selectionCount, setSelectionCount] = useState(0);\n const [sortAnnouncement, setSortAnnouncement] = useState('');\n // AG Grid initialises locale and RTL options once. Recreate it on a language\n // change, carrying its current state rather than resetting filters/selection.\n const languageStateRef = useRef<GridState | undefined>(undefined);\n const getLocaleText = useMemo(\n () => createAgGridLocaleText(t, i18n.language, gridOptions?.localeText),\n [t, i18n.language, gridOptions?.localeText],\n );\n const [gridLanguage, setGridLanguage] = useState(i18n.language);\n useEffect(() => {\n if (gridLanguage === i18n.language) return;\n // AG Grid attaches newly mounted editors in a queued task. Let that task\n // finish before destroying the grid, then commit the edit and snapshot.\n const timer = window.setTimeout(() => {\n const api = agGridRef.current?.api;\n api?.stopEditing();\n const state = api?.getState();\n if (state) {\n // Restoring a focused cell forces browser focus, so keep it only\n // while focus is in this grid. Pins are physical: drop them when the\n // direction flips, as the saved column layout does.\n const { focusedCell, columnPinning, ...rest } = state;\n const focused =\n gridRootRef.current?.contains(document.activeElement) ?? false;\n const sameDirection =\n i18n.dir(gridLanguage) === i18n.dir(i18n.language);\n languageStateRef.current = {\n ...rest,\n ...(focused ? { focusedCell } : {}),\n ...(sameDirection ? { columnPinning } : {}),\n };\n } else languageStateRef.current = undefined;\n setGridLanguage(i18n.language);\n }, 0);\n return () => window.clearTimeout(timer);\n }, [gridLanguage, i18n, i18n.language]);\n const expandedRowIdRef = useRef<string | null | undefined>(expandedRowId);\n expandedRowIdRef.current = expandedRowId;\n\n // Curated imperative handle — see DataTableHandle above.\n const handle = useMemo<DataTableHandle<TData>>(\n () => ({\n getSelection: () => {\n const api = agGridRef.current?.api;\n if (!api) return [];\n const ids: string[] = [];\n for (const node of api.getSelectedNodes()) {\n if (node.id != null && !isExpandedRowDetail(node.data)) {\n ids.push(node.id);\n }\n }\n return ids;\n },\n setSelection: (ids) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const want = new Set(ids);\n api.forEachNode((node) => {\n if (node.id != null) node.setSelected(want.has(node.id));\n });\n },\n selectRange: (fromId, toId) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const ordered: string[] = [];\n api.forEachNodeAfterFilterAndSort((node) => {\n if (node.id != null && !isExpandedRowDetail(node.data)) {\n ordered.push(node.id);\n }\n });\n const a = ordered.indexOf(fromId);\n const b = ordered.indexOf(toId);\n if (a < 0 || b < 0) return;\n const [lo, hi] = a <= b ? [a, b] : [b, a];\n const want = new Set(ordered.slice(lo, hi + 1));\n api.forEachNode((node) => {\n if (node.id != null) node.setSelected(want.has(node.id));\n });\n },\n clearSelection: () => {\n agGridRef.current?.api?.deselectAll();\n },\n getFilter: () => agGridRef.current?.api?.getFilterModel() ?? {},\n setFilter: (model) => {\n agGridRef.current?.api?.setFilterModel(model);\n },\n getSort: () => {\n const api = agGridRef.current?.api;\n if (!api) return [];\n return api\n .getColumnState()\n .filter((c) => c.sort === 'asc' || c.sort === 'desc')\n .map((c) => ({ colId: c.colId, sort: c.sort as 'asc' | 'desc' }));\n },\n setSort: (model) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const next = api.getColumnState().map((c) => {\n const target = model.find((m) => m.colId === c.colId);\n return { ...c, sort: target ? target.sort : null };\n });\n api.applyColumnState({ state: next, defaultState: { sort: null } });\n },\n getCurrentPage: () =>\n agGridRef.current?.api?.paginationGetCurrentPage() ?? 0,\n goToPage: (page) => {\n agGridRef.current?.api?.paginationGoToPage(page);\n },\n getExpandedRowId: () => expandedRowIdRef.current ?? null,\n getUserTouchedColumns: () => [...userTouchedRef.current],\n markColumnsUserTouched: (colIds) => markUserTouchedRef.current(colIds),\n getRawApi: () => agGridRef.current?.api,\n }),\n [],\n );\n /* What the user set by hand, per column and per property. A `columnDefs`\n * update makes AG Grid re-apply every def's own `hide` / `pinned` / `width`,\n * which silently undid a toggle or a resize whenever a consumer re-derived\n * its defs (custom columns arriving after the first fetch, a memo with a\n * fresh dependency). Only these properties are put back after an update —\n * everything else follows the new defs, as a consumer expects. */\n const userColumnStateRef = useRef<Map<string, UserColumnState>>(new Map());\n /* Columns the user has shown or hidden by hand; persisted with the state. */\n const userTouchedRef = useRef<Set<string>>(new Set());\n const markUserTouchedRef = useRef<(colIds: readonly string[]) => void>(\n () => {},\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n // Agent adapter is keyed on the row-agnostic DataTableHandle; cast here\n // because TData isn't observable from the agent surface.\n useAgentRegistration(dataTableAgent, handle as DataTableHandle, gridId);\n\n const isRtl = i18n.dir() === 'rtl';\n const isLoading = rowData === undefined;\n\n // Reactive — re-renders when the OS preference or theme toggles mid-session.\n const prefersReducedMotion = usePrefersReducedMotion();\n const { resolvedTheme } = useTheme();\n // Suppress compact density in accessible theme — 32px rows violate min-target-size.\n const isAccessible =\n resolvedTheme === 'light-accessible' || resolvedTheme === 'dark-accessible';\n const effectiveDensity =\n isAccessible && density === 'compact' ? 'default' : density;\n\n // Map logical 'single' | 'multiple' → AG Grid v35 object form\n const rowSelectionOption = useMemo(() => {\n if (!rowSelection) return undefined;\n // The synthetic detail row is never a selectable record.\n const isRowSelectable = (node: IRowNode<TData>) =>\n !isExpandedRowDetail(node.data);\n // §13g — require explicit checkbox / modifier-key selection rather than\n // click-anywhere, so selection never fights the row's primary action. This\n // is the v32.2+ replacement for the deprecated `suppressRowClickSelection`.\n if (rowSelection === 'single') {\n return {\n mode: 'singleRow' as const,\n enableClickSelection: false,\n isRowSelectable,\n };\n }\n return {\n mode: 'multiRow' as const,\n headerCheckbox: true,\n checkboxes: true,\n enableClickSelection: false,\n isRowSelectable,\n };\n }, [rowSelection]);\n\n const direction: TextDirection = isRtl ? 'rtl' : 'ltr';\n\n /** Note the current value of `props` on `colIds` as the user's. */\n const recordUserColumns = useCallback(\n (\n api: GridApi,\n colIds: readonly string[],\n props: readonly UserColumnProperty[],\n ) => {\n const wanted = new Set(colIds);\n for (const state of api.getColumnState()) {\n if (!wanted.has(state.colId)) continue;\n const own = userColumnStateRef.current.get(state.colId) ?? {};\n for (const prop of props) own[prop] = state[prop] as never;\n userColumnStateRef.current.set(state.colId, own);\n }\n },\n [],\n );\n\n const persist = useCallback(\n (api: GridApi) => {\n if (gridId) {\n saveColumnState(gridId, api, direction, userTouchedRef.current);\n }\n },\n [gridId, direction],\n );\n\n const markColumnsUserTouched = useCallback(\n (colIds: readonly string[]) => {\n for (const colId of colIds) userTouchedRef.current.add(colId);\n const api = agGridRef.current?.api;\n if (!api) return;\n recordUserColumns(api, colIds, ['hide']);\n persist(api);\n },\n [persist, recordUserColumns],\n );\n markUserTouchedRef.current = markColumnsUserTouched;\n\n // Column persistence — restore on mount\n const handleGridReady = useCallback(() => {\n if (!agGridRef.current?.api) return;\n const api = agGridRef.current.api;\n const saved = gridId ? loadColumnState(gridId, direction) : null;\n if (!saved || languageStateRef.current) return;\n for (const colId of saved.touched) userTouchedRef.current.add(colId);\n api.applyColumnState({\n state: saved.state,\n applyOrder: true,\n });\n recordUserColumns(api, saved.touched, ['hide']);\n }, [gridId, direction, recordUserColumns]);\n\n // Fires once the grid has taken a new `columnDefs` prop on board — the one\n // moment the defs' own values have just been re-applied over the user's.\n const handleNewColumnsLoaded = useCallback(\n (event: NewColumnsLoadedEvent<TData>) => {\n if (event.source !== 'gridOptionsChanged') return;\n const api = agGridRef.current?.api;\n if (!api || userColumnStateRef.current.size === 0) return;\n api.applyColumnState({\n state: [...userColumnStateRef.current].map(([colId, own]) => ({\n colId,\n ...own,\n })),\n });\n },\n [],\n );\n\n const handleColumnStateChange = useCallback(\n (\n event:\n | ColumnMovedEvent<TData>\n | ColumnResizedEvent<TData>\n | ColumnPinnedEvent<TData>\n | ColumnVisibleEvent<TData>,\n ) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const affected = (\n event.columns ?? (event.column ? [event.column] : [])\n ).map((column) => column.getColId());\n if (event.source && PROGRAMMATIC_COLUMN_SOURCES.has(event.source)) {\n // An API write to a column the user already owns — a saved view\n // applied after `markColumnsUserTouched`, the persisted restore — is\n // on the user's behalf: keep the record current so a later defs update\n // puts back what was actually written, not an older snapshot. A defs\n // update itself (`gridOptionsChanged`) is exactly what the record must\n // survive, so it never writes the record.\n if (event.source === 'api' && 'visible' in event) {\n const owned = affected.filter((colId) =>\n userTouchedRef.current.has(colId),\n );\n if (owned.length > 0) {\n recordUserColumns(api, owned, ['hide']);\n persist(api);\n }\n }\n return;\n }\n // The kit ColumnToggle reports through the toolbar context instead —\n // the public visibility API cannot name a source — so a visibility event\n // that reaches here came from the grid's own UI (column menu, header\n // drag) and is the user's too.\n if ('visible' in event) {\n for (const colId of affected) userTouchedRef.current.add(colId);\n recordUserColumns(api, affected, ['hide']);\n } else if ('pinned' in event) {\n recordUserColumns(api, affected, ['pinned']);\n } else if ('flexColumns' in event) {\n recordUserColumns(api, affected, ['width', 'flex']);\n }\n persist(api);\n },\n [persist, recordUserColumns],\n );\n\n // `defaultColDef` is pre-merged into the explicit prop below (kit defaults +\n // the consumer's overrides). Strip it from the forwarded gridOptions so the\n // catch-all spread can't re-clobber that merge with the raw value — which\n // would silently drop `floatingFilter` / `filter` / `sortable` for every\n // column the moment a consumer sets a single `defaultColDef` key.\n // The expandable-row callbacks below compose the consumer's own value, so\n // they are stripped here too — otherwise the spread would undo the wrap.\n const forwardedGridOptions = useMemo(() => {\n if (!gridOptions) return undefined;\n const next = { ...(gridOptions as GridOptions<TData>) };\n delete next.defaultColDef;\n delete next.initialState;\n if (expansionEnabled) {\n delete next.getRowId;\n delete next.isFullWidthRow;\n delete next.fullWidthCellRenderer;\n delete next.getRowHeight;\n delete next.postSortRows;\n delete next.getRowClass;\n delete next.defaultCsvExportParams;\n delete next.defaultExcelExportParams;\n }\n return next;\n }, [expansionEnabled, gridOptions]);\n\n /* ---------------------------------------------------------------- */\n /* Expandable row — see expanded-row-renderer.tsx for the mechanism */\n /* ---------------------------------------------------------------- */\n\n // Measured detail heights survive the renderer unmounting (virtualisation)\n // so `getRowHeight` can serve the last-known height on remount.\n const detailHeightsRef = useRef(new Map<string, number>());\n const consumerCallbacksRef = useRef(gridOptions);\n consumerCallbacksRef.current = gridOptions;\n\n const resolveRowId = useCallback(\n (row: TData) =>\n consumerGetRowId?.({\n data: row,\n level: 0,\n api: agGridRef.current?.api,\n context: gridOptions?.context,\n } as GetRowIdParams<TData>),\n [consumerGetRowId, gridOptions?.context],\n );\n\n const expandedRow = useMemo(() => {\n if (!expansionEnabled || expandedRowId == null || !rowData) return null;\n const row = rowData.find((r) => resolveRowId(r) === expandedRowId);\n return row === undefined ? null : { id: expandedRowId, row };\n }, [expansionEnabled, expandedRowId, resolveRowId, rowData]);\n\n const effectiveRowData = useMemo(() => {\n if (!expandedRow || !rowData) return rowData;\n const index = rowData.indexOf(expandedRow.row);\n const detail = seedExpandedRowDetail(expandedRow.row, expandedRow.id);\n return [\n ...rowData.slice(0, index + 1),\n detail as TData,\n ...rowData.slice(index + 1),\n ];\n }, [expandedRow, rowData]);\n\n const wrappedGetRowId = useCallback(\n (params: GetRowIdParams<TData>) =>\n isExpandedRowDetail(params.data)\n ? expandedRowDetailId(params.data[EXPANDED_ROW_MARKER])\n : (consumerGetRowId as NonNullable<typeof consumerGetRowId>)(params),\n [consumerGetRowId],\n );\n\n const wrappedIsFullWidthRow = useCallback(\n (params: IsFullWidthRowParams<TData>) =>\n isExpandedRowDetail(params.rowNode.data) ||\n (consumerCallbacksRef.current?.isFullWidthRow?.(params) ?? false),\n [],\n );\n\n const wrappedGetRowHeight = useCallback(\n (params: RowHeightParams<TData>) =>\n isExpandedRowDetail(params.data)\n ? detailHeightsRef.current.get(params.node.id ?? '')\n : consumerCallbacksRef.current?.getRowHeight?.(params),\n [],\n );\n\n // Ties in the sort comparator don't guarantee the seed stays behind its\n // parent, so adjacency is enforced after every sort/filter pass.\n const wrappedPostSortRows = useCallback(\n (params: PostSortRowsParams<TData>) => {\n consumerCallbacksRef.current?.postSortRows?.(params);\n const { nodes } = params;\n const detailIndex = nodes.findIndex((n) => isExpandedRowDetail(n.data));\n if (detailIndex < 0) return;\n const [detail] = nodes.splice(detailIndex, 1);\n const parentId = (detail.data as Record<string, unknown>)[\n EXPANDED_ROW_MARKER\n ];\n const parentIndex = nodes.findIndex((n) => n.id === parentId);\n nodes.splice(parentIndex < 0 ? nodes.length : parentIndex + 1, 0, detail);\n },\n [],\n );\n\n // The detail row keeps its own surface — the consumer's row tints apply\n // to records, not to the accordion beneath one.\n const wrappedGetRowClass = useCallback(\n (params: RowClassParams<TData>) => {\n if (isExpandedRowDetail(params.data)) return EXPANDED_ROW_CLASS;\n return (\n consumerCallbacksRef.current?.getRowClass?.(params) ??\n getRowClass?.(params)\n );\n },\n [getRowClass],\n );\n\n const skipDetailRow = useCallback(\n (params: ShouldRowBeSkippedParams<TData>) =>\n isExpandedRowDetail(params.node.data),\n [],\n );\n const csvExportParams = useMemo<CsvExportParams | undefined>(() => {\n if (!expansionEnabled) return undefined;\n const base = gridOptions?.defaultCsvExportParams;\n return {\n ...base,\n shouldRowBeSkipped: (params) =>\n skipDetailRow(params) || (base?.shouldRowBeSkipped?.(params) ?? false),\n };\n }, [expansionEnabled, gridOptions?.defaultCsvExportParams, skipDetailRow]);\n const excelExportParams = useMemo<ExcelExportParams | undefined>(() => {\n if (!expansionEnabled) return undefined;\n const base = gridOptions?.defaultExcelExportParams;\n return {\n ...base,\n shouldRowBeSkipped: (params) =>\n skipDetailRow(params) || (base?.shouldRowBeSkipped?.(params) ?? false),\n };\n }, [expansionEnabled, gridOptions?.defaultExcelExportParams, skipDetailRow]);\n\n const consumerFullWidthRenderer = gridOptions?.fullWidthCellRenderer as\n | ExpandedRowContextValue<TData>['fallbackRenderer']\n | string\n | undefined;\n const expandedRowContext = useMemo<ExpandedRowContextValue<TData>>(\n () => ({\n renderExpandedRow,\n onExpandedRowChange,\n expanded: expandedRow,\n heights: detailHeightsRef.current,\n fallbackRenderer:\n typeof consumerFullWidthRenderer === 'function'\n ? consumerFullWidthRenderer\n : undefined,\n }),\n [\n consumerFullWidthRenderer,\n expandedRow,\n onExpandedRowChange,\n renderExpandedRow,\n ],\n );\n\n const handleSelectionChanged = useCallback(() => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const rows = api.getSelectedRows().filter((r) => !isExpandedRowDetail(r));\n setSelectionCount(rows.length);\n onSelectionChanged?.(rows);\n }, [onSelectionChanged]);\n\n const handleSortChanged = useCallback(\n (event: SortChangedEvent<TData>) => {\n const api = agGridRef.current?.api;\n if (api) {\n const colState = api.getColumnState();\n const sortedCol = colState.find((c) => c.sort);\n if (sortedCol) {\n const colId = sortedCol.colId;\n // Use the live AG Grid API so grouped headers and runtime column\n // mutations (visibility toggles, dynamic re-order) resolve correctly.\n const colDef = api.getColumnDef(colId);\n const colName = (colDef?.headerName as string) ?? colId;\n const dirKey =\n sortedCol.sort === 'asc'\n ? 'dataTable.sortAscending'\n : 'dataTable.sortDescending';\n setSortAnnouncement(\n t('dataTable.sortAnnounce', {\n column: colName,\n direction: t(dirKey),\n }),\n );\n } else {\n setSortAnnouncement('');\n }\n }\n onSortChanged?.(event);\n },\n [onSortChanged, t],\n );\n\n const handleFilterChanged = useCallback(\n (event: FilterChangedEvent<TData>) => {\n onFilterChanged?.(event);\n },\n [onFilterChanged],\n );\n\n // Clear sort announcement after screen readers have had time to read it\n useEffect(() => {\n if (!sortAnnouncement) return;\n const id = setTimeout(() => setSortAnnouncement(''), 3000);\n return () => clearTimeout(id);\n }, [sortAnnouncement]);\n\n const NoRowsComponent = noRowsOverlay ?? DefaultNoRowsOverlay;\n const LoadingComponent = loadingOverlay ?? DefaultLoadingOverlay;\n\n const getApi = useCallback(\n () => agGridRef.current?.api as GridApi | undefined,\n [],\n );\n\n const handlePrint = useCallback(() => {\n if (typeof window !== 'undefined') {\n window.print();\n }\n }, []);\n\n const wrapperClass = dataTableVariants({\n density: effectiveDensity,\n bordered,\n className,\n });\n\n // Toolbar composition — consumer-provided children win; otherwise render\n // the standard table-tools cluster (Export / Print / Columns) as one\n // connected icon group, end-aligned on the page background — the same\n // layout the Patients / Care Plan List patterns established. Excel + PDF\n // export deps are dynamic-imported by their item handlers. The\n // `data-table-toolbar` class is the print-suppression marker.\n const toolbarContent = children ?? (\n <div className=\"data-table-toolbar ds:flex ds:justify-end\">\n <IconButtonGroup\n role=\"toolbar\"\n aria-label={t('dataTable.tableActions')}\n className=\"ds:bg-[var(--background)]\"\n >\n <Toolbar.ExportMenu />\n <Toolbar.Print />\n <Toolbar.ColumnToggle />\n </IconButtonGroup>\n </div>\n );\n\n // Pagination is auto-disabled in print mode so every row prints.\n const paginationEnabled = printMode ? false : pagination;\n const isEmpty =\n effectiveRowData !== undefined && effectiveRowData.length === 0;\n\n // A header that wraps never splits a word: each such column gets a minimum\n // width of its longest word, measured once the font is ready.\n const [headerMeasure, setHeaderMeasure] = useState<\n ((word: string) => number) | null\n >(null);\n useIsomorphicLayoutEffect(() => {\n const root = gridRootRef.current;\n if (!root) return undefined;\n let live = true;\n const make = () => {\n if (live) setHeaderMeasure(() => createHeaderMeasure(root));\n };\n make();\n void document.fonts?.ready.then(make);\n return () => {\n live = false;\n };\n }, []);\n const effectiveColumnDefs = useMemo(\n () => withHeaderMinWidths(columnDefs, headerMeasure),\n [columnDefs, headerMeasure],\n );\n\n return (\n <div\n className=\"ds:flex ds:w-full ds:min-h-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-sm)]\"\n aria-busy={isLoading ? 'true' : undefined}\n data-component=\"data-table\"\n data-component-id={gridId}\n data-print-mode={printMode ? 'true' : undefined}\n >\n {!printMode && (\n <ToolbarProvider\n getApi={getApi}\n selectionCount={selectionCount}\n onPrint={handlePrint}\n markColumnsUserTouched={markColumnsUserTouched}\n >\n {toolbarContent}\n </ToolbarProvider>\n )}\n\n {/* Grid */}\n <div\n ref={gridRootRef}\n data-empty={isEmpty ? 'true' : undefined}\n className={[wrapperClass, printMode ? '' : heightClass]\n .join(' ')\n .trim()}\n >\n <ExpandedRowContext.Provider\n value={expandedRowContext as ExpandedRowContextValue}\n >\n <AgGridReact<TData>\n key={gridLanguage}\n ref={agGridRef}\n initialState={languageStateRef.current ?? gridOptions?.initialState}\n // Opt into v32 CSS-file theming so the `.ag-theme-alfadocs` bridge\n // (src/tokens/ag-grid-theme.css) wins. Without this, AG Grid v33+\n // defaults to the JS Theming API (themeQuartz) which overrides our\n // tokens at runtime — including --ag-font-family.\n theme=\"legacy\"\n columnDefs={effectiveColumnDefs}\n rowData={effectiveRowData}\n /* §11a — every column gets sort + filter + resize + floating\n filter by default. Consumers opt-out per column via\n `sortable: false` / `filter: false`. The spread at the end\n lets `gridOptions.defaultColDef` override individual keys\n without losing the rest.\n\n Note: the column-menu button (`menuTabs` /\n `suppressHeaderMenuButton`) requires `ColumnMenuModule`,\n which is Enterprise in v33+. The floating-filter row is the\n Community-friendly equivalent and covers the primary use\n case — sort + filter without an extra popup. */\n defaultColDef={{\n sortable: true,\n // Default filter = DS-styled text filter so untyped columns\n // (no explicit `filter:` override) inherit the kit's form\n // language instead of AG Grid's stock browser-skinned input.\n // Number / date / select columns opt into their dedicated\n // wrapper per-column.\n filter: TextFilter,\n floatingFilterComponent: TextFloatingFilter,\n resizable: true,\n floatingFilter: true,\n // §13d — faint sort icon advertises which columns are\n // sortable. v33+ moved this from grid-level to defaultColDef.\n unSortIcon: true,\n ...(gridOptions as GridOptions<TData> | undefined)?.defaultColDef,\n }}\n rowSelection={rowSelectionOption}\n pagination={paginationEnabled}\n paginationPageSize={paginationPageSize}\n paginationPageSizeSelector={paginationPageSizeSelector}\n /* §13k — locale-aware pagination chrome (\"1 a 25 di 1.287\" in\n Italian). AG Grid's default renders raw integers. */\n paginationNumberFormatter={(params) =>\n new Intl.NumberFormat(i18n.language).format(params.value)\n }\n animateRows={!prefersReducedMotion}\n enableRtl={isRtl}\n ensureDomOrder\n /* Enable CellSpanModule globally — gate prop required for any\n colDef using `spanRows: true` (Community). Zero runtime cost\n when no column opts in. */\n enableCellSpan\n /* §13a — selecting cell text with the mouse should just work\n (copy a patient ID, an invoice number). AG Grid defaults this\n to false; that breaks user expectation on web tables. */\n enableCellTextSelection\n /* §13b — when a user copies a range, include column headers in\n the clipboard so a paste into Excel/Sheets keeps context. */\n copyHeadersToClipboard\n /* §13c — locale-aware sort (Intl.Collator). \"à\" sorts next to\n \"a\", \"ñ\" next to \"n\". Italian-first matters. */\n accentedSort\n /* §13d unSortIcon — moved to defaultColDef above per v33+\n deprecation. */\n /* §13e — Ctrl/⌘ for multi-column sort. Accounting + clinical\n staff who live in these grids appreciate this. */\n multiSortKey=\"ctrl\"\n /* §13f — dragging a column header outside the grid no longer\n hides the column. Surprising default, easy to trigger by\n accident, hard to recover from without ColumnToggle. */\n suppressDragLeaveHidesColumns\n /* §13h — tooltip ergonomics: 500 ms show matches OS, 5 s hide\n gives time to read long content, hover keeps it visible. */\n tooltipShowDelay={500}\n tooltipHideDelay={5000}\n tooltipInteraction\n /* §13i — commit-on-blur contract for inline editing. No-op\n until any column declares `editable: true`. */\n stopEditingWhenCellsLoseFocus\n /* §13j — preserve user column reorder across columnDefs\n prop changes; pairs with the localStorage persistence below. */\n maintainColumnOrder\n /* §13l — Ctrl/⌘+Z for inline edits. No-op until editable\n columns appear. */\n undoRedoCellEditing\n undoRedoCellEditingLimit={20}\n suppressCellFocus={false}\n rowBuffer={10}\n getLocaleText={getLocaleText}\n rowDragText={(_params, count) => t('dataTable.dragRows', { count })}\n noRowsOverlayComponent={NoRowsComponent}\n loadingOverlayComponent={LoadingComponent}\n getRowClass={expansionEnabled ? wrappedGetRowClass : getRowClass}\n pinnedBottomRowData={\n hidePinnedWhenEmpty && isEmpty ? undefined : pinnedBottomRowData\n }\n domLayout={printMode ? 'autoHeight' : undefined}\n onGridReady={handleGridReady}\n onNewColumnsLoaded={handleNewColumnsLoaded}\n onColumnMoved={handleColumnStateChange}\n onColumnResized={handleColumnStateChange}\n onColumnPinned={handleColumnStateChange}\n onColumnVisible={handleColumnStateChange}\n onSortChanged={handleSortChanged}\n onFilterChanged={handleFilterChanged}\n onSelectionChanged={handleSelectionChanged}\n {...forwardedGridOptions}\n {...(expansionEnabled\n ? {\n getRowId: wrappedGetRowId,\n isFullWidthRow: wrappedIsFullWidthRow,\n fullWidthCellRenderer: ExpandedRowRenderer,\n getRowHeight: wrappedGetRowHeight,\n postSortRows: wrappedPostSortRows,\n defaultCsvExportParams: csvExportParams,\n defaultExcelExportParams: excelExportParams,\n }\n : {})}\n />\n </ExpandedRowContext.Provider>\n </div>\n\n {/* Footer: only while it has something to say, so an empty one\n adds no flex gap below the grid. */}\n {!printMode && selectionCount > 0 && (\n <div className=\"ds:flex ds:items-center ds:justify-between type-body-sm ds:text-[color:var(--muted-foreground)]\">\n <span>{t('dataTable.selected', { count: selectionCount })}</span>\n </div>\n )}\n\n {/* Aria-live region for sort announcements */}\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {sortAnnouncement}\n </span>\n </div>\n );\n}\n\nconst DataTableBase = forwardRef(DataTableInner) as <TData = unknown>(\n props: DataTableProps<TData> & { ref?: React.Ref<DataTableHandle<TData>> },\n) => React.ReactElement;\n\n(DataTableBase as { displayName?: string }).displayName = 'DataTable';\n\nexport const DataTable = Object.assign(DataTableBase, {\n Toolbar,\n});\n"],"names":["HEADER_CELL_EXTRA_PX","longestWord","text","best","word","withHeaderMinWidths","defs","measure","def","col","floor","createHeaderMeasure","root","probe","width","DATA_TABLE_TOOLBAR_FEATURES","EXPANDED_ROW_MARKER","EXPANDED_ROW_CLASS","EXPANDED_ROW_ID_SUFFIX","FOCUSABLE_SELECTOR","isExpandedRowDetail","data","expandedRowDetailId","parentId","isExpandedRowDetailId","rowId","seedExpandedRowDetail","parent","ExpandedRowContext","createContext","ExpandedRowRenderer","props","ctx","useContext","t","useTranslation","rootRef","useRef","node","api","isDetail","heights","detailId","ctxRef","useEffect","el","last","apply","px","observer","row","onKey","event","_b","_a","Fallback","jsx","_marker","rest","jsxs","kinds","registerTableFilterKind","component","kind","registeredTableFilterKind","filter","OPERATORS","TextFilter","model","onModelChange","getValue","placeholder","defaultOperator","initialOperator","operator","setOperator","useState","draft","setDraft","matcher","useMemo","makeMatcher","i18next","useGridFilter","params","active","value","coerceToString","clear","operatorOptions","op","placeholderLabel","Select","next","StateBackedTextInput","Search","Button","TextFloatingFilter","column","filterParams","timer","clearImmediate","X","AG_SEAM_POLL_MS","apiBySeam","agApiOf","seam","ALL_KINDS","filterKindOf","canMoveOf","canPinOf","pinnedOf","pinned","listColumns","pinRank","a","b","exportCell","alignOf","type","types","createAgToolbarSeam","initial","deps","getApi","listeners","bound","emit","listener","bind","onFilter","onColumns","onRows","ensureBound","release","id","visible","toIndex","target","toColId","from","c","fromDef","sideChanges","agIndex","qf","values","v","columns","cellsOf","raw","shown","rows","totalsNode","fileName","parts","createTableToolbarParts","caller","ToolbarProvider","selectionCount","onPrint","markColumnsUserTouched","children","controller","mounted","TableToolbarProvider","agExportTable","headerFallback","visibleColumns","headers","defaultExportPdf","options","writeTablePdf","defaultExportXlsx","writeTableXlsx","ExportCsv","forwardRef","label","onExport","intent","ref","onClick","handleClick","useCallback","IconButton","Download","ExportPdf","FileText","FacetFilter","field","DEFAULT_EXPORT_ITEMS","ExportMenuItem","format","handleSelect","ExportMenu","f","BulkAction","leaf","ExportMenuNamespace","Toolbar","PRESENTATIONAL_ROLES","SELECTOR","stripNoOpAriaHidden","role","usePresentationalAriaFix","enabled","records","record","added","dataTableAgent","handle","args","createAgGridLocaleText","language","overrides","formatLanguage","formatLocale","month","part","key","defaultValue","variableValues","index","token","ModuleRegistry","AllCommunityModule","dataTableVariants","cva","DefaultLoadingOverlay","_","i","Skeleton","DefaultNoRowsOverlay","EmptyState","stripPins","state","_pinned","stripVisibilityAndPins","_hide","loadColumnState","gridId","dir","parsed","envelope","saveColumnState","touched","PROGRAMMATIC_COLUMN_SOURCES","DataTableInner","columnDefs","rowData","rowSelection","pagination","paginationPageSize","paginationPageSizeSelector","onSelectionChanged","onSortChanged","onFilterChanged","noRowsOverlay","loadingOverlay","gridOptions","density","bordered","heightClass","className","getRowClass","pinnedBottomRowData","hidePinnedWhenEmpty","printMode","expandedRowId","renderExpandedRow","onExpandedRowChange","expansionEnabled","consumerGetRowId","i18n","agGridRef","gridRootRef","setSelectionCount","sortAnnouncement","setSortAnnouncement","languageStateRef","getLocaleText","gridLanguage","setGridLanguage","focusedCell","columnPinning","focused","sameDirection","expandedRowIdRef","ids","want","fromId","toId","ordered","lo","hi","m","page","userTouchedRef","colIds","markUserTouchedRef","userColumnStateRef","useImperativeHandle","useAgentRegistration","isRtl","isLoading","prefersReducedMotion","usePrefersReducedMotion","resolvedTheme","useTheme","effectiveDensity","rowSelectionOption","isRowSelectable","direction","recordUserColumns","wanted","own","prop","persist","colId","handleGridReady","saved","handleNewColumnsLoaded","handleColumnStateChange","affected","owned","forwardedGridOptions","detailHeightsRef","consumerCallbacksRef","resolveRowId","expandedRow","effectiveRowData","detail","wrappedGetRowId","wrappedIsFullWidthRow","wrappedGetRowHeight","wrappedPostSortRows","nodes","detailIndex","n","parentIndex","wrappedGetRowClass","skipDetailRow","csvExportParams","base","excelExportParams","consumerFullWidthRenderer","expandedRowContext","handleSelectionChanged","r","handleSortChanged","sortedCol","colDef","colName","dirKey","handleFilterChanged","NoRowsComponent","LoadingComponent","handlePrint","wrapperClass","toolbarContent","IconButtonGroup","paginationEnabled","isEmpty","headerMeasure","setHeaderMeasure","useIsomorphicLayoutEffect","live","make","effectiveColumnDefs","AgGridReact","_params","count","DataTableBase","DataTable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-table-BCfkcPti.js","sources":["../../src/components/data-table/header-min-width.ts","../../src/components/_shared/table-toolbar/seam.ts","../../src/components/data-table/expanded-row-renderer.tsx","../../src/components/data-table/filters/filter-kind.ts","../../src/components/data-table/filters/text-filter.tsx","../../src/components/data-table/ag-toolbar-seam.ts","../../src/components/data-table/toolbar.tsx","../../src/components/data-table/hooks/use-presentational-aria-fix.ts","../../src/components/data-table/data-table.agent.ts","../../src/components/data-table/ag-grid-locale.ts","../../src/components/data-table/data-table.tsx"],"sourcesContent":["import type { ColDef, ColGroupDef } from 'ag-grid-community';\n\n/** Room a header cell needs beside its text: side padding and the sort icon. */\nexport const HEADER_CELL_EXTRA_PX = 52;\n\n/** The longest run of characters a wrapped header cannot break. */\nexport function longestWord(text: string): string {\n let best = '';\n for (const word of text.split(/\\s+/)) {\n if (word.length > best.length) best = word;\n }\n return best;\n}\n\ntype AnyDef<T> = ColDef<T> | ColGroupDef<T>;\n\n/**\n * Raises `minWidth` on every column whose header wraps (`wrapHeaderText`) to\n * the width of its longest word, so a word never splits across two lines.\n * A column that is already wider keeps its own `minWidth`. When the columns\n * together are wider than the grid, the grid scrolls sideways.\n */\nexport function withHeaderMinWidths<T>(\n defs: readonly AnyDef<T>[],\n measure: ((word: string) => number) | null,\n): AnyDef<T>[] {\n if (!measure) return defs as AnyDef<T>[];\n return defs.map((def) => {\n if ('children' in def && def.children) {\n return { ...def, children: withHeaderMinWidths(def.children, measure) };\n }\n const col = def as ColDef<T>;\n if (!col.wrapHeaderText || typeof col.headerName !== 'string') return col;\n const word = longestWord(col.headerName);\n if (!word) return col;\n const floor = Math.ceil(measure(word)) + HEADER_CELL_EXTRA_PX;\n return floor > (col.minWidth ?? 0) ? { ...col, minWidth: floor } : col;\n });\n}\n\n/**\n * A function that measures a word as the grid's header text paints it, using\n * a probe inside the themed grid root so the header font, weight, case and\n * letter spacing all apply.\n */\nexport function createHeaderMeasure(\n root: HTMLElement,\n): (word: string) => number {\n return (word) => {\n const probe = document.createElement('span');\n probe.className = 'ag-header-cell-text';\n probe.textContent = word;\n // Imperative probe, removed at once: not a rendered inline style.\n probe.style.cssText =\n 'position:absolute;visibility:hidden;white-space:nowrap;inline-size:auto;';\n root.appendChild(probe);\n const width = probe.getBoundingClientRect().width;\n probe.remove();\n return width;\n };\n}\n","/* -------------------------------------------------------------------- */\n/* Table toolbar seam: the contract between the kit's toolbar parts and */\n/* a table engine. */\n/* */\n/* Engine-agnostic. Nothing here names AG Grid or TanStack, so the shared */\n/* parts in this folder can serve DataTable (through an AG-backed seam in */\n/* `data-table/ag-toolbar-seam.ts`) and DataGrid (through the seam built */\n/* in `data-grid/toolbar-seam.ts`) without either engine's runtime. */\n/* */\n/* Types and contract constants only. Frozen for the Phase 1 build: */\n/* change it only through the lead. */\n/* -------------------------------------------------------------------- */\n\n/* ------------------------------------------------------------------ */\n/* Filter models: the kit vocabulary */\n/* */\n/* The same five shapes DataTable's filters use today */\n/* (`data-table/filters/*.tsx`), so a saved tab, an agent call or a */\n/* toolbar chip reads one model in either table. DataTable's text, */\n/* number, select and date-range filters re-export these types; its */\n/* typeahead model is its own declaration, held equal to the copy here */\n/* by a type test (`describe-filter.test.ts`). */\n/* ------------------------------------------------------------------ */\n\n/** Text operators (`data-table/filters/text-filter.tsx:40-45`). */\nexport type TextFilterOperator =\n | 'contains'\n | 'equals'\n | 'startsWith'\n | 'endsWith'\n | 'notContains';\n\n/** `{ type, filter }` (`data-table/filters/text-filter.tsx:47-50`). */\nexport interface TextFilterModel {\n type: TextFilterOperator;\n filter: string;\n}\n\n/** Number operators, AG `agNumberColumnFilter` vocabulary\n * (`data-table/filters/number-filter.tsx:41-50`). */\nexport type NumberFilterOperator =\n | 'equals'\n | 'notEqual'\n | 'greaterThan'\n | 'greaterThanOrEqual'\n | 'lessThan'\n | 'lessThanOrEqual'\n | 'inRange'\n | 'blank'\n | 'notBlank';\n\n/** `{ type, filter?, filterTo? }` (`data-table/filters/number-filter.tsx:52-58`).\n * `inRange` may carry only one bound. */\nexport interface NumberFilterModel {\n type: NumberFilterOperator;\n filter?: number;\n filterTo?: number;\n}\n\n/** Set membership (`data-table/filters/select-filter.tsx:47-50`). Values are\n * the option values, never translated labels. */\nexport interface SelectFilterModel {\n type: 'set';\n values: Array<string | number>;\n}\n\n/** Calendar days as `YYYY-MM-DD`; either bound may be open\n * (`data-table/filters/date-range-filter.tsx:30-34`). */\nexport interface DateRangeFilterModel {\n type: 'inRange';\n dateFrom: string | null;\n dateTo: string | null;\n}\n\n/** One chosen value (`data-table/filters/typeahead-filter.tsx:41-44`).\n * DataTable only; DataGrid has no typeahead filter in Phase 1. Kept here so\n * FilterChips can describe it for both engines. A type test in\n * `describe-filter.test.ts` keeps it equal to DataTable's declaration. */\nexport interface TypeaheadFilterModel {\n type: 'equals';\n value: string;\n}\n\n/** Any kit column filter model. */\nexport type TableColumnFilterModel =\n | TextFilterModel\n | NumberFilterModel\n | SelectFilterModel\n | DateRangeFilterModel\n | TypeaheadFilterModel;\n\n/** The filter kinds a toolbar may meet on a column. */\nexport type TableFilterKind =\n | 'text'\n | 'number'\n | 'select'\n | 'dateRange'\n | 'typeahead';\n\n/**\n * Every active filter, keyed by column id. The same shape as\n * `DataTableHandle.getFilter()` (`data-table/data-table.tsx:118`). DataGrid\n * may also carry host keys here (filters the host evaluates on its server,\n * with no column); their values are opaque to the toolbar.\n */\nexport type TableFilterModelMap = Record<string, unknown>;\n\n/** A FacetFilter pill value. `null` clears the facet. */\nexport type TableFacetValue = string | number | boolean;\n\n/* ------------------------------------------------------------------ */\n/* Columns, export and action context */\n/* ------------------------------------------------------------------ */\n\n/** What ColumnToggle, FilterChips and the export builders need to know about\n * one column. Utility columns (selection, expander) are never listed. */\nexport interface TableToolbarColumn {\n /** Column id (a developer constant, not row data). */\n id: string;\n /** Plain, translated column name. */\n label: string;\n visible: boolean;\n /** False for the row-header column and columns declared not hideable. */\n canHide: boolean;\n /** False for columns declared not reorderable. */\n canMove: boolean;\n pinned: 'start' | 'end' | false;\n /** The column's filter kind, or `null` when it has no filter. */\n filterKind: TableFilterKind | null;\n /** False for columns declared not pinnable: ColumnToggle refuses a drop\n * that would change their pin side. Absent (AG seam) = pinnable. */\n canPin?: boolean;\n /** Header group the column belongs to; a move may not take it out of its\n * group. Absent (AG seam) or `null` = no group. */\n groupId?: string | null;\n /** `true` while privacy mode hides this column's values (DataGrid: any\n * `privacy` with `privacyMode` on). FilterChips then names the column\n * only, never the filter value. While any column is masked, the\n * quick-search text counts as personal too (it may be a name, as the\n * DataGrid agent treats it): the quick-search chip shows its label only\n * and QuickSearch never paints a query it did not receive from the\n * user's own typing. Absent (AG seam) = not masked. */\n masked?: boolean;\n /** `true` for a column privacy mode removes from view (DataGrid\n * `privacy: 'hide'` with `privacyMode` on). ColumnToggle leaves it out\n * of its list (design 3.9). Absent (AG seam) = not hidden by privacy. */\n hiddenByPrivacy?: boolean;\n /** Select columns: the option labels, so a chip says \"To load\" rather\n * than the value `toLoad`. Labels are translated by the host. Absent\n * (AG seam) = chips show the raw values, as in kit 1.112. */\n filterOptions?: ReadonlyArray<{ value: string | number; label: string }>;\n}\n\n/** One exported cell: formatted text, a number (kept numeric for XLSX), or\n * empty. Privacy-masked cells carry the mask text, never the value. */\nexport type TableExportCell = string | number | null;\n\n/**\n * Rows for CSV, XLSX, PDF and custom export handlers.\n *\n * `rows` holds every row after filters and sorting and before pagination,\n * never only the virtualised window or the current page, except when the\n * engine cannot reach them (DataGrid server mode), where `scope` says so.\n */\nexport interface TableExportSnapshot {\n /** `'all-filtered'`: every filtered, sorted row. `'current-page'`: the\n * engine holds only one page (server mode). */\n scope: 'all-filtered' | 'current-page';\n /** Visible, exportable columns in display order. */\n columns: ReadonlyArray<{ id: string; label: string; align: 'start' | 'end' }>;\n /** `id` is the opaque row id; `cells` follow `columns`. */\n rows: ReadonlyArray<{ id: string; cells: ReadonlyArray<TableExportCell> }>;\n /** The totals row, when the table shows one, as a separate line. */\n totals: ReadonlyArray<TableExportCell> | null;\n}\n\n/** What BulkAction and a custom ExportMenu item receive (engine-agnostic).\n * Ids only: no row objects, no engine API. */\nexport interface ToolbarActionContext {\n selectedRowIds: readonly string[];\n getExportSnapshot: () => TableExportSnapshot | undefined;\n}\n\n/* ------------------------------------------------------------------ */\n/* The seam */\n/* ------------------------------------------------------------------ */\n\n/** What changed, for `subscribe`. `'rows'` covers new data and paging. */\nexport type TableToolbarChangeKind =\n | 'filter'\n | 'quickFilter'\n | 'selection'\n | 'columns'\n | 'rows';\n\n/**\n * Behaviour switches that let the shared parts serve both engines. The AG\n * seam declares `DATA_TABLE_TOOLBAR_FEATURES` (below): since kit 1.113 all\n * three are `true` for DataTable too (Product decision, 4 Nov 2026), which\n * fixes two DataTable toolbar bugs and adds keyboard reorder. Setting a flag\n * back to `false` there restores the 1.112 behaviour for that part.\n */\nexport interface TableToolbarFeatures {\n /** QuickSearch and FacetFilter follow external changes (tabs, chips,\n * agents, a programmatic clear). AG seam: `true` (fixes QuickSearch\n * keeping its text after an external clear; FacetFilter reads its pill\n * from `getFacet`). DataGrid: `true`. When `false`, both keep local\n * state (1.112 behaviour, `data-table/toolbar.tsx:429,723`). */\n syncsFilterInputs: boolean;\n /** The built-in CSV, XLSX and PDF items can reach every filtered row.\n * AG seam: `true`. DataGrid: `true` in client mode, `false` in server\n * mode, where the built-ins render disabled with a reason and only\n * `custom` items run. */\n exportsAllRows: boolean;\n /** ColumnToggle shows Move up and Move down buttons per column (the\n * keyboard path to reordering, through `moveColumn`). AG seam: `true`\n * (fixes the missing keyboard reorder). DataGrid: `true`. Its \"Reset\n * columns\" button needs `resetColumns` as well (absent: not shown). */\n keyboardReorder: boolean;\n /** FilterChips formats number filter values with the kit's\n * `formatNumber` and calendar days with the kit's short day format, in\n * the UI language. It also names select options by their labels, says\n * \"From\" or \"To\" for an open date bound, names a text operator in the\n * text filter menu's words and joins column and value through\n * `dataTable.filterChips.chip`. AG seam: absent (1.112 chip text).\n * DataGrid: `true`. */\n formatsFilterValues?: boolean;\n /** ColumnToggle announces a move, pin or unpin through its own polite\n * status region. For an engine with no announcer of its own. AG seam:\n * `true`. DataGrid: absent, because its announcer already says it. */\n toolbarAnnouncesColumnMoves?: boolean;\n}\n\n/**\n * The features the DataTable (AG-backed) seam declares\n * (`data-table/ag-toolbar-seam.ts`). All three DataTable toolbar fixes are\n * on from kit 1.113 (CHANGELOG \"Fixed\"). The third fix, FacetFilter's\n * model on select columns, has no flag: it is how the AG seam implements\n * `setFacet` and `getFacet` (see those members).\n */\nexport const DATA_TABLE_TOOLBAR_FEATURES: Readonly<TableToolbarFeatures> = {\n syncsFilterInputs: true,\n exportsAllRows: true,\n keyboardReorder: true,\n toolbarAnnouncesColumnMoves: true,\n};\n\n/**\n * The only way a toolbar part reaches a table. Every method is synchronous\n * and safe to call before the engine is ready (`isReady()` false): reads\n * return empty values and writes are ignored.\n */\nexport interface TableToolbarSeam {\n readonly features: TableToolbarFeatures;\n\n /** `true` once the engine can answer. DataGrid: from its first render.\n * AG: once `getApi()` resolves. */\n isReady(): boolean;\n /**\n * Fires after any change of the given kind, including programmatic ones.\n * Replaces the 50 ms polls in today's toolbar (`toolbar.tsx:608-629`).\n * Safe to call before ready: the seam binds late and returns an\n * unsubscribe that always works. Fires `'columns'` whenever any column's\n * `masked` or `hiddenByPrivacy` value changes (privacy mode switched),\n * so no part keeps showing text it read before.\n */\n subscribe(listener: (kind: TableToolbarChangeKind) => void): () => void;\n\n /* ---- ColumnToggle ---- */\n\n /** Display order: start-pinned first, centre, end-pinned last. */\n getColumns(): TableToolbarColumn[];\n /** A user choice: the engine records the column as user-touched. */\n setColumnVisible(id: string, visible: boolean): void;\n /** ColumnToggle's \"Reset columns\": declared order, visibility, pins and\n * widths, and forget the saved column state. DataGrid:\n * `resetColumnState()`. Absent on the AG seam in 1.113 (DataTable's\n * saved column state and responsive baseline need their own change), so\n * DataTable's ColumnToggle shows Move up and Move down without Reset. */\n resetColumns?(): void;\n /**\n * Moves a column so that its final index in `getColumns()` is `toIndex`\n * (remove, then insert). It takes the pin side of the column that sat at\n * `toIndex` before the move (today's rule, `data-table/toolbar.tsx:1068-1071`).\n * A refused move (not reorderable; not pinnable but the side would change;\n * leaves its group) is a no-op. The AG seam maps `toIndex` through the\n * target column's id, because AG `moveColumns` indexes count hidden and\n * utility columns. The 12.3 contract harness covers both seams.\n */\n moveColumn(id: string, toIndex: number): void;\n\n /* ---- QuickSearch, FilterChips, FacetFilter ---- */\n\n getQuickFilter(): string;\n setQuickFilter(text: string): void;\n /** Every active filter, column keys and host keys alike. */\n getFilterModel(): TableFilterModelMap;\n /** Sets or clears (`null`) one key. Chips clear host keys this way too.\n * The DataGrid seam builds it as read-modify-write over the handle\n * (`getFilter`, change one key, `setFilter`); that is safe because the\n * handle's reads return the last write even for controlled filters, so\n * two calls in one tick both survive. */\n setColumnFilter(id: string, model: TableColumnFilterModel | null): void;\n /** Clears every column filter, every host key and the quick filter. */\n clearAllFilters(): void;\n /** One-value facet. AG seam (from 1.113): on a column whose filter is\n * the kit `SelectFilter` (`filterKind: 'select'`) and a string or number\n * value, writes `{ type: 'set', values: [value] }`, because 1.112's\n * `{ type: 'equals', filter }` was a silent no-op there\n * (`select-filter.tsx:183-184`); on any other column it writes\n * `{ type: 'equals', filter }` as before (`toolbar.tsx:731-741`).\n * DataGrid writes\n * `{ type: 'set', values: [value] }`; in client mode `id` must be a column\n * with `filter: { kind: 'select' }` (else a DEV warning and no write),\n * because v9 evaluates a column with the fn of its own filter kind; in\n * server mode a host key is also accepted. */\n setFacet(id: string, value: TableFacetValue | null): void;\n /** The active facet value, when the engine can read it back: what a\n * `setFacet` on this id would have written, else `null`. AG seam (from\n * 1.113): a `set` model with exactly one value gives that value, an\n * `equals` model gives its `filter`, anything else `null`. When absent,\n * or `features.syncsFilterInputs` is `false`, FacetFilter keeps its own\n * pill state. */\n getFacet?(id: string): TableFacetValue | null;\n /** Chip label for a host key that has no column (DataGrid\n * `filterLabels`). Absent on the AG seam. A host-key chip shows this\n * label only, never the value (opaque, and possibly personal data). */\n getFilterLabel?(key: string): string | undefined;\n\n /* ---- BulkAction ---- */\n\n getSelectionCount(): number;\n /** Opaque row ids. AG seam skips expanded-detail rows. */\n getSelectedRowIds(): string[];\n\n /* ---- ExportMenu, Print ---- */\n\n /** `undefined` before ready. */\n getExportSnapshot(): TableExportSnapshot | undefined;\n /** CSV download. AG seam: `exportDataAsCsv()` with no argument when\n * `fileName` is absent (today's output, `data-table/toolbar.tsx:222, 922`),\n * `exportDataAsCsv({ fileName })` when given. DataGrid: the kit CSV\n * writer over `getExportSnapshot()`, default name from the caption. */\n exportCsv(fileName?: string): void;\n /** Prints every filtered row, never only the virtualised window. */\n print(): void | Promise<void>;\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useRef,\n type ComponentType,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\n\n/* ------------------------------------------------------------------ */\n/* Expandable row — Community-only accordion row */\n/* */\n/* AG Grid Community has no master/detail, so DataTable interleaves ONE */\n/* synthetic node right after the expanded row and renders it as a */\n/* full-width row. The synthetic node is seeded with the parent's field */\n/* values (so sort + filter keep it with its parent) plus a private */\n/* marker naming the parent id. Everything in this module is keyed off */\n/* that marker. */\n/* ------------------------------------------------------------------ */\n\n/** Private marker written onto the synthetic detail node's data. */\nexport const EXPANDED_ROW_MARKER = '__dsDetailOf';\n\n/** Row class stamped on the synthetic detail row (styled in ag-grid-theme.css). */\nexport const EXPANDED_ROW_CLASS = 'ds-data-table-expanded-row';\n\nconst EXPANDED_ROW_ID_SUFFIX = '::detail';\n\n/** What Enter on the AG Grid-focused detail row hands focus to. */\nconst FOCUSABLE_SELECTOR =\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n\nexport type ExpandedRowDetail<TData> = TData & {\n [EXPANDED_ROW_MARKER]: string;\n};\n\n/**\n * True when `data` is the synthetic detail node DataTable interleaves\n * beneath the expanded row. Custom export / iteration code that walks\n * `api.forEachNode*` should skip these.\n */\nexport function isExpandedRowDetail<TData>(\n data: TData | null | undefined,\n): data is ExpandedRowDetail<TData> {\n return (\n typeof data === 'object' &&\n data !== null &&\n typeof (data as Record<string, unknown>)[EXPANDED_ROW_MARKER] === 'string'\n );\n}\n\n/** Row id AG Grid sees for the detail node beneath `parentId`. */\nexport function expandedRowDetailId(parentId: string): string {\n return `${parentId}${EXPANDED_ROW_ID_SUFFIX}`;\n}\n\n/**\n * True when a `row-id` read off the DOM belongs to the synthetic detail\n * row rather than a record. The DOM-side twin of `isExpandedRowDetail`.\n */\nexport function isExpandedRowDetailId(rowId: string): boolean {\n return rowId.endsWith(EXPANDED_ROW_ID_SUFFIX);\n}\n\n/** Build the synthetic node: the parent's values plus the marker. */\nexport function seedExpandedRowDetail<TData>(\n parent: TData,\n parentId: string,\n): ExpandedRowDetail<TData> {\n return { ...parent, [EXPANDED_ROW_MARKER]: parentId };\n}\n\n/* ------------------------------------------------------------------ */\n/* Context — DataTable feeds the renderer without going through */\n/* fullWidthCellRendererParams (those are read once at row creation). */\n/* ------------------------------------------------------------------ */\n\nexport interface ExpandedRowContextValue<TData = unknown> {\n renderExpandedRow: ((row: TData) => ReactNode) | undefined;\n onExpandedRowChange: ((id: string | null) => void) | undefined;\n /** The one open row — the renderer hands its original object to `renderExpandedRow`. */\n expanded: { id: string; row: TData } | null;\n /** Measured detail heights by detail row id; served back through `getRowHeight`. */\n heights: Map<string, number>;\n /** Consumer's own full-width renderer, honoured for non-detail full-width rows. */\n fallbackRenderer: ComponentType<CustomCellRendererProps<TData>> | undefined;\n}\n\nexport const ExpandedRowContext = createContext<ExpandedRowContextValue | null>(\n null,\n);\n\n/* ------------------------------------------------------------------ */\n/* Renderer */\n/* ------------------------------------------------------------------ */\n\n/**\n * `fullWidthCellRenderer` for the synthetic detail node. Measures its own\n * content (Community has no auto-height for full-width rows) and pushes\n * the height into the node. Escape — on the grid-focused row or anywhere\n * inside the surface — asks the consumer to close; Enter on the row moves\n * focus into the content.\n */\nexport function ExpandedRowRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData>,\n) {\n const ctx = useContext(\n ExpandedRowContext,\n ) as ExpandedRowContextValue<TData> | null;\n const { t } = useTranslation('ui');\n const rootRef = useRef<HTMLDivElement>(null);\n const { data, node, api } = props;\n const isDetail = isExpandedRowDetail(data);\n const heights = ctx?.heights;\n const detailId = node.id;\n // Read through a ref so the native row listener below binds once.\n const ctxRef = useRef(ctx);\n ctxRef.current = ctx;\n\n useEffect(() => {\n const el = rootRef.current;\n if (!el || !isDetail || !heights || detailId == null) return;\n let last = heights.get(detailId) ?? 0;\n const apply = () => {\n const px = Math.ceil(el.getBoundingClientRect().height);\n if (px <= 0 || px === last) return;\n last = px;\n heights.set(detailId, px);\n node.setRowHeight(px);\n api.onRowHeightChanged();\n };\n apply();\n const observer = new ResizeObserver(apply);\n observer.observe(el);\n return () => observer.disconnect();\n }, [api, detailId, heights, isDetail, node]);\n\n // Arrow / Tab navigation focuses the `.ag-row` itself — the parent of\n // this surface — so React's onKeyDown below never sees those keys.\n useEffect(() => {\n const el = rootRef.current;\n const row = el?.parentElement;\n if (!el || !row || !isDetail) return;\n const onKey = (event: globalThis.KeyboardEvent) => {\n if (event.target !== row || event.defaultPrevented) return;\n if (event.key === 'Escape') {\n event.stopPropagation();\n ctxRef.current?.onExpandedRowChange?.(null);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n const first = el.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n (first ?? el).focus();\n }\n };\n row.addEventListener('keydown', onKey);\n return () => row.removeEventListener('keydown', onKey);\n }, [isDetail]);\n\n if (!isDetail) {\n const Fallback = ctx?.fallbackRenderer;\n return Fallback ? <Fallback {...props} /> : null;\n }\n\n const parentId = data[EXPANDED_ROW_MARKER];\n // Prefer the untouched parent object; fall back to stripping the marker\n // when the grid renders a detail whose parent has already changed.\n let row: TData;\n if (ctx?.expanded && ctx.expanded.id === parentId) {\n row = ctx.expanded.row;\n } else {\n const { [EXPANDED_ROW_MARKER]: _marker, ...rest } = data;\n row = rest as TData;\n }\n\n // A Radix layer (tooltip, menu, select) that dismissed on this Escape\n // has already called preventDefault — one keypress closes one thing.\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n event.stopPropagation();\n ctx?.onExpandedRowChange?.(null);\n };\n\n return (\n <div\n ref={rootRef}\n role=\"gridcell\"\n tabIndex={-1}\n data-component=\"data-table-expanded-row\"\n data-expanded-row-of={parentId}\n className=\"ds-data-table-expanded-row-surface\"\n onKeyDown={handleKeyDown}\n >\n {/* Visually hidden, not aria-label: a gridcell names from its\n author first, and a label would hide the content from the row. */}\n <span className=\"ds:sr-only\">{t('dataTable.expandedRow')}</span>\n {ctx?.renderExpandedRow?.(row)}\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Which kit filter a ColDef's `filter` is, without importing the filter. */\n/* */\n/* The AG toolbar seam needs to know a column's filter kind. Comparing */\n/* `def.filter === DateRangeFilter` would make DataTable import every */\n/* filter, and with them DateRangePicker, MultiSelect and Autocomplete. */\n/* Each filter module registers itself here instead. A filter that was */\n/* never imported cannot sit on a ColDef, so the answer is the same. */\n/* -------------------------------------------------------------------- */\n\nimport type { TableFilterKind } from '../../_shared/table-toolbar/seam';\n\nconst kinds = new WeakMap<object, TableFilterKind>();\n\n/** Called once by each kit filter module, next to its component. */\nexport function registerTableFilterKind(\n component: object,\n kind: TableFilterKind,\n): void {\n kinds.set(component, kind);\n}\n\n/** The kit filter kind of a ColDef `filter` value, or `null`. */\nexport function registeredTableFilterKind(\n filter: unknown,\n): TableFilterKind | null {\n if (typeof filter !== 'function' && (typeof filter !== 'object' || !filter))\n return null;\n return kinds.get(filter) ?? null;\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport type {\n CustomFilterProps,\n CustomFloatingFilterProps,\n} from 'ag-grid-react';\nimport { useGridFilter } from 'ag-grid-react';\nimport type { IFilter } from 'ag-grid-community';\nimport { useTranslation } from 'react-i18next';\nimport i18next from 'i18next';\nimport { Search, X } from 'lucide-react';\nimport { StateBackedTextInput } from '../../_shared/state-backed-text-input';\nimport { Select, type SelectOption } from '../../select';\nimport { Button } from '../../button';\nimport type {\n TextFilterModel,\n TextFilterOperator,\n} from '../../_shared/table-toolbar/seam';\nimport {\n coerceToString,\n makeTextMatcher as makeMatcher,\n} from '../../_shared/table-filters/predicates';\n\n/**\n * Custom AG Grid filter component — text-comparison filter.\n *\n * Fills the gap left by `agTextColumnFilter`'s stock browser-skinned\n * input by wrapping the kit's `<TextInput>` and `<Select>` so the\n * column-header menu (`TextFilter`) and the inline floating row\n * (`TextFloatingFilter`) match the DS form language.\n *\n * Wire on a colDef:\n * ```tsx\n * {\n * field: 'description',\n * filter: TextFilter,\n * floatingFilter: true,\n * floatingFilterComponent: TextFloatingFilter,\n * filterParams: { defaultOperator: 'contains' },\n * }\n * ```\n *\n * Model shape `{ type, filter }` mirrors AG Grid's `agTextColumnFilter`\n * text-operator vocabulary (`contains`, `equals`, `startsWith`,\n * `endsWith`, `notContains`) so server-side adapters that already\n * understand the stock filter can read this one identically.\n */\n\n// The model types are the kit's shared table vocabulary (one declaration\n// for DataTable and DataGrid); re-exported here under their old names.\nexport type {\n TextFilterModel,\n TextFilterOperator,\n} from '../../_shared/table-toolbar/seam';\n\nexport interface TextFilterParams {\n placeholder?: string;\n defaultOperator?: TextFilterOperator;\n}\n\nconst OPERATORS: TextFilterOperator[] = [\n 'contains',\n 'equals',\n 'startsWith',\n 'endsWith',\n 'notContains',\n];\n\nexport function TextFilter(\n props: CustomFilterProps<unknown, unknown, TextFilterModel> &\n TextFilterParams,\n) {\n const { model, onModelChange, getValue, placeholder, defaultOperator } =\n props;\n const { t } = useTranslation('ui');\n\n const initialOperator: TextFilterOperator =\n model?.type ?? defaultOperator ?? 'contains';\n const [operator, setOperator] = useState<TextFilterOperator>(initialOperator);\n const [draft, setDraft] = useState<string>(model?.filter ?? '');\n\n // Hydrate local state when AG Grid pushes an external model change\n // (e.g. consumer calls api.setFilterModel programmatically).\n useEffect(() => {\n setOperator(model?.type ?? defaultOperator ?? 'contains');\n setDraft(model?.filter ?? '');\n }, [model, defaultOperator]);\n\n const matcher = useMemo(() => makeMatcher(i18next.language), []);\n\n useGridFilter({\n doesFilterPass: (params) => {\n const active = model;\n if (!active || active.filter === '') return true;\n const value = coerceToString(getValue(params.node));\n if (value === null) return false;\n switch (active.type) {\n case 'equals':\n return matcher.equals(value, active.filter);\n case 'contains':\n return matcher.contains(value, active.filter);\n case 'startsWith':\n return matcher.startsWith(value, active.filter);\n case 'endsWith':\n return matcher.endsWith(value, active.filter);\n case 'notContains':\n return !matcher.contains(value, active.filter);\n default:\n return true;\n }\n },\n });\n\n function apply() {\n const trimmed = draft.trim();\n if (trimmed === '') {\n onModelChange(null);\n return;\n }\n onModelChange({ type: operator, filter: draft });\n }\n\n function clear() {\n setDraft('');\n setOperator(defaultOperator ?? 'contains');\n onModelChange(null);\n }\n\n const operatorOptions: SelectOption<TextFilterOperator>[] = OPERATORS.map(\n (op) => ({\n value: op,\n label: t(`dataTable.textFilter.operators.${op}`),\n }),\n );\n\n const placeholderLabel = placeholder ?? t('dataTable.textFilter.placeholder');\n\n return (\n <div\n data-component=\"text-filter\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)] ds:min-w-[240px]\"\n >\n <Select<TextFilterOperator>\n size=\"sm\"\n options={operatorOptions}\n value={operator}\n onValueChange={(next) => {\n if (next === '') return;\n setOperator(next);\n }}\n aria-label={t('dataTable.textFilter.operators.contains')}\n />\n <StateBackedTextInput\n size=\"sm\"\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n apply();\n }\n }}\n placeholder={placeholderLabel}\n aria-label={placeholderLabel}\n startAdornment={<Search aria-hidden=\"true\" className=\"ds:size-4\" />}\n />\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)] ds:border-t ds:border-[var(--border)]\">\n <Button intent=\"ghost\" size=\"sm\" onClick={clear} type=\"button\">\n {t('dataTable.textFilter.clear')}\n </Button>\n <Button intent=\"primary\" size=\"sm\" onClick={apply} type=\"button\">\n {t('dataTable.textFilter.apply')}\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Floating-filter companion for `TextFilter`.\n *\n * Renders a `<TextInput size=\"sm\">` directly as the inline floating\n * filter — leading search icon, optional trailing clear button, fixed\n * operator (the popover version owns operator selection so the inline\n * row stays compact).\n *\n * Commits debounce at 200ms; empty input commits `null` so the grid\n * stops filtering as soon as the field is blank.\n */\nexport function TextFloatingFilter(\n props: CustomFloatingFilterProps<IFilter, unknown, unknown, TextFilterModel>,\n) {\n const { model, onModelChange, column } = props;\n const { t } = useTranslation('ui');\n\n const filterParams =\n (column?.getColDef?.()?.filterParams as TextFilterParams | undefined) ?? {};\n const defaultOperator: TextFilterOperator =\n filterParams.defaultOperator ?? 'contains';\n const placeholderLabel =\n filterParams.placeholder ?? t('dataTable.textFilter.placeholder');\n\n const [draft, setDraft] = useState<string>(model?.filter ?? '');\n\n // Hydrate when the model changes externally (programmatic reset).\n useEffect(() => {\n setDraft(model?.filter ?? '');\n }, [model?.filter]);\n\n // Debounced commit. Avoids hammering AG Grid with a model push on\n // every keystroke; 200ms matches the kit's other deferred-input\n // patterns. A bare setTimeout + cleanup is sufficient — no third-party\n // debounce hook required.\n useEffect(() => {\n // Avoid spurious commits when the local draft already matches the\n // applied model (e.g. just-hydrated initial mount).\n if (draft === (model?.filter ?? '')) return;\n\n const timer = setTimeout(() => {\n if (draft === '') {\n if (model) onModelChange(null);\n return;\n }\n onModelChange({ type: defaultOperator, filter: draft });\n }, 200);\n\n return () => clearTimeout(timer);\n }, [draft, defaultOperator, model, onModelChange]);\n\n function clearImmediate() {\n setDraft('');\n if (model) onModelChange(null);\n }\n\n return (\n <div data-component=\"text-floating-filter\" className=\"ds:w-full\">\n <StateBackedTextInput\n size=\"sm\"\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n placeholder={placeholderLabel}\n aria-label={placeholderLabel}\n startAdornment={<Search aria-hidden=\"true\" className=\"ds:size-4\" />}\n endAdornment={\n draft.length > 0 ? (\n <button\n type=\"button\"\n aria-label={t('dataTable.textFilter.clear')}\n onClick={clearImmediate}\n className=\"ds:pointer-events-auto ds:flex ds:items-center ds:text-[var(--muted-foreground)] ds:hover:text-[var(--foreground)] ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none\"\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n ) : undefined\n }\n />\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* The AG Grid implementation of the table toolbar seam (DataTable). */\n/* */\n/* Every seam call is the GridApi call DataTable's toolbar made before */\n/* the parts moved to `_shared/table-toolbar/` (design § 7.3), so */\n/* DataTable behaves as in kit 1.112 apart from the three fixes Product */\n/* switched on for 1.113 (`DATA_TABLE_TOOLBAR_FEATURES`): QuickSearch */\n/* follows an external clear, FacetFilter writes a `set` model on */\n/* SelectFilter columns and reads its pill back, and ColumnToggle can */\n/* reorder from the keyboard. */\n/* -------------------------------------------------------------------- */\n\nimport type { Column, ColDef, GridApi, IRowNode } from 'ag-grid-community';\nimport {\n DATA_TABLE_TOOLBAR_FEATURES,\n type TableColumnFilterModel,\n type TableExportCell,\n type TableExportSnapshot,\n type TableFacetValue,\n type TableFilterKind,\n type TableToolbarChangeKind,\n type TableToolbarColumn,\n type TableToolbarSeam,\n} from '../_shared/table-toolbar/seam';\nimport { isExpandedRowDetail } from './expanded-row-renderer';\n// The other kit filters are recognised through `registeredTableFilterKind`,\n// not imported: importing them would ship DateRangePicker, MultiSelect and\n// Autocomplete with every DataTable. TextFilter is DataTable's default.\nimport { registeredTableFilterKind } from './filters/filter-kind';\nimport { TextFilter } from './filters/text-filter';\n\n/** What the AG seam reads from DataTable on every call. */\nexport interface AgToolbarSeamDeps {\n /** The live grid API; `undefined` until the grid is ready. */\n getApi: () => GridApi | undefined;\n /** Rows selected now (expanded-detail rows excluded). */\n selectionCount: number;\n onPrint: () => void;\n /** Columns the user showed or hid from the toolbar (AG's visibility API\n * cannot carry a source). */\n markColumnsUserTouched?: (colIds: readonly string[]) => void;\n}\n\n/** The seam plus the hook DataTable uses to hand it fresh props. */\nexport interface AgToolbarSeamController {\n seam: TableToolbarSeam;\n /** Call during render with the latest props, so parts rendered in the\n * same pass read them. Emits nothing. */\n update(deps: AgToolbarSeamDeps): void;\n /** Tell subscribers something changed (call from an effect, e.g. after\n * the selection count changed). */\n notify(kind: TableToolbarChangeKind): void;\n}\n\n/** How long to wait between looks for a grid that is not ready yet\n * (`toolbar.tsx` 1.112 used the same 50 ms poll). */\nexport const AG_SEAM_POLL_MS = 50;\n\nconst apiBySeam = new WeakMap<TableToolbarSeam, () => GridApi | undefined>();\n\n/** @internal The GridApi behind an AG seam, for DataTable's AG-typed\n * callbacks (`BulkAction.onClick(api)`, custom export items). */\nexport function agApiOf(seam: TableToolbarSeam): GridApi | undefined {\n return apiBySeam.get(seam)?.();\n}\n\nconst ALL_KINDS: readonly TableToolbarChangeKind[] = [\n 'filter',\n 'quickFilter',\n 'selection',\n 'columns',\n 'rows',\n];\n\nfunction filterKindOf(def: ColDef | undefined): TableFilterKind | null {\n const filter = def?.filter as unknown;\n if (!filter) return null;\n if (filter === TextFilter || filter === 'agTextColumnFilter') return 'text';\n if (filter === 'agNumberColumnFilter') return 'number';\n return registeredTableFilterKind(filter);\n}\n\n/** Whether the host lets the column move: AG checks `suppressMovable` and\n * `lockPosition` only in its drag UI, never in `moveColumns`. */\nfunction canMoveOf(def: ColDef | undefined): boolean {\n return !def?.suppressMovable && !def?.lockPosition;\n}\n\n/** Whether the host lets the column change pin side: AG checks\n * `lockPinned` only in its menus, never in `setColumnsPinned`. */\nfunction canPinOf(def: ColDef | undefined): boolean {\n return !def?.lockPinned;\n}\n\nfunction pinnedOf(col: Column): 'start' | 'end' | false {\n const pinned = col.getPinned();\n return pinned === 'left' ? 'start' : pinned === 'right' ? 'end' : false;\n}\n\n/** AG columns in display order (pinned start, centre, pinned end), the\n * utility columns (`ag-Grid-*` with no `hide`) left out. */\nfunction listColumns(api: GridApi): Column[] {\n // getAllGridColumns() reflects the live/displayed order (incl. a persisted\n // reorder); getColumns() returns columnDefs order. The grid shows its\n // pinned groups first and last whatever their position in that list, so\n // the list groups the same way.\n const pinRank = (col: Column): number =>\n col.getPinned() === 'left' ? 0 : col.getPinned() === 'right' ? 2 : 1;\n return [...(api.getAllGridColumns() ?? [])]\n .sort((a, b) => pinRank(a) - pinRank(b))\n .filter(\n (col) =>\n !(\n col.getColDef().hide === undefined &&\n col.getColId().startsWith('ag-Grid-')\n ),\n );\n}\n\nfunction exportCell(value: unknown): TableExportCell {\n if (value === null || value === undefined) return null;\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n return String(value);\n}\n\nfunction alignOf(def: ColDef | undefined): 'start' | 'end' {\n const type = def?.type;\n const types = Array.isArray(type) ? type : type ? [type] : [];\n return types.includes('numericColumn') || types.includes('rightAligned')\n ? 'end'\n : 'start';\n}\n\n/**\n * Builds DataTable's toolbar seam. `initial` is read again through\n * `update`, so one seam lives as long as its DataTable.\n */\nexport function createAgToolbarSeam(\n initial: AgToolbarSeamDeps,\n): AgToolbarSeamController {\n let deps = initial;\n const getApi = (): GridApi | undefined => {\n const api = deps.getApi();\n return api && !api.isDestroyed() ? api : undefined;\n };\n\n /* ---- change events: late binding, one poll, one set of listeners ---- */\n\n const listeners = new Set<(kind: TableToolbarChangeKind) => void>();\n let bound: { api: GridApi; detach: () => void } | null = null;\n let timer: number | undefined;\n\n const emit = (kind: TableToolbarChangeKind): void => {\n for (const listener of [...listeners]) listener(kind);\n };\n\n const bind = (api: GridApi): void => {\n const onFilter = (): void => {\n emit('filter');\n emit('quickFilter');\n };\n const onColumns = (): void => emit('columns');\n const onRows = (): void => emit('rows');\n api.addEventListener('filterChanged', onFilter);\n api.addEventListener('columnVisible', onColumns);\n api.addEventListener('columnMoved', onColumns);\n api.addEventListener('columnPinned', onColumns);\n api.addEventListener('modelUpdated', onRows);\n bound = {\n api,\n detach: () => {\n if (api.isDestroyed()) return;\n api.removeEventListener('filterChanged', onFilter);\n api.removeEventListener('columnVisible', onColumns);\n api.removeEventListener('columnMoved', onColumns);\n api.removeEventListener('columnPinned', onColumns);\n api.removeEventListener('modelUpdated', onRows);\n },\n };\n // Late binding: whoever subscribed before the grid was ready reads\n // everything once now.\n for (const kind of ALL_KINDS) emit(kind);\n };\n\n const ensureBound = (): void => {\n const api = getApi();\n if (bound && bound.api === api) return;\n if (bound) {\n bound.detach();\n bound = null;\n }\n if (api) {\n if (timer !== undefined) {\n window.clearInterval(timer);\n timer = undefined;\n }\n bind(api);\n return;\n }\n if (timer === undefined && typeof window !== 'undefined') {\n timer = window.setInterval(() => {\n if (getApi()) ensureBound();\n }, AG_SEAM_POLL_MS);\n }\n };\n\n const release = (): void => {\n if (listeners.size > 0) return;\n if (timer !== undefined) {\n window.clearInterval(timer);\n timer = undefined;\n }\n bound?.detach();\n bound = null;\n };\n\n /* ---- the seam ---- */\n\n const seam: TableToolbarSeam = {\n features: DATA_TABLE_TOOLBAR_FEATURES,\n\n isReady: () => getApi() !== undefined,\n\n subscribe(listener) {\n listeners.add(listener);\n ensureBound();\n return () => {\n listeners.delete(listener);\n release();\n };\n },\n\n getColumns(): TableToolbarColumn[] {\n const api = getApi();\n if (!api) return [];\n return listColumns(api).map((col) => {\n const def = col.getColDef();\n return {\n id: col.getColId(),\n label: api.getDisplayNameForColumn(col, null) || col.getColId(),\n visible: col.isVisible(),\n canHide: true,\n canMove: canMoveOf(def),\n canPin: canPinOf(def),\n pinned: pinnedOf(col),\n filterKind: filterKindOf(def),\n };\n });\n },\n\n setColumnVisible(id, visible) {\n const api = getApi();\n if (!api) return;\n api.setColumnsVisible([id], visible);\n // The grid tags this write `api` like any other; tell the table it was\n // the user so the choice persists and stays theirs.\n deps.markColumnsUserTouched?.([id]);\n },\n\n moveColumn(id, toIndex) {\n const api = getApi();\n if (!api) return;\n // `toIndex` counts the toolbar's list; AG's `moveColumns` index counts\n // hidden and utility columns too, so map through the target's id. A\n // move across a pin boundary is ignored by AG unless the column's pin\n // first matches its destination.\n const target = listColumns(api)[toIndex];\n if (!target || target.getColId() === id) return;\n const toColId = target.getColId();\n const gridColumns = api.getAllGridColumns();\n const from = gridColumns.find((c) => c.getColId() === id);\n if (!from) return;\n // The seam refuses what the host locked, as `moveColumn` promises:\n // AG itself would unpin a `lockPinned` column or move a\n // `suppressMovable` one.\n const fromDef = from.getColDef();\n if (!canMoveOf(fromDef)) return;\n const sideChanges =\n (from.getPinned() ?? null) !== (target.getPinned() ?? null);\n if (sideChanges && !canPinOf(fromDef)) return;\n if (sideChanges) {\n api.setColumnsPinned([id], target.getPinned() ?? null);\n }\n const agIndex = api\n .getAllGridColumns()\n .findIndex((c) => c.getColId() === toColId);\n if (agIndex >= 0) api.moveColumns([id], agIndex);\n },\n\n getQuickFilter() {\n const qf = getApi()?.getGridOption('quickFilterText');\n return typeof qf === 'string' ? qf : '';\n },\n\n setQuickFilter(text) {\n // `setGridOption` is the public path in AG Grid v33+ for changing any\n // grid option after init. AG fires `filterChanged` when the parsed\n // text changes, which is what QuickSearch and FilterChips follow.\n getApi()?.setGridOption('quickFilterText', text);\n },\n\n getFilterModel() {\n return getApi()?.getFilterModel() ?? {};\n },\n\n setColumnFilter(id, model) {\n const api = getApi();\n if (!api) return;\n // The model, never `destroyFilter()`: destroying the instance drops\n // the filter without pushing a model change, so a floating filter goes\n // on showing the value it no longer applies.\n void api.setColumnFilterModel(id, model);\n api.onFilterChanged();\n },\n\n clearAllFilters() {\n const api = getApi();\n if (!api) return;\n api.setFilterModel(null);\n api.setGridOption('quickFilterText', '');\n },\n\n setFacet(id, value) {\n const api = getApi();\n if (!api) return;\n if (value === null) {\n void api.setColumnFilterModel(id, null);\n api.onFilterChanged();\n return;\n }\n const def = api.getColumn(id)?.getColDef();\n // SelectFilter evaluates `set` models only; the 1.112 `equals` model\n // was a silent no-op there.\n const model:\n | TableColumnFilterModel\n | { type: 'equals'; filter: TableFacetValue } =\n registeredTableFilterKind(def?.filter) === 'select' &&\n (typeof value === 'string' || typeof value === 'number')\n ? { type: 'set', values: [value] }\n : { type: 'equals', filter: value };\n void api.setColumnFilterModel(id, model);\n api.onFilterChanged();\n },\n\n getFacet(id) {\n const model = getApi()?.getColumnFilterModel(id) as\n | Record<string, unknown>\n | null\n | undefined;\n if (!model || typeof model !== 'object') return null;\n if (model.type === 'set') {\n const values = model.values;\n if (Array.isArray(values) && values.length === 1) {\n const v: unknown = values[0];\n return typeof v === 'string' || typeof v === 'number' ? v : null;\n }\n return null;\n }\n if (model.type === 'equals' && 'filter' in model) {\n const v = model.filter;\n return typeof v === 'string' ||\n typeof v === 'number' ||\n typeof v === 'boolean'\n ? v\n : null;\n }\n return null;\n },\n\n getSelectionCount: () => deps.selectionCount,\n\n getSelectedRowIds() {\n const api = getApi();\n if (!api) return [];\n return api\n .getSelectedNodes()\n .filter((node) => !isExpandedRowDetail(node.data))\n .map((node) => node.id)\n .filter((id): id is string => typeof id === 'string');\n },\n\n getExportSnapshot(): TableExportSnapshot | undefined {\n const api = getApi();\n if (!api) return undefined;\n // Display order, as the contract asks: `getColumns()` is columnDefs\n // order and ignores a reorder.\n const columns = listColumns(api).filter((col) => col.isVisible());\n // A number the formatter leaves as plain digits stays numeric (AG's\n // inferred number type formats `97.5` as the text \"97.5\"), so Excel\n // and the export snapshot keep a number; real formatting wins.\n const cellsOf = (node: IRowNode): TableExportCell[] =>\n columns.map((col) => {\n const raw: unknown = api.getCellValue({ rowNode: node, colKey: col });\n const shown: unknown = api.getCellValue({\n rowNode: node,\n colKey: col,\n useFormatter: true,\n });\n if (typeof raw === 'number' && String(raw) === String(shown)) {\n return exportCell(raw);\n }\n return exportCell(shown);\n });\n const rows: { id: string; cells: TableExportCell[] }[] = [];\n api.forEachNodeAfterFilterAndSort((node) => {\n if (!node.data || isExpandedRowDetail(node.data)) return;\n rows.push({ id: node.id ?? '', cells: cellsOf(node) });\n });\n const totalsNode =\n api.getPinnedBottomRowCount() > 0\n ? api.getPinnedBottomRow(0)\n : undefined;\n return {\n scope: 'all-filtered',\n columns: columns.map((col) => ({\n id: col.getColId(),\n label: api.getDisplayNameForColumn(col, null) ?? col.getColId(),\n align: alignOf(col.getColDef()),\n })),\n rows,\n totals: totalsNode ? cellsOf(totalsNode) : null,\n };\n },\n\n exportCsv(fileName) {\n const api = getApi();\n if (!api) return;\n // No argument when no name is given: the CSV DataTable wrote in 1.112.\n if (fileName) api.exportDataAsCsv({ fileName });\n else api.exportDataAsCsv();\n },\n\n print: () => deps.onPrint(),\n };\n\n apiBySeam.set(seam, getApi);\n\n return {\n seam,\n update(next) {\n deps = next;\n },\n notify: emit,\n };\n}\n","/* -------------------------------------------------------------------- */\n/* DataTable.Toolbar: the shared table toolbar parts over AG Grid. */\n/* */\n/* The parts live in `_shared/table-toolbar/` and talk to the table */\n/* through `TableToolbarSeam`; DataTable's seam is AG-backed */\n/* (`./ag-toolbar-seam.ts`). This file keeps every 1.112 export, prop */\n/* type and display name, and adds thin wrappers where a public callback */\n/* still receives the AG Grid API (BulkAction, ExportMenu.Item `custom`, */\n/* the deprecated ExportCsv and ExportPdf). */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type MouseEvent,\n type MouseEventHandler,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Download, FileText } from 'lucide-react';\nimport type { GridApi } from 'ag-grid-community';\nimport type { ButtonProps } from '../button/button';\nimport { IconButton, type IconButtonProps } from '../button/icon-button';\nimport { TableToolbarProvider } from '../_shared/table-toolbar/context';\nimport {\n resolveTokenToRgb,\n writeTablePdf,\n writeTableXlsx,\n type TableExportTable,\n} from '../_shared/table-toolbar/export-files';\nimport { createTableToolbarParts } from '../_shared/table-toolbar/parts';\nimport { agApiOf, createAgToolbarSeam } from './ag-toolbar-seam';\n\nexport { resolveTokenToRgb };\n\nconst parts = createTableToolbarParts({\n prefix: 'DataTable.Toolbar',\n missingProvider: (caller) =>\n `${caller} must be rendered inside <DataTable.Toolbar> as a descendant of <DataTable>.`,\n});\n\n/* ------------------------------------------------------------------ */\n/* Provider */\n/* ------------------------------------------------------------------ */\n\nexport interface ToolbarProviderProps {\n getApi: () => GridApi | undefined;\n selectionCount: number;\n onPrint: () => void;\n markColumnsUserTouched?: (colIds: readonly string[]) => void;\n children: ReactNode;\n}\n\n/** Builds one AG-backed toolbar seam per DataTable and provides it. */\nexport function ToolbarProvider({\n getApi,\n selectionCount,\n onPrint,\n markColumnsUserTouched,\n children,\n}: ToolbarProviderProps) {\n const deps = { getApi, selectionCount, onPrint, markColumnsUserTouched };\n const [controller] = useState(() => createAgToolbarSeam(deps));\n // Fresh props before the parts below read them in this same render.\n controller.update(deps);\n const mounted = useRef(false);\n useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n return;\n }\n controller.notify('selection');\n }, [controller, selectionCount]);\n return (\n <TableToolbarProvider seam={controller.seam}>\n {children}\n </TableToolbarProvider>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Prop types (unchanged from 1.112) */\n/* ------------------------------------------------------------------ */\n\nexport type ToolbarRootProps = HTMLAttributes<HTMLDivElement>;\n\ntype ToolbarIconButtonProps = Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick'\n> & {\n /** Accessible label: becomes the tooltip text and `aria-label`. */\n label?: string;\n};\n\nexport interface ExportCsvProps extends ToolbarIconButtonProps {\n /** Optional override: receives the live AG Grid API. */\n onExport?: (api: GridApi) => void;\n}\n\nexport interface ExportPdfProps extends ToolbarIconButtonProps {\n /**\n * Optional override for the default PDF generation. When omitted, clicking\n * the button calls the built-in handler (`defaultExportPdf`) which\n * dynamic-imports `jspdf` + `jspdf-autotable` and produces a paged PDF\n * of the current sort/filter state. Supply your own to plug in a\n * server-side PDF generator or a custom layout.\n */\n onClick?: (api: GridApi | undefined) => void;\n /** Filename for the generated PDF (default `data-table-export.pdf`). */\n fileName?: string;\n}\n\nexport type PrintProps = ToolbarIconButtonProps;\n\nexport interface QuickSearchProps {\n /** Placeholder text. Falls back to `t('dataTable.quickSearch.placeholder')`. */\n placeholder?: string;\n /** Debounce ms before pushing to AG Grid. Defaults to 150 ms. */\n debounceMs?: number;\n}\n\nexport interface RefreshButtonProps extends Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick'\n> {\n /** Called when the user clicks Refresh. */\n onRefresh: () => void;\n /** Accessible label. Falls back to `t('dataTable.refresh')`. */\n label?: string;\n}\n\nexport interface FacetFilterOption<TValue = string> {\n value: TValue | null;\n label: string;\n}\n\nexport interface FacetFilterProps<TValue = string> {\n /** Column field to filter on. */\n field: string;\n /** Options shown as pills. `value: null` clears the filter. */\n options: FacetFilterOption<TValue>[];\n /** Accessible label for the pill group. */\n label?: string;\n}\n\nexport type ExportFormat = 'csv' | 'xlsx' | 'pdf' | 'custom';\n\nexport interface ExportMenuItemProps {\n /** Built-in format or `custom` for consumer-supplied handler. */\n format: ExportFormat;\n /** Label override. Built-in formats default to `t('dataTable.export.{format}')`. */\n label?: string;\n /** Consumer handler: required for `format: 'custom'`. */\n onClick?: (api: GridApi | undefined) => void;\n /** File-name override (only used by built-in formats). */\n fileName?: string;\n}\n\nexport interface ExportMenuProps extends Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick' | 'children'\n> {\n /** Custom menu items. When omitted, renders the default CSV+Excel+PDF trio. */\n children?: ReactNode;\n /** Accessible label for the trigger. */\n label?: string;\n}\n\nexport interface ColumnToggleProps extends Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick' | 'children'\n> {\n label?: string;\n /** Override the trigger glyph (defaults to the Columns3Cog icon). */\n icon?: ReactNode;\n /** Extra content rendered below the column list (e.g. a settings switch). */\n footer?: ReactNode;\n /** Extra content rendered above the column list, directly under the title\n * (e.g. a grouping switch). */\n header?: ReactNode;\n}\n\nexport interface BulkActionProps extends Omit<\n ButtonProps,\n 'onClick' | 'children' | 'startIcon' | 'intent'\n> {\n label: string;\n icon?: ReactNode;\n onClick: (api: GridApi | undefined) => void;\n variant?: 'default' | 'destructive';\n}\n\n/* ------------------------------------------------------------------ */\n/* Built-in PDF and Excel handlers over the AG Grid API */\n/* ------------------------------------------------------------------ */\n\n/** Visible columns and every row after filter and sort, formatted the way\n * the grid shows them. `headerFallback` names a column with no display\n * name (PDF: empty, Excel: the column id, as in 1.112). */\nfunction agExportTable(\n api: GridApi,\n headerFallback: 'empty' | 'colId',\n): TableExportTable {\n const visibleColumns = (api.getColumns() ?? []).filter((col) =>\n col.isVisible(),\n );\n const headers = visibleColumns.map(\n (col) =>\n api.getDisplayNameForColumn(col, null) ??\n (headerFallback === 'colId' ? col.getColId() : ''),\n );\n // AG Grid Community supports forEachNodeAfterFilterAndSort on the\n // client-side row model, the only model this wrapper exposes.\n const rows: unknown[][] = [];\n api.forEachNodeAfterFilterAndSort((node) => {\n if (!node.data) return;\n rows.push(\n visibleColumns.map((col) =>\n api.getCellValue({ rowNode: node, colKey: col, useFormatter: true }),\n ),\n );\n });\n return { headers, rows };\n}\n\ninterface DefaultExportPdfOptions {\n fileName: string;\n}\n\n/**\n * Default Export PDF handler. Exported for tests and for consumers who want\n * to call it from a custom `onClick` (e.g. to add a logo or signature).\n */\nexport async function defaultExportPdf(\n api: GridApi | undefined,\n options: DefaultExportPdfOptions,\n): Promise<void> {\n if (!api) return;\n await writeTablePdf(agExportTable(api, 'empty'), options);\n}\n\nasync function defaultExportXlsx(\n api: GridApi | undefined,\n options: { fileName: string },\n): Promise<void> {\n if (!api) return;\n await writeTableXlsx(agExportTable(api, 'colId'), options);\n}\n\n/* ------------------------------------------------------------------ */\n/* AG-shaped wrappers */\n/* ------------------------------------------------------------------ */\n\nconst ExportCsv = forwardRef<HTMLButtonElement, ExportCsvProps>(\n ({ label, onExport, intent = 'outline', ...props }, ref) => {\n const { t } = useTranslation('ui');\n const seam = parts.useSeam('ExportCsv');\n // The props leave out onClick, but a wrapper that clones its children\n // may inject one: compose it, never let it replace the export (1.112\n // spread it over the handler, so the button did nothing).\n const { onClick, ...rest } = props as typeof props & {\n onClick?: MouseEventHandler<HTMLButtonElement>;\n };\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n const api = agApiOf(seam);\n if (!api) return;\n if (onExport) onExport(api);\n else seam.exportCsv();\n },\n [seam, onExport, onClick],\n );\n\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Download aria-hidden />}\n tooltip={label ?? t('dataTable.exportCsv')}\n {...rest}\n onClick={handleClick}\n />\n );\n },\n);\nExportCsv.displayName = 'DataTable.Toolbar.ExportCsv';\n\nconst ExportPdf = forwardRef<HTMLButtonElement, ExportPdfProps>(\n ({ label, onClick, fileName, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation('ui');\n const seam = parts.useSeam('ExportPdf');\n const handleClick = useCallback(() => {\n const api = agApiOf(seam);\n if (onClick) {\n onClick(api);\n return;\n }\n // Fire-and-forget: errors bubble to the console for now; consumers\n // who need to surface them should supply their own `onClick`.\n void defaultExportPdf(api, {\n fileName: fileName ?? 'data-table-export.pdf',\n });\n }, [seam, onClick, fileName]);\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<FileText aria-hidden />}\n tooltip={label ?? t('dataTable.exportPdf')}\n onClick={handleClick}\n {...rest}\n />\n );\n },\n);\nExportPdf.displayName = 'DataTable.Toolbar.ExportPdf';\n\nconst FacetFilter = <TValue extends string | number | boolean = string>({\n field,\n options,\n label,\n}: FacetFilterProps<TValue>) => (\n <parts.FacetFilter field={field} options={options} label={label} />\n);\n(FacetFilter as { displayName?: string }).displayName =\n 'DataTable.Toolbar.FacetFilter';\n\nconst DEFAULT_EXPORT_ITEMS: ExportFormat[] = ['csv', 'xlsx', 'pdf'];\n\nconst ExportMenuItem = ({\n format,\n label,\n onClick,\n fileName,\n}: ExportMenuItemProps) => {\n const seam = parts.useSeam('ExportMenu.Item');\n const handleSelect = useCallback(() => {\n const api = agApiOf(seam);\n if (format === 'csv') {\n seam.exportCsv(fileName);\n return;\n }\n if (format === 'pdf') {\n void defaultExportPdf(api, {\n fileName: fileName ?? 'data-table-export.pdf',\n });\n return;\n }\n if (format === 'xlsx') {\n void defaultExportXlsx(api, {\n fileName: fileName ?? 'data-table-export.xlsx',\n });\n return;\n }\n // custom: the consumer is required to handle it.\n onClick?.(api);\n }, [seam, format, fileName, onClick]);\n return (\n <parts.ExportMenuItemBase\n format={format}\n label={label}\n onSelect={handleSelect}\n />\n );\n};\nExportMenuItem.displayName = 'DataTable.Toolbar.ExportMenu.Item';\n\n// forwardRef + rest-spread so the trigger IconButton receives the props an\n// IconButtonGroup clones onto its children (ref, tabIndex, onFocus, intent),\n// which its roving tabindex needs.\nconst ExportMenu = forwardRef<HTMLButtonElement, ExportMenuProps>(\n ({ children, ...rest }, ref) => (\n <parts.ExportMenu ref={ref} {...rest}>\n {children ??\n DEFAULT_EXPORT_ITEMS.map((f) => <ExportMenuItem key={f} format={f} />)}\n </parts.ExportMenu>\n ),\n);\nExportMenu.displayName = 'DataTable.Toolbar.ExportMenu';\n\nconst BulkAction = forwardRef<HTMLButtonElement, BulkActionProps>(\n ({ onClick, ...rest }, ref) => {\n const seam = parts.useSeam('BulkAction');\n return (\n <parts.BulkAction\n ref={ref}\n onAction={() => onClick(agApiOf(seam))}\n {...rest}\n />\n );\n },\n);\nBulkAction.displayName = 'DataTable.Toolbar.BulkAction';\n\n/* ------------------------------------------------------------------ */\n/* Assembled namespace: mounted on DataTable.Toolbar downstream */\n/* ------------------------------------------------------------------ */\n\n// These leaves render a single DS <IconButton> trigger, so IconButtonGroup\n// accepts them as direct children (see its rendersIconButton DEV check).\nfor (const leaf of [ExportCsv, ExportPdf, ExportMenu]) {\n (leaf as { rendersIconButton?: boolean }).rendersIconButton = true;\n}\n\nconst ExportMenuNamespace = Object.assign(ExportMenu, {\n Item: ExportMenuItem,\n});\n\nexport const Toolbar = Object.assign(parts.Root, {\n FilterBar: parts.FilterBar,\n Actions: parts.Actions,\n /** @deprecated Use `Toolbar.ExportMenu` with a `csv` item. */\n ExportCsv,\n /** @deprecated Use `Toolbar.ExportMenu` with a `pdf` item. */\n ExportPdf,\n Print: parts.Print,\n ColumnToggle: parts.ColumnToggle,\n BulkAction,\n QuickSearch: parts.QuickSearch,\n Refresh: parts.Refresh,\n FilterChips: parts.FilterChips,\n FacetFilter,\n ExportMenu: ExportMenuNamespace,\n});\n","import { useEffect, type RefObject } from 'react';\n\nconst PRESENTATIONAL_ROLES = new Set(['presentation', 'none']);\nconst SELECTOR =\n '[role=\"presentation\"][aria-hidden], [role=\"none\"][aria-hidden]';\n\n/** `aria-hidden=\"false\"` on a presentational wrapper is a spec no-op — it\n * cannot un-hide anything — but it makes the element a named child of the\n * grid's ARIA tree. Dropping it is invisible to AT and to AG Grid. */\nfunction stripNoOpAriaHidden(el: Element): void {\n const role = el.getAttribute('role');\n if (role === null || !PRESENTATIONAL_ROLES.has(role)) return;\n if (el.getAttribute('aria-hidden') !== 'false') return;\n el.removeAttribute('aria-hidden');\n}\n\n/**\n * Repairs the one ARIA defect AG Grid's pinned viewport introduces.\n *\n * Pinning a column makes AG Grid write `aria-hidden=\"false\"` onto the\n * `role=\"presentation\"` pinned column and spanned-cell containers. axe's\n * `aria-required-children` treats any presentational element carrying a\n * global ARIA attribute as an *owned* child rather than transparent, so the\n * `role=\"grid\"` root and the pinned `role=\"rowgroup\"` viewport both report\n * \"Element has children which are not allowed: [role=presentation]\". Nothing\n * is wrong with the tree itself — only the no-op attribute.\n *\n * The observer watches `aria-hidden` alone, inside the grid root only, and\n * removes it only where the value is exactly `\"false\"` and the element is\n * presentational. `aria-hidden=\"true\"` is never touched, so every genuine\n * hide AG Grid performs still stands.\n */\nexport function usePresentationalAriaFix(\n rootRef: RefObject<HTMLElement | null>,\n enabled = true,\n): void {\n useEffect(() => {\n const root = rootRef.current;\n if (!enabled || !root || typeof MutationObserver === 'undefined') return;\n\n const sweep = () => {\n for (const el of root.querySelectorAll(SELECTOR)) stripNoOpAriaHidden(el);\n };\n sweep();\n\n const observer = new MutationObserver((records) => {\n for (const record of records) {\n if (record.type === 'attributes') {\n stripNoOpAriaHidden(record.target as Element);\n } else {\n for (const added of record.addedNodes) {\n if (!(added instanceof Element)) continue;\n stripNoOpAriaHidden(added);\n for (const el of added.querySelectorAll(SELECTOR)) {\n stripNoOpAriaHidden(el);\n }\n }\n }\n }\n });\n observer.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: ['aria-hidden'],\n });\n return () => observer.disconnect();\n }, [rootRef, enabled]);\n}\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — DataTable. */\n/* */\n/* Operations work against the curated `DataTableHandle`, never the raw */\n/* ag-grid `GridApi` (consumers needing the raw API call `getRawApi()`). */\n/* See `src/docs/26-agent-readiness.mdx` §15. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { DataTableHandle, DataTableSortEntry } from './data-table';\n\nexport const dataTableAgent: AgentAdapter<DataTableHandle> = {\n id: 'data-table',\n capabilities: [\n 'select_single',\n 'select_multiple',\n 'range_pick',\n 'filter',\n 'sort',\n 'paginate',\n ],\n state: {\n selection: {\n type: 'string[]',\n descriptionKey: 'ui.agent.dataTable.state.selection',\n description: 'Row ids of currently-selected rows.',\n read: (handle) => handle.getSelection(),\n },\n filter: {\n type: 'object',\n descriptionKey: 'ui.agent.dataTable.state.filter',\n description: 'Current ag-grid filter model, keyed by column id.',\n read: (handle) => handle.getFilter(),\n },\n sort: {\n type: 'Array<{ colId, sort }>',\n descriptionKey: 'ui.agent.dataTable.state.sort',\n description: 'Active sort, in priority order.',\n read: (handle) => handle.getSort(),\n },\n currentPage: {\n type: 'number',\n descriptionKey: 'ui.agent.dataTable.state.currentPage',\n description: 'Zero-indexed page number.',\n read: (handle) => handle.getCurrentPage(),\n },\n expandedRowId: {\n type: 'string | null',\n descriptionKey: 'ui.agent.dataTable.state.expandedRowId',\n description:\n 'Id of the row whose inline detail is open (expandable row), or null.',\n read: (handle) => handle.getExpandedRowId(),\n },\n },\n actions: {\n select_rows: {\n // Transient grid selection (data-table convention) — stays read.\n safety: 'read',\n argsType: '{ ids: string[] }',\n argsSchema: {\n type: 'object',\n properties: {\n ids: {\n type: 'array',\n items: { type: 'string' },\n description: 'Row ids to select (replaces the current selection).',\n },\n },\n required: ['ids'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.selectRows',\n description: 'Replace the current selection with the given row ids.',\n examples: [\n { args: { ids: ['r-1', 'r-2'] }, note: 'Select the first two rows.' },\n ],\n invoke: (handle, args: { ids: string[] }) => {\n handle.setSelection(args.ids);\n },\n },\n select_range: {\n safety: 'read',\n argsType: '{ fromId: string, toId: string }',\n argsSchema: {\n type: 'object',\n properties: {\n fromId: { type: 'string', description: 'Start row id (inclusive).' },\n toId: { type: 'string', description: 'End row id (inclusive).' },\n },\n required: ['fromId', 'toId'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.selectRange',\n description:\n 'Select every row between fromId and toId, inclusive, in current sort order.',\n invoke: (handle, args: { fromId: string; toId: string }) => {\n handle.selectRange(args.fromId, args.toId);\n },\n },\n clear_selection: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.clearSelection',\n description: 'Deselect all rows.',\n invoke: (handle) => {\n handle.clearSelection();\n },\n },\n get_selection: {\n safety: 'read',\n returns: 'string[]',\n returnsSchema: { type: 'array', items: { type: 'string' } },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.getSelection',\n description: 'Return the row ids of the currently-selected rows.',\n invoke: (handle) => handle.getSelection(),\n },\n apply_filter: {\n safety: 'read',\n argsType: '{ model: Record<string, unknown> }',\n argsSchema: {\n type: 'object',\n properties: {\n model: {\n type: 'object',\n description:\n 'ag-grid filter model keyed by column id. Opaque per-column filter shapes; replaces the current model.',\n additionalProperties: true,\n },\n },\n required: ['model'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.applyFilter',\n description: 'Replace the filter model with the given object.',\n invoke: (handle, args: { model: Record<string, unknown> }) => {\n handle.setFilter(args.model);\n },\n },\n sort_by: {\n safety: 'read',\n argsType: '{ model: DataTableSortEntry[] }',\n argsSchema: {\n type: 'object',\n properties: {\n model: {\n type: 'array',\n description: 'Sort entries in priority order.',\n items: {\n type: 'object',\n properties: {\n colId: { type: 'string', description: 'Column id to sort by.' },\n sort: { enum: ['asc', 'desc'], description: 'Sort direction.' },\n },\n required: ['colId', 'sort'],\n },\n },\n },\n required: ['model'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.sortBy',\n description:\n 'Replace the active sort with the given list (priority order).',\n examples: [\n {\n args: { model: [{ colId: 'name', sort: 'asc' }] },\n note: 'Sort by name ascending.',\n },\n ],\n invoke: (handle, args: { model: DataTableSortEntry[] }) => {\n handle.setSort(args.model);\n },\n },\n go_to_page: {\n safety: 'read',\n argsType: '{ page: number }',\n argsSchema: {\n type: 'object',\n properties: {\n page: {\n type: 'integer',\n minimum: 0,\n description: 'Zero-indexed page number.',\n },\n },\n required: ['page'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.goToPage',\n description: 'Navigate to the given zero-indexed page.',\n invoke: (handle, args: { page: number }) => {\n handle.goToPage(args.page);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'data-table',\n description: 'Marks the DataTable wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'gridId',\n description:\n 'Sourced from the gridId prop. Required to address a specific table from the agent.',\n },\n item: {\n attr: 'row-id',\n description:\n 'Native ag-grid row-id attribute on each rendered record row. When an expandable row is open, one extra full-width row with row-id `<parentId>::detail` is the accordion detail, not a record — its cell carries data-component=\"data-table-expanded-row\" and data-expanded-row-of=\"<parentId>\"; skip it when enumerating rows (isExpandedRowDetailId). Selection is performed via the curated handle, not by DOM mutation.',\n },\n },\n};\n","import type { TFunction } from 'i18next';\nimport type { GetLocaleTextParams } from 'ag-grid-community';\nimport { formatLocale } from '../_shared/intl-locale';\n\n/** AG Grid Community native UI, audited against 35.2.1. Consumer keys win. */\nexport function createAgGridLocaleText(\n t: TFunction<'ui'>,\n language: string,\n overrides?: Record<string, string>,\n): (params: GetLocaleTextParams) => string {\n const formatLanguage = formatLocale(language);\n const month = new Intl.DateTimeFormat(formatLanguage, {\n calendar: 'gregory',\n month: 'long',\n timeZone: 'UTC',\n });\n const parts = new Intl.NumberFormat(formatLanguage).formatToParts(1000.1);\n const text: Record<string, (values: readonly string[]) => string> = {\n ariaIndeterminate: () => t('dataTable.agGrid.ariaIndeterminate'),\n ariaChecked: () => t('dataTable.agGrid.ariaChecked'),\n ariaUnchecked: () => t('dataTable.agGrid.ariaUnchecked'),\n applyFilter: () => t('dataTable.agGrid.applyFilter'),\n clearFilter: () => t('dataTable.agGrid.clearFilter'),\n resetFilter: () => t('dataTable.agGrid.resetFilter'),\n cancelFilter: () => t('dataTable.agGrid.cancelFilter'),\n textFilter: () => t('dataTable.agGrid.textFilter'),\n numberFilter: () => t('dataTable.agGrid.numberFilter'),\n bigintFilter: () => t('dataTable.agGrid.bigintFilter'),\n dateFilter: () => t('dataTable.agGrid.dateFilter'),\n setFilter: () => t('dataTable.agGrid.setFilter'),\n filterOoo: () => t('dataTable.agGrid.filterOoo'),\n empty: () => t('dataTable.agGrid.empty'),\n equals: () => t('dataTable.agGrid.equals'),\n notEqual: () => t('dataTable.agGrid.notEqual'),\n lessThan: () => t('dataTable.agGrid.lessThan'),\n greaterThan: () => t('dataTable.agGrid.greaterThan'),\n inRange: () => t('dataTable.agGrid.inRange'),\n inRangeStart: () => t('dataTable.agGrid.inRangeStart'),\n inRangeEnd: () => t('dataTable.agGrid.inRangeEnd'),\n lessThanOrEqual: () => t('dataTable.agGrid.lessThanOrEqual'),\n greaterThanOrEqual: () => t('dataTable.agGrid.greaterThanOrEqual'),\n contains: () => t('dataTable.agGrid.contains'),\n notContains: () => t('dataTable.agGrid.notContains'),\n startsWith: () => t('dataTable.agGrid.startsWith'),\n endsWith: () => t('dataTable.agGrid.endsWith'),\n blank: () => t('dataTable.agGrid.blank'),\n notBlank: () => t('dataTable.agGrid.notBlank'),\n before: () => t('dataTable.agGrid.before'),\n after: () => t('dataTable.agGrid.after'),\n andCondition: () => t('dataTable.agGrid.andCondition'),\n orCondition: () => t('dataTable.agGrid.orCondition'),\n dateFormatOoo: () => 'yyyy-mm-dd',\n filterSummaryInactive: () => t('dataTable.agGrid.filterSummaryInactive'),\n filterSummaryContains: () => t('dataTable.agGrid.filterSummaryContains'),\n filterSummaryNotContains: () =>\n t('dataTable.agGrid.filterSummaryNotContains'),\n filterSummaryTextEquals: () =>\n t('dataTable.agGrid.filterSummaryTextEquals'),\n filterSummaryTextNotEqual: () =>\n t('dataTable.agGrid.filterSummaryTextNotEqual'),\n filterSummaryStartsWith: () =>\n t('dataTable.agGrid.filterSummaryStartsWith'),\n filterSummaryEndsWith: () => t('dataTable.agGrid.filterSummaryEndsWith'),\n filterSummaryBlank: () => t('dataTable.agGrid.filterSummaryBlank'),\n filterSummaryNotBlank: () => t('dataTable.agGrid.filterSummaryNotBlank'),\n filterSummaryEquals: () => '=',\n filterSummaryNotEqual: () => '!=',\n filterSummaryGreaterThan: () => '>',\n filterSummaryGreaterThanOrEqual: () => '>=',\n filterSummaryLessThan: () => '<',\n filterSummaryLessThanOrEqual: () => '<=',\n filterSummaryInRange: () => t('dataTable.agGrid.filterSummaryInRange'),\n yesterday: () => t('dataTable.agGrid.yesterday'),\n today: () => t('dataTable.agGrid.today'),\n tomorrow: () => t('dataTable.agGrid.tomorrow'),\n last7Days: () => t('dataTable.agGrid.last7Days'),\n lastWeek: () => t('dataTable.agGrid.lastWeek'),\n thisWeek: () => t('dataTable.agGrid.thisWeek'),\n nextWeek: () => t('dataTable.agGrid.nextWeek'),\n last30Days: () => t('dataTable.agGrid.last30Days'),\n lastMonth: () => t('dataTable.agGrid.lastMonth'),\n thisMonth: () => t('dataTable.agGrid.thisMonth'),\n nextMonth: () => t('dataTable.agGrid.nextMonth'),\n last90Days: () => t('dataTable.agGrid.last90Days'),\n lastQuarter: () => t('dataTable.agGrid.lastQuarter'),\n thisQuarter: () => t('dataTable.agGrid.thisQuarter'),\n nextQuarter: () => t('dataTable.agGrid.nextQuarter'),\n lastYear: () => t('dataTable.agGrid.lastYear'),\n thisYear: () => t('dataTable.agGrid.thisYear'),\n yearToDate: () => t('dataTable.agGrid.yearToDate'),\n nextYear: () => t('dataTable.agGrid.nextYear'),\n last6Months: () => t('dataTable.agGrid.last6Months'),\n last12Months: () => t('dataTable.agGrid.last12Months'),\n last24Months: () => t('dataTable.agGrid.last24Months'),\n filterSummaryInRangeValues: (values) => `(${values[0]}, ${values[1]})`,\n filterSummaryTextQuote: (values) => `\"${values[0]}\"`,\n minDateValidation: (values) =>\n t('dataTable.agGrid.minDateValidation', { var0: values[0] }),\n maxDateValidation: (values) =>\n t('dataTable.agGrid.maxDateValidation', { var0: values[0] }),\n strictMinValueValidation: (values) =>\n t('dataTable.agGrid.strictMinValueValidation', { var0: values[0] }),\n strictMaxValueValidation: (values) =>\n t('dataTable.agGrid.strictMaxValueValidation', { var0: values[0] }),\n ariaSortableColumn: () => t('dataTable.agGrid.ariaSortableColumn'),\n ariaMenuColumn: () => t('dataTable.agGrid.ariaMenuColumn'),\n ariaFilterColumn: () => t('dataTable.agGrid.ariaFilterColumn'),\n ariaColumnFiltered: () => t('dataTable.agGrid.ariaColumnFiltered'),\n ariaColumnCellSelection: () =>\n t('dataTable.agGrid.ariaColumnCellSelection'),\n rowDragRows: () => t('dataTable.agGrid.rowDragRows'),\n rowDragRow: () => t('dataTable.agGrid.rowDragRow'),\n ariaColumnGroupCellSelection: () =>\n t('dataTable.agGrid.ariaColumnGroupCellSelection'),\n ariaToggleCellValue: () => t('dataTable.agGrid.ariaToggleCellValue'),\n loadingError: () => t('dataTable.agGrid.loadingError'),\n ariaSkeletonCellLoadingFailed: () =>\n t('dataTable.agGrid.ariaSkeletonCellLoadingFailed'),\n ariaDeferSkeletonCellLoading: () =>\n t('dataTable.agGrid.ariaDeferSkeletonCellLoading'),\n ariaSkeletonCellLoading: () =>\n t('dataTable.agGrid.ariaSkeletonCellLoading'),\n invalidDate: () => t('dataTable.agGrid.invalidDate'),\n invalidNumber: () => t('dataTable.agGrid.invalidNumber'),\n invalidBigInt: () => t('dataTable.agGrid.invalidBigInt'),\n ariaValidationErrorPrefix: () =>\n t('dataTable.agGrid.ariaValidationErrorPrefix'),\n exportingOoo: () => t('dataTable.agGrid.exportingOoo'),\n loadingOoo: () => t('dataTable.agGrid.loadingOoo'),\n noMatchingRows: () => t('dataTable.agGrid.noMatchingRows'),\n noRowsToShow: () => t('dataTable.agGrid.noRowsToShow'),\n ariaLabelTooltip: () => t('dataTable.agGrid.ariaLabelTooltip'),\n tooltipValidationErrorSeparator: () => '. ',\n ariaInputEditor: () => t('dataTable.agGrid.ariaInputEditor'),\n maxLengthValidation: (values) =>\n t('dataTable.agGrid.maxLengthValidation', { var0: values[0] }),\n minValueValidation: (values) =>\n t('dataTable.agGrid.minValueValidation', { var0: values[0] }),\n maxValueValidation: (values) =>\n t('dataTable.agGrid.maxValueValidation', { var0: values[0] }),\n invalidSelectionValidation: () =>\n t('dataTable.agGrid.invalidSelectionValidation'),\n ariaPendingChange: () => t('dataTable.agGrid.ariaPendingChange'),\n ariaFilterMenuOpen: () => t('dataTable.agGrid.ariaFilterMenuOpen'),\n january: () => month.format(new Date(Date.UTC(2026, 0, 1))),\n february: () => month.format(new Date(Date.UTC(2026, 1, 1))),\n march: () => month.format(new Date(Date.UTC(2026, 2, 1))),\n april: () => month.format(new Date(Date.UTC(2026, 3, 1))),\n may: () => month.format(new Date(Date.UTC(2026, 4, 1))),\n june: () => month.format(new Date(Date.UTC(2026, 5, 1))),\n july: () => month.format(new Date(Date.UTC(2026, 6, 1))),\n august: () => month.format(new Date(Date.UTC(2026, 7, 1))),\n september: () => month.format(new Date(Date.UTC(2026, 8, 1))),\n october: () => month.format(new Date(Date.UTC(2026, 9, 1))),\n november: () => month.format(new Date(Date.UTC(2026, 10, 1))),\n december: () => month.format(new Date(Date.UTC(2026, 11, 1))),\n ariaLabelColumnMenu: () => t('dataTable.agGrid.ariaLabelColumnMenu'),\n ariaLabelColumnFilter: () => t('dataTable.agGrid.ariaLabelColumnFilter'),\n ariaFilterInput: () => t('dataTable.agGrid.ariaFilterInput'),\n ariaFilterFromValue: () => t('dataTable.agGrid.ariaFilterFromValue'),\n ariaFilterValue: () => t('dataTable.agGrid.ariaFilterValue'),\n ariaFilterToValue: () => t('dataTable.agGrid.ariaFilterToValue'),\n ariaFilteringOperator: () => t('dataTable.agGrid.ariaFilteringOperator'),\n ariaDateFilterInput: () => t('dataTable.agGrid.ariaDateFilterInput'),\n thousandSeparator: () =>\n parts.find((part) => part.type === 'group')?.value ?? '',\n decimalSeparator: () =>\n parts.find((part) => part.type === 'decimal')?.value ?? '',\n pageSizeSelectorLabel: () => t('dataTable.agGrid.pageSizeSelectorLabel'),\n ariaPageSizeSelectorLabel: () =>\n t('dataTable.agGrid.ariaPageSizeSelectorLabel'),\n to: () => t('dataTable.to'),\n of: () => t('dataTable.of'),\n firstPage: () => t('dataTable.firstPage'),\n previousPage: () => t('dataTable.previousPage'),\n page: () => t('dataTable.page'),\n nextPage: () => t('dataTable.nextPage'),\n lastPage: () => t('dataTable.lastPage'),\n pageLastRowUnknown: () => '?',\n more: () => t('dataTable.agGrid.more'),\n ariaRowSelectAll: () => t('dataTable.agGrid.ariaRowSelectAll'),\n ariaHeaderSelection: () => t('dataTable.agGrid.ariaHeaderSelection'),\n ariaLabelSelectField: () => t('dataTable.agGrid.ariaLabelSelectField'),\n ariaRowToggleSelection: () => t('dataTable.agGrid.ariaRowToggleSelection'),\n ariaRowSelectionDisabled: () =>\n t('dataTable.agGrid.ariaRowSelectionDisabled'),\n ariaRowDeselect: () => t('dataTable.agGrid.ariaRowDeselect'),\n ariaRowSelect: () => t('dataTable.agGrid.ariaRowSelect'),\n };\n return ({ key, defaultValue, variableValues = [] }) => {\n if (overrides && Object.hasOwn(overrides, key)) {\n let index = 0;\n return overrides[key].replace(\n /\\$\\{variable\\}/g,\n (token) => variableValues[index++] ?? token,\n );\n }\n // Unknown keys belong to a consumer extension or a different vendor version.\n return Object.hasOwn(text, key) ? text[key](variableValues) : defaultValue;\n };\n}\n","import 'ag-grid-community/styles/ag-grid.css';\n// Font-only — `@font-face { agGridQuartz }` for the icon glyphs. We\n// deliberately do NOT import `ag-theme-quartz.css`: that file scopes ~90\n// CSS variables to `.ag-theme-quartz` and hardcodes colors / IBM Plex Sans\n// / 8px grid, which fight the design-system tokens. `ag-grid-theme.css`\n// below is a standalone bridge that defines every var AG Grid references,\n// mapped to DS tokens.\nimport 'ag-grid-community/styles/agGridQuartzFont.css';\nimport '../../tokens/ag-grid-theme.css';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { Skeleton } from '../skeleton';\nimport { EmptyState } from '../empty-state';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AgGridReact } from 'ag-grid-react';\nimport {\n AllCommunityModule,\n ModuleRegistry,\n type ColDef,\n type ColGroupDef,\n type ColumnMovedEvent,\n type ColumnPinnedEvent,\n type ColumnResizedEvent,\n type ColumnState,\n type ColumnVisibleEvent,\n type CsvExportParams,\n type ExcelExportParams,\n type FilterChangedEvent,\n type GetRowIdParams,\n type GridApi,\n type GridOptions,\n type GridState,\n type IRowNode,\n type IsFullWidthRowParams,\n type NewColumnsLoadedEvent,\n type PostSortRowsParams,\n type RowClassParams,\n type RowHeightParams,\n type ShouldRowBeSkippedParams,\n type SortChangedEvent,\n} from 'ag-grid-community';\nimport { IconButtonGroup } from '../icon-button-group';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { createHeaderMeasure, withHeaderMinWidths } from './header-min-width';\nimport { Toolbar, ToolbarProvider } from './toolbar';\nimport { TextFilter, TextFloatingFilter } from './filters/text-filter';\nimport { usePresentationalAriaFix } from './hooks/use-presentational-aria-fix';\nimport {\n EXPANDED_ROW_CLASS,\n EXPANDED_ROW_MARKER,\n ExpandedRowContext,\n ExpandedRowRenderer,\n expandedRowDetailId,\n isExpandedRowDetail,\n seedExpandedRowDetail,\n type ExpandedRowContextValue,\n} from './expanded-row-renderer';\nimport { useAgentRegistration } from '../../agent';\nimport { usePrefersReducedMotion, useTheme } from '../../hooks';\nimport { dataTableAgent } from './data-table.agent';\nimport { createAgGridLocaleText } from './ag-grid-locale';\n\n// AG Grid v33+ requires module registration before any grid renders.\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst dataTableVariants = cva('ag-theme-alfadocs ds:w-full', {\n variants: {\n density: {\n default: '',\n compact: 'data-table-compact',\n expanded: 'data-table-expanded',\n },\n bordered: {\n true: '',\n false: 'ds:[--ag-borders:none]',\n },\n },\n defaultVariants: {\n density: 'default',\n bordered: true,\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* Curated imperative handle — agent-readiness contract */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableSortEntry {\n colId: string;\n sort: 'asc' | 'desc';\n}\n\n/**\n * Curated handle exposed via `forwardRef`. Replaces the legacy raw `GridApi`\n * forwarding — see `src/docs/26-agent-readiness.mdx` §15. Consumers needing\n * the unwrapped ag-grid API call `getRawApi()`.\n */\nexport interface DataTableHandle<TData = unknown> {\n getSelection: () => string[];\n setSelection: (ids: string[]) => void;\n selectRange: (fromId: string, toId: string) => void;\n clearSelection: () => void;\n getFilter: () => Record<string, unknown>;\n setFilter: (model: Record<string, unknown>) => void;\n /**\n * Columns whose visibility the user set by hand (ColumnToggle, column menu,\n * drag). Persisted with the column state under `gridId`; a responsive\n * baseline must leave them alone.\n */\n getUserTouchedColumns: () => string[];\n /**\n * Record columns as user-set — for programmatic writes that stand in for the\n * user (a saved view), so they persist and stop being auto-managed.\n */\n markColumnsUserTouched: (colIds: readonly string[]) => void;\n getSort: () => DataTableSortEntry[];\n setSort: (model: DataTableSortEntry[]) => void;\n getCurrentPage: () => number;\n goToPage: (page: number) => void;\n /** Id of the row whose detail is open (`expandedRowId`), or `null`. */\n getExpandedRowId: () => string | null;\n getRawApi: () => GridApi<TData> | undefined;\n}\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableProps<TData = unknown> extends Omit<\n VariantProps<typeof dataTableVariants>,\n 'density'\n> {\n /**\n * Column definitions — accepts a mix of leaf `ColDef`s and header\n * `ColGroupDef`s (for two-row grouped headers via `children: [...]`).\n */\n columnDefs: (ColDef<TData> | ColGroupDef<TData>)[];\n rowData?: TData[];\n rowSelection?: 'single' | 'multiple';\n pagination?: boolean;\n paginationPageSize?: number;\n /**\n * Page-size dropdown options shown in the AG Grid pagination panel.\n * Pass `false` to hide the dropdown entirely. Default: `[10, 25, 50, 100]`.\n */\n paginationPageSizeSelector?: number[] | false;\n gridId?: string;\n onSelectionChanged?: (rows: TData[]) => void;\n onSortChanged?: (event: SortChangedEvent<TData>) => void;\n onFilterChanged?: (event: FilterChangedEvent<TData>) => void;\n noRowsOverlay?: ComponentType;\n loadingOverlay?: ComponentType;\n gridOptions?: GridOptions<TData>;\n /** Grid height as a Tailwind height class, e.g. `\"h-[500px]\"` or `\"h-[var(--data-table-height)]\"` */\n heightClass?: string;\n className?: string;\n\n /** Row height preset. `expanded` adds headroom for complex cells (balances, tag lists). */\n density?: 'compact' | 'default' | 'expanded';\n\n /** Map row → class name. Use together with `data-table-row-success/warning/error` for tinted rows. */\n getRowClass?: (params: RowClassParams<TData>) => string | undefined;\n /** Rows pinned at the bottom of the grid. Use `useTotalRow()` to compute a totals row. */\n pinnedBottomRowData?: TData[];\n /**\n * Leave the pinned rows out while there are no rows, so an empty table\n * shows its message and no \"Total 0\" line. Default false: the pinned rows\n * stay, and the message sits in the body above them.\n */\n hidePinnedWhenEmpty?: boolean;\n\n /** Print-optimised mode — hides toolbar, disables pagination, renders every row. */\n printMode?: boolean;\n\n /**\n * Controlled: the id (per `gridOptions.getRowId`) of the ONE row whose\n * detail is open. Requires `gridOptions.getRowId`. Not supported together\n * with `rowSelection=\"multiple\"` in v1.\n */\n expandedRowId?: string | null;\n /**\n * Rendered as a full-width row directly beneath the expanded row. Must\n * derive everything from the row — the grid may unmount it when scrolled\n * out of view, so the content has to be stateless.\n */\n renderExpandedRow?: (row: TData) => ReactNode;\n /**\n * The detail asked to close (Escape inside it, or the consumer's own close\n * control). The consumer owns the state and the focus return.\n */\n onExpandedRowChange?: (id: string | null) => void;\n\n /** Composable toolbar — renders `<DataTable.Toolbar>…</DataTable.Toolbar>` above the grid. */\n children?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Loading overlay */\n/* ------------------------------------------------------------------ */\n\nfunction DefaultLoadingOverlay() {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-md)]\"\n >\n {Array.from({ length: 5 }).map((_, i) => (\n <Skeleton\n key={i}\n variant=\"rectangular\"\n className=\"ds:h-[var(--min-target-size)] ds:w-full\"\n />\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* No-rows overlay — wired to the DS EmptyState component */\n/* ------------------------------------------------------------------ */\n\nfunction DefaultNoRowsOverlay() {\n const { t } = useTranslation('ui');\n return (\n <EmptyState\n variant=\"no-results\"\n size=\"sm\"\n title={t('dataTable.noRows')}\n description={t('dataTable.noRowsDescription')}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Column persistence helpers */\n/* ------------------------------------------------------------------ */\n\n/* Persisted envelope. v2 keeps visibility and pinning alongside order / width;\n * the pre-1.10 bare array carried order / width only and still loads that way.\n * Pins are physical (`left` / `right`), so a snapshot taken under one text\n * direction must not pin columns to the wrong edge under the other: the\n * envelope records the direction and pins are dropped on a mismatch. */\ntype TextDirection = 'ltr' | 'rtl';\n\ninterface PersistedColumnState {\n v: 2;\n dir: TextDirection;\n state: ColumnState[];\n /** Columns whose visibility the user set by hand — theirs from now on. */\n touched?: string[];\n}\n\ninterface LoadedColumnState {\n state: ColumnState[];\n touched: string[];\n}\n\n/** The column properties a user gesture can own, per column. */\ntype UserColumnState = Partial<\n Pick<ColumnState, 'hide' | 'pinned' | 'width' | 'flex'>\n>;\ntype UserColumnProperty = keyof UserColumnState;\n\nfunction stripPins(state: ColumnState[]): ColumnState[] {\n return state.map(({ pinned: _pinned, ...rest }) => rest);\n}\n\nfunction stripVisibilityAndPins(state: ColumnState[]): ColumnState[] {\n return state.map(({ hide: _hide, pinned: _pinned, ...rest }) => rest);\n}\n\nfunction loadColumnState(\n gridId: string,\n dir: TextDirection,\n): LoadedColumnState | null {\n try {\n const raw = localStorage.getItem(`data-table-col-state:${gridId}`);\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n return {\n state: stripVisibilityAndPins(parsed as ColumnState[]),\n touched: [],\n };\n }\n if (typeof parsed !== 'object' || parsed === null) return null;\n const envelope = parsed as Partial<PersistedColumnState>;\n if (envelope.v !== 2 || !Array.isArray(envelope.state)) return null;\n return {\n state: envelope.dir === dir ? envelope.state : stripPins(envelope.state),\n touched: Array.isArray(envelope.touched)\n ? envelope.touched.filter((id): id is string => typeof id === 'string')\n : [],\n };\n } catch {\n return null;\n }\n}\n\nfunction saveColumnState(\n gridId: string,\n api: GridApi,\n dir: TextDirection,\n touched: ReadonlySet<string>,\n) {\n try {\n const envelope: PersistedColumnState = {\n v: 2,\n dir,\n state: api.getColumnState(),\n touched: [...touched],\n };\n localStorage.setItem(\n `data-table-col-state:${gridId}`,\n JSON.stringify(envelope),\n );\n } catch {\n // localStorage may be unavailable in some environments\n }\n}\n\n/* Column events fired by layout/code rather than a user gesture — flex\n * re-layout, autosize, API calls (incl. the responsive hook). These must not\n * write to the persisted state or every mount would snapshot itself. */\nconst PROGRAMMATIC_COLUMN_SOURCES = new Set<string>([\n 'api',\n 'flex',\n 'gridInitializing',\n 'gridOptionsChanged',\n 'autosizeColumns',\n 'sizeColumnsToFit',\n]);\n\n/* ------------------------------------------------------------------ */\n/* DataTable */\n/* ------------------------------------------------------------------ */\n\nfunction DataTableInner<TData = unknown>(\n props: DataTableProps<TData>,\n ref: React.ForwardedRef<DataTableHandle<TData>>,\n) {\n const {\n columnDefs,\n rowData,\n rowSelection,\n pagination = false,\n paginationPageSize = 25,\n paginationPageSizeSelector = [10, 25, 50, 100],\n gridId,\n onSelectionChanged,\n onSortChanged,\n onFilterChanged,\n noRowsOverlay,\n loadingOverlay,\n gridOptions,\n density,\n bordered,\n heightClass = 'ds:h-[500px]',\n className,\n getRowClass,\n pinnedBottomRowData,\n hidePinnedWhenEmpty = false,\n printMode = false,\n expandedRowId,\n renderExpandedRow,\n onExpandedRowChange,\n children,\n } = props;\n\n const expansionEnabled =\n expandedRowId !== undefined || renderExpandedRow !== undefined;\n const consumerGetRowId = gridOptions?.getRowId;\n if (expansionEnabled && !consumerGetRowId) {\n throw new Error(\n 'DataTable: `expandedRowId` / `renderExpandedRow` require `gridOptions.getRowId` — the expanded row is addressed by row id, not by index.',\n );\n }\n\n const { t, i18n } = useTranslation('ui');\n const agGridRef = useRef<AgGridReact<TData>>(null);\n const gridRootRef = useRef<HTMLDivElement>(null);\n // Pinned columns otherwise fail axe `aria-required-children`.\n usePresentationalAriaFix(gridRootRef);\n const [selectionCount, setSelectionCount] = useState(0);\n const [sortAnnouncement, setSortAnnouncement] = useState('');\n // AG Grid initialises locale and RTL options once. Recreate it on a language\n // change, carrying its current state rather than resetting filters/selection.\n const languageStateRef = useRef<GridState | undefined>(undefined);\n const getLocaleText = useMemo(\n () => createAgGridLocaleText(t, i18n.language, gridOptions?.localeText),\n [t, i18n.language, gridOptions?.localeText],\n );\n const [gridLanguage, setGridLanguage] = useState(i18n.language);\n useEffect(() => {\n if (gridLanguage === i18n.language) return;\n // AG Grid attaches newly mounted editors in a queued task. Let that task\n // finish before destroying the grid, then commit the edit and snapshot.\n const timer = window.setTimeout(() => {\n const api = agGridRef.current?.api;\n api?.stopEditing();\n const state = api?.getState();\n if (state) {\n // Restoring a focused cell forces browser focus, so keep it only\n // while focus is in this grid. Pins are physical: drop them when the\n // direction flips, as the saved column layout does.\n const { focusedCell, columnPinning, ...rest } = state;\n const focused =\n gridRootRef.current?.contains(document.activeElement) ?? false;\n const sameDirection =\n i18n.dir(gridLanguage) === i18n.dir(i18n.language);\n languageStateRef.current = {\n ...rest,\n ...(focused ? { focusedCell } : {}),\n ...(sameDirection ? { columnPinning } : {}),\n };\n } else languageStateRef.current = undefined;\n setGridLanguage(i18n.language);\n }, 0);\n return () => window.clearTimeout(timer);\n }, [gridLanguage, i18n, i18n.language]);\n const expandedRowIdRef = useRef<string | null | undefined>(expandedRowId);\n expandedRowIdRef.current = expandedRowId;\n\n // Curated imperative handle — see DataTableHandle above.\n const handle = useMemo<DataTableHandle<TData>>(\n () => ({\n getSelection: () => {\n const api = agGridRef.current?.api;\n if (!api) return [];\n const ids: string[] = [];\n for (const node of api.getSelectedNodes()) {\n if (node.id != null && !isExpandedRowDetail(node.data)) {\n ids.push(node.id);\n }\n }\n return ids;\n },\n setSelection: (ids) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const want = new Set(ids);\n api.forEachNode((node) => {\n if (node.id != null) node.setSelected(want.has(node.id));\n });\n },\n selectRange: (fromId, toId) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const ordered: string[] = [];\n api.forEachNodeAfterFilterAndSort((node) => {\n if (node.id != null && !isExpandedRowDetail(node.data)) {\n ordered.push(node.id);\n }\n });\n const a = ordered.indexOf(fromId);\n const b = ordered.indexOf(toId);\n if (a < 0 || b < 0) return;\n const [lo, hi] = a <= b ? [a, b] : [b, a];\n const want = new Set(ordered.slice(lo, hi + 1));\n api.forEachNode((node) => {\n if (node.id != null) node.setSelected(want.has(node.id));\n });\n },\n clearSelection: () => {\n agGridRef.current?.api?.deselectAll();\n },\n getFilter: () => agGridRef.current?.api?.getFilterModel() ?? {},\n setFilter: (model) => {\n agGridRef.current?.api?.setFilterModel(model);\n },\n getSort: () => {\n const api = agGridRef.current?.api;\n if (!api) return [];\n return api\n .getColumnState()\n .filter((c) => c.sort === 'asc' || c.sort === 'desc')\n .map((c) => ({ colId: c.colId, sort: c.sort as 'asc' | 'desc' }));\n },\n setSort: (model) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const next = api.getColumnState().map((c) => {\n const target = model.find((m) => m.colId === c.colId);\n return { ...c, sort: target ? target.sort : null };\n });\n api.applyColumnState({ state: next, defaultState: { sort: null } });\n },\n getCurrentPage: () =>\n agGridRef.current?.api?.paginationGetCurrentPage() ?? 0,\n goToPage: (page) => {\n agGridRef.current?.api?.paginationGoToPage(page);\n },\n getExpandedRowId: () => expandedRowIdRef.current ?? null,\n getUserTouchedColumns: () => [...userTouchedRef.current],\n markColumnsUserTouched: (colIds) => markUserTouchedRef.current(colIds),\n getRawApi: () => agGridRef.current?.api,\n }),\n [],\n );\n /* What the user set by hand, per column and per property. A `columnDefs`\n * update makes AG Grid re-apply every def's own `hide` / `pinned` / `width`,\n * which silently undid a toggle or a resize whenever a consumer re-derived\n * its defs (custom columns arriving after the first fetch, a memo with a\n * fresh dependency). Only these properties are put back after an update —\n * everything else follows the new defs, as a consumer expects. */\n const userColumnStateRef = useRef<Map<string, UserColumnState>>(new Map());\n /* Columns the user has shown or hidden by hand; persisted with the state. */\n const userTouchedRef = useRef<Set<string>>(new Set());\n const markUserTouchedRef = useRef<(colIds: readonly string[]) => void>(\n () => {},\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n // Agent adapter is keyed on the row-agnostic DataTableHandle; cast here\n // because TData isn't observable from the agent surface.\n useAgentRegistration(dataTableAgent, handle as DataTableHandle, gridId);\n\n const isRtl = i18n.dir() === 'rtl';\n const isLoading = rowData === undefined;\n\n // Reactive — re-renders when the OS preference or theme toggles mid-session.\n const prefersReducedMotion = usePrefersReducedMotion();\n const { resolvedTheme } = useTheme();\n // Suppress compact density in accessible theme — 32px rows violate min-target-size.\n const isAccessible =\n resolvedTheme === 'light-accessible' || resolvedTheme === 'dark-accessible';\n const effectiveDensity =\n isAccessible && density === 'compact' ? 'default' : density;\n\n // Map logical 'single' | 'multiple' → AG Grid v35 object form\n const rowSelectionOption = useMemo(() => {\n if (!rowSelection) return undefined;\n // The synthetic detail row is never a selectable record.\n const isRowSelectable = (node: IRowNode<TData>) =>\n !isExpandedRowDetail(node.data);\n // §13g — require explicit checkbox / modifier-key selection rather than\n // click-anywhere, so selection never fights the row's primary action. This\n // is the v32.2+ replacement for the deprecated `suppressRowClickSelection`.\n if (rowSelection === 'single') {\n return {\n mode: 'singleRow' as const,\n enableClickSelection: false,\n isRowSelectable,\n };\n }\n return {\n mode: 'multiRow' as const,\n headerCheckbox: true,\n checkboxes: true,\n enableClickSelection: false,\n isRowSelectable,\n };\n }, [rowSelection]);\n\n const direction: TextDirection = isRtl ? 'rtl' : 'ltr';\n\n /** Note the current value of `props` on `colIds` as the user's. */\n const recordUserColumns = useCallback(\n (\n api: GridApi,\n colIds: readonly string[],\n props: readonly UserColumnProperty[],\n ) => {\n const wanted = new Set(colIds);\n for (const state of api.getColumnState()) {\n if (!wanted.has(state.colId)) continue;\n const own = userColumnStateRef.current.get(state.colId) ?? {};\n for (const prop of props) own[prop] = state[prop] as never;\n userColumnStateRef.current.set(state.colId, own);\n }\n },\n [],\n );\n\n const persist = useCallback(\n (api: GridApi) => {\n if (gridId) {\n saveColumnState(gridId, api, direction, userTouchedRef.current);\n }\n },\n [gridId, direction],\n );\n\n const markColumnsUserTouched = useCallback(\n (colIds: readonly string[]) => {\n for (const colId of colIds) userTouchedRef.current.add(colId);\n const api = agGridRef.current?.api;\n if (!api) return;\n recordUserColumns(api, colIds, ['hide']);\n persist(api);\n },\n [persist, recordUserColumns],\n );\n markUserTouchedRef.current = markColumnsUserTouched;\n\n // Column persistence — restore on mount\n const handleGridReady = useCallback(() => {\n if (!agGridRef.current?.api) return;\n const api = agGridRef.current.api;\n const saved = gridId ? loadColumnState(gridId, direction) : null;\n if (!saved || languageStateRef.current) return;\n for (const colId of saved.touched) userTouchedRef.current.add(colId);\n api.applyColumnState({\n state: saved.state,\n applyOrder: true,\n });\n recordUserColumns(api, saved.touched, ['hide']);\n }, [gridId, direction, recordUserColumns]);\n\n // Fires once the grid has taken a new `columnDefs` prop on board — the one\n // moment the defs' own values have just been re-applied over the user's.\n const handleNewColumnsLoaded = useCallback(\n (event: NewColumnsLoadedEvent<TData>) => {\n if (event.source !== 'gridOptionsChanged') return;\n const api = agGridRef.current?.api;\n if (!api || userColumnStateRef.current.size === 0) return;\n api.applyColumnState({\n state: [...userColumnStateRef.current].map(([colId, own]) => ({\n colId,\n ...own,\n })),\n });\n },\n [],\n );\n\n const handleColumnStateChange = useCallback(\n (\n event:\n | ColumnMovedEvent<TData>\n | ColumnResizedEvent<TData>\n | ColumnPinnedEvent<TData>\n | ColumnVisibleEvent<TData>,\n ) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const affected = (\n event.columns ?? (event.column ? [event.column] : [])\n ).map((column) => column.getColId());\n if (event.source && PROGRAMMATIC_COLUMN_SOURCES.has(event.source)) {\n // An API write to a column the user already owns — a saved view\n // applied after `markColumnsUserTouched`, the persisted restore — is\n // on the user's behalf: keep the record current so a later defs update\n // puts back what was actually written, not an older snapshot. A defs\n // update itself (`gridOptionsChanged`) is exactly what the record must\n // survive, so it never writes the record.\n if (event.source === 'api' && 'visible' in event) {\n const owned = affected.filter((colId) =>\n userTouchedRef.current.has(colId),\n );\n if (owned.length > 0) {\n recordUserColumns(api, owned, ['hide']);\n persist(api);\n }\n }\n return;\n }\n // The kit ColumnToggle reports through the toolbar context instead —\n // the public visibility API cannot name a source — so a visibility event\n // that reaches here came from the grid's own UI (column menu, header\n // drag) and is the user's too.\n if ('visible' in event) {\n for (const colId of affected) userTouchedRef.current.add(colId);\n recordUserColumns(api, affected, ['hide']);\n } else if ('pinned' in event) {\n recordUserColumns(api, affected, ['pinned']);\n } else if ('flexColumns' in event) {\n recordUserColumns(api, affected, ['width', 'flex']);\n }\n persist(api);\n },\n [persist, recordUserColumns],\n );\n\n // `defaultColDef` is pre-merged into the explicit prop below (kit defaults +\n // the consumer's overrides). Strip it from the forwarded gridOptions so the\n // catch-all spread can't re-clobber that merge with the raw value — which\n // would silently drop `floatingFilter` / `filter` / `sortable` for every\n // column the moment a consumer sets a single `defaultColDef` key.\n // The expandable-row callbacks below compose the consumer's own value, so\n // they are stripped here too — otherwise the spread would undo the wrap.\n const forwardedGridOptions = useMemo(() => {\n if (!gridOptions) return undefined;\n const next = { ...(gridOptions as GridOptions<TData>) };\n delete next.defaultColDef;\n delete next.initialState;\n if (expansionEnabled) {\n delete next.getRowId;\n delete next.isFullWidthRow;\n delete next.fullWidthCellRenderer;\n delete next.getRowHeight;\n delete next.postSortRows;\n delete next.getRowClass;\n delete next.defaultCsvExportParams;\n delete next.defaultExcelExportParams;\n }\n return next;\n }, [expansionEnabled, gridOptions]);\n\n /* ---------------------------------------------------------------- */\n /* Expandable row — see expanded-row-renderer.tsx for the mechanism */\n /* ---------------------------------------------------------------- */\n\n // Measured detail heights survive the renderer unmounting (virtualisation)\n // so `getRowHeight` can serve the last-known height on remount.\n const detailHeightsRef = useRef(new Map<string, number>());\n const consumerCallbacksRef = useRef(gridOptions);\n consumerCallbacksRef.current = gridOptions;\n\n const resolveRowId = useCallback(\n (row: TData) =>\n consumerGetRowId?.({\n data: row,\n level: 0,\n api: agGridRef.current?.api,\n context: gridOptions?.context,\n } as GetRowIdParams<TData>),\n [consumerGetRowId, gridOptions?.context],\n );\n\n const expandedRow = useMemo(() => {\n if (!expansionEnabled || expandedRowId == null || !rowData) return null;\n const row = rowData.find((r) => resolveRowId(r) === expandedRowId);\n return row === undefined ? null : { id: expandedRowId, row };\n }, [expansionEnabled, expandedRowId, resolveRowId, rowData]);\n\n const effectiveRowData = useMemo(() => {\n if (!expandedRow || !rowData) return rowData;\n const index = rowData.indexOf(expandedRow.row);\n const detail = seedExpandedRowDetail(expandedRow.row, expandedRow.id);\n return [\n ...rowData.slice(0, index + 1),\n detail as TData,\n ...rowData.slice(index + 1),\n ];\n }, [expandedRow, rowData]);\n\n const wrappedGetRowId = useCallback(\n (params: GetRowIdParams<TData>) =>\n isExpandedRowDetail(params.data)\n ? expandedRowDetailId(params.data[EXPANDED_ROW_MARKER])\n : (consumerGetRowId as NonNullable<typeof consumerGetRowId>)(params),\n [consumerGetRowId],\n );\n\n const wrappedIsFullWidthRow = useCallback(\n (params: IsFullWidthRowParams<TData>) =>\n isExpandedRowDetail(params.rowNode.data) ||\n (consumerCallbacksRef.current?.isFullWidthRow?.(params) ?? false),\n [],\n );\n\n const wrappedGetRowHeight = useCallback(\n (params: RowHeightParams<TData>) =>\n isExpandedRowDetail(params.data)\n ? detailHeightsRef.current.get(params.node.id ?? '')\n : consumerCallbacksRef.current?.getRowHeight?.(params),\n [],\n );\n\n // Ties in the sort comparator don't guarantee the seed stays behind its\n // parent, so adjacency is enforced after every sort/filter pass.\n const wrappedPostSortRows = useCallback(\n (params: PostSortRowsParams<TData>) => {\n consumerCallbacksRef.current?.postSortRows?.(params);\n const { nodes } = params;\n const detailIndex = nodes.findIndex((n) => isExpandedRowDetail(n.data));\n if (detailIndex < 0) return;\n const [detail] = nodes.splice(detailIndex, 1);\n const parentId = (detail.data as Record<string, unknown>)[\n EXPANDED_ROW_MARKER\n ];\n const parentIndex = nodes.findIndex((n) => n.id === parentId);\n nodes.splice(parentIndex < 0 ? nodes.length : parentIndex + 1, 0, detail);\n },\n [],\n );\n\n // The detail row keeps its own surface — the consumer's row tints apply\n // to records, not to the accordion beneath one.\n const wrappedGetRowClass = useCallback(\n (params: RowClassParams<TData>) => {\n if (isExpandedRowDetail(params.data)) return EXPANDED_ROW_CLASS;\n return (\n consumerCallbacksRef.current?.getRowClass?.(params) ??\n getRowClass?.(params)\n );\n },\n [getRowClass],\n );\n\n const skipDetailRow = useCallback(\n (params: ShouldRowBeSkippedParams<TData>) =>\n isExpandedRowDetail(params.node.data),\n [],\n );\n const csvExportParams = useMemo<CsvExportParams | undefined>(() => {\n if (!expansionEnabled) return undefined;\n const base = gridOptions?.defaultCsvExportParams;\n return {\n ...base,\n shouldRowBeSkipped: (params) =>\n skipDetailRow(params) || (base?.shouldRowBeSkipped?.(params) ?? false),\n };\n }, [expansionEnabled, gridOptions?.defaultCsvExportParams, skipDetailRow]);\n const excelExportParams = useMemo<ExcelExportParams | undefined>(() => {\n if (!expansionEnabled) return undefined;\n const base = gridOptions?.defaultExcelExportParams;\n return {\n ...base,\n shouldRowBeSkipped: (params) =>\n skipDetailRow(params) || (base?.shouldRowBeSkipped?.(params) ?? false),\n };\n }, [expansionEnabled, gridOptions?.defaultExcelExportParams, skipDetailRow]);\n\n const consumerFullWidthRenderer = gridOptions?.fullWidthCellRenderer as\n | ExpandedRowContextValue<TData>['fallbackRenderer']\n | string\n | undefined;\n const expandedRowContext = useMemo<ExpandedRowContextValue<TData>>(\n () => ({\n renderExpandedRow,\n onExpandedRowChange,\n expanded: expandedRow,\n heights: detailHeightsRef.current,\n fallbackRenderer:\n typeof consumerFullWidthRenderer === 'function'\n ? consumerFullWidthRenderer\n : undefined,\n }),\n [\n consumerFullWidthRenderer,\n expandedRow,\n onExpandedRowChange,\n renderExpandedRow,\n ],\n );\n\n const handleSelectionChanged = useCallback(() => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const rows = api.getSelectedRows().filter((r) => !isExpandedRowDetail(r));\n setSelectionCount(rows.length);\n onSelectionChanged?.(rows);\n }, [onSelectionChanged]);\n\n const handleSortChanged = useCallback(\n (event: SortChangedEvent<TData>) => {\n const api = agGridRef.current?.api;\n if (api) {\n const colState = api.getColumnState();\n const sortedCol = colState.find((c) => c.sort);\n if (sortedCol) {\n const colId = sortedCol.colId;\n // Use the live AG Grid API so grouped headers and runtime column\n // mutations (visibility toggles, dynamic re-order) resolve correctly.\n const colDef = api.getColumnDef(colId);\n const colName = (colDef?.headerName as string) ?? colId;\n const dirKey =\n sortedCol.sort === 'asc'\n ? 'dataTable.sortAscending'\n : 'dataTable.sortDescending';\n setSortAnnouncement(\n t('dataTable.sortAnnounce', {\n column: colName,\n direction: t(dirKey),\n }),\n );\n } else {\n setSortAnnouncement('');\n }\n }\n onSortChanged?.(event);\n },\n [onSortChanged, t],\n );\n\n const handleFilterChanged = useCallback(\n (event: FilterChangedEvent<TData>) => {\n onFilterChanged?.(event);\n },\n [onFilterChanged],\n );\n\n // Clear sort announcement after screen readers have had time to read it\n useEffect(() => {\n if (!sortAnnouncement) return;\n const id = setTimeout(() => setSortAnnouncement(''), 3000);\n return () => clearTimeout(id);\n }, [sortAnnouncement]);\n\n const NoRowsComponent = noRowsOverlay ?? DefaultNoRowsOverlay;\n const LoadingComponent = loadingOverlay ?? DefaultLoadingOverlay;\n\n const getApi = useCallback(\n () => agGridRef.current?.api as GridApi | undefined,\n [],\n );\n\n const handlePrint = useCallback(() => {\n if (typeof window !== 'undefined') {\n window.print();\n }\n }, []);\n\n const wrapperClass = dataTableVariants({\n density: effectiveDensity,\n bordered,\n className,\n });\n\n // Toolbar composition — consumer-provided children win; otherwise render\n // the standard table-tools cluster (Export / Print / Columns) as one\n // connected icon group, end-aligned on the page background — the same\n // layout the Patients / Care Plan List patterns established. Excel + PDF\n // export deps are dynamic-imported by their item handlers. The\n // `data-table-toolbar` class is the print-suppression marker.\n const toolbarContent = children ?? (\n <div className=\"data-table-toolbar ds:flex ds:justify-end\">\n <IconButtonGroup\n role=\"toolbar\"\n aria-label={t('dataTable.tableActions')}\n className=\"ds:bg-[var(--background)]\"\n >\n <Toolbar.ExportMenu />\n <Toolbar.Print />\n <Toolbar.ColumnToggle />\n </IconButtonGroup>\n </div>\n );\n\n // Pagination is auto-disabled in print mode so every row prints.\n const paginationEnabled = printMode ? false : pagination;\n const isEmpty =\n effectiveRowData !== undefined && effectiveRowData.length === 0;\n\n // A header that wraps never splits a word: each such column gets a minimum\n // width of its longest word, measured once the font is ready.\n const [headerMeasure, setHeaderMeasure] = useState<\n ((word: string) => number) | null\n >(null);\n useIsomorphicLayoutEffect(() => {\n const root = gridRootRef.current;\n if (!root) return undefined;\n let live = true;\n const make = () => {\n if (live) setHeaderMeasure(() => createHeaderMeasure(root));\n };\n make();\n void document.fonts?.ready.then(make);\n return () => {\n live = false;\n };\n }, []);\n const effectiveColumnDefs = useMemo(\n () => withHeaderMinWidths(columnDefs, headerMeasure),\n [columnDefs, headerMeasure],\n );\n\n return (\n <div\n className=\"ds:flex ds:w-full ds:min-h-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-sm)]\"\n aria-busy={isLoading ? 'true' : undefined}\n data-component=\"data-table\"\n data-component-id={gridId}\n data-print-mode={printMode ? 'true' : undefined}\n >\n {!printMode && (\n <ToolbarProvider\n getApi={getApi}\n selectionCount={selectionCount}\n onPrint={handlePrint}\n markColumnsUserTouched={markColumnsUserTouched}\n >\n {toolbarContent}\n </ToolbarProvider>\n )}\n\n {/* Grid */}\n <div\n ref={gridRootRef}\n data-empty={isEmpty ? 'true' : undefined}\n className={[wrapperClass, printMode ? '' : heightClass]\n .join(' ')\n .trim()}\n >\n <ExpandedRowContext.Provider\n value={expandedRowContext as ExpandedRowContextValue}\n >\n <AgGridReact<TData>\n key={gridLanguage}\n ref={agGridRef}\n initialState={languageStateRef.current ?? gridOptions?.initialState}\n // Opt into v32 CSS-file theming so the `.ag-theme-alfadocs` bridge\n // (src/tokens/ag-grid-theme.css) wins. Without this, AG Grid v33+\n // defaults to the JS Theming API (themeQuartz) which overrides our\n // tokens at runtime — including --ag-font-family.\n theme=\"legacy\"\n columnDefs={effectiveColumnDefs}\n rowData={effectiveRowData}\n /* §11a — every column gets sort + filter + resize + floating\n filter by default. Consumers opt-out per column via\n `sortable: false` / `filter: false`. The spread at the end\n lets `gridOptions.defaultColDef` override individual keys\n without losing the rest.\n\n Note: the column-menu button (`menuTabs` /\n `suppressHeaderMenuButton`) requires `ColumnMenuModule`,\n which is Enterprise in v33+. The floating-filter row is the\n Community-friendly equivalent and covers the primary use\n case — sort + filter without an extra popup. */\n defaultColDef={{\n sortable: true,\n // Default filter = DS-styled text filter so untyped columns\n // (no explicit `filter:` override) inherit the kit's form\n // language instead of AG Grid's stock browser-skinned input.\n // Number / date / select columns opt into their dedicated\n // wrapper per-column.\n filter: TextFilter,\n floatingFilterComponent: TextFloatingFilter,\n resizable: true,\n floatingFilter: true,\n // §13d — faint sort icon advertises which columns are\n // sortable. v33+ moved this from grid-level to defaultColDef.\n unSortIcon: true,\n ...(gridOptions as GridOptions<TData> | undefined)?.defaultColDef,\n }}\n rowSelection={rowSelectionOption}\n pagination={paginationEnabled}\n paginationPageSize={paginationPageSize}\n paginationPageSizeSelector={paginationPageSizeSelector}\n /* §13k — locale-aware pagination chrome (\"1 a 25 di 1.287\" in\n Italian). AG Grid's default renders raw integers. */\n paginationNumberFormatter={(params) =>\n new Intl.NumberFormat(i18n.language).format(params.value)\n }\n animateRows={!prefersReducedMotion}\n enableRtl={isRtl}\n ensureDomOrder\n /* Enable CellSpanModule globally — gate prop required for any\n colDef using `spanRows: true` (Community). Zero runtime cost\n when no column opts in. */\n enableCellSpan\n /* §13a — selecting cell text with the mouse should just work\n (copy a patient ID, an invoice number). AG Grid defaults this\n to false; that breaks user expectation on web tables. */\n enableCellTextSelection\n /* §13b — when a user copies a range, include column headers in\n the clipboard so a paste into Excel/Sheets keeps context. */\n copyHeadersToClipboard\n /* §13c — locale-aware sort (Intl.Collator). \"à\" sorts next to\n \"a\", \"ñ\" next to \"n\". Italian-first matters. */\n accentedSort\n /* §13d unSortIcon — moved to defaultColDef above per v33+\n deprecation. */\n /* §13e — Ctrl/⌘ for multi-column sort. Accounting + clinical\n staff who live in these grids appreciate this. */\n multiSortKey=\"ctrl\"\n /* §13f — dragging a column header outside the grid no longer\n hides the column. Surprising default, easy to trigger by\n accident, hard to recover from without ColumnToggle. */\n suppressDragLeaveHidesColumns\n /* §13h — tooltip ergonomics: 500 ms show matches OS, 5 s hide\n gives time to read long content, hover keeps it visible. */\n tooltipShowDelay={500}\n tooltipHideDelay={5000}\n tooltipInteraction\n /* §13i — commit-on-blur contract for inline editing. No-op\n until any column declares `editable: true`. */\n stopEditingWhenCellsLoseFocus\n /* §13j — preserve user column reorder across columnDefs\n prop changes; pairs with the localStorage persistence below. */\n maintainColumnOrder\n /* §13l — Ctrl/⌘+Z for inline edits. No-op until editable\n columns appear. */\n undoRedoCellEditing\n undoRedoCellEditingLimit={20}\n suppressCellFocus={false}\n rowBuffer={10}\n getLocaleText={getLocaleText}\n rowDragText={(_params, count) => t('dataTable.dragRows', { count })}\n noRowsOverlayComponent={NoRowsComponent}\n loadingOverlayComponent={LoadingComponent}\n getRowClass={expansionEnabled ? wrappedGetRowClass : getRowClass}\n pinnedBottomRowData={\n hidePinnedWhenEmpty && isEmpty ? undefined : pinnedBottomRowData\n }\n domLayout={printMode ? 'autoHeight' : undefined}\n onGridReady={handleGridReady}\n onNewColumnsLoaded={handleNewColumnsLoaded}\n onColumnMoved={handleColumnStateChange}\n onColumnResized={handleColumnStateChange}\n onColumnPinned={handleColumnStateChange}\n onColumnVisible={handleColumnStateChange}\n onSortChanged={handleSortChanged}\n onFilterChanged={handleFilterChanged}\n onSelectionChanged={handleSelectionChanged}\n {...forwardedGridOptions}\n {...(expansionEnabled\n ? {\n getRowId: wrappedGetRowId,\n isFullWidthRow: wrappedIsFullWidthRow,\n fullWidthCellRenderer: ExpandedRowRenderer,\n getRowHeight: wrappedGetRowHeight,\n postSortRows: wrappedPostSortRows,\n defaultCsvExportParams: csvExportParams,\n defaultExcelExportParams: excelExportParams,\n }\n : {})}\n />\n </ExpandedRowContext.Provider>\n </div>\n\n {/* Footer: only while it has something to say, so an empty one\n adds no flex gap below the grid. */}\n {!printMode && selectionCount > 0 && (\n <div className=\"ds:flex ds:items-center ds:justify-between type-body-sm ds:text-[color:var(--muted-foreground)]\">\n <span>{t('dataTable.selected', { count: selectionCount })}</span>\n </div>\n )}\n\n {/* Aria-live region for sort announcements */}\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {sortAnnouncement}\n </span>\n </div>\n );\n}\n\nconst DataTableBase = forwardRef(DataTableInner) as <TData = unknown>(\n props: DataTableProps<TData> & { ref?: React.Ref<DataTableHandle<TData>> },\n) => React.ReactElement;\n\n(DataTableBase as { displayName?: string }).displayName = 'DataTable';\n\nexport const DataTable = Object.assign(DataTableBase, {\n Toolbar,\n});\n"],"names":["HEADER_CELL_EXTRA_PX","longestWord","text","best","word","withHeaderMinWidths","defs","measure","def","col","floor","createHeaderMeasure","root","probe","width","DATA_TABLE_TOOLBAR_FEATURES","EXPANDED_ROW_MARKER","EXPANDED_ROW_CLASS","EXPANDED_ROW_ID_SUFFIX","FOCUSABLE_SELECTOR","isExpandedRowDetail","data","expandedRowDetailId","parentId","isExpandedRowDetailId","rowId","seedExpandedRowDetail","parent","ExpandedRowContext","createContext","ExpandedRowRenderer","props","ctx","useContext","t","useTranslation","rootRef","useRef","node","api","isDetail","heights","detailId","ctxRef","useEffect","el","last","apply","px","observer","row","onKey","event","_b","_a","Fallback","jsx","_marker","rest","jsxs","kinds","registerTableFilterKind","component","kind","registeredTableFilterKind","filter","OPERATORS","TextFilter","model","onModelChange","getValue","placeholder","defaultOperator","initialOperator","operator","setOperator","useState","draft","setDraft","matcher","useMemo","makeMatcher","i18next","useGridFilter","params","active","value","coerceToString","clear","operatorOptions","op","placeholderLabel","Select","next","StateBackedTextInput","Search","Button","TextFloatingFilter","column","filterParams","timer","clearImmediate","X","AG_SEAM_POLL_MS","apiBySeam","agApiOf","seam","ALL_KINDS","filterKindOf","canMoveOf","canPinOf","pinnedOf","pinned","listColumns","pinRank","a","b","exportCell","alignOf","type","types","createAgToolbarSeam","initial","deps","getApi","listeners","bound","emit","listener","bind","onFilter","onColumns","onRows","ensureBound","release","id","visible","toIndex","target","toColId","from","c","fromDef","sideChanges","agIndex","qf","values","v","columns","cellsOf","raw","shown","rows","totalsNode","fileName","parts","createTableToolbarParts","caller","ToolbarProvider","selectionCount","onPrint","markColumnsUserTouched","children","controller","mounted","TableToolbarProvider","agExportTable","headerFallback","visibleColumns","headers","defaultExportPdf","options","writeTablePdf","defaultExportXlsx","writeTableXlsx","ExportCsv","forwardRef","label","onExport","intent","ref","onClick","handleClick","useCallback","IconButton","Download","ExportPdf","FileText","FacetFilter","field","DEFAULT_EXPORT_ITEMS","ExportMenuItem","format","handleSelect","ExportMenu","f","BulkAction","leaf","ExportMenuNamespace","Toolbar","PRESENTATIONAL_ROLES","SELECTOR","stripNoOpAriaHidden","role","usePresentationalAriaFix","enabled","records","record","added","dataTableAgent","handle","args","createAgGridLocaleText","language","overrides","formatLanguage","formatLocale","month","part","key","defaultValue","variableValues","index","token","ModuleRegistry","AllCommunityModule","dataTableVariants","cva","DefaultLoadingOverlay","_","i","Skeleton","DefaultNoRowsOverlay","EmptyState","stripPins","state","_pinned","stripVisibilityAndPins","_hide","loadColumnState","gridId","dir","parsed","envelope","saveColumnState","touched","PROGRAMMATIC_COLUMN_SOURCES","DataTableInner","columnDefs","rowData","rowSelection","pagination","paginationPageSize","paginationPageSizeSelector","onSelectionChanged","onSortChanged","onFilterChanged","noRowsOverlay","loadingOverlay","gridOptions","density","bordered","heightClass","className","getRowClass","pinnedBottomRowData","hidePinnedWhenEmpty","printMode","expandedRowId","renderExpandedRow","onExpandedRowChange","expansionEnabled","consumerGetRowId","i18n","agGridRef","gridRootRef","setSelectionCount","sortAnnouncement","setSortAnnouncement","languageStateRef","getLocaleText","gridLanguage","setGridLanguage","focusedCell","columnPinning","focused","sameDirection","expandedRowIdRef","ids","want","fromId","toId","ordered","lo","hi","m","page","userTouchedRef","colIds","markUserTouchedRef","userColumnStateRef","useImperativeHandle","useAgentRegistration","isRtl","isLoading","prefersReducedMotion","usePrefersReducedMotion","resolvedTheme","useTheme","effectiveDensity","rowSelectionOption","isRowSelectable","direction","recordUserColumns","wanted","own","prop","persist","colId","handleGridReady","saved","handleNewColumnsLoaded","handleColumnStateChange","affected","owned","forwardedGridOptions","detailHeightsRef","consumerCallbacksRef","resolveRowId","expandedRow","effectiveRowData","detail","wrappedGetRowId","wrappedIsFullWidthRow","wrappedGetRowHeight","wrappedPostSortRows","nodes","detailIndex","n","parentIndex","wrappedGetRowClass","skipDetailRow","csvExportParams","base","excelExportParams","consumerFullWidthRenderer","expandedRowContext","handleSelectionChanged","r","handleSortChanged","sortedCol","colDef","colName","dirKey","handleFilterChanged","NoRowsComponent","LoadingComponent","handlePrint","wrapperClass","toolbarContent","IconButtonGroup","paginationEnabled","isEmpty","headerMeasure","setHeaderMeasure","useIsomorphicLayoutEffect","live","make","effectiveColumnDefs","AgGridReact","_params","count","DataTableBase","DataTable"],"mappings":"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"}
|