@tailng-ui/primitives 0.40.0 → 0.42.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.
Files changed (33) hide show
  1. package/package.json +2 -2
  2. package/src/lib/layout/index.d.ts +1 -0
  3. package/src/lib/layout/index.d.ts.map +1 -1
  4. package/src/lib/layout/index.js +1 -0
  5. package/src/lib/layout/index.js.map +1 -1
  6. package/src/lib/layout/table/__tests__/tng-table.test-harness.d.ts +300 -0
  7. package/src/lib/layout/table/__tests__/tng-table.test-harness.d.ts.map +1 -0
  8. package/src/lib/layout/table/__tests__/tng-table.test-harness.js +2492 -0
  9. package/src/lib/layout/table/__tests__/tng-table.test-harness.js.map +1 -0
  10. package/src/lib/layout/table/index.d.ts +6 -0
  11. package/src/lib/layout/table/index.d.ts.map +1 -0
  12. package/src/lib/layout/table/index.js +6 -0
  13. package/src/lib/layout/table/index.js.map +1 -0
  14. package/src/lib/layout/table/tng-table-render.d.ts +175 -0
  15. package/src/lib/layout/table/tng-table-render.d.ts.map +1 -0
  16. package/src/lib/layout/table/tng-table-render.js +304 -0
  17. package/src/lib/layout/table/tng-table-render.js.map +1 -0
  18. package/src/lib/layout/table/tng-table-sizing.d.ts +75 -0
  19. package/src/lib/layout/table/tng-table-sizing.d.ts.map +1 -0
  20. package/src/lib/layout/table/tng-table-sizing.js +361 -0
  21. package/src/lib/layout/table/tng-table-sizing.js.map +1 -0
  22. package/src/lib/layout/table/tng-table-sort.d.ts +53 -0
  23. package/src/lib/layout/table/tng-table-sort.d.ts.map +1 -0
  24. package/src/lib/layout/table/tng-table-sort.js +167 -0
  25. package/src/lib/layout/table/tng-table-sort.js.map +1 -0
  26. package/src/lib/layout/table/tng-table-virtual.d.ts +55 -0
  27. package/src/lib/layout/table/tng-table-virtual.d.ts.map +1 -0
  28. package/src/lib/layout/table/tng-table-virtual.js +250 -0
  29. package/src/lib/layout/table/tng-table-virtual.js.map +1 -0
  30. package/src/lib/layout/table/tng-table.d.ts +362 -0
  31. package/src/lib/layout/table/tng-table.d.ts.map +1 -0
  32. package/src/lib/layout/table/tng-table.js +1490 -0
  33. package/src/lib/layout/table/tng-table.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-table.test-harness.js","sourceRoot":"","sources":["../../../../../../../../../libs/tailng-ui/primitives/src/lib/layout/table/__tests__/tng-table.test-harness.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewChild, computed, signal } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport {\n createTngFilterController,\n createTngPaginationController,\n createTngSortController,\n type TngTableSortDirection,\n} from '@tailng-ui/cdk';\nimport {\n TngSortHeader,\n TngTable,\n TngTableBody,\n TngTableCell,\n TngTableCellOutlet,\n TngTableCellTpl,\n TngTableColumn,\n TngTableColumnResizer,\n TngTableColumnSizing,\n createTngTableIntlDateFormatter,\n createTngTableIntlNumberFormatter,\n type TngTableColumnWidthMap,\n TngTableEmpty,\n TngTableError,\n TngTableExpansion,\n type TngTableExpansionChange,\n TngTableFooter,\n TngTableFooterOutlet,\n TngTableFooterTpl,\n TngTableHeader,\n TngTableHeaderCell,\n TngTableHeaderOutlet,\n TngTableHeaderTpl,\n TngTableLoading,\n TngTablePagination,\n TngTableRow,\n type TngTableRowClickEvent,\n type TngTableRowContextMenuEvent,\n TngTableRowExpander,\n TngTableSelection,\n TngTableScrollContainer,\n TngTableVirtual,\n type TngTableVirtualRange,\n TngTableVirtualSpacer,\n type TngTableSelectionChange,\n TngTableSort,\n type TngTableSortChange,\n TngTableToolbar,\n type TngTableLayoutMode,\n type TngTableStickySide,\n type TngTableCellClickEvent,\n} from '..';\nimport {\n TngPopover,\n TngPopoverPanel,\n TngPopoverTrigger,\n} from '../../../overlay';\n\nexport type TableItem = Readonly<{\n id: string;\n label: string;\n}>;\n\nexport type InteractiveTableRow = Readonly<{\n disabled?: boolean;\n id: string;\n label: string;\n status?: string | null;\n value?: boolean | number | string | null | undefined;\n}>;\n\nexport type DynamicColumnId = 'label' | 'status' | 'value';\n\nexport type RenderingRow = Readonly<{\n active: boolean;\n id: string;\n label: string;\n markup: string;\n status: string;\n total: number;\n updatedAt: Date;\n}>;\n\nexport type DynamicTableColumn = Readonly<{\n hidden?: boolean;\n id: DynamicColumnId;\n label: string;\n}>;\n\nexport type IntegrationRow = Readonly<{\n id: string;\n label: string;\n status: 'draft' | 'ready';\n}>;\n\nexport function getByTestId<TElement extends Element>(\n fixture: { nativeElement: HTMLElement },\n testId: string,\n): TElement {\n const element = fixture.nativeElement.querySelector(`[data-testid=\"${testId}\"]`);\n if (element === null) {\n throw new Error(`Expected element for data-testid=\"${testId}\".`);\n }\n\n return element as TElement;\n}\n\nexport function queryAllByTestId<TElement extends Element>(\n fixture: { nativeElement: HTMLElement },\n testId: string,\n): readonly TElement[] {\n return Array.from(\n fixture.nativeElement.querySelectorAll(`[data-testid=\"${testId}\"]`),\n ) as readonly TElement[];\n}\n\nexport function dispatchKeydown(\n element: HTMLElement,\n key: string,\n init: KeyboardEventInit = {},\n): KeyboardEvent {\n const event = new KeyboardEvent('keydown', {\n bubbles: true,\n cancelable: true,\n key,\n ...init,\n });\n\n element.dispatchEvent(event);\n return event;\n}\n\nexport function dispatchMouseEvent(\n element: Element,\n type: 'click' | 'contextmenu',\n init: MouseEventInit = {},\n): MouseEvent {\n const event = new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n ...init,\n });\n\n element.dispatchEvent(event);\n return event;\n}\n\nfunction renderDynamicCell(row: InteractiveTableRow, columnId: DynamicColumnId): string {\n switch (columnId) {\n case 'label':\n return row.label ?? '';\n case 'status':\n return row.status ?? '';\n case 'value':\n return row.value === null || row.value === undefined ? '' : String(row.value);\n }\n}\n\n@Component({\n imports: [\n TngTable,\n TngTableHeader,\n TngTableBody,\n TngTableFooter,\n TngTableRow,\n TngTableHeaderCell,\n TngTableCell,\n TngTableToolbar,\n TngTableLoading,\n TngTableEmpty,\n TngTableError,\n TngTablePagination,\n ],\n template: `\n <section tngTableToolbar data-testid=\"toolbar\">Toolbar</section>\n\n <table\n tngTable\n #tableRef=\"tngTable\"\n data-testid=\"table\"\n [ariaLabel]=\"ariaLabel()\"\n [dir]=\"dir()\"\n [error]=\"error()\"\n [filterable]=\"filterable()\"\n [items]=\"items()\"\n [loading]=\"loading()\"\n [pageable]=\"pageable()\"\n >\n @if (showHeader()) {\n <thead tngTableHeader #headerRef=\"tngTableHeader\" data-testid=\"header\">\n <tr tngTableRow data-testid=\"header-row\">\n <th tngTableHeaderCell data-testid=\"header-cell\">Label</th>\n </tr>\n </thead>\n }\n\n <tbody tngTableBody #bodyRef=\"tngTableBody\" data-testid=\"body\">\n @for (item of renderedItems(); track item.id) {\n <tr tngTableRow data-testid=\"body-row\">\n <td tngTableCell data-testid=\"body-cell\">{{ item.label }}</td>\n </tr>\n }\n </tbody>\n\n @if (showFooter()) {\n <tfoot tngTableFooter #footerRef=\"tngTableFooter\" data-testid=\"footer\">\n <tr tngTableRow data-testid=\"footer-row\">\n <td tngTableCell data-testid=\"footer-cell\">Footer</td>\n </tr>\n </tfoot>\n }\n </table>\n\n @if (loading()) {\n <div data-testid=\"loading-slot\" tngTableLoading>Loading</div>\n }\n\n @if (!loading() && renderedItems().length === 0) {\n <div data-testid=\"empty-slot\" tngTableEmpty>Empty</div>\n }\n\n @if (error()) {\n <div data-testid=\"error-slot\" tngTableError>Error</div>\n }\n\n <nav tngTablePagination data-testid=\"pagination\">Pagination</nav>\n `,\n})\nexport class TableHarnessComponent {\n public readonly ariaLabel = signal<string | null>('Harness table');\n public readonly dir = signal<'ltr' | 'rtl' | null>('ltr');\n public readonly error = signal(false);\n public readonly filterable = signal(false);\n public readonly items = signal<readonly TableItem[] | null | undefined>([\n { id: 'alpha', label: 'Alpha' },\n ]);\n public readonly loading = signal(false);\n public readonly pageable = signal(false);\n public readonly showFooter = signal(true);\n public readonly showHeader = signal(true);\n public readonly renderedItems = computed(() => this.items() ?? []);\n\n @ViewChild('tableRef', { static: true })\n public tableRef?: TngTable;\n\n @ViewChild('headerRef')\n public headerRef?: TngTableHeader;\n\n @ViewChild('bodyRef', { static: true })\n public bodyRef?: TngTableBody;\n\n @ViewChild('footerRef')\n public footerRef?: TngTableFooter;\n}\n\n@Component({\n imports: [\n TngTable,\n TngTableHeader,\n TngTableBody,\n TngTableRow,\n TngTableHeaderCell,\n TngTableCell,\n TngTableSort,\n TngSortHeader,\n ],\n template: `\n @if (controlled()) {\n <table\n tngTable\n tngTableSort\n #sortRef=\"tngTableSort\"\n data-testid=\"table\"\n [tngTableSortActive]=\"activeColumnId()\"\n [tngTableSortDirection]=\"direction()\"\n >\n @if (showHeader()) {\n <thead tngTableHeader data-testid=\"header\">\n <tr tngTableRow>\n <th\n tngTableHeaderCell\n [tngSortHeader]=\"'label'\"\n [tngSortHeaderDisabled]=\"headerDisabled()\"\n data-testid=\"sort-header\"\n >\n Label\n </th>\n </tr>\n </thead>\n }\n\n <tbody tngTableBody>\n <tr tngTableRow>\n <td tngTableCell>Alpha</td>\n </tr>\n </tbody>\n </table>\n } @else {\n <table\n tngTable\n tngTableSort\n #sortRef=\"tngTableSort\"\n data-testid=\"table\"\n >\n @if (showHeader()) {\n <thead tngTableHeader data-testid=\"header\">\n <tr tngTableRow>\n <th\n tngTableHeaderCell\n [tngSortHeader]=\"'label'\"\n [tngSortHeaderDisabled]=\"headerDisabled()\"\n data-testid=\"sort-header\"\n >\n Label\n </th>\n </tr>\n </thead>\n }\n\n <tbody tngTableBody>\n <tr tngTableRow>\n <td tngTableCell>Alpha</td>\n </tr>\n </tbody>\n </table>\n }\n `,\n})\nexport class TableSortHarnessComponent {\n public readonly activeColumnId = signal<string | null | undefined>(undefined);\n public readonly controlled = signal(false);\n public readonly direction = signal<'asc' | 'desc' | null | undefined>(undefined);\n public readonly headerDisabled = signal(false);\n public readonly showHeader = signal(true);\n\n @ViewChild('sortRef')\n public sortRef?: TngTableSort;\n}\n\n@Component({\n imports: [\n TngTable,\n TngTableBody,\n TngTableCell,\n TngTableHeader,\n TngTableHeaderCell,\n TngTableRow,\n TngTableSelection,\n ],\n template: `\n <table\n tngTable\n tngTableSelection\n #selectionRef=\"tngTableSelection\"\n data-testid=\"selection-table\"\n [tngTableSelectedIds]=\"selectedIds()\"\n [tngTableSelectionMode]=\"selectionMode()\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <thead tngTableHeader>\n <tr tngTableRow>\n <th tngTableHeaderCell [tngTableColumnId]=\"'label'\" data-testid=\"selection-header\">\n Label\n </th>\n </tr>\n </thead>\n\n <tbody tngTableBody>\n @for (row of visibleRows(); track row.id) {\n <tr\n tngTableRow\n [attr.data-testid]=\"'selection-row-' + row.id\"\n [tngTableRowDisabled]=\"row.disabled ?? false\"\n [tngTableRowId]=\"row.id\"\n >\n <td\n tngTableCell\n [attr.data-testid]=\"'selection-cell-' + row.id\"\n [tngTableColumnId]=\"'label'\"\n >\n {{ row.label }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n `,\n})\nexport class TableSelectionHarnessComponent {\n public readonly hiddenIds = signal<readonly string[]>([]);\n public readonly rows = signal<readonly InteractiveTableRow[]>([\n { id: 'alpha', label: 'Alpha' },\n { id: 'beta', label: 'Beta' },\n { disabled: true, id: 'gamma', label: 'Gamma' },\n { id: 'delta', label: 'Delta' },\n ]);\n public readonly selectedIds = signal<readonly string[]>([]);\n public readonly selectionMode = signal<'multiple' | 'single'>('single');\n public readonly selectionEvents: TngTableSelectionChange[] = [];\n public readonly visibleRows = computed(() =>\n this.rows().filter((row) => !this.hiddenIds().includes(row.id)),\n );\n\n @ViewChild('selectionRef', { static: true })\n public selectionRef?: TngTableSelection;\n\n public onSelectionChange(event: TngTableSelectionChange): void {\n this.selectedIds.set(event.selectedIds);\n this.selectionEvents.push(event);\n }\n}\n\n@Component({\n imports: [\n TngTable,\n TngTableBody,\n TngTableCell,\n TngTableExpansion,\n TngTableHeader,\n TngTableHeaderCell,\n TngTableRow,\n TngTableRowExpander,\n ],\n template: `\n <table\n tngTable\n tngTableExpansion\n #expansionRef=\"tngTableExpansion\"\n data-testid=\"expansion-table\"\n [tngTableExpandedIds]=\"expandedIds()\"\n [tngTableExpansionMode]=\"expansionMode()\"\n (expansionChange)=\"onExpansionChange($event)\"\n >\n <thead tngTableHeader>\n <tr tngTableRow>\n <th tngTableHeaderCell data-testid=\"expander-header\">Expand</th>\n @for (column of visibleColumns(); track column.id) {\n <th\n tngTableHeaderCell\n [attr.data-testid]=\"'expansion-header-' + column.id\"\n [tngTableColumnId]=\"column.id\"\n >\n {{ column.label }}\n </th>\n }\n </tr>\n </thead>\n\n <tbody tngTableBody>\n @for (row of rows(); track row.id) {\n <tr\n tngTableRow\n [attr.data-testid]=\"'expansion-row-' + row.id\"\n [tngTableRowId]=\"row.id\"\n >\n <td tngTableCell [tngTableColumnId]=\"'label'\">\n <div\n tabindex=\"0\"\n [attr.data-testid]=\"'expander-' + row.id\"\n [tngTableRowExpander]=\"row.id\"\n >\n Toggle\n </div>\n </td>\n @for (column of visibleColumns(); track column.id) {\n <td\n tngTableCell\n [attr.data-testid]=\"'expansion-cell-' + row.id + '-' + column.id\"\n [tngTableColumnId]=\"column.id\"\n >\n {{ renderCell(row, column.id) }}\n </td>\n }\n </tr>\n\n @if (isExpanded(row.id)) {\n <tr\n tngTableRow\n [attr.data-testid]=\"'detail-row-' + row.id\"\n [tngTableRowExpanded]=\"true\"\n [tngTableRowId]=\"row.id + '-detail'\"\n >\n <td\n tngTableCell\n [attr.colspan]=\"visibleColumns().length + 1\"\n [attr.data-testid]=\"'detail-cell-' + row.id\"\n >\n Details for {{ row.label }}\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n `,\n})\nexport class TableExpansionHarnessComponent {\n public readonly expandedIds = signal<readonly string[]>([]);\n public readonly expansionEvents: TngTableExpansionChange[] = [];\n public readonly expansionMode = signal<'multiple' | 'single'>('multiple');\n public readonly rows = signal<readonly InteractiveTableRow[]>([\n { id: 'alpha', label: 'Alpha', status: 'Ready', value: 1 },\n { id: 'beta', label: 'Beta', status: 'Review', value: 2 },\n { id: 'gamma', label: 'Gamma', status: 'Draft', value: 3 },\n ]);\n public readonly visibleColumns = signal<readonly DynamicTableColumn[]>([\n { id: 'label', label: 'Label' },\n { id: 'status', label: 'Status' },\n { id: 'value', label: 'Value' },\n ]);\n\n @ViewChild('expansionRef', { static: true })\n public expansionRef?: TngTableExpansion;\n\n public isExpanded(rowId: string): boolean {\n return this.expandedIds().includes(rowId);\n }\n\n public onExpansionChange(event: TngTableExpansionChange): void {\n this.expandedIds.set(event.expandedIds);\n this.expansionEvents.push(event);\n }\n\n public renderCell(row: InteractiveTableRow, columnId: DynamicColumnId): string {\n return renderDynamicCell(row, columnId);\n }\n}\n\n@Component({\n imports: [\n TngTable,\n TngTableBody,\n TngTableCell,\n TngTableHeader,\n TngTableHeaderCell,\n TngTableRow,\n ],\n template: `\n <table tngTable data-testid=\"interaction-table\">\n <thead tngTableHeader>\n <tr tngTableRow>\n <th tngTableHeaderCell [tngTableColumnId]=\"'label'\">Label</th>\n <th tngTableHeaderCell [tngTableColumnId]=\"'actions'\">Actions</th>\n </tr>\n </thead>\n\n <tbody tngTableBody>\n @for (row of rows(); track row.id) {\n <tr\n tngTableRow\n [attr.data-testid]=\"'interaction-row-' + row.id\"\n [tngTableRowId]=\"row.id\"\n (rowClick)=\"onRowClick($event)\"\n (rowContextMenu)=\"onRowContextMenu($event)\"\n >\n <td\n tngTableCell\n [attr.data-testid]=\"'interaction-cell-' + row.id\"\n [tngTableColumnId]=\"'label'\"\n (cellClick)=\"onCellClick($event)\"\n >\n {{ row.label }}\n </td>\n <td\n tngTableCell\n [tngTableColumnId]=\"'actions'\"\n (cellClick)=\"onCellClick($event)\"\n >\n <button\n type=\"button\"\n [attr.data-testid]=\"'row-action-' + row.id\"\n (click)=\"$event.stopPropagation()\"\n >\n Action\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n `,\n})\nexport class TableInteractionHarnessComponent {\n public readonly cellClicks: TngTableCellClickEvent[] = [];\n public readonly rowClicks: TngTableRowClickEvent[] = [];\n public readonly rowContextMenus: TngTableRowContextMenuEvent[] = [];\n public readonly rows = signal<readonly InteractiveTableRow[]>([\n { id: 'alpha', label: 'Alpha' },\n { id: 'beta', label: 'Beta' },\n ]);\n\n public onCellClick(event: TngTableCellClickEvent): void {\n this.cellClicks.push(event);\n }\n\n public onRowClick(event: TngTableRowClickEvent): void {\n this.rowClicks.push(event);\n }\n\n public onRowContextMenu(event: TngTableRowContextMenuEvent): void {\n this.rowContextMenus.push(event);\n }\n}\n\n@Component({\n imports: [\n RouterLink,\n TngPopover,\n TngPopoverPanel,\n TngPopoverTrigger,\n TngTable,\n TngTableBody,\n TngTableCell,\n TngTableHeader,\n TngTableHeaderCell,\n TngTableRow,\n TngTableSelection,\n ],\n template: `\n <table\n tngTable\n tngTableSelection\n data-testid=\"integration-table\"\n [tngTableSelectedIds]=\"selectedIds()\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <thead tngTableHeader>\n <tr tngTableRow>\n <th tngTableHeaderCell [tngTableColumnId]=\"'label'\">Label</th>\n <th tngTableHeaderCell [tngTableColumnId]=\"'link'\">Link</th>\n <th tngTableHeaderCell [tngTableColumnId]=\"'form'\">Form</th>\n <th tngTableHeaderCell [tngTableColumnId]=\"'overlay'\">Overlay</th>\n </tr>\n </thead>\n\n <tbody tngTableBody>\n @for (row of rows(); track row.id) {\n <tr\n tngTableRow\n [attr.data-testid]=\"'integration-row-' + row.id\"\n [tngTableRowId]=\"row.id\"\n (rowClick)=\"onRowClick($event)\"\n >\n <td\n tngTableCell\n [attr.data-testid]=\"'integration-cell-' + row.id + '-label'\"\n [tngTableColumnId]=\"'label'\"\n (cellClick)=\"onCellClick($event)\"\n >\n {{ row.label }}\n </td>\n\n <td\n tngTableCell\n [attr.data-testid]=\"'integration-cell-' + row.id + '-link'\"\n [tngTableColumnId]=\"'link'\"\n (cellClick)=\"onCellClick($event)\"\n >\n <a [routerLink]=\"['/detail', row.id]\" [attr.data-testid]=\"'integration-link-' + row.id\">\n Open\n </a>\n </td>\n\n <td\n tngTableCell\n [attr.data-testid]=\"'integration-cell-' + row.id + '-form'\"\n [tngTableColumnId]=\"'form'\"\n (cellClick)=\"onCellClick($event)\"\n >\n <input\n type=\"text\"\n [attr.data-testid]=\"'integration-input-' + row.id\"\n [value]=\"row.label\"\n />\n <select [attr.data-testid]=\"'integration-select-' + row.id\">\n <option value=\"draft\">Draft</option>\n <option value=\"ready\">Ready</option>\n </select>\n </td>\n\n <td\n tngTableCell\n [attr.data-testid]=\"'integration-cell-' + row.id + '-overlay'\"\n [tngTableColumnId]=\"'overlay'\"\n (cellClick)=\"onCellClick($event)\"\n >\n <section tngPopover #popover=\"tngPopover\" [restoreFocus]=\"false\">\n <button\n type=\"button\"\n [attr.data-testid]=\"'integration-popover-trigger-' + row.id\"\n [tngPopoverTrigger]=\"popover\"\n >\n Actions\n </button>\n\n <section tngPopoverPanel [attr.data-testid]=\"'integration-popover-panel-' + row.id\">\n <button type=\"button\">Inspect</button>\n </section>\n </section>\n </td>\n </tr>\n }\n </tbody>\n </table>\n `,\n})\nexport class TableEmbeddedIntegrationHarnessComponent {\n public readonly cellClicks: TngTableCellClickEvent[] = [];\n public readonly rowClicks: TngTableRowClickEvent[] = [];\n public readonly rows = signal<readonly IntegrationRow[]>([\n { id: 'alpha', label: 'Alpha', status: 'ready' },\n ]);\n public readonly selectedIds = signal<readonly string[]>([]);\n\n public onCellClick(event: TngTableCellClickEvent): void {\n this.cellClicks.push(event);\n }\n\n public onRowClick(event: TngTableRowClickEvent): void {\n this.rowClicks.push(event);\n }\n\n public onSelectionChange(event: TngTableSelectionChange): void {\n this.selectedIds.set(event.selectedIds);\n }\n}\n\n@Component({\n imports: [\n TngSortHeader,\n TngTable,\n TngTableBody,\n TngTableCell,\n TngTableHeader,\n TngTableHeaderCell,\n TngTableRow,\n TngTableSort,\n ],\n template: `\n <input\n #filterInput\n type=\"text\"\n data-testid=\"controlled-filter\"\n [value]=\"query()\"\n (input)=\"onQueryInput(filterInput.value)\"\n />\n <button type=\"button\" data-testid=\"controlled-page-next\" (click)=\"nextPage()\">Next page</button>\n\n <table\n tngTable\n tngTableSort\n #sortRef=\"tngTableSort\"\n data-testid=\"controlled-table\"\n [items]=\"visibleRows()\"\n [filterable]=\"true\"\n [pageable]=\"true\"\n [tngTableSortActive]=\"activeColumnId()\"\n [tngTableSortDirection]=\"direction()\"\n (sortChange)=\"onSortChange($event)\"\n >\n <thead tngTableHeader>\n <tr tngTableRow>\n <th\n tngTableHeaderCell\n [tngSortHeader]=\"'label'\"\n data-testid=\"controlled-sort-header\"\n >\n Label\n </th>\n <th tngTableHeaderCell [tngTableColumnId]=\"'status'\">Status</th>\n </tr>\n </thead>\n\n <tbody tngTableBody>\n @for (row of visibleRows(); track row.id) {\n <tr\n tngTableRow\n [attr.data-testid]=\"'controlled-row-' + row.id\"\n [tngTableRowId]=\"row.id\"\n >\n <td tngTableCell [tngTableColumnId]=\"'label'\">{{ row.label }}</td>\n <td tngTableCell [tngTableColumnId]=\"'status'\">{{ row.status }}</td>\n </tr>\n }\n </tbody>\n </table>\n `,\n})\nexport class TableControlledIntegrationHarnessComponent {\n public readonly activeColumnId = signal<string | null>(null);\n public readonly direction = signal<TngTableSortDirection | null>(null);\n public readonly pageIndex = signal(0);\n public readonly pageSize = signal(2);\n public readonly query = signal('');\n public readonly rows = signal<readonly IntegrationRow[]>([\n { id: 'gamma', label: 'Gamma', status: 'draft' },\n { id: 'alpha', label: 'Alpha', status: 'ready' },\n { id: 'beta', label: 'Beta', status: 'ready' },\n { id: 'delta', label: 'Delta', status: 'draft' },\n ]);\n public readonly sortEvents: TngTableSortChange[] = [];\n\n public readonly filteredRows = computed(() =>\n createTngFilterController<IntegrationRow>({\n globalFilter: (item, query) => item.label.toLowerCase().includes(query.toLowerCase()),\n query: this.query(),\n }).apply(this.rows()),\n );\n public readonly sortedRows = computed(() =>\n createTngSortController<IntegrationRow, 'label'>({\n accessor: (item, columnId) => item[columnId],\n activeColumnId: this.activeColumnId() === 'label' ? 'label' : null,\n direction: this.direction(),\n }).apply(this.filteredRows()),\n );\n public readonly visibleRows = computed(() =>\n createTngPaginationController<IntegrationRow>({\n pageIndex: this.pageIndex(),\n pageSize: this.pageSize(),\n }).slice(this.sortedRows()),\n );\n\n @ViewChild('sortRef')\n public sortRef?: TngTableSort;\n\n public nextPage(): void {\n this.pageIndex.update((value) => value + 1);\n }\n\n public onQueryInput(query: string): void {\n this.query.set(query);\n this.pageIndex.set(0);\n }\n\n public onSortChange(event: TngTableSortChange): void {\n this.activeColumnId.set(event.activeColumnId);\n this.direction.set(event.direction);\n this.pageIndex.set(0);\n this.sortEvents.push(event);\n }\n}\n\n@Component({\n imports: [\n TngTable,\n TngTableBody,\n TngTableCell,\n TngTableHeader,\n TngTableHeaderCell,\n TngTableRow,\n TngTableSelection,\n ],\n template: `\n <table\n tngTable\n tngTableSelection\n data-testid=\"dynamic-table\"\n [ariaLabel]=\"ariaLabel()\"\n [tngTableSelectedIds]=\"selectedIds()\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <thead tngTableHeader>\n <tr tngTableRow>\n @for (column of visibleColumns(); track column.id) {\n <th\n tngTableHeaderCell\n [attr.data-testid]=\"'dynamic-header-' + column.id\"\n [tngTableColumnId]=\"column.id\"\n scope=\"col\"\n >\n {{ column.label }}\n </th>\n }\n </tr>\n </thead>\n\n <tbody tngTableBody>\n @for (row of rows(); track row.id) {\n <tr\n tngTableRow\n [attr.data-testid]=\"'dynamic-row-' + row.id\"\n [tngTableRowId]=\"row.id\"\n >\n @for (column of visibleColumns(); track column.id) {\n <td\n tngTableCell\n [attr.data-testid]=\"'dynamic-cell-' + row.id + '-' + column.id\"\n [tngTableColumnId]=\"column.id\"\n >\n {{ renderCell(row, column.id) }}\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n `,\n})\nexport class DynamicTableHarnessComponent {\n public readonly ariaLabel = signal<string | null>('Dynamic table');\n public readonly columns = signal<readonly DynamicTableColumn[]>([\n { id: 'label', label: 'Label' },\n { id: 'status', label: 'Status' },\n { id: 'value', label: 'Value' },\n ]);\n public readonly rows = signal<readonly InteractiveTableRow[]>([\n { id: 'alpha', label: 'Alpha', status: 'Ready', value: 1 },\n { id: 'beta', label: 'Beta', status: undefined, value: null },\n { id: 'gamma', label: 'Gamma', status: 'Draft', value: true },\n ]);\n public readonly selectedIds = signal<readonly string[]>([]);\n public readonly visibleColumns = computed(() =>\n this.columns().filter((column) => column.hidden !== true),\n );\n\n public onSelectionChange(event: TngTableSelectionChange): void {\n this.selectedIds.set(event.selectedIds);\n }\n\n public renderCell(row: InteractiveTableRow, columnId: DynamicColumnId): string {\n return renderDynamicCell(row, columnId);\n }\n}\n\n@Component({\n imports: [\n TngTable,\n TngTableHeader,\n TngTableBody,\n TngTableFooter,\n TngTableRow,\n TngTableHeaderCell,\n TngTableCell,\n TngTableCellOutlet,\n TngTableCellTpl,\n TngTableHeaderOutlet,\n TngTableHeaderTpl,\n TngTableFooterOutlet,\n TngTableFooterTpl,\n ],\n template: `\n <ng-template\n tngTableCellTpl\n #cellTemplate=\"tngTableCellTpl\"\n let-columnId=\"columnId\"\n let-row=\"row\"\n let-value\n >\n <span data-testid=\"custom-cell-content\">{{ row.id }}::{{ columnId }}::{{ value }}</span>\n </ng-template>\n\n <ng-template\n tngTableHeaderTpl\n #headerTemplate=\"tngTableHeaderTpl\"\n let-columnId=\"columnId\"\n let-label\n >\n <span data-testid=\"custom-header-content\">{{ columnId }}::{{ label }}</span>\n </ng-template>\n\n <ng-template\n tngTableFooterTpl\n #footerTemplate=\"tngTableFooterTpl\"\n let-columnId=\"columnId\"\n let-items=\"items\"\n let-value\n >\n <span data-testid=\"custom-footer-content\">{{ columnId }}::{{ items.length }}::{{ value }}</span>\n </ng-template>\n\n <ng-template tngTableCellTpl #htmlTemplate=\"tngTableCellTpl\" let-value>\n <span data-testid=\"custom-html-content\" [innerHTML]=\"value\"></span>\n </ng-template>\n\n <table tngTable data-testid=\"rendering-table\">\n <thead tngTableHeader>\n <tr tngTableRow>\n <th tngTableHeaderCell data-testid=\"default-header\">\n <tng-table-header-outlet\n [columnId]=\"'label'\"\n [label]=\"'Name'\"\n ></tng-table-header-outlet>\n </th>\n <th tngTableHeaderCell data-testid=\"custom-header\">\n <tng-table-header-outlet\n [columnId]=\"'status'\"\n [label]=\"'Status'\"\n [template]=\"headerTemplate\"\n ></tng-table-header-outlet>\n </th>\n </tr>\n </thead>\n\n <tbody tngTableBody>\n <tr tngTableRow [tngTableRowId]=\"rows()[0].id\">\n <td tngTableCell data-testid=\"default-string-cell\">\n <tng-table-cell-outlet\n [columnId]=\"'label'\"\n [row]=\"rows()[0]\"\n [rowId]=\"rows()[0].id\"\n [value]=\"rows()[0].label\"\n ></tng-table-cell-outlet>\n </td>\n <td tngTableCell data-testid=\"default-number-cell\">\n <tng-table-cell-outlet\n [columnId]=\"'total'\"\n [row]=\"rows()[0]\"\n [rowId]=\"rows()[0].id\"\n [value]=\"rows()[0].total\"\n ></tng-table-cell-outlet>\n </td>\n <td tngTableCell data-testid=\"default-boolean-cell\">\n <tng-table-cell-outlet\n [columnId]=\"'active'\"\n [row]=\"rows()[0]\"\n [rowId]=\"rows()[0].id\"\n [value]=\"rows()[0].active\"\n ></tng-table-cell-outlet>\n </td>\n <td tngTableCell data-testid=\"custom-cell\">\n <tng-table-cell-outlet\n [columnId]=\"'status'\"\n [row]=\"rows()[0]\"\n [rowId]=\"rows()[0].id\"\n [template]=\"cellTemplate\"\n [value]=\"rows()[0].status\"\n ></tng-table-cell-outlet>\n </td>\n <td tngTableCell data-testid=\"formatted-cell\">\n <tng-table-cell-outlet\n [columnId]=\"'status'\"\n [formatter]=\"statusFormatter\"\n [row]=\"rows()[0]\"\n [rowId]=\"rows()[0].id\"\n [value]=\"rows()[0].status\"\n ></tng-table-cell-outlet>\n </td>\n <td tngTableCell data-testid=\"formatter-error-cell\">\n <tng-table-cell-outlet\n #errorCellOutlet=\"tngTableCellOutlet\"\n [columnId]=\"'status'\"\n [formatter]=\"throwingFormatter\"\n [row]=\"rows()[0]\"\n [rowId]=\"rows()[0].id\"\n [value]=\"rows()[0].status\"\n ></tng-table-cell-outlet>\n </td>\n <td tngTableCell data-testid=\"html-escape-cell\">\n <tng-table-cell-outlet\n [columnId]=\"'markup'\"\n [row]=\"rows()[0]\"\n [rowId]=\"rows()[0].id\"\n [value]=\"rows()[0].markup\"\n ></tng-table-cell-outlet>\n </td>\n <td tngTableCell data-testid=\"html-optin-cell\">\n <tng-table-cell-outlet\n [columnId]=\"'markup'\"\n [row]=\"rows()[0]\"\n [rowId]=\"rows()[0].id\"\n [template]=\"htmlTemplate\"\n [value]=\"rows()[0].markup\"\n ></tng-table-cell-outlet>\n </td>\n <td tngTableCell data-testid=\"localized-number-cell\">\n <tng-table-cell-outlet\n [columnId]=\"'localizedTotal'\"\n [formatter]=\"localizedNumberFormatter\"\n [row]=\"rows()[0]\"\n [rowId]=\"rows()[0].id\"\n [value]=\"localizedNumberValue()\"\n ></tng-table-cell-outlet>\n </td>\n <td tngTableCell data-testid=\"localized-date-cell\">\n <tng-table-cell-outlet\n [columnId]=\"'updatedAt'\"\n [formatter]=\"localizedDateFormatter\"\n [row]=\"rows()[0]\"\n [rowId]=\"rows()[0].id\"\n [value]=\"rows()[0].updatedAt\"\n ></tng-table-cell-outlet>\n </td>\n </tr>\n </tbody>\n\n <tfoot tngTableFooter>\n <tr tngTableRow>\n <td tngTableCell data-testid=\"default-footer-cell\">\n <tng-table-footer-outlet\n [columnId]=\"'total'\"\n [items]=\"rows()\"\n [value]=\"footerValue()\"\n ></tng-table-footer-outlet>\n </td>\n <td tngTableCell data-testid=\"custom-footer-cell\">\n <tng-table-footer-outlet\n #footerOutlet=\"tngTableFooterOutlet\"\n [columnId]=\"'summary'\"\n [items]=\"rows()\"\n [template]=\"footerTemplate\"\n [value]=\"footerValue()\"\n ></tng-table-footer-outlet>\n </td>\n <td tngTableCell data-testid=\"localized-footer-cell\">\n <tng-table-footer-outlet\n [columnId]=\"'localizedTotal'\"\n [formatter]=\"localizedNumberFormatter\"\n [items]=\"rows()\"\n [value]=\"localizedFooterValue()\"\n ></tng-table-footer-outlet>\n </td>\n </tr>\n </tfoot>\n </table>\n `,\n})\nexport class TableRenderingHarnessComponent {\n public readonly footerValue = signal(2);\n public readonly localizedFooterValue = signal(9876.5);\n public readonly localizedNumberValue = signal(12345.67);\n public readonly rows = signal<readonly RenderingRow[]>([\n {\n active: true,\n id: 'alpha',\n label: 'Alpha',\n markup: '<strong>Safe</strong>',\n status: 'Active',\n total: 42,\n updatedAt: new Date('2026-04-24T00:00:00.000Z'),\n },\n {\n active: false,\n id: 'beta',\n label: 'Beta',\n markup: '<em>Draft</em>',\n status: 'Draft',\n total: 18,\n updatedAt: new Date('2026-04-23T00:00:00.000Z'),\n },\n ]);\n\n public readonly localizedDateFormatter = createTngTableIntlDateFormatter('en-GB', {\n day: '2-digit',\n month: '2-digit',\n timeZone: 'UTC',\n year: 'numeric',\n });\n public readonly localizedNumberFormatter = createTngTableIntlNumberFormatter('de-DE', {\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n });\n public readonly statusFormatter = (value: unknown): string =>\n `formatted:${String(value).toUpperCase()}`;\n public readonly throwingFormatter = (): string => {\n throw new Error('Formatter failure');\n };\n\n @ViewChild('errorCellOutlet')\n public errorCellOutlet?: TngTableCellOutlet;\n\n @ViewChild('footerOutlet')\n public footerOutlet?: TngTableFooterOutlet;\n}\n\n@Component({\n imports: [\n TngTable,\n TngTableScrollContainer,\n TngTableHeader,\n TngTableBody,\n TngTableFooter,\n TngTableRow,\n TngTableHeaderCell,\n TngTableCell,\n ],\n template: `\n <div\n tngTableScrollContainer\n data-testid=\"layout-scroll\"\n [dir]=\"dir()\"\n [tngTableScrollAxis]=\"scrollAxis()\"\n >\n <table\n tngTable\n data-testid=\"layout-table\"\n [dir]=\"dir()\"\n [tngTableLayout]=\"layout()\"\n >\n <thead\n tngTableHeader\n data-testid=\"layout-header\"\n [tngTableHeaderSticky]=\"stickyHeader()\"\n [tngTableHeaderStickyOffset]=\"headerStickyOffset()\"\n >\n <tr tngTableRow>\n <th\n tngTableHeaderCell\n data-testid=\"layout-header-label\"\n [tngTableColumnId]=\"'label'\"\n [tngTableStickyColumn]=\"labelStickySide()\"\n [tngTableStickyOffset]=\"labelStickyOffset()\"\n [tngTableTruncate]=\"truncate()\"\n >\n Project name\n </th>\n <th\n tngTableHeaderCell\n data-testid=\"layout-header-status\"\n [tngTableColumnId]=\"'status'\"\n [tngTableStickyColumn]=\"statusStickySide()\"\n [tngTableStickyOffset]=\"statusStickyOffset()\"\n >\n Status\n </th>\n <th\n tngTableHeaderCell\n data-testid=\"layout-header-value\"\n [tngTableColumnId]=\"'value'\"\n [tngTableStickyColumn]=\"valueStickySide()\"\n [tngTableStickyOffset]=\"valueStickyOffset()\"\n >\n Value\n </th>\n </tr>\n </thead>\n\n <tbody tngTableBody>\n <tr tngTableRow [tngTableRowId]=\"'alpha'\">\n <td\n tngTableCell\n data-testid=\"layout-cell-label\"\n [tngTableColumnId]=\"'label'\"\n [tngTableStickyColumn]=\"labelStickySide()\"\n [tngTableStickyOffset]=\"labelStickyOffset()\"\n [tngTableTruncate]=\"truncate()\"\n >\n A very long label that should truncate in fixed layout mode\n </td>\n <td\n tngTableCell\n data-testid=\"layout-cell-status\"\n [tngTableColumnId]=\"'status'\"\n [tngTableStickyColumn]=\"statusStickySide()\"\n [tngTableStickyOffset]=\"statusStickyOffset()\"\n >\n Ready\n </td>\n <td\n tngTableCell\n data-testid=\"layout-cell-value\"\n [tngTableColumnId]=\"'value'\"\n [tngTableStickyColumn]=\"valueStickySide()\"\n [tngTableStickyOffset]=\"valueStickyOffset()\"\n >\n 42\n </td>\n </tr>\n </tbody>\n\n <tfoot\n tngTableFooter\n data-testid=\"layout-footer\"\n [tngTableFooterSticky]=\"stickyFooter()\"\n [tngTableFooterStickyOffset]=\"footerStickyOffset()\"\n >\n <tr tngTableRow>\n <td\n tngTableCell\n data-testid=\"layout-footer-label\"\n [tngTableColumnId]=\"'label'\"\n [tngTableStickyColumn]=\"labelStickySide()\"\n [tngTableStickyOffset]=\"labelStickyOffset()\"\n >\n Totals\n </td>\n <td\n tngTableCell\n data-testid=\"layout-footer-status\"\n [tngTableColumnId]=\"'status'\"\n [tngTableStickyColumn]=\"statusStickySide()\"\n [tngTableStickyOffset]=\"statusStickyOffset()\"\n >\n Complete\n </td>\n <td\n tngTableCell\n data-testid=\"layout-footer-value\"\n [tngTableColumnId]=\"'value'\"\n [tngTableStickyColumn]=\"valueStickySide()\"\n [tngTableStickyOffset]=\"valueStickyOffset()\"\n >\n 42\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n `,\n})\nexport class TableLayoutHarnessComponent {\n public readonly dir = signal<'ltr' | 'rtl'>('ltr');\n public readonly footerStickyOffset = signal('8px');\n public readonly headerStickyOffset = signal('12px');\n public readonly labelStickyOffset = signal<string | null>(null);\n public readonly labelStickySide = signal<TngTableStickySide | null>(null);\n public readonly layout = signal<TngTableLayoutMode>('auto');\n public readonly scrollAxis = signal<'both' | 'x' | 'y'>('x');\n public readonly statusStickyOffset = signal<string | null>(null);\n public readonly statusStickySide = signal<TngTableStickySide | null>(null);\n public readonly stickyFooter = signal(false);\n public readonly stickyHeader = signal(false);\n public readonly truncate = signal(false);\n public readonly valueStickyOffset = signal<string | null>(null);\n public readonly valueStickySide = signal<TngTableStickySide | null>(null);\n}\n\n@Component({\n imports: [\n TngTable,\n TngTableHeader,\n TngTableBody,\n TngTableRow,\n TngTableHeaderCell,\n TngTableCell,\n TngTableColumnSizing,\n TngTableColumn,\n TngTableColumnResizer,\n ],\n template: `\n <table\n tngTable\n tngTableColumnSizing\n data-testid=\"sizing-table\"\n [dir]=\"dir()\"\n [tngTableColumnWidths]=\"widths()\"\n (columnWidthsChange)=\"onWidthsChange($event)\"\n >\n <thead tngTableHeader>\n <tr tngTableRow>\n <th\n tngTableHeaderCell\n tngTableColumn\n data-testid=\"sizing-header-label\"\n [tngTableColumn]=\"'label'\"\n [tngTableColumnWidth]=\"'240px'\"\n >\n Label\n <span [tngTableColumnResizer]=\"'label'\" data-testid=\"label-resizer\"></span>\n </th>\n <th\n tngTableHeaderCell\n tngTableColumn\n data-testid=\"sizing-header-status\"\n [tngTableColumn]=\"'status'\"\n [tngTableColumnMaxWidth]=\"'220px'\"\n [tngTableColumnMinWidth]=\"'120px'\"\n [tngTableColumnWidth]=\"'140px'\"\n >\n Status\n <span [tngTableColumnResizer]=\"'status'\" data-testid=\"status-resizer\"></span>\n </th>\n <th\n tngTableHeaderCell\n tngTableColumn\n data-testid=\"sizing-header-value\"\n [tngTableColumn]=\"'value'\"\n [tngTableColumnWidth]=\"'96px'\"\n >\n Value\n <span [tngTableColumnResizer]=\"'value'\" data-testid=\"value-resizer\"></span>\n </th>\n </tr>\n </thead>\n\n <tbody tngTableBody>\n <tr tngTableRow [tngTableRowId]=\"'alpha'\">\n <td\n tngTableCell\n tngTableColumn\n data-testid=\"sizing-cell-label\"\n [tngTableColumn]=\"'label'\"\n [tngTableColumnWidth]=\"'240px'\"\n >\n Alpha\n </td>\n <td\n tngTableCell\n tngTableColumn\n data-testid=\"sizing-cell-status\"\n [tngTableColumn]=\"'status'\"\n [tngTableColumnMaxWidth]=\"'220px'\"\n [tngTableColumnMinWidth]=\"'120px'\"\n [tngTableColumnWidth]=\"'140px'\"\n >\n Ready\n </td>\n <td\n tngTableCell\n tngTableColumn\n data-testid=\"sizing-cell-value\"\n [tngTableColumn]=\"'value'\"\n [tngTableColumnWidth]=\"'96px'\"\n >\n 42\n </td>\n </tr>\n </tbody>\n </table>\n `,\n})\nexport class TableSizingHarnessComponent {\n public readonly dir = signal<'ltr' | 'rtl'>('ltr');\n public readonly widthEvents: TngTableColumnWidthMap[] = [];\n public readonly widths = signal<Record<string, string> | undefined>(undefined);\n\n public onWidthsChange(nextWidths: TngTableColumnWidthMap): void {\n this.widths.set({ ...nextWidths });\n this.widthEvents.push(nextWidths);\n }\n}\n\n@Component({\n imports: [\n TngTable,\n TngTableBody,\n TngTableCell,\n TngTableHeader,\n TngTableHeaderCell,\n TngTableRow,\n TngTableScrollContainer,\n TngTableSelection,\n TngTableVirtual,\n TngTableVirtualSpacer,\n ],\n template: `\n <div\n tngTableScrollContainer\n tngTableVirtual\n #virtualRef=\"tngTableVirtual\"\n data-testid=\"virtual-scroll\"\n [tngTableScrollAxis]=\"'both'\"\n [tngTableVirtualItemCount]=\"rows().length\"\n [tngTableVirtualItemSize]=\"rowHeight()\"\n [tngTableVirtualOverscan]=\"overscan()\"\n [tngTableVirtualViewportHeight]=\"viewportHeight()\"\n (rangeChange)=\"onRangeChange($event)\"\n >\n <table\n tngTable\n tngTableSelection\n #selectionRef=\"tngTableSelection\"\n data-testid=\"virtual-table\"\n [tngTableSelectedIds]=\"selectedIds()\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <thead\n tngTableHeader\n data-testid=\"virtual-header\"\n [tngTableHeaderSticky]=\"stickyHeader()\"\n >\n <tr tngTableRow>\n <th tngTableHeaderCell [tngTableColumnId]=\"'label'\">Label</th>\n <th tngTableHeaderCell [tngTableColumnId]=\"'status'\">Status</th>\n <th tngTableHeaderCell [tngTableColumnId]=\"'value'\">Value</th>\n </tr>\n </thead>\n\n <tbody tngTableBody>\n @if (virtualRef.beforeSize() > 0) {\n <tr\n tngTableVirtualSpacer\n data-testid=\"virtual-top-spacer\"\n [tngTableVirtualSpacerColspan]=\"3\"\n [tngTableVirtualSpacerSize]=\"virtualRef.beforeSize()\"\n ></tr>\n }\n\n @for (row of virtualRef.slice(rows()); track row.id) {\n <tr\n tngTableRow\n [attr.data-testid]=\"'virtual-row-' + row.id\"\n [tngTableRowId]=\"row.id\"\n >\n <td tngTableCell [tngTableColumnId]=\"'label'\">{{ row.label }}</td>\n <td tngTableCell [tngTableColumnId]=\"'status'\">{{ row.status }}</td>\n <td tngTableCell [tngTableColumnId]=\"'value'\">{{ row.value }}</td>\n </tr>\n }\n\n @if (virtualRef.afterSize() > 0) {\n <tr\n tngTableVirtualSpacer\n data-testid=\"virtual-bottom-spacer\"\n [tngTableVirtualSpacerColspan]=\"3\"\n [tngTableVirtualSpacerSize]=\"virtualRef.afterSize()\"\n ></tr>\n }\n </tbody>\n </table>\n </div>\n `,\n})\nexport class TableVirtualHarnessComponent {\n public readonly overscan = signal(0);\n public readonly rangeChanges = signal<readonly TngTableVirtualRange[]>([]);\n public readonly rowHeight = signal(40);\n public readonly rows = signal<readonly InteractiveTableRow[]>(\n Array.from({ length: 20 }, (_, index) => ({\n id: `row-${index}`,\n label: `Row ${index}`,\n status: index % 2 === 0 ? 'Ready' : 'Draft',\n value: index,\n })),\n );\n public readonly selectedIds = signal<readonly string[]>([]);\n public readonly stickyHeader = signal(false);\n public readonly viewportHeight = signal(120);\n\n @ViewChild('selectionRef')\n public selectionRef?: TngTableSelection;\n\n @ViewChild('virtualRef', { static: true })\n public virtualRef?: TngTableVirtual;\n\n public onSelectionChange(event: TngTableSelectionChange): void {\n this.selectedIds.set(event.selectedIds);\n }\n\n public onRangeChange(event: TngTableVirtualRange): void {\n this.rangeChanges.set([...this.rangeChanges(), event]);\n }\n}\n\n@Component({\n imports: [\n TngTable,\n TngTableHeader,\n TngTableBody,\n TngTableRow,\n TngTableHeaderCell,\n TngTableCell,\n ],\n template: `\n <button type=\"button\" data-testid=\"before\">Before</button>\n\n @if (showTable()) {\n <table tngTable data-testid=\"keyboard-table\">\n <thead tngTableHeader>\n <tr tngTableRow>\n <th\n tngTableHeaderCell\n [tngTableColumnId]=\"'label'\"\n data-testid=\"keyboard-cell-header-label\"\n >\n Label\n </th>\n <th\n tngTableHeaderCell\n [tngTableColumnId]=\"'status'\"\n data-testid=\"keyboard-cell-header-status\"\n >\n Status\n </th>\n <th\n tngTableHeaderCell\n [tngTableColumnId]=\"'value'\"\n data-testid=\"keyboard-cell-header-value\"\n >\n Value\n </th>\n </tr>\n </thead>\n\n <tbody tngTableBody>\n @for (row of rows(); track row.id) {\n <tr\n tngTableRow\n [tngTableRowDisabled]=\"row.disabled ?? false\"\n [tngTableRowId]=\"row.id\"\n >\n <td\n tngTableCell\n [attr.data-testid]=\"'keyboard-cell-' + row.id + '-label'\"\n [tngTableColumnId]=\"'label'\"\n >\n {{ row.label }}\n </td>\n <td\n tngTableCell\n [attr.data-testid]=\"'keyboard-cell-' + row.id + '-status'\"\n [tngTableColumnId]=\"'status'\"\n >\n {{ row.status }}\n </td>\n <td\n tngTableCell\n [attr.data-testid]=\"'keyboard-cell-' + row.id + '-value'\"\n [tngTableColumnId]=\"'value'\"\n >\n {{ row.value }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <button type=\"button\" data-testid=\"after\">After</button>\n `,\n})\nexport class TableKeyboardHarnessComponent {\n public readonly rows = signal<readonly InteractiveTableRow[]>([\n { id: 'alpha', label: 'Alpha', status: 'Ready', value: 1 },\n { disabled: true, id: 'beta', label: 'Beta', status: 'Blocked', value: 2 },\n { id: 'gamma', label: 'Gamma', status: 'Draft', value: 3 },\n ]);\n public readonly showTable = signal(true);\n\n @ViewChild(TngTable)\n public tableRef?: TngTable;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export * from './tng-table';
2
+ export * from './tng-table-render';
3
+ export * from './tng-table-sizing';
4
+ export * from './tng-table-sort';
5
+ export * from './tng-table-virtual';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/layout/table/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './tng-table';
2
+ export * from './tng-table-render';
3
+ export * from './tng-table-sizing';
4
+ export * from './tng-table-sort';
5
+ export * from './tng-table-virtual';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/layout/table/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC","sourcesContent":["export * from './tng-table';\nexport * from './tng-table-render';\nexport * from './tng-table-sizing';\nexport * from './tng-table-sort';\nexport * from './tng-table-virtual';\n"]}
@@ -0,0 +1,175 @@
1
+ import { TemplateRef } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export type TngTableCellTplContext<TRow = unknown, TValue = unknown, TColumnId extends string = string> = Readonly<{
4
+ $implicit: TValue;
5
+ columnId: TColumnId | null;
6
+ row: TRow;
7
+ rowId: string | null;
8
+ value: TValue;
9
+ }>;
10
+ export type TngTableHeaderTplContext<TColumnId extends string = string> = Readonly<{
11
+ $implicit: string;
12
+ columnId: TColumnId | null;
13
+ label: string;
14
+ }>;
15
+ export type TngTableFooterTplContext<TRow = unknown, TValue = unknown, TColumnId extends string = string> = Readonly<{
16
+ $implicit: TValue;
17
+ columnId: TColumnId | null;
18
+ items: readonly TRow[];
19
+ value: TValue;
20
+ }>;
21
+ export type TngTableCellFormatter<TRow = unknown, TValue = unknown, TColumnId extends string = string> = (value: TValue, context: TngTableCellTplContext<TRow, TValue, TColumnId>) => string;
22
+ export type TngTableFooterFormatter<TRow = unknown, TValue = unknown, TColumnId extends string = string> = (value: TValue, context: TngTableFooterTplContext<TRow, TValue, TColumnId>) => string;
23
+ export type TngTableIntlLocale = readonly string[] | string | undefined;
24
+ export type TngTableIntlFormatterOptions = Readonly<{
25
+ date?: Intl.DateTimeFormatOptions;
26
+ locale?: TngTableIntlLocale;
27
+ number?: Intl.NumberFormatOptions;
28
+ }>;
29
+ type TngTableValueFormatter<TContext> = (value: unknown, context: TContext) => string;
30
+ export declare function resolveTngTableTextContent(value: unknown): string;
31
+ export declare function createTngTableIntlNumberFormatter<TContext = unknown>(locale?: TngTableIntlLocale, options?: Intl.NumberFormatOptions): TngTableValueFormatter<TContext>;
32
+ export declare function createTngTableIntlDateFormatter<TContext = unknown>(locale?: TngTableIntlLocale, options?: Intl.DateTimeFormatOptions): TngTableValueFormatter<TContext>;
33
+ export declare function createTngTableIntlFormatter<TContext = unknown>(options?: TngTableIntlFormatterOptions): TngTableValueFormatter<TContext>;
34
+ export declare class TngTableCellTpl<TRow = unknown, TValue = unknown, TColumnId extends string = string> {
35
+ readonly tpl: TemplateRef<Readonly<{
36
+ $implicit: TValue;
37
+ columnId: TColumnId | null;
38
+ row: TRow;
39
+ rowId: string | null;
40
+ value: TValue;
41
+ }>>;
42
+ static ɵfac: i0.ɵɵFactoryDeclaration<TngTableCellTpl<any, any, any>, never>;
43
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TngTableCellTpl<any, any, any>, "ng-template[tngTableCellTpl]", ["tngTableCellTpl"], {}, {}, never, never, true, never>;
44
+ }
45
+ export declare class TngTableHeaderTpl<TColumnId extends string = string> {
46
+ readonly tpl: TemplateRef<Readonly<{
47
+ $implicit: string;
48
+ columnId: TColumnId | null;
49
+ label: string;
50
+ }>>;
51
+ static ɵfac: i0.ɵɵFactoryDeclaration<TngTableHeaderTpl<any>, never>;
52
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TngTableHeaderTpl<any>, "ng-template[tngTableHeaderTpl]", ["tngTableHeaderTpl"], {}, {}, never, never, true, never>;
53
+ }
54
+ export declare class TngTableFooterTpl<TRow = unknown, TValue = unknown, TColumnId extends string = string> {
55
+ readonly tpl: TemplateRef<Readonly<{
56
+ $implicit: TValue;
57
+ columnId: TColumnId | null;
58
+ items: readonly TRow[];
59
+ value: TValue;
60
+ }>>;
61
+ static ɵfac: i0.ɵɵFactoryDeclaration<TngTableFooterTpl<any, any, any>, never>;
62
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TngTableFooterTpl<any, any, any>, "ng-template[tngTableFooterTpl]", ["tngTableFooterTpl"], {}, {}, never, never, true, never>;
63
+ }
64
+ export declare class TngTableCellOutlet<TRow = unknown, TValue = unknown, TColumnId extends string = string> {
65
+ readonly columnId: import("@angular/core").InputSignalWithTransform<TColumnId | null, unknown>;
66
+ readonly formatter: import("@angular/core").InputSignal<TngTableCellFormatter<TRow, TValue | null, TColumnId> | null>;
67
+ readonly row: import("@angular/core").InputSignal<TRow | null>;
68
+ readonly rowId: import("@angular/core").InputSignalWithTransform<string | null, unknown>;
69
+ readonly template: import("@angular/core").InputSignal<TemplateRef<Readonly<{
70
+ $implicit: TValue | null;
71
+ columnId: TColumnId | null;
72
+ row: TRow;
73
+ rowId: string | null;
74
+ value: TValue | null;
75
+ }>> | TngTableCellTpl<TRow, TValue | null, TColumnId> | null>;
76
+ readonly value: import("@angular/core").InputSignal<TValue | null>;
77
+ protected readonly context: import("@angular/core").Signal<Readonly<{
78
+ $implicit: TValue | null;
79
+ columnId: TColumnId | null;
80
+ row: TRow;
81
+ rowId: string | null;
82
+ value: TValue | null;
83
+ }>>;
84
+ protected readonly renderState: import("@angular/core").Signal<Readonly<{
85
+ error: Readonly<{
86
+ thrown: unknown;
87
+ }> | null;
88
+ text: string;
89
+ context: Readonly<{
90
+ $implicit: TValue | null;
91
+ columnId: TColumnId | null;
92
+ row: TRow;
93
+ rowId: string | null;
94
+ value: TValue | null;
95
+ }>;
96
+ }>>;
97
+ protected readonly resolvedTemplate: import("@angular/core").Signal<TemplateRef<Readonly<{
98
+ $implicit: TValue | null;
99
+ columnId: TColumnId | null;
100
+ row: TRow;
101
+ rowId: string | null;
102
+ value: TValue | null;
103
+ }>> | null>;
104
+ protected get dataFormatErrorAttr(): '' | null;
105
+ protected readonly dataSlot: "table-cell-outlet";
106
+ getFormatError(): unknown;
107
+ static ɵfac: i0.ɵɵFactoryDeclaration<TngTableCellOutlet<any, any, any>, never>;
108
+ static ɵcmp: i0.ɵɵComponentDeclaration<TngTableCellOutlet<any, any, any>, "tng-table-cell-outlet", ["tngTableCellOutlet"], { "columnId": { "alias": "columnId"; "required": false; "isSignal": true; }; "formatter": { "alias": "formatter"; "required": false; "isSignal": true; }; "row": { "alias": "row"; "required": false; "isSignal": true; }; "rowId": { "alias": "rowId"; "required": false; "isSignal": true; }; "template": { "alias": "template"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
109
+ }
110
+ export declare class TngTableHeaderOutlet<TColumnId extends string = string> {
111
+ readonly columnId: import("@angular/core").InputSignalWithTransform<TColumnId | null, unknown>;
112
+ readonly label: import("@angular/core").InputSignalWithTransform<string | null, unknown>;
113
+ readonly template: import("@angular/core").InputSignal<TemplateRef<Readonly<{
114
+ $implicit: string;
115
+ columnId: TColumnId | null;
116
+ label: string;
117
+ }>> | TngTableHeaderTpl<TColumnId> | null>;
118
+ protected readonly labelText: import("@angular/core").Signal<string>;
119
+ protected readonly context: import("@angular/core").Signal<Readonly<{
120
+ $implicit: string;
121
+ columnId: TColumnId | null;
122
+ label: string;
123
+ }>>;
124
+ protected readonly resolvedTemplate: import("@angular/core").Signal<TemplateRef<Readonly<{
125
+ $implicit: string;
126
+ columnId: TColumnId | null;
127
+ label: string;
128
+ }>> | null>;
129
+ protected readonly dataSlot: "table-header-outlet";
130
+ static ɵfac: i0.ɵɵFactoryDeclaration<TngTableHeaderOutlet<any>, never>;
131
+ static ɵcmp: i0.ɵɵComponentDeclaration<TngTableHeaderOutlet<any>, "tng-table-header-outlet", ["tngTableHeaderOutlet"], { "columnId": { "alias": "columnId"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "template": { "alias": "template"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
132
+ }
133
+ export declare class TngTableFooterOutlet<TRow = unknown, TValue = unknown, TColumnId extends string = string> {
134
+ readonly columnId: import("@angular/core").InputSignalWithTransform<TColumnId | null, unknown>;
135
+ readonly formatter: import("@angular/core").InputSignal<TngTableFooterFormatter<TRow, TValue | null, TColumnId> | null>;
136
+ readonly items: import("@angular/core").InputSignal<readonly TRow[]>;
137
+ readonly template: import("@angular/core").InputSignal<TemplateRef<Readonly<{
138
+ $implicit: TValue | null;
139
+ columnId: TColumnId | null;
140
+ items: readonly TRow[];
141
+ value: TValue | null;
142
+ }>> | TngTableFooterTpl<TRow, TValue | null, TColumnId> | null>;
143
+ readonly value: import("@angular/core").InputSignal<TValue | null>;
144
+ protected readonly context: import("@angular/core").Signal<Readonly<{
145
+ $implicit: TValue | null;
146
+ columnId: TColumnId | null;
147
+ items: readonly TRow[];
148
+ value: TValue | null;
149
+ }>>;
150
+ protected readonly renderState: import("@angular/core").Signal<Readonly<{
151
+ error: Readonly<{
152
+ thrown: unknown;
153
+ }> | null;
154
+ text: string;
155
+ context: Readonly<{
156
+ $implicit: TValue | null;
157
+ columnId: TColumnId | null;
158
+ items: readonly TRow[];
159
+ value: TValue | null;
160
+ }>;
161
+ }>>;
162
+ protected readonly resolvedTemplate: import("@angular/core").Signal<TemplateRef<Readonly<{
163
+ $implicit: TValue | null;
164
+ columnId: TColumnId | null;
165
+ items: readonly TRow[];
166
+ value: TValue | null;
167
+ }>> | null>;
168
+ protected get dataFormatErrorAttr(): '' | null;
169
+ protected readonly dataSlot: "table-footer-outlet";
170
+ getFormatError(): unknown;
171
+ static ɵfac: i0.ɵɵFactoryDeclaration<TngTableFooterOutlet<any, any, any>, never>;
172
+ static ɵcmp: i0.ɵɵComponentDeclaration<TngTableFooterOutlet<any, any, any>, "tng-table-footer-outlet", ["tngTableFooterOutlet"], { "columnId": { "alias": "columnId"; "required": false; "isSignal": true; }; "formatter": { "alias": "formatter"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "template": { "alias": "template"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
173
+ }
174
+ export {};
175
+ //# sourceMappingURL=tng-table-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-table-render.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/layout/table/tng-table-render.ts"],"names":[],"mappings":"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"}