dap-design-system 0.62.1 → 0.62.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/components/combobox/comboboxBase.d.ts +6 -0
  2. package/dist/components/combobox/comboboxBase.js +79 -61
  3. package/dist/components/combobox/comboboxBase.js.map +1 -1
  4. package/dist/components/datatable/datatable.component.d.ts +2 -0
  5. package/dist/components/datatable/datatable.component.js +131 -112
  6. package/dist/components/datatable/datatable.component.js.map +1 -1
  7. package/dist/components/datatable/datatable.scss.js +1 -1
  8. package/dist/components/icon-button/icon-button.component.js +15 -12
  9. package/dist/components/icon-button/icon-button.component.js.map +1 -1
  10. package/dist/components/input/input-base-element.js +42 -38
  11. package/dist/components/input/input-base-element.js.map +1 -1
  12. package/dist/components/input/input.component.d.ts +1 -0
  13. package/dist/components/input/input.component.js.map +1 -1
  14. package/dist/components/option-list/option-list.component.js +16 -12
  15. package/dist/components/option-list/option-list.component.js.map +1 -1
  16. package/dist/components/select/select.component.js +71 -66
  17. package/dist/components/select/select.component.js.map +1 -1
  18. package/dist/components/snackbar/snackbar-message.component.js +16 -18
  19. package/dist/components/snackbar/snackbar-message.component.js.map +1 -1
  20. package/dist/components/snackbar/snackbar.component.js +48 -35
  21. package/dist/components/snackbar/snackbar.component.js.map +1 -1
  22. package/dist/components/table/table-header.component.d.ts +5 -1
  23. package/dist/components/table/table-header.component.js +24 -18
  24. package/dist/components/table/table-header.component.js.map +1 -1
  25. package/dist/components/table/table.component.d.ts +3 -0
  26. package/dist/components/table/table.component.js +33 -28
  27. package/dist/components/table/table.component.js.map +1 -1
  28. package/dist/components/textarea/textarea.component.d.ts +6 -1
  29. package/dist/components/textarea/textarea.component.js +43 -36
  30. package/dist/components/textarea/textarea.component.js.map +1 -1
  31. package/dist/components/tooltip/tooltip.component.d.ts +2 -0
  32. package/dist/components/tooltip/tooltip.component.js +51 -53
  33. package/dist/components/tooltip/tooltip.component.js.map +1 -1
  34. package/dist/internal/mixin/labelableMixin.d.ts +3 -0
  35. package/dist/internal/mixin/labelableMixin.js +15 -12
  36. package/dist/internal/mixin/labelableMixin.js.map +1 -1
  37. package/dist/manifest/types/vue/index.d.ts +632 -628
  38. package/dist/manifest/vscode.html-custom-data.json +348 -339
  39. package/dist/manifest/web-types.json +1206 -1186
  40. package/dist/react/dap-ds-input/index.d.ts +1 -0
  41. package/dist/react/dap-ds-input/index.js.map +1 -1
  42. package/dist/react/index.d.ts +23 -23
  43. package/dist/react-types.ts +24 -24
  44. package/dist/react.js +160 -160
  45. package/package.json +1 -1
