@duskmoon-dev/el-table 0.5.0 → 0.6.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.
@@ -38,12 +38,13 @@ __export(exports_src, {
38
38
  module.exports = __toCommonJS(exports_src);
39
39
 
40
40
  // src/el-dm-table.ts
41
- var import_el_core2 = require("@duskmoon-dev/el-core");
41
+ var import_el_base2 = require("@duskmoon-dev/el-base");
42
+ var import_table = require("@duskmoon-dev/core/components/table");
42
43
 
43
44
  // src/el-dm-table-column.ts
44
- var import_el_core = require("@duskmoon-dev/el-core");
45
+ var import_el_base = require("@duskmoon-dev/el-base");
45
46
 
46
- class ElDmTableColumn extends import_el_core.BaseElement {
47
+ class ElDmTableColumn extends import_el_base.BaseElement {
47
48
  static properties = {
48
49
  key: { type: String, reflect: true },
49
50
  label: { type: String, reflect: true },
@@ -96,7 +97,8 @@ var ICONS = {
96
97
  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>`,
97
98
  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>`
98
99
  };
99
- var styles = import_el_core2.css`
100
+ var coreStyles = import_table.css.replace(/@layer\s+components\s*\{/, "").replace(/\}\s*$/, "");
101
+ var styles = import_el_base2.css`
100
102
  :host {
101
103
  display: block;
102
104
  font-family: inherit;
@@ -106,6 +108,9 @@ var styles = import_el_core2.css`
106
108
  display: none !important;
107
109
  }
108
110
 
111
+ /* Import core table styles */
112
+ ${coreStyles}
113
+
109
114
  /* Main wrapper */
110
115
  .table-wrapper {
111
116
  display: flex;
@@ -129,8 +134,8 @@ var styles = import_el_core2.css`
129
134
  /* Container for scrolling */
130
135
  .table-container {
131
136
  overflow-x: auto;
132
- border: 1px solid var(--dm-color-outline, #e0e0e0);
133
- border-radius: var(--dm-radius-md, 0.5rem);
137
+ border: 1px solid var(--color-outline, #e0e0e0);
138
+ border-radius: var(--radius-md, 0.5rem);
134
139
  }
135
140
 
136
141
  /* Sticky header variant */
@@ -145,41 +150,28 @@ var styles = import_el_core2.css`
145
150
  z-index: 1;
146
151
  }
147
152
 
148
- /* Base table */
149
- .table {
150
- width: 100%;
151
- border-collapse: collapse;
152
- font-size: 0.875rem;
153
- background-color: var(--dm-color-surface, #ffffff);
154
- }
155
-
156
- /* Header styles */
157
- .table-th {
158
- padding: 0.75rem 1rem;
159
- text-align: left;
160
- font-weight: 600;
161
- color: var(--dm-color-on-surface, #1a1a1a);
162
- background-color: var(--dm-color-surface-variant, #f5f5f5);
163
- border-bottom: 2px solid var(--dm-color-outline, #e0e0e0);
153
+ /* Web component specific: header nowrap */
154
+ .table-header-cell {
164
155
  white-space: nowrap;
165
156
  }
166
157
 
167
- .table-th.sortable {
158
+ /* Sortable header cells */
159
+ .table-header-cell.table-sortable {
168
160
  cursor: pointer;
169
161
  user-select: none;
170
162
  }
171
163
 
172
- .table-th.sortable:hover {
173
- background-color: var(--dm-color-surface-container, #ebebeb);
164
+ .table-header-cell.table-sortable:hover {
165
+ background-color: var(--color-surface-container-high, #ebebeb);
174
166
  }
175
167
 
176
- .table-th.sortable:focus-visible {
177
- outline: 2px solid var(--dm-color-primary, #6366f1);
168
+ .table-header-cell.table-sortable:focus-visible {
169
+ outline: 2px solid var(--color-primary, #6366f1);
178
170
  outline-offset: -2px;
179
171
  }
180
172
 
181
- .table-th.sorted {
182
- color: var(--dm-color-primary, #6366f1);
173
+ .table-header-cell.sorted {
174
+ color: var(--color-primary, #6366f1);
183
175
  }
184
176
 
185
177
  .th-content {
@@ -196,36 +188,25 @@ var styles = import_el_core2.css`
196
188
  flex-shrink: 0;
197
189
  }
198
190
 
199
- .table-th.sorted .sort-icon {
191
+ .table-header-cell.sorted .sort-icon {
200
192
  opacity: 1;
201
193
  }
202
194
 
203
- /* Cell styles */
204
- .table-td {
205
- padding: 0.75rem 1rem;
206
- border-bottom: 1px solid var(--dm-color-outline-variant, #e8e8e8);
207
- color: var(--dm-color-on-surface, #1a1a1a);
208
- }
209
-
210
195
  /* Row styles */
211
196
  .table-row {
212
197
  transition: background-color 150ms ease;
213
198
  }
214
199
 
215
200
  :host([hoverable]) .table-row:hover {
216
- background-color: var(--dm-color-surface-variant, #f5f5f5);
201
+ background-color: var(--color-surface-container, #f5f5f5);
217
202
  }
218
203
 
219
- .table-row.selected {
220
- background-color: var(--dm-color-primary-container, #e8e8ff);
204
+ .table-row.table-row-selected {
205
+ background-color: color-mix(in srgb, var(--color-primary, #6366f1) 15%, transparent);
221
206
  }
222
207
 
223
- :host([hoverable]) .table-row.selected:hover {
224
- background-color: color-mix(
225
- in srgb,
226
- var(--dm-color-primary-container, #e8e8ff) 90%,
227
- var(--dm-color-primary, #6366f1)
228
- );
208
+ :host([hoverable]) .table-row.table-row-selected:hover {
209
+ background-color: color-mix(in srgb, var(--color-primary, #6366f1) 20%, transparent);
229
210
  }
230
211
 
231
212
  /* Selection column */
@@ -239,27 +220,27 @@ var styles = import_el_core2.css`
239
220
  cursor: pointer;
240
221
  width: 18px;
241
222
  height: 18px;
242
- accent-color: var(--dm-color-primary, #6366f1);
223
+ accent-color: var(--color-primary, #6366f1);
243
224
  }
244
225
 
245
226
  /* Striped variant */
246
227
  :host([striped]) .table tbody tr:nth-child(even) {
247
- background-color: var(--dm-color-surface-variant, #fafafa);
228
+ background-color: var(--color-surface-container-low, #fafafa);
248
229
  }
249
230
 
250
- :host([striped]) .table tbody tr.selected:nth-child(even) {
251
- background-color: var(--dm-color-primary-container, #e8e8ff);
231
+ :host([striped]) .table tbody tr.table-row-selected:nth-child(even) {
232
+ background-color: color-mix(in srgb, var(--color-primary, #6366f1) 15%, transparent);
252
233
  }
253
234
 
254
235
  /* Bordered variant */
255
- :host([bordered]) .table-td,
256
- :host([bordered]) .table-th {
257
- border: 1px solid var(--dm-color-outline, #e0e0e0);
236
+ :host([bordered]) .table-cell,
237
+ :host([bordered]) .table-header-cell {
238
+ border: 1px solid var(--color-outline, #e0e0e0);
258
239
  }
259
240
 
260
241
  /* Compact variant */
261
- :host([compact]) .table-th,
262
- :host([compact]) .table-td {
242
+ :host([compact]) .table-header-cell,
243
+ :host([compact]) .table-cell {
263
244
  padding: 0.5rem 0.75rem;
264
245
  font-size: 0.8125rem;
265
246
  }
@@ -272,15 +253,15 @@ var styles = import_el_core2.css`
272
253
  .loading-row td {
273
254
  padding: 3rem;
274
255
  text-align: center;
275
- color: var(--dm-color-on-surface-variant, #666);
256
+ color: var(--color-on-surface-variant, #666);
276
257
  }
277
258
 
278
259
  .loading-spinner {
279
260
  display: inline-block;
280
261
  width: 24px;
281
262
  height: 24px;
282
- border: 2px solid var(--dm-color-outline, #e0e0e0);
283
- border-top-color: var(--dm-color-primary, #6366f1);
263
+ border: 2px solid var(--color-outline, #e0e0e0);
264
+ border-top-color: var(--color-primary, #6366f1);
284
265
  border-radius: 50%;
285
266
  animation: spin 0.8s linear infinite;
286
267
  }
@@ -295,7 +276,7 @@ var styles = import_el_core2.css`
295
276
  .empty-row td {
296
277
  padding: 3rem;
297
278
  text-align: center;
298
- color: var(--dm-color-on-surface-variant, #666);
279
+ color: var(--color-on-surface-variant, #666);
299
280
  }
300
281
 
301
282
  /* Pagination styles */
@@ -306,15 +287,15 @@ var styles = import_el_core2.css`
306
287
  flex-wrap: wrap;
307
288
  gap: 1rem;
308
289
  padding: 0.75rem 1rem;
309
- border: 1px solid var(--dm-color-outline, #e0e0e0);
290
+ border: 1px solid var(--color-outline, #e0e0e0);
310
291
  border-top: none;
311
- border-radius: 0 0 var(--dm-radius-md, 0.5rem) var(--dm-radius-md, 0.5rem);
312
- background-color: var(--dm-color-surface-variant, #f5f5f5);
292
+ border-radius: 0 0 var(--radius-md, 0.5rem) var(--radius-md, 0.5rem);
293
+ background-color: var(--color-surface-container, #f5f5f5);
313
294
  font-size: 0.875rem;
314
295
  }
315
296
 
316
297
  .pagination-info {
317
- color: var(--dm-color-on-surface-variant, #666);
298
+ color: var(--color-on-surface-variant, #666);
318
299
  }
319
300
 
320
301
  .pagination-controls {
@@ -335,20 +316,20 @@ var styles = import_el_core2.css`
335
316
  justify-content: center;
336
317
  width: 32px;
337
318
  height: 32px;
338
- border: 1px solid var(--dm-color-outline, #e0e0e0);
339
- border-radius: var(--dm-radius-sm, 0.25rem);
340
- background: var(--dm-color-surface, #ffffff);
319
+ border: 1px solid var(--color-outline, #e0e0e0);
320
+ border-radius: var(--radius-sm, 0.25rem);
321
+ background: var(--color-surface, #ffffff);
341
322
  cursor: pointer;
342
323
  transition: all 150ms ease;
343
- color: var(--dm-color-on-surface, #1a1a1a);
324
+ color: var(--color-on-surface, #1a1a1a);
344
325
  }
345
326
 
346
327
  .pagination-btn:hover:not(:disabled) {
347
- background: var(--dm-color-surface-container, #ebebeb);
328
+ background: var(--color-surface-container-high, #ebebeb);
348
329
  }
349
330
 
350
331
  .pagination-btn:focus-visible {
351
- outline: 2px solid var(--dm-color-primary, #6366f1);
332
+ outline: 2px solid var(--color-primary, #6366f1);
352
333
  outline-offset: 2px;
353
334
  }
354
335
 
@@ -359,22 +340,22 @@ var styles = import_el_core2.css`
359
340
 
360
341
  .pagination-current {
361
342
  padding: 0 0.75rem;
362
- color: var(--dm-color-on-surface, #1a1a1a);
343
+ color: var(--color-on-surface, #1a1a1a);
363
344
  min-width: 100px;
364
345
  text-align: center;
365
346
  }
366
347
 
367
348
  .page-size-select {
368
349
  padding: 0.375rem 0.75rem;
369
- border: 1px solid var(--dm-color-outline, #e0e0e0);
370
- border-radius: var(--dm-radius-sm, 0.25rem);
371
- background: var(--dm-color-surface, #ffffff);
350
+ border: 1px solid var(--color-outline, #e0e0e0);
351
+ border-radius: var(--radius-sm, 0.25rem);
352
+ background: var(--color-surface, #ffffff);
372
353
  font-size: 0.875rem;
373
354
  cursor: pointer;
374
355
  }
375
356
 
376
357
  .page-size-select:focus-visible {
377
- outline: 2px solid var(--dm-color-primary, #6366f1);
358
+ outline: 2px solid var(--color-primary, #6366f1);
378
359
  outline-offset: 2px;
379
360
  }
380
361
 
@@ -385,7 +366,7 @@ var styles = import_el_core2.css`
385
366
  }
386
367
  `;
387
368
 
388
- class ElDmTable extends import_el_core2.BaseElement {
369
+ class ElDmTable extends import_el_base2.BaseElement {
389
370
  static properties = {
390
371
  columns: { type: Array, attribute: false },
391
372
  data: { type: Array, attribute: false },
@@ -445,7 +426,7 @@ class ElDmTable extends import_el_core2.BaseElement {
445
426
  this.update();
446
427
  };
447
428
  _attachEventListeners() {
448
- this.shadowRoot?.querySelectorAll(".table-th.sortable").forEach((th) => {
429
+ this.shadowRoot?.querySelectorAll(".table-header-cell.table-sortable").forEach((th) => {
449
430
  th.addEventListener("click", this._handleHeaderClick);
450
431
  th.addEventListener("keydown", this._handleHeaderKeydown);
451
432
  });
@@ -710,7 +691,7 @@ class ElDmTable extends import_el_core2.BaseElement {
710
691
  const sortIcon = isSorted ? this.sortDirection === "asc" ? ICONS.sortAsc : ICONS.sortDesc : ICONS.sort;
711
692
  return `
712
693
  <th
713
- class="table-th ${sortable ? "sortable" : ""} ${isSorted ? "sorted" : ""}"
694
+ class="table-header-cell ${sortable ? "table-sortable" : ""} ${isSorted ? "sorted" : ""}"
714
695
  part="th"
715
696
  data-column="${column.key}"
716
697
  style="text-align: ${column.align || "left"}; ${column.width ? `width: ${column.width};` : ""}"
@@ -726,12 +707,12 @@ class ElDmTable extends import_el_core2.BaseElement {
726
707
  }
727
708
  _renderSelectAllCell() {
728
709
  if (this.selectionMode !== "multiple") {
729
- return '<th class="table-th select-cell" part="th"></th>';
710
+ return '<th class="table-header-cell select-cell" part="th"></th>';
730
711
  }
731
712
  const isAllSelected = this._isAllSelected();
732
713
  const isSomeSelected = this._isSomeSelected();
733
714
  return `
734
- <th class="table-th select-cell" part="th">
715
+ <th class="table-header-cell select-cell" part="th">
735
716
  <input
736
717
  type="checkbox"
737
718
  class="select-all"
@@ -746,7 +727,7 @@ class ElDmTable extends import_el_core2.BaseElement {
746
727
  const isSelected = this._isRowSelected(row);
747
728
  const inputType = this.selectionMode === "single" ? "radio" : "checkbox";
748
729
  return `
749
- <td class="table-td select-cell" part="td">
730
+ <td class="table-cell select-cell" part="td">
750
731
  <input
751
732
  type="${inputType}"
752
733
  class="row-select"
@@ -763,7 +744,7 @@ class ElDmTable extends import_el_core2.BaseElement {
763
744
  const showSelectionColumn = this.selectionMode !== "none";
764
745
  return `
765
746
  <tr
766
- class="table-row ${isSelected ? "selected" : ""}"
747
+ class="table-row ${isSelected ? "table-row-selected" : ""}"
767
748
  part="row"
768
749
  data-row-id="${row.id}"
769
750
  data-row-index="${index}"
@@ -772,7 +753,7 @@ class ElDmTable extends import_el_core2.BaseElement {
772
753
  ${showSelectionColumn ? this._renderSelectCell(row) : ""}
773
754
  ${columns.map((col) => `
774
755
  <td
775
- class="table-td"
756
+ class="table-cell"
776
757
  part="td"
777
758
  style="text-align: ${col.align || "left"};"
778
759
  >
@@ -903,5 +884,5 @@ function register() {
903
884
  // src/register.ts
904
885
  register();
905
886
 
906
- //# debugId=4218FA58F85C0BD264756E2164756E21
887
+ //# debugId=C81C8025FA5FA2B764756E2164756E21
907
888
  //# 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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BiC,IAAjC;;;ACZ4B,IAA5B;AAAA;AAGO,MAAM,wBAAwB,2BAAY;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;A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",
11
- "debugId": "4218FA58F85C0BD264756E2164756E21",
10
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BiC,IAAjC;AACgC,IAAhC;;;ACd4B,IAA5B;AAAA;AAGO,MAAM,wBAAwB,2BAAY;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,iBAAS,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;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",
11
+ "debugId": "C81C8025FA5FA2B764756E2164756E21",
12
12
  "names": []
13
13
  }