@duskmoon-dev/el-table 0.5.0 → 0.7.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.
@@ -1,8 +1,9 @@
1
1
  // src/el-dm-table.ts
2
- import { BaseElement as BaseElement2, css } from "@duskmoon-dev/el-core";
2
+ import { BaseElement as BaseElement2, css } from "@duskmoon-dev/el-base";
3
+ import { css as tableCSS } from "@duskmoon-dev/core/components/table";
3
4
 
4
5
  // src/el-dm-table-column.ts
5
- import { BaseElement } from "@duskmoon-dev/el-core";
6
+ import { BaseElement } from "@duskmoon-dev/el-base";
6
7
 
7
8
  class ElDmTableColumn extends BaseElement {
8
9
  static properties = {
@@ -57,6 +58,7 @@ var ICONS = {
57
58
  chevronFirst: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m17 18-6-6 6-6"/><path d="M7 6v12"/></svg>`,
58
59
  chevronLast: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m7 18 6-6-6-6"/><path d="M17 6v12"/></svg>`
59
60
  };
61
+ var coreStyles = tableCSS.replace(/@layer\s+components\s*\{/, "").replace(/\}\s*$/, "");
60
62
  var styles = css`
61
63
  :host {
62
64
  display: block;
@@ -67,6 +69,9 @@ var styles = css`
67
69
  display: none !important;
68
70
  }
69
71
 
72
+ /* Import core table styles */
73
+ ${coreStyles}
74
+
70
75
  /* Main wrapper */
71
76
  .table-wrapper {
72
77
  display: flex;
@@ -90,8 +95,8 @@ var styles = css`
90
95
  /* Container for scrolling */
91
96
  .table-container {
92
97
  overflow-x: auto;
93
- border: 1px solid var(--dm-color-outline, #e0e0e0);
94
- border-radius: var(--dm-radius-md, 0.5rem);
98
+ border: 1px solid var(--color-outline, #e0e0e0);
99
+ border-radius: var(--radius-md, 0.5rem);
95
100
  }
96
101
 
97
102
  /* Sticky header variant */
@@ -106,41 +111,28 @@ var styles = css`
106
111
  z-index: 1;
107
112
  }
108
113
 
109
- /* Base table */
110
- .table {
111
- width: 100%;
112
- border-collapse: collapse;
113
- font-size: 0.875rem;
114
- background-color: var(--dm-color-surface, #ffffff);
115
- }
116
-
117
- /* Header styles */
118
- .table-th {
119
- padding: 0.75rem 1rem;
120
- text-align: left;
121
- font-weight: 600;
122
- color: var(--dm-color-on-surface, #1a1a1a);
123
- background-color: var(--dm-color-surface-variant, #f5f5f5);
124
- border-bottom: 2px solid var(--dm-color-outline, #e0e0e0);
114
+ /* Web component specific: header nowrap */
115
+ .table-header-cell {
125
116
  white-space: nowrap;
126
117
  }
127
118
 
128
- .table-th.sortable {
119
+ /* Sortable header cells */
120
+ .table-header-cell.table-sortable {
129
121
  cursor: pointer;
130
122
  user-select: none;
131
123
  }
132
124
 
133
- .table-th.sortable:hover {
134
- background-color: var(--dm-color-surface-container, #ebebeb);
125
+ .table-header-cell.table-sortable:hover {
126
+ background-color: var(--color-surface-container-high, #ebebeb);
135
127
  }
136
128
 
137
- .table-th.sortable:focus-visible {
138
- outline: 2px solid var(--dm-color-primary, #6366f1);
129
+ .table-header-cell.table-sortable:focus-visible {
130
+ outline: 2px solid var(--color-primary, #6366f1);
139
131
  outline-offset: -2px;
140
132
  }
141
133
 
142
- .table-th.sorted {
143
- color: var(--dm-color-primary, #6366f1);
134
+ .table-header-cell.sorted {
135
+ color: var(--color-primary, #6366f1);
144
136
  }
145
137
 
146
138
  .th-content {
@@ -157,36 +149,25 @@ var styles = css`
157
149
  flex-shrink: 0;
158
150
  }
159
151
 
160
- .table-th.sorted .sort-icon {
152
+ .table-header-cell.sorted .sort-icon {
161
153
  opacity: 1;
162
154
  }
163
155
 
164
- /* Cell styles */
165
- .table-td {
166
- padding: 0.75rem 1rem;
167
- border-bottom: 1px solid var(--dm-color-outline-variant, #e8e8e8);
168
- color: var(--dm-color-on-surface, #1a1a1a);
169
- }
170
-
171
156
  /* Row styles */
172
157
  .table-row {
173
158
  transition: background-color 150ms ease;
174
159
  }
175
160
 
176
161
  :host([hoverable]) .table-row:hover {
177
- background-color: var(--dm-color-surface-variant, #f5f5f5);
162
+ background-color: var(--color-surface-container, #f5f5f5);
178
163
  }
179
164
 
180
- .table-row.selected {
181
- background-color: var(--dm-color-primary-container, #e8e8ff);
165
+ .table-row.table-row-selected {
166
+ background-color: color-mix(in srgb, var(--color-primary, #6366f1) 15%, transparent);
182
167
  }
183
168
 
184
- :host([hoverable]) .table-row.selected:hover {
185
- background-color: color-mix(
186
- in srgb,
187
- var(--dm-color-primary-container, #e8e8ff) 90%,
188
- var(--dm-color-primary, #6366f1)
189
- );
169
+ :host([hoverable]) .table-row.table-row-selected:hover {
170
+ background-color: color-mix(in srgb, var(--color-primary, #6366f1) 20%, transparent);
190
171
  }
191
172
 
192
173
  /* Selection column */
@@ -200,27 +181,27 @@ var styles = css`
200
181
  cursor: pointer;
201
182
  width: 18px;
202
183
  height: 18px;
203
- accent-color: var(--dm-color-primary, #6366f1);
184
+ accent-color: var(--color-primary, #6366f1);
204
185
  }
205
186
 
206
187
  /* Striped variant */
207
188
  :host([striped]) .table tbody tr:nth-child(even) {
208
- background-color: var(--dm-color-surface-variant, #fafafa);
189
+ background-color: var(--color-surface-container-low, #fafafa);
209
190
  }
210
191
 
211
- :host([striped]) .table tbody tr.selected:nth-child(even) {
212
- background-color: var(--dm-color-primary-container, #e8e8ff);
192
+ :host([striped]) .table tbody tr.table-row-selected:nth-child(even) {
193
+ background-color: color-mix(in srgb, var(--color-primary, #6366f1) 15%, transparent);
213
194
  }
214
195
 
215
196
  /* Bordered variant */
216
- :host([bordered]) .table-td,
217
- :host([bordered]) .table-th {
218
- border: 1px solid var(--dm-color-outline, #e0e0e0);
197
+ :host([bordered]) .table-cell,
198
+ :host([bordered]) .table-header-cell {
199
+ border: 1px solid var(--color-outline, #e0e0e0);
219
200
  }
220
201
 
221
202
  /* Compact variant */
222
- :host([compact]) .table-th,
223
- :host([compact]) .table-td {
203
+ :host([compact]) .table-header-cell,
204
+ :host([compact]) .table-cell {
224
205
  padding: 0.5rem 0.75rem;
225
206
  font-size: 0.8125rem;
226
207
  }
@@ -233,15 +214,15 @@ var styles = css`
233
214
  .loading-row td {
234
215
  padding: 3rem;
235
216
  text-align: center;
236
- color: var(--dm-color-on-surface-variant, #666);
217
+ color: var(--color-on-surface-variant, #666);
237
218
  }
238
219
 
239
220
  .loading-spinner {
240
221
  display: inline-block;
241
222
  width: 24px;
242
223
  height: 24px;
243
- border: 2px solid var(--dm-color-outline, #e0e0e0);
244
- border-top-color: var(--dm-color-primary, #6366f1);
224
+ border: 2px solid var(--color-outline, #e0e0e0);
225
+ border-top-color: var(--color-primary, #6366f1);
245
226
  border-radius: 50%;
246
227
  animation: spin 0.8s linear infinite;
247
228
  }
@@ -256,7 +237,7 @@ var styles = css`
256
237
  .empty-row td {
257
238
  padding: 3rem;
258
239
  text-align: center;
259
- color: var(--dm-color-on-surface-variant, #666);
240
+ color: var(--color-on-surface-variant, #666);
260
241
  }
261
242
 
262
243
  /* Pagination styles */
@@ -267,15 +248,15 @@ var styles = css`
267
248
  flex-wrap: wrap;
268
249
  gap: 1rem;
269
250
  padding: 0.75rem 1rem;
270
- border: 1px solid var(--dm-color-outline, #e0e0e0);
251
+ border: 1px solid var(--color-outline, #e0e0e0);
271
252
  border-top: none;
272
- border-radius: 0 0 var(--dm-radius-md, 0.5rem) var(--dm-radius-md, 0.5rem);
273
- background-color: var(--dm-color-surface-variant, #f5f5f5);
253
+ border-radius: 0 0 var(--radius-md, 0.5rem) var(--radius-md, 0.5rem);
254
+ background-color: var(--color-surface-container, #f5f5f5);
274
255
  font-size: 0.875rem;
275
256
  }
276
257
 
277
258
  .pagination-info {
278
- color: var(--dm-color-on-surface-variant, #666);
259
+ color: var(--color-on-surface-variant, #666);
279
260
  }
280
261
 
281
262
  .pagination-controls {
@@ -296,20 +277,20 @@ var styles = css`
296
277
  justify-content: center;
297
278
  width: 32px;
298
279
  height: 32px;
299
- border: 1px solid var(--dm-color-outline, #e0e0e0);
300
- border-radius: var(--dm-radius-sm, 0.25rem);
301
- background: var(--dm-color-surface, #ffffff);
280
+ border: 1px solid var(--color-outline, #e0e0e0);
281
+ border-radius: var(--radius-sm, 0.25rem);
282
+ background: var(--color-surface, #ffffff);
302
283
  cursor: pointer;
303
284
  transition: all 150ms ease;
304
- color: var(--dm-color-on-surface, #1a1a1a);
285
+ color: var(--color-on-surface, #1a1a1a);
305
286
  }
306
287
 
307
288
  .pagination-btn:hover:not(:disabled) {
308
- background: var(--dm-color-surface-container, #ebebeb);
289
+ background: var(--color-surface-container-high, #ebebeb);
309
290
  }
310
291
 
311
292
  .pagination-btn:focus-visible {
312
- outline: 2px solid var(--dm-color-primary, #6366f1);
293
+ outline: 2px solid var(--color-primary, #6366f1);
313
294
  outline-offset: 2px;
314
295
  }
315
296
 
@@ -320,22 +301,22 @@ var styles = css`
320
301
 
321
302
  .pagination-current {
322
303
  padding: 0 0.75rem;
323
- color: var(--dm-color-on-surface, #1a1a1a);
304
+ color: var(--color-on-surface, #1a1a1a);
324
305
  min-width: 100px;
325
306
  text-align: center;
326
307
  }
327
308
 
328
309
  .page-size-select {
329
310
  padding: 0.375rem 0.75rem;
330
- border: 1px solid var(--dm-color-outline, #e0e0e0);
331
- border-radius: var(--dm-radius-sm, 0.25rem);
332
- background: var(--dm-color-surface, #ffffff);
311
+ border: 1px solid var(--color-outline, #e0e0e0);
312
+ border-radius: var(--radius-sm, 0.25rem);
313
+ background: var(--color-surface, #ffffff);
333
314
  font-size: 0.875rem;
334
315
  cursor: pointer;
335
316
  }
336
317
 
337
318
  .page-size-select:focus-visible {
338
- outline: 2px solid var(--dm-color-primary, #6366f1);
319
+ outline: 2px solid var(--color-primary, #6366f1);
339
320
  outline-offset: 2px;
340
321
  }
341
322
 
@@ -406,7 +387,7 @@ class ElDmTable extends BaseElement2 {
406
387
  this.update();
407
388
  };
408
389
  _attachEventListeners() {
409
- this.shadowRoot?.querySelectorAll(".table-th.sortable").forEach((th) => {
390
+ this.shadowRoot?.querySelectorAll(".table-header-cell.table-sortable").forEach((th) => {
410
391
  th.addEventListener("click", this._handleHeaderClick);
411
392
  th.addEventListener("keydown", this._handleHeaderKeydown);
412
393
  });
@@ -671,7 +652,7 @@ class ElDmTable extends BaseElement2 {
671
652
  const sortIcon = isSorted ? this.sortDirection === "asc" ? ICONS.sortAsc : ICONS.sortDesc : ICONS.sort;
672
653
  return `
673
654
  <th
674
- class="table-th ${sortable ? "sortable" : ""} ${isSorted ? "sorted" : ""}"
655
+ class="table-header-cell ${sortable ? "table-sortable" : ""} ${isSorted ? "sorted" : ""}"
675
656
  part="th"
676
657
  data-column="${column.key}"
677
658
  style="text-align: ${column.align || "left"}; ${column.width ? `width: ${column.width};` : ""}"
@@ -687,12 +668,12 @@ class ElDmTable extends BaseElement2 {
687
668
  }
688
669
  _renderSelectAllCell() {
689
670
  if (this.selectionMode !== "multiple") {
690
- return '<th class="table-th select-cell" part="th"></th>';
671
+ return '<th class="table-header-cell select-cell" part="th"></th>';
691
672
  }
692
673
  const isAllSelected = this._isAllSelected();
693
674
  const isSomeSelected = this._isSomeSelected();
694
675
  return `
695
- <th class="table-th select-cell" part="th">
676
+ <th class="table-header-cell select-cell" part="th">
696
677
  <input
697
678
  type="checkbox"
698
679
  class="select-all"
@@ -707,7 +688,7 @@ class ElDmTable extends BaseElement2 {
707
688
  const isSelected = this._isRowSelected(row);
708
689
  const inputType = this.selectionMode === "single" ? "radio" : "checkbox";
709
690
  return `
710
- <td class="table-td select-cell" part="td">
691
+ <td class="table-cell select-cell" part="td">
711
692
  <input
712
693
  type="${inputType}"
713
694
  class="row-select"
@@ -724,7 +705,7 @@ class ElDmTable extends BaseElement2 {
724
705
  const showSelectionColumn = this.selectionMode !== "none";
725
706
  return `
726
707
  <tr
727
- class="table-row ${isSelected ? "selected" : ""}"
708
+ class="table-row ${isSelected ? "table-row-selected" : ""}"
728
709
  part="row"
729
710
  data-row-id="${row.id}"
730
711
  data-row-index="${index}"
@@ -733,7 +714,7 @@ class ElDmTable extends BaseElement2 {
733
714
  ${showSelectionColumn ? this._renderSelectCell(row) : ""}
734
715
  ${columns.map((col) => `
735
716
  <td
736
- class="table-td"
717
+ class="table-cell"
737
718
  part="td"
738
719
  style="text-align: ${col.align || "left"};"
739
720
  >
@@ -864,5 +845,5 @@ function register() {
864
845
  // src/register.ts
865
846
  register();
866
847
 
867
- //# debugId=9FF4F57CA7A1AFCF64756E2164756E21
848
+ //# debugId=E0D98BBF55CDEDA764756E2164756E21
868
849
  //# sourceMappingURL=register.js.map
@@ -2,12 +2,12 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/el-dm-table.ts", "../../src/el-dm-table-column.ts", "../../src/index.ts", "../../src/register.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * DuskMoon Table Element\n *\n * A full-featured data table with sorting, pagination, and row selection.\n *\n * @element el-dm-table\n *\n * @fires sort - When sort changes\n * @fires select - When selection changes\n * @fires page-change - When page changes\n * @fires row-click - When a row is clicked\n *\n * @slot header-actions - Actions above the table\n * @slot footer-actions - Actions below the table\n * @slot empty - Custom empty state content\n *\n * @csspart wrapper - Main wrapper container\n * @csspart container - Scrollable table container\n * @csspart table - The table element\n * @csspart thead - Table header\n * @csspart tbody - Table body\n * @csspart th - Header cell\n * @csspart td - Body cell\n * @csspart row - Body row\n * @csspart pagination - Pagination container\n */\n\nimport { BaseElement, css } from '@duskmoon-dev/el-core';\nimport type {\n TableColumn,\n TableRow,\n SortDirection,\n SelectionMode,\n TableSortEventDetail,\n TableSelectEventDetail,\n TablePageEventDetail,\n TableRowClickEventDetail,\n} from './types.js';\nimport { ElDmTableColumn } from './el-dm-table-column.js';\n\n// SVG Icons\nconst ICONS = {\n sortAsc: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 16 4 4 4-4\"/><path d=\"M7 20V4\"/><path d=\"M11 4h4\"/><path d=\"M11 8h7\"/><path d=\"M11 12h10\"/></svg>`,\n sortDesc: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 8 4-4 4 4\"/><path d=\"M7 4v16\"/><path d=\"M11 12h4\"/><path d=\"M11 16h7\"/><path d=\"M11 20h10\"/></svg>`,\n sort: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 16 4 4 4-4\"/><path d=\"M7 20V4\"/><path d=\"m21 8-4-4-4 4\"/><path d=\"M17 4v16\"/></svg>`,\n chevronLeft: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>`,\n chevronRight: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>`,\n chevronFirst: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m17 18-6-6 6-6\"/><path d=\"M7 6v12\"/></svg>`,\n chevronLast: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m7 18 6-6-6-6\"/><path d=\"M17 6v12\"/></svg>`,\n};\n\nconst styles = css`\n :host {\n display: block;\n font-family: inherit;\n }\n\n :host([hidden]) {\n display: none !important;\n }\n\n /* Main wrapper */\n .table-wrapper {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n /* Header/Footer action slots */\n .table-header-actions,\n .table-footer-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .table-header-actions:empty,\n .table-footer-actions:empty {\n display: none;\n }\n\n /* Container for scrolling */\n .table-container {\n overflow-x: auto;\n border: 1px solid var(--dm-color-outline, #e0e0e0);\n border-radius: var(--dm-radius-md, 0.5rem);\n }\n\n /* Sticky header variant */\n :host([sticky-header]) .table-container {\n max-height: var(--table-max-height, 400px);\n overflow-y: auto;\n }\n\n :host([sticky-header]) .table thead {\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n /* Base table */\n .table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.875rem;\n background-color: var(--dm-color-surface, #ffffff);\n }\n\n /* Header styles */\n .table-th {\n padding: 0.75rem 1rem;\n text-align: left;\n font-weight: 600;\n color: var(--dm-color-on-surface, #1a1a1a);\n background-color: var(--dm-color-surface-variant, #f5f5f5);\n border-bottom: 2px solid var(--dm-color-outline, #e0e0e0);\n white-space: nowrap;\n }\n\n .table-th.sortable {\n cursor: pointer;\n user-select: none;\n }\n\n .table-th.sortable:hover {\n background-color: var(--dm-color-surface-container, #ebebeb);\n }\n\n .table-th.sortable:focus-visible {\n outline: 2px solid var(--dm-color-primary, #6366f1);\n outline-offset: -2px;\n }\n\n .table-th.sorted {\n color: var(--dm-color-primary, #6366f1);\n }\n\n .th-content {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .sort-icon {\n display: flex;\n width: 1rem;\n height: 1rem;\n opacity: 0.5;\n flex-shrink: 0;\n }\n\n .table-th.sorted .sort-icon {\n opacity: 1;\n }\n\n /* Cell styles */\n .table-td {\n padding: 0.75rem 1rem;\n border-bottom: 1px solid var(--dm-color-outline-variant, #e8e8e8);\n color: var(--dm-color-on-surface, #1a1a1a);\n }\n\n /* Row styles */\n .table-row {\n transition: background-color 150ms ease;\n }\n\n :host([hoverable]) .table-row:hover {\n background-color: var(--dm-color-surface-variant, #f5f5f5);\n }\n\n .table-row.selected {\n background-color: var(--dm-color-primary-container, #e8e8ff);\n }\n\n :host([hoverable]) .table-row.selected:hover {\n background-color: color-mix(\n in srgb,\n var(--dm-color-primary-container, #e8e8ff) 90%,\n var(--dm-color-primary, #6366f1)\n );\n }\n\n /* Selection column */\n .select-cell {\n width: 48px;\n text-align: center;\n padding: 0.5rem;\n }\n\n .select-cell input {\n cursor: pointer;\n width: 18px;\n height: 18px;\n accent-color: var(--dm-color-primary, #6366f1);\n }\n\n /* Striped variant */\n :host([striped]) .table tbody tr:nth-child(even) {\n background-color: var(--dm-color-surface-variant, #fafafa);\n }\n\n :host([striped]) .table tbody tr.selected:nth-child(even) {\n background-color: var(--dm-color-primary-container, #e8e8ff);\n }\n\n /* Bordered variant */\n :host([bordered]) .table-td,\n :host([bordered]) .table-th {\n border: 1px solid var(--dm-color-outline, #e0e0e0);\n }\n\n /* Compact variant */\n :host([compact]) .table-th,\n :host([compact]) .table-td {\n padding: 0.5rem 0.75rem;\n font-size: 0.8125rem;\n }\n\n :host([compact]) .select-cell {\n padding: 0.375rem 0.5rem;\n }\n\n /* Loading state */\n .loading-row td {\n padding: 3rem;\n text-align: center;\n color: var(--dm-color-on-surface-variant, #666);\n }\n\n .loading-spinner {\n display: inline-block;\n width: 24px;\n height: 24px;\n border: 2px solid var(--dm-color-outline, #e0e0e0);\n border-top-color: var(--dm-color-primary, #6366f1);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n /* Empty state */\n .empty-row td {\n padding: 3rem;\n text-align: center;\n color: var(--dm-color-on-surface-variant, #666);\n }\n\n /* Pagination styles */\n .table-pagination {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 1rem;\n padding: 0.75rem 1rem;\n border: 1px solid var(--dm-color-outline, #e0e0e0);\n border-top: none;\n border-radius: 0 0 var(--dm-radius-md, 0.5rem) var(--dm-radius-md, 0.5rem);\n background-color: var(--dm-color-surface-variant, #f5f5f5);\n font-size: 0.875rem;\n }\n\n .pagination-info {\n color: var(--dm-color-on-surface-variant, #666);\n }\n\n .pagination-controls {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n\n .pagination-nav {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n\n .pagination-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid var(--dm-color-outline, #e0e0e0);\n border-radius: var(--dm-radius-sm, 0.25rem);\n background: var(--dm-color-surface, #ffffff);\n cursor: pointer;\n transition: all 150ms ease;\n color: var(--dm-color-on-surface, #1a1a1a);\n }\n\n .pagination-btn:hover:not(:disabled) {\n background: var(--dm-color-surface-container, #ebebeb);\n }\n\n .pagination-btn:focus-visible {\n outline: 2px solid var(--dm-color-primary, #6366f1);\n outline-offset: 2px;\n }\n\n .pagination-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .pagination-current {\n padding: 0 0.75rem;\n color: var(--dm-color-on-surface, #1a1a1a);\n min-width: 100px;\n text-align: center;\n }\n\n .page-size-select {\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--dm-color-outline, #e0e0e0);\n border-radius: var(--dm-radius-sm, 0.25rem);\n background: var(--dm-color-surface, #ffffff);\n font-size: 0.875rem;\n cursor: pointer;\n }\n\n .page-size-select:focus-visible {\n outline: 2px solid var(--dm-color-primary, #6366f1);\n outline-offset: 2px;\n }\n\n /* Clickable rows */\n :host([selection-mode='single']) .table-row,\n :host([selection-mode='multiple']) .table-row {\n cursor: pointer;\n }\n`;\n\nexport class ElDmTable extends BaseElement {\n static properties = {\n // Data\n columns: { type: Array, attribute: false as const },\n data: { type: Array, attribute: false as const },\n\n // Sorting\n sortColumn: { type: String, reflect: true, attribute: 'sort-column' },\n sortDirection: {\n type: String,\n reflect: true,\n attribute: 'sort-direction',\n default: 'asc',\n },\n\n // Pagination\n paginated: { type: Boolean, reflect: true },\n page: { type: Number, reflect: true, default: 1 },\n pageSize: { type: Number, reflect: true, attribute: 'page-size', default: 10 },\n pageSizeOptions: { type: Array, attribute: false as const },\n\n // Selection\n selectionMode: {\n type: String,\n reflect: true,\n attribute: 'selection-mode',\n default: 'none',\n },\n selectedIds: { type: Array, attribute: false as const },\n\n // Display options\n striped: { type: Boolean, reflect: true },\n bordered: { type: Boolean, reflect: true },\n hoverable: { type: Boolean, reflect: true, default: true },\n compact: { type: Boolean, reflect: true },\n stickyHeader: { type: Boolean, reflect: true, attribute: 'sticky-header' },\n\n // State\n loading: { type: Boolean, reflect: true },\n emptyMessage: {\n type: String,\n reflect: true,\n attribute: 'empty-message',\n default: 'No data available',\n },\n };\n\n // Type declarations\n declare columns: TableColumn[];\n declare data: TableRow[];\n declare sortColumn: string;\n declare sortDirection: SortDirection;\n declare paginated: boolean;\n declare page: number;\n declare pageSize: number;\n declare pageSizeOptions: number[];\n declare selectionMode: SelectionMode;\n declare selectedIds: (string | number)[];\n declare striped: boolean;\n declare bordered: boolean;\n declare hoverable: boolean;\n declare compact: boolean;\n declare stickyHeader: boolean;\n declare loading: boolean;\n declare emptyMessage: string;\n\n // Private state\n private _internalSelectedIds: Set<string | number> = new Set();\n\n constructor() {\n super();\n this.attachStyles(styles);\n this.columns = [];\n this.data = [];\n this.selectedIds = [];\n this.pageSizeOptions = [5, 10, 25, 50];\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // Listen for child column changes\n this.addEventListener('table-column-change', this._handleColumnChange);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('table-column-change', this._handleColumnChange);\n }\n\n protected update(): void {\n super.update();\n this._attachEventListeners();\n }\n\n private _handleColumnChange = (): void => {\n // Re-render when child columns change\n this.update();\n };\n\n private _attachEventListeners(): void {\n // Sort handlers\n this.shadowRoot?.querySelectorAll('.table-th.sortable').forEach((th) => {\n th.addEventListener('click', this._handleHeaderClick);\n th.addEventListener('keydown', this._handleHeaderKeydown);\n });\n\n // Row click handlers\n this.shadowRoot?.querySelectorAll('.table-row').forEach((row) => {\n row.addEventListener('click', this._handleRowClick);\n });\n\n // Selection handlers\n this.shadowRoot?.querySelectorAll('.row-select').forEach((input) => {\n input.addEventListener('change', this._handleRowSelectChange);\n });\n\n // Select all handler\n const selectAll = this.shadowRoot?.querySelector('.select-all');\n selectAll?.addEventListener('change', this._handleSelectAllChange);\n\n // Pagination handlers\n this.shadowRoot?.querySelectorAll('.pagination-btn').forEach((btn) => {\n btn.addEventListener('click', this._handlePaginationClick);\n });\n\n const pageSizeSelect = this.shadowRoot?.querySelector('.page-size-select');\n pageSizeSelect?.addEventListener('change', this._handlePageSizeChange);\n }\n\n // ============ Sorting ============\n\n private _handleHeaderClick = (e: Event): void => {\n const th = (e.currentTarget as HTMLElement).closest('[data-column]');\n const column = th?.getAttribute('data-column');\n if (column) {\n this.sort(column);\n }\n };\n\n private _handleHeaderKeydown = (e: Event): void => {\n const keyEvent = e as KeyboardEvent;\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n keyEvent.preventDefault();\n this._handleHeaderClick(e);\n }\n };\n\n /** Sort by column - toggles direction if same column */\n sort(column: string, direction?: SortDirection): void {\n if (direction) {\n this.sortColumn = column;\n this.sortDirection = direction;\n } else if (this.sortColumn === column) {\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this.sortColumn = column;\n this.sortDirection = 'asc';\n }\n\n this.emit<TableSortEventDetail>('sort', {\n column: this.sortColumn,\n direction: this.sortDirection,\n });\n }\n\n private _sortData(data: TableRow[]): TableRow[] {\n if (!this.sortColumn) return data;\n\n return [...data].sort((a, b) => {\n const aVal = a[this.sortColumn];\n const bVal = b[this.sortColumn];\n\n let comparison = 0;\n if (aVal === null || aVal === undefined) comparison = 1;\n else if (bVal === null || bVal === undefined) comparison = -1;\n else if (typeof aVal === 'string' && typeof bVal === 'string') {\n comparison = aVal.localeCompare(bVal);\n } else if (typeof aVal === 'number' && typeof bVal === 'number') {\n comparison = aVal - bVal;\n } else {\n comparison = String(aVal).localeCompare(String(bVal));\n }\n\n return this.sortDirection === 'desc' ? -comparison : comparison;\n });\n }\n\n // ============ Pagination ============\n\n private _handlePaginationClick = (e: Event): void => {\n const btn = e.currentTarget as HTMLElement;\n const action = btn.getAttribute('data-action');\n\n switch (action) {\n case 'first':\n this.goToPage(1);\n break;\n case 'prev':\n this.goToPage(this.page - 1);\n break;\n case 'next':\n this.goToPage(this.page + 1);\n break;\n case 'last':\n this.goToPage(this._getTotalPages());\n break;\n }\n };\n\n private _handlePageSizeChange = (e: Event): void => {\n const select = e.target as HTMLSelectElement;\n const newPageSize = parseInt(select.value, 10);\n this.pageSize = newPageSize;\n this.page = 1; // Reset to first page\n\n this.emit<TablePageEventDetail>('page-change', {\n page: this.page,\n pageSize: this.pageSize,\n });\n };\n\n /** Go to specific page */\n goToPage(page: number): void {\n const totalPages = this._getTotalPages();\n const newPage = Math.max(1, Math.min(page, totalPages));\n\n if (newPage !== this.page) {\n this.page = newPage;\n this.emit<TablePageEventDetail>('page-change', {\n page: this.page,\n pageSize: this.pageSize,\n });\n }\n }\n\n private _getTotalPages(): number {\n return Math.max(1, Math.ceil(this.data.length / this.pageSize));\n }\n\n private _paginateData(data: TableRow[]): TableRow[] {\n if (!this.paginated) return data;\n\n const start = (this.page - 1) * this.pageSize;\n const end = start + this.pageSize;\n return data.slice(start, end);\n }\n\n private _getStartRow(): number {\n if (this.data.length === 0) return 0;\n return (this.page - 1) * this.pageSize + 1;\n }\n\n private _getEndRow(): number {\n return Math.min(this.page * this.pageSize, this.data.length);\n }\n\n // ============ Selection ============\n\n private _handleRowClick = (e: Event): void => {\n const row = (e.target as HTMLElement).closest('.table-row');\n if (!row) return;\n\n // Don't handle if clicking on checkbox/radio\n if ((e.target as HTMLElement).closest('.select-cell')) return;\n\n const rowId = row.getAttribute('data-row-id');\n const rowIndex = parseInt(row.getAttribute('data-row-index') || '0', 10);\n\n if (rowId !== null) {\n const id = this._parseId(rowId);\n const rowData = this.data.find((r) => r.id === id);\n\n if (rowData) {\n this.emit<TableRowClickEventDetail>('row-click', {\n row: rowData,\n rowIndex,\n });\n\n // Toggle selection on row click\n if (this.selectionMode !== 'none') {\n this.toggleRowSelection(id);\n }\n }\n }\n };\n\n private _handleRowSelectChange = (e: Event): void => {\n const input = e.target as HTMLInputElement;\n const rowId = input.getAttribute('data-row-id');\n\n if (rowId !== null) {\n const id = this._parseId(rowId);\n if (input.checked) {\n this.selectRow(id);\n } else {\n this.deselectRow(id);\n }\n }\n };\n\n private _handleSelectAllChange = (e: Event): void => {\n const input = e.target as HTMLInputElement;\n if (input.checked) {\n this.selectAll();\n } else {\n this.deselectAll();\n }\n };\n\n private _parseId(idStr: string): string | number {\n const num = Number(idStr);\n return isNaN(num) ? idStr : num;\n }\n\n /** Select a row by ID */\n selectRow(id: string | number): void {\n if (this.selectionMode === 'single') {\n this._internalSelectedIds.clear();\n }\n this._internalSelectedIds.add(id);\n this._emitSelectionChange();\n }\n\n /** Deselect a row by ID */\n deselectRow(id: string | number): void {\n this._internalSelectedIds.delete(id);\n this._emitSelectionChange();\n }\n\n /** Toggle row selection */\n toggleRowSelection(id: string | number): void {\n if (this._internalSelectedIds.has(id)) {\n this.deselectRow(id);\n } else {\n this.selectRow(id);\n }\n }\n\n /** Select all visible rows */\n selectAll(): void {\n const visibleData = this._getProcessedData();\n visibleData.forEach((row) => this._internalSelectedIds.add(row.id));\n this._emitSelectionChange();\n }\n\n /** Deselect all rows */\n deselectAll(): void {\n this._internalSelectedIds.clear();\n this._emitSelectionChange();\n }\n\n /** Get currently selected rows */\n getSelectedRows(): TableRow[] {\n return this.data.filter((row) => this._internalSelectedIds.has(row.id));\n }\n\n private _emitSelectionChange(): void {\n this.selectedIds = Array.from(this._internalSelectedIds);\n this.emit<TableSelectEventDetail>('select', {\n selectedIds: this.selectedIds,\n selectedRows: this.getSelectedRows(),\n });\n this.update();\n }\n\n private _isRowSelected(row: TableRow): boolean {\n return this._internalSelectedIds.has(row.id);\n }\n\n private _isAllSelected(): boolean {\n const visibleData = this._getProcessedData();\n if (visibleData.length === 0) return false;\n return visibleData.every((row) => this._internalSelectedIds.has(row.id));\n }\n\n private _isSomeSelected(): boolean {\n const visibleData = this._getProcessedData();\n return (\n visibleData.some((row) => this._internalSelectedIds.has(row.id)) && !this._isAllSelected()\n );\n }\n\n // ============ Data Processing ============\n\n private _getEffectiveColumns(): TableColumn[] {\n // First check for columns prop\n if (this.columns && this.columns.length > 0) {\n return this.columns.filter((col) => !col.hidden);\n }\n\n // Fall back to child <el-dm-table-column> elements\n const columnElements = this.querySelectorAll('el-dm-table-column');\n const cols: TableColumn[] = [];\n\n columnElements.forEach((el) => {\n if (el instanceof ElDmTableColumn) {\n const colDef = el.toColumnDef();\n if (!colDef.hidden) {\n cols.push(colDef);\n }\n }\n });\n\n return cols;\n }\n\n private _getProcessedData(): TableRow[] {\n let result = [...(this.data || [])];\n result = this._sortData(result);\n result = this._paginateData(result);\n return result;\n }\n\n /** Get visible (processed) data */\n getVisibleData(): TableRow[] {\n return this._getProcessedData();\n }\n\n /** Refresh the table */\n refresh(): void {\n this.update();\n }\n\n // ============ Rendering ============\n\n private _formatCellValue(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n if (value instanceof Date) return value.toLocaleDateString();\n return String(value);\n }\n\n private _renderHeaderCell(column: TableColumn): string {\n const sortable = column.sortable;\n const isSorted = this.sortColumn === column.key;\n const sortIcon = isSorted\n ? this.sortDirection === 'asc'\n ? ICONS.sortAsc\n : ICONS.sortDesc\n : ICONS.sort;\n\n return `\n <th\n class=\"table-th ${sortable ? 'sortable' : ''} ${isSorted ? 'sorted' : ''}\"\n part=\"th\"\n data-column=\"${column.key}\"\n style=\"text-align: ${column.align || 'left'}; ${column.width ? `width: ${column.width};` : ''}\"\n scope=\"col\"\n ${sortable ? `role=\"columnheader\" aria-sort=\"${isSorted ? (this.sortDirection === 'asc' ? 'ascending' : 'descending') : 'none'}\" tabindex=\"0\"` : ''}\n >\n <span class=\"th-content\">\n <span>${column.label}</span>\n ${sortable ? `<span class=\"sort-icon\">${sortIcon}</span>` : ''}\n </span>\n </th>\n `;\n }\n\n private _renderSelectAllCell(): string {\n if (this.selectionMode !== 'multiple') {\n return '<th class=\"table-th select-cell\" part=\"th\"></th>';\n }\n\n const isAllSelected = this._isAllSelected();\n const isSomeSelected = this._isSomeSelected();\n\n return `\n <th class=\"table-th select-cell\" part=\"th\">\n <input\n type=\"checkbox\"\n class=\"select-all\"\n ${isAllSelected ? 'checked' : ''}\n ${isSomeSelected ? 'data-indeterminate=\"true\"' : ''}\n aria-label=\"Select all rows\"\n />\n </th>\n `;\n }\n\n private _renderSelectCell(row: TableRow): string {\n const isSelected = this._isRowSelected(row);\n const inputType = this.selectionMode === 'single' ? 'radio' : 'checkbox';\n\n return `\n <td class=\"table-td select-cell\" part=\"td\">\n <input\n type=\"${inputType}\"\n class=\"row-select\"\n name=\"table-selection\"\n data-row-id=\"${row.id}\"\n ${isSelected ? 'checked' : ''}\n aria-label=\"Select row\"\n />\n </td>\n `;\n }\n\n private _renderDataRow(row: TableRow, index: number, columns: TableColumn[]): string {\n const isSelected = this._isRowSelected(row);\n const showSelectionColumn = this.selectionMode !== 'none';\n\n return `\n <tr\n class=\"table-row ${isSelected ? 'selected' : ''}\"\n part=\"row\"\n data-row-id=\"${row.id}\"\n data-row-index=\"${index}\"\n ${isSelected ? 'aria-selected=\"true\"' : ''}\n >\n ${showSelectionColumn ? this._renderSelectCell(row) : ''}\n ${columns\n .map(\n (col) => `\n <td\n class=\"table-td\"\n part=\"td\"\n style=\"text-align: ${col.align || 'left'};\"\n >\n ${this._formatCellValue(row[col.key])}\n </td>\n `,\n )\n .join('')}\n </tr>\n `;\n }\n\n private _renderLoadingRow(colCount: number): string {\n const totalCols = this.selectionMode !== 'none' ? colCount + 1 : colCount;\n return `\n <tr class=\"loading-row\">\n <td colspan=\"${totalCols}\">\n <div class=\"loading-spinner\"></div>\n <div>Loading...</div>\n </td>\n </tr>\n `;\n }\n\n private _renderEmptyRow(colCount: number): string {\n const totalCols = this.selectionMode !== 'none' ? colCount + 1 : colCount;\n return `\n <tr class=\"empty-row\">\n <td colspan=\"${totalCols}\">\n <slot name=\"empty\">${this.emptyMessage}</slot>\n </td>\n </tr>\n `;\n }\n\n private _renderPagination(): string {\n const totalPages = this._getTotalPages();\n const showPageSizeSelect = this.pageSizeOptions && this.pageSizeOptions.length > 0;\n\n return `\n <div class=\"table-pagination\" part=\"pagination\">\n <div class=\"pagination-info\">\n Showing ${this._getStartRow()} to ${this._getEndRow()} of ${this.data.length} entries\n </div>\n <div class=\"pagination-controls\">\n ${\n showPageSizeSelect\n ? `\n <select class=\"page-size-select\" aria-label=\"Rows per page\">\n ${this.pageSizeOptions\n .map(\n (size) => `\n <option value=\"${size}\" ${size === this.pageSize ? 'selected' : ''}>\n ${size} / page\n </option>\n `,\n )\n .join('')}\n </select>\n `\n : ''\n }\n <div class=\"pagination-nav\">\n <button\n class=\"pagination-btn\"\n data-action=\"first\"\n ${this.page <= 1 ? 'disabled' : ''}\n aria-label=\"First page\"\n >${ICONS.chevronFirst}</button>\n <button\n class=\"pagination-btn\"\n data-action=\"prev\"\n ${this.page <= 1 ? 'disabled' : ''}\n aria-label=\"Previous page\"\n >${ICONS.chevronLeft}</button>\n <span class=\"pagination-current\">\n Page ${this.page} of ${totalPages}\n </span>\n <button\n class=\"pagination-btn\"\n data-action=\"next\"\n ${this.page >= totalPages ? 'disabled' : ''}\n aria-label=\"Next page\"\n >${ICONS.chevronRight}</button>\n <button\n class=\"pagination-btn\"\n data-action=\"last\"\n ${this.page >= totalPages ? 'disabled' : ''}\n aria-label=\"Last page\"\n >${ICONS.chevronLast}</button>\n </div>\n </div>\n </div>\n `;\n }\n\n protected render(): string {\n const columns = this._getEffectiveColumns();\n const processedData = this._getProcessedData();\n const showSelectionColumn = this.selectionMode !== 'none';\n\n return `\n <div class=\"table-wrapper\" part=\"wrapper\">\n <div class=\"table-header-actions\" part=\"header-actions\">\n <slot name=\"header-actions\"></slot>\n </div>\n\n <div class=\"table-container\" part=\"container\">\n <table class=\"table\" part=\"table\" role=\"grid\" aria-busy=\"${this.loading}\">\n <thead part=\"thead\">\n <tr part=\"header-row\">\n ${showSelectionColumn ? this._renderSelectAllCell() : ''}\n ${columns.map((col) => this._renderHeaderCell(col)).join('')}\n </tr>\n </thead>\n <tbody part=\"tbody\">\n ${this.loading ? this._renderLoadingRow(columns.length) : ''}\n ${!this.loading && processedData.length === 0 ? this._renderEmptyRow(columns.length) : ''}\n ${!this.loading ? processedData.map((row, idx) => this._renderDataRow(row, idx, columns)).join('') : ''}\n </tbody>\n </table>\n </div>\n\n ${this.paginated ? this._renderPagination() : ''}\n\n <div class=\"table-footer-actions\" part=\"footer-actions\">\n <slot name=\"footer-actions\"></slot>\n </div>\n </div>\n `;\n }\n}\n\nexport function registerTable(): void {\n if (!customElements.get('el-dm-table')) {\n customElements.define('el-dm-table', ElDmTable);\n }\n}\n",
6
- "/**\n * DuskMoon Table Column Element\n *\n * Declarative column definition for el-dm-table.\n *\n * @element el-dm-table-column\n *\n * @attr {string} key - Column key for data mapping (required)\n * @attr {string} label - Column header label\n * @attr {boolean} sortable - Whether column is sortable\n * @attr {string} width - Column width (CSS value)\n * @attr {string} align - Text alignment: left, center, right\n * @attr {boolean} hidden - Whether column is hidden\n */\n\nimport { BaseElement } from '@duskmoon-dev/el-core';\nimport type { TableColumn } from './types.js';\n\nexport class ElDmTableColumn extends BaseElement {\n static properties = {\n key: { type: String, reflect: true },\n label: { type: String, reflect: true },\n sortable: { type: Boolean, reflect: true },\n width: { type: String, reflect: true },\n align: { type: String, reflect: true, default: 'left' },\n hidden: { type: Boolean, reflect: true },\n };\n\n declare key: string;\n declare label: string;\n declare sortable: boolean;\n declare width: string;\n declare align: 'left' | 'center' | 'right';\n declare hidden: boolean;\n\n connectedCallback(): void {\n super.connectedCallback();\n // Notify parent table that columns changed\n this._notifyParent();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n // Notify parent table that columns changed\n this._notifyParent();\n }\n\n private _notifyParent(): void {\n this.dispatchEvent(\n new CustomEvent('table-column-change', {\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /** Convert to TableColumn interface */\n toColumnDef(): TableColumn {\n return {\n key: this.key,\n label: this.label || this.key || '',\n sortable: this.sortable || false,\n width: this.width,\n align: this.align || 'left',\n hidden: this.hidden || false,\n };\n }\n\n protected render(): string {\n // Hidden element - no visual output, just holds data\n return `<slot></slot>`;\n }\n}\n\nexport function registerTableColumn(): void {\n if (!customElements.get('el-dm-table-column')) {\n customElements.define('el-dm-table-column', ElDmTableColumn);\n }\n}\n",
5
+ "/**\n * DuskMoon Table Element\n *\n * A full-featured data table with sorting, pagination, and row selection.\n * Uses styles from @duskmoon-dev/core for consistent theming.\n *\n * @element el-dm-table\n *\n * @fires sort - When sort changes\n * @fires select - When selection changes\n * @fires page-change - When page changes\n * @fires row-click - When a row is clicked\n *\n * @slot header-actions - Actions above the table\n * @slot footer-actions - Actions below the table\n * @slot empty - Custom empty state content\n *\n * @csspart wrapper - Main wrapper container\n * @csspart container - Scrollable table container\n * @csspart table - The table element\n * @csspart thead - Table header\n * @csspart tbody - Table body\n * @csspart th - Header cell\n * @csspart td - Body cell\n * @csspart row - Body row\n * @csspart pagination - Pagination container\n */\n\nimport { BaseElement, css } from '@duskmoon-dev/el-base';\nimport { css as tableCSS } from '@duskmoon-dev/core/components/table';\nimport type {\n TableColumn,\n TableRow,\n SortDirection,\n SelectionMode,\n TableSortEventDetail,\n TableSelectEventDetail,\n TablePageEventDetail,\n TableRowClickEventDetail,\n} from './types.js';\nimport { ElDmTableColumn } from './el-dm-table-column.js';\n\n// SVG Icons\nconst ICONS = {\n sortAsc: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 16 4 4 4-4\"/><path d=\"M7 20V4\"/><path d=\"M11 4h4\"/><path d=\"M11 8h7\"/><path d=\"M11 12h10\"/></svg>`,\n sortDesc: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 8 4-4 4 4\"/><path d=\"M7 4v16\"/><path d=\"M11 12h4\"/><path d=\"M11 16h7\"/><path d=\"M11 20h10\"/></svg>`,\n sort: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 16 4 4 4-4\"/><path d=\"M7 20V4\"/><path d=\"m21 8-4-4-4 4\"/><path d=\"M17 4v16\"/></svg>`,\n chevronLeft: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>`,\n chevronRight: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>`,\n chevronFirst: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m17 18-6-6 6-6\"/><path d=\"M7 6v12\"/></svg>`,\n chevronLast: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m7 18 6-6-6-6\"/><path d=\"M17 6v12\"/></svg>`,\n};\n\n// Strip @layer wrapper for Shadow DOM compatibility\nconst coreStyles = tableCSS.replace(/@layer\\s+components\\s*\\{/, '').replace(/\\}\\s*$/, '');\n\nconst styles = css`\n :host {\n display: block;\n font-family: inherit;\n }\n\n :host([hidden]) {\n display: none !important;\n }\n\n /* Import core table styles */\n ${coreStyles}\n\n /* Main wrapper */\n .table-wrapper {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n /* Header/Footer action slots */\n .table-header-actions,\n .table-footer-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .table-header-actions:empty,\n .table-footer-actions:empty {\n display: none;\n }\n\n /* Container for scrolling */\n .table-container {\n overflow-x: auto;\n border: 1px solid var(--color-outline, #e0e0e0);\n border-radius: var(--radius-md, 0.5rem);\n }\n\n /* Sticky header variant */\n :host([sticky-header]) .table-container {\n max-height: var(--table-max-height, 400px);\n overflow-y: auto;\n }\n\n :host([sticky-header]) .table thead {\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n /* Web component specific: header nowrap */\n .table-header-cell {\n white-space: nowrap;\n }\n\n /* Sortable header cells */\n .table-header-cell.table-sortable {\n cursor: pointer;\n user-select: none;\n }\n\n .table-header-cell.table-sortable:hover {\n background-color: var(--color-surface-container-high, #ebebeb);\n }\n\n .table-header-cell.table-sortable:focus-visible {\n outline: 2px solid var(--color-primary, #6366f1);\n outline-offset: -2px;\n }\n\n .table-header-cell.sorted {\n color: var(--color-primary, #6366f1);\n }\n\n .th-content {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .sort-icon {\n display: flex;\n width: 1rem;\n height: 1rem;\n opacity: 0.5;\n flex-shrink: 0;\n }\n\n .table-header-cell.sorted .sort-icon {\n opacity: 1;\n }\n\n /* Row styles */\n .table-row {\n transition: background-color 150ms ease;\n }\n\n :host([hoverable]) .table-row:hover {\n background-color: var(--color-surface-container, #f5f5f5);\n }\n\n .table-row.table-row-selected {\n background-color: color-mix(in srgb, var(--color-primary, #6366f1) 15%, transparent);\n }\n\n :host([hoverable]) .table-row.table-row-selected:hover {\n background-color: color-mix(in srgb, var(--color-primary, #6366f1) 20%, transparent);\n }\n\n /* Selection column */\n .select-cell {\n width: 48px;\n text-align: center;\n padding: 0.5rem;\n }\n\n .select-cell input {\n cursor: pointer;\n width: 18px;\n height: 18px;\n accent-color: var(--color-primary, #6366f1);\n }\n\n /* Striped variant */\n :host([striped]) .table tbody tr:nth-child(even) {\n background-color: var(--color-surface-container-low, #fafafa);\n }\n\n :host([striped]) .table tbody tr.table-row-selected:nth-child(even) {\n background-color: color-mix(in srgb, var(--color-primary, #6366f1) 15%, transparent);\n }\n\n /* Bordered variant */\n :host([bordered]) .table-cell,\n :host([bordered]) .table-header-cell {\n border: 1px solid var(--color-outline, #e0e0e0);\n }\n\n /* Compact variant */\n :host([compact]) .table-header-cell,\n :host([compact]) .table-cell {\n padding: 0.5rem 0.75rem;\n font-size: 0.8125rem;\n }\n\n :host([compact]) .select-cell {\n padding: 0.375rem 0.5rem;\n }\n\n /* Loading state */\n .loading-row td {\n padding: 3rem;\n text-align: center;\n color: var(--color-on-surface-variant, #666);\n }\n\n .loading-spinner {\n display: inline-block;\n width: 24px;\n height: 24px;\n border: 2px solid var(--color-outline, #e0e0e0);\n border-top-color: var(--color-primary, #6366f1);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n /* Empty state */\n .empty-row td {\n padding: 3rem;\n text-align: center;\n color: var(--color-on-surface-variant, #666);\n }\n\n /* Pagination styles */\n .table-pagination {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 1rem;\n padding: 0.75rem 1rem;\n border: 1px solid var(--color-outline, #e0e0e0);\n border-top: none;\n border-radius: 0 0 var(--radius-md, 0.5rem) var(--radius-md, 0.5rem);\n background-color: var(--color-surface-container, #f5f5f5);\n font-size: 0.875rem;\n }\n\n .pagination-info {\n color: var(--color-on-surface-variant, #666);\n }\n\n .pagination-controls {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n\n .pagination-nav {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n\n .pagination-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid var(--color-outline, #e0e0e0);\n border-radius: var(--radius-sm, 0.25rem);\n background: var(--color-surface, #ffffff);\n cursor: pointer;\n transition: all 150ms ease;\n color: var(--color-on-surface, #1a1a1a);\n }\n\n .pagination-btn:hover:not(:disabled) {\n background: var(--color-surface-container-high, #ebebeb);\n }\n\n .pagination-btn:focus-visible {\n outline: 2px solid var(--color-primary, #6366f1);\n outline-offset: 2px;\n }\n\n .pagination-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .pagination-current {\n padding: 0 0.75rem;\n color: var(--color-on-surface, #1a1a1a);\n min-width: 100px;\n text-align: center;\n }\n\n .page-size-select {\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--color-outline, #e0e0e0);\n border-radius: var(--radius-sm, 0.25rem);\n background: var(--color-surface, #ffffff);\n font-size: 0.875rem;\n cursor: pointer;\n }\n\n .page-size-select:focus-visible {\n outline: 2px solid var(--color-primary, #6366f1);\n outline-offset: 2px;\n }\n\n /* Clickable rows */\n :host([selection-mode='single']) .table-row,\n :host([selection-mode='multiple']) .table-row {\n cursor: pointer;\n }\n`;\n\nexport class ElDmTable extends BaseElement {\n static properties = {\n // Data\n columns: { type: Array, attribute: false as const },\n data: { type: Array, attribute: false as const },\n\n // Sorting\n sortColumn: { type: String, reflect: true, attribute: 'sort-column' },\n sortDirection: {\n type: String,\n reflect: true,\n attribute: 'sort-direction',\n default: 'asc',\n },\n\n // Pagination\n paginated: { type: Boolean, reflect: true },\n page: { type: Number, reflect: true, default: 1 },\n pageSize: { type: Number, reflect: true, attribute: 'page-size', default: 10 },\n pageSizeOptions: { type: Array, attribute: false as const },\n\n // Selection\n selectionMode: {\n type: String,\n reflect: true,\n attribute: 'selection-mode',\n default: 'none',\n },\n selectedIds: { type: Array, attribute: false as const },\n\n // Display options\n striped: { type: Boolean, reflect: true },\n bordered: { type: Boolean, reflect: true },\n hoverable: { type: Boolean, reflect: true, default: true },\n compact: { type: Boolean, reflect: true },\n stickyHeader: { type: Boolean, reflect: true, attribute: 'sticky-header' },\n\n // State\n loading: { type: Boolean, reflect: true },\n emptyMessage: {\n type: String,\n reflect: true,\n attribute: 'empty-message',\n default: 'No data available',\n },\n };\n\n // Type declarations\n declare columns: TableColumn[];\n declare data: TableRow[];\n declare sortColumn: string;\n declare sortDirection: SortDirection;\n declare paginated: boolean;\n declare page: number;\n declare pageSize: number;\n declare pageSizeOptions: number[];\n declare selectionMode: SelectionMode;\n declare selectedIds: (string | number)[];\n declare striped: boolean;\n declare bordered: boolean;\n declare hoverable: boolean;\n declare compact: boolean;\n declare stickyHeader: boolean;\n declare loading: boolean;\n declare emptyMessage: string;\n\n // Private state\n private _internalSelectedIds: Set<string | number> = new Set();\n\n constructor() {\n super();\n this.attachStyles(styles);\n this.columns = [];\n this.data = [];\n this.selectedIds = [];\n this.pageSizeOptions = [5, 10, 25, 50];\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // Listen for child column changes\n this.addEventListener('table-column-change', this._handleColumnChange);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('table-column-change', this._handleColumnChange);\n }\n\n protected update(): void {\n super.update();\n this._attachEventListeners();\n }\n\n private _handleColumnChange = (): void => {\n // Re-render when child columns change\n this.update();\n };\n\n private _attachEventListeners(): void {\n // Sort handlers\n this.shadowRoot?.querySelectorAll('.table-header-cell.table-sortable').forEach((th) => {\n th.addEventListener('click', this._handleHeaderClick);\n th.addEventListener('keydown', this._handleHeaderKeydown);\n });\n\n // Row click handlers\n this.shadowRoot?.querySelectorAll('.table-row').forEach((row) => {\n row.addEventListener('click', this._handleRowClick);\n });\n\n // Selection handlers\n this.shadowRoot?.querySelectorAll('.row-select').forEach((input) => {\n input.addEventListener('change', this._handleRowSelectChange);\n });\n\n // Select all handler\n const selectAll = this.shadowRoot?.querySelector('.select-all');\n selectAll?.addEventListener('change', this._handleSelectAllChange);\n\n // Pagination handlers\n this.shadowRoot?.querySelectorAll('.pagination-btn').forEach((btn) => {\n btn.addEventListener('click', this._handlePaginationClick);\n });\n\n const pageSizeSelect = this.shadowRoot?.querySelector('.page-size-select');\n pageSizeSelect?.addEventListener('change', this._handlePageSizeChange);\n }\n\n // ============ Sorting ============\n\n private _handleHeaderClick = (e: Event): void => {\n const th = (e.currentTarget as HTMLElement).closest('[data-column]');\n const column = th?.getAttribute('data-column');\n if (column) {\n this.sort(column);\n }\n };\n\n private _handleHeaderKeydown = (e: Event): void => {\n const keyEvent = e as KeyboardEvent;\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n keyEvent.preventDefault();\n this._handleHeaderClick(e);\n }\n };\n\n /** Sort by column - toggles direction if same column */\n sort(column: string, direction?: SortDirection): void {\n if (direction) {\n this.sortColumn = column;\n this.sortDirection = direction;\n } else if (this.sortColumn === column) {\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this.sortColumn = column;\n this.sortDirection = 'asc';\n }\n\n this.emit<TableSortEventDetail>('sort', {\n column: this.sortColumn,\n direction: this.sortDirection,\n });\n }\n\n private _sortData(data: TableRow[]): TableRow[] {\n if (!this.sortColumn) return data;\n\n return [...data].sort((a, b) => {\n const aVal = a[this.sortColumn];\n const bVal = b[this.sortColumn];\n\n let comparison = 0;\n if (aVal === null || aVal === undefined) comparison = 1;\n else if (bVal === null || bVal === undefined) comparison = -1;\n else if (typeof aVal === 'string' && typeof bVal === 'string') {\n comparison = aVal.localeCompare(bVal);\n } else if (typeof aVal === 'number' && typeof bVal === 'number') {\n comparison = aVal - bVal;\n } else {\n comparison = String(aVal).localeCompare(String(bVal));\n }\n\n return this.sortDirection === 'desc' ? -comparison : comparison;\n });\n }\n\n // ============ Pagination ============\n\n private _handlePaginationClick = (e: Event): void => {\n const btn = e.currentTarget as HTMLElement;\n const action = btn.getAttribute('data-action');\n\n switch (action) {\n case 'first':\n this.goToPage(1);\n break;\n case 'prev':\n this.goToPage(this.page - 1);\n break;\n case 'next':\n this.goToPage(this.page + 1);\n break;\n case 'last':\n this.goToPage(this._getTotalPages());\n break;\n }\n };\n\n private _handlePageSizeChange = (e: Event): void => {\n const select = e.target as HTMLSelectElement;\n const newPageSize = parseInt(select.value, 10);\n this.pageSize = newPageSize;\n this.page = 1; // Reset to first page\n\n this.emit<TablePageEventDetail>('page-change', {\n page: this.page,\n pageSize: this.pageSize,\n });\n };\n\n /** Go to specific page */\n goToPage(page: number): void {\n const totalPages = this._getTotalPages();\n const newPage = Math.max(1, Math.min(page, totalPages));\n\n if (newPage !== this.page) {\n this.page = newPage;\n this.emit<TablePageEventDetail>('page-change', {\n page: this.page,\n pageSize: this.pageSize,\n });\n }\n }\n\n private _getTotalPages(): number {\n return Math.max(1, Math.ceil(this.data.length / this.pageSize));\n }\n\n private _paginateData(data: TableRow[]): TableRow[] {\n if (!this.paginated) return data;\n\n const start = (this.page - 1) * this.pageSize;\n const end = start + this.pageSize;\n return data.slice(start, end);\n }\n\n private _getStartRow(): number {\n if (this.data.length === 0) return 0;\n return (this.page - 1) * this.pageSize + 1;\n }\n\n private _getEndRow(): number {\n return Math.min(this.page * this.pageSize, this.data.length);\n }\n\n // ============ Selection ============\n\n private _handleRowClick = (e: Event): void => {\n const row = (e.target as HTMLElement).closest('.table-row');\n if (!row) return;\n\n // Don't handle if clicking on checkbox/radio\n if ((e.target as HTMLElement).closest('.select-cell')) return;\n\n const rowId = row.getAttribute('data-row-id');\n const rowIndex = parseInt(row.getAttribute('data-row-index') || '0', 10);\n\n if (rowId !== null) {\n const id = this._parseId(rowId);\n const rowData = this.data.find((r) => r.id === id);\n\n if (rowData) {\n this.emit<TableRowClickEventDetail>('row-click', {\n row: rowData,\n rowIndex,\n });\n\n // Toggle selection on row click\n if (this.selectionMode !== 'none') {\n this.toggleRowSelection(id);\n }\n }\n }\n };\n\n private _handleRowSelectChange = (e: Event): void => {\n const input = e.target as HTMLInputElement;\n const rowId = input.getAttribute('data-row-id');\n\n if (rowId !== null) {\n const id = this._parseId(rowId);\n if (input.checked) {\n this.selectRow(id);\n } else {\n this.deselectRow(id);\n }\n }\n };\n\n private _handleSelectAllChange = (e: Event): void => {\n const input = e.target as HTMLInputElement;\n if (input.checked) {\n this.selectAll();\n } else {\n this.deselectAll();\n }\n };\n\n private _parseId(idStr: string): string | number {\n const num = Number(idStr);\n return isNaN(num) ? idStr : num;\n }\n\n /** Select a row by ID */\n selectRow(id: string | number): void {\n if (this.selectionMode === 'single') {\n this._internalSelectedIds.clear();\n }\n this._internalSelectedIds.add(id);\n this._emitSelectionChange();\n }\n\n /** Deselect a row by ID */\n deselectRow(id: string | number): void {\n this._internalSelectedIds.delete(id);\n this._emitSelectionChange();\n }\n\n /** Toggle row selection */\n toggleRowSelection(id: string | number): void {\n if (this._internalSelectedIds.has(id)) {\n this.deselectRow(id);\n } else {\n this.selectRow(id);\n }\n }\n\n /** Select all visible rows */\n selectAll(): void {\n const visibleData = this._getProcessedData();\n visibleData.forEach((row) => this._internalSelectedIds.add(row.id));\n this._emitSelectionChange();\n }\n\n /** Deselect all rows */\n deselectAll(): void {\n this._internalSelectedIds.clear();\n this._emitSelectionChange();\n }\n\n /** Get currently selected rows */\n getSelectedRows(): TableRow[] {\n return this.data.filter((row) => this._internalSelectedIds.has(row.id));\n }\n\n private _emitSelectionChange(): void {\n this.selectedIds = Array.from(this._internalSelectedIds);\n this.emit<TableSelectEventDetail>('select', {\n selectedIds: this.selectedIds,\n selectedRows: this.getSelectedRows(),\n });\n this.update();\n }\n\n private _isRowSelected(row: TableRow): boolean {\n return this._internalSelectedIds.has(row.id);\n }\n\n private _isAllSelected(): boolean {\n const visibleData = this._getProcessedData();\n if (visibleData.length === 0) return false;\n return visibleData.every((row) => this._internalSelectedIds.has(row.id));\n }\n\n private _isSomeSelected(): boolean {\n const visibleData = this._getProcessedData();\n return (\n visibleData.some((row) => this._internalSelectedIds.has(row.id)) && !this._isAllSelected()\n );\n }\n\n // ============ Data Processing ============\n\n private _getEffectiveColumns(): TableColumn[] {\n // First check for columns prop\n if (this.columns && this.columns.length > 0) {\n return this.columns.filter((col) => !col.hidden);\n }\n\n // Fall back to child <el-dm-table-column> elements\n const columnElements = this.querySelectorAll('el-dm-table-column');\n const cols: TableColumn[] = [];\n\n columnElements.forEach((el) => {\n if (el instanceof ElDmTableColumn) {\n const colDef = el.toColumnDef();\n if (!colDef.hidden) {\n cols.push(colDef);\n }\n }\n });\n\n return cols;\n }\n\n private _getProcessedData(): TableRow[] {\n let result = [...(this.data || [])];\n result = this._sortData(result);\n result = this._paginateData(result);\n return result;\n }\n\n /** Get visible (processed) data */\n getVisibleData(): TableRow[] {\n return this._getProcessedData();\n }\n\n /** Refresh the table */\n refresh(): void {\n this.update();\n }\n\n // ============ Rendering ============\n\n private _formatCellValue(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n if (value instanceof Date) return value.toLocaleDateString();\n return String(value);\n }\n\n private _renderHeaderCell(column: TableColumn): string {\n const sortable = column.sortable;\n const isSorted = this.sortColumn === column.key;\n const sortIcon = isSorted\n ? this.sortDirection === 'asc'\n ? ICONS.sortAsc\n : ICONS.sortDesc\n : ICONS.sort;\n\n return `\n <th\n class=\"table-header-cell ${sortable ? 'table-sortable' : ''} ${isSorted ? 'sorted' : ''}\"\n part=\"th\"\n data-column=\"${column.key}\"\n style=\"text-align: ${column.align || 'left'}; ${column.width ? `width: ${column.width};` : ''}\"\n scope=\"col\"\n ${sortable ? `role=\"columnheader\" aria-sort=\"${isSorted ? (this.sortDirection === 'asc' ? 'ascending' : 'descending') : 'none'}\" tabindex=\"0\"` : ''}\n >\n <span class=\"th-content\">\n <span>${column.label}</span>\n ${sortable ? `<span class=\"sort-icon\">${sortIcon}</span>` : ''}\n </span>\n </th>\n `;\n }\n\n private _renderSelectAllCell(): string {\n if (this.selectionMode !== 'multiple') {\n return '<th class=\"table-header-cell select-cell\" part=\"th\"></th>';\n }\n\n const isAllSelected = this._isAllSelected();\n const isSomeSelected = this._isSomeSelected();\n\n return `\n <th class=\"table-header-cell select-cell\" part=\"th\">\n <input\n type=\"checkbox\"\n class=\"select-all\"\n ${isAllSelected ? 'checked' : ''}\n ${isSomeSelected ? 'data-indeterminate=\"true\"' : ''}\n aria-label=\"Select all rows\"\n />\n </th>\n `;\n }\n\n private _renderSelectCell(row: TableRow): string {\n const isSelected = this._isRowSelected(row);\n const inputType = this.selectionMode === 'single' ? 'radio' : 'checkbox';\n\n return `\n <td class=\"table-cell select-cell\" part=\"td\">\n <input\n type=\"${inputType}\"\n class=\"row-select\"\n name=\"table-selection\"\n data-row-id=\"${row.id}\"\n ${isSelected ? 'checked' : ''}\n aria-label=\"Select row\"\n />\n </td>\n `;\n }\n\n private _renderDataRow(row: TableRow, index: number, columns: TableColumn[]): string {\n const isSelected = this._isRowSelected(row);\n const showSelectionColumn = this.selectionMode !== 'none';\n\n return `\n <tr\n class=\"table-row ${isSelected ? 'table-row-selected' : ''}\"\n part=\"row\"\n data-row-id=\"${row.id}\"\n data-row-index=\"${index}\"\n ${isSelected ? 'aria-selected=\"true\"' : ''}\n >\n ${showSelectionColumn ? this._renderSelectCell(row) : ''}\n ${columns\n .map(\n (col) => `\n <td\n class=\"table-cell\"\n part=\"td\"\n style=\"text-align: ${col.align || 'left'};\"\n >\n ${this._formatCellValue(row[col.key])}\n </td>\n `,\n )\n .join('')}\n </tr>\n `;\n }\n\n private _renderLoadingRow(colCount: number): string {\n const totalCols = this.selectionMode !== 'none' ? colCount + 1 : colCount;\n return `\n <tr class=\"loading-row\">\n <td colspan=\"${totalCols}\">\n <div class=\"loading-spinner\"></div>\n <div>Loading...</div>\n </td>\n </tr>\n `;\n }\n\n private _renderEmptyRow(colCount: number): string {\n const totalCols = this.selectionMode !== 'none' ? colCount + 1 : colCount;\n return `\n <tr class=\"empty-row\">\n <td colspan=\"${totalCols}\">\n <slot name=\"empty\">${this.emptyMessage}</slot>\n </td>\n </tr>\n `;\n }\n\n private _renderPagination(): string {\n const totalPages = this._getTotalPages();\n const showPageSizeSelect = this.pageSizeOptions && this.pageSizeOptions.length > 0;\n\n return `\n <div class=\"table-pagination\" part=\"pagination\">\n <div class=\"pagination-info\">\n Showing ${this._getStartRow()} to ${this._getEndRow()} of ${this.data.length} entries\n </div>\n <div class=\"pagination-controls\">\n ${\n showPageSizeSelect\n ? `\n <select class=\"page-size-select\" aria-label=\"Rows per page\">\n ${this.pageSizeOptions\n .map(\n (size) => `\n <option value=\"${size}\" ${size === this.pageSize ? 'selected' : ''}>\n ${size} / page\n </option>\n `,\n )\n .join('')}\n </select>\n `\n : ''\n }\n <div class=\"pagination-nav\">\n <button\n class=\"pagination-btn\"\n data-action=\"first\"\n ${this.page <= 1 ? 'disabled' : ''}\n aria-label=\"First page\"\n >${ICONS.chevronFirst}</button>\n <button\n class=\"pagination-btn\"\n data-action=\"prev\"\n ${this.page <= 1 ? 'disabled' : ''}\n aria-label=\"Previous page\"\n >${ICONS.chevronLeft}</button>\n <span class=\"pagination-current\">\n Page ${this.page} of ${totalPages}\n </span>\n <button\n class=\"pagination-btn\"\n data-action=\"next\"\n ${this.page >= totalPages ? 'disabled' : ''}\n aria-label=\"Next page\"\n >${ICONS.chevronRight}</button>\n <button\n class=\"pagination-btn\"\n data-action=\"last\"\n ${this.page >= totalPages ? 'disabled' : ''}\n aria-label=\"Last page\"\n >${ICONS.chevronLast}</button>\n </div>\n </div>\n </div>\n `;\n }\n\n protected render(): string {\n const columns = this._getEffectiveColumns();\n const processedData = this._getProcessedData();\n const showSelectionColumn = this.selectionMode !== 'none';\n\n return `\n <div class=\"table-wrapper\" part=\"wrapper\">\n <div class=\"table-header-actions\" part=\"header-actions\">\n <slot name=\"header-actions\"></slot>\n </div>\n\n <div class=\"table-container\" part=\"container\">\n <table class=\"table\" part=\"table\" role=\"grid\" aria-busy=\"${this.loading}\">\n <thead part=\"thead\">\n <tr part=\"header-row\">\n ${showSelectionColumn ? this._renderSelectAllCell() : ''}\n ${columns.map((col) => this._renderHeaderCell(col)).join('')}\n </tr>\n </thead>\n <tbody part=\"tbody\">\n ${this.loading ? this._renderLoadingRow(columns.length) : ''}\n ${!this.loading && processedData.length === 0 ? this._renderEmptyRow(columns.length) : ''}\n ${!this.loading ? processedData.map((row, idx) => this._renderDataRow(row, idx, columns)).join('') : ''}\n </tbody>\n </table>\n </div>\n\n ${this.paginated ? this._renderPagination() : ''}\n\n <div class=\"table-footer-actions\" part=\"footer-actions\">\n <slot name=\"footer-actions\"></slot>\n </div>\n </div>\n `;\n }\n}\n\nexport function registerTable(): void {\n if (!customElements.get('el-dm-table')) {\n customElements.define('el-dm-table', ElDmTable);\n }\n}\n",
6
+ "/**\n * DuskMoon Table Column Element\n *\n * Declarative column definition for el-dm-table.\n *\n * @element el-dm-table-column\n *\n * @attr {string} key - Column key for data mapping (required)\n * @attr {string} label - Column header label\n * @attr {boolean} sortable - Whether column is sortable\n * @attr {string} width - Column width (CSS value)\n * @attr {string} align - Text alignment: left, center, right\n * @attr {boolean} hidden - Whether column is hidden\n */\n\nimport { BaseElement } from '@duskmoon-dev/el-base';\nimport type { TableColumn } from './types.js';\n\nexport class ElDmTableColumn extends BaseElement {\n static properties = {\n key: { type: String, reflect: true },\n label: { type: String, reflect: true },\n sortable: { type: Boolean, reflect: true },\n width: { type: String, reflect: true },\n align: { type: String, reflect: true, default: 'left' },\n hidden: { type: Boolean, reflect: true },\n };\n\n declare key: string;\n declare label: string;\n declare sortable: boolean;\n declare width: string;\n declare align: 'left' | 'center' | 'right';\n declare hidden: boolean;\n\n connectedCallback(): void {\n super.connectedCallback();\n // Notify parent table that columns changed\n this._notifyParent();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n // Notify parent table that columns changed\n this._notifyParent();\n }\n\n private _notifyParent(): void {\n this.dispatchEvent(\n new CustomEvent('table-column-change', {\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /** Convert to TableColumn interface */\n toColumnDef(): TableColumn {\n return {\n key: this.key,\n label: this.label || this.key || '',\n sortable: this.sortable || false,\n width: this.width,\n align: this.align || 'left',\n hidden: this.hidden || false,\n };\n }\n\n protected render(): string {\n // Hidden element - no visual output, just holds data\n return `<slot></slot>`;\n }\n}\n\nexport function registerTableColumn(): void {\n if (!customElements.get('el-dm-table-column')) {\n customElements.define('el-dm-table-column', ElDmTableColumn);\n }\n}\n",
7
7
  "export { ElDmTable, registerTable } from './el-dm-table.js';\nexport { ElDmTableColumn, registerTableColumn } from './el-dm-table-column.js';\nexport * from './types.js';\n\nimport { registerTable } from './el-dm-table.js';\nimport { registerTableColumn } from './el-dm-table-column.js';\n\nexport function register(): void {\n registerTable();\n registerTableColumn();\n}\n",
8
8
  "import { register } from './index.js';\nregister();\n"
9
9
  ],
10
- "mappings": ";AA2BA,wBAAS;;;ACZT;AAAA;AAGO,MAAM,wBAAwB,YAAY;AAAA,SACxC,aAAa;AAAA,IAClB,KAAK,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACrC,UAAU,EAAE,MAAM,SAAS,SAAS,KAAK;AAAA,IACzC,OAAO,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACrC,OAAO,EAAE,MAAM,QAAQ,SAAS,MAAM,SAAS,OAAO;AAAA,IACtD,QAAQ,EAAE,MAAM,SAAS,SAAS,KAAK;AAAA,EACzC;AAAA,EASA,iBAAiB,GAAS;AAAA,IACxB,MAAM,kBAAkB;AAAA,IAExB,KAAK,cAAc;AAAA;AAAA,EAGrB,oBAAoB,GAAS;AAAA,IAC3B,MAAM,qBAAqB;AAAA,IAE3B,KAAK,cAAc;AAAA;AAAA,EAGb,aAAa,GAAS;AAAA,IAC5B,KAAK,cACH,IAAI,YAAY,uBAAuB;AAAA,MACrC,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC,CACH;AAAA;AAAA,EAIF,WAAW,GAAgB;AAAA,IACzB,OAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,OAAO,KAAK,SAAS,KAAK,OAAO;AAAA,MACjC,UAAU,KAAK,YAAY;AAAA,MAC3B,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK,SAAS;AAAA,MACrB,QAAQ,KAAK,UAAU;AAAA,IACzB;AAAA;AAAA,EAGQ,MAAM,GAAW;AAAA,IAEzB,OAAO;AAAA;AAEX;AAEO,SAAS,mBAAmB,GAAS;AAAA,EAC1C,IAAI,CAAC,eAAe,IAAI,oBAAoB,GAAG;AAAA,IAC7C,eAAe,OAAO,sBAAsB,eAAe;AAAA,EAC7D;AAAA;;;ADpCF,IAAM,QAAQ;AAAA,EACZ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AACf;AAEA,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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",
11
- "debugId": "9FF4F57CA7A1AFCF64756E2164756E21",
10
+ "mappings": ";AA4BA,wBAAS;AACT,gBAAS;;;ACdT;AAAA;AAGO,MAAM,wBAAwB,YAAY;AAAA,SACxC,aAAa;AAAA,IAClB,KAAK,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACrC,UAAU,EAAE,MAAM,SAAS,SAAS,KAAK;AAAA,IACzC,OAAO,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACrC,OAAO,EAAE,MAAM,QAAQ,SAAS,MAAM,SAAS,OAAO;AAAA,IACtD,QAAQ,EAAE,MAAM,SAAS,SAAS,KAAK;AAAA,EACzC;AAAA,EASA,iBAAiB,GAAS;AAAA,IACxB,MAAM,kBAAkB;AAAA,IAExB,KAAK,cAAc;AAAA;AAAA,EAGrB,oBAAoB,GAAS;AAAA,IAC3B,MAAM,qBAAqB;AAAA,IAE3B,KAAK,cAAc;AAAA;AAAA,EAGb,aAAa,GAAS;AAAA,IAC5B,KAAK,cACH,IAAI,YAAY,uBAAuB;AAAA,MACrC,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC,CACH;AAAA;AAAA,EAIF,WAAW,GAAgB;AAAA,IACzB,OAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,OAAO,KAAK,SAAS,KAAK,OAAO;AAAA,MACjC,UAAU,KAAK,YAAY;AAAA,MAC3B,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK,SAAS;AAAA,MACrB,QAAQ,KAAK,UAAU;AAAA,IACzB;AAAA;AAAA,EAGQ,MAAM,GAAW;AAAA,IAEzB,OAAO;AAAA;AAEX;AAEO,SAAS,mBAAmB,GAAS;AAAA,EAC1C,IAAI,CAAC,eAAe,IAAI,oBAAoB,GAAG;AAAA,IAC7C,eAAe,OAAO,sBAAsB,eAAe;AAAA,EAC7D;AAAA;;;ADlCF,IAAM,QAAQ;AAAA,EACZ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AACf;AAGA,IAAM,aAAa,SAAS,QAAQ,4BAA4B,EAAE,EAAE,QAAQ,UAAU,EAAE;AAExF,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
11
+ "debugId": "E0D98BBF55CDEDA764756E2164756E21",
12
12
  "names": []
13
13
  }