@@ -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// 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 *\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 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 if (columnSizing && columnDef.id && columnSizing[columnDef.id]) {\n width = `${columnSizing[columnDef.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 ${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","RESIZE_KEYBOARD_STEP","_DapDSDataTable","DdsElement","TableController","processedColumns","col","__spreadProps","__spreadValues","table","html","row","_table","columns","columnSizing","repeat","index","columnDef","width","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","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
+ {"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 *\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":"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"}
@@ -1,4 +1,4 @@
1
- const a = ':host{--dds-datatable-bg-color: var(--dds-background-neutral-subtle);--dds-datatable-border-color: var(--dds-border-neutral-divider);--dds-datatable-header-bg-color: var(--dds-background-neutral-subtle);--dds-datatable-header-text-color: var(--dds-text-neutral-strong);--dds-datatable-row-hover-bg-color: var(--dds-background-brand-strong);--dds-datatable-row-selected-bg-color: var(--dds-background-brand-strong);--dds-datatable-cell-padding: var(--dds-spacing-200);--dds-datatable-header-padding: var(--dds-spacing-200);--dds-datatable-last-column-padding: var(--dds-spacing-500);--dds-datatable-first-column-padding: var(--dds-spacing-500);--dds-datatable-border-width: var(--dds-border-width-base);--dds-datatable-outer-border-width: var(--dds-datatable-border-width);--dds-datatable-header-border-width: var(--dds-datatable-border-width);--dds-datatable-row-border-width: var(--dds-datatable-border-width);--dds-datatable-stripe-color: var(--dds-background-neutral-base);--dds-datatable-border-radius: var(--dds-radius-base);--dds-datatable-shadow: none;--dds-datatable-transition-duration: .2s;--dds-datatable-z-index: 1;--dds-datatable-min-height: auto;--dds-datatable-max-height: none;--dds-datatable-overflow-x: auto;--dds-datatable-overflow-y: auto}.data-table-container{display:block;width:100%;min-height:var(--dds-datatable-min-height, auto);max-height:var(--dds-datatable-max-height, none);overflow-x:var(--dds-datatable-overflow-x, auto);overflow-y:var(--dds-datatable-overflow-y, auto);border:var(--dds-datatable-outer-border-width) solid var(--dds-datatable-border-color);border-radius:var(--dds-datatable-border-radius)}.data-table{width:100%;min-width:max-content;table-layout:fixed;border-spacing:0;border-collapse:separate;background-color:var(--dds-datatable-bg-color);line-height:150%}.data-table-header-row th:last-child{padding-right:var(--dds-datatable-last-column-padding);border-right-width:0;border-top-right-radius:var(--dds-datatable-border-radius)}.data-table-header-row th:first-child{padding-left:var(--dds-datatable-first-column-padding);border-top-left-radius:var(--dds-datatable-border-radius)}.data-table-header-cell{padding:var(--dds-datatable-header-padding);overflow:hidden;border-bottom:var(--dds-datatable-header-border-width) solid var(--dds-datatable-border-color);background-color:var(--dds-datatable-header-bg-color);color:var(--dds-datatable-header-text-color);text-align:left}.data-table-header-cell>div{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;gap:var(--dds-spacing-100)}.data-table-header-cell__content{display:flex;align-items:center;justify-content:inherit;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;gap:var(--dds-spacing-100)}.data-table-header-cell__controller::part(base){min-width:auto;padding:0}.data-table-cell{padding:var(--dds-datatable-cell-padding);overflow:hidden;border-bottom:var(--dds-datatable-row-border-width) solid var(--dds-datatable-border-color);text-overflow:ellipsis;white-space:nowrap}.data-table-cell--sticky-left,.data-table-cell--sticky-right{background-color:var(--dds-datatable-bg-color)}.data-table-cell--sticky-left,.data-table-header-cell--sticky-left{border-right:var(--dds-datatable-row-border-width) solid var(--dds-datatable-border-color)}.data-table-cell--sticky-right,.data-table-header-cell--sticky-right{border-left:var(--dds-datatable-row-border-width) solid var(--dds-datatable-border-color)}.data-table-row--clickable{cursor:pointer}.data-table-row--striped:nth-child(odd):not(.data-table-row--empty)>td{background-color:var(--dds-datatable-stripe-color)}.data-table-row--striped:nth-child(odd):not(.data-table-row--empty)>td:hover{background-color:var(--dds-datatable-row-hover-bg-color)}.data-table-row--selected.data-table-row--striped:nth-child(odd)>td{background-color:var(--dds-datatable-row-selected-bg-color)}.data-table-row:hover:not(.data-table-row--empty)>td{background-color:var(--dds-datatable-row-hover-bg-color)}.data-table-row--selected>td{background-color:var(--dds-datatable-row-selected-bg-color)}.data-table-row--empty{cursor:default;pointer-events:none}.data-table-row td{border-bottom:var(--dds-datatable-row-border-width) solid var(--dds-datatable-border-color)}.data-table-row td:last-child{padding-right:var(--dds-datatable-last-column-padding);border-right-width:0}.data-table-row td:first-child{padding-left:var(--dds-datatable-first-column-padding)}.data-table-row:last-child td{border-bottom:0}.data-table-placeholder{display:flex;align-items:center;justify-content:center;height:100%;padding:var(--dds-spacing-500)}.data-table-header-cell--resizable{position:relative}.data-table-resize-handle{position:absolute;top:0;right:0;bottom:0;width:var(--dds-spacing-200);cursor:col-resize;touch-action:none;user-select:none}.data-table-resize-handle:after{content:"";position:absolute;top:0;right:0;bottom:0;width:var(--dds-border-width-large);transition:background-color var(--dds-datatable-transition-duration);background-color:transparent}.data-table-resize-handle:hover:after,.data-table-resize-handle:focus-visible:after{background-color:var(--dds-datatable-resize-handle-color, var(--dds-border-brand-base))}.data-table-resize-handle:focus-visible{outline-color:var(--dds-focus-outer-ring);outline-offset:var(--dds-spacing-50);outline-width:var(--dds-border-width-large);outline-offset:calc(-1 * var(--dds-border-width-large));outline-style:solid}:host([resizing]){cursor:col-resize;user-select:none}:host([resizing]) .data-table-resize-handle:after{background-color:var(--dds-datatable-resize-handle-color, var(--dds-border-brand-base))}';
1
+ const a = ':host{--dds-datatable-bg-color: var(--dds-background-neutral-subtle);--dds-datatable-border-color: var(--dds-border-neutral-divider);--dds-datatable-header-bg-color: var(--dds-background-neutral-subtle);--dds-datatable-header-text-color: var(--dds-text-neutral-strong);--dds-datatable-row-hover-bg-color: var(--dds-background-brand-strong);--dds-datatable-row-selected-bg-color: var(--dds-background-brand-strong);--dds-datatable-cell-padding: var(--dds-spacing-200);--dds-datatable-header-padding: var(--dds-spacing-200);--dds-datatable-last-column-padding: var(--dds-spacing-500);--dds-datatable-first-column-padding: var(--dds-spacing-500);--dds-datatable-border-width: var(--dds-border-width-base);--dds-datatable-outer-border-width: var(--dds-datatable-border-width);--dds-datatable-header-border-width: var(--dds-datatable-border-width);--dds-datatable-row-border-width: var(--dds-datatable-border-width);--dds-datatable-stripe-color: var(--dds-background-neutral-base);--dds-datatable-border-radius: var(--dds-radius-base);--dds-datatable-shadow: none;--dds-datatable-transition-duration: .2s;--dds-datatable-z-index: 1;--dds-datatable-min-height: auto;--dds-datatable-max-height: none;--dds-datatable-overflow-x: auto;--dds-datatable-overflow-y: auto}.data-table-container{display:block;width:100%;min-height:var(--dds-datatable-min-height, auto);max-height:var(--dds-datatable-max-height, none);overflow-x:var(--dds-datatable-overflow-x, auto);overflow-y:var(--dds-datatable-overflow-y, auto);border:var(--dds-datatable-outer-border-width) solid var(--dds-datatable-border-color);border-radius:var(--dds-datatable-border-radius)}.data-table{width:100%;table-layout:fixed;border-spacing:0;border-collapse:separate;background-color:var(--dds-datatable-bg-color);line-height:150%}.data-table-header-row th:last-child{padding-right:var(--dds-datatable-last-column-padding);border-right-width:0;border-top-right-radius:var(--dds-datatable-border-radius)}.data-table-header-row th:first-child{padding-left:var(--dds-datatable-first-column-padding);border-top-left-radius:var(--dds-datatable-border-radius)}.data-table-header-cell{padding:var(--dds-datatable-header-padding);overflow:hidden;border-bottom:var(--dds-datatable-header-border-width) solid var(--dds-datatable-border-color);background-color:var(--dds-datatable-header-bg-color);color:var(--dds-datatable-header-text-color);text-align:left}.data-table-header-cell>div{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;gap:var(--dds-spacing-100)}.data-table-header-cell__content{display:flex;align-items:center;justify-content:inherit;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;gap:var(--dds-spacing-100)}.data-table-header-cell__controller::part(base){min-width:auto;padding:0}.data-table-cell{padding:var(--dds-datatable-cell-padding);overflow:hidden;border-bottom:var(--dds-datatable-row-border-width) solid var(--dds-datatable-border-color);text-overflow:ellipsis;white-space:nowrap}.data-table-cell--sticky-left,.data-table-cell--sticky-right{background-color:var(--dds-datatable-bg-color)}.data-table-cell--sticky-left,.data-table-header-cell--sticky-left{border-right:var(--dds-datatable-row-border-width) solid var(--dds-datatable-border-color)}.data-table-cell--sticky-right,.data-table-header-cell--sticky-right{border-left:var(--dds-datatable-row-border-width) solid var(--dds-datatable-border-color)}.data-table-row--clickable{cursor:pointer}.data-table-row--striped:nth-child(odd):not(.data-table-row--empty)>td{background-color:var(--dds-datatable-stripe-color)}.data-table-row--striped:nth-child(odd):not(.data-table-row--empty)>td:hover{background-color:var(--dds-datatable-row-hover-bg-color)}.data-table-row--selected.data-table-row--striped:nth-child(odd)>td{background-color:var(--dds-datatable-row-selected-bg-color)}.data-table-row:hover:not(.data-table-row--empty)>td{background-color:var(--dds-datatable-row-hover-bg-color)}.data-table-row--selected>td{background-color:var(--dds-datatable-row-selected-bg-color)}.data-table-row--empty{cursor:default;pointer-events:none}.data-table-row td{border-bottom:var(--dds-datatable-row-border-width) solid var(--dds-datatable-border-color)}.data-table-row td:last-child{padding-right:var(--dds-datatable-last-column-padding);border-right-width:0}.data-table-row td:first-child{padding-left:var(--dds-datatable-first-column-padding)}.data-table-row:last-child td{border-bottom:0}.data-table-placeholder{display:flex;align-items:center;justify-content:center;height:100%;padding:var(--dds-spacing-500)}.data-table-header-cell--resizable{position:relative}.data-table-resize-handle{position:absolute;top:0;right:0;bottom:0;width:var(--dds-spacing-200);cursor:col-resize;touch-action:none;user-select:none}.data-table-resize-handle:after{content:"";position:absolute;top:0;right:0;bottom:0;width:var(--dds-border-width-large);transition:background-color var(--dds-datatable-transition-duration);background-color:transparent}.data-table-resize-handle:hover:after,.data-table-resize-handle:focus-visible:after{background-color:var(--dds-datatable-resize-handle-color, var(--dds-border-brand-base))}.data-table-resize-handle:focus-visible{outline-color:var(--dds-focus-outer-ring);outline-offset:var(--dds-spacing-50);outline-width:var(--dds-border-width-large);outline-offset:calc(-1 * var(--dds-border-width-large));outline-style:solid}:host([resizing]){cursor:col-resize;user-select:none}:host([resizing]) .data-table-resize-handle:after{background-color:var(--dds-datatable-resize-handle-color, var(--dds-border-brand-base))}';
2
2
  export {
3
3
  a as default
4
4
  };
