@govtechsg/sgds-web-component 3.28.1-rc.0 → 3.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/base/button.js +1 -1
  2. package/base/button.js.map +1 -1
  3. package/components/Alert/alert.js +1 -1
  4. package/components/Alert/alert.js.map +1 -1
  5. package/components/Alert/index.umd.min.js +3 -3
  6. package/components/Alert/index.umd.min.js.map +1 -1
  7. package/components/Alert/sgds-alert.js +1 -1
  8. package/components/Alert/sgds-alert.js.map +1 -1
  9. package/components/Appnav/index.umd.min.js +3 -3
  10. package/components/Appnav/index.umd.min.js.map +1 -1
  11. package/components/Appnav/sgds-appnav.js +1 -1
  12. package/components/Appnav/sgds-appnav.js.map +1 -1
  13. package/components/Badge/index.umd.min.js +1 -1
  14. package/components/Badge/index.umd.min.js.map +1 -1
  15. package/components/Breadcrumb/index.umd.min.js +3 -3
  16. package/components/Breadcrumb/index.umd.min.js.map +1 -1
  17. package/components/Breadcrumb/sgds-breadcrumb.js +2 -2
  18. package/components/Breadcrumb/sgds-breadcrumb.js.map +1 -1
  19. package/components/Button/index.umd.min.js +2 -2
  20. package/components/Button/index.umd.min.js.map +1 -1
  21. package/components/Button/sgds-button.js +1 -1
  22. package/components/Button/sgds-button.js.map +1 -1
  23. package/components/Checkbox/index.umd.min.js +3 -2
  24. package/components/Checkbox/index.umd.min.js.map +1 -1
  25. package/components/Checkbox/sgds-checkbox.d.ts +2 -0
  26. package/components/Checkbox/sgds-checkbox.js +3 -0
  27. package/components/Checkbox/sgds-checkbox.js.map +1 -1
  28. package/components/CloseButton/close-button.js +1 -1
  29. package/components/CloseButton/close-button.js.map +1 -1
  30. package/components/CloseButton/index.umd.min.js +1 -1
  31. package/components/CloseButton/index.umd.min.js.map +1 -1
  32. package/components/ComboBox/index.umd.min.js +4 -3
  33. package/components/ComboBox/index.umd.min.js.map +1 -1
  34. package/components/DataTable/data-table.js +1 -1
  35. package/components/DataTable/data-table.js.map +1 -1
  36. package/components/DataTable/index.umd.min.js +20 -11
  37. package/components/DataTable/index.umd.min.js.map +1 -1
  38. package/components/DataTable/sgds-data-table-row.js +12 -4
  39. package/components/DataTable/sgds-data-table-row.js.map +1 -1
  40. package/components/DataTable/sgds-data-table.js +1 -2
  41. package/components/DataTable/sgds-data-table.js.map +1 -1
  42. package/components/Datepicker/index.umd.min.js +3 -2
  43. package/components/Datepicker/index.umd.min.js.map +1 -1
  44. package/components/Drawer/index.umd.min.js +1 -1
  45. package/components/Drawer/index.umd.min.js.map +1 -1
  46. package/components/Dropdown/index.umd.min.js +1 -1
  47. package/components/Dropdown/index.umd.min.js.map +1 -1
  48. package/components/Dropdown/sgds-dropdown.js +1 -1
  49. package/components/Dropdown/sgds-dropdown.js.map +1 -1
  50. package/components/FileUpload/index.umd.min.js +3 -3
  51. package/components/FileUpload/index.umd.min.js.map +1 -1
  52. package/components/IconButton/index.umd.min.js +1 -1
  53. package/components/IconButton/index.umd.min.js.map +1 -1
  54. package/components/Input/index.umd.min.js +1 -0
  55. package/components/Input/index.umd.min.js.map +1 -1
  56. package/components/Input/sgds-input.js +1 -0
  57. package/components/Input/sgds-input.js.map +1 -1
  58. package/components/Mainnav/index.umd.min.js +3 -3
  59. package/components/Mainnav/index.umd.min.js.map +1 -1
  60. package/components/Mainnav/sgds-mainnav.js +1 -1
  61. package/components/Mainnav/sgds-mainnav.js.map +1 -1
  62. package/components/Modal/index.umd.min.js +3 -3
  63. package/components/Modal/index.umd.min.js.map +1 -1
  64. package/components/Modal/modal.js +1 -1
  65. package/components/Modal/modal.js.map +1 -1
  66. package/components/Modal/sgds-modal.js +1 -1
  67. package/components/Modal/sgds-modal.js.map +1 -1
  68. package/components/OverflowMenu/index.umd.min.js +1 -1
  69. package/components/OverflowMenu/index.umd.min.js.map +1 -1
  70. package/components/Pagination/index.umd.min.js +2 -2
  71. package/components/Pagination/index.umd.min.js.map +1 -1
  72. package/components/QuantityToggle/index.umd.min.js +2 -1
  73. package/components/QuantityToggle/index.umd.min.js.map +1 -1
  74. package/components/Select/index.umd.min.js +1 -1
  75. package/components/Select/index.umd.min.js.map +1 -1
  76. package/components/Select/sgds-select.js +1 -1
  77. package/components/Select/sgds-select.js.map +1 -1
  78. package/components/Sidebar/index.umd.min.js +1 -1
  79. package/components/Sidebar/index.umd.min.js.map +1 -1
  80. package/components/Sidenav/index.umd.min.js +1 -1
  81. package/components/Sidenav/index.umd.min.js.map +1 -1
  82. package/components/Sidenav/sgds-sidenav.js +1 -1
  83. package/components/Sidenav/sgds-sidenav.js.map +1 -1
  84. package/components/SystemBanner/index.umd.min.js +4 -2
  85. package/components/SystemBanner/index.umd.min.js.map +1 -1
  86. package/components/SystemBanner/sgds-system-banner.js +2 -0
  87. package/components/SystemBanner/sgds-system-banner.js.map +1 -1
  88. package/components/Toast/index.umd.min.js +1 -1
  89. package/components/Toast/index.umd.min.js.map +1 -1
  90. package/components/index.umd.min.js +68 -56
  91. package/components/index.umd.min.js.map +1 -1
  92. package/custom-elements.json +20 -1
  93. package/index.umd.min.js +49 -37
  94. package/index.umd.min.js.map +1 -1
  95. package/package.json +1 -1
  96. package/react/base/button.cjs.js +1 -1
  97. package/react/base/button.cjs.js.map +1 -1
  98. package/react/base/button.js +1 -1
  99. package/react/base/button.js.map +1 -1
  100. package/react/components/Alert/alert.cjs.js +1 -1
  101. package/react/components/Alert/alert.cjs.js.map +1 -1
  102. package/react/components/Alert/alert.js +1 -1
  103. package/react/components/Alert/alert.js.map +1 -1
  104. package/react/components/Alert/sgds-alert.cjs.js +1 -1
  105. package/react/components/Alert/sgds-alert.cjs.js.map +1 -1
  106. package/react/components/Alert/sgds-alert.js +1 -1
  107. package/react/components/Alert/sgds-alert.js.map +1 -1
  108. package/react/components/Appnav/sgds-appnav.cjs.js +1 -1
  109. package/react/components/Appnav/sgds-appnav.cjs.js.map +1 -1
  110. package/react/components/Appnav/sgds-appnav.js +1 -1
  111. package/react/components/Appnav/sgds-appnav.js.map +1 -1
  112. package/react/components/Breadcrumb/sgds-breadcrumb.cjs.js +2 -2
  113. package/react/components/Breadcrumb/sgds-breadcrumb.cjs.js.map +1 -1
  114. package/react/components/Breadcrumb/sgds-breadcrumb.js +2 -2
  115. package/react/components/Breadcrumb/sgds-breadcrumb.js.map +1 -1
  116. package/react/components/Button/sgds-button.cjs.js +1 -1
  117. package/react/components/Button/sgds-button.cjs.js.map +1 -1
  118. package/react/components/Button/sgds-button.js +1 -1
  119. package/react/components/Button/sgds-button.js.map +1 -1
  120. package/react/components/Checkbox/sgds-checkbox.cjs.js +3 -0
  121. package/react/components/Checkbox/sgds-checkbox.cjs.js.map +1 -1
  122. package/react/components/Checkbox/sgds-checkbox.js +3 -0
  123. package/react/components/Checkbox/sgds-checkbox.js.map +1 -1
  124. package/react/components/CloseButton/close-button.cjs.js +1 -1
  125. package/react/components/CloseButton/close-button.cjs.js.map +1 -1
  126. package/react/components/CloseButton/close-button.js +1 -1
  127. package/react/components/CloseButton/close-button.js.map +1 -1
  128. package/react/components/DataTable/data-table.cjs.js +1 -1
  129. package/react/components/DataTable/data-table.cjs.js.map +1 -1
  130. package/react/components/DataTable/data-table.js +1 -1
  131. package/react/components/DataTable/data-table.js.map +1 -1
  132. package/react/components/DataTable/sgds-data-table-row.cjs.js +12 -4
  133. package/react/components/DataTable/sgds-data-table-row.cjs.js.map +1 -1
  134. package/react/components/DataTable/sgds-data-table-row.js +12 -4
  135. package/react/components/DataTable/sgds-data-table-row.js.map +1 -1
  136. package/react/components/DataTable/sgds-data-table.cjs.js +1 -2
  137. package/react/components/DataTable/sgds-data-table.cjs.js.map +1 -1
  138. package/react/components/DataTable/sgds-data-table.js +1 -2
  139. package/react/components/DataTable/sgds-data-table.js.map +1 -1
  140. package/react/components/Dropdown/sgds-dropdown.cjs.js +1 -1
  141. package/react/components/Dropdown/sgds-dropdown.cjs.js.map +1 -1
  142. package/react/components/Dropdown/sgds-dropdown.js +1 -1
  143. package/react/components/Dropdown/sgds-dropdown.js.map +1 -1
  144. package/react/components/Input/sgds-input.cjs.js +1 -0
  145. package/react/components/Input/sgds-input.cjs.js.map +1 -1
  146. package/react/components/Input/sgds-input.js +1 -0
  147. package/react/components/Input/sgds-input.js.map +1 -1
  148. package/react/components/Mainnav/sgds-mainnav.cjs.js +1 -1
  149. package/react/components/Mainnav/sgds-mainnav.cjs.js.map +1 -1
  150. package/react/components/Mainnav/sgds-mainnav.js +1 -1
  151. package/react/components/Mainnav/sgds-mainnav.js.map +1 -1
  152. package/react/components/Modal/modal.cjs.js +1 -1
  153. package/react/components/Modal/modal.cjs.js.map +1 -1
  154. package/react/components/Modal/modal.js +1 -1
  155. package/react/components/Modal/modal.js.map +1 -1
  156. package/react/components/Modal/sgds-modal.cjs.js +1 -1
  157. package/react/components/Modal/sgds-modal.cjs.js.map +1 -1
  158. package/react/components/Modal/sgds-modal.js +1 -1
  159. package/react/components/Modal/sgds-modal.js.map +1 -1
  160. package/react/components/Select/sgds-select.cjs.js +1 -1
  161. package/react/components/Select/sgds-select.cjs.js.map +1 -1
  162. package/react/components/Select/sgds-select.js +1 -1
  163. package/react/components/Select/sgds-select.js.map +1 -1
  164. package/react/components/Sidenav/sgds-sidenav.cjs.js +1 -1
  165. package/react/components/Sidenav/sgds-sidenav.cjs.js.map +1 -1
  166. package/react/components/Sidenav/sgds-sidenav.js +1 -1
  167. package/react/components/Sidenav/sgds-sidenav.js.map +1 -1
  168. package/react/components/SystemBanner/sgds-system-banner.cjs.js +2 -0
  169. package/react/components/SystemBanner/sgds-system-banner.cjs.js.map +1 -1
  170. package/react/components/SystemBanner/sgds-system-banner.js +2 -0
  171. package/react/components/SystemBanner/sgds-system-banner.js.map +1 -1
  172. package/themes/night.css +8 -8
  173. package/types/react.d.ts +2 -0
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-data-table-row.cjs.js","names":["SgdsElement","tableRowStyle","SgdsCheckbox","SgdsDataTableCell","SgdsDataTableHead","SgdsIcon","stopAnimations","getAnimation","animateTo","shimKeyframesHeightAuto","waitForEvent","ifDefined","nothing","property","query","state","watch","setDefaultAnimation"],"sources":["../../../../src/components/DataTable/sgds-data-table-row.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport { property, query, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport { SgdsCheckbox } from \"../Checkbox/sgds-checkbox\";\nimport { animateTo, shimKeyframesHeightAuto, stopAnimations } from \"../../utils/animate\";\nimport { getAnimation, setDefaultAnimation } from \"../../utils/animation-registry\";\nimport { waitForEvent } from \"../../utils/event\";\nimport { watch } from \"../../utils/watch\";\nimport tableRowStyle from \"./data-table.css\";\nimport SgdsDataTableCell from \"./sgds-data-table-cell\";\nimport SgdsDataTableHead from \"./sgds-data-table-head\";\nimport { SgdsIcon } from \"../Icon/sgds-icon\";\n\n/**\n * @summary A data table row. Set `expand` to enable an expandable content area beneath\n * the row, then place detail content in the `content` slot.\n *\n * @slot default - Insert `sgds-data-table-cell` or `sgds-data-table-head` elements.\n * @slot content - Content shown in the animated expand area beneath the row.\n *\n * @event sgds-show - Emitted when the expandable row begins to open.\n * @event sgds-after-show - Emitted after the expandable row open animation completes.\n * @event sgds-hide - Emitted when the expandable row begins to close.\n * @event sgds-after-hide - Emitted after the expandable row close animation completes.\n */\nexport class SgdsDataTableRow extends SgdsElement {\n static styles = [...SgdsElement.styles, tableRowStyle];\n\n /** @internal */\n static dependencies = {\n \"sgds-checkbox\": SgdsCheckbox,\n \"sgds-data-table-cell\": SgdsDataTableCell,\n \"sgds-data-table-head\": SgdsDataTableHead,\n \"sgds-icon\": SgdsIcon\n };\n\n /** When true, the row has an expandable content area toggled by a chevron. */\n @property({ type: Boolean, reflect: true }) expand = false;\n\n /** When true, the expandable content area is open. */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** When true, the row is checked. */\n @property({ type: Boolean, reflect: true }) checked = false;\n\n /** @internal — set by `sgds-data-table` to show a checkbox cell on this row. */\n @property({ type: Boolean }) showCheckbox = false;\n\n /** @internal — set by `sgds-data-table` when at least one sibling row is expandable. */\n @property({ type: Boolean }) showExpandPlaceholder = false;\n\n /** @internal — per-column alignment injected by `sgds-data-table` from header cells. */\n @property({ attribute: false }) columnAlignments: Array<\"left\" | \"right\"> = [];\n\n /** @internal — set by `sgds-data-table` to indicate whether body rows exist. */\n @property({ type: Boolean }) hasDataRows = false;\n\n /** @internal */\n @query(\".expandable-body\") private _expandableBody!: HTMLElement;\n\n /** @internal */\n @query(\"sgds-checkbox\") private _checkboxEl!: SgdsCheckbox;\n\n @state() private _isHeaderRow = false;\n private _cellSlotNames = new WeakMap<SgdsDataTableCell | SgdsDataTableHead, string>();\n private _lightDomObserver?: MutationObserver;\n\n /** The checkbox rendered inside this row, if `showCheckbox` is true. */\n get checkbox(): SgdsCheckbox | null {\n return this._checkboxEl ?? null;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._lightDomObserver = new MutationObserver(() => this._handleLightDomChange());\n this._lightDomObserver.observe(this, { childList: true });\n this._handleLightDomChange();\n }\n\n disconnectedCallback() {\n this._lightDomObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n firstUpdated() {\n if (this._expandableBody) {\n this._expandableBody.hidden = !this.open;\n }\n }\n\n @watch(\"open\", { waitUntilFirstUpdate: true })\n async handleExpandedChange() {\n if (this.open) {\n const sgdsShow = this.emit(\"sgds-show\", { cancelable: true });\n if (sgdsShow.defaultPrevented) {\n this.open = false;\n return;\n }\n await stopAnimations(this._expandableBody);\n this._expandableBody.hidden = false;\n const { keyframes, options } = getAnimation(this, \"row.expand.show\");\n await animateTo(\n this._expandableBody,\n shimKeyframesHeightAuto(keyframes, this._expandableBody.scrollHeight),\n options\n );\n this.emit(\"sgds-after-show\");\n } else {\n const sgdsHide = this.emit(\"sgds-hide\", { cancelable: true });\n if (sgdsHide.defaultPrevented) {\n this.open = true;\n return;\n }\n await stopAnimations(this._expandableBody);\n const { keyframes, options } = getAnimation(this, \"row.expand.hide\");\n await animateTo(\n this._expandableBody,\n shimKeyframesHeightAuto(keyframes, this._expandableBody.scrollHeight),\n options\n );\n this._expandableBody.hidden = true;\n this.emit(\"sgds-after-hide\");\n }\n }\n\n /** Opens the expandable content area. */\n public async show() {\n if (this.open) return;\n this.open = true;\n return waitForEvent(this, \"sgds-after-show\");\n }\n\n /** Closes the expandable content area. */\n public async hide() {\n if (!this.open) return;\n this.open = false;\n return waitForEvent(this, \"sgds-after-hide\");\n }\n\n /** @internal — returns visible text content for a body cell by visual column index. */\n public getCellText(columnIndex: number) {\n const cells = this._getCells().filter(cell => cell instanceof SgdsDataTableCell) as SgdsDataTableCell[];\n const cell = cells[columnIndex];\n if (!cell) return \"\";\n return (cell.textContent ?? \"\").trim();\n }\n\n private _getCells() {\n return Array.from(this.children).filter(\n child => child instanceof SgdsDataTableCell || child instanceof SgdsDataTableHead\n ) as Array<SgdsDataTableCell | SgdsDataTableHead>;\n }\n\n private _syncCellSlots(cells: Array<SgdsDataTableCell | SgdsDataTableHead>) {\n cells.forEach(cell => {\n const index = cells.indexOf(cell);\n const slotName = `cell-${index}`;\n this._cellSlotNames.set(cell, slotName);\n if (cell.getAttribute(\"slot\") !== slotName) {\n cell.setAttribute(\"slot\", slotName);\n }\n });\n }\n\n private _handleLightDomChange() {\n const cells = this._getCells();\n this._syncCellSlots(cells);\n this._isHeaderRow = cells.some(cell => cell instanceof SgdsDataTableHead);\n this.requestUpdate();\n }\n\n private _onCheckboxChange(e: CustomEvent) {\n this.emit(\"i-sgds-change\", { detail: { checked: (e.target as SgdsCheckbox).checked } });\n }\n\n private _toggleExpand() {\n this.open ? this.hide() : this.show();\n }\n\n private _onExpandKeyDown(e: KeyboardEvent) {\n if (e.key !== \"Enter\") return;\n e.preventDefault();\n this._toggleExpand();\n }\n\n private _onSortKeyDown(e: KeyboardEvent, header: SgdsDataTableHead) {\n if (e.key !== \"Enter\") return;\n e.preventDefault();\n header.handleSortClick();\n }\n\n private _renderCell(el: SgdsDataTableCell | SgdsDataTableHead, columnIndex: number) {\n const slotName = this._cellSlotNames.get(el);\n\n if (el instanceof SgdsDataTableHead) {\n return html`<th\n width=${ifDefined(el.width)}\n colspan=${ifDefined(el.colSpan)}\n rowspan=${ifDefined(el.rowSpan)}\n aria-sort=${ifDefined(el.sortDirection)}\n scope=\"col\"\n tabindex=${ifDefined(el.sorting ? \"0\" : undefined)}\n ?data-sorting=${el.sorting}\n @click=${el.sorting ? () => el.handleSortClick() : nothing}\n @keydown=${el.sorting ? (e: KeyboardEvent) => this._onSortKeyDown(e, el) : nothing}\n >\n <div class=\"data-table-head ${el.textAlign === \"right\" ? \"align-right\" : \"align-left\"}\">\n ${slotName ? html`<slot name=${slotName}></slot>` : nothing}\n ${el.sorting\n ? html`\n <button\n type=\"button\"\n class=\"sort-button ${el.sortDirection === \"none\" ? \"\" : \"active\"}\"\n aria-label=${el.sortDirection === \"descending\" ? \"Sort descending\" : \"Sort ascending\"}\n ?disabled=${!this.hasDataRows}\n >\n <sgds-icon\n class=\"sort-icon\"\n name=${el.sortDirection === \"descending\" ? \"sort-descending\" : \"sort-ascending\"}\n size=\"sm\"\n ></sgds-icon>\n </button>\n `\n : nothing}\n </div>\n </th>`;\n }\n\n const cellAlignment = this.columnAlignments[columnIndex] ?? \"left\";\n return html`<td colspan=${ifDefined(el.colSpan)} rowspan=${ifDefined(el.rowSpan)}>\n <div class=\"data-table-cell ${cellAlignment === \"right\" ? \"align-right\" : \"align-left\"}\">\n ${slotName ? html`<slot name=${slotName}></slot>` : nothing}\n </div>\n </td>`;\n }\n\n private _renderExpandCell() {\n if (this._isHeaderRow) {\n return html`<th class=\"control-cell\" scope=\"col\"></th>`;\n }\n\n return html`<td class=\"control-cell\" @click=${this._toggleExpand} @keydown=${this._onExpandKeyDown} tabindex=\"0\">\n <div class=\"data-table-cell expand-cell\">\n <sgds-icon name=${this.open ? \"chevron-up\" : \"chevron-down\"} size=\"md\"></sgds-icon>\n </div>\n </td>`;\n }\n\n private _renderExpandPlaceholder() {\n return this._isHeaderRow ? html`<th class=\"control-cell\" scope=\"col\"></th>` : html`<td class=\"control-cell\"></td>`;\n }\n\n private _renderCheckboxCell() {\n return this._isHeaderRow\n ? html`<th class=\"control-cell\" scope=\"col\">\n <div class=\"data-table-cell checkbox-cell\">\n <sgds-checkbox .checked=${this.checked} @sgds-change=${this._onCheckboxChange}></sgds-checkbox>\n </div>\n </th>`\n : html`<td class=\"control-cell\">\n <div class=\"data-table-cell checkbox-cell\">\n <sgds-checkbox .checked=${this.checked} @sgds-change=${this._onCheckboxChange}></sgds-checkbox>\n </div>\n </td>`;\n }\n\n render() {\n const cells = this._getCells();\n const totalCols = cells.length + (this.showCheckbox ? 1 : 0) + (this.expand || this.showExpandPlaceholder ? 1 : 0);\n const rowPart = this._isHeaderRow ? \"row row-header\" : \"row row-body\";\n\n return html`\n <tr part=${rowPart} ?data-header-row=${this._isHeaderRow} class=${this.open ? \"active\" : \"\"}>\n ${this.expand\n ? this._renderExpandCell()\n : this.showExpandPlaceholder\n ? this._renderExpandPlaceholder()\n : nothing}\n ${this.showCheckbox ? this._renderCheckboxCell() : nothing}\n ${(() => {\n let visualColumnIndex = 0;\n return cells.map(el => {\n const renderedCell = this._renderCell(el, visualColumnIndex);\n const span = Number(el.colSpan) > 0 ? Number(el.colSpan) : 1;\n visualColumnIndex += span;\n return renderedCell;\n });\n })()}\n </tr>\n\n ${this.expand\n ? html`\n <tr class=\"expandable-row\">\n <td colspan=${totalCols} class=\"expandable-td\">\n <div class=\"expandable-body\">\n <div class=\"expandable-content\">\n <slot name=\"content\"></slot>\n </div>\n </div>\n </td>\n </tr>\n `\n : nothing}\n `;\n }\n}\n\nsetDefaultAnimation(\"row.expand.show\", {\n keyframes: [\n { height: \"0\", opacity: \"0\" },\n { height: \"auto\", opacity: \"1\" }\n ],\n options: { duration: 250, easing: \"ease-in-out\" }\n});\n\nsetDefaultAnimation(\"row.expand.hide\", {\n keyframes: [\n { height: \"auto\", opacity: \"1\" },\n { height: \"0\", opacity: \"0\" }\n ],\n options: { duration: 250, easing: \"ease-in-out\" }\n});\n\nexport default SgdsDataTableRow;\n"],"mappings":"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"}
1
+ {"version":3,"file":"sgds-data-table-row.cjs.js","names":["SgdsElement","tableRowStyle","SgdsCheckbox","SgdsDataTableCell","SgdsDataTableHead","SgdsIcon","stopAnimations","getAnimation","animateTo","shimKeyframesHeightAuto","waitForEvent","ifDefined","nothing","property","query","state","watch","setDefaultAnimation"],"sources":["../../../../src/components/DataTable/sgds-data-table-row.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport { property, query, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport { SgdsCheckbox } from \"../Checkbox/sgds-checkbox\";\nimport { animateTo, shimKeyframesHeightAuto, stopAnimations } from \"../../utils/animate\";\nimport { getAnimation, setDefaultAnimation } from \"../../utils/animation-registry\";\nimport { waitForEvent } from \"../../utils/event\";\nimport { watch } from \"../../utils/watch\";\nimport tableRowStyle from \"./data-table.css\";\nimport SgdsDataTableCell from \"./sgds-data-table-cell\";\nimport SgdsDataTableHead from \"./sgds-data-table-head\";\nimport { SgdsIcon } from \"../Icon/sgds-icon\";\n\n/**\n * @summary A data table row. Set `expand` to enable an expandable content area beneath\n * the row, then place detail content in the `content` slot.\n *\n * @slot default - Insert `sgds-data-table-cell` or `sgds-data-table-head` elements.\n * @slot content - Content shown in the animated expand area beneath the row.\n *\n * @event sgds-show - Emitted when the expandable row begins to open.\n * @event sgds-after-show - Emitted after the expandable row open animation completes.\n * @event sgds-hide - Emitted when the expandable row begins to close.\n * @event sgds-after-hide - Emitted after the expandable row close animation completes.\n */\nexport class SgdsDataTableRow extends SgdsElement {\n static styles = [...SgdsElement.styles, tableRowStyle];\n\n /** @internal */\n static dependencies = {\n \"sgds-checkbox\": SgdsCheckbox,\n \"sgds-data-table-cell\": SgdsDataTableCell,\n \"sgds-data-table-head\": SgdsDataTableHead,\n \"sgds-icon\": SgdsIcon\n };\n\n /** When true, the row has an expandable content area toggled by a chevron. */\n @property({ type: Boolean, reflect: true }) expand = false;\n\n /** When true, the expandable content area is open. */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** When true, the row is checked. */\n @property({ type: Boolean, reflect: true }) checked = false;\n\n /** @internal — set by `sgds-data-table` to show a checkbox cell on this row. */\n @property({ type: Boolean }) showCheckbox = false;\n\n /** @internal — set by `sgds-data-table` when at least one sibling row is expandable. */\n @property({ type: Boolean }) showExpandPlaceholder = false;\n\n /** @internal — per-column alignment injected by `sgds-data-table` from header cells. */\n @property({ attribute: false }) columnAlignments: Array<\"left\" | \"right\"> = [];\n\n /** @internal — set by `sgds-data-table` to indicate whether body rows exist. */\n @property({ type: Boolean }) hasDataRows = false;\n\n /** @internal */\n @query(\".expandable-body\") private _expandableBody!: HTMLElement;\n\n /** @internal */\n @query(\"sgds-checkbox\") private _checkboxEl!: SgdsCheckbox;\n\n @state() private _isHeaderRow = false;\n private _cellSlotNames = new WeakMap<SgdsDataTableCell | SgdsDataTableHead, string>();\n private _lightDomObserver?: MutationObserver;\n\n /** The checkbox rendered inside this row, if `showCheckbox` is true. */\n get checkbox(): SgdsCheckbox | null {\n return this._checkboxEl ?? null;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._lightDomObserver = new MutationObserver(() => this._handleLightDomChange());\n this._lightDomObserver.observe(this, { childList: true });\n this._handleLightDomChange();\n }\n\n disconnectedCallback() {\n this._lightDomObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n firstUpdated() {\n if (this._expandableBody) {\n this._expandableBody.hidden = !this.open;\n }\n }\n\n @watch(\"open\", { waitUntilFirstUpdate: true })\n async handleExpandedChange() {\n if (this.open) {\n const sgdsShow = this.emit(\"sgds-show\", { cancelable: true });\n if (sgdsShow.defaultPrevented) {\n this.open = false;\n return;\n }\n await stopAnimations(this._expandableBody);\n this._expandableBody.hidden = false;\n const { keyframes, options } = getAnimation(this, \"row.expand.show\");\n await animateTo(\n this._expandableBody,\n shimKeyframesHeightAuto(keyframes, this._expandableBody.scrollHeight),\n options\n );\n this.emit(\"sgds-after-show\");\n } else {\n const sgdsHide = this.emit(\"sgds-hide\", { cancelable: true });\n if (sgdsHide.defaultPrevented) {\n this.open = true;\n return;\n }\n await stopAnimations(this._expandableBody);\n const { keyframes, options } = getAnimation(this, \"row.expand.hide\");\n await animateTo(\n this._expandableBody,\n shimKeyframesHeightAuto(keyframes, this._expandableBody.scrollHeight),\n options\n );\n this._expandableBody.hidden = true;\n this.emit(\"sgds-after-hide\");\n }\n }\n\n /** Opens the expandable content area. */\n public async show() {\n if (this.open) return;\n this.open = true;\n return waitForEvent(this, \"sgds-after-show\");\n }\n\n /** Closes the expandable content area. */\n public async hide() {\n if (!this.open) return;\n this.open = false;\n return waitForEvent(this, \"sgds-after-hide\");\n }\n\n /** @internal — returns visible text content for a body cell by visual column index. */\n public getCellText(columnIndex: number) {\n const cells = this._getCells().filter(cell => cell instanceof SgdsDataTableCell) as SgdsDataTableCell[];\n const cell = cells[columnIndex];\n if (!cell) return \"\";\n return (cell.textContent ?? \"\").trim();\n }\n\n private _getCells() {\n return Array.from(this.children).filter(\n child => child instanceof SgdsDataTableCell || child instanceof SgdsDataTableHead\n ) as Array<SgdsDataTableCell | SgdsDataTableHead>;\n }\n\n private _syncCellSlots(cells: Array<SgdsDataTableCell | SgdsDataTableHead>) {\n cells.forEach(cell => {\n const index = cells.indexOf(cell);\n const slotName = `cell-${index}`;\n this._cellSlotNames.set(cell, slotName);\n if (cell.getAttribute(\"slot\") !== slotName) {\n cell.setAttribute(\"slot\", slotName);\n }\n });\n }\n\n private _handleLightDomChange() {\n const cells = this._getCells();\n this._syncCellSlots(cells);\n this._isHeaderRow = cells.some(cell => cell instanceof SgdsDataTableHead);\n this.requestUpdate();\n }\n\n private _onCheckboxChange(e: CustomEvent) {\n this.emit(\"i-sgds-change\", { detail: { checked: (e.target as SgdsCheckbox).checked } });\n }\n\n private _toggleExpand() {\n this.open ? this.hide() : this.show();\n }\n\n private _onExpandKeyDown(e: KeyboardEvent) {\n if (e.key !== \"Enter\") return;\n e.preventDefault();\n this._toggleExpand();\n }\n\n private _onSortKeyDown(e: KeyboardEvent, header: SgdsDataTableHead) {\n if (e.key !== \"Enter\") return;\n e.preventDefault();\n header.handleSortClick();\n }\n\n private _renderCell(el: SgdsDataTableCell | SgdsDataTableHead, columnIndex: number) {\n const slotName = this._cellSlotNames.get(el);\n\n if (el instanceof SgdsDataTableHead) {\n return html`<th\n width=${ifDefined(el.width)}\n colspan=${ifDefined(el.colSpan)}\n rowspan=${ifDefined(el.rowSpan)}\n aria-sort=${ifDefined(el.sortDirection)}\n scope=\"col\"\n tabindex=${ifDefined(el.sorting ? \"0\" : undefined)}\n ?data-sorting=${el.sorting}\n @click=${el.sorting ? () => el.handleSortClick() : nothing}\n @keydown=${el.sorting ? (e: KeyboardEvent) => this._onSortKeyDown(e, el) : nothing}\n >\n <div class=\"data-table-head ${el.textAlign === \"right\" ? \"align-right\" : \"align-left\"}\">\n ${slotName ? html`<slot name=${slotName}></slot>` : nothing}\n ${el.sorting\n ? html`\n <button\n type=\"button\"\n class=\"sort-button ${el.sortDirection === \"none\" ? \"\" : \"active\"}\"\n aria-label=${el.sortDirection === \"descending\" ? \"Sort descending\" : \"Sort ascending\"}\n ?disabled=${!this.hasDataRows}\n >\n <sgds-icon\n class=\"sort-icon\"\n name=${el.sortDirection === \"descending\" ? \"sort-descending\" : \"sort-ascending\"}\n size=\"sm\"\n ></sgds-icon>\n </button>\n `\n : nothing}\n </div>\n </th>`;\n }\n\n const cellAlignment = this.columnAlignments[columnIndex] ?? \"left\";\n return html`<td colspan=${ifDefined(el.colSpan)} rowspan=${ifDefined(el.rowSpan)}>\n <div class=\"data-table-cell ${cellAlignment === \"right\" ? \"align-right\" : \"align-left\"}\">\n ${slotName ? html`<slot name=${slotName}></slot>` : nothing}\n </div>\n </td>`;\n }\n\n private _renderExpandCell() {\n if (this._isHeaderRow) {\n return html`<th class=\"control-cell\" scope=\"col\"><span class=\"visually-hidden\">Expand</span></th>`;\n }\n\n return html`<td class=\"control-cell\" @click=${this._toggleExpand} @keydown=${this._onExpandKeyDown} tabindex=\"0\">\n <div class=\"data-table-cell expand-cell\">\n <sgds-icon name=${this.open ? \"chevron-up\" : \"chevron-down\"} size=\"md\"></sgds-icon>\n </div>\n </td>`;\n }\n\n private _renderExpandPlaceholder() {\n return this._isHeaderRow\n ? html`<th class=\"control-cell\" scope=\"col\"><span class=\"visually-hidden\">Expand</span></th>`\n : html`<td class=\"control-cell\"></td>`;\n }\n\n private _renderCheckboxCell() {\n return this._isHeaderRow\n ? html`<th class=\"control-cell\" scope=\"col\">\n <div class=\"data-table-cell checkbox-cell\">\n <sgds-checkbox\n .checked=${this.checked}\n @sgds-change=${this._onCheckboxChange}\n .ariaLabel=${\"Select all rows\"}\n ></sgds-checkbox>\n </div>\n </th>`\n : html`<td class=\"control-cell\">\n <div class=\"data-table-cell checkbox-cell\">\n <sgds-checkbox\n .checked=${this.checked}\n @sgds-change=${this._onCheckboxChange}\n .ariaLabel=${\"Select row\"}\n ></sgds-checkbox>\n </div>\n </td>`;\n }\n\n render() {\n const cells = this._getCells();\n const totalCols = cells.length + (this.showCheckbox ? 1 : 0) + (this.expand || this.showExpandPlaceholder ? 1 : 0);\n const rowPart = this._isHeaderRow ? \"row row-header\" : \"row row-body\";\n\n return html`\n <tr part=${rowPart} ?data-header-row=${this._isHeaderRow} class=${this.open ? \"active\" : \"\"}>\n ${this.expand\n ? this._renderExpandCell()\n : this.showExpandPlaceholder\n ? this._renderExpandPlaceholder()\n : nothing}\n ${this.showCheckbox ? this._renderCheckboxCell() : nothing}\n ${(() => {\n let visualColumnIndex = 0;\n return cells.map(el => {\n const renderedCell = this._renderCell(el, visualColumnIndex);\n const span = Number(el.colSpan) > 0 ? Number(el.colSpan) : 1;\n visualColumnIndex += span;\n return renderedCell;\n });\n })()}\n </tr>\n\n ${this.expand\n ? html`\n <tr class=\"expandable-row\">\n <td colspan=${totalCols} class=\"expandable-td\">\n <div class=\"expandable-body\">\n <div class=\"expandable-content\">\n <slot name=\"content\"></slot>\n </div>\n </div>\n </td>\n </tr>\n `\n : nothing}\n `;\n }\n}\n\nsetDefaultAnimation(\"row.expand.show\", {\n keyframes: [\n { height: \"0\", opacity: \"0\" },\n { height: \"auto\", opacity: \"1\" }\n ],\n options: { duration: 250, easing: \"ease-in-out\" }\n});\n\nsetDefaultAnimation(\"row.expand.hide\", {\n keyframes: [\n { height: \"auto\", opacity: \"1\" },\n { height: \"0\", opacity: \"0\" }\n ],\n options: { duration: 250, easing: \"ease-in-out\" }\n});\n\nexport default SgdsDataTableRow;\n"],"mappings":"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"}
@@ -179,7 +179,7 @@ var SgdsDataTableRow = class extends SgdsElement {
179
179
  </td>`;
180
180
  }
181
181
  _renderExpandCell() {
182
- if (this._isHeaderRow) return html`<th class="control-cell" scope="col"></th>`;
182
+ if (this._isHeaderRow) return html`<th class="control-cell" scope="col"><span class="visually-hidden">Expand</span></th>`;
183
183
  return html`<td class="control-cell" @click=${this._toggleExpand} @keydown=${this._onExpandKeyDown} tabindex="0">
184
184
  <div class="data-table-cell expand-cell">
185
185
  <sgds-icon name=${this.open ? "chevron-up" : "chevron-down"} size="md"></sgds-icon>
@@ -187,16 +187,24 @@ var SgdsDataTableRow = class extends SgdsElement {
187
187
  </td>`;
188
188
  }
189
189
  _renderExpandPlaceholder() {
190
- return this._isHeaderRow ? html`<th class="control-cell" scope="col"></th>` : html`<td class="control-cell"></td>`;
190
+ return this._isHeaderRow ? html`<th class="control-cell" scope="col"><span class="visually-hidden">Expand</span></th>` : html`<td class="control-cell"></td>`;
191
191
  }
192
192
  _renderCheckboxCell() {
193
193
  return this._isHeaderRow ? html`<th class="control-cell" scope="col">
194
194
  <div class="data-table-cell checkbox-cell">
195
- <sgds-checkbox .checked=${this.checked} @sgds-change=${this._onCheckboxChange}></sgds-checkbox>
195
+ <sgds-checkbox
196
+ .checked=${this.checked}
197
+ @sgds-change=${this._onCheckboxChange}
198
+ .ariaLabel=${"Select all rows"}
199
+ ></sgds-checkbox>
196
200
  </div>
197
201
  </th>` : html`<td class="control-cell">
198
202
  <div class="data-table-cell checkbox-cell">
199
- <sgds-checkbox .checked=${this.checked} @sgds-change=${this._onCheckboxChange}></sgds-checkbox>
203
+ <sgds-checkbox
204
+ .checked=${this.checked}
205
+ @sgds-change=${this._onCheckboxChange}
206
+ .ariaLabel=${"Select row"}
207
+ ></sgds-checkbox>
200
208
  </div>
201
209
  </td>`;
202
210
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-data-table-row.js","names":["tableRowStyle"],"sources":["../../../../src/components/DataTable/sgds-data-table-row.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport { property, query, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport { SgdsCheckbox } from \"../Checkbox/sgds-checkbox\";\nimport { animateTo, shimKeyframesHeightAuto, stopAnimations } from \"../../utils/animate\";\nimport { getAnimation, setDefaultAnimation } from \"../../utils/animation-registry\";\nimport { waitForEvent } from \"../../utils/event\";\nimport { watch } from \"../../utils/watch\";\nimport tableRowStyle from \"./data-table.css\";\nimport SgdsDataTableCell from \"./sgds-data-table-cell\";\nimport SgdsDataTableHead from \"./sgds-data-table-head\";\nimport { SgdsIcon } from \"../Icon/sgds-icon\";\n\n/**\n * @summary A data table row. Set `expand` to enable an expandable content area beneath\n * the row, then place detail content in the `content` slot.\n *\n * @slot default - Insert `sgds-data-table-cell` or `sgds-data-table-head` elements.\n * @slot content - Content shown in the animated expand area beneath the row.\n *\n * @event sgds-show - Emitted when the expandable row begins to open.\n * @event sgds-after-show - Emitted after the expandable row open animation completes.\n * @event sgds-hide - Emitted when the expandable row begins to close.\n * @event sgds-after-hide - Emitted after the expandable row close animation completes.\n */\nexport class SgdsDataTableRow extends SgdsElement {\n static styles = [...SgdsElement.styles, tableRowStyle];\n\n /** @internal */\n static dependencies = {\n \"sgds-checkbox\": SgdsCheckbox,\n \"sgds-data-table-cell\": SgdsDataTableCell,\n \"sgds-data-table-head\": SgdsDataTableHead,\n \"sgds-icon\": SgdsIcon\n };\n\n /** When true, the row has an expandable content area toggled by a chevron. */\n @property({ type: Boolean, reflect: true }) expand = false;\n\n /** When true, the expandable content area is open. */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** When true, the row is checked. */\n @property({ type: Boolean, reflect: true }) checked = false;\n\n /** @internal — set by `sgds-data-table` to show a checkbox cell on this row. */\n @property({ type: Boolean }) showCheckbox = false;\n\n /** @internal — set by `sgds-data-table` when at least one sibling row is expandable. */\n @property({ type: Boolean }) showExpandPlaceholder = false;\n\n /** @internal — per-column alignment injected by `sgds-data-table` from header cells. */\n @property({ attribute: false }) columnAlignments: Array<\"left\" | \"right\"> = [];\n\n /** @internal — set by `sgds-data-table` to indicate whether body rows exist. */\n @property({ type: Boolean }) hasDataRows = false;\n\n /** @internal */\n @query(\".expandable-body\") private _expandableBody!: HTMLElement;\n\n /** @internal */\n @query(\"sgds-checkbox\") private _checkboxEl!: SgdsCheckbox;\n\n @state() private _isHeaderRow = false;\n private _cellSlotNames = new WeakMap<SgdsDataTableCell | SgdsDataTableHead, string>();\n private _lightDomObserver?: MutationObserver;\n\n /** The checkbox rendered inside this row, if `showCheckbox` is true. */\n get checkbox(): SgdsCheckbox | null {\n return this._checkboxEl ?? null;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._lightDomObserver = new MutationObserver(() => this._handleLightDomChange());\n this._lightDomObserver.observe(this, { childList: true });\n this._handleLightDomChange();\n }\n\n disconnectedCallback() {\n this._lightDomObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n firstUpdated() {\n if (this._expandableBody) {\n this._expandableBody.hidden = !this.open;\n }\n }\n\n @watch(\"open\", { waitUntilFirstUpdate: true })\n async handleExpandedChange() {\n if (this.open) {\n const sgdsShow = this.emit(\"sgds-show\", { cancelable: true });\n if (sgdsShow.defaultPrevented) {\n this.open = false;\n return;\n }\n await stopAnimations(this._expandableBody);\n this._expandableBody.hidden = false;\n const { keyframes, options } = getAnimation(this, \"row.expand.show\");\n await animateTo(\n this._expandableBody,\n shimKeyframesHeightAuto(keyframes, this._expandableBody.scrollHeight),\n options\n );\n this.emit(\"sgds-after-show\");\n } else {\n const sgdsHide = this.emit(\"sgds-hide\", { cancelable: true });\n if (sgdsHide.defaultPrevented) {\n this.open = true;\n return;\n }\n await stopAnimations(this._expandableBody);\n const { keyframes, options } = getAnimation(this, \"row.expand.hide\");\n await animateTo(\n this._expandableBody,\n shimKeyframesHeightAuto(keyframes, this._expandableBody.scrollHeight),\n options\n );\n this._expandableBody.hidden = true;\n this.emit(\"sgds-after-hide\");\n }\n }\n\n /** Opens the expandable content area. */\n public async show() {\n if (this.open) return;\n this.open = true;\n return waitForEvent(this, \"sgds-after-show\");\n }\n\n /** Closes the expandable content area. */\n public async hide() {\n if (!this.open) return;\n this.open = false;\n return waitForEvent(this, \"sgds-after-hide\");\n }\n\n /** @internal — returns visible text content for a body cell by visual column index. */\n public getCellText(columnIndex: number) {\n const cells = this._getCells().filter(cell => cell instanceof SgdsDataTableCell) as SgdsDataTableCell[];\n const cell = cells[columnIndex];\n if (!cell) return \"\";\n return (cell.textContent ?? \"\").trim();\n }\n\n private _getCells() {\n return Array.from(this.children).filter(\n child => child instanceof SgdsDataTableCell || child instanceof SgdsDataTableHead\n ) as Array<SgdsDataTableCell | SgdsDataTableHead>;\n }\n\n private _syncCellSlots(cells: Array<SgdsDataTableCell | SgdsDataTableHead>) {\n cells.forEach(cell => {\n const index = cells.indexOf(cell);\n const slotName = `cell-${index}`;\n this._cellSlotNames.set(cell, slotName);\n if (cell.getAttribute(\"slot\") !== slotName) {\n cell.setAttribute(\"slot\", slotName);\n }\n });\n }\n\n private _handleLightDomChange() {\n const cells = this._getCells();\n this._syncCellSlots(cells);\n this._isHeaderRow = cells.some(cell => cell instanceof SgdsDataTableHead);\n this.requestUpdate();\n }\n\n private _onCheckboxChange(e: CustomEvent) {\n this.emit(\"i-sgds-change\", { detail: { checked: (e.target as SgdsCheckbox).checked } });\n }\n\n private _toggleExpand() {\n this.open ? this.hide() : this.show();\n }\n\n private _onExpandKeyDown(e: KeyboardEvent) {\n if (e.key !== \"Enter\") return;\n e.preventDefault();\n this._toggleExpand();\n }\n\n private _onSortKeyDown(e: KeyboardEvent, header: SgdsDataTableHead) {\n if (e.key !== \"Enter\") return;\n e.preventDefault();\n header.handleSortClick();\n }\n\n private _renderCell(el: SgdsDataTableCell | SgdsDataTableHead, columnIndex: number) {\n const slotName = this._cellSlotNames.get(el);\n\n if (el instanceof SgdsDataTableHead) {\n return html`<th\n width=${ifDefined(el.width)}\n colspan=${ifDefined(el.colSpan)}\n rowspan=${ifDefined(el.rowSpan)}\n aria-sort=${ifDefined(el.sortDirection)}\n scope=\"col\"\n tabindex=${ifDefined(el.sorting ? \"0\" : undefined)}\n ?data-sorting=${el.sorting}\n @click=${el.sorting ? () => el.handleSortClick() : nothing}\n @keydown=${el.sorting ? (e: KeyboardEvent) => this._onSortKeyDown(e, el) : nothing}\n >\n <div class=\"data-table-head ${el.textAlign === \"right\" ? \"align-right\" : \"align-left\"}\">\n ${slotName ? html`<slot name=${slotName}></slot>` : nothing}\n ${el.sorting\n ? html`\n <button\n type=\"button\"\n class=\"sort-button ${el.sortDirection === \"none\" ? \"\" : \"active\"}\"\n aria-label=${el.sortDirection === \"descending\" ? \"Sort descending\" : \"Sort ascending\"}\n ?disabled=${!this.hasDataRows}\n >\n <sgds-icon\n class=\"sort-icon\"\n name=${el.sortDirection === \"descending\" ? \"sort-descending\" : \"sort-ascending\"}\n size=\"sm\"\n ></sgds-icon>\n </button>\n `\n : nothing}\n </div>\n </th>`;\n }\n\n const cellAlignment = this.columnAlignments[columnIndex] ?? \"left\";\n return html`<td colspan=${ifDefined(el.colSpan)} rowspan=${ifDefined(el.rowSpan)}>\n <div class=\"data-table-cell ${cellAlignment === \"right\" ? \"align-right\" : \"align-left\"}\">\n ${slotName ? html`<slot name=${slotName}></slot>` : nothing}\n </div>\n </td>`;\n }\n\n private _renderExpandCell() {\n if (this._isHeaderRow) {\n return html`<th class=\"control-cell\" scope=\"col\"></th>`;\n }\n\n return html`<td class=\"control-cell\" @click=${this._toggleExpand} @keydown=${this._onExpandKeyDown} tabindex=\"0\">\n <div class=\"data-table-cell expand-cell\">\n <sgds-icon name=${this.open ? \"chevron-up\" : \"chevron-down\"} size=\"md\"></sgds-icon>\n </div>\n </td>`;\n }\n\n private _renderExpandPlaceholder() {\n return this._isHeaderRow ? html`<th class=\"control-cell\" scope=\"col\"></th>` : html`<td class=\"control-cell\"></td>`;\n }\n\n private _renderCheckboxCell() {\n return this._isHeaderRow\n ? html`<th class=\"control-cell\" scope=\"col\">\n <div class=\"data-table-cell checkbox-cell\">\n <sgds-checkbox .checked=${this.checked} @sgds-change=${this._onCheckboxChange}></sgds-checkbox>\n </div>\n </th>`\n : html`<td class=\"control-cell\">\n <div class=\"data-table-cell checkbox-cell\">\n <sgds-checkbox .checked=${this.checked} @sgds-change=${this._onCheckboxChange}></sgds-checkbox>\n </div>\n </td>`;\n }\n\n render() {\n const cells = this._getCells();\n const totalCols = cells.length + (this.showCheckbox ? 1 : 0) + (this.expand || this.showExpandPlaceholder ? 1 : 0);\n const rowPart = this._isHeaderRow ? \"row row-header\" : \"row row-body\";\n\n return html`\n <tr part=${rowPart} ?data-header-row=${this._isHeaderRow} class=${this.open ? \"active\" : \"\"}>\n ${this.expand\n ? this._renderExpandCell()\n : this.showExpandPlaceholder\n ? this._renderExpandPlaceholder()\n : nothing}\n ${this.showCheckbox ? this._renderCheckboxCell() : nothing}\n ${(() => {\n let visualColumnIndex = 0;\n return cells.map(el => {\n const renderedCell = this._renderCell(el, visualColumnIndex);\n const span = Number(el.colSpan) > 0 ? Number(el.colSpan) : 1;\n visualColumnIndex += span;\n return renderedCell;\n });\n })()}\n </tr>\n\n ${this.expand\n ? html`\n <tr class=\"expandable-row\">\n <td colspan=${totalCols} class=\"expandable-td\">\n <div class=\"expandable-body\">\n <div class=\"expandable-content\">\n <slot name=\"content\"></slot>\n </div>\n </div>\n </td>\n </tr>\n `\n : nothing}\n `;\n }\n}\n\nsetDefaultAnimation(\"row.expand.show\", {\n keyframes: [\n { height: \"0\", opacity: \"0\" },\n { height: \"auto\", opacity: \"1\" }\n ],\n options: { duration: 250, easing: \"ease-in-out\" }\n});\n\nsetDefaultAnimation(\"row.expand.hide\", {\n keyframes: [\n { height: \"auto\", opacity: \"1\" },\n { height: \"0\", opacity: \"0\" }\n ],\n options: { duration: 250, easing: \"ease-in-out\" }\n});\n\nexport default SgdsDataTableRow;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,IAAa,mBAAb,cAAsC,YAAY;;;EAYK,KAAA,SAAA;EAGF,KAAA,OAAA;EAGG,KAAA,UAAA;EAGV,KAAA,eAAA;EAGS,KAAA,wBAAA;EAGuB,KAAA,mBAAA,CAAC;EAGlC,KAAA,cAAA;EAQX,KAAA,eAAA;EACP,KAAA,iCAAA,IAAI,QAAuD;;;EAtCpE,KAAA,SAAA,CAAC,GAAG,YAAY,QAAQA,QAAa;;;EAG/B,KAAA,eAAA;GACpB,iBAAiB;GACjB,wBAAwB;GACxB,wBAAwB;GACxB,aAAa;EACf;;;CAkCA,IAAI,WAAgC;EAClC,OAAO,KAAK,eAAe;CAC7B;CAEA,oBAAoB;EAClB,MAAM,kBAAkB;EACxB,KAAK,oBAAoB,IAAI,uBAAuB,KAAK,sBAAsB,CAAC;EAChF,KAAK,kBAAkB,QAAQ,MAAM,EAAE,WAAW,KAAK,CAAC;EACxD,KAAK,sBAAsB;CAC7B;CAEA,uBAAuB;EACrB,KAAK,mBAAmB,WAAW;EACnC,MAAM,qBAAqB;CAC7B;CAEA,eAAe;EACb,IAAI,KAAK,iBACP,KAAK,gBAAgB,SAAS,CAAC,KAAK;CAExC;CAEA,MACM,uBAAuB;EAC3B,IAAI,KAAK,MAAM;GAEb,IADiB,KAAK,KAAK,aAAa,EAAE,YAAY,KAAK,CAChD,CAAC,CAAC,kBAAkB;IAC7B,KAAK,OAAO;IACZ;GACF;GACA,MAAM,eAAe,KAAK,eAAe;GACzC,KAAK,gBAAgB,SAAS;GAC9B,MAAM,EAAE,WAAW,YAAY,aAAa,MAAM,iBAAiB;GACnE,MAAM,UACJ,KAAK,iBACL,wBAAwB,WAAW,KAAK,gBAAgB,YAAY,GACpE,OACF;GACA,KAAK,KAAK,iBAAiB;EAC7B,OAAO;GAEL,IADiB,KAAK,KAAK,aAAa,EAAE,YAAY,KAAK,CAChD,CAAC,CAAC,kBAAkB;IAC7B,KAAK,OAAO;IACZ;GACF;GACA,MAAM,eAAe,KAAK,eAAe;GACzC,MAAM,EAAE,WAAW,YAAY,aAAa,MAAM,iBAAiB;GACnE,MAAM,UACJ,KAAK,iBACL,wBAAwB,WAAW,KAAK,gBAAgB,YAAY,GACpE,OACF;GACA,KAAK,gBAAgB,SAAS;GAC9B,KAAK,KAAK,iBAAiB;EAC7B;CACF;;CAGA,MAAa,OAAO;EAClB,IAAI,KAAK,MAAM;EACf,KAAK,OAAO;EACZ,OAAO,aAAa,MAAM,iBAAiB;CAC7C;;CAGA,MAAa,OAAO;EAClB,IAAI,CAAC,KAAK,MAAM;EAChB,KAAK,OAAO;EACZ,OAAO,aAAa,MAAM,iBAAiB;CAC7C;;CAGA,YAAmB,aAAqB;EAEtC,MAAM,OADQ,KAAK,UAAU,CAAC,CAAC,QAAO,SAAQ,gBAAgB,iBAC7C,CAAC,CAAC;EACnB,IAAI,CAAC,MAAM,OAAO;EAClB,QAAQ,KAAK,eAAe,GAAA,CAAI,KAAK;CACvC;CAEA,YAAoB;EAClB,OAAO,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,QAC/B,UAAS,iBAAiB,qBAAqB,iBAAiB,iBAClE;CACF;CAEA,eAAuB,OAAqD;EAC1E,MAAM,SAAQ,SAAQ;GAEpB,MAAM,WAAW,QADH,MAAM,QAAQ,IACC;GAC7B,KAAK,eAAe,IAAI,MAAM,QAAQ;GACtC,IAAI,KAAK,aAAa,MAAM,MAAM,UAChC,KAAK,aAAa,QAAQ,QAAQ;EAEtC,CAAC;CACH;CAEA,wBAAgC;EAC9B,MAAM,QAAQ,KAAK,UAAU;EAC7B,KAAK,eAAe,KAAK;EACzB,KAAK,eAAe,MAAM,MAAK,SAAQ,gBAAgB,iBAAiB;EACxE,KAAK,cAAc;CACrB;CAEA,kBAA0B,GAAgB;EACxC,KAAK,KAAK,iBAAiB,EAAE,QAAQ,EAAE,SAAU,EAAE,OAAwB,QAAQ,EAAE,CAAC;CACxF;CAEA,gBAAwB;EACtB,KAAK,OAAO,KAAK,KAAK,IAAI,KAAK,KAAK;CACtC;CAEA,iBAAyB,GAAkB;EACzC,IAAI,EAAE,QAAQ,SAAS;EACvB,EAAE,eAAe;EACjB,KAAK,cAAc;CACrB;CAEA,eAAuB,GAAkB,QAA2B;EAClE,IAAI,EAAE,QAAQ,SAAS;EACvB,EAAE,eAAe;EACjB,OAAO,gBAAgB;CACzB;CAEA,YAAoB,IAA2C,aAAqB;EAClF,MAAM,WAAW,KAAK,eAAe,IAAI,EAAE;EAE3C,IAAI,cAAc,mBAChB,OAAO,IAAI;gBACD,UAAU,GAAG,KAAK,EAAE;kBAClB,UAAU,GAAG,OAAO,EAAE;kBACtB,UAAU,GAAG,OAAO,EAAE;oBACpB,UAAU,GAAG,aAAa,EAAE;;mBAE7B,UAAU,GAAG,UAAU,MAAM,KAAA,CAAS,EAAE;wBACnC,GAAG,QAAQ;iBAClB,GAAG,gBAAgB,GAAG,gBAAgB,IAAI,QAAQ;mBAChD,GAAG,WAAW,MAAqB,KAAK,eAAe,GAAG,EAAE,IAAI,QAAQ;;sCAErD,GAAG,cAAc,UAAU,gBAAgB,aAAa;YAClF,WAAW,IAAI,cAAc,SAAS,YAAY,QAAQ;YAC1D,GAAG,UACD,IAAI;;;uCAGqB,GAAG,kBAAkB,SAAS,KAAK,SAAS;+BACpD,GAAG,kBAAkB,eAAe,oBAAoB,iBAAiB;8BAC1E,CAAC,KAAK,YAAY;;;;2BAIrB,GAAG,kBAAkB,eAAe,oBAAoB,iBAAiB;;;;kBAKtF,QAAQ;;;EAKlB,MAAM,gBAAgB,KAAK,iBAAiB,gBAAgB;EAC5D,OAAO,IAAI,eAAe,UAAU,GAAG,OAAO,EAAE,WAAW,UAAU,GAAG,OAAO,EAAE;oCACjD,kBAAkB,UAAU,gBAAgB,aAAa;UACnF,WAAW,IAAI,cAAc,SAAS,YAAY,QAAQ;;;CAGlE;CAEA,oBAA4B;EAC1B,IAAI,KAAK,cACP,OAAO,IAAI;EAGb,OAAO,IAAI,mCAAmC,KAAK,cAAc,YAAY,KAAK,iBAAiB;;0BAE7E,KAAK,OAAO,eAAe,eAAe;;;CAGlE;CAEA,2BAAmC;EACjC,OAAO,KAAK,eAAe,IAAI,+CAA+C,IAAI;CACpF;CAEA,sBAA8B;EAC5B,OAAO,KAAK,eACR,IAAI;;sCAE0B,KAAK,QAAQ,gBAAgB,KAAK,kBAAkB;;iBAGlF,IAAI;;sCAE0B,KAAK,QAAQ,gBAAgB,KAAK,kBAAkB;;;CAGxF;CAEA,SAAS;EACP,MAAM,QAAQ,KAAK,UAAU;EAC7B,MAAM,YAAY,MAAM,UAAU,KAAK,eAAe,IAAI,MAAM,KAAK,UAAU,KAAK,wBAAwB,IAAI;EAChH,MAAM,UAAU,KAAK,eAAe,mBAAmB;EAEvD,OAAO,IAAI;iBACE,QAAQ,oBAAoB,KAAK,aAAa,SAAS,KAAK,OAAO,WAAW,GAAG;UACxF,KAAK,SACH,KAAK,kBAAkB,IACvB,KAAK,wBACL,KAAK,yBAAyB,IAC9B,QAAQ;UACV,KAAK,eAAe,KAAK,oBAAoB,IAAI,QAAQ;iBAClD;GACP,IAAI,oBAAoB;GACxB,OAAO,MAAM,KAAI,OAAM;IACrB,MAAM,eAAe,KAAK,YAAY,IAAI,iBAAiB;IAC3D,MAAM,OAAO,OAAO,GAAG,OAAO,IAAI,IAAI,OAAO,GAAG,OAAO,IAAI;IAC3D,qBAAqB;IACrB,OAAO;GACT,CAAC;EACH,EAAA,CAAG,EAAE;;;QAGL,KAAK,SACH,IAAI;;4BAEc,UAAU;;;;;;;;cAS5B,QAAQ;;CAEhB;AACF;AA5QG,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,iBAAA,WAAA,UAAA,KAAA,CAAA;AAGzC,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,iBAAA,WAAA,QAAA,KAAA,CAAA;AAGzC,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,iBAAA,WAAA,WAAA,KAAA,CAAA;AAGzC,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,iBAAA,WAAA,gBAAA,KAAA,CAAA;AAG1B,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,iBAAA,WAAA,yBAAA,KAAA,CAAA;AAG1B,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,iBAAA,WAAA,oBAAA,KAAA,CAAA;AAG7B,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,iBAAA,WAAA,eAAA,KAAA,CAAA;AAG1B,WAAA,CAAA,MAAM,kBAAkB,CAAA,GAAA,iBAAA,WAAA,mBAAA,KAAA,CAAA;AAGxB,WAAA,CAAA,MAAM,eAAe,CAAA,GAAA,iBAAA,WAAA,eAAA,KAAA,CAAA;AAErB,WAAA,CAAA,MAAM,CAAA,GAAA,iBAAA,WAAA,gBAAA,KAAA,CAAA;AA2BN,WAAA,CAAA,MAAM,QAAQ,EAAE,sBAAsB,KAAK,CAAC,CAAA,GAAA,iBAAA,WAAA,wBAAA,IAAA;AAyN/C,oBAAoB,mBAAmB;CACrC,WAAW,CACT;EAAE,QAAQ;EAAK,SAAS;CAAI,GAC5B;EAAE,QAAQ;EAAQ,SAAS;CAAI,CACjC;CACA,SAAS;EAAE,UAAU;EAAK,QAAQ;CAAc;AAClD,CAAC;AAED,oBAAoB,mBAAmB;CACrC,WAAW,CACT;EAAE,QAAQ;EAAQ,SAAS;CAAI,GAC/B;EAAE,QAAQ;EAAK,SAAS;CAAI,CAC9B;CACA,SAAS;EAAE,UAAU;EAAK,QAAQ;CAAc;AAClD,CAAC"}
1
+ {"version":3,"file":"sgds-data-table-row.js","names":["tableRowStyle"],"sources":["../../../../src/components/DataTable/sgds-data-table-row.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport { property, query, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport { SgdsCheckbox } from \"../Checkbox/sgds-checkbox\";\nimport { animateTo, shimKeyframesHeightAuto, stopAnimations } from \"../../utils/animate\";\nimport { getAnimation, setDefaultAnimation } from \"../../utils/animation-registry\";\nimport { waitForEvent } from \"../../utils/event\";\nimport { watch } from \"../../utils/watch\";\nimport tableRowStyle from \"./data-table.css\";\nimport SgdsDataTableCell from \"./sgds-data-table-cell\";\nimport SgdsDataTableHead from \"./sgds-data-table-head\";\nimport { SgdsIcon } from \"../Icon/sgds-icon\";\n\n/**\n * @summary A data table row. Set `expand` to enable an expandable content area beneath\n * the row, then place detail content in the `content` slot.\n *\n * @slot default - Insert `sgds-data-table-cell` or `sgds-data-table-head` elements.\n * @slot content - Content shown in the animated expand area beneath the row.\n *\n * @event sgds-show - Emitted when the expandable row begins to open.\n * @event sgds-after-show - Emitted after the expandable row open animation completes.\n * @event sgds-hide - Emitted when the expandable row begins to close.\n * @event sgds-after-hide - Emitted after the expandable row close animation completes.\n */\nexport class SgdsDataTableRow extends SgdsElement {\n static styles = [...SgdsElement.styles, tableRowStyle];\n\n /** @internal */\n static dependencies = {\n \"sgds-checkbox\": SgdsCheckbox,\n \"sgds-data-table-cell\": SgdsDataTableCell,\n \"sgds-data-table-head\": SgdsDataTableHead,\n \"sgds-icon\": SgdsIcon\n };\n\n /** When true, the row has an expandable content area toggled by a chevron. */\n @property({ type: Boolean, reflect: true }) expand = false;\n\n /** When true, the expandable content area is open. */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** When true, the row is checked. */\n @property({ type: Boolean, reflect: true }) checked = false;\n\n /** @internal — set by `sgds-data-table` to show a checkbox cell on this row. */\n @property({ type: Boolean }) showCheckbox = false;\n\n /** @internal — set by `sgds-data-table` when at least one sibling row is expandable. */\n @property({ type: Boolean }) showExpandPlaceholder = false;\n\n /** @internal — per-column alignment injected by `sgds-data-table` from header cells. */\n @property({ attribute: false }) columnAlignments: Array<\"left\" | \"right\"> = [];\n\n /** @internal — set by `sgds-data-table` to indicate whether body rows exist. */\n @property({ type: Boolean }) hasDataRows = false;\n\n /** @internal */\n @query(\".expandable-body\") private _expandableBody!: HTMLElement;\n\n /** @internal */\n @query(\"sgds-checkbox\") private _checkboxEl!: SgdsCheckbox;\n\n @state() private _isHeaderRow = false;\n private _cellSlotNames = new WeakMap<SgdsDataTableCell | SgdsDataTableHead, string>();\n private _lightDomObserver?: MutationObserver;\n\n /** The checkbox rendered inside this row, if `showCheckbox` is true. */\n get checkbox(): SgdsCheckbox | null {\n return this._checkboxEl ?? null;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._lightDomObserver = new MutationObserver(() => this._handleLightDomChange());\n this._lightDomObserver.observe(this, { childList: true });\n this._handleLightDomChange();\n }\n\n disconnectedCallback() {\n this._lightDomObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n firstUpdated() {\n if (this._expandableBody) {\n this._expandableBody.hidden = !this.open;\n }\n }\n\n @watch(\"open\", { waitUntilFirstUpdate: true })\n async handleExpandedChange() {\n if (this.open) {\n const sgdsShow = this.emit(\"sgds-show\", { cancelable: true });\n if (sgdsShow.defaultPrevented) {\n this.open = false;\n return;\n }\n await stopAnimations(this._expandableBody);\n this._expandableBody.hidden = false;\n const { keyframes, options } = getAnimation(this, \"row.expand.show\");\n await animateTo(\n this._expandableBody,\n shimKeyframesHeightAuto(keyframes, this._expandableBody.scrollHeight),\n options\n );\n this.emit(\"sgds-after-show\");\n } else {\n const sgdsHide = this.emit(\"sgds-hide\", { cancelable: true });\n if (sgdsHide.defaultPrevented) {\n this.open = true;\n return;\n }\n await stopAnimations(this._expandableBody);\n const { keyframes, options } = getAnimation(this, \"row.expand.hide\");\n await animateTo(\n this._expandableBody,\n shimKeyframesHeightAuto(keyframes, this._expandableBody.scrollHeight),\n options\n );\n this._expandableBody.hidden = true;\n this.emit(\"sgds-after-hide\");\n }\n }\n\n /** Opens the expandable content area. */\n public async show() {\n if (this.open) return;\n this.open = true;\n return waitForEvent(this, \"sgds-after-show\");\n }\n\n /** Closes the expandable content area. */\n public async hide() {\n if (!this.open) return;\n this.open = false;\n return waitForEvent(this, \"sgds-after-hide\");\n }\n\n /** @internal — returns visible text content for a body cell by visual column index. */\n public getCellText(columnIndex: number) {\n const cells = this._getCells().filter(cell => cell instanceof SgdsDataTableCell) as SgdsDataTableCell[];\n const cell = cells[columnIndex];\n if (!cell) return \"\";\n return (cell.textContent ?? \"\").trim();\n }\n\n private _getCells() {\n return Array.from(this.children).filter(\n child => child instanceof SgdsDataTableCell || child instanceof SgdsDataTableHead\n ) as Array<SgdsDataTableCell | SgdsDataTableHead>;\n }\n\n private _syncCellSlots(cells: Array<SgdsDataTableCell | SgdsDataTableHead>) {\n cells.forEach(cell => {\n const index = cells.indexOf(cell);\n const slotName = `cell-${index}`;\n this._cellSlotNames.set(cell, slotName);\n if (cell.getAttribute(\"slot\") !== slotName) {\n cell.setAttribute(\"slot\", slotName);\n }\n });\n }\n\n private _handleLightDomChange() {\n const cells = this._getCells();\n this._syncCellSlots(cells);\n this._isHeaderRow = cells.some(cell => cell instanceof SgdsDataTableHead);\n this.requestUpdate();\n }\n\n private _onCheckboxChange(e: CustomEvent) {\n this.emit(\"i-sgds-change\", { detail: { checked: (e.target as SgdsCheckbox).checked } });\n }\n\n private _toggleExpand() {\n this.open ? this.hide() : this.show();\n }\n\n private _onExpandKeyDown(e: KeyboardEvent) {\n if (e.key !== \"Enter\") return;\n e.preventDefault();\n this._toggleExpand();\n }\n\n private _onSortKeyDown(e: KeyboardEvent, header: SgdsDataTableHead) {\n if (e.key !== \"Enter\") return;\n e.preventDefault();\n header.handleSortClick();\n }\n\n private _renderCell(el: SgdsDataTableCell | SgdsDataTableHead, columnIndex: number) {\n const slotName = this._cellSlotNames.get(el);\n\n if (el instanceof SgdsDataTableHead) {\n return html`<th\n width=${ifDefined(el.width)}\n colspan=${ifDefined(el.colSpan)}\n rowspan=${ifDefined(el.rowSpan)}\n aria-sort=${ifDefined(el.sortDirection)}\n scope=\"col\"\n tabindex=${ifDefined(el.sorting ? \"0\" : undefined)}\n ?data-sorting=${el.sorting}\n @click=${el.sorting ? () => el.handleSortClick() : nothing}\n @keydown=${el.sorting ? (e: KeyboardEvent) => this._onSortKeyDown(e, el) : nothing}\n >\n <div class=\"data-table-head ${el.textAlign === \"right\" ? \"align-right\" : \"align-left\"}\">\n ${slotName ? html`<slot name=${slotName}></slot>` : nothing}\n ${el.sorting\n ? html`\n <button\n type=\"button\"\n class=\"sort-button ${el.sortDirection === \"none\" ? \"\" : \"active\"}\"\n aria-label=${el.sortDirection === \"descending\" ? \"Sort descending\" : \"Sort ascending\"}\n ?disabled=${!this.hasDataRows}\n >\n <sgds-icon\n class=\"sort-icon\"\n name=${el.sortDirection === \"descending\" ? \"sort-descending\" : \"sort-ascending\"}\n size=\"sm\"\n ></sgds-icon>\n </button>\n `\n : nothing}\n </div>\n </th>`;\n }\n\n const cellAlignment = this.columnAlignments[columnIndex] ?? \"left\";\n return html`<td colspan=${ifDefined(el.colSpan)} rowspan=${ifDefined(el.rowSpan)}>\n <div class=\"data-table-cell ${cellAlignment === \"right\" ? \"align-right\" : \"align-left\"}\">\n ${slotName ? html`<slot name=${slotName}></slot>` : nothing}\n </div>\n </td>`;\n }\n\n private _renderExpandCell() {\n if (this._isHeaderRow) {\n return html`<th class=\"control-cell\" scope=\"col\"><span class=\"visually-hidden\">Expand</span></th>`;\n }\n\n return html`<td class=\"control-cell\" @click=${this._toggleExpand} @keydown=${this._onExpandKeyDown} tabindex=\"0\">\n <div class=\"data-table-cell expand-cell\">\n <sgds-icon name=${this.open ? \"chevron-up\" : \"chevron-down\"} size=\"md\"></sgds-icon>\n </div>\n </td>`;\n }\n\n private _renderExpandPlaceholder() {\n return this._isHeaderRow\n ? html`<th class=\"control-cell\" scope=\"col\"><span class=\"visually-hidden\">Expand</span></th>`\n : html`<td class=\"control-cell\"></td>`;\n }\n\n private _renderCheckboxCell() {\n return this._isHeaderRow\n ? html`<th class=\"control-cell\" scope=\"col\">\n <div class=\"data-table-cell checkbox-cell\">\n <sgds-checkbox\n .checked=${this.checked}\n @sgds-change=${this._onCheckboxChange}\n .ariaLabel=${\"Select all rows\"}\n ></sgds-checkbox>\n </div>\n </th>`\n : html`<td class=\"control-cell\">\n <div class=\"data-table-cell checkbox-cell\">\n <sgds-checkbox\n .checked=${this.checked}\n @sgds-change=${this._onCheckboxChange}\n .ariaLabel=${\"Select row\"}\n ></sgds-checkbox>\n </div>\n </td>`;\n }\n\n render() {\n const cells = this._getCells();\n const totalCols = cells.length + (this.showCheckbox ? 1 : 0) + (this.expand || this.showExpandPlaceholder ? 1 : 0);\n const rowPart = this._isHeaderRow ? \"row row-header\" : \"row row-body\";\n\n return html`\n <tr part=${rowPart} ?data-header-row=${this._isHeaderRow} class=${this.open ? \"active\" : \"\"}>\n ${this.expand\n ? this._renderExpandCell()\n : this.showExpandPlaceholder\n ? this._renderExpandPlaceholder()\n : nothing}\n ${this.showCheckbox ? this._renderCheckboxCell() : nothing}\n ${(() => {\n let visualColumnIndex = 0;\n return cells.map(el => {\n const renderedCell = this._renderCell(el, visualColumnIndex);\n const span = Number(el.colSpan) > 0 ? Number(el.colSpan) : 1;\n visualColumnIndex += span;\n return renderedCell;\n });\n })()}\n </tr>\n\n ${this.expand\n ? html`\n <tr class=\"expandable-row\">\n <td colspan=${totalCols} class=\"expandable-td\">\n <div class=\"expandable-body\">\n <div class=\"expandable-content\">\n <slot name=\"content\"></slot>\n </div>\n </div>\n </td>\n </tr>\n `\n : nothing}\n `;\n }\n}\n\nsetDefaultAnimation(\"row.expand.show\", {\n keyframes: [\n { height: \"0\", opacity: \"0\" },\n { height: \"auto\", opacity: \"1\" }\n ],\n options: { duration: 250, easing: \"ease-in-out\" }\n});\n\nsetDefaultAnimation(\"row.expand.hide\", {\n keyframes: [\n { height: \"auto\", opacity: \"1\" },\n { height: \"0\", opacity: \"0\" }\n ],\n options: { duration: 250, easing: \"ease-in-out\" }\n});\n\nexport default SgdsDataTableRow;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,IAAa,mBAAb,cAAsC,YAAY;;;EAYK,KAAA,SAAA;EAGF,KAAA,OAAA;EAGG,KAAA,UAAA;EAGV,KAAA,eAAA;EAGS,KAAA,wBAAA;EAGuB,KAAA,mBAAA,CAAC;EAGlC,KAAA,cAAA;EAQX,KAAA,eAAA;EACP,KAAA,iCAAA,IAAI,QAAuD;;;EAtCpE,KAAA,SAAA,CAAC,GAAG,YAAY,QAAQA,QAAa;;;EAG/B,KAAA,eAAA;GACpB,iBAAiB;GACjB,wBAAwB;GACxB,wBAAwB;GACxB,aAAa;EACf;;;CAkCA,IAAI,WAAgC;EAClC,OAAO,KAAK,eAAe;CAC7B;CAEA,oBAAoB;EAClB,MAAM,kBAAkB;EACxB,KAAK,oBAAoB,IAAI,uBAAuB,KAAK,sBAAsB,CAAC;EAChF,KAAK,kBAAkB,QAAQ,MAAM,EAAE,WAAW,KAAK,CAAC;EACxD,KAAK,sBAAsB;CAC7B;CAEA,uBAAuB;EACrB,KAAK,mBAAmB,WAAW;EACnC,MAAM,qBAAqB;CAC7B;CAEA,eAAe;EACb,IAAI,KAAK,iBACP,KAAK,gBAAgB,SAAS,CAAC,KAAK;CAExC;CAEA,MACM,uBAAuB;EAC3B,IAAI,KAAK,MAAM;GAEb,IADiB,KAAK,KAAK,aAAa,EAAE,YAAY,KAAK,CAChD,CAAC,CAAC,kBAAkB;IAC7B,KAAK,OAAO;IACZ;GACF;GACA,MAAM,eAAe,KAAK,eAAe;GACzC,KAAK,gBAAgB,SAAS;GAC9B,MAAM,EAAE,WAAW,YAAY,aAAa,MAAM,iBAAiB;GACnE,MAAM,UACJ,KAAK,iBACL,wBAAwB,WAAW,KAAK,gBAAgB,YAAY,GACpE,OACF;GACA,KAAK,KAAK,iBAAiB;EAC7B,OAAO;GAEL,IADiB,KAAK,KAAK,aAAa,EAAE,YAAY,KAAK,CAChD,CAAC,CAAC,kBAAkB;IAC7B,KAAK,OAAO;IACZ;GACF;GACA,MAAM,eAAe,KAAK,eAAe;GACzC,MAAM,EAAE,WAAW,YAAY,aAAa,MAAM,iBAAiB;GACnE,MAAM,UACJ,KAAK,iBACL,wBAAwB,WAAW,KAAK,gBAAgB,YAAY,GACpE,OACF;GACA,KAAK,gBAAgB,SAAS;GAC9B,KAAK,KAAK,iBAAiB;EAC7B;CACF;;CAGA,MAAa,OAAO;EAClB,IAAI,KAAK,MAAM;EACf,KAAK,OAAO;EACZ,OAAO,aAAa,MAAM,iBAAiB;CAC7C;;CAGA,MAAa,OAAO;EAClB,IAAI,CAAC,KAAK,MAAM;EAChB,KAAK,OAAO;EACZ,OAAO,aAAa,MAAM,iBAAiB;CAC7C;;CAGA,YAAmB,aAAqB;EAEtC,MAAM,OADQ,KAAK,UAAU,CAAC,CAAC,QAAO,SAAQ,gBAAgB,iBAC7C,CAAC,CAAC;EACnB,IAAI,CAAC,MAAM,OAAO;EAClB,QAAQ,KAAK,eAAe,GAAA,CAAI,KAAK;CACvC;CAEA,YAAoB;EAClB,OAAO,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,QAC/B,UAAS,iBAAiB,qBAAqB,iBAAiB,iBAClE;CACF;CAEA,eAAuB,OAAqD;EAC1E,MAAM,SAAQ,SAAQ;GAEpB,MAAM,WAAW,QADH,MAAM,QAAQ,IACC;GAC7B,KAAK,eAAe,IAAI,MAAM,QAAQ;GACtC,IAAI,KAAK,aAAa,MAAM,MAAM,UAChC,KAAK,aAAa,QAAQ,QAAQ;EAEtC,CAAC;CACH;CAEA,wBAAgC;EAC9B,MAAM,QAAQ,KAAK,UAAU;EAC7B,KAAK,eAAe,KAAK;EACzB,KAAK,eAAe,MAAM,MAAK,SAAQ,gBAAgB,iBAAiB;EACxE,KAAK,cAAc;CACrB;CAEA,kBAA0B,GAAgB;EACxC,KAAK,KAAK,iBAAiB,EAAE,QAAQ,EAAE,SAAU,EAAE,OAAwB,QAAQ,EAAE,CAAC;CACxF;CAEA,gBAAwB;EACtB,KAAK,OAAO,KAAK,KAAK,IAAI,KAAK,KAAK;CACtC;CAEA,iBAAyB,GAAkB;EACzC,IAAI,EAAE,QAAQ,SAAS;EACvB,EAAE,eAAe;EACjB,KAAK,cAAc;CACrB;CAEA,eAAuB,GAAkB,QAA2B;EAClE,IAAI,EAAE,QAAQ,SAAS;EACvB,EAAE,eAAe;EACjB,OAAO,gBAAgB;CACzB;CAEA,YAAoB,IAA2C,aAAqB;EAClF,MAAM,WAAW,KAAK,eAAe,IAAI,EAAE;EAE3C,IAAI,cAAc,mBAChB,OAAO,IAAI;gBACD,UAAU,GAAG,KAAK,EAAE;kBAClB,UAAU,GAAG,OAAO,EAAE;kBACtB,UAAU,GAAG,OAAO,EAAE;oBACpB,UAAU,GAAG,aAAa,EAAE;;mBAE7B,UAAU,GAAG,UAAU,MAAM,KAAA,CAAS,EAAE;wBACnC,GAAG,QAAQ;iBAClB,GAAG,gBAAgB,GAAG,gBAAgB,IAAI,QAAQ;mBAChD,GAAG,WAAW,MAAqB,KAAK,eAAe,GAAG,EAAE,IAAI,QAAQ;;sCAErD,GAAG,cAAc,UAAU,gBAAgB,aAAa;YAClF,WAAW,IAAI,cAAc,SAAS,YAAY,QAAQ;YAC1D,GAAG,UACD,IAAI;;;uCAGqB,GAAG,kBAAkB,SAAS,KAAK,SAAS;+BACpD,GAAG,kBAAkB,eAAe,oBAAoB,iBAAiB;8BAC1E,CAAC,KAAK,YAAY;;;;2BAIrB,GAAG,kBAAkB,eAAe,oBAAoB,iBAAiB;;;;kBAKtF,QAAQ;;;EAKlB,MAAM,gBAAgB,KAAK,iBAAiB,gBAAgB;EAC5D,OAAO,IAAI,eAAe,UAAU,GAAG,OAAO,EAAE,WAAW,UAAU,GAAG,OAAO,EAAE;oCACjD,kBAAkB,UAAU,gBAAgB,aAAa;UACnF,WAAW,IAAI,cAAc,SAAS,YAAY,QAAQ;;;CAGlE;CAEA,oBAA4B;EAC1B,IAAI,KAAK,cACP,OAAO,IAAI;EAGb,OAAO,IAAI,mCAAmC,KAAK,cAAc,YAAY,KAAK,iBAAiB;;0BAE7E,KAAK,OAAO,eAAe,eAAe;;;CAGlE;CAEA,2BAAmC;EACjC,OAAO,KAAK,eACR,IAAI,0FACJ,IAAI;CACV;CAEA,sBAA8B;EAC5B,OAAO,KAAK,eACR,IAAI;;;yBAGa,KAAK,QAAQ;6BACT,KAAK,kBAAkB;2BACzB,kBAAkB;;;iBAIrC,IAAI;;;yBAGa,KAAK,QAAQ;6BACT,KAAK,kBAAkB;2BACzB,aAAa;;;;CAItC;CAEA,SAAS;EACP,MAAM,QAAQ,KAAK,UAAU;EAC7B,MAAM,YAAY,MAAM,UAAU,KAAK,eAAe,IAAI,MAAM,KAAK,UAAU,KAAK,wBAAwB,IAAI;EAChH,MAAM,UAAU,KAAK,eAAe,mBAAmB;EAEvD,OAAO,IAAI;iBACE,QAAQ,oBAAoB,KAAK,aAAa,SAAS,KAAK,OAAO,WAAW,GAAG;UACxF,KAAK,SACH,KAAK,kBAAkB,IACvB,KAAK,wBACL,KAAK,yBAAyB,IAC9B,QAAQ;UACV,KAAK,eAAe,KAAK,oBAAoB,IAAI,QAAQ;iBAClD;GACP,IAAI,oBAAoB;GACxB,OAAO,MAAM,KAAI,OAAM;IACrB,MAAM,eAAe,KAAK,YAAY,IAAI,iBAAiB;IAC3D,MAAM,OAAO,OAAO,GAAG,OAAO,IAAI,IAAI,OAAO,GAAG,OAAO,IAAI;IAC3D,qBAAqB;IACrB,OAAO;GACT,CAAC;EACH,EAAA,CAAG,EAAE;;;QAGL,KAAK,SACH,IAAI;;4BAEc,UAAU;;;;;;;;cAS5B,QAAQ;;CAEhB;AACF;AAtRG,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,iBAAA,WAAA,UAAA,KAAA,CAAA;AAGzC,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,iBAAA,WAAA,QAAA,KAAA,CAAA;AAGzC,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,iBAAA,WAAA,WAAA,KAAA,CAAA;AAGzC,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,iBAAA,WAAA,gBAAA,KAAA,CAAA;AAG1B,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,iBAAA,WAAA,yBAAA,KAAA,CAAA;AAG1B,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,iBAAA,WAAA,oBAAA,KAAA,CAAA;AAG7B,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,iBAAA,WAAA,eAAA,KAAA,CAAA;AAG1B,WAAA,CAAA,MAAM,kBAAkB,CAAA,GAAA,iBAAA,WAAA,mBAAA,KAAA,CAAA;AAGxB,WAAA,CAAA,MAAM,eAAe,CAAA,GAAA,iBAAA,WAAA,eAAA,KAAA,CAAA;AAErB,WAAA,CAAA,MAAM,CAAA,GAAA,iBAAA,WAAA,gBAAA,KAAA,CAAA;AA2BN,WAAA,CAAA,MAAM,QAAQ,EAAE,sBAAsB,KAAK,CAAC,CAAA,GAAA,iBAAA,WAAA,wBAAA,IAAA;AAmO/C,oBAAoB,mBAAmB;CACrC,WAAW,CACT;EAAE,QAAQ;EAAK,SAAS;CAAI,GAC5B;EAAE,QAAQ;EAAQ,SAAS;CAAI,CACjC;CACA,SAAS;EAAE,UAAU;EAAK,QAAQ;CAAc;AAClD,CAAC;AAED,oBAAoB,mBAAmB;CACrC,WAAW,CACT;EAAE,QAAQ;EAAQ,SAAS;CAAI,GAC/B;EAAE,QAAQ;EAAK,SAAS;CAAI,CAC9B;CACA,SAAS;EAAE,UAAU;EAAK,QAAQ;CAAc;AAClD,CAAC"}
@@ -62,7 +62,6 @@ var SgdsDataTable = class extends require_sgds_element.default {
62
62
  }
63
63
  connectedCallback() {
64
64
  super.connectedCallback();
65
- this.setAttribute("role", "table");
66
65
  }
67
66
  _isRowChecked(row) {
68
67
  return row.checked || row.checkbox?.checked === true;
@@ -321,7 +320,7 @@ var SgdsDataTable = class extends require_sgds_element.default {
321
320
  return lit.html`
322
321
  <div class="data-table">
323
322
  <div class="table-container">
324
- <div class="table">
323
+ <div class="table" role="table">
325
324
  <slot @slotchange=${this._handleSlotChange} @i-sgds-sort=${this._handleSort}></slot>
326
325
  ${this.loading ? this._renderLoadingSkeleton() : lit.nothing}
327
326
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-data-table.cjs.js","names":["SgdsElement","tableStyle","SgdsPagination","SgdsDataTableCell","SgdsDataTableHead","SgdsSkeleton","SgdsDataTableRow","nothing","property","state"],"sources":["../../../../src/components/DataTable/sgds-data-table.ts"],"sourcesContent":["import { css, html, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport tableStyle from \"./data-table.css\";\nimport SgdsPagination from \"../Pagination/sgds-pagination\";\nimport type { ISgdsPaginationPageChangeEventDetail } from \"../Pagination/sgds-pagination\";\nimport SgdsDataTableRow from \"./sgds-data-table-row\";\nimport SgdsDataTableCell from \"./sgds-data-table-cell\";\nimport SgdsDataTableHead from \"./sgds-data-table-head\";\nimport SgdsSkeleton from \"../Skeleton/sgds-skeleton\";\nimport type { ISgdsDataTableRowSelectEventDetail, ISgdsDataTableSortEventDetail } from \"./types\";\nexport type { ISgdsDataTableRowSelectEventDetail, ISgdsDataTableSortEventDetail };\n\n/**\n * @summary A data table container with pagination, row selection, loading, and sorting support.\n *\n * @slot default - Insert one or more `sgds-data-table-row` elements.\n * @slot no-data - Custom content rendered when no body rows are available and `loading` is false.\n *\n * @event sgds-row-select - Emitted when row checkboxes change. Detail: `{ selected: Record<string, string>[] }`.\n * @event sgds-sort - Emitted when `serverSort` is true and a sorting column header is clicked.\n * Detail: `{ key: string; direction: \"ascending\" | \"descending\" | \"none\" }`.\n * @event sgds-page-change - Emitted when pagination changes page.\n */\nexport class SgdsDataTable extends SgdsElement {\n static styles = [\n ...SgdsElement.styles,\n tableStyle,\n css`\n :host {\n display: block;\n }\n `\n ];\n\n /** @internal */\n static dependencies = {\n \"sgds-pagination\": SgdsPagination,\n \"sgds-data-table-cell\": SgdsDataTableCell,\n \"sgds-data-table-head\": SgdsDataTableHead,\n \"sgds-skeleton\": SgdsSkeleton\n };\n\n /** If true, renders a checkbox column for row selection. */\n @property({ type: Boolean }) multiSelect = false;\n\n /** Total number of data items (for server-side pagination). */\n @property({ type: Number }) dataLength = 0;\n\n /** Current page (1-based). */\n @property({ type: Number }) currentPage = 1;\n\n /** Number of rows per page. */\n @property({ type: Number }) itemsPerPage = 5;\n\n /** Custom text shown on the footer's left side. */\n @property({ type: String }) paginationSummary = \"\";\n\n /** When true, shows a loading state and hides body rows. */\n @property({ type: Boolean }) loading = false;\n\n /** When true, emits sort events for external handling instead of local sorting. */\n @property({ type: Boolean }) serverSort = false;\n\n /** Variant forwarded to the internal pagination component. */\n @property({ type: String }) paginationVariant: \"default\" | \"number\" | \"button\" | \"description\" = \"default\";\n\n /**\n * Controls the CSS `table-layout` algorithm.\n * Use \"auto\" to let the browser size columns based on content, or \"fixed\" to distribute column widths evenly regardless of content.\n * @type {\"auto\" | \"fixed\"}\n * @default \"auto\"\n */\n @property({ type: String, reflect: true }) layout: \"auto\" | \"fixed\" = \"auto\";\n\n /**\n * Pagination mode. `client` (default) slices rows and renders pagination controls.\n * `server` renders all slotted rows as-is — the caller is responsible for passing\n * the correct page of data and handling `sgds-page-change` externally.\n */\n @property({ type: String }) mode: \"client\" | \"server\" = \"client\";\n\n @state() private tableRows: SgdsDataTableRow[] = [];\n @state() private headerRows: SgdsDataTableRow[] = [];\n\n private _headerCells: SgdsDataTableHead[] = [];\n private _initialRowPositions = new WeakMap<SgdsDataTableRow, number>();\n private _hasCapturedInitialRowPositions = false;\n\n private _rowHandlers = new WeakMap<SgdsDataTableRow, EventListener>();\n\n connectedCallback() {\n super.connectedCallback();\n this.setAttribute(\"role\", \"table\");\n }\n\n private _isRowChecked(row: SgdsDataTableRow) {\n return row.checked || row.checkbox?.checked === true;\n }\n\n private _updateHeaderCheckbox() {\n const checkedCount = this.tableRows.filter(r => this._isRowChecked(r)).length;\n\n const allChecked = checkedCount === this.tableRows.length && checkedCount > 0;\n\n this.headerRows.forEach(r => {\n r.checked = allChecked;\n if (r.checkbox) {\n r.checkbox.checked = allChecked;\n r.checkbox.indeterminate = checkedCount > 0 && !allChecked;\n }\n });\n }\n\n private async _syncHeaderCheckboxAfterRender() {\n if (!this.multiSelect || this.headerRows.length === 0) return;\n\n const rows = [...this.headerRows, ...this.tableRows];\n await Promise.all(rows.map(row => row.updateComplete));\n this._updateHeaderCheckbox();\n }\n\n private _emitRowSelect() {\n const selected = this.tableRows.filter(r => this._isRowChecked(r)).map(r => this._getRowData(r));\n this.emit(\"sgds-row-select\", { detail: { selected } });\n }\n\n private _attachRowListener(row: SgdsDataTableRow) {\n const old = this._rowHandlers.get(row);\n if (old) row.removeEventListener(\"i-sgds-change\", old);\n\n const handler: EventListener = (e: Event) => {\n const { checked } = (e as CustomEvent<{ checked: boolean }>).detail;\n\n if (this.headerRows.includes(row)) {\n this.tableRows.forEach(r => {\n r.checked = checked;\n if (r.checkbox) r.checkbox.checked = checked;\n });\n } else {\n row.checked = checked;\n this._updateHeaderCheckbox();\n }\n this._emitRowSelect();\n };\n\n this._rowHandlers.set(row, handler);\n row.addEventListener(\"i-sgds-change\", handler);\n }\n\n private _configureRows() {\n const hasExpand = this.tableRows.some(r => r.expand);\n const hasDataRows = this.tableRows.length > 0;\n\n this.headerRows.forEach(row => {\n row.showCheckbox = this.multiSelect;\n row.showExpandPlaceholder = hasExpand;\n row.hasDataRows = hasDataRows;\n if (this.multiSelect) this._attachRowListener(row);\n });\n\n this.tableRows.forEach(row => {\n row.showCheckbox = this.multiSelect;\n row.showExpandPlaceholder = !row.expand && hasExpand;\n if (this.multiSelect) this._attachRowListener(row);\n });\n\n if (this.multiSelect) {\n this._syncHeaderCheckboxAfterRender();\n }\n\n this._applyColumnAlignment();\n }\n\n private _applyColumnAlignment() {\n const headerAlignments = this._headerCells.reduce<Array<\"left\" | \"right\">>((acc, header) => {\n const span = Number(header.colSpan) > 0 ? Number(header.colSpan) : 1;\n const alignment = header.textAlign ?? \"left\";\n for (let i = 0; i < span; i++) {\n acc.push(alignment);\n }\n return acc;\n }, []);\n\n this.headerRows.forEach(row => {\n row.columnAlignments = [...headerAlignments];\n });\n\n this.tableRows.forEach(row => {\n row.columnAlignments = [...headerAlignments];\n });\n }\n\n private _extractCellText(row: SgdsDataTableRow, columnIndex: number) {\n const rowCellText = row.getCellText(columnIndex);\n if (rowCellText) return rowCellText;\n\n const cells = Array.from(row.children).filter(child => child.tagName.toLowerCase() === \"sgds-data-table-cell\");\n const cell = cells[columnIndex];\n return (cell?.textContent || \"\").trim();\n }\n\n private _getRowData(row: SgdsDataTableRow): Record<string, string> {\n const data: Record<string, string> = {};\n this._headerCells.forEach((header, index) => {\n const key = header.sortKey || (header.textContent ?? \"\").trim() || `col-${index}`;\n data[key] = this._extractCellText(row, index);\n });\n return data;\n }\n\n private _toComparableValue(row: SgdsDataTableRow, _key: string, columnIndex: number) {\n return this._extractCellText(row, columnIndex);\n }\n\n private _compareValues(left: unknown, right: unknown, direction: \"ascending\" | \"descending\") {\n if (left === right) return 0;\n\n const leftNumber = Number(left);\n const rightNumber = Number(right);\n const bothNumeric = Number.isFinite(leftNumber) && Number.isFinite(rightNumber);\n\n if (bothNumeric) {\n return direction === \"ascending\" ? leftNumber - rightNumber : rightNumber - leftNumber;\n }\n\n const cmp = String(left).localeCompare(String(right), undefined, { numeric: true, sensitivity: \"base\" });\n return direction === \"ascending\" ? cmp : -cmp;\n }\n\n private _resetOtherHeaderSortStates(activeHeader: SgdsDataTableHead | null) {\n this._headerCells.forEach(header => {\n if (header !== activeHeader && header.sorting) {\n header.sortDirection = \"none\";\n }\n });\n }\n\n private _getRowsInInitialPositionOrder(rows: SgdsDataTableRow[]) {\n return [...rows].sort((left, right) => {\n const leftPosition = this._initialRowPositions.get(left);\n const rightPosition = this._initialRowPositions.get(right);\n\n if (leftPosition === undefined && rightPosition === undefined) return 0;\n if (leftPosition === undefined) return 1;\n if (rightPosition === undefined) return -1;\n return leftPosition - rightPosition;\n });\n }\n\n private _captureInitialRowPositions(rows: SgdsDataTableRow[]) {\n if (this._hasCapturedInitialRowPositions) return;\n\n rows.forEach((row, index) => {\n this._initialRowPositions.set(row, index);\n });\n\n this._hasCapturedInitialRowPositions = true;\n }\n\n private _handleSort(e: Event) {\n const activeHeader = e.composedPath().find(node => node instanceof SgdsDataTableHead) as\n | SgdsDataTableHead\n | undefined;\n\n if (!activeHeader || !activeHeader.sorting) return;\n\n const { key, direction } = (e as CustomEvent<ISgdsDataTableSortEventDetail>).detail;\n const columnIndex = activeHeader ? this._headerCells.indexOf(activeHeader) : -1;\n\n this._resetOtherHeaderSortStates(activeHeader);\n\n if (this.serverSort) {\n e.stopPropagation();\n this.emit(\"sgds-sort\", { detail: { key, direction } });\n return;\n }\n\n if (columnIndex < 0) return;\n\n if (direction === \"none\") {\n this.tableRows = this._getRowsInInitialPositionOrder(this.tableRows);\n this._syncDomRowOrder();\n this._updateVisibleRows();\n return;\n }\n\n if (this.mode === \"client\") {\n const start = (this.currentPage - 1) * this.itemsPerPage;\n const end = start + this.itemsPerPage;\n const nextRows = [...this.tableRows];\n\n const sortedVisibleRows = nextRows.slice(start, end).sort((left, right) => {\n const leftValue = this._toComparableValue(left, key, columnIndex);\n const rightValue = this._toComparableValue(right, key, columnIndex);\n return this._compareValues(leftValue, rightValue, direction);\n });\n nextRows.splice(start, sortedVisibleRows.length, ...sortedVisibleRows);\n\n this.tableRows = nextRows;\n this._syncDomRowOrder();\n this._updateVisibleRows();\n return;\n }\n\n this.tableRows = [...this.tableRows].sort((left, right) => {\n const leftValue = this._toComparableValue(left, key, columnIndex);\n const rightValue = this._toComparableValue(right, key, columnIndex);\n return this._compareValues(leftValue, rightValue, direction);\n });\n\n this._syncDomRowOrder();\n this._updateVisibleRows();\n }\n\n private _syncDomRowOrder() {\n const parent = this.tableRows[0]?.parentElement;\n if (!parent) return;\n this.tableRows.forEach(row => parent.appendChild(row));\n }\n\n private _handleSlotChange(e: Event) {\n const slotted = (e.target as HTMLSlotElement)\n .assignedElements({ flatten: true })\n .filter(el => el instanceof SgdsDataTableRow) as SgdsDataTableRow[];\n\n const rowTableChildren = (row: SgdsDataTableRow) =>\n Array.from(row.children).filter(child => {\n const tagName = child.tagName.toLowerCase();\n const isTableCell = tagName === \"sgds-data-table-cell\" || tagName === \"sgds-data-table-head\";\n if (!isTableCell) return false;\n return child.getAttribute(\"slot\") !== \"content\";\n });\n\n this.headerRows = slotted.filter(row =>\n rowTableChildren(row).some(child => child.tagName.toLowerCase() === \"sgds-data-table-head\")\n );\n\n this.tableRows = slotted.filter(row => {\n const children = rowTableChildren(row);\n return children.length > 0 && children.every(child => child.tagName.toLowerCase() === \"sgds-data-table-cell\");\n });\n\n this._headerCells = this.headerRows.reduce<SgdsDataTableHead[]>((acc, row) => {\n const headers = Array.from(row.children).filter(\n child => child instanceof SgdsDataTableHead\n ) as SgdsDataTableHead[];\n acc.push(...headers);\n return acc;\n }, []);\n\n this._captureInitialRowPositions(this.tableRows);\n\n this._headerCells.forEach(header => {\n if (header.sorting && !header.sortDirection) {\n header.sortDirection = \"none\";\n }\n });\n\n this._configureRows();\n this._updateVisibleRows();\n }\n\n private _updateVisibleRows() {\n if (this.loading) {\n this.tableRows.forEach(row => (row.style.display = \"none\"));\n return;\n }\n\n if (this.mode === \"server\") {\n this.tableRows.forEach(row => (row.style.display = \"\"));\n return;\n }\n\n const total = this.dataLength || this.tableRows.length;\n const lastPage = Math.max(1, Math.ceil(total / this.itemsPerPage));\n if (this.currentPage > lastPage) {\n this.currentPage = lastPage;\n return;\n }\n const start = (this.currentPage - 1) * this.itemsPerPage;\n const visible = new Set(this.tableRows.slice(start, start + this.itemsPerPage));\n this.tableRows.forEach(row => (row.style.display = visible.has(row) ? \"\" : \"none\"));\n }\n\n private _getSkeletonColumnCount(): { dataColumns: number; hasExpand: boolean; hasCheckbox: boolean } {\n const headerColumnCount = this._headerCells.reduce((count, header) => {\n const span = Number(header.colSpan) > 0 ? Number(header.colSpan) : 1;\n return count + span;\n }, 0);\n\n const firstBodyRow = this.tableRows[0];\n const fallbackBodyColumnCount = firstBodyRow\n ? Array.from(firstBodyRow.children).filter(child => child instanceof SgdsDataTableCell).length\n : 0;\n\n const hasExpand = this.tableRows.some(row => row.expand);\n const dataColumns = headerColumnCount || fallbackBodyColumnCount || 1;\n\n return { dataColumns, hasExpand, hasCheckbox: this.multiSelect };\n }\n\n private _renderLoadingSkeleton() {\n const { dataColumns, hasExpand, hasCheckbox } = this._getSkeletonColumnCount();\n const skeletonRows = Math.max(1, this.itemsPerPage || 1);\n\n return Array.from(\n { length: skeletonRows },\n () =>\n html`<div class=\"skeleton-row\" role=\"presentation\">\n ${hasExpand\n ? html`<div class=\"skeleton-cell control-cell\">\n <sgds-skeleton .height=${\"20px\"} .width=${\"20px\"} .borderRadius=${\"4px\"}></sgds-skeleton>\n </div>`\n : nothing}\n ${hasCheckbox\n ? html`<div class=\"skeleton-cell control-cell\">\n <sgds-skeleton .height=${\"24px\"} .width=${\"24px\"} .borderRadius=${\"4px\"}></sgds-skeleton>\n </div>`\n : nothing}\n ${Array.from(\n { length: dataColumns },\n () =>\n html`<div class=\"skeleton-cell\">\n <sgds-skeleton .height=${\"100%\"} .borderRadius=${\"4px\"}></sgds-skeleton>\n </div>`\n )}\n </div>`\n );\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has(\"currentPage\") || changed.has(\"itemsPerPage\") || changed.has(\"mode\") || changed.has(\"loading\")) {\n this._updateVisibleRows();\n }\n if (changed.has(\"multiSelect\")) {\n this._configureRows();\n }\n\n if (this.multiSelect && (changed.has(\"tableRows\") || changed.has(\"headerRows\"))) {\n this._syncHeaderCheckboxAfterRender();\n }\n }\n\n render() {\n const total = this.dataLength || this.tableRows.length;\n const start = (this.currentPage - 1) * this.itemsPerPage;\n const end = Math.min(start + this.itemsPerPage, total);\n const displayStart = total === 0 ? 0 : start + 1;\n const showNoData = !this.loading && this.tableRows.length === 0;\n const showFooter = total !== 0;\n\n return html`\n <div class=\"data-table\">\n <div class=\"table-container\">\n <div class=\"table\">\n <slot @slotchange=${this._handleSlotChange} @i-sgds-sort=${this._handleSort}></slot>\n ${this.loading ? this._renderLoadingSkeleton() : nothing}\n </div>\n ${!this.loading && showNoData\n ? html`<slot name=\"no-data\" class=\"no-data\" role=\"status\" aria-live=\"polite\">No data</slot>`\n : nothing}\n </div>\n\n ${showFooter\n ? html`<div class=\"footer\">\n ${this.loading\n ? html`<span></span>`\n : this.paginationSummary || html`<span>Showing ${displayStart} to ${end} of ${total} results</span>`}\n <sgds-pagination\n .dataLength=${total}\n .currentPage=${this.currentPage}\n .itemsPerPage=${this.itemsPerPage}\n .variant=${this.paginationVariant}\n size=\"sm\"\n @sgds-page-change=${(e: CustomEvent<ISgdsPaginationPageChangeEventDetail>) => {\n this.currentPage = e.detail.currentPage;\n this.emit(\"sgds-page-change\");\n }}\n ></sgds-pagination>\n </div>`\n : nothing}\n </div>\n `;\n }\n}\n\nexport default SgdsDataTable;\n"],"mappings":"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"}
1
+ {"version":3,"file":"sgds-data-table.cjs.js","names":["SgdsElement","tableStyle","SgdsPagination","SgdsDataTableCell","SgdsDataTableHead","SgdsSkeleton","SgdsDataTableRow","nothing","property","state"],"sources":["../../../../src/components/DataTable/sgds-data-table.ts"],"sourcesContent":["import { css, html, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport tableStyle from \"./data-table.css\";\nimport SgdsPagination from \"../Pagination/sgds-pagination\";\nimport type { ISgdsPaginationPageChangeEventDetail } from \"../Pagination/sgds-pagination\";\nimport SgdsDataTableRow from \"./sgds-data-table-row\";\nimport SgdsDataTableCell from \"./sgds-data-table-cell\";\nimport SgdsDataTableHead from \"./sgds-data-table-head\";\nimport SgdsSkeleton from \"../Skeleton/sgds-skeleton\";\nimport type { ISgdsDataTableRowSelectEventDetail, ISgdsDataTableSortEventDetail } from \"./types\";\nexport type { ISgdsDataTableRowSelectEventDetail, ISgdsDataTableSortEventDetail };\n\n/**\n * @summary A data table container with pagination, row selection, loading, and sorting support.\n *\n * @slot default - Insert one or more `sgds-data-table-row` elements.\n * @slot no-data - Custom content rendered when no body rows are available and `loading` is false.\n *\n * @event sgds-row-select - Emitted when row checkboxes change. Detail: `{ selected: Record<string, string>[] }`.\n * @event sgds-sort - Emitted when `serverSort` is true and a sorting column header is clicked.\n * Detail: `{ key: string; direction: \"ascending\" | \"descending\" | \"none\" }`.\n * @event sgds-page-change - Emitted when pagination changes page.\n */\nexport class SgdsDataTable extends SgdsElement {\n static styles = [\n ...SgdsElement.styles,\n tableStyle,\n css`\n :host {\n display: block;\n }\n `\n ];\n\n /** @internal */\n static dependencies = {\n \"sgds-pagination\": SgdsPagination,\n \"sgds-data-table-cell\": SgdsDataTableCell,\n \"sgds-data-table-head\": SgdsDataTableHead,\n \"sgds-skeleton\": SgdsSkeleton\n };\n\n /** If true, renders a checkbox column for row selection. */\n @property({ type: Boolean }) multiSelect = false;\n\n /** Total number of data items (for server-side pagination). */\n @property({ type: Number }) dataLength = 0;\n\n /** Current page (1-based). */\n @property({ type: Number }) currentPage = 1;\n\n /** Number of rows per page. */\n @property({ type: Number }) itemsPerPage = 5;\n\n /** Custom text shown on the footer's left side. */\n @property({ type: String }) paginationSummary = \"\";\n\n /** When true, shows a loading state and hides body rows. */\n @property({ type: Boolean }) loading = false;\n\n /** When true, emits sort events for external handling instead of local sorting. */\n @property({ type: Boolean }) serverSort = false;\n\n /** Variant forwarded to the internal pagination component. */\n @property({ type: String }) paginationVariant: \"default\" | \"number\" | \"button\" | \"description\" = \"default\";\n\n /**\n * Controls the CSS `table-layout` algorithm.\n * Use \"auto\" to let the browser size columns based on content, or \"fixed\" to distribute column widths evenly regardless of content.\n * @type {\"auto\" | \"fixed\"}\n * @default \"auto\"\n */\n @property({ type: String, reflect: true }) layout: \"auto\" | \"fixed\" = \"auto\";\n\n /**\n * Pagination mode. `client` (default) slices rows and renders pagination controls.\n * `server` renders all slotted rows as-is — the caller is responsible for passing\n * the correct page of data and handling `sgds-page-change` externally.\n */\n @property({ type: String }) mode: \"client\" | \"server\" = \"client\";\n\n @state() private tableRows: SgdsDataTableRow[] = [];\n @state() private headerRows: SgdsDataTableRow[] = [];\n\n private _headerCells: SgdsDataTableHead[] = [];\n private _initialRowPositions = new WeakMap<SgdsDataTableRow, number>();\n private _hasCapturedInitialRowPositions = false;\n\n private _rowHandlers = new WeakMap<SgdsDataTableRow, EventListener>();\n\n connectedCallback() {\n super.connectedCallback();\n }\n\n private _isRowChecked(row: SgdsDataTableRow) {\n return row.checked || row.checkbox?.checked === true;\n }\n\n private _updateHeaderCheckbox() {\n const checkedCount = this.tableRows.filter(r => this._isRowChecked(r)).length;\n\n const allChecked = checkedCount === this.tableRows.length && checkedCount > 0;\n\n this.headerRows.forEach(r => {\n r.checked = allChecked;\n if (r.checkbox) {\n r.checkbox.checked = allChecked;\n r.checkbox.indeterminate = checkedCount > 0 && !allChecked;\n }\n });\n }\n\n private async _syncHeaderCheckboxAfterRender() {\n if (!this.multiSelect || this.headerRows.length === 0) return;\n\n const rows = [...this.headerRows, ...this.tableRows];\n await Promise.all(rows.map(row => row.updateComplete));\n this._updateHeaderCheckbox();\n }\n\n private _emitRowSelect() {\n const selected = this.tableRows.filter(r => this._isRowChecked(r)).map(r => this._getRowData(r));\n this.emit(\"sgds-row-select\", { detail: { selected } });\n }\n\n private _attachRowListener(row: SgdsDataTableRow) {\n const old = this._rowHandlers.get(row);\n if (old) row.removeEventListener(\"i-sgds-change\", old);\n\n const handler: EventListener = (e: Event) => {\n const { checked } = (e as CustomEvent<{ checked: boolean }>).detail;\n\n if (this.headerRows.includes(row)) {\n this.tableRows.forEach(r => {\n r.checked = checked;\n if (r.checkbox) r.checkbox.checked = checked;\n });\n } else {\n row.checked = checked;\n this._updateHeaderCheckbox();\n }\n this._emitRowSelect();\n };\n\n this._rowHandlers.set(row, handler);\n row.addEventListener(\"i-sgds-change\", handler);\n }\n\n private _configureRows() {\n const hasExpand = this.tableRows.some(r => r.expand);\n const hasDataRows = this.tableRows.length > 0;\n\n this.headerRows.forEach(row => {\n row.showCheckbox = this.multiSelect;\n row.showExpandPlaceholder = hasExpand;\n row.hasDataRows = hasDataRows;\n if (this.multiSelect) this._attachRowListener(row);\n });\n\n this.tableRows.forEach(row => {\n row.showCheckbox = this.multiSelect;\n row.showExpandPlaceholder = !row.expand && hasExpand;\n if (this.multiSelect) this._attachRowListener(row);\n });\n\n if (this.multiSelect) {\n this._syncHeaderCheckboxAfterRender();\n }\n\n this._applyColumnAlignment();\n }\n\n private _applyColumnAlignment() {\n const headerAlignments = this._headerCells.reduce<Array<\"left\" | \"right\">>((acc, header) => {\n const span = Number(header.colSpan) > 0 ? Number(header.colSpan) : 1;\n const alignment = header.textAlign ?? \"left\";\n for (let i = 0; i < span; i++) {\n acc.push(alignment);\n }\n return acc;\n }, []);\n\n this.headerRows.forEach(row => {\n row.columnAlignments = [...headerAlignments];\n });\n\n this.tableRows.forEach(row => {\n row.columnAlignments = [...headerAlignments];\n });\n }\n\n private _extractCellText(row: SgdsDataTableRow, columnIndex: number) {\n const rowCellText = row.getCellText(columnIndex);\n if (rowCellText) return rowCellText;\n\n const cells = Array.from(row.children).filter(child => child.tagName.toLowerCase() === \"sgds-data-table-cell\");\n const cell = cells[columnIndex];\n return (cell?.textContent || \"\").trim();\n }\n\n private _getRowData(row: SgdsDataTableRow): Record<string, string> {\n const data: Record<string, string> = {};\n this._headerCells.forEach((header, index) => {\n const key = header.sortKey || (header.textContent ?? \"\").trim() || `col-${index}`;\n data[key] = this._extractCellText(row, index);\n });\n return data;\n }\n\n private _toComparableValue(row: SgdsDataTableRow, _key: string, columnIndex: number) {\n return this._extractCellText(row, columnIndex);\n }\n\n private _compareValues(left: unknown, right: unknown, direction: \"ascending\" | \"descending\") {\n if (left === right) return 0;\n\n const leftNumber = Number(left);\n const rightNumber = Number(right);\n const bothNumeric = Number.isFinite(leftNumber) && Number.isFinite(rightNumber);\n\n if (bothNumeric) {\n return direction === \"ascending\" ? leftNumber - rightNumber : rightNumber - leftNumber;\n }\n\n const cmp = String(left).localeCompare(String(right), undefined, { numeric: true, sensitivity: \"base\" });\n return direction === \"ascending\" ? cmp : -cmp;\n }\n\n private _resetOtherHeaderSortStates(activeHeader: SgdsDataTableHead | null) {\n this._headerCells.forEach(header => {\n if (header !== activeHeader && header.sorting) {\n header.sortDirection = \"none\";\n }\n });\n }\n\n private _getRowsInInitialPositionOrder(rows: SgdsDataTableRow[]) {\n return [...rows].sort((left, right) => {\n const leftPosition = this._initialRowPositions.get(left);\n const rightPosition = this._initialRowPositions.get(right);\n\n if (leftPosition === undefined && rightPosition === undefined) return 0;\n if (leftPosition === undefined) return 1;\n if (rightPosition === undefined) return -1;\n return leftPosition - rightPosition;\n });\n }\n\n private _captureInitialRowPositions(rows: SgdsDataTableRow[]) {\n if (this._hasCapturedInitialRowPositions) return;\n\n rows.forEach((row, index) => {\n this._initialRowPositions.set(row, index);\n });\n\n this._hasCapturedInitialRowPositions = true;\n }\n\n private _handleSort(e: Event) {\n const activeHeader = e.composedPath().find(node => node instanceof SgdsDataTableHead) as\n | SgdsDataTableHead\n | undefined;\n\n if (!activeHeader || !activeHeader.sorting) return;\n\n const { key, direction } = (e as CustomEvent<ISgdsDataTableSortEventDetail>).detail;\n const columnIndex = activeHeader ? this._headerCells.indexOf(activeHeader) : -1;\n\n this._resetOtherHeaderSortStates(activeHeader);\n\n if (this.serverSort) {\n e.stopPropagation();\n this.emit(\"sgds-sort\", { detail: { key, direction } });\n return;\n }\n\n if (columnIndex < 0) return;\n\n if (direction === \"none\") {\n this.tableRows = this._getRowsInInitialPositionOrder(this.tableRows);\n this._syncDomRowOrder();\n this._updateVisibleRows();\n return;\n }\n\n if (this.mode === \"client\") {\n const start = (this.currentPage - 1) * this.itemsPerPage;\n const end = start + this.itemsPerPage;\n const nextRows = [...this.tableRows];\n\n const sortedVisibleRows = nextRows.slice(start, end).sort((left, right) => {\n const leftValue = this._toComparableValue(left, key, columnIndex);\n const rightValue = this._toComparableValue(right, key, columnIndex);\n return this._compareValues(leftValue, rightValue, direction);\n });\n nextRows.splice(start, sortedVisibleRows.length, ...sortedVisibleRows);\n\n this.tableRows = nextRows;\n this._syncDomRowOrder();\n this._updateVisibleRows();\n return;\n }\n\n this.tableRows = [...this.tableRows].sort((left, right) => {\n const leftValue = this._toComparableValue(left, key, columnIndex);\n const rightValue = this._toComparableValue(right, key, columnIndex);\n return this._compareValues(leftValue, rightValue, direction);\n });\n\n this._syncDomRowOrder();\n this._updateVisibleRows();\n }\n\n private _syncDomRowOrder() {\n const parent = this.tableRows[0]?.parentElement;\n if (!parent) return;\n this.tableRows.forEach(row => parent.appendChild(row));\n }\n\n private _handleSlotChange(e: Event) {\n const slotted = (e.target as HTMLSlotElement)\n .assignedElements({ flatten: true })\n .filter(el => el instanceof SgdsDataTableRow) as SgdsDataTableRow[];\n\n const rowTableChildren = (row: SgdsDataTableRow) =>\n Array.from(row.children).filter(child => {\n const tagName = child.tagName.toLowerCase();\n const isTableCell = tagName === \"sgds-data-table-cell\" || tagName === \"sgds-data-table-head\";\n if (!isTableCell) return false;\n return child.getAttribute(\"slot\") !== \"content\";\n });\n\n this.headerRows = slotted.filter(row =>\n rowTableChildren(row).some(child => child.tagName.toLowerCase() === \"sgds-data-table-head\")\n );\n\n this.tableRows = slotted.filter(row => {\n const children = rowTableChildren(row);\n return children.length > 0 && children.every(child => child.tagName.toLowerCase() === \"sgds-data-table-cell\");\n });\n\n this._headerCells = this.headerRows.reduce<SgdsDataTableHead[]>((acc, row) => {\n const headers = Array.from(row.children).filter(\n child => child instanceof SgdsDataTableHead\n ) as SgdsDataTableHead[];\n acc.push(...headers);\n return acc;\n }, []);\n\n this._captureInitialRowPositions(this.tableRows);\n\n this._headerCells.forEach(header => {\n if (header.sorting && !header.sortDirection) {\n header.sortDirection = \"none\";\n }\n });\n\n this._configureRows();\n this._updateVisibleRows();\n }\n\n private _updateVisibleRows() {\n if (this.loading) {\n this.tableRows.forEach(row => (row.style.display = \"none\"));\n return;\n }\n\n if (this.mode === \"server\") {\n this.tableRows.forEach(row => (row.style.display = \"\"));\n return;\n }\n\n const total = this.dataLength || this.tableRows.length;\n const lastPage = Math.max(1, Math.ceil(total / this.itemsPerPage));\n if (this.currentPage > lastPage) {\n this.currentPage = lastPage;\n return;\n }\n const start = (this.currentPage - 1) * this.itemsPerPage;\n const visible = new Set(this.tableRows.slice(start, start + this.itemsPerPage));\n this.tableRows.forEach(row => (row.style.display = visible.has(row) ? \"\" : \"none\"));\n }\n\n private _getSkeletonColumnCount(): { dataColumns: number; hasExpand: boolean; hasCheckbox: boolean } {\n const headerColumnCount = this._headerCells.reduce((count, header) => {\n const span = Number(header.colSpan) > 0 ? Number(header.colSpan) : 1;\n return count + span;\n }, 0);\n\n const firstBodyRow = this.tableRows[0];\n const fallbackBodyColumnCount = firstBodyRow\n ? Array.from(firstBodyRow.children).filter(child => child instanceof SgdsDataTableCell).length\n : 0;\n\n const hasExpand = this.tableRows.some(row => row.expand);\n const dataColumns = headerColumnCount || fallbackBodyColumnCount || 1;\n\n return { dataColumns, hasExpand, hasCheckbox: this.multiSelect };\n }\n\n private _renderLoadingSkeleton() {\n const { dataColumns, hasExpand, hasCheckbox } = this._getSkeletonColumnCount();\n const skeletonRows = Math.max(1, this.itemsPerPage || 1);\n\n return Array.from(\n { length: skeletonRows },\n () =>\n html`<div class=\"skeleton-row\" role=\"presentation\">\n ${hasExpand\n ? html`<div class=\"skeleton-cell control-cell\">\n <sgds-skeleton .height=${\"20px\"} .width=${\"20px\"} .borderRadius=${\"4px\"}></sgds-skeleton>\n </div>`\n : nothing}\n ${hasCheckbox\n ? html`<div class=\"skeleton-cell control-cell\">\n <sgds-skeleton .height=${\"24px\"} .width=${\"24px\"} .borderRadius=${\"4px\"}></sgds-skeleton>\n </div>`\n : nothing}\n ${Array.from(\n { length: dataColumns },\n () =>\n html`<div class=\"skeleton-cell\">\n <sgds-skeleton .height=${\"100%\"} .borderRadius=${\"4px\"}></sgds-skeleton>\n </div>`\n )}\n </div>`\n );\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has(\"currentPage\") || changed.has(\"itemsPerPage\") || changed.has(\"mode\") || changed.has(\"loading\")) {\n this._updateVisibleRows();\n }\n if (changed.has(\"multiSelect\")) {\n this._configureRows();\n }\n\n if (this.multiSelect && (changed.has(\"tableRows\") || changed.has(\"headerRows\"))) {\n this._syncHeaderCheckboxAfterRender();\n }\n }\n\n render() {\n const total = this.dataLength || this.tableRows.length;\n const start = (this.currentPage - 1) * this.itemsPerPage;\n const end = Math.min(start + this.itemsPerPage, total);\n const displayStart = total === 0 ? 0 : start + 1;\n const showNoData = !this.loading && this.tableRows.length === 0;\n const showFooter = total !== 0;\n\n return html`\n <div class=\"data-table\">\n <div class=\"table-container\">\n <div class=\"table\" role=\"table\">\n <slot @slotchange=${this._handleSlotChange} @i-sgds-sort=${this._handleSort}></slot>\n ${this.loading ? this._renderLoadingSkeleton() : nothing}\n </div>\n ${!this.loading && showNoData\n ? html`<slot name=\"no-data\" class=\"no-data\" role=\"status\" aria-live=\"polite\">No data</slot>`\n : nothing}\n </div>\n\n ${showFooter\n ? html`<div class=\"footer\">\n ${this.loading\n ? html`<span></span>`\n : this.paginationSummary || html`<span>Showing ${displayStart} to ${end} of ${total} results</span>`}\n <sgds-pagination\n .dataLength=${total}\n .currentPage=${this.currentPage}\n .itemsPerPage=${this.itemsPerPage}\n .variant=${this.paginationVariant}\n size=\"sm\"\n @sgds-page-change=${(e: CustomEvent<ISgdsPaginationPageChangeEventDetail>) => {\n this.currentPage = e.detail.currentPage;\n this.emit(\"sgds-page-change\");\n }}\n ></sgds-pagination>\n </div>`\n : nothing}\n </div>\n `;\n }\n}\n\nexport default SgdsDataTable;\n"],"mappings":"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"}
@@ -62,7 +62,6 @@ var SgdsDataTable = class extends SgdsElement {
62
62
  }
63
63
  connectedCallback() {
64
64
  super.connectedCallback();
65
- this.setAttribute("role", "table");
66
65
  }
67
66
  _isRowChecked(row) {
68
67
  return row.checked || row.checkbox?.checked === true;
@@ -321,7 +320,7 @@ var SgdsDataTable = class extends SgdsElement {
321
320
  return html`
322
321
  <div class="data-table">
323
322
  <div class="table-container">
324
- <div class="table">
323
+ <div class="table" role="table">
325
324
  <slot @slotchange=${this._handleSlotChange} @i-sgds-sort=${this._handleSort}></slot>
326
325
  ${this.loading ? this._renderLoadingSkeleton() : nothing}
327
326
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-data-table.js","names":["tableStyle"],"sources":["../../../../src/components/DataTable/sgds-data-table.ts"],"sourcesContent":["import { css, html, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport tableStyle from \"./data-table.css\";\nimport SgdsPagination from \"../Pagination/sgds-pagination\";\nimport type { ISgdsPaginationPageChangeEventDetail } from \"../Pagination/sgds-pagination\";\nimport SgdsDataTableRow from \"./sgds-data-table-row\";\nimport SgdsDataTableCell from \"./sgds-data-table-cell\";\nimport SgdsDataTableHead from \"./sgds-data-table-head\";\nimport SgdsSkeleton from \"../Skeleton/sgds-skeleton\";\nimport type { ISgdsDataTableRowSelectEventDetail, ISgdsDataTableSortEventDetail } from \"./types\";\nexport type { ISgdsDataTableRowSelectEventDetail, ISgdsDataTableSortEventDetail };\n\n/**\n * @summary A data table container with pagination, row selection, loading, and sorting support.\n *\n * @slot default - Insert one or more `sgds-data-table-row` elements.\n * @slot no-data - Custom content rendered when no body rows are available and `loading` is false.\n *\n * @event sgds-row-select - Emitted when row checkboxes change. Detail: `{ selected: Record<string, string>[] }`.\n * @event sgds-sort - Emitted when `serverSort` is true and a sorting column header is clicked.\n * Detail: `{ key: string; direction: \"ascending\" | \"descending\" | \"none\" }`.\n * @event sgds-page-change - Emitted when pagination changes page.\n */\nexport class SgdsDataTable extends SgdsElement {\n static styles = [\n ...SgdsElement.styles,\n tableStyle,\n css`\n :host {\n display: block;\n }\n `\n ];\n\n /** @internal */\n static dependencies = {\n \"sgds-pagination\": SgdsPagination,\n \"sgds-data-table-cell\": SgdsDataTableCell,\n \"sgds-data-table-head\": SgdsDataTableHead,\n \"sgds-skeleton\": SgdsSkeleton\n };\n\n /** If true, renders a checkbox column for row selection. */\n @property({ type: Boolean }) multiSelect = false;\n\n /** Total number of data items (for server-side pagination). */\n @property({ type: Number }) dataLength = 0;\n\n /** Current page (1-based). */\n @property({ type: Number }) currentPage = 1;\n\n /** Number of rows per page. */\n @property({ type: Number }) itemsPerPage = 5;\n\n /** Custom text shown on the footer's left side. */\n @property({ type: String }) paginationSummary = \"\";\n\n /** When true, shows a loading state and hides body rows. */\n @property({ type: Boolean }) loading = false;\n\n /** When true, emits sort events for external handling instead of local sorting. */\n @property({ type: Boolean }) serverSort = false;\n\n /** Variant forwarded to the internal pagination component. */\n @property({ type: String }) paginationVariant: \"default\" | \"number\" | \"button\" | \"description\" = \"default\";\n\n /**\n * Controls the CSS `table-layout` algorithm.\n * Use \"auto\" to let the browser size columns based on content, or \"fixed\" to distribute column widths evenly regardless of content.\n * @type {\"auto\" | \"fixed\"}\n * @default \"auto\"\n */\n @property({ type: String, reflect: true }) layout: \"auto\" | \"fixed\" = \"auto\";\n\n /**\n * Pagination mode. `client` (default) slices rows and renders pagination controls.\n * `server` renders all slotted rows as-is — the caller is responsible for passing\n * the correct page of data and handling `sgds-page-change` externally.\n */\n @property({ type: String }) mode: \"client\" | \"server\" = \"client\";\n\n @state() private tableRows: SgdsDataTableRow[] = [];\n @state() private headerRows: SgdsDataTableRow[] = [];\n\n private _headerCells: SgdsDataTableHead[] = [];\n private _initialRowPositions = new WeakMap<SgdsDataTableRow, number>();\n private _hasCapturedInitialRowPositions = false;\n\n private _rowHandlers = new WeakMap<SgdsDataTableRow, EventListener>();\n\n connectedCallback() {\n super.connectedCallback();\n this.setAttribute(\"role\", \"table\");\n }\n\n private _isRowChecked(row: SgdsDataTableRow) {\n return row.checked || row.checkbox?.checked === true;\n }\n\n private _updateHeaderCheckbox() {\n const checkedCount = this.tableRows.filter(r => this._isRowChecked(r)).length;\n\n const allChecked = checkedCount === this.tableRows.length && checkedCount > 0;\n\n this.headerRows.forEach(r => {\n r.checked = allChecked;\n if (r.checkbox) {\n r.checkbox.checked = allChecked;\n r.checkbox.indeterminate = checkedCount > 0 && !allChecked;\n }\n });\n }\n\n private async _syncHeaderCheckboxAfterRender() {\n if (!this.multiSelect || this.headerRows.length === 0) return;\n\n const rows = [...this.headerRows, ...this.tableRows];\n await Promise.all(rows.map(row => row.updateComplete));\n this._updateHeaderCheckbox();\n }\n\n private _emitRowSelect() {\n const selected = this.tableRows.filter(r => this._isRowChecked(r)).map(r => this._getRowData(r));\n this.emit(\"sgds-row-select\", { detail: { selected } });\n }\n\n private _attachRowListener(row: SgdsDataTableRow) {\n const old = this._rowHandlers.get(row);\n if (old) row.removeEventListener(\"i-sgds-change\", old);\n\n const handler: EventListener = (e: Event) => {\n const { checked } = (e as CustomEvent<{ checked: boolean }>).detail;\n\n if (this.headerRows.includes(row)) {\n this.tableRows.forEach(r => {\n r.checked = checked;\n if (r.checkbox) r.checkbox.checked = checked;\n });\n } else {\n row.checked = checked;\n this._updateHeaderCheckbox();\n }\n this._emitRowSelect();\n };\n\n this._rowHandlers.set(row, handler);\n row.addEventListener(\"i-sgds-change\", handler);\n }\n\n private _configureRows() {\n const hasExpand = this.tableRows.some(r => r.expand);\n const hasDataRows = this.tableRows.length > 0;\n\n this.headerRows.forEach(row => {\n row.showCheckbox = this.multiSelect;\n row.showExpandPlaceholder = hasExpand;\n row.hasDataRows = hasDataRows;\n if (this.multiSelect) this._attachRowListener(row);\n });\n\n this.tableRows.forEach(row => {\n row.showCheckbox = this.multiSelect;\n row.showExpandPlaceholder = !row.expand && hasExpand;\n if (this.multiSelect) this._attachRowListener(row);\n });\n\n if (this.multiSelect) {\n this._syncHeaderCheckboxAfterRender();\n }\n\n this._applyColumnAlignment();\n }\n\n private _applyColumnAlignment() {\n const headerAlignments = this._headerCells.reduce<Array<\"left\" | \"right\">>((acc, header) => {\n const span = Number(header.colSpan) > 0 ? Number(header.colSpan) : 1;\n const alignment = header.textAlign ?? \"left\";\n for (let i = 0; i < span; i++) {\n acc.push(alignment);\n }\n return acc;\n }, []);\n\n this.headerRows.forEach(row => {\n row.columnAlignments = [...headerAlignments];\n });\n\n this.tableRows.forEach(row => {\n row.columnAlignments = [...headerAlignments];\n });\n }\n\n private _extractCellText(row: SgdsDataTableRow, columnIndex: number) {\n const rowCellText = row.getCellText(columnIndex);\n if (rowCellText) return rowCellText;\n\n const cells = Array.from(row.children).filter(child => child.tagName.toLowerCase() === \"sgds-data-table-cell\");\n const cell = cells[columnIndex];\n return (cell?.textContent || \"\").trim();\n }\n\n private _getRowData(row: SgdsDataTableRow): Record<string, string> {\n const data: Record<string, string> = {};\n this._headerCells.forEach((header, index) => {\n const key = header.sortKey || (header.textContent ?? \"\").trim() || `col-${index}`;\n data[key] = this._extractCellText(row, index);\n });\n return data;\n }\n\n private _toComparableValue(row: SgdsDataTableRow, _key: string, columnIndex: number) {\n return this._extractCellText(row, columnIndex);\n }\n\n private _compareValues(left: unknown, right: unknown, direction: \"ascending\" | \"descending\") {\n if (left === right) return 0;\n\n const leftNumber = Number(left);\n const rightNumber = Number(right);\n const bothNumeric = Number.isFinite(leftNumber) && Number.isFinite(rightNumber);\n\n if (bothNumeric) {\n return direction === \"ascending\" ? leftNumber - rightNumber : rightNumber - leftNumber;\n }\n\n const cmp = String(left).localeCompare(String(right), undefined, { numeric: true, sensitivity: \"base\" });\n return direction === \"ascending\" ? cmp : -cmp;\n }\n\n private _resetOtherHeaderSortStates(activeHeader: SgdsDataTableHead | null) {\n this._headerCells.forEach(header => {\n if (header !== activeHeader && header.sorting) {\n header.sortDirection = \"none\";\n }\n });\n }\n\n private _getRowsInInitialPositionOrder(rows: SgdsDataTableRow[]) {\n return [...rows].sort((left, right) => {\n const leftPosition = this._initialRowPositions.get(left);\n const rightPosition = this._initialRowPositions.get(right);\n\n if (leftPosition === undefined && rightPosition === undefined) return 0;\n if (leftPosition === undefined) return 1;\n if (rightPosition === undefined) return -1;\n return leftPosition - rightPosition;\n });\n }\n\n private _captureInitialRowPositions(rows: SgdsDataTableRow[]) {\n if (this._hasCapturedInitialRowPositions) return;\n\n rows.forEach((row, index) => {\n this._initialRowPositions.set(row, index);\n });\n\n this._hasCapturedInitialRowPositions = true;\n }\n\n private _handleSort(e: Event) {\n const activeHeader = e.composedPath().find(node => node instanceof SgdsDataTableHead) as\n | SgdsDataTableHead\n | undefined;\n\n if (!activeHeader || !activeHeader.sorting) return;\n\n const { key, direction } = (e as CustomEvent<ISgdsDataTableSortEventDetail>).detail;\n const columnIndex = activeHeader ? this._headerCells.indexOf(activeHeader) : -1;\n\n this._resetOtherHeaderSortStates(activeHeader);\n\n if (this.serverSort) {\n e.stopPropagation();\n this.emit(\"sgds-sort\", { detail: { key, direction } });\n return;\n }\n\n if (columnIndex < 0) return;\n\n if (direction === \"none\") {\n this.tableRows = this._getRowsInInitialPositionOrder(this.tableRows);\n this._syncDomRowOrder();\n this._updateVisibleRows();\n return;\n }\n\n if (this.mode === \"client\") {\n const start = (this.currentPage - 1) * this.itemsPerPage;\n const end = start + this.itemsPerPage;\n const nextRows = [...this.tableRows];\n\n const sortedVisibleRows = nextRows.slice(start, end).sort((left, right) => {\n const leftValue = this._toComparableValue(left, key, columnIndex);\n const rightValue = this._toComparableValue(right, key, columnIndex);\n return this._compareValues(leftValue, rightValue, direction);\n });\n nextRows.splice(start, sortedVisibleRows.length, ...sortedVisibleRows);\n\n this.tableRows = nextRows;\n this._syncDomRowOrder();\n this._updateVisibleRows();\n return;\n }\n\n this.tableRows = [...this.tableRows].sort((left, right) => {\n const leftValue = this._toComparableValue(left, key, columnIndex);\n const rightValue = this._toComparableValue(right, key, columnIndex);\n return this._compareValues(leftValue, rightValue, direction);\n });\n\n this._syncDomRowOrder();\n this._updateVisibleRows();\n }\n\n private _syncDomRowOrder() {\n const parent = this.tableRows[0]?.parentElement;\n if (!parent) return;\n this.tableRows.forEach(row => parent.appendChild(row));\n }\n\n private _handleSlotChange(e: Event) {\n const slotted = (e.target as HTMLSlotElement)\n .assignedElements({ flatten: true })\n .filter(el => el instanceof SgdsDataTableRow) as SgdsDataTableRow[];\n\n const rowTableChildren = (row: SgdsDataTableRow) =>\n Array.from(row.children).filter(child => {\n const tagName = child.tagName.toLowerCase();\n const isTableCell = tagName === \"sgds-data-table-cell\" || tagName === \"sgds-data-table-head\";\n if (!isTableCell) return false;\n return child.getAttribute(\"slot\") !== \"content\";\n });\n\n this.headerRows = slotted.filter(row =>\n rowTableChildren(row).some(child => child.tagName.toLowerCase() === \"sgds-data-table-head\")\n );\n\n this.tableRows = slotted.filter(row => {\n const children = rowTableChildren(row);\n return children.length > 0 && children.every(child => child.tagName.toLowerCase() === \"sgds-data-table-cell\");\n });\n\n this._headerCells = this.headerRows.reduce<SgdsDataTableHead[]>((acc, row) => {\n const headers = Array.from(row.children).filter(\n child => child instanceof SgdsDataTableHead\n ) as SgdsDataTableHead[];\n acc.push(...headers);\n return acc;\n }, []);\n\n this._captureInitialRowPositions(this.tableRows);\n\n this._headerCells.forEach(header => {\n if (header.sorting && !header.sortDirection) {\n header.sortDirection = \"none\";\n }\n });\n\n this._configureRows();\n this._updateVisibleRows();\n }\n\n private _updateVisibleRows() {\n if (this.loading) {\n this.tableRows.forEach(row => (row.style.display = \"none\"));\n return;\n }\n\n if (this.mode === \"server\") {\n this.tableRows.forEach(row => (row.style.display = \"\"));\n return;\n }\n\n const total = this.dataLength || this.tableRows.length;\n const lastPage = Math.max(1, Math.ceil(total / this.itemsPerPage));\n if (this.currentPage > lastPage) {\n this.currentPage = lastPage;\n return;\n }\n const start = (this.currentPage - 1) * this.itemsPerPage;\n const visible = new Set(this.tableRows.slice(start, start + this.itemsPerPage));\n this.tableRows.forEach(row => (row.style.display = visible.has(row) ? \"\" : \"none\"));\n }\n\n private _getSkeletonColumnCount(): { dataColumns: number; hasExpand: boolean; hasCheckbox: boolean } {\n const headerColumnCount = this._headerCells.reduce((count, header) => {\n const span = Number(header.colSpan) > 0 ? Number(header.colSpan) : 1;\n return count + span;\n }, 0);\n\n const firstBodyRow = this.tableRows[0];\n const fallbackBodyColumnCount = firstBodyRow\n ? Array.from(firstBodyRow.children).filter(child => child instanceof SgdsDataTableCell).length\n : 0;\n\n const hasExpand = this.tableRows.some(row => row.expand);\n const dataColumns = headerColumnCount || fallbackBodyColumnCount || 1;\n\n return { dataColumns, hasExpand, hasCheckbox: this.multiSelect };\n }\n\n private _renderLoadingSkeleton() {\n const { dataColumns, hasExpand, hasCheckbox } = this._getSkeletonColumnCount();\n const skeletonRows = Math.max(1, this.itemsPerPage || 1);\n\n return Array.from(\n { length: skeletonRows },\n () =>\n html`<div class=\"skeleton-row\" role=\"presentation\">\n ${hasExpand\n ? html`<div class=\"skeleton-cell control-cell\">\n <sgds-skeleton .height=${\"20px\"} .width=${\"20px\"} .borderRadius=${\"4px\"}></sgds-skeleton>\n </div>`\n : nothing}\n ${hasCheckbox\n ? html`<div class=\"skeleton-cell control-cell\">\n <sgds-skeleton .height=${\"24px\"} .width=${\"24px\"} .borderRadius=${\"4px\"}></sgds-skeleton>\n </div>`\n : nothing}\n ${Array.from(\n { length: dataColumns },\n () =>\n html`<div class=\"skeleton-cell\">\n <sgds-skeleton .height=${\"100%\"} .borderRadius=${\"4px\"}></sgds-skeleton>\n </div>`\n )}\n </div>`\n );\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has(\"currentPage\") || changed.has(\"itemsPerPage\") || changed.has(\"mode\") || changed.has(\"loading\")) {\n this._updateVisibleRows();\n }\n if (changed.has(\"multiSelect\")) {\n this._configureRows();\n }\n\n if (this.multiSelect && (changed.has(\"tableRows\") || changed.has(\"headerRows\"))) {\n this._syncHeaderCheckboxAfterRender();\n }\n }\n\n render() {\n const total = this.dataLength || this.tableRows.length;\n const start = (this.currentPage - 1) * this.itemsPerPage;\n const end = Math.min(start + this.itemsPerPage, total);\n const displayStart = total === 0 ? 0 : start + 1;\n const showNoData = !this.loading && this.tableRows.length === 0;\n const showFooter = total !== 0;\n\n return html`\n <div class=\"data-table\">\n <div class=\"table-container\">\n <div class=\"table\">\n <slot @slotchange=${this._handleSlotChange} @i-sgds-sort=${this._handleSort}></slot>\n ${this.loading ? this._renderLoadingSkeleton() : nothing}\n </div>\n ${!this.loading && showNoData\n ? html`<slot name=\"no-data\" class=\"no-data\" role=\"status\" aria-live=\"polite\">No data</slot>`\n : nothing}\n </div>\n\n ${showFooter\n ? html`<div class=\"footer\">\n ${this.loading\n ? html`<span></span>`\n : this.paginationSummary || html`<span>Showing ${displayStart} to ${end} of ${total} results</span>`}\n <sgds-pagination\n .dataLength=${total}\n .currentPage=${this.currentPage}\n .itemsPerPage=${this.itemsPerPage}\n .variant=${this.paginationVariant}\n size=\"sm\"\n @sgds-page-change=${(e: CustomEvent<ISgdsPaginationPageChangeEventDetail>) => {\n this.currentPage = e.detail.currentPage;\n this.emit(\"sgds-page-change\");\n }}\n ></sgds-pagination>\n </div>`\n : nothing}\n </div>\n `;\n }\n}\n\nexport default SgdsDataTable;\n"],"mappings":"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"}
1
+ {"version":3,"file":"sgds-data-table.js","names":["tableStyle"],"sources":["../../../../src/components/DataTable/sgds-data-table.ts"],"sourcesContent":["import { css, html, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport tableStyle from \"./data-table.css\";\nimport SgdsPagination from \"../Pagination/sgds-pagination\";\nimport type { ISgdsPaginationPageChangeEventDetail } from \"../Pagination/sgds-pagination\";\nimport SgdsDataTableRow from \"./sgds-data-table-row\";\nimport SgdsDataTableCell from \"./sgds-data-table-cell\";\nimport SgdsDataTableHead from \"./sgds-data-table-head\";\nimport SgdsSkeleton from \"../Skeleton/sgds-skeleton\";\nimport type { ISgdsDataTableRowSelectEventDetail, ISgdsDataTableSortEventDetail } from \"./types\";\nexport type { ISgdsDataTableRowSelectEventDetail, ISgdsDataTableSortEventDetail };\n\n/**\n * @summary A data table container with pagination, row selection, loading, and sorting support.\n *\n * @slot default - Insert one or more `sgds-data-table-row` elements.\n * @slot no-data - Custom content rendered when no body rows are available and `loading` is false.\n *\n * @event sgds-row-select - Emitted when row checkboxes change. Detail: `{ selected: Record<string, string>[] }`.\n * @event sgds-sort - Emitted when `serverSort` is true and a sorting column header is clicked.\n * Detail: `{ key: string; direction: \"ascending\" | \"descending\" | \"none\" }`.\n * @event sgds-page-change - Emitted when pagination changes page.\n */\nexport class SgdsDataTable extends SgdsElement {\n static styles = [\n ...SgdsElement.styles,\n tableStyle,\n css`\n :host {\n display: block;\n }\n `\n ];\n\n /** @internal */\n static dependencies = {\n \"sgds-pagination\": SgdsPagination,\n \"sgds-data-table-cell\": SgdsDataTableCell,\n \"sgds-data-table-head\": SgdsDataTableHead,\n \"sgds-skeleton\": SgdsSkeleton\n };\n\n /** If true, renders a checkbox column for row selection. */\n @property({ type: Boolean }) multiSelect = false;\n\n /** Total number of data items (for server-side pagination). */\n @property({ type: Number }) dataLength = 0;\n\n /** Current page (1-based). */\n @property({ type: Number }) currentPage = 1;\n\n /** Number of rows per page. */\n @property({ type: Number }) itemsPerPage = 5;\n\n /** Custom text shown on the footer's left side. */\n @property({ type: String }) paginationSummary = \"\";\n\n /** When true, shows a loading state and hides body rows. */\n @property({ type: Boolean }) loading = false;\n\n /** When true, emits sort events for external handling instead of local sorting. */\n @property({ type: Boolean }) serverSort = false;\n\n /** Variant forwarded to the internal pagination component. */\n @property({ type: String }) paginationVariant: \"default\" | \"number\" | \"button\" | \"description\" = \"default\";\n\n /**\n * Controls the CSS `table-layout` algorithm.\n * Use \"auto\" to let the browser size columns based on content, or \"fixed\" to distribute column widths evenly regardless of content.\n * @type {\"auto\" | \"fixed\"}\n * @default \"auto\"\n */\n @property({ type: String, reflect: true }) layout: \"auto\" | \"fixed\" = \"auto\";\n\n /**\n * Pagination mode. `client` (default) slices rows and renders pagination controls.\n * `server` renders all slotted rows as-is — the caller is responsible for passing\n * the correct page of data and handling `sgds-page-change` externally.\n */\n @property({ type: String }) mode: \"client\" | \"server\" = \"client\";\n\n @state() private tableRows: SgdsDataTableRow[] = [];\n @state() private headerRows: SgdsDataTableRow[] = [];\n\n private _headerCells: SgdsDataTableHead[] = [];\n private _initialRowPositions = new WeakMap<SgdsDataTableRow, number>();\n private _hasCapturedInitialRowPositions = false;\n\n private _rowHandlers = new WeakMap<SgdsDataTableRow, EventListener>();\n\n connectedCallback() {\n super.connectedCallback();\n }\n\n private _isRowChecked(row: SgdsDataTableRow) {\n return row.checked || row.checkbox?.checked === true;\n }\n\n private _updateHeaderCheckbox() {\n const checkedCount = this.tableRows.filter(r => this._isRowChecked(r)).length;\n\n const allChecked = checkedCount === this.tableRows.length && checkedCount > 0;\n\n this.headerRows.forEach(r => {\n r.checked = allChecked;\n if (r.checkbox) {\n r.checkbox.checked = allChecked;\n r.checkbox.indeterminate = checkedCount > 0 && !allChecked;\n }\n });\n }\n\n private async _syncHeaderCheckboxAfterRender() {\n if (!this.multiSelect || this.headerRows.length === 0) return;\n\n const rows = [...this.headerRows, ...this.tableRows];\n await Promise.all(rows.map(row => row.updateComplete));\n this._updateHeaderCheckbox();\n }\n\n private _emitRowSelect() {\n const selected = this.tableRows.filter(r => this._isRowChecked(r)).map(r => this._getRowData(r));\n this.emit(\"sgds-row-select\", { detail: { selected } });\n }\n\n private _attachRowListener(row: SgdsDataTableRow) {\n const old = this._rowHandlers.get(row);\n if (old) row.removeEventListener(\"i-sgds-change\", old);\n\n const handler: EventListener = (e: Event) => {\n const { checked } = (e as CustomEvent<{ checked: boolean }>).detail;\n\n if (this.headerRows.includes(row)) {\n this.tableRows.forEach(r => {\n r.checked = checked;\n if (r.checkbox) r.checkbox.checked = checked;\n });\n } else {\n row.checked = checked;\n this._updateHeaderCheckbox();\n }\n this._emitRowSelect();\n };\n\n this._rowHandlers.set(row, handler);\n row.addEventListener(\"i-sgds-change\", handler);\n }\n\n private _configureRows() {\n const hasExpand = this.tableRows.some(r => r.expand);\n const hasDataRows = this.tableRows.length > 0;\n\n this.headerRows.forEach(row => {\n row.showCheckbox = this.multiSelect;\n row.showExpandPlaceholder = hasExpand;\n row.hasDataRows = hasDataRows;\n if (this.multiSelect) this._attachRowListener(row);\n });\n\n this.tableRows.forEach(row => {\n row.showCheckbox = this.multiSelect;\n row.showExpandPlaceholder = !row.expand && hasExpand;\n if (this.multiSelect) this._attachRowListener(row);\n });\n\n if (this.multiSelect) {\n this._syncHeaderCheckboxAfterRender();\n }\n\n this._applyColumnAlignment();\n }\n\n private _applyColumnAlignment() {\n const headerAlignments = this._headerCells.reduce<Array<\"left\" | \"right\">>((acc, header) => {\n const span = Number(header.colSpan) > 0 ? Number(header.colSpan) : 1;\n const alignment = header.textAlign ?? \"left\";\n for (let i = 0; i < span; i++) {\n acc.push(alignment);\n }\n return acc;\n }, []);\n\n this.headerRows.forEach(row => {\n row.columnAlignments = [...headerAlignments];\n });\n\n this.tableRows.forEach(row => {\n row.columnAlignments = [...headerAlignments];\n });\n }\n\n private _extractCellText(row: SgdsDataTableRow, columnIndex: number) {\n const rowCellText = row.getCellText(columnIndex);\n if (rowCellText) return rowCellText;\n\n const cells = Array.from(row.children).filter(child => child.tagName.toLowerCase() === \"sgds-data-table-cell\");\n const cell = cells[columnIndex];\n return (cell?.textContent || \"\").trim();\n }\n\n private _getRowData(row: SgdsDataTableRow): Record<string, string> {\n const data: Record<string, string> = {};\n this._headerCells.forEach((header, index) => {\n const key = header.sortKey || (header.textContent ?? \"\").trim() || `col-${index}`;\n data[key] = this._extractCellText(row, index);\n });\n return data;\n }\n\n private _toComparableValue(row: SgdsDataTableRow, _key: string, columnIndex: number) {\n return this._extractCellText(row, columnIndex);\n }\n\n private _compareValues(left: unknown, right: unknown, direction: \"ascending\" | \"descending\") {\n if (left === right) return 0;\n\n const leftNumber = Number(left);\n const rightNumber = Number(right);\n const bothNumeric = Number.isFinite(leftNumber) && Number.isFinite(rightNumber);\n\n if (bothNumeric) {\n return direction === \"ascending\" ? leftNumber - rightNumber : rightNumber - leftNumber;\n }\n\n const cmp = String(left).localeCompare(String(right), undefined, { numeric: true, sensitivity: \"base\" });\n return direction === \"ascending\" ? cmp : -cmp;\n }\n\n private _resetOtherHeaderSortStates(activeHeader: SgdsDataTableHead | null) {\n this._headerCells.forEach(header => {\n if (header !== activeHeader && header.sorting) {\n header.sortDirection = \"none\";\n }\n });\n }\n\n private _getRowsInInitialPositionOrder(rows: SgdsDataTableRow[]) {\n return [...rows].sort((left, right) => {\n const leftPosition = this._initialRowPositions.get(left);\n const rightPosition = this._initialRowPositions.get(right);\n\n if (leftPosition === undefined && rightPosition === undefined) return 0;\n if (leftPosition === undefined) return 1;\n if (rightPosition === undefined) return -1;\n return leftPosition - rightPosition;\n });\n }\n\n private _captureInitialRowPositions(rows: SgdsDataTableRow[]) {\n if (this._hasCapturedInitialRowPositions) return;\n\n rows.forEach((row, index) => {\n this._initialRowPositions.set(row, index);\n });\n\n this._hasCapturedInitialRowPositions = true;\n }\n\n private _handleSort(e: Event) {\n const activeHeader = e.composedPath().find(node => node instanceof SgdsDataTableHead) as\n | SgdsDataTableHead\n | undefined;\n\n if (!activeHeader || !activeHeader.sorting) return;\n\n const { key, direction } = (e as CustomEvent<ISgdsDataTableSortEventDetail>).detail;\n const columnIndex = activeHeader ? this._headerCells.indexOf(activeHeader) : -1;\n\n this._resetOtherHeaderSortStates(activeHeader);\n\n if (this.serverSort) {\n e.stopPropagation();\n this.emit(\"sgds-sort\", { detail: { key, direction } });\n return;\n }\n\n if (columnIndex < 0) return;\n\n if (direction === \"none\") {\n this.tableRows = this._getRowsInInitialPositionOrder(this.tableRows);\n this._syncDomRowOrder();\n this._updateVisibleRows();\n return;\n }\n\n if (this.mode === \"client\") {\n const start = (this.currentPage - 1) * this.itemsPerPage;\n const end = start + this.itemsPerPage;\n const nextRows = [...this.tableRows];\n\n const sortedVisibleRows = nextRows.slice(start, end).sort((left, right) => {\n const leftValue = this._toComparableValue(left, key, columnIndex);\n const rightValue = this._toComparableValue(right, key, columnIndex);\n return this._compareValues(leftValue, rightValue, direction);\n });\n nextRows.splice(start, sortedVisibleRows.length, ...sortedVisibleRows);\n\n this.tableRows = nextRows;\n this._syncDomRowOrder();\n this._updateVisibleRows();\n return;\n }\n\n this.tableRows = [...this.tableRows].sort((left, right) => {\n const leftValue = this._toComparableValue(left, key, columnIndex);\n const rightValue = this._toComparableValue(right, key, columnIndex);\n return this._compareValues(leftValue, rightValue, direction);\n });\n\n this._syncDomRowOrder();\n this._updateVisibleRows();\n }\n\n private _syncDomRowOrder() {\n const parent = this.tableRows[0]?.parentElement;\n if (!parent) return;\n this.tableRows.forEach(row => parent.appendChild(row));\n }\n\n private _handleSlotChange(e: Event) {\n const slotted = (e.target as HTMLSlotElement)\n .assignedElements({ flatten: true })\n .filter(el => el instanceof SgdsDataTableRow) as SgdsDataTableRow[];\n\n const rowTableChildren = (row: SgdsDataTableRow) =>\n Array.from(row.children).filter(child => {\n const tagName = child.tagName.toLowerCase();\n const isTableCell = tagName === \"sgds-data-table-cell\" || tagName === \"sgds-data-table-head\";\n if (!isTableCell) return false;\n return child.getAttribute(\"slot\") !== \"content\";\n });\n\n this.headerRows = slotted.filter(row =>\n rowTableChildren(row).some(child => child.tagName.toLowerCase() === \"sgds-data-table-head\")\n );\n\n this.tableRows = slotted.filter(row => {\n const children = rowTableChildren(row);\n return children.length > 0 && children.every(child => child.tagName.toLowerCase() === \"sgds-data-table-cell\");\n });\n\n this._headerCells = this.headerRows.reduce<SgdsDataTableHead[]>((acc, row) => {\n const headers = Array.from(row.children).filter(\n child => child instanceof SgdsDataTableHead\n ) as SgdsDataTableHead[];\n acc.push(...headers);\n return acc;\n }, []);\n\n this._captureInitialRowPositions(this.tableRows);\n\n this._headerCells.forEach(header => {\n if (header.sorting && !header.sortDirection) {\n header.sortDirection = \"none\";\n }\n });\n\n this._configureRows();\n this._updateVisibleRows();\n }\n\n private _updateVisibleRows() {\n if (this.loading) {\n this.tableRows.forEach(row => (row.style.display = \"none\"));\n return;\n }\n\n if (this.mode === \"server\") {\n this.tableRows.forEach(row => (row.style.display = \"\"));\n return;\n }\n\n const total = this.dataLength || this.tableRows.length;\n const lastPage = Math.max(1, Math.ceil(total / this.itemsPerPage));\n if (this.currentPage > lastPage) {\n this.currentPage = lastPage;\n return;\n }\n const start = (this.currentPage - 1) * this.itemsPerPage;\n const visible = new Set(this.tableRows.slice(start, start + this.itemsPerPage));\n this.tableRows.forEach(row => (row.style.display = visible.has(row) ? \"\" : \"none\"));\n }\n\n private _getSkeletonColumnCount(): { dataColumns: number; hasExpand: boolean; hasCheckbox: boolean } {\n const headerColumnCount = this._headerCells.reduce((count, header) => {\n const span = Number(header.colSpan) > 0 ? Number(header.colSpan) : 1;\n return count + span;\n }, 0);\n\n const firstBodyRow = this.tableRows[0];\n const fallbackBodyColumnCount = firstBodyRow\n ? Array.from(firstBodyRow.children).filter(child => child instanceof SgdsDataTableCell).length\n : 0;\n\n const hasExpand = this.tableRows.some(row => row.expand);\n const dataColumns = headerColumnCount || fallbackBodyColumnCount || 1;\n\n return { dataColumns, hasExpand, hasCheckbox: this.multiSelect };\n }\n\n private _renderLoadingSkeleton() {\n const { dataColumns, hasExpand, hasCheckbox } = this._getSkeletonColumnCount();\n const skeletonRows = Math.max(1, this.itemsPerPage || 1);\n\n return Array.from(\n { length: skeletonRows },\n () =>\n html`<div class=\"skeleton-row\" role=\"presentation\">\n ${hasExpand\n ? html`<div class=\"skeleton-cell control-cell\">\n <sgds-skeleton .height=${\"20px\"} .width=${\"20px\"} .borderRadius=${\"4px\"}></sgds-skeleton>\n </div>`\n : nothing}\n ${hasCheckbox\n ? html`<div class=\"skeleton-cell control-cell\">\n <sgds-skeleton .height=${\"24px\"} .width=${\"24px\"} .borderRadius=${\"4px\"}></sgds-skeleton>\n </div>`\n : nothing}\n ${Array.from(\n { length: dataColumns },\n () =>\n html`<div class=\"skeleton-cell\">\n <sgds-skeleton .height=${\"100%\"} .borderRadius=${\"4px\"}></sgds-skeleton>\n </div>`\n )}\n </div>`\n );\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has(\"currentPage\") || changed.has(\"itemsPerPage\") || changed.has(\"mode\") || changed.has(\"loading\")) {\n this._updateVisibleRows();\n }\n if (changed.has(\"multiSelect\")) {\n this._configureRows();\n }\n\n if (this.multiSelect && (changed.has(\"tableRows\") || changed.has(\"headerRows\"))) {\n this._syncHeaderCheckboxAfterRender();\n }\n }\n\n render() {\n const total = this.dataLength || this.tableRows.length;\n const start = (this.currentPage - 1) * this.itemsPerPage;\n const end = Math.min(start + this.itemsPerPage, total);\n const displayStart = total === 0 ? 0 : start + 1;\n const showNoData = !this.loading && this.tableRows.length === 0;\n const showFooter = total !== 0;\n\n return html`\n <div class=\"data-table\">\n <div class=\"table-container\">\n <div class=\"table\" role=\"table\">\n <slot @slotchange=${this._handleSlotChange} @i-sgds-sort=${this._handleSort}></slot>\n ${this.loading ? this._renderLoadingSkeleton() : nothing}\n </div>\n ${!this.loading && showNoData\n ? html`<slot name=\"no-data\" class=\"no-data\" role=\"status\" aria-live=\"polite\">No data</slot>`\n : nothing}\n </div>\n\n ${showFooter\n ? html`<div class=\"footer\">\n ${this.loading\n ? html`<span></span>`\n : this.paginationSummary || html`<span>Showing ${displayStart} to ${end} of ${total} results</span>`}\n <sgds-pagination\n .dataLength=${total}\n .currentPage=${this.currentPage}\n .itemsPerPage=${this.itemsPerPage}\n .variant=${this.paginationVariant}\n size=\"sm\"\n @sgds-page-change=${(e: CustomEvent<ISgdsPaginationPageChangeEventDetail>) => {\n this.currentPage = e.detail.currentPage;\n this.emit(\"sgds-page-change\");\n }}\n ></sgds-pagination>\n </div>`\n : nothing}\n </div>\n `;\n }\n}\n\nexport default SgdsDataTable;\n"],"mappings":"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"}
@@ -47,7 +47,7 @@ var SgdsDropdown = class extends require_dropdown_list_element.DropdownListEleme
47
47
  this.hideMenu();
48
48
  }
49
49
  _handleCloseMenu() {
50
- this._toggler[0]?.focus();
50
+ this._toggler[0]?.focus({ preventScroll: true });
51
51
  }
52
52
  async connectedCallback() {
53
53
  super.connectedCallback();
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-dropdown.cjs.js","names":["DropdownListElement","dropdownStyle","dropdownMenuStyle","ref","property","queryAssignedElements","watch"],"sources":["../../../../src/components/Dropdown/sgds-dropdown.ts"],"sourcesContent":["import { html, PropertyValueMap } from \"lit\";\nimport { property, queryAssignedElements } from \"lit/decorators.js\";\nimport { ref } from \"lit/directives/ref.js\";\nimport { DropdownListElement } from \"../../base/dropdown-list-element\";\nimport { watch } from \"../../utils/watch\";\nimport dropdownMenuStyle from \"./dropdown-menu.css\";\nimport dropdownStyle from \"./dropdown.css\";\n\nexport type DropDirection = \"left\" | \"right\" | \"up\" | \"down\";\n\n/**\n * @summary `SgdsDropdown` toggles contextual overlays for displaying lists of links.\n * @slot default - slot for sgds-dropdown-item passed into dropdown's menu\n * @slot toggler - slot for the toggler that triggers the open and closing of menu, typically a button. Only pass in a single element into this slot\n *\n */\nexport class SgdsDropdown extends DropdownListElement {\n static styles = [...DropdownListElement.styles, dropdownStyle, dropdownMenuStyle];\n\n constructor() {\n super();\n this.menuRef = ref();\n }\n\n /** Controls auto-flipping of menu */\n @property({ type: Boolean, reflect: true, state: false })\n noFlip = false;\n\n /** When true, aligns right edge of menu with right edge of button */\n @property({ type: Boolean, reflect: true, state: false })\n menuAlignRight = false;\n\n /** The drop position of menu relative to the toggle button */\n @property({ type: String, reflect: true, state: false })\n drop: DropDirection = \"down\";\n\n /** Controls the close behaviour of dropdown menu. By default menu auto-closes when SgdsDropdownItem or area outside dropdown is clicked */\n @property({ type: String, reflect: true, state: false })\n close: \"outside\" | \"default\" | \"inside\" = \"default\";\n\n @queryAssignedElements({ slot: \"toggler\", flatten: true })\n private _toggler: Array<HTMLElement>;\n\n protected menuRef;\n\n private async _handleClick(e: MouseEvent) {\n if (this.disabled) return;\n\n const slottedToggler = this._toggler[0];\n\n if (!slottedToggler) {\n this.toggleMenu();\n return;\n }\n\n if (e.composedPath().includes(slottedToggler)) {\n this.toggleMenu();\n return;\n }\n\n // Click landed in the toggler-container's empty area (passed through pointer-events: none)\n if (!this.menuIsOpen) return;\n const menu = this.menuRef.value;\n if (menu && e.composedPath().includes(menu)) return;\n this.hideMenu();\n }\n\n private _handleCloseMenu() {\n const button = this._toggler[0];\n button?.focus();\n }\n\n async connectedCallback() {\n super.connectedCallback();\n this.addEventListener(\"sgds-hide\", this._handleCloseMenu);\n }\n\n async disconnectedCallback() {\n this.removeEventListener(\"sgds-hide\", this._handleCloseMenu);\n }\n\n async firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n if (this.menuIsOpen) {\n await this.updateFloatingPosition();\n }\n this._handleDisabled();\n }\n\n private _handleTogglerSlotChange(e: Event) {\n const slot = e.target as HTMLSlotElement;\n const elements = slot.assignedElements({ flatten: true });\n const button = elements[0];\n if (button) {\n button.setAttribute(\"aria-haspopup\", \"menu\");\n button.setAttribute(\"aria-expanded\", String(this.menuIsOpen));\n }\n }\n\n @watch(\"menuIsOpen\")\n _handleMenuIsOpenChange() {\n const button = this._toggler[0];\n if (button) {\n button.setAttribute(\"aria-expanded\", String(this.menuIsOpen));\n }\n }\n\n @watch(\"disabled\", { waitUntilFirstUpdate: true })\n _handleDisabled() {\n const button = this._toggler[0];\n if (button) {\n if (this.disabled) {\n button.setAttribute(\"disabled\", \"true\");\n } else {\n button.hasAttribute(\"disabled\") && button.removeAttribute(\"disabled\");\n }\n }\n }\n\n render() {\n return html`\n <div class=\"dropdown\" @click=${this._handleClick}>\n <div class=\"toggler-container\" ${ref(this.myDropdown)}>\n <slot name=\"toggler\" @slotchange=${this._handleTogglerSlotChange}></slot>\n </div>\n <div class=\"dropdown-menu\" role=\"menu\" ${ref(this.menuRef)}>\n <slot id=\"default\" @click=${this.handleSelectSlot}></slot>\n </div>\n </div>\n `;\n }\n}\n\nexport default SgdsDropdown;\n"],"mappings":"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"}
1
+ {"version":3,"file":"sgds-dropdown.cjs.js","names":["DropdownListElement","dropdownStyle","dropdownMenuStyle","ref","property","queryAssignedElements","watch"],"sources":["../../../../src/components/Dropdown/sgds-dropdown.ts"],"sourcesContent":["import { html, PropertyValueMap } from \"lit\";\nimport { property, queryAssignedElements } from \"lit/decorators.js\";\nimport { ref } from \"lit/directives/ref.js\";\nimport { DropdownListElement } from \"../../base/dropdown-list-element\";\nimport { watch } from \"../../utils/watch\";\nimport dropdownMenuStyle from \"./dropdown-menu.css\";\nimport dropdownStyle from \"./dropdown.css\";\n\nexport type DropDirection = \"left\" | \"right\" | \"up\" | \"down\";\n\n/**\n * @summary `SgdsDropdown` toggles contextual overlays for displaying lists of links.\n * @slot default - slot for sgds-dropdown-item passed into dropdown's menu\n * @slot toggler - slot for the toggler that triggers the open and closing of menu, typically a button. Only pass in a single element into this slot\n *\n */\nexport class SgdsDropdown extends DropdownListElement {\n static styles = [...DropdownListElement.styles, dropdownStyle, dropdownMenuStyle];\n\n constructor() {\n super();\n this.menuRef = ref();\n }\n\n /** Controls auto-flipping of menu */\n @property({ type: Boolean, reflect: true, state: false })\n noFlip = false;\n\n /** When true, aligns right edge of menu with right edge of button */\n @property({ type: Boolean, reflect: true, state: false })\n menuAlignRight = false;\n\n /** The drop position of menu relative to the toggle button */\n @property({ type: String, reflect: true, state: false })\n drop: DropDirection = \"down\";\n\n /** Controls the close behaviour of dropdown menu. By default menu auto-closes when SgdsDropdownItem or area outside dropdown is clicked */\n @property({ type: String, reflect: true, state: false })\n close: \"outside\" | \"default\" | \"inside\" = \"default\";\n\n @queryAssignedElements({ slot: \"toggler\", flatten: true })\n private _toggler: Array<HTMLElement>;\n\n protected menuRef;\n\n private async _handleClick(e: MouseEvent) {\n if (this.disabled) return;\n\n const slottedToggler = this._toggler[0];\n\n if (!slottedToggler) {\n this.toggleMenu();\n return;\n }\n\n if (e.composedPath().includes(slottedToggler)) {\n this.toggleMenu();\n return;\n }\n\n // Click landed in the toggler-container's empty area (passed through pointer-events: none)\n if (!this.menuIsOpen) return;\n const menu = this.menuRef.value;\n if (menu && e.composedPath().includes(menu)) return;\n this.hideMenu();\n }\n\n private _handleCloseMenu() {\n const button = this._toggler[0];\n button?.focus({ preventScroll: true });\n }\n\n async connectedCallback() {\n super.connectedCallback();\n this.addEventListener(\"sgds-hide\", this._handleCloseMenu);\n }\n\n async disconnectedCallback() {\n this.removeEventListener(\"sgds-hide\", this._handleCloseMenu);\n }\n\n async firstUpdated(changedProperties: PropertyValueMap<this>) {\n super.firstUpdated(changedProperties);\n if (this.menuIsOpen) {\n await this.updateFloatingPosition();\n }\n this._handleDisabled();\n }\n\n private _handleTogglerSlotChange(e: Event) {\n const slot = e.target as HTMLSlotElement;\n const elements = slot.assignedElements({ flatten: true });\n const button = elements[0];\n if (button) {\n button.setAttribute(\"aria-haspopup\", \"menu\");\n button.setAttribute(\"aria-expanded\", String(this.menuIsOpen));\n }\n }\n\n @watch(\"menuIsOpen\")\n _handleMenuIsOpenChange() {\n const button = this._toggler[0];\n if (button) {\n button.setAttribute(\"aria-expanded\", String(this.menuIsOpen));\n }\n }\n\n @watch(\"disabled\", { waitUntilFirstUpdate: true })\n _handleDisabled() {\n const button = this._toggler[0];\n if (button) {\n if (this.disabled) {\n button.setAttribute(\"disabled\", \"true\");\n } else {\n button.hasAttribute(\"disabled\") && button.removeAttribute(\"disabled\");\n }\n }\n }\n\n render() {\n return html`\n <div class=\"dropdown\" @click=${this._handleClick}>\n <div class=\"toggler-container\" ${ref(this.myDropdown)}>\n <slot name=\"toggler\" @slotchange=${this._handleTogglerSlotChange}></slot>\n </div>\n <div class=\"dropdown-menu\" role=\"menu\" ${ref(this.menuRef)}>\n <slot id=\"default\" @click=${this.handleSelectSlot}></slot>\n </div>\n </div>\n `;\n }\n}\n\nexport default SgdsDropdown;\n"],"mappings":"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"}
@@ -47,7 +47,7 @@ var SgdsDropdown = class extends DropdownListElement {
47
47
  this.hideMenu();
48
48
  }
49
49
  _handleCloseMenu() {
50
- this._toggler[0]?.focus();
50
+ this._toggler[0]?.focus({ preventScroll: true });
51
51
  }
52
52
  async connectedCallback() {
53
53
  super.connectedCallback();