@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.
- package/README.md +1 -1
- package/dist/cjs/index.js +64 -83
- package/dist/cjs/index.js.map +4 -4
- package/dist/cjs/register.js +64 -83
- package/dist/cjs/register.js.map +4 -4
- package/dist/esm/index.js +61 -80
- package/dist/esm/index.js.map +4 -4
- package/dist/esm/register.js +61 -80
- package/dist/esm/register.js.map +4 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/el-dm-table-column.d.ts +1 -1
- package/dist/types/el-dm-table.d.ts +2 -1
- package/dist/types/el-dm-table.d.ts.map +1 -1
- package/package.json +6 -5
package/README.md
CHANGED
|
@@ -74,7 +74,7 @@ npm install @duskmoon-dev/el-table
|
|
|
74
74
|
|
|
75
75
|
## CSS Custom Properties
|
|
76
76
|
|
|
77
|
-
The table uses CSS custom properties from `@duskmoon-dev/el-
|
|
77
|
+
The table uses CSS custom properties from `@duskmoon-dev/el-base` theme:
|
|
78
78
|
|
|
79
79
|
- `--color-surface` - Table background
|
|
80
80
|
- `--color-surface-variant` - Header/stripe background
|
package/dist/cjs/index.js
CHANGED
|
@@ -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
|
|
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
|
|
45
|
+
var import_el_base = require("@duskmoon-dev/el-base");
|
|
45
46
|
|
|
46
|
-
class ElDmTableColumn extends
|
|
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
|
|
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(--
|
|
133
|
-
border-radius: var(--
|
|
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
|
-
/*
|
|
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
|
-
|
|
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-
|
|
173
|
-
background-color: var(--
|
|
164
|
+
.table-header-cell.table-sortable:hover {
|
|
165
|
+
background-color: var(--color-surface-container-high, #ebebeb);
|
|
174
166
|
}
|
|
175
167
|
|
|
176
|
-
.table-
|
|
177
|
-
outline: 2px solid var(--
|
|
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-
|
|
182
|
-
color: var(--
|
|
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-
|
|
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(--
|
|
201
|
+
background-color: var(--color-surface-container, #f5f5f5);
|
|
217
202
|
}
|
|
218
203
|
|
|
219
|
-
.table-row.selected {
|
|
220
|
-
background-color: var(--
|
|
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(--
|
|
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(--
|
|
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(--
|
|
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-
|
|
256
|
-
:host([bordered]) .table-
|
|
257
|
-
border: 1px solid var(--
|
|
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-
|
|
262
|
-
:host([compact]) .table-
|
|
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(--
|
|
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(--
|
|
283
|
-
border-top-color: var(--
|
|
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(--
|
|
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(--
|
|
290
|
+
border: 1px solid var(--color-outline, #e0e0e0);
|
|
310
291
|
border-top: none;
|
|
311
|
-
border-radius: 0 0 var(--
|
|
312
|
-
background-color: var(--
|
|
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(--
|
|
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(--
|
|
339
|
-
border-radius: var(--
|
|
340
|
-
background: var(--
|
|
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(--
|
|
324
|
+
color: var(--color-on-surface, #1a1a1a);
|
|
344
325
|
}
|
|
345
326
|
|
|
346
327
|
.pagination-btn:hover:not(:disabled) {
|
|
347
|
-
background: var(--
|
|
328
|
+
background: var(--color-surface-container-high, #ebebeb);
|
|
348
329
|
}
|
|
349
330
|
|
|
350
331
|
.pagination-btn:focus-visible {
|
|
351
|
-
outline: 2px solid var(--
|
|
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(--
|
|
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(--
|
|
370
|
-
border-radius: var(--
|
|
371
|
-
background: var(--
|
|
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(--
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
756
|
+
class="table-cell"
|
|
776
757
|
part="td"
|
|
777
758
|
style="text-align: ${col.align || "left"};"
|
|
778
759
|
>
|
|
@@ -900,5 +881,5 @@ function register() {
|
|
|
900
881
|
registerTableColumn();
|
|
901
882
|
}
|
|
902
883
|
|
|
903
|
-
//# debugId=
|
|
884
|
+
//# debugId=1C66378D9AA3AD7E64756E2164756E21
|
|
904
885
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/el-dm-table.ts", "../../src/el-dm-table-column.ts", "../../src/index.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-
|
|
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
|
],
|
|
9
|
-
"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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",
|
|
10
|
-
"debugId": "
|
|
9
|
+
"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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",
|
|
10
|
+
"debugId": "1C66378D9AA3AD7E64756E2164756E21",
|
|
11
11
|
"names": []
|
|
12
12
|
}
|