@@ -3,16 +3,16 @@ import "../../node_modules/@lit/reactive-element/reactive-element.js";
3
3
  import "../../node_modules/lit-html/lit-html.js";
4
4
  import "../../node_modules/lit-element/lit-element.js";
5
5
  import { property as a } from "../../node_modules/@lit/reactive-element/decorators/property.js";
6
- import { ifDefined as p } from "../../node_modules/lit-html/directives/if-defined.js";
7
- import { html as d } from "../../node_modules/lit-html/static.js";
6
+ import { ifDefined as d } from "../../node_modules/lit-html/directives/if-defined.js";
7
+ import { html as h } from "../../node_modules/lit-html/static.js";
8
8
  import { DdsElement as m } from "../../internal/dds-hu-element.js";
9
9
  import { SizedMixin as S } from "../../internal/mixin/sizedMixin.js";
10
10
  import b from "../icon/icon.component.js";
11
11
  import z from "./icon-button.scss.js";
12
12
  import { unsafeCSS as y } from "../../node_modules/@lit/reactive-element/css-tag.js";
13
- var v = Object.defineProperty, r = (h, t, e, i) => {
14
- for (var n = void 0, s = h.length - 1, l; s >= 0; s--)
15
- (l = h[s]) && (n = l(t, e, n) || n);
13
+ var v = Object.defineProperty, r = (f, t, e, i) => {
14
+ for (var n = void 0, s = f.length - 1, l; s >= 0; s--)
15
+ (l = f[s]) && (n = l(t, e, n) || n);
16
16
  return n && v(t, e, n), n;
17
17
  };
18
18
  const g = S(m), c = class c extends g {
@@ -55,8 +55,8 @@ const g = S(m), c = class c extends g {
55
55
  e.includes(s) || e.push(s);
56
56
  else if (s instanceof Element) {
57
57
  const l = Array.from(s.querySelectorAll("dap-ds-icon"));
58
- for (const f of l)
59
- e.includes(f) || e.push(f);
58
+ for (const p of l)
59
+ e.includes(p) || e.push(p);
60
60
  }
61
61
  return e;
62
62
  }
@@ -102,12 +102,15 @@ const g = S(m), c = class c extends g {
102
102
  (e = (t = this.shadowRoot) == null ? void 0 : t.querySelector("button")) == null || e.focus();
103
103
  }
104
104
  render() {
105
- return d`
105
+ var t, e;
106
+ return h`
106
107
  <button
107
108
  part="base"
108
109
  .disabled=${this.disabled}
109
110
  type=${this.htmlType}
110
- aria-label=${p(this.effectiveAriaLabel) || ""}
111
+ aria-label=${d(this.effectiveAriaLabel) || ""}
112
+ aria-expanded=${d((t = this.ariaExpanded) != null ? t : void 0)}
113
+ aria-haspopup=${d((e = this.ariaHasPopup) != null ? e : void 0)}
111
114
  class=${u(
112
115
  "icon-button",
113
116
  {
@@ -119,14 +122,14 @@ const g = S(m), c = class c extends g {
119
122
  `icon-button--${this.variant}`
120
123
  )}>
121
124
  <div part="high-contrast" class="button__highcontrast"></div>
122
- ${this.icon ? d` <dap-ds-icon
125
+ ${this.icon ? h` <dap-ds-icon
123
126
  part="content"
124
127
  exportparts="icon, base: icon-base"
125
128
  name="${this.icon}"
126
129
  aria-hidden="true"
127
- staticSize=${p(this.iconSize)}
130
+ staticSize=${d(this.iconSize)}
128
131
  size=${this.effectiveSize === "xxs" ? "xs" : this.effectiveSize}>
129
- </dap-ds-icon>` : d` <slot></slot> `}
132
+ </dap-ds-icon>` : h` <slot></slot> `}
130
133
  </button>
131
134
  `;
132
135
  }
@@ -1 +1 @@
1
- {"version":3,"file":"icon-button.component.js","sources":["../../../src/components/icon-button/icon-button.component.ts"],"sourcesContent":["import clsx from 'clsx'\nimport { PropertyValueMap, unsafeCSS } from 'lit'\nimport { property } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { html } from 'lit/static-html.js'\n\nimport { Size } from '../../common/types'\nimport { DdsElement } from '../../internal/dds-hu-element'\nimport { SizedMixin } from '../../internal/mixin/sizedMixin'\nimport DapDSIcon from '../icon/icon.component'\nimport styles from './icon-button.scss?inline'\n\nconst IconButtonBaseWithSized = SizedMixin(DdsElement)\n\nexport type ButtonVariant = 'neutral' | 'brand' | 'inverted' | 'inverted-brand'\nexport type HtmlButtonType = 'button' | 'submit' | 'reset'\nexport type ButtonSize = Extract<Size, 'lg' | 'md' | 'sm' | 'xs'>\n\n/**\n * `dap-ds-icon-button`\n * @summary An icon button is a button with an icon.\n * @element dap-ds-icon-button\n * @title - Icon button\n *\n * @property {string} ariaLabel - The aria label of the button.\n *\n * @slot - The icon of the button.\n *\n * @csspart base - The main button container.\n * @csspart content - The icon of the button.\n * @csspart icon - The icon of the icon.\n * @csspart icon-base - The base of the icon.\n *\n * @cssproperty --dds-icon-button-border-width - Border width of the icon button (default: var(--dds-border-width-base))\n * @cssproperty --dds-icon-button-border-color - Border color of the icon button (default: var(--dds-border-neutral-transparent-interactive, #fff500))\n * @cssproperty --dds-icon-button-border-radius - Border radius of the icon button (default: var(--dds-radius-rounded))\n * @cssproperty --dds-icon-button-hover-border-width - Border width on hover (default: var(--dds-border-width-large))\n * @cssproperty --dds-icon-button-active-border-width - Border width when active (default: var(--dds-border-width-xlarge))\n * @cssproperty --dds-icon-button-transition - Transition property for the icon button (default: var(--dds-transition-all))\n * @cssproperty --dds-icon-button-cursor - Cursor style for the button (default: pointer)\n * @cssproperty --dds-icon-button-disabled-cursor - Cursor style for the disabled button (default: not-allowed)\n * @cssproperty --dds-icon-button-column-gap - Column gap between elements (default: var(--dds-spacing-100))\n * @cssproperty --dds-icon-button-padding-lg - Padding for large size (default: var(--dds-spacing-0))\n * @cssproperty --dds-icon-button-padding-md - Padding for medium size (default: var(--dds-spacing-100))\n * @cssproperty --dds-icon-button-padding-sm - Padding for small size (default: var(--dds-spacing-50))\n * @cssproperty --dds-icon-button-padding-xs - Padding for extra small size (default: var(--dds-spacing-25))\n * @cssproperty --dds-icon-button-size-lg - Size for large icon button (default: var(--dds-spacing-800))\n * @cssproperty --dds-icon-button-size-md - Size for medium icon button (default: var(--dds-spacing-600))\n * @cssproperty --dds-icon-button-size-sm - Size for small icon button (default: var(--dds-spacing-400))\n * @cssproperty --dds-icon-button-size-xs - Size for extra small icon button (default: var(--dds-spacing-300))\n * @cssproperty --dds-icon-button-neutral-bg - Background color for neutral variant (default: var(--dds-transparent-black-subtle))\n * @cssproperty --dds-icon-button-neutral-color - Text color for neutral variant (default: var(--dds-icon-neutral-base))\n * @cssproperty --dds-icon-button-neutral-hover-bg - Hover background color for neutral variant (default: var(--dds-transparent-black-base))\n * @cssproperty --dds-icon-button-neutral-active-bg - Active background color for neutral variant (default: var(--dds-transparent-black-medium))\n * @cssproperty --dds-icon-button-brand-bg - Background color for brand variant (default: var(--dds-button-subtle-background-enabled))\n * @cssproperty --dds-icon-button-brand-color - Text color for brand variant (default: var(--dds-button-subtle-icon-enabled))\n * @cssproperty --dds-icon-button-brand-hover-bg - Hover background color for brand variant (default: var(--dds-button-subtle-background-hover))\n * @cssproperty --dds-icon-button-brand-active-bg - Active background color for brand variant (default: var(--dds-button-subtle-background-pressed))\n * @cssproperty --dds-icon-button-inverted-bg - Background color for inverted variant (default: var(--dds-transparent-white-subtle))\n * @cssproperty --dds-icon-button-inverted-color - Text color for inverted variant (default: var(--dds-button-primary-icon-enabled))\n * @cssproperty --dds-icon-button-inverted-hover-bg - Hover background color for inverted variant (default: var(--dds-transparent-white-base))\n * @cssproperty --dds-icon-button-inverted-active-bg - Active background color for inverted variant (default: var(--dds-transparent-white-medium))\n * @cssproperty --dds-icon-button-inverted-brand-bg - Background color for inverted brand variant (default: var(--dds-button-primary-background-enabled))\n * @cssproperty --dds-icon-button-inverted-brand-color - Text color for inverted brand variant (default: var(--dds-button-primary-icon-enabled))\n * @cssproperty --dds-icon-button-inverted-brand-hover-bg - Hover background color for inverted brand variant (default: var(--dds-button-primary-background-enabled))\n * @cssproperty --dds-icon-button-inverted-brand-active-bg - Active background color for inverted brand variant (default: var(--dds-button-primary-background-enabled))\n * @cssproperty --dds-icon-button-disabled-color - Color for disabled state (default: var(--dds-icon-neutral-disabled))\n * @cssproperty --dds-icon-button-disabled-bg - Background color for disabled state (default: transparent)\n */\nexport default class DapDSIconButton extends IconButtonBaseWithSized {\n static tagName = 'dap-ds-icon-button'\n\n static dependencies = {\n 'dap-ds-icon': DapDSIcon,\n }\n\n /** The type of the button.\n * @type {'neutral' | 'brand' | 'inverted' | 'inverted-brand'}\n */\n @property({ reflect: true }) variant?: ButtonVariant = 'neutral'\n\n /** Adds a transparent background to the button */\n @property({ type: Boolean, reflect: true }) clean? = false\n\n /**\n * The size of the icon in pixels. By default the icon gets the size of the button. This property overwrites the size of the icon.\n */\n @property({ type: Number }) iconSize: number\n\n constructor() {\n super()\n this.size = 'md' as ButtonSize\n }\n\n /** The disabled state of the button. */\n @property({ type: Boolean, reflect: true }) disabled = false\n\n /**\n * The type of the button.\n * @type {'button' | 'submit' | 'reset'}\n */\n @property() htmlType: HtmlButtonType = 'button'\n\n /** The icon of the button. You can use the icon names from the icon component */\n @property() icon: string\n\n /** The name of the button */\n @property() name: string\n\n static readonly styles = unsafeCSS(styles)\n\n /** Persisted aria-label for the inner button; host attribute is removed so we keep the value here */\n private _ariaLabelForButton: string | null = null\n\n /** Aria-label for the inner button; survives host attribute removal so Lit does not clear it */\n private get effectiveAriaLabel(): string | null {\n return this.ariaLabel ?? this._ariaLabelForButton\n }\n\n /**\n * Recursively finds all icon elements in slots and nested slots\n */\n private findIconElementsInSlot(slot: HTMLSlotElement): Element[] {\n const iconElements: Element[] = []\n\n // Get both assigned elements and nodes (to catch all content)\n const assignedElements = slot.assignedElements({ flatten: true })\n const assignedNodes = slot.assignedNodes({ flatten: true })\n\n // First, check assigned elements\n for (const element of assignedElements) {\n // If it's an icon element, add it\n if (element.tagName === 'DAP-DS-ICON') {\n iconElements.push(element)\n }\n // If it's a nested slot, recursively find icons in it\n else if (element instanceof HTMLSlotElement) {\n iconElements.push(...this.findIconElementsInSlot(element))\n }\n // If it's a custom element, search for icons in its light DOM children\n // (slot default content appears in light DOM)\n else if (element.children) {\n const lightDomIcons = Array.from(\n element.querySelectorAll('dap-ds-icon'),\n )\n iconElements.push(...lightDomIcons)\n }\n }\n\n // Also check assigned nodes for icon elements (in case they're not in assignedElements)\n for (const node of assignedNodes) {\n if (node instanceof Element && node.tagName === 'DAP-DS-ICON') {\n if (!iconElements.includes(node)) {\n iconElements.push(node)\n }\n }\n // Check children of element nodes\n else if (node instanceof Element) {\n const childIcons = Array.from(node.querySelectorAll('dap-ds-icon'))\n for (const icon of childIcons) {\n if (!iconElements.includes(icon)) {\n iconElements.push(icon)\n }\n }\n }\n }\n\n return iconElements\n }\n\n /**\n * Applies size props to all icon elements in the slot\n */\n private applySizeToSlotIcons(): void {\n if (!this.shadowRoot) return\n\n const iconSlot = this.shadowRoot.querySelector('slot') as HTMLSlotElement\n if (!iconSlot) return\n\n const iconElements = this.findIconElementsInSlot(iconSlot)\n\n for (const iconElement of iconElements) {\n if (this.iconSize !== undefined) {\n iconElement.setAttribute('staticSize', this.iconSize.toString())\n iconElement.setAttribute('size', this.iconSize.toString())\n } else {\n iconElement.setAttribute('size', this.effectiveSize)\n iconElement.removeAttribute('staticSize')\n }\n }\n }\n\n /**\n * Handles slot change events to update icon sizes\n */\n private handleSlotChange = (): void => {\n // Set up listeners on any newly assigned nested slots\n if (this.shadowRoot) {\n const iconSlot = this.shadowRoot.querySelector('slot') as HTMLSlotElement\n if (iconSlot) {\n const assignedElements = iconSlot.assignedElements({ flatten: true })\n for (const element of assignedElements) {\n if (element instanceof HTMLSlotElement) {\n // Check if we already have a listener on this slot\n if (!(element as any).__ddsSlotListenerAdded) {\n element.addEventListener('slotchange', this.handleSlotChange)\n ;(element as any).__ddsSlotListenerAdded = true\n }\n }\n }\n }\n }\n\n // Apply size to icons\n this.applySizeToSlotIcons()\n }\n\n /**\n * Sets up slotchange listeners for the main slot and any nested slots\n */\n private setupSlotListeners(slot: HTMLSlotElement): void {\n slot.addEventListener('slotchange', this.handleSlotChange)\n\n // Also listen to nested slots that are already assigned\n const assignedElements = slot.assignedElements({ flatten: true })\n for (const element of assignedElements) {\n if (element instanceof HTMLSlotElement) {\n element.addEventListener('slotchange', this.handleSlotChange)\n ;(element as any).__ddsSlotListenerAdded = true\n }\n }\n }\n\n protected firstUpdated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.firstUpdated(_changedProperties)\n\n if (this.shadowRoot) {\n const iconSlot = this.shadowRoot.querySelector('slot') as HTMLSlotElement\n if (iconSlot) {\n this.setupSlotListeners(iconSlot)\n }\n }\n\n // Use requestAnimationFrame to ensure slots are fully assigned\n requestAnimationFrame(() => {\n this.applySizeToSlotIcons()\n })\n }\n\n protected updated(\n changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.updated(changedProperties)\n\n // Persist value before removing host attribute so the inner button keeps it.\n // Read the attribute string directly: the native `ariaLabel` getter is empty\n // once the attribute is stripped, and Lit's AttributePart caches the value so\n // it is never re-applied to the host on later re-renders (e.g. when the button\n // toggles disabled). Fall back to the native property for consumers that set it\n // via `.ariaLabel`. Only overwrite when a value is actually present so the\n // persisted label survives re-renders that no longer carry the attribute.\n const incomingAriaLabel = this.getAttribute('aria-label') ?? this.ariaLabel\n if (incomingAriaLabel != null && incomingAriaLabel !== '') {\n this._ariaLabelForButton = incomingAriaLabel\n }\n this.removeAttribute('aria-label')\n\n // Update slot icons when size, sizeMap, or iconSize changes (sizeMap drives effectiveSize on viewport change)\n if (\n changedProperties.has('size') ||\n changedProperties.has('sizeMap') ||\n changedProperties.has('iconSize') ||\n this.sizeMap\n ) {\n requestAnimationFrame(() => {\n this.applySizeToSlotIcons()\n })\n }\n }\n\n focus() {\n this.shadowRoot?.querySelector('button')?.focus()\n }\n\n render() {\n return html`\n <button\n part=\"base\"\n .disabled=${this.disabled}\n type=${this.htmlType}\n aria-label=${ifDefined(this.effectiveAriaLabel) || ''}\n class=${clsx(\n 'icon-button',\n {\n [`icon-button--${this.effectiveSize}`]:\n this.effectiveSize && this.iconSize === undefined,\n },\n { [`icon-button--${this.size}`]: this.size },\n { 'icon-button--disabled': this.disabled },\n { 'icon-button--clean': this.clean },\n `icon-button--${this.variant}`,\n )}>\n <div part=\"high-contrast\" class=\"button__highcontrast\"></div>\n ${this.icon\n ? html` <dap-ds-icon\n part=\"content\"\n exportparts=\"icon, base: icon-base\"\n name=\"${this.icon}\"\n aria-hidden=\"true\"\n staticSize=${ifDefined(this.iconSize)}\n size=${(this.effectiveSize === 'xxs'\n ? 'xs'\n : this.effectiveSize) as ButtonSize}>\n </dap-ds-icon>`\n : html` <slot></slot> `}\n </button>\n `\n }\n}\n"],"names":["IconButtonBaseWithSized","SizedMixin","DdsElement","_DapDSIconButton","iconSlot","assignedElements","element","_a","slot","iconElements","assignedNodes","lightDomIcons","node","childIcons","icon","iconElement","_changedProperties","changedProperties","incomingAriaLabel","_b","html","ifDefined","clsx","DapDSIcon","unsafeCSS","styles","DapDSIconButton","__decorateClass","property"],"mappings":"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"}
1
+ {"version":3,"file":"icon-button.component.js","sources":["../../../src/components/icon-button/icon-button.component.ts"],"sourcesContent":["import clsx from 'clsx'\nimport { PropertyValueMap, unsafeCSS } from 'lit'\nimport { property } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { html } from 'lit/static-html.js'\n\nimport { Size } from '../../common/types'\nimport { DdsElement } from '../../internal/dds-hu-element'\nimport { SizedMixin } from '../../internal/mixin/sizedMixin'\nimport DapDSIcon from '../icon/icon.component'\nimport styles from './icon-button.scss?inline'\n\nconst IconButtonBaseWithSized = SizedMixin(DdsElement)\n\nexport type ButtonVariant = 'neutral' | 'brand' | 'inverted' | 'inverted-brand'\nexport type HtmlButtonType = 'button' | 'submit' | 'reset'\nexport type ButtonSize = Extract<Size, 'lg' | 'md' | 'sm' | 'xs'>\n\n/**\n * `dap-ds-icon-button`\n * @summary An icon button is a button with an icon.\n * @element dap-ds-icon-button\n * @title - Icon button\n *\n * @property {string} ariaLabel - The aria label of the button.\n *\n * @slot - The icon of the button.\n *\n * @csspart base - The main button container.\n * @csspart content - The icon of the button.\n * @csspart icon - The icon of the icon.\n * @csspart icon-base - The base of the icon.\n *\n * @cssproperty --dds-icon-button-border-width - Border width of the icon button (default: var(--dds-border-width-base))\n * @cssproperty --dds-icon-button-border-color - Border color of the icon button (default: var(--dds-border-neutral-transparent-interactive, #fff500))\n * @cssproperty --dds-icon-button-border-radius - Border radius of the icon button (default: var(--dds-radius-rounded))\n * @cssproperty --dds-icon-button-hover-border-width - Border width on hover (default: var(--dds-border-width-large))\n * @cssproperty --dds-icon-button-active-border-width - Border width when active (default: var(--dds-border-width-xlarge))\n * @cssproperty --dds-icon-button-transition - Transition property for the icon button (default: var(--dds-transition-all))\n * @cssproperty --dds-icon-button-cursor - Cursor style for the button (default: pointer)\n * @cssproperty --dds-icon-button-disabled-cursor - Cursor style for the disabled button (default: not-allowed)\n * @cssproperty --dds-icon-button-column-gap - Column gap between elements (default: var(--dds-spacing-100))\n * @cssproperty --dds-icon-button-padding-lg - Padding for large size (default: var(--dds-spacing-0))\n * @cssproperty --dds-icon-button-padding-md - Padding for medium size (default: var(--dds-spacing-100))\n * @cssproperty --dds-icon-button-padding-sm - Padding for small size (default: var(--dds-spacing-50))\n * @cssproperty --dds-icon-button-padding-xs - Padding for extra small size (default: var(--dds-spacing-25))\n * @cssproperty --dds-icon-button-size-lg - Size for large icon button (default: var(--dds-spacing-800))\n * @cssproperty --dds-icon-button-size-md - Size for medium icon button (default: var(--dds-spacing-600))\n * @cssproperty --dds-icon-button-size-sm - Size for small icon button (default: var(--dds-spacing-400))\n * @cssproperty --dds-icon-button-size-xs - Size for extra small icon button (default: var(--dds-spacing-300))\n * @cssproperty --dds-icon-button-neutral-bg - Background color for neutral variant (default: var(--dds-transparent-black-subtle))\n * @cssproperty --dds-icon-button-neutral-color - Text color for neutral variant (default: var(--dds-icon-neutral-base))\n * @cssproperty --dds-icon-button-neutral-hover-bg - Hover background color for neutral variant (default: var(--dds-transparent-black-base))\n * @cssproperty --dds-icon-button-neutral-active-bg - Active background color for neutral variant (default: var(--dds-transparent-black-medium))\n * @cssproperty --dds-icon-button-brand-bg - Background color for brand variant (default: var(--dds-button-subtle-background-enabled))\n * @cssproperty --dds-icon-button-brand-color - Text color for brand variant (default: var(--dds-button-subtle-icon-enabled))\n * @cssproperty --dds-icon-button-brand-hover-bg - Hover background color for brand variant (default: var(--dds-button-subtle-background-hover))\n * @cssproperty --dds-icon-button-brand-active-bg - Active background color for brand variant (default: var(--dds-button-subtle-background-pressed))\n * @cssproperty --dds-icon-button-inverted-bg - Background color for inverted variant (default: var(--dds-transparent-white-subtle))\n * @cssproperty --dds-icon-button-inverted-color - Text color for inverted variant (default: var(--dds-button-primary-icon-enabled))\n * @cssproperty --dds-icon-button-inverted-hover-bg - Hover background color for inverted variant (default: var(--dds-transparent-white-base))\n * @cssproperty --dds-icon-button-inverted-active-bg - Active background color for inverted variant (default: var(--dds-transparent-white-medium))\n * @cssproperty --dds-icon-button-inverted-brand-bg - Background color for inverted brand variant (default: var(--dds-button-primary-background-enabled))\n * @cssproperty --dds-icon-button-inverted-brand-color - Text color for inverted brand variant (default: var(--dds-button-primary-icon-enabled))\n * @cssproperty --dds-icon-button-inverted-brand-hover-bg - Hover background color for inverted brand variant (default: var(--dds-button-primary-background-enabled))\n * @cssproperty --dds-icon-button-inverted-brand-active-bg - Active background color for inverted brand variant (default: var(--dds-button-primary-background-enabled))\n * @cssproperty --dds-icon-button-disabled-color - Color for disabled state (default: var(--dds-icon-neutral-disabled))\n * @cssproperty --dds-icon-button-disabled-bg - Background color for disabled state (default: transparent)\n */\nexport default class DapDSIconButton extends IconButtonBaseWithSized {\n static tagName = 'dap-ds-icon-button'\n\n static dependencies = {\n 'dap-ds-icon': DapDSIcon,\n }\n\n /** The type of the button.\n * @type {'neutral' | 'brand' | 'inverted' | 'inverted-brand'}\n */\n @property({ reflect: true }) variant?: ButtonVariant = 'neutral'\n\n /** Adds a transparent background to the button */\n @property({ type: Boolean, reflect: true }) clean? = false\n\n /**\n * The size of the icon in pixels. By default the icon gets the size of the button. This property overwrites the size of the icon.\n */\n @property({ type: Number }) iconSize: number\n\n constructor() {\n super()\n this.size = 'md' as ButtonSize\n }\n\n /** The disabled state of the button. */\n @property({ type: Boolean, reflect: true }) disabled = false\n\n /**\n * The type of the button.\n * @type {'button' | 'submit' | 'reset'}\n */\n @property() htmlType: HtmlButtonType = 'button'\n\n /** The icon of the button. You can use the icon names from the icon component */\n @property() icon: string\n\n /** The name of the button */\n @property() name: string\n\n static readonly styles = unsafeCSS(styles)\n\n /** Persisted aria-label for the inner button; host attribute is removed so we keep the value here */\n private _ariaLabelForButton: string | null = null\n\n /** Aria-label for the inner button; survives host attribute removal so Lit does not clear it */\n private get effectiveAriaLabel(): string | null {\n return this.ariaLabel ?? this._ariaLabelForButton\n }\n\n /**\n * Recursively finds all icon elements in slots and nested slots\n */\n private findIconElementsInSlot(slot: HTMLSlotElement): Element[] {\n const iconElements: Element[] = []\n\n // Get both assigned elements and nodes (to catch all content)\n const assignedElements = slot.assignedElements({ flatten: true })\n const assignedNodes = slot.assignedNodes({ flatten: true })\n\n // First, check assigned elements\n for (const element of assignedElements) {\n // If it's an icon element, add it\n if (element.tagName === 'DAP-DS-ICON') {\n iconElements.push(element)\n }\n // If it's a nested slot, recursively find icons in it\n else if (element instanceof HTMLSlotElement) {\n iconElements.push(...this.findIconElementsInSlot(element))\n }\n // If it's a custom element, search for icons in its light DOM children\n // (slot default content appears in light DOM)\n else if (element.children) {\n const lightDomIcons = Array.from(\n element.querySelectorAll('dap-ds-icon'),\n )\n iconElements.push(...lightDomIcons)\n }\n }\n\n // Also check assigned nodes for icon elements (in case they're not in assignedElements)\n for (const node of assignedNodes) {\n if (node instanceof Element && node.tagName === 'DAP-DS-ICON') {\n if (!iconElements.includes(node)) {\n iconElements.push(node)\n }\n }\n // Check children of element nodes\n else if (node instanceof Element) {\n const childIcons = Array.from(node.querySelectorAll('dap-ds-icon'))\n for (const icon of childIcons) {\n if (!iconElements.includes(icon)) {\n iconElements.push(icon)\n }\n }\n }\n }\n\n return iconElements\n }\n\n /**\n * Applies size props to all icon elements in the slot\n */\n private applySizeToSlotIcons(): void {\n if (!this.shadowRoot) return\n\n const iconSlot = this.shadowRoot.querySelector('slot') as HTMLSlotElement\n if (!iconSlot) return\n\n const iconElements = this.findIconElementsInSlot(iconSlot)\n\n for (const iconElement of iconElements) {\n if (this.iconSize !== undefined) {\n iconElement.setAttribute('staticSize', this.iconSize.toString())\n iconElement.setAttribute('size', this.iconSize.toString())\n } else {\n iconElement.setAttribute('size', this.effectiveSize)\n iconElement.removeAttribute('staticSize')\n }\n }\n }\n\n /**\n * Handles slot change events to update icon sizes\n */\n private handleSlotChange = (): void => {\n // Set up listeners on any newly assigned nested slots\n if (this.shadowRoot) {\n const iconSlot = this.shadowRoot.querySelector('slot') as HTMLSlotElement\n if (iconSlot) {\n const assignedElements = iconSlot.assignedElements({ flatten: true })\n for (const element of assignedElements) {\n if (element instanceof HTMLSlotElement) {\n // Check if we already have a listener on this slot\n if (!(element as any).__ddsSlotListenerAdded) {\n element.addEventListener('slotchange', this.handleSlotChange)\n ;(element as any).__ddsSlotListenerAdded = true\n }\n }\n }\n }\n }\n\n // Apply size to icons\n this.applySizeToSlotIcons()\n }\n\n /**\n * Sets up slotchange listeners for the main slot and any nested slots\n */\n private setupSlotListeners(slot: HTMLSlotElement): void {\n slot.addEventListener('slotchange', this.handleSlotChange)\n\n // Also listen to nested slots that are already assigned\n const assignedElements = slot.assignedElements({ flatten: true })\n for (const element of assignedElements) {\n if (element instanceof HTMLSlotElement) {\n element.addEventListener('slotchange', this.handleSlotChange)\n ;(element as any).__ddsSlotListenerAdded = true\n }\n }\n }\n\n protected firstUpdated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.firstUpdated(_changedProperties)\n\n if (this.shadowRoot) {\n const iconSlot = this.shadowRoot.querySelector('slot') as HTMLSlotElement\n if (iconSlot) {\n this.setupSlotListeners(iconSlot)\n }\n }\n\n // Use requestAnimationFrame to ensure slots are fully assigned\n requestAnimationFrame(() => {\n this.applySizeToSlotIcons()\n })\n }\n\n protected updated(\n changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.updated(changedProperties)\n\n // Persist value before removing host attribute so the inner button keeps it.\n // Read the attribute string directly: the native `ariaLabel` getter is empty\n // once the attribute is stripped, and Lit's AttributePart caches the value so\n // it is never re-applied to the host on later re-renders (e.g. when the button\n // toggles disabled). Fall back to the native property for consumers that set it\n // via `.ariaLabel`. Only overwrite when a value is actually present so the\n // persisted label survives re-renders that no longer carry the attribute.\n const incomingAriaLabel = this.getAttribute('aria-label') ?? this.ariaLabel\n if (incomingAriaLabel != null && incomingAriaLabel !== '') {\n this._ariaLabelForButton = incomingAriaLabel\n }\n this.removeAttribute('aria-label')\n\n // Update slot icons when size, sizeMap, or iconSize changes (sizeMap drives effectiveSize on viewport change)\n if (\n changedProperties.has('size') ||\n changedProperties.has('sizeMap') ||\n changedProperties.has('iconSize') ||\n this.sizeMap\n ) {\n requestAnimationFrame(() => {\n this.applySizeToSlotIcons()\n })\n }\n }\n\n focus() {\n this.shadowRoot?.querySelector('button')?.focus()\n }\n\n render() {\n return html`\n <button\n part=\"base\"\n .disabled=${this.disabled}\n type=${this.htmlType}\n aria-label=${ifDefined(this.effectiveAriaLabel) || ''}\n aria-expanded=${ifDefined(this.ariaExpanded ?? undefined)}\n aria-haspopup=${ifDefined(this.ariaHasPopup ?? undefined)}\n class=${clsx(\n 'icon-button',\n {\n [`icon-button--${this.effectiveSize}`]:\n this.effectiveSize && this.iconSize === undefined,\n },\n { [`icon-button--${this.size}`]: this.size },\n { 'icon-button--disabled': this.disabled },\n { 'icon-button--clean': this.clean },\n `icon-button--${this.variant}`,\n )}>\n <div part=\"high-contrast\" class=\"button__highcontrast\"></div>\n ${this.icon\n ? html` <dap-ds-icon\n part=\"content\"\n exportparts=\"icon, base: icon-base\"\n name=\"${this.icon}\"\n aria-hidden=\"true\"\n staticSize=${ifDefined(this.iconSize)}\n size=${(this.effectiveSize === 'xxs'\n ? 'xs'\n : this.effectiveSize) as ButtonSize}>\n </dap-ds-icon>`\n : html` <slot></slot> `}\n </button>\n `\n }\n}\n"],"names":["IconButtonBaseWithSized","SizedMixin","DdsElement","_DapDSIconButton","iconSlot","assignedElements","element","_a","slot","iconElements","assignedNodes","lightDomIcons","node","childIcons","icon","iconElement","_changedProperties","changedProperties","incomingAriaLabel","_b","html","ifDefined","clsx","DapDSIcon","unsafeCSS","styles","DapDSIconButton","__decorateClass","property"],"mappings":"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"}