dap-design-system 0.63.0 → 1.0.0-beta.2

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.
@@ -228,7 +228,7 @@ export default class DapDSDataTable<T> extends DdsElement {
228
228
  columnSizing?: Record<string, number>;
229
229
  /** @ignore */
230
230
  private _columnSizing;
231
- /** ID of element labeling the table */
231
+ /** Accessible name of the table (its `aria-label`). Defaults to a translated table description. */
232
232
  ariaLabel: string | null;
233
233
  /** @ignore */
234
234
  private resizeObserver?;
@@ -1 +1 @@
1
- {"version":3,"file":"datatable.component.js","sources":["../../../src/components/datatable/datatable.component.ts"],"sourcesContent":["import {\n Cell,\n ColumnDef,\n flexRender,\n getCoreRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n Header,\n PaginationState,\n Row,\n RowData,\n RowSelectionState,\n SortingState,\n Table,\n TableController,\n} from '@tanstack/lit-table'\n// Extended column definition with textAlign property\nexport type ExtendedColumnDef<T> = ColumnDef<T, unknown> & {\n textAlign?: string\n headerTextAlign?: string\n disableDefaultSorting?: boolean\n /**\n * Pins the column to the left or right edge of the horizontally scrolling\n * viewport, so it stays visible while the other columns scroll under it.\n * Give a pinned column an explicit `size` — its width is what positions the\n * next column pinned to the same side. Columns pinned to one side stack in\n * DOM order out from that edge.\n */\n sticky?: 'left' | 'right'\n}\n\nimport clsx from 'clsx'\nimport { nothing, PropertyValueMap, unsafeCSS } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { html, unsafeStatic } from 'lit/static-html.js'\n\nimport { DdsElement } from '@/internal/dds-hu-element'\nimport { t } from '@/localization/localization'\n\nimport DapDSCheckbox from '../checkbox/checkbox.component'\nimport { IconSize } from '../icon/icon.component'\nimport ArrowsArrowDownSLine from '../icons/arrows/arrows-arrow-down-s-line/arrows-arrow-down-s-line.component'\nimport ArrowsArrowUpSLine from '../icons/arrows/arrows-arrow-up-s-line/arrows-arrow-up-s-line.component'\nimport DapDSPager from '../pager/pager.component'\nimport DapDSSkeleton from '../skeleton/skeleton.component'\nimport { SpinnerVariant } from '../spinner/spinner.component'\nimport DapDSSpinner from '../spinner/spinner.component'\nimport styles from './datatable.scss?inline'\nimport { renderCellContent } from './utils/cell-renderer'\n\nconst MULTISELECT_COLUMN_ID = '__multiSelect__'\n// Narrowest width a column can be dragged to when its definition sets no minSize\nconst DEFAULT_RESIZE_MIN_SIZE = 40\n// Width an auto-sized column (no size/minSize) contributes to the table's\n// min-width, so it is not squeezed to nothing when sized columns overflow\nconst AUTO_COLUMN_MIN_WIDTH = 100\n// Pixels a column grows or shrinks per arrow-key press on its resize handle\nconst RESIZE_KEYBOARD_STEP = 10\n\n// Type alias for sort state\ntype SortState = false | 'asc' | 'desc'\ntype LoadingType = 'spinner' | 'skeleton'\n\n/**\n * `dap-ds-datatable`\n * @summary A data table is a component that displays data in a tabular format.\n * @element dap-ds-datatable\n * @title - Data table\n * @generic T\n *\n * @event {{ sorting: SortingState }} dds-sorting-change - Fired when the sorting of the table changes.\n * @event {{ selection: RowSelectionState }} dds-selection-change - Fired when the selection of the table changes.\n * @event {{ pagination: PaginationState }} dds-pagination-change - Fired when the pagination of the table changes.\n * @event {{ row: Row<T> }} dds-row-click - Fired when a row is clicked.\n * @event {{ columnSizing: Record<string, number> }} dds-column-sizing-change - Fired when the user resizes a column (at the end of a drag, on each resize-handle key press, and when a double-click resets the column).\n *\n * @slot loading - The loading content of the table.\n * @slot empty - The empty content of the table.\n *\n * @csspart base - The main table container.\n * @csspart header - The header of the table.\n * @csspart header-row - The header row of the table.\n * @csspart header-cell - All cells of the header.\n * @csspart resize-handle - The column resize handle at the right edge of a resizable header cell.\n * @csspart body - The body of the table.\n * @csspart empty - The empty content of the table.\n * @csspart loading - The loading content of the table.\n * @csspart row - All rows of the table.\n * @csspart cell - All cells of the table.\n * @csspart pager - The pager of the table.\n * @csspart pager-base - The base of the pager.\n * @csspart pager-first - The first button of the pager.\n * @csspart pager-previous - The previous button of the pager.\n * @csspart pager-next - The next button of the pager.\n * @csspart pager-last - The last button of the pager.\n * @csspart pager-page-size-select - The page size select of the pager.\n * @csspart content - The content container of the table.\n * @csspart page-size-select-base - The base of the pager page size select.\n * @csspart page-size-select-trigger - The trigger of the pager page size select.\n * @csspart pager-button-first-base - The base of the pager first button.\n * @csspart pager-button-first-content - The content of the pager first button.\n * @csspart pager-button-previous-base - The base of the pager previous button.\n * @csspart pager-button-previous-content - The content of the pager previous button.\n * @csspart pager-button-next-base - The base of the pager next button.\n * @csspart pager-button-next-content - The content of the pager next button.\n * @csspart pager-button-last-base - The base of the pager last button.\n * @csspart pager-button-last-content - The content of the pager last button.\n * @csspart pager-page-numbers - The page numbers container of the pager.\n * @csspart pager-page-number - The page number buttons of the pager.\n * @csspart pager-page-number-active - The active page number button of the pager.\n * @csspart pager-page-number-base - The base of the pager page number buttons.\n * @csspart pager-page-number-content - The content of the pager page number buttons.\n * @csspart pager-page-info - The page info text of the pager.\n *\n * @cssproperty --dds-datatable-bg-color - Background color of the table. (default: var(--dds-background-neutral-subtle)).\n * @cssproperty --dds-datatable-border-color - Border color of the table cells. (default: var(--dds-border-neutral-divider))\n * @cssproperty --dds-datatable-header-bg-color - Background color of the table header. (default: var(--dds-background-neutral-subtle))\n * @cssproperty --dds-datatable-header-text-color - Text color of the table header. (default: var(--dds-text-neutral-strong))\n * @cssproperty --dds-datatable-row-hover-bg-color - Background color of hovered rows. (default: var(--dds-background-brand-strong))\n * @cssproperty --dds-datatable-row-selected-bg-color - Background color of selected rows. (default: var(--dds-background-brand-strong))\n * @cssproperty --dds-datatable-cell-padding - Padding of table cells. (default: var(--dds-spacing-200))\n * @cssproperty --dds-datatable-header-padding - Padding of header cells. (default: var(--dds-spacing-200))\n * @cssproperty --dds-datatable-last-column-padding - Padding of the last column. (default: var(--dds-spacing-500))\n * @cssproperty --dds-datatable-first-column-padding - Padding of the first column. (default: var(--dds-spacing-500))\n * @cssproperty --dds-datatable-border-width - Width of table borders. (default: var(--dds-border-width-base))\n * @cssproperty --dds-datatable-outer-border-width - Width of the outer container border only. (default: var(--dds-datatable-border-width))\n * @cssproperty --dds-datatable-header-border-width - Width of the header row bottom border only. (default: var(--dds-datatable-border-width))\n * @cssproperty --dds-datatable-row-border-width - Width of the row (body cell) bottom borders only. (default: var(--dds-datatable-border-width))\n * @cssproperty --dds-datatable-stripe-color - Background color for striped rows. (default: var(--dds-background-neutral-base))\n * @cssproperty --dds-datatable-border-radius - Border radius of the table. (default: var(--dds-radius-base))\n * @cssproperty --dds-datatable-shadow - Box shadow of the table. (default: none)\n * @cssproperty --dds-datatable-transition-duration - Duration of hover/selection transitions. (default: 0.2s)\n * @cssproperty --dds-datatable-z-index - Z-index of the table. (default: 1)\n * @cssproperty --dds-datatable-min-height - Minimum height of the table. (default: auto)\n * @cssproperty --dds-datatable-max-height - Maximum height of the table. (default: none)\n * @cssproperty --dds-datatable-overflow-x - Horizontal overflow behavior. (default: auto)\n * @cssproperty --dds-datatable-overflow-y - Vertical overflow behavior. (default: auto)\n * @cssproperty --dds-datatable-resize-handle-color - Color of the column resize indicator line on hover, focus and drag. (default: var(--dds-border-brand-base))\n */\nexport default class DapDSDataTable<T> extends DdsElement {\n static tagName = 'dap-ds-datatable'\n\n static dependencies = {\n 'dap-ds-checkbox': DapDSCheckbox,\n 'dap-ds-icon-arrow-up-s-line': ArrowsArrowUpSLine,\n 'dap-ds-icon-arrow-down-s-line': ArrowsArrowDownSLine,\n 'dap-ds-skeleton': DapDSSkeleton,\n 'dap-ds-spinner': DapDSSpinner,\n 'dap-ds-pager': DapDSPager,\n }\n\n static readonly styles = unsafeCSS(styles)\n\n private readonly tableController = new TableController<T>(this)\n\n // Pinned columns, recomputed each render: column id -> the edge it is pinned\n // to and the pixel offset from that edge. The offset accumulates the widths of\n // the columns pinned to the same side, so several pinned columns line up\n // instead of overlapping. Read by renderHeaderCell / renderBody.\n private stickyOffsets = new Map<\n string,\n { side: 'left' | 'right'; offset: number }\n >()\n\n /** Data to display in the table */\n @property({ attribute: false }) data: RowData[] = []\n /** Columns to display in the table */\n @property({ attribute: false }) columns: ExtendedColumnDef<T>[] = []\n\n /** Row key to use for row selection, this should be a unique key for each row */\n @property() rowKey: string = 'id'\n\n /** Enable row selection on the table, can be a boolean or a function that returns a boolean\n * @type {boolean | ((row: Row<T>) => boolean)}\n */\n @property({ type: Boolean }) enableRowSelection:\n | boolean\n | ((row: Row<T>) => boolean) = false\n /** Pin the built-in row-selection (checkbox) column to the left edge, so it\n * stays visible while the other columns scroll horizontally under it. */\n @property({ type: Boolean }) stickySelectionColumn: boolean = false\n /** Enable sorting on the table */\n @property({ type: Boolean }) enableSorting: boolean = false\n /** Let the user resize columns by dragging (or arrow-keying) a handle at the\n * right edge of each header cell. A column opts out with `enableResizing: false`\n * in its definition; `minSize` / `maxSize` bound the width. Read the result from\n * `dds-column-sizing-change` and pass it back through `columnSizing` to restore it. */\n @property({ type: Boolean }) enableColumnResizing: boolean = false\n /** Enable manual sorting on the table */\n @property({ type: Boolean }) manualSorting: boolean = false\n /** Enables manual pagination. If this option is set to true, the table will not automatically paginate rows and instead will expect you to manually paginate the rows before passing them to the table. This is useful if you are doing server-side pagination and aggregation. */\n @property({ type: Boolean }) manualPagination: boolean = false\n /** If set to true, pagination will be reset to the first page when page-altering state changes eg. data is updated, filters change, grouping changes, etc. This behavior is automatically disabled when manualPagination is true but it can be overridden by explicitly assigning a boolean value to the autoResetPageIndex table option. */\n @property({ type: Boolean }) autoResetPageIndex: boolean = false\n\n /** Enable row click on the table */\n @property({ type: Boolean }) enableRowClick: boolean = false\n\n /** Loading state of the table */\n @property({ type: Boolean }) loading: boolean = false\n\n /** Whether to enable striped rows */\n @property({ type: Boolean }) enableStripedRows: boolean = false\n\n /** Number of rows in the table */\n @property({ type: Number }) rowCount?: number\n\n /** Caption text for the table */\n @property({ type: String }) caption?: string\n\n /** The type of loading to use\n * @type {'spinner' | 'skeleton'}\n */\n @property({ type: String }) loadingType: LoadingType = 'spinner'\n\n /**\n * The variant of the spinner. Only used if loadingType is 'spinner'.\n * @type {\"neutral\" | \"brand\" | \"negative\" | \"positive\" | \"inverted\"}\n */\n @property({ type: String, reflect: true }) loadingVariant: SpinnerVariant =\n 'neutral'\n\n /**\n * The size of the spinner. Only used if loadingType is 'spinner'.\n * @type {\"xxl\" | \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\"}\n */\n @property({ type: String, reflect: true }) loadingSize: IconSize = 'lg'\n /** The size of the spinner in pixels. This overrides the size attribute. Only used if loadingType is 'spinner'. */\n @property({ type: Number }) loadingStaticSize?: number\n /** The loading text. Only used if loadingType is 'spinner'. */\n @property({ type: String }) loadingText: string\n\n /** The text to display when the table is empty. */\n @property({ type: String }) emptyText: string\n\n /** Whether to disable the header when the table is empty.\n * @type {'true' | 'false'}\n */\n @property({ type: String }) disableHeaderOnEmpty: string = 'true'\n\n /** Whether to show the pager component when the table is empty. */\n @property({ type: Boolean }) showPagerOnEmpty: boolean = false\n\n /** Whether to show the pager component */\n @property({ type: Boolean }) pager: boolean = false\n\n /** Show the page size options. */\n @property({ type: String }) showPageSizeOptions = 'true'\n /** Show the page index. */\n @property({ type: String }) showPageIndex = 'true'\n /** Show the page count. */\n @property({ type: String }) showPageCount = 'true'\n /** Show the first button. */\n @property({ type: String }) showFirstButton = 'true'\n /** Show the previous button. */\n @property({ type: String }) showPreviousButton = 'true'\n /** Show the next button. */\n @property({ type: String }) showNextButton = 'true'\n /** Show the last button. */\n @property({ type: String }) showLastButton = 'true'\n /** Show numbered page buttons between the previous and next buttons. */\n @property({ type: String }) showPageNumbers = 'false'\n /** How many page numbers to show on each side of the current page. */\n @property({ type: Number }) siblingCount = 1\n\n /** The label of the first button */\n @property({ type: String }) firstButtonLabel: string\n\n /** The label of the previous button */\n @property({ type: String }) previousButtonLabel: string\n\n /** The label of the next button */\n @property({ type: String }) nextButtonLabel: string\n\n /** The label of the last button */\n @property({ type: String }) lastButtonLabel: string\n\n /** `data-testid` for the column sort-toggle button. Suffixed with the column id. */\n @property() sortButtonTestId = 'datatable-sort-button'\n\n /** The function to determine the pager text\n * @type {(pageIndex: number, pageSize: number, totalRows: number) => string}\n */\n @property({ attribute: false }) pageStateText: (\n pageIndex: number,\n pageSize: number,\n totalRows: number,\n ) => string\n\n /** Available page size options for the pager\n * @type {number[]}\n */\n @property({ type: Array }) pageSizeOptions: number[] = [10, 25, 50, 100]\n\n /** Sorting state of the table */\n @property({ type: Array }) sorting: SortingState\n /** @ignore */\n @state() private _sorting: SortingState = []\n\n /** Selection state of the table */\n @property({ type: Object }) rowSelection: RowSelectionState\n /** @ignore */\n @state() private _rowSelection: RowSelectionState = {}\n\n /** Pagination state of the table */\n @property({ type: Object }) pagination: PaginationState\n /** @ignore */\n @state() private _pagination: PaginationState = {\n pageIndex: 0,\n pageSize: 10,\n }\n\n /** Column sizing state of the table: column id -> width in pixels. Overrides the\n * column definition's `size`; columns missing from it keep their defined width. */\n @property({ type: Object }) columnSizing?: Record<string, number>\n /** @ignore */\n @state() private _columnSizing: Record<string, number> = {}\n\n /** ID of element labeling the table */\n @property({ type: String }) ariaLabel: string | null = null\n\n /** @ignore */\n private resizeObserver?: ResizeObserver\n\n /** @ignore */\n private get isTableEmpty(): boolean {\n // When using manual pagination with rowCount, check rowCount instead of data length\n if (this.manualPagination && this.rowCount !== undefined) {\n return this.rowCount === 0\n }\n return !this.data || this.data.length === 0\n }\n\n /** @ignore */\n private get shouldDisableHeaderActions(): boolean {\n return this.disableHeaderOnEmpty === 'true' && this.isTableEmpty\n }\n\n /** @ignore */\n @state() private readonly _statusMessage: string = ''\n\n /** @ignore */\n @property({ type: Boolean }) debug = false\n\n protected firstUpdated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.firstUpdated(_changedProperties)\n\n if (this.sorting) {\n this._sorting = this.sorting\n }\n\n if (this.rowSelection) {\n this._rowSelection = this.rowSelection\n }\n\n if (this.pagination) {\n this._pagination = this.pagination\n } else if (this.pageSizeOptions && this.pageSizeOptions.length > 0) {\n // If pagination is not explicitly set, use the first item in pageSizeOptions as default\n this._pagination = {\n ...this._pagination,\n pageSize: this.pageSizeOptions[0],\n }\n }\n }\n\n // Synced before render (not in updated()) so restored widths paint in the same\n // frame instead of one render late\n protected willUpdate(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.willUpdate(_changedProperties)\n\n if (_changedProperties.has('columnSizing')) {\n this._columnSizing = this.columnSizing ?? {}\n }\n }\n\n protected updated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.updated(_changedProperties)\n\n if (_changedProperties.has('pagination')) {\n this._pagination = this.pagination\n }\n\n if (_changedProperties.has('sorting')) {\n this._sorting = this.sorting\n }\n\n if (\n _changedProperties.has('rowSelection') ||\n _changedProperties.has('rowselection')\n ) {\n this._rowSelection = this.rowSelection\n }\n\n if (_changedProperties.has('data')) {\n this.requestUpdate()\n }\n }\n\n /**\n * Cleanup resize observer\n */\n disconnectedCallback(): void {\n super.disconnectedCallback()\n if (this.resizeObserver) {\n this.resizeObserver.disconnect()\n this.resizeObserver = undefined\n }\n }\n\n private readonly columnsMemo = () => {\n // Process columns to prevent TanStack Table's default 150px width\n // Set minSize: 0 for columns without explicit sizes so they default to 'auto' in colgroup\n const processedColumns = this.columns.map(col => {\n // If column has no size specified, set minSize to 0 to prevent default 150px\n if (!col.size && !col.minSize && !col.maxSize) {\n return { ...col, minSize: 0 }\n }\n return col\n })\n\n return [\n ...(this.enableRowSelection &&\n this.columns[0] &&\n this.columns[0].id !== MULTISELECT_COLUMN_ID\n ? [\n {\n id: MULTISELECT_COLUMN_ID,\n accessorKey: MULTISELECT_COLUMN_ID,\n enableSorting: false,\n enableResizing: false,\n size: 50,\n maxSize: 50,\n ...(this.stickySelectionColumn\n ? { sticky: 'left' as const }\n : {}),\n header: ({ table }: { table: Table<T> }) =>\n html`<dap-ds-checkbox\n isIndeterminate=${table.getIsSomeRowsSelected()}\n @dds-change=${table.getToggleAllRowsSelectedHandler()}\n .checked=\"${table.getIsAllRowsSelected()}\"\n .indeterminate=\"${table.getIsSomeRowsSelected()}\"\n ?disabled=\"${this.disableHeaderOnEmpty === 'true' &&\n this.isTableEmpty}\"></dap-ds-checkbox>`,\n cell: ({ row }: { row: any }) =>\n html`<dap-ds-checkbox\n @dds-change=\"${row.getToggleSelectedHandler()}\"\n .checked=\"${row.getIsSelected()}\"\n ?disabled=\"${!row.getCanSelect()}\"\n .indeterminate=\"${row.getIsSomeSelected()}\"></dap-ds-checkbox>`,\n },\n ]\n : []),\n ...processedColumns,\n ]\n }\n\n // Walks the visible leaf columns from each edge inward, giving every pinned\n // column its offset (the summed width of the already-seen pinned columns on\n // that side). getSize() resolves to the column's `size`, so a pinned column\n // without a size contributes 0 and the next one on that side would overlap it.\n private computeStickyOffsets(table: Table<T>) {\n const offsets = new Map<\n string,\n { side: 'left' | 'right'; offset: number }\n >()\n const columns = table.getVisibleLeafColumns()\n\n let right = 0\n for (let i = columns.length - 1; i >= 0; i--) {\n const column = columns[i]\n if ((column.columnDef as ExtendedColumnDef<T>).sticky === 'right') {\n offsets.set(column.id, { side: 'right', offset: right })\n right += column.getSize()\n }\n }\n\n let left = 0\n for (const column of columns) {\n if ((column.columnDef as ExtendedColumnDef<T>).sticky === 'left') {\n offsets.set(column.id, { side: 'left', offset: left })\n left += column.getSize()\n }\n }\n\n this.stickyOffsets = offsets\n }\n\n // Inline sticky positioning for a pinned column. z-index lifts the cell above\n // the row cells scrolling under it (needed for a left-pinned column, whose\n // siblings paint after it). The opaque background and edge divider come from\n // the `--sticky-*` classes in the stylesheet.\n private getStickyStyle(columnId: string): string | undefined {\n const sticky = this.stickyOffsets.get(columnId)\n if (!sticky) return undefined\n return `position: sticky; ${sticky.side}: ${sticky.offset}px; z-index: 1;`\n }\n\n private renderHeaderCell(\n header: Header<T, unknown>,\n _isLastColumn: boolean = false,\n ) {\n const columnDef = header.column.columnDef as ExtendedColumnDef<T>\n const canSort = header.column.getCanSort()\n const isSorted = header.column.getIsSorted()\n const nextSortOrder = header.column.getNextSortingOrder()\n const disableDefaultSorting = columnDef.disableDefaultSorting ?? false\n\n const sticky = this.stickyOffsets.get(header.column.id)\n const headerStyle =\n [this.getHeaderCellStyle(header), this.getStickyStyle(header.column.id)]\n .filter(Boolean)\n .join(' ') || undefined\n const contentStyle = columnDef.headerTextAlign\n ? `justify-content: ${columnDef.headerTextAlign};`\n : undefined\n\n const sortIcon = this.getSortIcon(isSorted)\n const sortTitle = this.getSortTitle(canSort, nextSortOrder)\n const canResize = this.getCanResize(header)\n\n return html`\n <th\n colspan=\"${header.colSpan}\"\n rowspan=\"${header.rowSpan}\"\n part=\"header-cell\"\n id=\"${this.getHeaderCellId(header.column.id)}\"\n class=${clsx(\n 'data-table-header-cell',\n sticky && `data-table-header-cell--sticky-${sticky.side}`,\n canResize && 'data-table-header-cell--resizable',\n )}\n scope=\"col\"\n aria-sort=${canSort && !this.shouldDisableHeaderActions\n ? this.getAriaSortValue(isSorted)\n : 'none'}\n style=\"${ifDefined(headerStyle)}\">\n ${this.renderHeaderCellContent(\n header,\n columnDef,\n canSort,\n disableDefaultSorting,\n sortTitle,\n contentStyle,\n sortIcon,\n )}\n ${canResize ? this.renderResizeHandle(header) : nothing}\n </th>\n `\n }\n\n private getHeaderCellId(columnId: string): string {\n return `data-table-header-${columnId}`\n }\n\n private getCanResize(header: Header<T, unknown>): boolean {\n const columnDef = header.column.columnDef as ExtendedColumnDef<T>\n return (\n this.enableColumnResizing &&\n header.colSpan === 1 &&\n header.column.id !== MULTISELECT_COLUMN_ID &&\n columnDef.enableResizing !== false\n )\n }\n\n private getResizeBounds(header: Header<T, unknown>) {\n const { minSize, maxSize } = header.column.columnDef\n return {\n min: minSize || DEFAULT_RESIZE_MIN_SIZE,\n max: maxSize && maxSize < Number.MAX_SAFE_INTEGER ? maxSize : undefined,\n }\n }\n\n // A resize steps from the column's nominal width (its resized width, else its\n // defined size), not the rendered one: a fixed-layout table narrower than its\n // container stretches every column, and feeding that stretch back in would\n // make each step overshoot. Only an `auto` column has no nominal width, so it\n // starts from what is on screen.\n private getStartWidth(\n header: Header<T, unknown>,\n handle: HTMLElement,\n ): number {\n const nominal =\n this._columnSizing[header.column.id] ?? header.column.columnDef.size\n if (nominal) return nominal\n const cell = handle.closest('th')\n return cell?.getBoundingClientRect().width || header.column.getSize()\n }\n\n private setColumnWidth(header: Header<T, unknown>, width: number) {\n const { min, max } = this.getResizeBounds(header)\n const clamped = Math.round(\n Math.min(Math.max(width, min), max ?? Number.POSITIVE_INFINITY),\n )\n if (this._columnSizing[header.column.id] === clamped) return false\n this._columnSizing = { ...this._columnSizing, [header.column.id]: clamped }\n return true\n }\n\n private emitColumnSizingChange() {\n this.emit('dds-column-sizing-change', {\n columnSizing: { ...this._columnSizing },\n })\n }\n\n private handleResizePointerDown(e: PointerEvent, header: Header<T, unknown>) {\n if (e.button !== 0) return\n e.preventDefault()\n e.stopPropagation()\n\n const handle = e.currentTarget as HTMLElement\n const startX = e.clientX\n const startWidth = this.getStartWidth(header, handle)\n let changed = false\n\n // Capture keeps hover effects off the cells the pointer crosses; the drag\n // itself listens on window, so it also survives when capture is refused\n // (e.g. a pointer id that is no longer active).\n try {\n handle.setPointerCapture(e.pointerId)\n } catch {\n // window listeners below still track the drag\n }\n this.toggleAttribute('resizing', true)\n\n const onMove = (moveEvent: PointerEvent) => {\n changed =\n this.setColumnWidth(header, startWidth + moveEvent.clientX - startX) ||\n changed\n }\n const onEnd = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onEnd)\n window.removeEventListener('pointercancel', onEnd)\n this.toggleAttribute('resizing', false)\n if (changed) this.emitColumnSizingChange()\n }\n\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onEnd)\n window.addEventListener('pointercancel', onEnd)\n }\n\n private handleResizeKeydown(e: KeyboardEvent, header: Header<T, unknown>) {\n const { min, max } = this.getResizeBounds(header)\n const current = this.getStartWidth(header, e.currentTarget as HTMLElement)\n const targets: Record<string, number | undefined> = {\n ArrowLeft: current - RESIZE_KEYBOARD_STEP,\n ArrowRight: current + RESIZE_KEYBOARD_STEP,\n Home: min,\n End: max,\n }\n if (!(e.key in targets)) return\n e.preventDefault()\n e.stopPropagation()\n\n const target = targets[e.key]\n if (target !== undefined && this.setColumnWidth(header, target)) {\n this.emitColumnSizingChange()\n }\n }\n\n // Double-click drops the override, so the column falls back to its defined size\n private handleResizeReset(e: MouseEvent, header: Header<T, unknown>) {\n e.preventDefault()\n e.stopPropagation()\n if (!(header.column.id in this._columnSizing)) return\n const { [header.column.id]: _removed, ...rest } = this._columnSizing\n this._columnSizing = rest\n this.emitColumnSizingChange()\n }\n\n // A focusable splitter (WAI-ARIA window splitter pattern): drag with the\n // pointer, ArrowLeft/ArrowRight to step, Home/End for the bounds. It is a\n // sibling of the sort button, so its clicks never toggle sorting.\n private renderResizeHandle(header: Header<T, unknown>) {\n const { min, max } = this.getResizeBounds(header)\n const width = Math.round(\n this._columnSizing[header.column.id] ?? header.column.getSize(),\n )\n\n return html`<div\n part=\"resize-handle\"\n class=\"data-table-resize-handle\"\n role=\"separator\"\n tabindex=\"0\"\n aria-orientation=\"vertical\"\n aria-labelledby=\"data-table-resize-label ${this.getHeaderCellId(\n header.column.id,\n )}\"\n aria-valuenow=${width}\n aria-valuemin=${min}\n aria-valuemax=${ifDefined(max)}\n @pointerdown=${(e: PointerEvent) =>\n this.handleResizePointerDown(e, header)}\n @keydown=${(e: KeyboardEvent) => this.handleResizeKeydown(e, header)}\n @dblclick=${(e: MouseEvent) => this.handleResizeReset(e, header)}\n @click=${(e: MouseEvent) => e.stopPropagation()}></div>`\n }\n\n private renderHeaderCellContent(\n header: Header<T, unknown>,\n columnDef: ExtendedColumnDef<T>,\n canSort: boolean,\n disableDefaultSorting: boolean,\n sortTitle: string | undefined,\n contentStyle: string | undefined,\n sortIcon: any,\n ) {\n if (!canSort) {\n return flexRender(columnDef.header, header.getContext())\n }\n\n // Disable sorting if disableHeaderOnEmpty is true and table is empty\n const elementTag =\n disableDefaultSorting || this.shouldDisableHeaderActions\n ? 'div'\n : 'dap-ds-button'\n const clickHandler =\n !disableDefaultSorting && !this.shouldDisableHeaderActions\n ? header.column.getToggleSortingHandler()\n : null\n const cursorStyle =\n canSort && !this.shouldDisableHeaderActions ? 'pointer' : 'not-allowed'\n\n return html`<${unsafeStatic(elementTag)}\n class=\"data-table-header-cell__controller\"\n variant=\"clean\"\n data-testid=\"${this.sortButtonTestId}-${header.column.id}\"\n title=${ifDefined(sortTitle)}\n @click=\"${clickHandler}\"\n style=\"cursor: ${cursorStyle}\">\n <span \n part=\"content\" \n class=\"data-table-header-cell__content\"\n style=\"${ifDefined(contentStyle)}\">\n ${flexRender(columnDef.header, header.getContext())}\n ${sortIcon}\n </span>\n </${unsafeStatic(elementTag)}>`\n }\n\n private getHeaderCellStyle(header: Header<T, unknown>): string | undefined {\n const columnDef = header.column.columnDef as ExtendedColumnDef<T>\n const width = this._columnSizing[header.column.id] ?? columnDef.size\n if (!width && !columnDef.maxSize && !columnDef.headerTextAlign) {\n return undefined\n }\n\n return `\n ${width ? `width: ${width}px;` : ''}\n ${columnDef.maxSize ? `max-width: ${columnDef.maxSize}px;` : ''}\n ${columnDef.headerTextAlign ? `text-align: ${columnDef.headerTextAlign};` : ''}\n `\n }\n\n // Replace this union type with a type alias.\n private getSortIcon(isSorted: SortState) {\n if (isSorted === 'asc') {\n return html`<dap-ds-icon-arrow-up-s-line\n size=\"16\"></dap-ds-icon-arrow-up-s-line>`\n }\n if (isSorted === 'desc') {\n return html`<dap-ds-icon-arrow-down-s-line\n size=\"16\"></dap-ds-icon-arrow-down-s-line>`\n }\n return null\n }\n\n private getSortTitle(\n canSort: boolean,\n nextSortOrder: false | 'asc' | 'desc',\n ): string | undefined {\n if (!canSort) return undefined\n\n if (nextSortOrder === 'asc') return t('datatable.sortAscending')\n if (nextSortOrder === 'desc') return t('datatable.sortDescending')\n return t('datatable.clearSort')\n }\n\n private getAriaSortValue(\n isSorted: SortState,\n ): 'ascending' | 'descending' | 'none' {\n if (isSorted === 'asc') return 'ascending'\n if (isSorted === 'desc') return 'descending'\n return 'none'\n }\n\n /**\n * Render cell content with support for multiple formats\n * Supports: primitives, styled objects, HTMLElements, HTML strings,\n * render callbacks, and Lit templates\n */\n private renderCell(cell: Cell<T, unknown>) {\n const content = cell.column.columnDef.cell\n const context = cell.getContext()\n\n // Get raw content from cell renderer\n const rawContent =\n typeof content === 'function' ? content(context) : content\n\n // Process through multi-format renderer\n const processed = renderCellContent(rawContent)\n\n // If it's already a Lit template or primitive, use flexRender\n // Otherwise, return the processed content directly\n if (\n typeof processed === 'string' ||\n typeof processed === 'number' ||\n typeof processed === 'boolean' ||\n processed === null ||\n processed === undefined\n ) {\n return processed\n }\n\n // For HTMLElement or complex content, wrap in lit-html unsafeHTML\n if (processed instanceof HTMLElement) {\n // Return the element directly - Lit can handle HTMLElements\n return processed\n }\n\n // For everything else (TemplateResult), use flexRender\n return flexRender(content, context)\n }\n\n private handleRowClick(row: Row<T>): void {\n if (this.enableRowClick) {\n this.emit('dds-row-click', { row })\n }\n }\n\n private handleRowKeydown(e: KeyboardEvent, row: Row<T>): void {\n if (e.key === 'Enter' || e.key === ' ') {\n // Don't prevent default or handle row click if the event originated from\n // an interactive element inside the cell (button, link, input, etc.)\n // Use composedPath() to check the actual originating element across shadow DOM boundaries\n const composedPath = e.composedPath()\n\n // Check if any element in the composed path is an interactive element\n const isInteractiveElement = composedPath.some(element => {\n if (!(element instanceof HTMLElement)) return false\n // Check native elements\n if (\n ['BUTTON', 'A', 'INPUT', 'SELECT', 'TEXTAREA'].includes(\n element.tagName,\n )\n ) {\n return true\n }\n // Check role=\"button\"\n if (element.getAttribute('role') === 'button') {\n return true\n }\n // Check for custom button elements (like dap-ds-button)\n // These typically have a button-like tag name or contain 'button' in their name\n if (\n element.tagName.toLowerCase().includes('button') ||\n element.tagName.toLowerCase().includes('btn')\n ) {\n return true\n }\n return false\n })\n\n if (isInteractiveElement) {\n // Let the interactive element handle the keyboard event naturally\n return\n }\n\n e.preventDefault()\n this.handleRowClick(row)\n }\n }\n\n // The id TanStack keys sizing state by: an explicit id, else the accessorKey\n private columnIdOf(columnDef: ExtendedColumnDef<T>): string | undefined {\n return columnDef.id ?? (columnDef as { accessorKey?: string }).accessorKey\n }\n\n // The table's min-width: the sum of every column's nominal width. A fixed-layout\n // table only grows to its sized columns, so without this the auto columns get\n // squeezed out. (`min-width: max-content` is not an option: Firefox resolves a\n // fixed-layout table's max-content to infinity and stretches the first column.)\n // Reads the column definitions, not table.getAllLeafColumns(): TanStack merges\n // its default 150px size into every column, which would hide the auto ones.\n private getTableMinWidth(): number {\n return this.columnsMemo().reduce((sum, col) => {\n const columnDef = col as ExtendedColumnDef<T>\n const id = this.columnIdOf(columnDef)\n const width =\n (id && this._columnSizing[id]) ||\n columnDef.size ||\n columnDef.minSize ||\n AUTO_COLUMN_MIN_WIDTH\n return sum + width\n }, 0)\n }\n\n private readonly renderColgroup = (_table: Table<T>) => {\n const columns = this.columnsMemo()\n const columnSizing = this._columnSizing\n\n return html`\n <colgroup>\n ${repeat(\n columns,\n (col, index) => col.id || `col-${index}`,\n col => {\n const columnDef = col as ExtendedColumnDef<T>\n let width: string\n\n // Use calculated sizing if available (from widthPercentage or explicit size)\n const id = this.columnIdOf(columnDef)\n if (id && columnSizing[id]) {\n width = `${columnSizing[id]}px`\n }\n // Use explicit size from column definition\n else if (columnDef.size) {\n width = `${columnDef.size}px`\n }\n // Default to 'auto' for flexible columns (no explicit size or widthPercentage)\n else {\n width = 'auto'\n }\n\n return html`<col style=\"width: ${width};\" />`\n },\n )}\n </colgroup>\n `\n }\n\n private readonly renderHeader = (table: Table<T>) => {\n return html`\n <thead part=\"header\">\n ${repeat(\n table.getHeaderGroups(),\n headerGroup => headerGroup.id,\n headerGroup => html`\n <tr\n part=\"header-row\"\n class=${clsx('data-table-header-row', {\n 'data-table-header-row--striped': this.enableStripedRows,\n })}>\n ${repeat(\n headerGroup.headers,\n header => header.id,\n header => this.renderHeaderCell(header),\n )}\n </tr>\n `,\n )}\n </thead>\n `\n }\n\n private readonly renderSkeletonRows = (\n rowCount: number,\n cellCount: number,\n ) => {\n return html`\n ${repeat(\n Array.from({ length: rowCount }, (_, index) => index),\n index => index,\n _index => html`\n <tr class=\"data-table-row\">\n ${repeat(\n Array.from({ length: cellCount }, (_, index) => index),\n index => index,\n _index =>\n html`<td class=\"data-table-cell\">\n <dap-ds-skeleton></dap-ds-skeleton>\n </td>`,\n )}\n </tr>\n `,\n )}\n `\n }\n\n private readonly renderBody = (table: Table<T>) => {\n return html`\n ${this.loading\n ? html`<tbody part=\"body\">\n ${this.loadingType === 'spinner'\n ? html`\n <tr>\n <td\n colspan=\"${this.columnsMemo().length}\"\n class=\"data-table-cell\">\n <div part=\"loading\" class=\"data-table-placeholder\">\n <slot name=\"loading\">\n <dap-ds-spinner\n size=${this.loadingSize}\n variant=${this.loadingVariant}\n .staticSize=${this.loadingStaticSize}\n .text=${this.loadingText}></dap-ds-spinner>\n </slot>\n </div>\n </td>\n </tr>\n `\n : html`\n ${this.renderSkeletonRows(\n this._pagination.pageSize ?? 10,\n this.columnsMemo().length,\n )}\n `}\n </tbody>`\n : html`\n <tbody part=\"body\">\n ${this.isTableEmpty\n ? html`<tr class=\"data-table-row data-table-row--empty\">\n <td\n colspan=\"${this.columnsMemo().length}\"\n class=\"data-table-cell\">\n <div part=\"empty\" class=\"data-table-placeholder\">\n <slot name=\"empty\">\n <span\n >${this.emptyText ?? t('datatable.noData')}</span\n >\n </slot>\n </div>\n </td>\n </tr>`\n : table.getRowModel().rows.map(\n (row, index) => html`\n <tr\n part=\"row\"\n role=${this.enableRowClick ? 'button' : 'row'}\n tabindex=${this.enableRowClick ? 0 : -1}\n aria-selected=${row.getIsSelected()}\n aria-rowindex=${index + 2}\n class=${clsx('data-table-row', {\n 'data-table-row--selected': row.getIsSelected(),\n 'data-table-row--clickable': this.enableRowClick,\n 'data-table-row--striped': this.enableStripedRows,\n })}\n @click=${() => this.handleRowClick(row)}\n @keydown=${(e: KeyboardEvent) =>\n this.handleRowKeydown(e, row)}>\n ${row.getVisibleCells().map(cell => {\n const columnDef = cell.column\n .columnDef as ExtendedColumnDef<T>\n const sticky = this.stickyOffsets.get(cell.column.id)\n const cellStyle =\n [\n columnDef.textAlign &&\n `text-align: ${columnDef.textAlign};`,\n this.getStickyStyle(cell.column.id),\n ]\n .filter(Boolean)\n .join(' ') || undefined\n return html`\n <td\n part=\"cell\"\n class=${clsx(\n 'data-table-cell',\n sticky &&\n `data-table-cell--sticky-${sticky.side}`,\n )}\n style=\"${ifDefined(cellStyle)}\">\n ${this.renderCell(cell)}\n </td>\n `\n })}\n </tr>\n `,\n )}\n </tbody>\n `}\n `\n }\n\n protected render() {\n const table = this.tableController.table({\n data: this.data as T[],\n columns: this.columnsMemo(),\n filterFns: {},\n state: {\n sorting: this._sorting,\n rowSelection: this._rowSelection,\n pagination: this._pagination,\n columnSizing: this._columnSizing,\n },\n manualSorting: this.manualSorting,\n enableSorting: this.enableSorting,\n enableRowSelection: this.enableRowSelection,\n manualPagination: this.manualPagination,\n autoResetPageIndex: this.autoResetPageIndex,\n onSortingChange: updaterOrValue => {\n if (typeof updaterOrValue === 'function') {\n this._sorting = updaterOrValue(this._sorting)\n } else {\n this._sorting = updaterOrValue\n }\n\n this.emit('dds-sorting-change', { sorting: this._sorting })\n },\n getCoreRowModel: getCoreRowModel(),\n ...(!this.manualSorting && {\n getSortedRowModel: getSortedRowModel(),\n }),\n getPaginationRowModel: getPaginationRowModel(),\n onPaginationChange: updaterOrValue => {\n if (typeof updaterOrValue === 'function') {\n this._pagination = updaterOrValue(this._pagination)\n } else {\n this._pagination = updaterOrValue\n }\n\n this.emit('dds-pagination-change', {\n pagination: {\n pageIndex: this._pagination.pageIndex,\n pageSize: this._pagination.pageSize,\n },\n })\n },\n onRowSelectionChange: updaterOrValue => {\n if (typeof updaterOrValue === 'function') {\n this._rowSelection = updaterOrValue(this._rowSelection)\n } else {\n this._rowSelection = updaterOrValue\n }\n\n this.emit('dds-selection-change', { selection: this._rowSelection })\n },\n getRowId: originalRow => {\n return (originalRow as Record<string, any>)[this.rowKey]\n },\n rowCount: this.rowCount ?? (this.data ? this.data.length : 0),\n debugTable: this.debug,\n debugHeaders: this.debug,\n debugColumns: this.debug,\n })\n\n // Resolve pinned-column offsets before rendering the header/body cells that\n // read them off this.stickyOffsets.\n this.computeStickyOffsets(table)\n\n return html`\n <div class=\"data-table-container\">\n <table\n part=\"base\"\n role=\"table\"\n aria-label=${ifDefined(\n this.ariaLabel ?? t('datatable.tableDescription'),\n )}\n aria-describedby=${ifDefined(this.ariaDescribedBy)}\n aria-rowcount=${this.rowCount ?? (this.data ? this.data.length : 0)}\n class=${clsx('data-table', {\n 'data-table--loading': this.loading,\n })}\n style=\"min-width: ${this.getTableMinWidth()}px;\">\n ${this.caption\n ? html`<caption class=\"visually-hidden\">\n ${this.caption}\n </caption>`\n : nothing}\n ${this.renderColgroup(table)} ${this.renderHeader(table)}\n ${this.renderBody(table)}\n </table>\n </div>\n ${this.enableColumnResizing\n ? html`<span id=\"data-table-resize-label\" hidden\n >${t('datatable.resizeColumn')}</span\n >`\n : nothing}\n ${this._statusMessage\n ? html`<div\n aria-live=\"polite\"\n aria-atomic=\"true\"\n class=\"visually-hidden\"\n id=\"table-status\">\n ${this._statusMessage}\n </div>`\n : nothing}\n ${(this.pager && !this.isTableEmpty) ||\n (this.pager && this.showPagerOnEmpty && this.isTableEmpty)\n ? html`<dap-ds-pager\n class=\"data-table-pager\"\n part=\"pager\"\n .disabled=${this.isTableEmpty}\n .manualPagination=${this.manualPagination}\n .pageIndex=${table.getState().pagination.pageIndex}\n .pageSize=${table.getState().pagination.pageSize}\n .totalRows=${this.rowCount ?? (this.data ? this.data.length : 0)}\n .pageSizeOptions=${this.pageSizeOptions}\n .showPageSizeOptions=${this.showPageSizeOptions}\n .showPageIndex=${this.showPageIndex}\n .showPageCount=${this.showPageCount}\n .showFirstButton=${this.showFirstButton}\n .showPreviousButton=${this.showPreviousButton}\n .showNextButton=${this.showNextButton}\n .showLastButton=${this.showLastButton}\n .showPageNumbers=${this.showPageNumbers}\n .siblingCount=${this.siblingCount}\n .firstButtonLabel=${this.firstButtonLabel}\n .previousButtonLabel=${this.previousButtonLabel}\n .nextButtonLabel=${this.nextButtonLabel}\n .lastButtonLabel=${this.lastButtonLabel}\n .pageStateText=${this.pageStateText}\n exportparts=\"base:pager-base, first:pager-first, previous:pager-previous, next:pager-next, last:pager-last, page-size:pager-page-size-select, page-size-select-base:page-size-select-base, page-size-select-trigger:page-size-select-trigger, pager-button-first-base:pager-button-first-base, pager-button-first-content:pager-button-first-content, pager-button-previous-base:pager-button-previous-base, pager-button-previous-content:pager-button-previous-content, pager-button-next-base:pager-button-next-base, pager-button-next-content:pager-button-next-content, pager-button-last-base:pager-button-last-base, pager-button-last-content:pager-button-last-content, page-numbers:pager-page-numbers, page-number:pager-page-number, page-number-active:pager-page-number-active, page-number-base:pager-page-number-base, page-number-content:pager-page-number-content, page-info:pager-page-info\"\n @dds-pagination-change=${(e: any) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (e.detail.action === 'pageSize') {\n table.setPageSize(e.detail.pagination.pageSize)\n } else {\n table.setPageIndex(e.detail.pagination.pageIndex)\n }\n }}>\n <slot name=\"first-button-label\" slot=\"first-button-label\">\n ${this.firstButtonLabel || t('pager.first')}\n </slot>\n <slot name=\"previous-button-label\" slot=\"previous-button-label\">\n ${this.previousButtonLabel || t('pager.previous')}\n </slot>\n <slot name=\"next-button-label\" slot=\"next-button-label\">\n ${this.nextButtonLabel || t('pager.next')}\n </slot>\n <slot name=\"last-button-label\" slot=\"last-button-label\">\n ${this.lastButtonLabel || t('pager.last')}\n </slot>\n </dap-ds-pager>`\n : nothing}\n `\n }\n}\n"],"names":["MULTISELECT_COLUMN_ID","DEFAULT_RESIZE_MIN_SIZE","AUTO_COLUMN_MIN_WIDTH","RESIZE_KEYBOARD_STEP","_DapDSDataTable","DdsElement","TableController","processedColumns","col","__spreadProps","__spreadValues","table","html","row","_table","columns","columnSizing","repeat","index","columnDef","width","id","headerGroup","clsx","header","rowCount","cellCount","_","_index","_a","_b","t","e","cell","sticky","cellStyle","ifDefined","_changedProperties","offsets","right","i","column","left","columnId","_isLastColumn","canSort","isSorted","nextSortOrder","disableDefaultSorting","headerStyle","contentStyle","sortIcon","sortTitle","canResize","nothing","minSize","maxSize","handle","nominal","min","max","clamped","startX","startWidth","changed","onMove","moveEvent","onEnd","current","targets","target","_removed","rest","__objRest","__restKey","flexRender","elementTag","clickHandler","cursorStyle","unsafeStatic","content","context","rawContent","processed","renderCellContent","element","sum","updaterOrValue","getCoreRowModel","getSortedRowModel","getPaginationRowModel","originalRow","_c","_d","DapDSCheckbox","ArrowsArrowUpSLine","ArrowsArrowDownSLine","DapDSSkeleton","DapDSSpinner","DapDSPager","unsafeCSS","styles","DapDSDataTable","__decorateClass","property","state"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,MAAMA,IAAwB,mBAExBC,KAA0B,IAG1BC,KAAwB,KAExBC,IAAuB,IAkFRC,IAArB,MAAqBA,UAA0BC,EAAW;AAAA,EAA1D,cAAA;AAAA,UAAA,GAAA,SAAA,GAcmB,KAAA,kBAAkB,IAAIC,EAAmB,IAAI,GAMtD,KAAA,oCAAoB,IAG1B,GAG8B,KAAA,OAAkB,CAAC,GAEnB,KAAA,UAAkC,CAAC,GAGtC,KAAA,SAAA,MAOI,KAAA,qBAAA,IAG6B,KAAA,wBAAA,IAER,KAAA,gBAAA,IAKO,KAAA,uBAAA,IAEP,KAAA,gBAAA,IAEG,KAAA,mBAAA,IAEE,KAAA,qBAAA,IAGJ,KAAA,iBAAA,IAGP,KAAA,UAAA,IAGU,KAAA,oBAAA,IAWH,KAAA,cAAA,WAOrD,KAAA,iBAAA,WAMiE,KAAA,cAAA,MAYR,KAAA,uBAAA,QAGF,KAAA,mBAAA,IAGX,KAAA,QAAA,IAGI,KAAA,sBAAA,QAEN,KAAA,gBAAA,QAEA,KAAA,gBAAA,QAEE,KAAA,kBAAA,QAEG,KAAA,qBAAA,QAEJ,KAAA,iBAAA,QAEA,KAAA,iBAAA,QAEC,KAAA,kBAAA,SAEH,KAAA,eAAA,GAeZ,KAAA,mBAAA,yBAcJ,KAAA,kBAA4B,CAAC,IAAI,IAAI,IAAI,GAAG,GAK9D,KAAQ,WAAyB,CAAC,GAKlC,KAAQ,gBAAmC,CAAC,GAK5C,KAAQ,cAA+B;AAAA,MAC9C,WAAW;AAAA,MACX,UAAU;AAAA,IACZ,GAMS,KAAQ,gBAAwC,CAAC,GAGH,KAAA,YAAA,MAoB9C,KAAiB,iBAAyB,IAGd,KAAA,QAAA,IA0ErC,KAAiB,cAAc,MAAM;AAGnC,YAAMC,IAAmB,KAAK,QAAQ,IAAI,CAAOC,MAE3C,CAACA,EAAI,QAAQ,CAACA,EAAI,WAAW,CAACA,EAAI,UAC7BC,EAAAC,EAAA,IAAKF,IAAL,EAAU,SAAS,EAAE,KAEvBA,CACR;AAEM,aAAA;AAAA,QACL,GAAI,KAAK,sBACT,KAAK,QAAQ,CAAC,KACd,KAAK,QAAQ,CAAC,EAAE,OAAOR,IACnB;AAAA,UACES,EAAAC,EAAA;AAAA,YACE,IAAIV;AAAA,YACJ,aAAaA;AAAA,YACb,eAAe;AAAA,YACf,gBAAgB;AAAA,YAChB,MAAM;AAAA,YACN,SAAS;AAAA,aACL,KAAK,wBACL,EAAE,QAAQ,WACV,CAAC,IATP;AAAA,YAUE,QAAQ,CAAC,EAAE,OAAAW,EACT,MAAAC;AAAA,oCACoBD,EAAM,sBAAuB,CAAA;AAAA,gCACjCA,EAAM,gCAAiC,CAAA;AAAA,8BACzCA,EAAM,sBAAsB;AAAA,oCACtBA,EAAM,uBAAuB;AAAA,+BAClC,KAAK,yBAAyB,UAC3C,KAAK,YAAY;AAAA,YACrB,MAAM,CAAC,EAAE,KAAAE,EACP,MAAAD;AAAA,iCACiBC,EAAI,0BAA0B;AAAA,8BACjCA,EAAI,eAAe;AAAA,+BAClB,CAACA,EAAI,cAAc;AAAA,oCACdA,EAAI,mBAAmB;AAAA,UAAA;AAAA,QAC/C,IAEF,CAAC;AAAA,QACL,GAAGN;AAAA,MACL;AAAA,IACF,GA4biB,KAAA,iBAAiB,CAACO,MAAqB;AAChD,YAAAC,IAAU,KAAK,YAAY,GAC3BC,IAAe,KAAK;AAEnB,aAAAJ;AAAA;AAAA,UAEDK;AAAA,QACAF;AAAA,QACA,CAACP,GAAKU,MAAUV,EAAI,MAAM,OAAOU,CAAK;AAAA,QACtC,CAAOV,MAAA;AACL,gBAAMW,IAAYX;AACd,cAAAY;AAGE,gBAAAC,IAAK,KAAK,WAAWF,CAAS;AAChC,iBAAAE,KAAML,EAAaK,CAAE,IACfD,IAAA,GAAGJ,EAAaK,CAAE,CAAC,OAGpBF,EAAU,OACTC,IAAA,GAAGD,EAAU,IAAI,OAIjBC,IAAA,QAGHR,uBAA0BQ,CAAK;AAAA,QAAA;AAAA,MAEzC,CAAA;AAAA;AAAA;AAAA,IAGP,GAEiB,KAAA,eAAe,CAACT,MACxBC;AAAA;AAAA,UAEDK;AAAA,MACAN,EAAM,gBAAgB;AAAA,MACtB,OAAeW,EAAY;AAAA,MAC3B,CAAeA,MAAAV;AAAA;AAAA;AAAA,sBAGHW,EAAK,yBAAyB;AAAA,QACpC,kCAAkC,KAAK;AAAA,MAAA,CACxC,CAAC;AAAA,gBACAN;AAAA,QACAK,EAAY;AAAA,QACZ,OAAUE,EAAO;AAAA,QACjB,CAAAA,MAAU,KAAK,iBAAiBA,CAAM;AAAA,MACvC,CAAA;AAAA;AAAA;AAAA,IAGN,CAAA;AAAA;AAAA,OAKU,KAAA,qBAAqB,CACpCC,GACAC,MAEOd;AAAA,QACHK;AAAA,MACA,MAAM,KAAK,EAAE,QAAQQ,EAAY,GAAA,CAACE,GAAGT,MAAUA,CAAK;AAAA,MACpD,CAASA,MAAAA;AAAA,MACT,CAAUU,MAAAhB;AAAA;AAAA,cAEJK;AAAA,QACA,MAAM,KAAK,EAAE,QAAQS,EAAa,GAAA,CAACC,GAAGT,MAAUA,CAAK;AAAA,QACrD,CAASA,MAAAA;AAAA,QACT,CAAAU,MACEhB;AAAA;AAAA;AAAA,MAGH,CAAA;AAAA;AAAA;AAAA,IAGN,CAAA;AAAA,OAIY,KAAA,aAAa,CAACD,MAAoB;;AAC1C,aAAAC;AAAA,QACH,KAAK,UACHA;AAAA,cACI,KAAK,gBAAgB,YACnBA;AAAA;AAAA;AAAA,iCAGiB,KAAK,YAAY,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,mCAKvB,KAAK,WAAW;AAAA,sCACb,KAAK,cAAc;AAAA,0CACf,KAAK,iBAAiB;AAAA,oCAC5B,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMpCA;AAAA,oBACI,KAAK;AAAA,SACLiB,IAAA,KAAK,YAAY,aAAjB,OAAAA,IAA6B;AAAA,QAC7B,KAAK,cAAc;AAAA,MACpB,CAAA;AAAA,iBACF;AAAA,sBAEPjB;AAAA;AAAA,gBAEM,KAAK,eACHA;AAAA;AAAA,iCAEe,KAAK,YAAY,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,gCAK3BkB,IAAA,KAAK,cAAL,OAAAA,IAAkBC,EAAE,kBAAkB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,2BAMpDpB,EAAM,YAAY,EAAE,KAAK;AAAA,QACvB,CAACE,GAAKK,MAAUN;AAAA;AAAA;AAAA,+BAGL,KAAK,iBAAiB,WAAW,KAAK;AAAA,mCAClC,KAAK,iBAAiB,IAAI,EAAE;AAAA,wCACvBC,EAAI,cAAe,CAAA;AAAA,wCACnBK,IAAQ,CAAC;AAAA,gCACjBK,EAAK,kBAAkB;AAAA,UAC7B,4BAA4BV,EAAI,cAAc;AAAA,UAC9C,6BAA6B,KAAK;AAAA,UAClC,2BAA2B,KAAK;AAAA,QAAA,CACjC,CAAC;AAAA,iCACO,MAAM,KAAK,eAAeA,CAAG,CAAC;AAAA,mCAC5B,CAACmB,MACV,KAAK,iBAAiBA,GAAGnB,CAAG,CAAC;AAAA,0BAC7BA,EAAI,gBAAA,EAAkB,IAAI,CAAQoB,MAAA;AAC5B,gBAAAd,IAAYc,EAAK,OACpB,WACGC,IAAS,KAAK,cAAc,IAAID,EAAK,OAAO,EAAE,GAC9CE,IACJ;AAAA,YACEhB,EAAU,aACR,eAAeA,EAAU,SAAS;AAAA,YACpC,KAAK,eAAec,EAAK,OAAO,EAAE;AAAA,YAEjC,OAAO,OAAO,EACd,KAAK,GAAG,KAAK;AACX,iBAAArB;AAAA;AAAA;AAAA,sCAGKW;AAAA,YACN;AAAA,YACAW,KACE,2BAA2BA,EAAO,IAAI;AAAA,UACzC,CAAA;AAAA,uCACQE,EAAUD,CAAS,CAAC;AAAA,gCAC3B,KAAK,WAAWF,CAAI,CAAC;AAAA;AAAA;AAAA,QAAA,CAG5B,CAAC;AAAA;AAAA;AAAA,MAGP,CAAA;AAAA;AAAA,WAER;AAAA;AAAA,IAET;AAAA,EAAA;AAAA;AAAA,EAlvBA,IAAY,eAAwB;AAElC,WAAI,KAAK,oBAAoB,KAAK,aAAa,SACtC,KAAK,aAAa,IAEpB,CAAC,KAAK,QAAQ,KAAK,KAAK,WAAW;AAAA,EAAA;AAAA;AAAA,EAI5C,IAAY,6BAAsC;AACzC,WAAA,KAAK,yBAAyB,UAAU,KAAK;AAAA,EAAA;AAAA,EAS5C,aACRI,GACM;AACN,UAAM,aAAaA,CAAkB,GAEjC,KAAK,YACP,KAAK,WAAW,KAAK,UAGnB,KAAK,iBACP,KAAK,gBAAgB,KAAK,eAGxB,KAAK,aACP,KAAK,cAAc,KAAK,aACf,KAAK,mBAAmB,KAAK,gBAAgB,SAAS,MAE/D,KAAK,cAAc5B,EAAAC,EAAA,IACd,KAAK,cADS;AAAA,MAEjB,UAAU,KAAK,gBAAgB,CAAC;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA,EAKQ,WACR2B,GACM;;AACN,UAAM,WAAWA,CAAkB,GAE/BA,EAAmB,IAAI,cAAc,MAClC,KAAA,iBAAgBR,IAAA,KAAK,iBAAL,OAAAA,IAAqB,CAAC;AAAA,EAC7C;AAAA,EAGQ,QACRQ,GACM;AACN,UAAM,QAAQA,CAAkB,GAE5BA,EAAmB,IAAI,YAAY,MACrC,KAAK,cAAc,KAAK,aAGtBA,EAAmB,IAAI,SAAS,MAClC,KAAK,WAAW,KAAK,WAIrBA,EAAmB,IAAI,cAAc,KACrCA,EAAmB,IAAI,cAAc,OAErC,KAAK,gBAAgB,KAAK,eAGxBA,EAAmB,IAAI,MAAM,KAC/B,KAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAMF,uBAA6B;AAC3B,UAAM,qBAAqB,GACvB,KAAK,mBACP,KAAK,eAAe,WAAW,GAC/B,KAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAsDM,qBAAqB1B,GAAiB;AACtC,UAAA2B,wBAAc,IAGlB,GACIvB,IAAUJ,EAAM,sBAAsB;AAE5C,QAAI4B,IAAQ;AACZ,aAASC,IAAIzB,EAAQ,SAAS,GAAGyB,KAAK,GAAGA,KAAK;AACtC,YAAAC,IAAS1B,EAAQyB,CAAC;AACnB,MAAAC,EAAO,UAAmC,WAAW,YAChDH,EAAA,IAAIG,EAAO,IAAI,EAAE,MAAM,SAAS,QAAQF,GAAO,GACvDA,KAASE,EAAO,QAAQ;AAAA,IAC1B;AAGF,QAAIC,IAAO;AACX,eAAWD,KAAU1B;AACd,MAAA0B,EAAO,UAAmC,WAAW,WAChDH,EAAA,IAAIG,EAAO,IAAI,EAAE,MAAM,QAAQ,QAAQC,GAAM,GACrDA,KAAQD,EAAO,QAAQ;AAI3B,SAAK,gBAAgBH;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,eAAeK,GAAsC;AAC3D,UAAMT,IAAS,KAAK,cAAc,IAAIS,CAAQ;AAC1C,QAACT;AACL,aAAO,qBAAqBA,EAAO,IAAI,KAAKA,EAAO,MAAM;AAAA,EAAA;AAAA,EAGnD,iBACNV,GACAoB,IAAyB,IACzB;;AACM,UAAAzB,IAAYK,EAAO,OAAO,WAC1BqB,IAAUrB,EAAO,OAAO,WAAW,GACnCsB,IAAWtB,EAAO,OAAO,YAAY,GACrCuB,IAAgBvB,EAAO,OAAO,oBAAoB,GAClDwB,KAAwBnB,IAAAV,EAAU,0BAAV,OAAAU,IAAmC,IAE3DK,IAAS,KAAK,cAAc,IAAIV,EAAO,OAAO,EAAE,GAChDyB,IACJ,CAAC,KAAK,mBAAmBzB,CAAM,GAAG,KAAK,eAAeA,EAAO,OAAO,EAAE,CAAC,EACpE,OAAO,OAAO,EACd,KAAK,GAAG,KAAK,QACZ0B,IAAe/B,EAAU,kBAC3B,oBAAoBA,EAAU,eAAe,MAC7C,QAEEgC,IAAW,KAAK,YAAYL,CAAQ,GACpCM,IAAY,KAAK,aAAaP,GAASE,CAAa,GACpDM,IAAY,KAAK,aAAa7B,CAAM;AAEnC,WAAAZ;AAAA;AAAA,mBAEQY,EAAO,OAAO;AAAA,mBACdA,EAAO,OAAO;AAAA;AAAA,cAEnB,KAAK,gBAAgBA,EAAO,OAAO,EAAE,CAAC;AAAA,gBACpCD;AAAA,MACN;AAAA,MACAW,KAAU,kCAAkCA,EAAO,IAAI;AAAA,MACvDmB,KAAa;AAAA,IACd,CAAA;AAAA;AAAA,oBAEWR,KAAW,CAAC,KAAK,6BACzB,KAAK,iBAAiBC,CAAQ,IAC9B,MAAM;AAAA,iBACDV,EAAUa,CAAW,CAAC;AAAA,UAC7B,KAAK;AAAA,MACLzB;AAAA,MACAL;AAAA,MACA0B;AAAA,MACAG;AAAA,MACAI;AAAA,MACAF;AAAA,MACAC;AAAA,IACD,CAAA;AAAA,UACCE,IAAY,KAAK,mBAAmB7B,CAAM,IAAI8B,CAAO;AAAA;AAAA;AAAA,EAAA;AAAA,EAKrD,gBAAgBX,GAA0B;AAChD,WAAO,qBAAqBA,CAAQ;AAAA,EAAA;AAAA,EAG9B,aAAanB,GAAqC;AAClD,UAAAL,IAAYK,EAAO,OAAO;AAE9B,WAAA,KAAK,wBACLA,EAAO,YAAY,KACnBA,EAAO,OAAO,OAAOxB,KACrBmB,EAAU,mBAAmB;AAAA,EAAA;AAAA,EAIzB,gBAAgBK,GAA4B;AAClD,UAAM,EAAE,SAAA+B,GAAS,SAAAC,EAAQ,IAAIhC,EAAO,OAAO;AACpC,WAAA;AAAA,MACL,KAAK+B,KAAWtD;AAAA,MAChB,KAAKuD,KAAWA,IAAU,OAAO,mBAAmBA,IAAU;AAAA,IAChE;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQM,cACNhC,GACAiC,GACQ;;AACF,UAAAC,KACJ7B,IAAA,KAAK,cAAcL,EAAO,OAAO,EAAE,MAAnC,OAAAK,IAAwCL,EAAO,OAAO,UAAU;AAClE,QAAIkC,EAAgB,QAAAA;AACd,UAAAzB,IAAOwB,EAAO,QAAQ,IAAI;AAChC,YAAOxB,KAAA,gBAAAA,EAAM,wBAAwB,UAAST,EAAO,OAAO,QAAQ;AAAA,EAAA;AAAA,EAG9D,eAAeA,GAA4BJ,GAAe;AAChE,UAAM,EAAE,KAAAuC,GAAK,KAAAC,EAAA,IAAQ,KAAK,gBAAgBpC,CAAM,GAC1CqC,IAAU,KAAK;AAAA,MACnB,KAAK,IAAI,KAAK,IAAIzC,GAAOuC,CAAG,GAAGC,KAAA,OAAAA,IAAO,OAAO,iBAAiB;AAAA,IAChE;AACA,WAAI,KAAK,cAAcpC,EAAO,OAAO,EAAE,MAAMqC,IAAgB,MACxD,KAAA,gBAAgBpD,EAAAC,EAAA,IAAK,KAAK,gBAAV,EAAyB,CAACc,EAAO,OAAO,EAAE,GAAGqC,EAAQ,IACnE;AAAA,EAAA;AAAA,EAGD,yBAAyB;AAC/B,SAAK,KAAK,4BAA4B;AAAA,MACpC,cAAcnD,EAAA,IAAK,KAAK;AAAA,IAAc,CACvC;AAAA,EAAA;AAAA,EAGK,wBAAwBsB,GAAiBR,GAA4B;AACvE,QAAAQ,EAAE,WAAW,EAAG;AACpB,IAAAA,EAAE,eAAe,GACjBA,EAAE,gBAAgB;AAElB,UAAMyB,IAASzB,EAAE,eACX8B,IAAS9B,EAAE,SACX+B,IAAa,KAAK,cAAcvC,GAAQiC,CAAM;AACpD,QAAIO,IAAU;AAKV,QAAA;AACK,MAAAP,EAAA,kBAAkBzB,EAAE,SAAS;AAAA,IAAA,SAC9BA,GAAA;AAAA,IAAA;AAGH,SAAA,gBAAgB,YAAY,EAAI;AAE/B,UAAAiC,IAAS,CAACC,MAA4B;AAC1C,MAAAF,IACE,KAAK,eAAexC,GAAQuC,IAAaG,EAAU,UAAUJ,CAAM,KACnEE;AAAA,IACJ,GACMG,IAAQ,MAAM;AACX,aAAA,oBAAoB,eAAeF,CAAM,GACzC,OAAA,oBAAoB,aAAaE,CAAK,GACtC,OAAA,oBAAoB,iBAAiBA,CAAK,GAC5C,KAAA,gBAAgB,YAAY,EAAK,GAClCH,UAAc,uBAAuB;AAAA,IAC3C;AAEO,WAAA,iBAAiB,eAAeC,CAAM,GACtC,OAAA,iBAAiB,aAAaE,CAAK,GACnC,OAAA,iBAAiB,iBAAiBA,CAAK;AAAA,EAAA;AAAA,EAGxC,oBAAoBnC,GAAkBR,GAA4B;AACxE,UAAM,EAAE,KAAAmC,GAAK,KAAAC,EAAA,IAAQ,KAAK,gBAAgBpC,CAAM,GAC1C4C,IAAU,KAAK,cAAc5C,GAAQQ,EAAE,aAA4B,GACnEqC,IAA8C;AAAA,MAClD,WAAWD,IAAUjE;AAAA,MACrB,YAAYiE,IAAUjE;AAAA,MACtB,MAAMwD;AAAA,MACN,KAAKC;AAAA,IACP;AACI,QAAA,EAAE5B,EAAE,OAAOqC,GAAU;AACzB,IAAArC,EAAE,eAAe,GACjBA,EAAE,gBAAgB;AAEZ,UAAAsC,IAASD,EAAQrC,EAAE,GAAG;AAC5B,IAAIsC,MAAW,UAAa,KAAK,eAAe9C,GAAQ8C,CAAM,KAC5D,KAAK,uBAAuB;AAAA,EAC9B;AAAA;AAAA,EAIM,kBAAkBtC,GAAeR,GAA4B;;AAGnE,QAFAQ,EAAE,eAAe,GACjBA,EAAE,gBAAgB,GACd,EAAER,EAAO,OAAO,MAAM,KAAK,eAAgB;AACzC,UAA4CM,IAAA,KAAK,eAA9C,GAAAD,IAAAL,EAAO,OAAO,KAAK+C,MAAsBzC,GAAT0C,IAAAC,EAAS3C,GAAT,CAAhC4C,EAAA7C;AACT,SAAK,gBAAgB2C,GACrB,KAAK,uBAAuB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMtB,mBAAmBhD,GAA4B;;AACrD,UAAM,EAAE,KAAAmC,GAAK,KAAAC,EAAA,IAAQ,KAAK,gBAAgBpC,CAAM,GAC1CJ,IAAQ,KAAK;AAAA,OACjBS,IAAA,KAAK,cAAcL,EAAO,OAAO,EAAE,MAAnC,OAAAK,IAAwCL,EAAO,OAAO,QAAQ;AAAA,IAChE;AAEO,WAAAZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDAMsC,KAAK;AAAA,MAC9CY,EAAO,OAAO;AAAA,IAAA,CACf;AAAA,sBACeJ,CAAK;AAAA,sBACLuC,CAAG;AAAA,sBACHvB,EAAUwB,CAAG,CAAC;AAAA,qBACf,CAAC5B,MACd,KAAK,wBAAwBA,GAAGR,CAAM,CAAC;AAAA,iBAC9B,CAACQ,MAAqB,KAAK,oBAAoBA,GAAGR,CAAM,CAAC;AAAA,kBACxD,CAACQ,MAAkB,KAAK,kBAAkBA,GAAGR,CAAM,CAAC;AAAA,eACvD,CAACQ,MAAkBA,EAAE,gBAAA,CAAiB;AAAA,EAAA;AAAA,EAG3C,wBACNR,GACAL,GACA0B,GACAG,GACAI,GACAF,GACAC,GACA;AACA,QAAI,CAACN;AACH,aAAO8B,EAAWxD,EAAU,QAAQK,EAAO,YAAY;AAIzD,UAAMoD,IACJ5B,KAAyB,KAAK,6BAC1B,QACA,iBACA6B,IACJ,CAAC7B,KAAyB,CAAC,KAAK,6BAC5BxB,EAAO,OAAO,wBAAA,IACd,MACAsD,IACJjC,KAAW,CAAC,KAAK,6BAA6B,YAAY;AAErD,WAAAjC,KAAQmE,EAAaH,CAAU,CAAC;AAAA;AAAA;AAAA,qBAGtB,KAAK,gBAAgB,IAAIpD,EAAO,OAAO,EAAE;AAAA,cAChDY,EAAUgB,CAAS,CAAC;AAAA,gBAClByB,CAAY;AAAA,uBACLC,CAAW;AAAA;AAAA;AAAA;AAAA,iBAIjB1C,EAAUc,CAAY,CAAC;AAAA,UAC9ByB,EAAWxD,EAAU,QAAQK,EAAO,WAAA,CAAY,CAAC;AAAA,UACjD2B,CAAQ;AAAA;AAAA,QAEV4B,EAAaH,CAAU,CAAC;AAAA,EAAA;AAAA,EAGtB,mBAAmBpD,GAAgD;;AACnE,UAAAL,IAAYK,EAAO,OAAO,WAC1BJ,KAAQS,IAAA,KAAK,cAAcL,EAAO,OAAO,EAAE,MAAnC,OAAAK,IAAwCV,EAAU;AAChE,QAAI,GAACC,KAAS,CAACD,EAAU,WAAW,CAACA,EAAU;AAIxC,aAAA;AAAA,QACHC,IAAQ,UAAUA,CAAK,QAAQ,EAAE;AAAA,QACjCD,EAAU,UAAU,cAAcA,EAAU,OAAO,QAAQ,EAAE;AAAA,QAC7DA,EAAU,kBAAkB,eAAeA,EAAU,eAAe,MAAM,EAAE;AAAA;AAAA,EAAA;AAAA;AAAA,EAK1E,YAAY2B,GAAqB;AACvC,WAAIA,MAAa,QACRlC;AAAA,oDAGLkC,MAAa,SACRlC;AAAA,sDAGF;AAAA,EAAA;AAAA,EAGD,aACNiC,GACAE,GACoB;AAChB,QAACF;AAEL,aAAIE,MAAkB,QAAchB,EAAE,yBAAyB,IAC3DgB,MAAkB,SAAehB,EAAE,0BAA0B,IAC1DA,EAAE,qBAAqB;AAAA,EAAA;AAAA,EAGxB,iBACNe,GACqC;AACjC,WAAAA,MAAa,QAAc,cAC3BA,MAAa,SAAe,eACzB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQD,WAAWb,GAAwB;AACnC,UAAA+C,IAAU/C,EAAK,OAAO,UAAU,MAChCgD,IAAUhD,EAAK,WAAW,GAG1BiD,IACJ,OAAOF,KAAY,aAAaA,EAAQC,CAAO,IAAID,GAG/CG,IAAYC,EAAkBF,CAAU;AAe9C,WAVE,OAAOC,KAAc,YACrB,OAAOA,KAAc,YACrB,OAAOA,KAAc,aACrBA,MAAc,QACdA,MAAc,UAMZA,aAAqB,cAEhBA,IAIFR,EAAWK,GAASC,CAAO;AAAA,EAAA;AAAA,EAG5B,eAAepE,GAAmB;AACxC,IAAI,KAAK,kBACP,KAAK,KAAK,iBAAiB,EAAE,KAAAA,EAAA,CAAK;AAAA,EACpC;AAAA,EAGM,iBAAiBmB,GAAkBnB,GAAmB;AAC5D,QAAImB,EAAE,QAAQ,WAAWA,EAAE,QAAQ,KAAK;AAgCtC,UA5BqBA,EAAE,aAAa,EAGM,KAAK,CAAWqD,MAClDA,aAAmB,cAGvB,IAAC,UAAU,KAAK,SAAS,UAAU,UAAU,EAAE;AAAA,QAC7CA,EAAQ;AAAA,MAAA,KAMRA,EAAQ,aAAa,MAAM,MAAM,YAMnCA,EAAQ,QAAQ,YAAY,EAAE,SAAS,QAAQ,KAC/CA,EAAQ,QAAQ,YAAA,EAAc,SAAS,KAAK,KAjBA,EAsB/C;AAIC;AAGF,MAAArD,EAAE,eAAe,GACjB,KAAK,eAAenB,CAAG;AAAA,IAAA;AAAA,EACzB;AAAA;AAAA,EAIM,WAAWM,GAAqD;;AAC/D,YAAAU,IAAAV,EAAU,OAAV,OAAAU,IAAiBV,EAAuC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASzD,mBAA2B;AACjC,WAAO,KAAK,YAAY,EAAE,OAAO,CAACmE,GAAK9E,MAAQ;AAC7C,YAAMW,IAAYX,GACZa,IAAK,KAAK,WAAWF,CAAS,GAC9BC,IACHC,KAAM,KAAK,cAAcA,CAAE,KAC5BF,EAAU,QACVA,EAAU,WACVjB;AACF,aAAOoF,IAAMlE;AAAA,OACZ,CAAC;AAAA,EAAA;AAAA,EAmLI,SAAS;;AACX,UAAAT,IAAQ,KAAK,gBAAgB,MAAMF,EAAAC,EAAA;AAAA,MACvC,MAAM,KAAK;AAAA,MACX,SAAS,KAAK,YAAY;AAAA,MAC1B,WAAW,CAAC;AAAA,MACZ,OAAO;AAAA,QACL,SAAS,KAAK;AAAA,QACd,cAAc,KAAK;AAAA,QACnB,YAAY,KAAK;AAAA,QACjB,cAAc,KAAK;AAAA,MACrB;AAAA,MACA,eAAe,KAAK;AAAA,MACpB,eAAe,KAAK;AAAA,MACpB,oBAAoB,KAAK;AAAA,MACzB,kBAAkB,KAAK;AAAA,MACvB,oBAAoB,KAAK;AAAA,MACzB,iBAAiB,CAAkB6E,MAAA;AAC7B,QAAA,OAAOA,KAAmB,aACvB,KAAA,WAAWA,EAAe,KAAK,QAAQ,IAE5C,KAAK,WAAWA,GAGlB,KAAK,KAAK,sBAAsB,EAAE,SAAS,KAAK,UAAU;AAAA,MAC5D;AAAA,MACA,iBAAiBC,GAAgB;AAAA,OAC7B,CAAC,KAAK,iBAAiB;AAAA,MACzB,mBAAmBC,EAAkB;AAAA,IACvC,IA3BuC;AAAA,MA4BvC,uBAAuBC,EAAsB;AAAA,MAC7C,oBAAoB,CAAkBH,MAAA;AAChC,QAAA,OAAOA,KAAmB,aACvB,KAAA,cAAcA,EAAe,KAAK,WAAW,IAElD,KAAK,cAAcA,GAGrB,KAAK,KAAK,yBAAyB;AAAA,UACjC,YAAY;AAAA,YACV,WAAW,KAAK,YAAY;AAAA,YAC5B,UAAU,KAAK,YAAY;AAAA,UAAA;AAAA,QAC7B,CACD;AAAA,MACH;AAAA,MACA,sBAAsB,CAAkBA,MAAA;AAClC,QAAA,OAAOA,KAAmB,aACvB,KAAA,gBAAgBA,EAAe,KAAK,aAAa,IAEtD,KAAK,gBAAgBA,GAGvB,KAAK,KAAK,wBAAwB,EAAE,WAAW,KAAK,eAAe;AAAA,MACrE;AAAA,MACA,UAAU,CAAeI,MACfA,EAAoC,KAAK,MAAM;AAAA,MAEzD,WAAU9D,IAAA,KAAK,aAAL,OAAAA,IAAkB,KAAK,OAAO,KAAK,KAAK,SAAS;AAAA,MAC3D,YAAY,KAAK;AAAA,MACjB,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,IAAA,EACpB;AAID,gBAAK,qBAAqBlB,CAAK,GAExBC;AAAA;AAAA;AAAA;AAAA;AAAA,uBAKYwB;AAAA,OACXN,IAAA,KAAK,cAAL,OAAAA,IAAkBC,EAAE,4BAA4B;AAAA,IACjD,CAAA;AAAA,6BACkBK,EAAU,KAAK,eAAe,CAAC;AAAA,2BAClCwD,IAAA,KAAK,aAAL,OAAAA,IAAkB,KAAK,OAAO,KAAK,KAAK,SAAS,CAAE;AAAA,kBAC3DrE,EAAK,cAAc;AAAA,MACzB,uBAAuB,KAAK;AAAA,IAAA,CAC7B,CAAC;AAAA,8BACkB,KAAK,kBAAkB;AAAA,YACzC,KAAK,UACHX;AAAA,kBACI,KAAK,OAAO;AAAA,4BAEhB0C,CAAO;AAAA,YACT,KAAK,eAAe3C,CAAK,CAAC,IAAI,KAAK,aAAaA,CAAK,CAAC;AAAA,YACtD,KAAK,WAAWA,CAAK,CAAC;AAAA;AAAA;AAAA,QAG1B,KAAK,uBACHC;AAAA,eACKmB,EAAE,wBAAwB,CAAC;AAAA,eAEhCuB,CAAO;AAAA,QACT,KAAK,iBACH1C;AAAA;AAAA;AAAA;AAAA;AAAA,cAKI,KAAK,cAAc;AAAA,oBAEvB0C,CAAO;AAAA,QACR,KAAK,SAAS,CAAC,KAAK,gBACtB,KAAK,SAAS,KAAK,oBAAoB,KAAK,eACzC1C;AAAA;AAAA;AAAA,wBAGc,KAAK,YAAY;AAAA,gCACT,KAAK,gBAAgB;AAAA,yBAC5BD,EAAM,WAAW,WAAW,SAAS;AAAA,wBACtCA,EAAM,WAAW,WAAW,QAAQ;AAAA,0BACnCkF,IAAA,KAAK,aAAL,OAAAA,IAAkB,KAAK,OAAO,KAAK,KAAK,SAAS,CAAE;AAAA,+BAC7C,KAAK,eAAe;AAAA,mCAChB,KAAK,mBAAmB;AAAA,6BAC9B,KAAK,aAAa;AAAA,6BAClB,KAAK,aAAa;AAAA,+BAChB,KAAK,eAAe;AAAA,kCACjB,KAAK,kBAAkB;AAAA,8BAC3B,KAAK,cAAc;AAAA,8BACnB,KAAK,cAAc;AAAA,+BAClB,KAAK,eAAe;AAAA,4BACvB,KAAK,YAAY;AAAA,gCACb,KAAK,gBAAgB;AAAA,mCAClB,KAAK,mBAAmB;AAAA,+BAC5B,KAAK,eAAe;AAAA,+BACpB,KAAK,eAAe;AAAA,6BACtB,KAAK,aAAa;AAAA;AAAA,qCAEV,CAAC7D,MAAW;AACnC,MAAAA,EAAE,eAAe,GACjBA,EAAE,gBAAgB,GAEdA,EAAE,OAAO,WAAW,aACtBrB,EAAM,YAAYqB,EAAE,OAAO,WAAW,QAAQ,IAE9CrB,EAAM,aAAaqB,EAAE,OAAO,WAAW,SAAS;AAAA,IAClD,CACD;AAAA;AAAA,gBAEG,KAAK,oBAAoBD,EAAE,aAAa,CAAC;AAAA;AAAA;AAAA,gBAGzC,KAAK,uBAAuBA,EAAE,gBAAgB,CAAC;AAAA;AAAA;AAAA,gBAG/C,KAAK,mBAAmBA,EAAE,YAAY,CAAC;AAAA;AAAA;AAAA,gBAGvC,KAAK,mBAAmBA,EAAE,YAAY,CAAC;AAAA;AAAA,6BAG7CuB,CAAO;AAAA;AAAA,EAAA;AAGjB;AAxkCElD,EAAO,UAAU,oBAEjBA,EAAO,eAAe;AAAA,EACpB,mBAAmB0F;AAAA,EACnB,+BAA+BC;AAAA,EAC/B,iCAAiCC;AAAA,EACjC,mBAAmBC;AAAA,EACnB,kBAAkBC;AAAA,EAClB,gBAAgBC;AAClB,GAEgB/F,EAAA,SAASgG,EAAUC,CAAM;AAZ3C,IAAqBC,IAArBlG;AA0BkCmG,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAO,CAAA;AAAA,GA1BXF,EA0Ba,WAAA,MAAA;AAEAC,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAO,CAAA;AAAA,GA5BXF,EA4Ba,WAAA,SAAA;AAGpBC,EAAA;AAAA,EAAXC,EAAS;AAAA,GA/BSF,EA+BP,WAAA,QAAA;AAKiBC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GApCRF,EAoCU,WAAA,oBAAA;AAKAC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAzCRF,EAyCU,WAAA,uBAAA;AAEAC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GA3CRF,EA2CU,WAAA,eAAA;AAKAC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAhDRF,EAgDU,WAAA,sBAAA;AAEAC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAlDRF,EAkDU,WAAA,eAAA;AAEAC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GApDRF,EAoDU,WAAA,kBAAA;AAEAC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAtDRF,EAsDU,WAAA,oBAAA;AAGAC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAzDRF,EAyDU,WAAA,gBAAA;AAGAC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GA5DRF,EA4DU,WAAA,SAAA;AAGAC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GA/DRF,EA+DU,WAAA,mBAAA;AAGDC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAlEPF,EAkES,WAAA,UAAA;AAGAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GArEPF,EAqES,WAAA,SAAA;AAKAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GA1EPF,EA0ES,WAAA,aAAA;AAMeC,EAAA;AAAA,EAA1CC,EAAS,EAAE,MAAM,QAAQ,SAAS,GAAM,CAAA;AAAA,GAhFtBF,EAgFwB,WAAA,gBAAA;AAOAC,EAAA;AAAA,EAA1CC,EAAS,EAAE,MAAM,QAAQ,SAAS,GAAM,CAAA;AAAA,GAvFtBF,EAuFwB,WAAA,aAAA;AAEfC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAzFPF,EAyFS,WAAA,mBAAA;AAEAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GA3FPF,EA2FS,WAAA,aAAA;AAGAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GA9FPF,EA8FS,WAAA,WAAA;AAKAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAnGPF,EAmGS,WAAA,sBAAA;AAGCC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAtGRF,EAsGU,WAAA,kBAAA;AAGAC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAzGRF,EAyGU,WAAA,OAAA;AAGDC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GA5GPF,EA4GS,WAAA,qBAAA;AAEAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GA9GPF,EA8GS,WAAA,eAAA;AAEAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAhHPF,EAgHS,WAAA,eAAA;AAEAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAlHPF,EAkHS,WAAA,iBAAA;AAEAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GApHPF,EAoHS,WAAA,oBAAA;AAEAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAtHPF,EAsHS,WAAA,gBAAA;AAEAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAxHPF,EAwHS,WAAA,gBAAA;AAEAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GA1HPF,EA0HS,WAAA,iBAAA;AAEAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GA5HPF,EA4HS,WAAA,cAAA;AAGAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GA/HPF,EA+HS,WAAA,kBAAA;AAGAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAlIPF,EAkIS,WAAA,qBAAA;AAGAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GArIPF,EAqIS,WAAA,iBAAA;AAGAC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAxIPF,EAwIS,WAAA,iBAAA;AAGhBC,EAAA;AAAA,EAAXC,EAAS;AAAA,GA3ISF,EA2IP,WAAA,kBAAA;AAKoBC,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAO,CAAA;AAAA,GAhJXF,EAgJa,WAAA,eAAA;AASLC,EAAA;AAAA,EAA1BC,EAAS,EAAE,MAAM,MAAO,CAAA;AAAA,GAzJNF,EAyJQ,WAAA,iBAAA;AAGAC,EAAA;AAAA,EAA1BC,EAAS,EAAE,MAAM,MAAO,CAAA;AAAA,GA5JNF,EA4JQ,WAAA,SAAA;AAEVC,EAAA;AAAA,EAAhBE,EAAM;AAAA,GA9JYH,EA8JF,WAAA,UAAA;AAGWC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAjKPF,EAiKS,WAAA,cAAA;AAEXC,EAAA;AAAA,EAAhBE,EAAM;AAAA,GAnKYH,EAmKF,WAAA,eAAA;AAGWC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAtKPF,EAsKS,WAAA,YAAA;AAEXC,EAAA;AAAA,EAAhBE,EAAM;AAAA,GAxKYH,EAwKF,WAAA,aAAA;AAOWC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GA/KPF,EA+KS,WAAA,cAAA;AAEXC,EAAA;AAAA,EAAhBE,EAAM;AAAA,GAjLYH,EAiLF,WAAA,eAAA;AAGWC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GApLPF,EAoLS,WAAA,WAAA;AAoBFC,EAAA;AAAA,EAAzBE,EAAM;AAAA,GAxMYH,EAwMO,WAAA,gBAAA;AAGGC,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GA3MRF,EA2MU,WAAA,OAAA;"}
1
+ {"version":3,"file":"datatable.component.js","sources":["../../../src/components/datatable/datatable.component.ts"],"sourcesContent":["import {\n Cell,\n ColumnDef,\n flexRender,\n getCoreRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n Header,\n PaginationState,\n Row,\n RowData,\n RowSelectionState,\n SortingState,\n Table,\n TableController,\n} from '@tanstack/lit-table'\n// Extended column definition with textAlign property\nexport type ExtendedColumnDef<T> = ColumnDef<T, unknown> & {\n textAlign?: string\n headerTextAlign?: string\n disableDefaultSorting?: boolean\n /**\n * Pins the column to the left or right edge of the horizontally scrolling\n * viewport, so it stays visible while the other columns scroll under it.\n * Give a pinned column an explicit `size` — its width is what positions the\n * next column pinned to the same side. Columns pinned to one side stack in\n * DOM order out from that edge.\n */\n sticky?: 'left' | 'right'\n}\n\nimport clsx from 'clsx'\nimport { nothing, PropertyValueMap, unsafeCSS } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { html, unsafeStatic } from 'lit/static-html.js'\n\nimport { DdsElement } from '@/internal/dds-hu-element'\nimport { t } from '@/localization/localization'\n\nimport DapDSCheckbox from '../checkbox/checkbox.component'\nimport { IconSize } from '../icon/icon.component'\nimport ArrowsArrowDownSLine from '../icons/arrows/arrows-arrow-down-s-line/arrows-arrow-down-s-line.component'\nimport ArrowsArrowUpSLine from '../icons/arrows/arrows-arrow-up-s-line/arrows-arrow-up-s-line.component'\nimport DapDSPager from '../pager/pager.component'\nimport DapDSSkeleton from '../skeleton/skeleton.component'\nimport { SpinnerVariant } from '../spinner/spinner.component'\nimport DapDSSpinner from '../spinner/spinner.component'\nimport styles from './datatable.scss?inline'\nimport { renderCellContent } from './utils/cell-renderer'\n\nconst MULTISELECT_COLUMN_ID = '__multiSelect__'\n// Narrowest width a column can be dragged to when its definition sets no minSize\nconst DEFAULT_RESIZE_MIN_SIZE = 40\n// Width an auto-sized column (no size/minSize) contributes to the table's\n// min-width, so it is not squeezed to nothing when sized columns overflow\nconst AUTO_COLUMN_MIN_WIDTH = 100\n// Pixels a column grows or shrinks per arrow-key press on its resize handle\nconst RESIZE_KEYBOARD_STEP = 10\n\n// Type alias for sort state\ntype SortState = false | 'asc' | 'desc'\ntype LoadingType = 'spinner' | 'skeleton'\n\n/**\n * `dap-ds-datatable`\n * @summary A data table is a component that displays data in a tabular format.\n * @element dap-ds-datatable\n * @title - Data table\n * @generic T\n *\n * @event {{ sorting: SortingState }} dds-sorting-change - Fired when the sorting of the table changes.\n * @event {{ selection: RowSelectionState }} dds-selection-change - Fired when the selection of the table changes.\n * @event {{ pagination: PaginationState }} dds-pagination-change - Fired when the pagination of the table changes.\n * @event {{ row: Row<T> }} dds-row-click - Fired when a row is clicked.\n * @event {{ columnSizing: Record<string, number> }} dds-column-sizing-change - Fired when the user resizes a column (at the end of a drag, on each resize-handle key press, and when a double-click resets the column).\n *\n * @slot loading - The loading content of the table.\n * @slot empty - The empty content of the table.\n *\n * @csspart base - The main table container.\n * @csspart header - The header of the table.\n * @csspart header-row - The header row of the table.\n * @csspart header-cell - All cells of the header.\n * @csspart resize-handle - The column resize handle at the right edge of a resizable header cell.\n * @csspart body - The body of the table.\n * @csspart empty - The empty content of the table.\n * @csspart loading - The loading content of the table.\n * @csspart row - All rows of the table.\n * @csspart cell - All cells of the table.\n * @csspart pager - The pager of the table.\n * @csspart pager-base - The base of the pager.\n * @csspart pager-first - The first button of the pager.\n * @csspart pager-previous - The previous button of the pager.\n * @csspart pager-next - The next button of the pager.\n * @csspart pager-last - The last button of the pager.\n * @csspart pager-page-size-select - The page size select of the pager.\n * @csspart content - The content container of the table.\n * @csspart page-size-select-base - The base of the pager page size select.\n * @csspart page-size-select-trigger - The trigger of the pager page size select.\n * @csspart pager-button-first-base - The base of the pager first button.\n * @csspart pager-button-first-content - The content of the pager first button.\n * @csspart pager-button-previous-base - The base of the pager previous button.\n * @csspart pager-button-previous-content - The content of the pager previous button.\n * @csspart pager-button-next-base - The base of the pager next button.\n * @csspart pager-button-next-content - The content of the pager next button.\n * @csspart pager-button-last-base - The base of the pager last button.\n * @csspart pager-button-last-content - The content of the pager last button.\n * @csspart pager-page-numbers - The page numbers container of the pager.\n * @csspart pager-page-number - The page number buttons of the pager.\n * @csspart pager-page-number-active - The active page number button of the pager.\n * @csspart pager-page-number-base - The base of the pager page number buttons.\n * @csspart pager-page-number-content - The content of the pager page number buttons.\n * @csspart pager-page-info - The page info text of the pager.\n *\n * @cssproperty --dds-datatable-bg-color - Background color of the table. (default: var(--dds-background-neutral-subtle)).\n * @cssproperty --dds-datatable-border-color - Border color of the table cells. (default: var(--dds-border-neutral-divider))\n * @cssproperty --dds-datatable-header-bg-color - Background color of the table header. (default: var(--dds-background-neutral-subtle))\n * @cssproperty --dds-datatable-header-text-color - Text color of the table header. (default: var(--dds-text-neutral-strong))\n * @cssproperty --dds-datatable-row-hover-bg-color - Background color of hovered rows. (default: var(--dds-background-brand-strong))\n * @cssproperty --dds-datatable-row-selected-bg-color - Background color of selected rows. (default: var(--dds-background-brand-strong))\n * @cssproperty --dds-datatable-cell-padding - Padding of table cells. (default: var(--dds-spacing-200))\n * @cssproperty --dds-datatable-header-padding - Padding of header cells. (default: var(--dds-spacing-200))\n * @cssproperty --dds-datatable-last-column-padding - Padding of the last column. (default: var(--dds-spacing-500))\n * @cssproperty --dds-datatable-first-column-padding - Padding of the first column. (default: var(--dds-spacing-500))\n * @cssproperty --dds-datatable-border-width - Width of table borders. (default: var(--dds-border-width-base))\n * @cssproperty --dds-datatable-outer-border-width - Width of the outer container border only. (default: var(--dds-datatable-border-width))\n * @cssproperty --dds-datatable-header-border-width - Width of the header row bottom border only. (default: var(--dds-datatable-border-width))\n * @cssproperty --dds-datatable-row-border-width - Width of the row (body cell) bottom borders only. (default: var(--dds-datatable-border-width))\n * @cssproperty --dds-datatable-stripe-color - Background color for striped rows. (default: var(--dds-background-neutral-base))\n * @cssproperty --dds-datatable-border-radius - Border radius of the table. (default: var(--dds-radius-base))\n * @cssproperty --dds-datatable-shadow - Box shadow of the table. (default: none)\n * @cssproperty --dds-datatable-transition-duration - Duration of hover/selection transitions. (default: 0.2s)\n * @cssproperty --dds-datatable-z-index - Z-index of the table. (default: 1)\n * @cssproperty --dds-datatable-min-height - Minimum height of the table. (default: auto)\n * @cssproperty --dds-datatable-max-height - Maximum height of the table. (default: none)\n * @cssproperty --dds-datatable-overflow-x - Horizontal overflow behavior. (default: auto)\n * @cssproperty --dds-datatable-overflow-y - Vertical overflow behavior. (default: auto)\n * @cssproperty --dds-datatable-resize-handle-color - Color of the column resize indicator line on hover, focus and drag. (default: var(--dds-border-brand-base))\n */\nexport default class DapDSDataTable<T> extends DdsElement {\n static tagName = 'dap-ds-datatable'\n\n static dependencies = {\n 'dap-ds-checkbox': DapDSCheckbox,\n 'dap-ds-icon-arrow-up-s-line': ArrowsArrowUpSLine,\n 'dap-ds-icon-arrow-down-s-line': ArrowsArrowDownSLine,\n 'dap-ds-skeleton': DapDSSkeleton,\n 'dap-ds-spinner': DapDSSpinner,\n 'dap-ds-pager': DapDSPager,\n }\n\n static readonly styles = unsafeCSS(styles)\n\n private readonly tableController = new TableController<T>(this)\n\n // Pinned columns, recomputed each render: column id -> the edge it is pinned\n // to and the pixel offset from that edge. The offset accumulates the widths of\n // the columns pinned to the same side, so several pinned columns line up\n // instead of overlapping. Read by renderHeaderCell / renderBody.\n private stickyOffsets = new Map<\n string,\n { side: 'left' | 'right'; offset: number }\n >()\n\n /** Data to display in the table */\n @property({ attribute: false }) data: RowData[] = []\n /** Columns to display in the table */\n @property({ attribute: false }) columns: ExtendedColumnDef<T>[] = []\n\n /** Row key to use for row selection, this should be a unique key for each row */\n @property() rowKey: string = 'id'\n\n /** Enable row selection on the table, can be a boolean or a function that returns a boolean\n * @type {boolean | ((row: Row<T>) => boolean)}\n */\n @property({ type: Boolean }) enableRowSelection:\n | boolean\n | ((row: Row<T>) => boolean) = false\n /** Pin the built-in row-selection (checkbox) column to the left edge, so it\n * stays visible while the other columns scroll horizontally under it. */\n @property({ type: Boolean }) stickySelectionColumn: boolean = false\n /** Enable sorting on the table */\n @property({ type: Boolean }) enableSorting: boolean = false\n /** Let the user resize columns by dragging (or arrow-keying) a handle at the\n * right edge of each header cell. A column opts out with `enableResizing: false`\n * in its definition; `minSize` / `maxSize` bound the width. Read the result from\n * `dds-column-sizing-change` and pass it back through `columnSizing` to restore it. */\n @property({ type: Boolean }) enableColumnResizing: boolean = false\n /** Enable manual sorting on the table */\n @property({ type: Boolean }) manualSorting: boolean = false\n /** Enables manual pagination. If this option is set to true, the table will not automatically paginate rows and instead will expect you to manually paginate the rows before passing them to the table. This is useful if you are doing server-side pagination and aggregation. */\n @property({ type: Boolean }) manualPagination: boolean = false\n /** If set to true, pagination will be reset to the first page when page-altering state changes eg. data is updated, filters change, grouping changes, etc. This behavior is automatically disabled when manualPagination is true but it can be overridden by explicitly assigning a boolean value to the autoResetPageIndex table option. */\n @property({ type: Boolean }) autoResetPageIndex: boolean = false\n\n /** Enable row click on the table */\n @property({ type: Boolean }) enableRowClick: boolean = false\n\n /** Loading state of the table */\n @property({ type: Boolean }) loading: boolean = false\n\n /** Whether to enable striped rows */\n @property({ type: Boolean }) enableStripedRows: boolean = false\n\n /** Number of rows in the table */\n @property({ type: Number }) rowCount?: number\n\n /** Caption text for the table */\n @property({ type: String }) caption?: string\n\n /** The type of loading to use\n * @type {'spinner' | 'skeleton'}\n */\n @property({ type: String }) loadingType: LoadingType = 'spinner'\n\n /**\n * The variant of the spinner. Only used if loadingType is 'spinner'.\n * @type {\"neutral\" | \"brand\" | \"negative\" | \"positive\" | \"inverted\"}\n */\n @property({ type: String, reflect: true }) loadingVariant: SpinnerVariant =\n 'neutral'\n\n /**\n * The size of the spinner. Only used if loadingType is 'spinner'.\n * @type {\"xxl\" | \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\"}\n */\n @property({ type: String, reflect: true }) loadingSize: IconSize = 'lg'\n /** The size of the spinner in pixels. This overrides the size attribute. Only used if loadingType is 'spinner'. */\n @property({ type: Number }) loadingStaticSize?: number\n /** The loading text. Only used if loadingType is 'spinner'. */\n @property({ type: String }) loadingText: string\n\n /** The text to display when the table is empty. */\n @property({ type: String }) emptyText: string\n\n /** Whether to disable the header when the table is empty.\n * @type {'true' | 'false'}\n */\n @property({ type: String }) disableHeaderOnEmpty: string = 'true'\n\n /** Whether to show the pager component when the table is empty. */\n @property({ type: Boolean }) showPagerOnEmpty: boolean = false\n\n /** Whether to show the pager component */\n @property({ type: Boolean }) pager: boolean = false\n\n /** Show the page size options. */\n @property({ type: String }) showPageSizeOptions = 'true'\n /** Show the page index. */\n @property({ type: String }) showPageIndex = 'true'\n /** Show the page count. */\n @property({ type: String }) showPageCount = 'true'\n /** Show the first button. */\n @property({ type: String }) showFirstButton = 'true'\n /** Show the previous button. */\n @property({ type: String }) showPreviousButton = 'true'\n /** Show the next button. */\n @property({ type: String }) showNextButton = 'true'\n /** Show the last button. */\n @property({ type: String }) showLastButton = 'true'\n /** Show numbered page buttons between the previous and next buttons. */\n @property({ type: String }) showPageNumbers = 'false'\n /** How many page numbers to show on each side of the current page. */\n @property({ type: Number }) siblingCount = 1\n\n /** The label of the first button */\n @property({ type: String }) firstButtonLabel: string\n\n /** The label of the previous button */\n @property({ type: String }) previousButtonLabel: string\n\n /** The label of the next button */\n @property({ type: String }) nextButtonLabel: string\n\n /** The label of the last button */\n @property({ type: String }) lastButtonLabel: string\n\n /** `data-testid` for the column sort-toggle button. Suffixed with the column id. */\n @property() sortButtonTestId = 'datatable-sort-button'\n\n /** The function to determine the pager text\n * @type {(pageIndex: number, pageSize: number, totalRows: number) => string}\n */\n @property({ attribute: false }) pageStateText: (\n pageIndex: number,\n pageSize: number,\n totalRows: number,\n ) => string\n\n /** Available page size options for the pager\n * @type {number[]}\n */\n @property({ type: Array }) pageSizeOptions: number[] = [10, 25, 50, 100]\n\n /** Sorting state of the table */\n @property({ type: Array }) sorting: SortingState\n /** @ignore */\n @state() private _sorting: SortingState = []\n\n /** Selection state of the table */\n @property({ type: Object }) rowSelection: RowSelectionState\n /** @ignore */\n @state() private _rowSelection: RowSelectionState = {}\n\n /** Pagination state of the table */\n @property({ type: Object }) pagination: PaginationState\n /** @ignore */\n @state() private _pagination: PaginationState = {\n pageIndex: 0,\n pageSize: 10,\n }\n\n /** Column sizing state of the table: column id -> width in pixels. Overrides the\n * column definition's `size`; columns missing from it keep their defined width. */\n @property({ type: Object }) columnSizing?: Record<string, number>\n /** @ignore */\n @state() private _columnSizing: Record<string, number> = {}\n\n /** Accessible name of the table (its `aria-label`). Defaults to a translated table description. */\n @property({ type: String }) ariaLabel: string | null = null\n\n /** @ignore */\n private resizeObserver?: ResizeObserver\n\n /** @ignore */\n private get isTableEmpty(): boolean {\n // When using manual pagination with rowCount, check rowCount instead of data length\n if (this.manualPagination && this.rowCount !== undefined) {\n return this.rowCount === 0\n }\n return !this.data || this.data.length === 0\n }\n\n /** @ignore */\n private get shouldDisableHeaderActions(): boolean {\n return this.disableHeaderOnEmpty === 'true' && this.isTableEmpty\n }\n\n /** @ignore */\n @state() private readonly _statusMessage: string = ''\n\n /** @ignore */\n @property({ type: Boolean }) debug = false\n\n protected firstUpdated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.firstUpdated(_changedProperties)\n\n if (this.sorting) {\n this._sorting = this.sorting\n }\n\n if (this.rowSelection) {\n this._rowSelection = this.rowSelection\n }\n\n if (this.pagination) {\n this._pagination = this.pagination\n } else if (this.pageSizeOptions && this.pageSizeOptions.length > 0) {\n // If pagination is not explicitly set, use the first item in pageSizeOptions as default\n this._pagination = {\n ...this._pagination,\n pageSize: this.pageSizeOptions[0],\n }\n }\n }\n\n // Synced before render (not in updated()) so restored widths paint in the same\n // frame instead of one render late\n protected willUpdate(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.willUpdate(_changedProperties)\n\n if (_changedProperties.has('columnSizing')) {\n this._columnSizing = this.columnSizing ?? {}\n }\n }\n\n protected updated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.updated(_changedProperties)\n\n if (_changedProperties.has('pagination')) {\n this._pagination = this.pagination\n }\n\n if (_changedProperties.has('sorting')) {\n this._sorting = this.sorting\n }\n\n if (\n _changedProperties.has('rowSelection') ||\n _changedProperties.has('rowselection')\n ) {\n this._rowSelection = this.rowSelection\n }\n\n if (_changedProperties.has('data')) {\n this.requestUpdate()\n }\n }\n\n /**\n * Cleanup resize observer\n */\n disconnectedCallback(): void {\n super.disconnectedCallback()\n if (this.resizeObserver) {\n this.resizeObserver.disconnect()\n this.resizeObserver = undefined\n }\n }\n\n private readonly columnsMemo = () => {\n // Process columns to prevent TanStack Table's default 150px width\n // Set minSize: 0 for columns without explicit sizes so they default to 'auto' in colgroup\n const processedColumns = this.columns.map(col => {\n // If column has no size specified, set minSize to 0 to prevent default 150px\n if (!col.size && !col.minSize && !col.maxSize) {\n return { ...col, minSize: 0 }\n }\n return col\n })\n\n return [\n ...(this.enableRowSelection &&\n this.columns[0] &&\n this.columns[0].id !== MULTISELECT_COLUMN_ID\n ? [\n {\n id: MULTISELECT_COLUMN_ID,\n accessorKey: MULTISELECT_COLUMN_ID,\n enableSorting: false,\n enableResizing: false,\n size: 50,\n maxSize: 50,\n ...(this.stickySelectionColumn\n ? { sticky: 'left' as const }\n : {}),\n header: ({ table }: { table: Table<T> }) =>\n html`<dap-ds-checkbox\n isIndeterminate=${table.getIsSomeRowsSelected()}\n @dds-change=${table.getToggleAllRowsSelectedHandler()}\n .checked=\"${table.getIsAllRowsSelected()}\"\n .indeterminate=\"${table.getIsSomeRowsSelected()}\"\n ?disabled=\"${this.disableHeaderOnEmpty === 'true' &&\n this.isTableEmpty}\"></dap-ds-checkbox>`,\n cell: ({ row }: { row: any }) =>\n html`<dap-ds-checkbox\n @dds-change=\"${row.getToggleSelectedHandler()}\"\n .checked=\"${row.getIsSelected()}\"\n ?disabled=\"${!row.getCanSelect()}\"\n .indeterminate=\"${row.getIsSomeSelected()}\"></dap-ds-checkbox>`,\n },\n ]\n : []),\n ...processedColumns,\n ]\n }\n\n // Walks the visible leaf columns from each edge inward, giving every pinned\n // column its offset (the summed width of the already-seen pinned columns on\n // that side). getSize() resolves to the column's `size`, so a pinned column\n // without a size contributes 0 and the next one on that side would overlap it.\n private computeStickyOffsets(table: Table<T>) {\n const offsets = new Map<\n string,\n { side: 'left' | 'right'; offset: number }\n >()\n const columns = table.getVisibleLeafColumns()\n\n let right = 0\n for (let i = columns.length - 1; i >= 0; i--) {\n const column = columns[i]\n if ((column.columnDef as ExtendedColumnDef<T>).sticky === 'right') {\n offsets.set(column.id, { side: 'right', offset: right })\n right += column.getSize()\n }\n }\n\n let left = 0\n for (const column of columns) {\n if ((column.columnDef as ExtendedColumnDef<T>).sticky === 'left') {\n offsets.set(column.id, { side: 'left', offset: left })\n left += column.getSize()\n }\n }\n\n this.stickyOffsets = offsets\n }\n\n // Inline sticky positioning for a pinned column. z-index lifts the cell above\n // the row cells scrolling under it (needed for a left-pinned column, whose\n // siblings paint after it). The opaque background and edge divider come from\n // the `--sticky-*` classes in the stylesheet.\n private getStickyStyle(columnId: string): string | undefined {\n const sticky = this.stickyOffsets.get(columnId)\n if (!sticky) return undefined\n return `position: sticky; ${sticky.side}: ${sticky.offset}px; z-index: 1;`\n }\n\n private renderHeaderCell(\n header: Header<T, unknown>,\n _isLastColumn: boolean = false,\n ) {\n const columnDef = header.column.columnDef as ExtendedColumnDef<T>\n const canSort = header.column.getCanSort()\n const isSorted = header.column.getIsSorted()\n const nextSortOrder = header.column.getNextSortingOrder()\n const disableDefaultSorting = columnDef.disableDefaultSorting ?? false\n\n const sticky = this.stickyOffsets.get(header.column.id)\n const headerStyle =\n [this.getHeaderCellStyle(header), this.getStickyStyle(header.column.id)]\n .filter(Boolean)\n .join(' ') || undefined\n const contentStyle = columnDef.headerTextAlign\n ? `justify-content: ${columnDef.headerTextAlign};`\n : undefined\n\n const sortIcon = this.getSortIcon(isSorted)\n const sortTitle = this.getSortTitle(canSort, nextSortOrder)\n const canResize = this.getCanResize(header)\n\n return html`\n <th\n colspan=\"${header.colSpan}\"\n rowspan=\"${header.rowSpan}\"\n part=\"header-cell\"\n id=\"${this.getHeaderCellId(header.column.id)}\"\n class=${clsx(\n 'data-table-header-cell',\n sticky && `data-table-header-cell--sticky-${sticky.side}`,\n canResize && 'data-table-header-cell--resizable',\n )}\n scope=\"col\"\n aria-sort=${canSort && !this.shouldDisableHeaderActions\n ? this.getAriaSortValue(isSorted)\n : 'none'}\n style=\"${ifDefined(headerStyle)}\">\n ${this.renderHeaderCellContent(\n header,\n columnDef,\n canSort,\n disableDefaultSorting,\n sortTitle,\n contentStyle,\n sortIcon,\n )}\n ${canResize ? this.renderResizeHandle(header) : nothing}\n </th>\n `\n }\n\n private getHeaderCellId(columnId: string): string {\n return `data-table-header-${columnId}`\n }\n\n private getCanResize(header: Header<T, unknown>): boolean {\n const columnDef = header.column.columnDef as ExtendedColumnDef<T>\n return (\n this.enableColumnResizing &&\n header.colSpan === 1 &&\n header.column.id !== MULTISELECT_COLUMN_ID &&\n columnDef.enableResizing !== false\n )\n }\n\n private getResizeBounds(header: Header<T, unknown>) {\n const { minSize, maxSize } = header.column.columnDef\n return {\n min: minSize || DEFAULT_RESIZE_MIN_SIZE,\n max: maxSize && maxSize < Number.MAX_SAFE_INTEGER ? maxSize : undefined,\n }\n }\n\n // A resize steps from the column's nominal width (its resized width, else its\n // defined size), not the rendered one: a fixed-layout table narrower than its\n // container stretches every column, and feeding that stretch back in would\n // make each step overshoot. Only an `auto` column has no nominal width, so it\n // starts from what is on screen.\n private getStartWidth(\n header: Header<T, unknown>,\n handle: HTMLElement,\n ): number {\n const nominal =\n this._columnSizing[header.column.id] ?? header.column.columnDef.size\n if (nominal) return nominal\n const cell = handle.closest('th')\n return cell?.getBoundingClientRect().width || header.column.getSize()\n }\n\n private setColumnWidth(header: Header<T, unknown>, width: number) {\n const { min, max } = this.getResizeBounds(header)\n const clamped = Math.round(\n Math.min(Math.max(width, min), max ?? Number.POSITIVE_INFINITY),\n )\n if (this._columnSizing[header.column.id] === clamped) return false\n this._columnSizing = { ...this._columnSizing, [header.column.id]: clamped }\n return true\n }\n\n private emitColumnSizingChange() {\n this.emit('dds-column-sizing-change', {\n columnSizing: { ...this._columnSizing },\n })\n }\n\n private handleResizePointerDown(e: PointerEvent, header: Header<T, unknown>) {\n if (e.button !== 0) return\n e.preventDefault()\n e.stopPropagation()\n\n const handle = e.currentTarget as HTMLElement\n const startX = e.clientX\n const startWidth = this.getStartWidth(header, handle)\n let changed = false\n\n // Capture keeps hover effects off the cells the pointer crosses; the drag\n // itself listens on window, so it also survives when capture is refused\n // (e.g. a pointer id that is no longer active).\n try {\n handle.setPointerCapture(e.pointerId)\n } catch {\n // window listeners below still track the drag\n }\n this.toggleAttribute('resizing', true)\n\n const onMove = (moveEvent: PointerEvent) => {\n changed =\n this.setColumnWidth(header, startWidth + moveEvent.clientX - startX) ||\n changed\n }\n const onEnd = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onEnd)\n window.removeEventListener('pointercancel', onEnd)\n this.toggleAttribute('resizing', false)\n if (changed) this.emitColumnSizingChange()\n }\n\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onEnd)\n window.addEventListener('pointercancel', onEnd)\n }\n\n private handleResizeKeydown(e: KeyboardEvent, header: Header<T, unknown>) {\n const { min, max } = this.getResizeBounds(header)\n const current = this.getStartWidth(header, e.currentTarget as HTMLElement)\n const targets: Record<string, number | undefined> = {\n ArrowLeft: current - RESIZE_KEYBOARD_STEP,\n ArrowRight: current + RESIZE_KEYBOARD_STEP,\n Home: min,\n End: max,\n }\n if (!(e.key in targets)) return\n e.preventDefault()\n e.stopPropagation()\n\n const target = targets[e.key]\n if (target !== undefined && this.setColumnWidth(header, target)) {\n this.emitColumnSizingChange()\n }\n }\n\n // Double-click drops the override, so the column falls back to its defined size\n private handleResizeReset(e: MouseEvent, header: Header<T, unknown>) {\n e.preventDefault()\n e.stopPropagation()\n if (!(header.column.id in this._columnSizing)) return\n const { [header.column.id]: _removed, ...rest } = this._columnSizing\n this._columnSizing = rest\n this.emitColumnSizingChange()\n }\n\n // A focusable splitter (WAI-ARIA window splitter pattern): drag with the\n // pointer, ArrowLeft/ArrowRight to step, Home/End for the bounds. It is a\n // sibling of the sort button, so its clicks never toggle sorting.\n private renderResizeHandle(header: Header<T, unknown>) {\n const { min, max } = this.getResizeBounds(header)\n const width = Math.round(\n this._columnSizing[header.column.id] ?? header.column.getSize(),\n )\n\n return html`<div\n part=\"resize-handle\"\n class=\"data-table-resize-handle\"\n role=\"separator\"\n tabindex=\"0\"\n aria-orientation=\"vertical\"\n aria-labelledby=\"data-table-resize-label ${this.getHeaderCellId(\n header.column.id,\n )}\"\n aria-valuenow=${width}\n aria-valuemin=${min}\n aria-valuemax=${ifDefined(max)}\n @pointerdown=${(e: PointerEvent) =>\n this.handleResizePointerDown(e, header)}\n @keydown=${(e: KeyboardEvent) => this.handleResizeKeydown(e, header)}\n @dblclick=${(e: MouseEvent) => this.handleResizeReset(e, header)}\n @click=${(e: MouseEvent) => e.stopPropagation()}></div>`\n }\n\n private renderHeaderCellContent(\n header: Header<T, unknown>,\n columnDef: ExtendedColumnDef<T>,\n canSort: boolean,\n disableDefaultSorting: boolean,\n sortTitle: string | undefined,\n contentStyle: string | undefined,\n sortIcon: any,\n ) {\n if (!canSort) {\n return flexRender(columnDef.header, header.getContext())\n }\n\n // Disable sorting if disableHeaderOnEmpty is true and table is empty\n const elementTag =\n disableDefaultSorting || this.shouldDisableHeaderActions\n ? 'div'\n : 'dap-ds-button'\n const clickHandler =\n !disableDefaultSorting && !this.shouldDisableHeaderActions\n ? header.column.getToggleSortingHandler()\n : null\n const cursorStyle =\n canSort && !this.shouldDisableHeaderActions ? 'pointer' : 'not-allowed'\n\n return html`<${unsafeStatic(elementTag)}\n class=\"data-table-header-cell__controller\"\n variant=\"clean\"\n data-testid=\"${this.sortButtonTestId}-${header.column.id}\"\n title=${ifDefined(sortTitle)}\n @click=\"${clickHandler}\"\n style=\"cursor: ${cursorStyle}\">\n <span \n part=\"content\" \n class=\"data-table-header-cell__content\"\n style=\"${ifDefined(contentStyle)}\">\n ${flexRender(columnDef.header, header.getContext())}\n ${sortIcon}\n </span>\n </${unsafeStatic(elementTag)}>`\n }\n\n private getHeaderCellStyle(header: Header<T, unknown>): string | undefined {\n const columnDef = header.column.columnDef as ExtendedColumnDef<T>\n const width = this._columnSizing[header.column.id] ?? columnDef.size\n if (!width && !columnDef.maxSize && !columnDef.headerTextAlign) {\n return undefined\n }\n\n return `\n ${width ? `width: ${width}px;` : ''}\n ${columnDef.maxSize ? `max-width: ${columnDef.maxSize}px;` : ''}\n ${columnDef.headerTextAlign ? `text-align: ${columnDef.headerTextAlign};` : ''}\n `\n }\n\n // Replace this union type with a type alias.\n private getSortIcon(isSorted: SortState) {\n if (isSorted === 'asc') {\n return html`<dap-ds-icon-arrow-up-s-line\n size=\"16\"></dap-ds-icon-arrow-up-s-line>`\n }\n if (isSorted === 'desc') {\n return html`<dap-ds-icon-arrow-down-s-line\n size=\"16\"></dap-ds-icon-arrow-down-s-line>`\n }\n return null\n }\n\n private getSortTitle(\n canSort: boolean,\n nextSortOrder: false | 'asc' | 'desc',\n ): string | undefined {\n if (!canSort) return undefined\n\n if (nextSortOrder === 'asc') return t('datatable.sortAscending')\n if (nextSortOrder === 'desc') return t('datatable.sortDescending')\n return t('datatable.clearSort')\n }\n\n private getAriaSortValue(\n isSorted: SortState,\n ): 'ascending' | 'descending' | 'none' {\n if (isSorted === 'asc') return 'ascending'\n if (isSorted === 'desc') return 'descending'\n return 'none'\n }\n\n /**\n * Render cell content with support for multiple formats\n * Supports: primitives, styled objects, HTMLElements, HTML strings,\n * render callbacks, and Lit templates\n */\n private renderCell(cell: Cell<T, unknown>) {\n const content = cell.column.columnDef.cell\n const context = cell.getContext()\n\n // Get raw content from cell renderer\n const rawContent =\n typeof content === 'function' ? content(context) : content\n\n // Process through multi-format renderer\n const processed = renderCellContent(rawContent)\n\n // If it's already a Lit template or primitive, use flexRender\n // Otherwise, return the processed content directly\n if (\n typeof processed === 'string' ||\n typeof processed === 'number' ||\n typeof processed === 'boolean' ||\n processed === null ||\n processed === undefined\n ) {\n return processed\n }\n\n // For HTMLElement or complex content, wrap in lit-html unsafeHTML\n if (processed instanceof HTMLElement) {\n // Return the element directly - Lit can handle HTMLElements\n return processed\n }\n\n // For everything else (TemplateResult), use flexRender\n return flexRender(content, context)\n }\n\n private handleRowClick(row: Row<T>): void {\n if (this.enableRowClick) {\n this.emit('dds-row-click', { row })\n }\n }\n\n private handleRowKeydown(e: KeyboardEvent, row: Row<T>): void {\n if (e.key === 'Enter' || e.key === ' ') {\n // Don't prevent default or handle row click if the event originated from\n // an interactive element inside the cell (button, link, input, etc.)\n // Use composedPath() to check the actual originating element across shadow DOM boundaries\n const composedPath = e.composedPath()\n\n // Check if any element in the composed path is an interactive element\n const isInteractiveElement = composedPath.some(element => {\n if (!(element instanceof HTMLElement)) return false\n // Check native elements\n if (\n ['BUTTON', 'A', 'INPUT', 'SELECT', 'TEXTAREA'].includes(\n element.tagName,\n )\n ) {\n return true\n }\n // Check role=\"button\"\n if (element.getAttribute('role') === 'button') {\n return true\n }\n // Check for custom button elements (like dap-ds-button)\n // These typically have a button-like tag name or contain 'button' in their name\n if (\n element.tagName.toLowerCase().includes('button') ||\n element.tagName.toLowerCase().includes('btn')\n ) {\n return true\n }\n return false\n })\n\n if (isInteractiveElement) {\n // Let the interactive element handle the keyboard event naturally\n return\n }\n\n e.preventDefault()\n this.handleRowClick(row)\n }\n }\n\n // The id TanStack keys sizing state by: an explicit id, else the accessorKey\n private columnIdOf(columnDef: ExtendedColumnDef<T>): string | undefined {\n return columnDef.id ?? (columnDef as { accessorKey?: string }).accessorKey\n }\n\n // The table's min-width: the sum of every column's nominal width. A fixed-layout\n // table only grows to its sized columns, so without this the auto columns get\n // squeezed out. (`min-width: max-content` is not an option: Firefox resolves a\n // fixed-layout table's max-content to infinity and stretches the first column.)\n // Reads the column definitions, not table.getAllLeafColumns(): TanStack merges\n // its default 150px size into every column, which would hide the auto ones.\n private getTableMinWidth(): number {\n return this.columnsMemo().reduce((sum, col) => {\n const columnDef = col as ExtendedColumnDef<T>\n const id = this.columnIdOf(columnDef)\n const width =\n (id && this._columnSizing[id]) ||\n columnDef.size ||\n columnDef.minSize ||\n AUTO_COLUMN_MIN_WIDTH\n return sum + width\n }, 0)\n }\n\n private readonly renderColgroup = (_table: Table<T>) => {\n const columns = this.columnsMemo()\n const columnSizing = this._columnSizing\n\n return html`\n <colgroup>\n ${repeat(\n columns,\n (col, index) => col.id || `col-${index}`,\n col => {\n const columnDef = col as ExtendedColumnDef<T>\n let width: string\n\n // Use calculated sizing if available (from widthPercentage or explicit size)\n const id = this.columnIdOf(columnDef)\n if (id && columnSizing[id]) {\n width = `${columnSizing[id]}px`\n }\n // Use explicit size from column definition\n else if (columnDef.size) {\n width = `${columnDef.size}px`\n }\n // Default to 'auto' for flexible columns (no explicit size or widthPercentage)\n else {\n width = 'auto'\n }\n\n return html`<col style=\"width: ${width};\" />`\n },\n )}\n </colgroup>\n `\n }\n\n private readonly renderHeader = (table: Table<T>) => {\n return html`\n <thead part=\"header\">\n ${repeat(\n table.getHeaderGroups(),\n headerGroup => headerGroup.id,\n headerGroup => html`\n <tr\n part=\"header-row\"\n class=${clsx('data-table-header-row', {\n 'data-table-header-row--striped': this.enableStripedRows,\n })}>\n ${repeat(\n headerGroup.headers,\n header => header.id,\n header => this.renderHeaderCell(header),\n )}\n </tr>\n `,\n )}\n </thead>\n `\n }\n\n private readonly renderSkeletonRows = (\n rowCount: number,\n cellCount: number,\n ) => {\n return html`\n ${repeat(\n Array.from({ length: rowCount }, (_, index) => index),\n index => index,\n _index => html`\n <tr class=\"data-table-row\">\n ${repeat(\n Array.from({ length: cellCount }, (_, index) => index),\n index => index,\n _index =>\n html`<td class=\"data-table-cell\">\n <dap-ds-skeleton></dap-ds-skeleton>\n </td>`,\n )}\n </tr>\n `,\n )}\n `\n }\n\n private readonly renderBody = (table: Table<T>) => {\n return html`\n ${this.loading\n ? html`<tbody part=\"body\">\n ${this.loadingType === 'spinner'\n ? html`\n <tr>\n <td\n colspan=\"${this.columnsMemo().length}\"\n class=\"data-table-cell\">\n <div part=\"loading\" class=\"data-table-placeholder\">\n <slot name=\"loading\">\n <dap-ds-spinner\n size=${this.loadingSize}\n variant=${this.loadingVariant}\n .staticSize=${this.loadingStaticSize}\n .text=${this.loadingText}></dap-ds-spinner>\n </slot>\n </div>\n </td>\n </tr>\n `\n : html`\n ${this.renderSkeletonRows(\n this._pagination.pageSize ?? 10,\n this.columnsMemo().length,\n )}\n `}\n </tbody>`\n : html`\n <tbody part=\"body\">\n ${this.isTableEmpty\n ? html`<tr class=\"data-table-row data-table-row--empty\">\n <td\n colspan=\"${this.columnsMemo().length}\"\n class=\"data-table-cell\">\n <div part=\"empty\" class=\"data-table-placeholder\">\n <slot name=\"empty\">\n <span\n >${this.emptyText ?? t('datatable.noData')}</span\n >\n </slot>\n </div>\n </td>\n </tr>`\n : table.getRowModel().rows.map(\n (row, index) => html`\n <tr\n part=\"row\"\n role=${this.enableRowClick ? 'button' : 'row'}\n tabindex=${this.enableRowClick ? 0 : -1}\n aria-selected=${row.getIsSelected()}\n aria-rowindex=${index + 2}\n class=${clsx('data-table-row', {\n 'data-table-row--selected': row.getIsSelected(),\n 'data-table-row--clickable': this.enableRowClick,\n 'data-table-row--striped': this.enableStripedRows,\n })}\n @click=${() => this.handleRowClick(row)}\n @keydown=${(e: KeyboardEvent) =>\n this.handleRowKeydown(e, row)}>\n ${row.getVisibleCells().map(cell => {\n const columnDef = cell.column\n .columnDef as ExtendedColumnDef<T>\n const sticky = this.stickyOffsets.get(cell.column.id)\n const cellStyle =\n [\n columnDef.textAlign &&\n `text-align: ${columnDef.textAlign};`,\n this.getStickyStyle(cell.column.id),\n ]\n .filter(Boolean)\n .join(' ') || undefined\n return html`\n <td\n part=\"cell\"\n class=${clsx(\n 'data-table-cell',\n sticky &&\n `data-table-cell--sticky-${sticky.side}`,\n )}\n style=\"${ifDefined(cellStyle)}\">\n ${this.renderCell(cell)}\n </td>\n `\n })}\n </tr>\n `,\n )}\n </tbody>\n `}\n `\n }\n\n protected render() {\n const table = this.tableController.table({\n data: this.data as T[],\n columns: this.columnsMemo(),\n filterFns: {},\n state: {\n sorting: this._sorting,\n rowSelection: this._rowSelection,\n pagination: this._pagination,\n columnSizing: this._columnSizing,\n },\n manualSorting: this.manualSorting,\n enableSorting: this.enableSorting,\n enableRowSelection: this.enableRowSelection,\n manualPagination: this.manualPagination,\n autoResetPageIndex: this.autoResetPageIndex,\n onSortingChange: updaterOrValue => {\n if (typeof updaterOrValue === 'function') {\n this._sorting = updaterOrValue(this._sorting)\n } else {\n this._sorting = updaterOrValue\n }\n\n this.emit('dds-sorting-change', { sorting: this._sorting })\n },\n getCoreRowModel: getCoreRowModel(),\n ...(!this.manualSorting && {\n getSortedRowModel: getSortedRowModel(),\n }),\n getPaginationRowModel: getPaginationRowModel(),\n onPaginationChange: updaterOrValue => {\n if (typeof updaterOrValue === 'function') {\n this._pagination = updaterOrValue(this._pagination)\n } else {\n this._pagination = updaterOrValue\n }\n\n this.emit('dds-pagination-change', {\n pagination: {\n pageIndex: this._pagination.pageIndex,\n pageSize: this._pagination.pageSize,\n },\n })\n },\n onRowSelectionChange: updaterOrValue => {\n if (typeof updaterOrValue === 'function') {\n this._rowSelection = updaterOrValue(this._rowSelection)\n } else {\n this._rowSelection = updaterOrValue\n }\n\n this.emit('dds-selection-change', { selection: this._rowSelection })\n },\n getRowId: originalRow => {\n return (originalRow as Record<string, any>)[this.rowKey]\n },\n rowCount: this.rowCount ?? (this.data ? this.data.length : 0),\n debugTable: this.debug,\n debugHeaders: this.debug,\n debugColumns: this.debug,\n })\n\n // Resolve pinned-column offsets before rendering the header/body cells that\n // read them off this.stickyOffsets.\n this.computeStickyOffsets(table)\n\n return html`\n <div class=\"data-table-container\">\n <table\n part=\"base\"\n role=\"table\"\n aria-label=${ifDefined(\n this.ariaLabel ?? t('datatable.tableDescription'),\n )}\n aria-describedby=${ifDefined(this.ariaDescribedBy)}\n aria-rowcount=${this.rowCount ?? (this.data ? this.data.length : 0)}\n class=${clsx('data-table', {\n 'data-table--loading': this.loading,\n })}\n style=\"min-width: ${this.getTableMinWidth()}px;\">\n ${this.caption\n ? html`<caption class=\"visually-hidden\">\n ${this.caption}\n </caption>`\n : nothing}\n ${this.renderColgroup(table)} ${this.renderHeader(table)}\n ${this.renderBody(table)}\n </table>\n </div>\n ${this.enableColumnResizing\n ? html`<span id=\"data-table-resize-label\" hidden\n >${t('datatable.resizeColumn')}</span\n >`\n : nothing}\n ${this._statusMessage\n ? html`<div\n aria-live=\"polite\"\n aria-atomic=\"true\"\n class=\"visually-hidden\"\n id=\"table-status\">\n ${this._statusMessage}\n </div>`\n : nothing}\n ${(this.pager && !this.isTableEmpty) ||\n (this.pager && this.showPagerOnEmpty && this.isTableEmpty)\n ? html`<dap-ds-pager\n class=\"data-table-pager\"\n part=\"pager\"\n .disabled=${this.isTableEmpty}\n .manualPagination=${this.manualPagination}\n .pageIndex=${table.getState().pagination.pageIndex}\n .pageSize=${table.getState().pagination.pageSize}\n .totalRows=${this.rowCount ?? (this.data ? this.data.length : 0)}\n .pageSizeOptions=${this.pageSizeOptions}\n .showPageSizeOptions=${this.showPageSizeOptions}\n .showPageIndex=${this.showPageIndex}\n .showPageCount=${this.showPageCount}\n .showFirstButton=${this.showFirstButton}\n .showPreviousButton=${this.showPreviousButton}\n .showNextButton=${this.showNextButton}\n .showLastButton=${this.showLastButton}\n .showPageNumbers=${this.showPageNumbers}\n .siblingCount=${this.siblingCount}\n .firstButtonLabel=${this.firstButtonLabel}\n .previousButtonLabel=${this.previousButtonLabel}\n .nextButtonLabel=${this.nextButtonLabel}\n .lastButtonLabel=${this.lastButtonLabel}\n .pageStateText=${this.pageStateText}\n exportparts=\"base:pager-base, first:pager-first, previous:pager-previous, next:pager-next, last:pager-last, page-size:pager-page-size-select, page-size-select-base:page-size-select-base, page-size-select-trigger:page-size-select-trigger, pager-button-first-base:pager-button-first-base, pager-button-first-content:pager-button-first-content, pager-button-previous-base:pager-button-previous-base, pager-button-previous-content:pager-button-previous-content, pager-button-next-base:pager-button-next-base, pager-button-next-content:pager-button-next-content, pager-button-last-base:pager-button-last-base, pager-button-last-content:pager-button-last-content, page-numbers:pager-page-numbers, page-number:pager-page-number, page-number-active:pager-page-number-active, page-number-base:pager-page-number-base, page-number-content:pager-page-number-content, page-info:pager-page-info\"\n @dds-pagination-change=${(e: any) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (e.detail.action === 'pageSize') {\n table.setPageSize(e.detail.pagination.pageSize)\n } else {\n table.setPageIndex(e.detail.pagination.pageIndex)\n }\n }}>\n <slot name=\"first-button-label\" slot=\"first-button-label\">\n ${this.firstButtonLabel || t('pager.first')}\n </slot>\n <slot name=\"previous-button-label\" slot=\"previous-button-label\">\n ${this.previousButtonLabel || t('pager.previous')}\n </slot>\n <slot name=\"next-button-label\" slot=\"next-button-label\">\n ${this.nextButtonLabel || t('pager.next')}\n </slot>\n <slot name=\"last-button-label\" slot=\"last-button-label\">\n ${this.lastButtonLabel || t('pager.last')}\n </slot>\n </dap-ds-pager>`\n : nothing}\n `\n }\n}\n"],"names":["MULTISELECT_COLUMN_ID","DEFAULT_RESIZE_MIN_SIZE","AUTO_COLUMN_MIN_WIDTH","RESIZE_KEYBOARD_STEP","_DapDSDataTable","DdsElement","TableController","processedColumns","col","__spreadProps","__spreadValues","table","html","row","_table","columns","columnSizing","repeat","index","columnDef","width","id","headerGroup","clsx","header","rowCount","cellCount","_","_index","_a","_b","t","e","cell","sticky","cellStyle","ifDefined","_changedProperties","offsets","right","i","column","left","columnId","_isLastColumn","canSort","isSorted","nextSortOrder","disableDefaultSorting","headerStyle","contentStyle","sortIcon","sortTitle","canResize","nothing","minSize","maxSize","handle","nominal","min","max","clamped","startX","startWidth","changed","onMove","moveEvent","onEnd","current","targets","target","_removed","rest","__objRest","__restKey","flexRender","elementTag","clickHandler","cursorStyle","unsafeStatic","content","context","rawContent","processed","renderCellContent","element","sum","updaterOrValue","getCoreRowModel","getSortedRowModel","getPaginationRowModel","originalRow","_c","_d","DapDSCheckbox","ArrowsArrowUpSLine","ArrowsArrowDownSLine","DapDSSkeleton","DapDSSpinner","DapDSPager","unsafeCSS","styles","DapDSDataTable","__decorateClass","property","state"],"mappings":"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"}
@@ -1,36 +1,43 @@
1
- import { nothing as a } from "lit";
2
- function o(e) {
1
+ import u from "../../../node_modules/dompurify/dist/purify.es.js";
2
+ import { nothing as o } from "lit";
3
+ function f(e) {
3
4
  return typeof e == "object" && e !== null && "_$litType$" in e && "strings" in e && "values" in e;
4
5
  }
5
6
  function c(e) {
6
7
  return typeof e == "object" && e !== null && "value" in e && ("style" in e || "className" in e);
7
8
  }
8
- function f(e) {
9
+ function d(e) {
9
10
  return typeof e == "object" && e !== null && "html" in e;
10
11
  }
11
- function d(e) {
12
+ function m(e) {
12
13
  return typeof e == "object" && e !== null && "render" in e && typeof e.render == "function";
13
14
  }
14
- function m(e) {
15
- const n = document.createElement("div");
16
- return n.textContent = e, n.innerHTML;
15
+ const p = {
16
+ CUSTOM_ELEMENT_HANDLING: {
17
+ tagNameCheck: /^dap-ds-/,
18
+ attributeNameCheck: /^(?!on)[a-z][a-z0-9-]*$/i,
19
+ allowCustomizedBuiltInElements: !1
20
+ }
21
+ };
22
+ function C(e) {
23
+ return u.sanitize(e, p);
17
24
  }
18
- function p(e) {
25
+ function y(e) {
19
26
  const { value: n, style: t, className: r } = e, i = document.createElement("span");
20
- return r && (i.className = r), t && Object.entries(t).forEach(([u, l]) => {
27
+ return r && (i.className = r), t && Object.entries(t).forEach(([a, l]) => {
21
28
  if (l != null) {
22
- const s = u.replace(/([A-Z])/g, "-$1").toLowerCase();
29
+ const s = a.replace(/([A-Z])/g, "-$1").toLowerCase();
23
30
  i.style.setProperty(s, String(l));
24
31
  }
25
32
  }), i.textContent = n != null ? String(n) : "", i;
26
33
  }
27
- function y(e) {
34
+ function E(e) {
28
35
  const { html: n, sanitize: t = !0 } = e, r = document.createElement("div");
29
- return t ? r.innerHTML = m(n) : (console.warn(
36
+ return t ? r.innerHTML = C(n) : (console.warn(
30
37
  "Rendering unsanitized HTML in datatable cell. This may be a security risk."
31
38
  ), r.innerHTML = n), r.children.length === 1 ? r.firstElementChild : r;
32
39
  }
33
- function C(e) {
40
+ function h(e) {
34
41
  const { render: n, cleanup: t } = e, r = document.createElement("div");
35
42
  r.className = "cell-render-container";
36
43
  try {
@@ -40,10 +47,10 @@ function C(e) {
40
47
  }
41
48
  return t && (r.__cleanup = t), r;
42
49
  }
43
- function h(e) {
44
- return e == null ? a : o(e) || e instanceof HTMLElement ? e : d(e) ? C(e) : f(e) ? y(e) : c(e) ? p(e) : e;
50
+ function b(e) {
51
+ return e == null ? o : f(e) || e instanceof HTMLElement ? e : m(e) ? h(e) : d(e) ? E(e) : c(e) ? y(e) : e;
45
52
  }
46
53
  export {
47
- h as renderCellContent
54
+ b as renderCellContent
48
55
  };
49
56
  //# sourceMappingURL=cell-renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cell-renderer.js","sources":["../../../../src/components/datatable/utils/cell-renderer.ts"],"sourcesContent":["import type { TemplateResult } from 'lit'\nimport { nothing } from 'lit'\n\nimport type {\n CellContent,\n HtmlCellContent,\n RenderCallbackContent,\n StyledCellContent,\n} from '../types/cell-content'\n\n/**\n * Type guard to check if content is a Lit TemplateResult\n */\nfunction isTemplateResult(content: unknown): content is TemplateResult {\n return (\n typeof content === 'object' &&\n content !== null &&\n '_$litType$' in content &&\n 'strings' in content &&\n 'values' in content\n )\n}\n\n/**\n * Type guard to check if content is a styled cell content object\n */\nfunction isStyledCellContent(content: unknown): content is StyledCellContent {\n return (\n typeof content === 'object' &&\n content !== null &&\n 'value' in content &&\n ('style' in content || 'className' in content)\n )\n}\n\n/**\n * Type guard to check if content is an HTML cell content object\n */\nfunction isHtmlCellContent(content: unknown): content is HtmlCellContent {\n return typeof content === 'object' && content !== null && 'html' in content\n}\n\n/**\n * Type guard to check if content is a render callback object\n */\nfunction isRenderCallbackContent(\n content: unknown,\n): content is RenderCallbackContent {\n return (\n typeof content === 'object' &&\n content !== null &&\n 'render' in content &&\n typeof (content as RenderCallbackContent).render === 'function'\n )\n}\n\n/**\n * Sanitize HTML string using DOMPurify\n * Falls back to basic escaping if DOMPurify is not available\n */\nfunction sanitizeHtml(html: string): string {\n // TODO: Add DOMPurify dependency and use it for sanitization\n // For now, use basic escaping\n const div = document.createElement('div')\n div.textContent = html\n return div.innerHTML\n}\n\n/**\n * Apply styles to a styled cell content\n */\nfunction applyStyledValue(content: StyledCellContent) {\n const { value, style, className } = content\n\n // Create wrapper span with styles\n const span = document.createElement('span')\n\n // Apply className if provided\n if (className) {\n span.className = className\n }\n\n // Apply inline styles if provided\n if (style) {\n Object.entries(style).forEach(([key, val]) => {\n if (val !== undefined && val !== null) {\n // Convert camelCase to kebab-case for CSS properties\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase()\n span.style.setProperty(cssKey, String(val))\n }\n })\n }\n\n // Set content\n span.textContent = value != null ? String(value) : ''\n\n return span\n}\n\n/**\n * Render HTML string content\n */\nfunction renderHtmlContent(content: HtmlCellContent) {\n const { html: htmlString, sanitize = true } = content\n\n const container = document.createElement('div')\n\n if (sanitize) {\n // Sanitize HTML before rendering\n container.innerHTML = sanitizeHtml(htmlString)\n } else {\n // Use unsanitized HTML (dangerous!)\n console.warn(\n 'Rendering unsanitized HTML in datatable cell. This may be a security risk.',\n )\n container.innerHTML = htmlString\n }\n\n // Return the first child if single element, otherwise return container\n return container.children.length === 1\n ? (container.firstElementChild as HTMLElement)\n : container\n}\n\n/**\n * Render callback content\n * Returns a Lit directive that calls the render callback\n */\nfunction renderCallbackContent(content: RenderCallbackContent) {\n const { render: renderFn, cleanup } = content\n\n // Create container element\n const container = document.createElement('div')\n container.className = 'cell-render-container'\n\n // Call render function\n try {\n renderFn(container)\n } catch (error) {\n console.error('Error rendering cell content:', error)\n container.textContent = 'Error rendering cell'\n }\n\n // Store cleanup function for later\n if (cleanup) {\n // Attach cleanup to container for lifecycle management\n ;(container as any).__cleanup = cleanup\n }\n\n return container\n}\n\n/**\n * Main cell content renderer\n * Detects content type and returns appropriate rendering\n *\n * @param content - The cell content in any supported format\n * @returns Rendered content (TemplateResult, HTMLElement, or primitive)\n */\nexport function renderCellContent(content: CellContent): unknown {\n // Handle null/undefined\n if (content === null || content === undefined) {\n return nothing\n }\n\n // Format 6: Lit TemplateResult - pass through unchanged\n if (isTemplateResult(content)) {\n return content\n }\n\n // Format 3: HTMLElement - pass through unchanged\n if (content instanceof HTMLElement) {\n return content\n }\n\n // Format 5: Render Callback - execute and return element\n if (isRenderCallbackContent(content)) {\n return renderCallbackContent(content)\n }\n\n // Format 4: HTML String - sanitize and render\n if (isHtmlCellContent(content)) {\n return renderHtmlContent(content)\n }\n\n // Format 2: Styled Object - apply styles and return\n if (isStyledCellContent(content)) {\n return applyStyledValue(content)\n }\n\n // Format 1: Primitive Value - render directly\n // (string, number, boolean)\n return content\n}\n\n/**\n * Cleanup cell content\n * Calls cleanup callbacks if present\n *\n * @param element - The rendered element that may contain cleanup callbacks\n */\nexport function cleanupCellContent(element: unknown): void {\n if (element instanceof HTMLElement) {\n const cleanup = (element as any).__cleanup\n if (typeof cleanup === 'function') {\n try {\n cleanup()\n } catch (error) {\n console.error('Error cleaning up cell content:', error)\n }\n delete (element as any).__cleanup\n }\n }\n}\n"],"names":["isTemplateResult","content","isStyledCellContent","isHtmlCellContent","isRenderCallbackContent","sanitizeHtml","html","div","applyStyledValue","value","style","className","span","key","val","cssKey","renderHtmlContent","htmlString","sanitize","container","renderCallbackContent","renderFn","cleanup","error","renderCellContent","nothing"],"mappings":";AAaA,SAASA,EAAiBC,GAA6C;AAEnE,SAAA,OAAOA,KAAY,YACnBA,MAAY,QACZ,gBAAgBA,KAChB,aAAaA,KACb,YAAYA;AAEhB;AAKA,SAASC,EAAoBD,GAAgD;AAEzE,SAAA,OAAOA,KAAY,YACnBA,MAAY,QACZ,WAAWA,MACV,WAAWA,KAAW,eAAeA;AAE1C;AAKA,SAASE,EAAkBF,GAA8C;AACvE,SAAO,OAAOA,KAAY,YAAYA,MAAY,QAAQ,UAAUA;AACtE;AAKA,SAASG,EACPH,GACkC;AAEhC,SAAA,OAAOA,KAAY,YACnBA,MAAY,QACZ,YAAYA,KACZ,OAAQA,EAAkC,UAAW;AAEzD;AAMA,SAASI,EAAaC,GAAsB;AAGpC,QAAAC,IAAM,SAAS,cAAc,KAAK;AACxC,SAAAA,EAAI,cAAcD,GACXC,EAAI;AACb;AAKA,SAASC,EAAiBP,GAA4B;AACpD,QAAM,EAAE,OAAAQ,GAAO,OAAAC,GAAO,WAAAC,EAAc,IAAAV,GAG9BW,IAAO,SAAS,cAAc,MAAM;AAG1C,SAAID,MACFC,EAAK,YAAYD,IAIfD,KACK,OAAA,QAAQA,CAAK,EAAE,QAAQ,CAAC,CAACG,GAAKC,CAAG,MAAM;AACxC,QAAqBA,KAAQ,MAAM;AAErC,YAAMC,IAASF,EAAI,QAAQ,YAAY,KAAK,EAAE,YAAY;AAC1D,MAAAD,EAAK,MAAM,YAAYG,GAAQ,OAAOD,CAAG,CAAC;AAAA,IAAA;AAAA,EAC5C,CACD,GAIHF,EAAK,cAAcH,KAAS,OAAO,OAAOA,CAAK,IAAI,IAE5CG;AACT;AAKA,SAASI,EAAkBf,GAA0B;AACnD,QAAM,EAAE,MAAMgB,GAAY,UAAAC,IAAW,GAAS,IAAAjB,GAExCkB,IAAY,SAAS,cAAc,KAAK;AAE9C,SAAID,IAEQC,EAAA,YAAYd,EAAaY,CAAU,KAGrC,QAAA;AAAA,IACN;AAAA,EACF,GACAE,EAAU,YAAYF,IAIjBE,EAAU,SAAS,WAAW,IAChCA,EAAU,oBACXA;AACN;AAMA,SAASC,EAAsBnB,GAAgC;AAC7D,QAAM,EAAE,QAAQoB,GAAU,SAAAC,EAAY,IAAArB,GAGhCkB,IAAY,SAAS,cAAc,KAAK;AAC9C,EAAAA,EAAU,YAAY;AAGlB,MAAA;AACF,IAAAE,EAASF,CAAS;AAAA,WACXI,GAAO;AACN,YAAA,MAAM,iCAAiCA,CAAK,GACpDJ,EAAU,cAAc;AAAA,EAAA;AAI1B,SAAIG,MAEAH,EAAkB,YAAYG,IAG3BH;AACT;AASO,SAASK,EAAkBvB,GAA+B;AAE3D,SAAAA,KAAY,OACPwB,IAILzB,EAAiBC,CAAO,KAKxBA,aAAmB,cACdA,IAILG,EAAwBH,CAAO,IAC1BmB,EAAsBnB,CAAO,IAIlCE,EAAkBF,CAAO,IACpBe,EAAkBf,CAAO,IAI9BC,EAAoBD,CAAO,IACtBO,EAAiBP,CAAO,IAK1BA;AACT;"}
1
+ {"version":3,"file":"cell-renderer.js","sources":["../../../../src/components/datatable/utils/cell-renderer.ts"],"sourcesContent":["import DOMPurify from 'dompurify'\nimport type { TemplateResult } from 'lit'\nimport { nothing } from 'lit'\n\nimport type {\n CellContent,\n HtmlCellContent,\n RenderCallbackContent,\n StyledCellContent,\n} from '../types/cell-content'\n\n/**\n * Type guard to check if content is a Lit TemplateResult\n */\nfunction isTemplateResult(content: unknown): content is TemplateResult {\n return (\n typeof content === 'object' &&\n content !== null &&\n '_$litType$' in content &&\n 'strings' in content &&\n 'values' in content\n )\n}\n\n/**\n * Type guard to check if content is a styled cell content object\n */\nfunction isStyledCellContent(content: unknown): content is StyledCellContent {\n return (\n typeof content === 'object' &&\n content !== null &&\n 'value' in content &&\n ('style' in content || 'className' in content)\n )\n}\n\n/**\n * Type guard to check if content is an HTML cell content object\n */\nfunction isHtmlCellContent(content: unknown): content is HtmlCellContent {\n return typeof content === 'object' && content !== null && 'html' in content\n}\n\n/**\n * Type guard to check if content is a render callback object\n */\nfunction isRenderCallbackContent(\n content: unknown,\n): content is RenderCallbackContent {\n return (\n typeof content === 'object' &&\n content !== null &&\n 'render' in content &&\n typeof (content as RenderCallbackContent).render === 'function'\n )\n}\n\n// DOMPurify drops unknown tags by default, which would strip the design\n// system's own components (e.g. <dap-ds-badge>) out of HTML cells. Allow\n// dap-ds-* elements and their attributes. Attributes matched by\n// attributeNameCheck skip DOMPurify's value checks, so the check must reject\n// event handlers (on*) itself; standard attributes such as href still go\n// through DOMPurify's own allowlist and URL checks.\nconst SANITIZE_CONFIG = {\n CUSTOM_ELEMENT_HANDLING: {\n tagNameCheck: /^dap-ds-/,\n attributeNameCheck: /^(?!on)[a-z][a-z0-9-]*$/i,\n allowCustomizedBuiltInElements: false,\n },\n}\n\n/**\n * Sanitize HTML string using DOMPurify: keeps safe markup, removes scripts,\n * event handlers and other dangerous content.\n */\nfunction sanitizeHtml(html: string): string {\n return DOMPurify.sanitize(html, SANITIZE_CONFIG)\n}\n\n/**\n * Apply styles to a styled cell content\n */\nfunction applyStyledValue(content: StyledCellContent) {\n const { value, style, className } = content\n\n // Create wrapper span with styles\n const span = document.createElement('span')\n\n // Apply className if provided\n if (className) {\n span.className = className\n }\n\n // Apply inline styles if provided\n if (style) {\n Object.entries(style).forEach(([key, val]) => {\n if (val !== undefined && val !== null) {\n // Convert camelCase to kebab-case for CSS properties\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase()\n span.style.setProperty(cssKey, String(val))\n }\n })\n }\n\n // Set content\n span.textContent = value != null ? String(value) : ''\n\n return span\n}\n\n/**\n * Render HTML string content\n */\nfunction renderHtmlContent(content: HtmlCellContent) {\n const { html: htmlString, sanitize = true } = content\n\n const container = document.createElement('div')\n\n if (sanitize) {\n // Sanitize HTML before rendering\n container.innerHTML = sanitizeHtml(htmlString)\n } else {\n // Use unsanitized HTML (dangerous!)\n console.warn(\n 'Rendering unsanitized HTML in datatable cell. This may be a security risk.',\n )\n container.innerHTML = htmlString\n }\n\n // Return the first child if single element, otherwise return container\n return container.children.length === 1\n ? (container.firstElementChild as HTMLElement)\n : container\n}\n\n/**\n * Render callback content\n * Returns a Lit directive that calls the render callback\n */\nfunction renderCallbackContent(content: RenderCallbackContent) {\n const { render: renderFn, cleanup } = content\n\n // Create container element\n const container = document.createElement('div')\n container.className = 'cell-render-container'\n\n // Call render function\n try {\n renderFn(container)\n } catch (error) {\n console.error('Error rendering cell content:', error)\n container.textContent = 'Error rendering cell'\n }\n\n // Store cleanup function for later\n if (cleanup) {\n // Attach cleanup to container for lifecycle management\n ;(container as any).__cleanup = cleanup\n }\n\n return container\n}\n\n/**\n * Main cell content renderer\n * Detects content type and returns appropriate rendering\n *\n * @param content - The cell content in any supported format\n * @returns Rendered content (TemplateResult, HTMLElement, or primitive)\n */\nexport function renderCellContent(content: CellContent): unknown {\n // Handle null/undefined\n if (content === null || content === undefined) {\n return nothing\n }\n\n // Format 6: Lit TemplateResult - pass through unchanged\n if (isTemplateResult(content)) {\n return content\n }\n\n // Format 3: HTMLElement - pass through unchanged\n if (content instanceof HTMLElement) {\n return content\n }\n\n // Format 5: Render Callback - execute and return element\n if (isRenderCallbackContent(content)) {\n return renderCallbackContent(content)\n }\n\n // Format 4: HTML String - sanitize and render\n if (isHtmlCellContent(content)) {\n return renderHtmlContent(content)\n }\n\n // Format 2: Styled Object - apply styles and return\n if (isStyledCellContent(content)) {\n return applyStyledValue(content)\n }\n\n // Format 1: Primitive Value - render directly\n // (string, number, boolean)\n return content\n}\n\n/**\n * Cleanup cell content\n * Calls cleanup callbacks if present\n *\n * @param element - The rendered element that may contain cleanup callbacks\n */\nexport function cleanupCellContent(element: unknown): void {\n if (element instanceof HTMLElement) {\n const cleanup = (element as any).__cleanup\n if (typeof cleanup === 'function') {\n try {\n cleanup()\n } catch (error) {\n console.error('Error cleaning up cell content:', error)\n }\n delete (element as any).__cleanup\n }\n }\n}\n"],"names":["isTemplateResult","content","isStyledCellContent","isHtmlCellContent","isRenderCallbackContent","SANITIZE_CONFIG","sanitizeHtml","html","DOMPurify","applyStyledValue","value","style","className","span","key","val","cssKey","renderHtmlContent","htmlString","sanitize","container","renderCallbackContent","renderFn","cleanup","error","renderCellContent","nothing"],"mappings":";;AAcA,SAASA,EAAiBC,GAA6C;AAEnE,SAAA,OAAOA,KAAY,YACnBA,MAAY,QACZ,gBAAgBA,KAChB,aAAaA,KACb,YAAYA;AAEhB;AAKA,SAASC,EAAoBD,GAAgD;AAEzE,SAAA,OAAOA,KAAY,YACnBA,MAAY,QACZ,WAAWA,MACV,WAAWA,KAAW,eAAeA;AAE1C;AAKA,SAASE,EAAkBF,GAA8C;AACvE,SAAO,OAAOA,KAAY,YAAYA,MAAY,QAAQ,UAAUA;AACtE;AAKA,SAASG,EACPH,GACkC;AAEhC,SAAA,OAAOA,KAAY,YACnBA,MAAY,QACZ,YAAYA,KACZ,OAAQA,EAAkC,UAAW;AAEzD;AAQA,MAAMI,IAAkB;AAAA,EACtB,yBAAyB;AAAA,IACvB,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,gCAAgC;AAAA,EAAA;AAEpC;AAMA,SAASC,EAAaC,GAAsB;AACnC,SAAAC,EAAU,SAASD,GAAMF,CAAe;AACjD;AAKA,SAASI,EAAiBR,GAA4B;AACpD,QAAM,EAAE,OAAAS,GAAO,OAAAC,GAAO,WAAAC,EAAc,IAAAX,GAG9BY,IAAO,SAAS,cAAc,MAAM;AAG1C,SAAID,MACFC,EAAK,YAAYD,IAIfD,KACK,OAAA,QAAQA,CAAK,EAAE,QAAQ,CAAC,CAACG,GAAKC,CAAG,MAAM;AACxC,QAAqBA,KAAQ,MAAM;AAErC,YAAMC,IAASF,EAAI,QAAQ,YAAY,KAAK,EAAE,YAAY;AAC1D,MAAAD,EAAK,MAAM,YAAYG,GAAQ,OAAOD,CAAG,CAAC;AAAA,IAAA;AAAA,EAC5C,CACD,GAIHF,EAAK,cAAcH,KAAS,OAAO,OAAOA,CAAK,IAAI,IAE5CG;AACT;AAKA,SAASI,EAAkBhB,GAA0B;AACnD,QAAM,EAAE,MAAMiB,GAAY,UAAAC,IAAW,GAAS,IAAAlB,GAExCmB,IAAY,SAAS,cAAc,KAAK;AAE9C,SAAID,IAEQC,EAAA,YAAYd,EAAaY,CAAU,KAGrC,QAAA;AAAA,IACN;AAAA,EACF,GACAE,EAAU,YAAYF,IAIjBE,EAAU,SAAS,WAAW,IAChCA,EAAU,oBACXA;AACN;AAMA,SAASC,EAAsBpB,GAAgC;AAC7D,QAAM,EAAE,QAAQqB,GAAU,SAAAC,EAAY,IAAAtB,GAGhCmB,IAAY,SAAS,cAAc,KAAK;AAC9C,EAAAA,EAAU,YAAY;AAGlB,MAAA;AACF,IAAAE,EAASF,CAAS;AAAA,WACXI,GAAO;AACN,YAAA,MAAM,iCAAiCA,CAAK,GACpDJ,EAAU,cAAc;AAAA,EAAA;AAI1B,SAAIG,MAEAH,EAAkB,YAAYG,IAG3BH;AACT;AASO,SAASK,EAAkBxB,GAA+B;AAE3D,SAAAA,KAAY,OACPyB,IAIL1B,EAAiBC,CAAO,KAKxBA,aAAmB,cACdA,IAILG,EAAwBH,CAAO,IAC1BoB,EAAsBpB,CAAO,IAIlCE,EAAkBF,CAAO,IACpBgB,EAAkBhB,CAAO,IAI9BC,EAAoBD,CAAO,IACtBQ,EAAiBR,CAAO,IAK1BA;AACT;"}