@duskmoon-dev/el-table 0.4.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/dist/esm/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// src/el-dm-table.ts
|
|
2
|
-
import { BaseElement as BaseElement2, css } from "@duskmoon-dev/el-
|
|
2
|
+
import { BaseElement as BaseElement2, css } from "@duskmoon-dev/el-base";
|
|
3
|
+
import { css as tableCSS } from "@duskmoon-dev/core/components/table";
|
|
3
4
|
|
|
4
5
|
// src/el-dm-table-column.ts
|
|
5
|
-
import { BaseElement } from "@duskmoon-dev/el-
|
|
6
|
+
import { BaseElement } from "@duskmoon-dev/el-base";
|
|
6
7
|
|
|
7
8
|
class ElDmTableColumn extends BaseElement {
|
|
8
9
|
static properties = {
|
|
@@ -57,6 +58,7 @@ var ICONS = {
|
|
|
57
58
|
chevronFirst: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m17 18-6-6 6-6"/><path d="M7 6v12"/></svg>`,
|
|
58
59
|
chevronLast: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m7 18 6-6-6-6"/><path d="M17 6v12"/></svg>`
|
|
59
60
|
};
|
|
61
|
+
var coreStyles = tableCSS.replace(/@layer\s+components\s*\{/, "").replace(/\}\s*$/, "");
|
|
60
62
|
var styles = css`
|
|
61
63
|
:host {
|
|
62
64
|
display: block;
|
|
@@ -67,6 +69,9 @@ var styles = css`
|
|
|
67
69
|
display: none !important;
|
|
68
70
|
}
|
|
69
71
|
|
|
72
|
+
/* Import core table styles */
|
|
73
|
+
${coreStyles}
|
|
74
|
+
|
|
70
75
|
/* Main wrapper */
|
|
71
76
|
.table-wrapper {
|
|
72
77
|
display: flex;
|
|
@@ -90,8 +95,8 @@ var styles = css`
|
|
|
90
95
|
/* Container for scrolling */
|
|
91
96
|
.table-container {
|
|
92
97
|
overflow-x: auto;
|
|
93
|
-
border: 1px solid var(--
|
|
94
|
-
border-radius: var(--
|
|
98
|
+
border: 1px solid var(--color-outline, #e0e0e0);
|
|
99
|
+
border-radius: var(--radius-md, 0.5rem);
|
|
95
100
|
}
|
|
96
101
|
|
|
97
102
|
/* Sticky header variant */
|
|
@@ -106,41 +111,28 @@ var styles = css`
|
|
|
106
111
|
z-index: 1;
|
|
107
112
|
}
|
|
108
113
|
|
|
109
|
-
/*
|
|
110
|
-
.table {
|
|
111
|
-
width: 100%;
|
|
112
|
-
border-collapse: collapse;
|
|
113
|
-
font-size: 0.875rem;
|
|
114
|
-
background-color: var(--dm-color-surface, #ffffff);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/* Header styles */
|
|
118
|
-
.table-th {
|
|
119
|
-
padding: 0.75rem 1rem;
|
|
120
|
-
text-align: left;
|
|
121
|
-
font-weight: 600;
|
|
122
|
-
color: var(--dm-color-on-surface, #1a1a1a);
|
|
123
|
-
background-color: var(--dm-color-surface-variant, #f5f5f5);
|
|
124
|
-
border-bottom: 2px solid var(--dm-color-outline, #e0e0e0);
|
|
114
|
+
/* Web component specific: header nowrap */
|
|
115
|
+
.table-header-cell {
|
|
125
116
|
white-space: nowrap;
|
|
126
117
|
}
|
|
127
118
|
|
|
128
|
-
|
|
119
|
+
/* Sortable header cells */
|
|
120
|
+
.table-header-cell.table-sortable {
|
|
129
121
|
cursor: pointer;
|
|
130
122
|
user-select: none;
|
|
131
123
|
}
|
|
132
124
|
|
|
133
|
-
.table-
|
|
134
|
-
background-color: var(--
|
|
125
|
+
.table-header-cell.table-sortable:hover {
|
|
126
|
+
background-color: var(--color-surface-container-high, #ebebeb);
|
|
135
127
|
}
|
|
136
128
|
|
|
137
|
-
.table-
|
|
138
|
-
outline: 2px solid var(--
|
|
129
|
+
.table-header-cell.table-sortable:focus-visible {
|
|
130
|
+
outline: 2px solid var(--color-primary, #6366f1);
|
|
139
131
|
outline-offset: -2px;
|
|
140
132
|
}
|
|
141
133
|
|
|
142
|
-
.table-
|
|
143
|
-
color: var(--
|
|
134
|
+
.table-header-cell.sorted {
|
|
135
|
+
color: var(--color-primary, #6366f1);
|
|
144
136
|
}
|
|
145
137
|
|
|
146
138
|
.th-content {
|
|
@@ -157,36 +149,25 @@ var styles = css`
|
|
|
157
149
|
flex-shrink: 0;
|
|
158
150
|
}
|
|
159
151
|
|
|
160
|
-
.table-
|
|
152
|
+
.table-header-cell.sorted .sort-icon {
|
|
161
153
|
opacity: 1;
|
|
162
154
|
}
|
|
163
155
|
|
|
164
|
-
/* Cell styles */
|
|
165
|
-
.table-td {
|
|
166
|
-
padding: 0.75rem 1rem;
|
|
167
|
-
border-bottom: 1px solid var(--dm-color-outline-variant, #e8e8e8);
|
|
168
|
-
color: var(--dm-color-on-surface, #1a1a1a);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
156
|
/* Row styles */
|
|
172
157
|
.table-row {
|
|
173
158
|
transition: background-color 150ms ease;
|
|
174
159
|
}
|
|
175
160
|
|
|
176
161
|
:host([hoverable]) .table-row:hover {
|
|
177
|
-
background-color: var(--
|
|
162
|
+
background-color: var(--color-surface-container, #f5f5f5);
|
|
178
163
|
}
|
|
179
164
|
|
|
180
|
-
.table-row.selected {
|
|
181
|
-
background-color: var(--
|
|
165
|
+
.table-row.table-row-selected {
|
|
166
|
+
background-color: color-mix(in srgb, var(--color-primary, #6366f1) 15%, transparent);
|
|
182
167
|
}
|
|
183
168
|
|
|
184
|
-
:host([hoverable]) .table-row.selected:hover {
|
|
185
|
-
background-color: color-mix(
|
|
186
|
-
in srgb,
|
|
187
|
-
var(--dm-color-primary-container, #e8e8ff) 90%,
|
|
188
|
-
var(--dm-color-primary, #6366f1)
|
|
189
|
-
);
|
|
169
|
+
:host([hoverable]) .table-row.table-row-selected:hover {
|
|
170
|
+
background-color: color-mix(in srgb, var(--color-primary, #6366f1) 20%, transparent);
|
|
190
171
|
}
|
|
191
172
|
|
|
192
173
|
/* Selection column */
|
|
@@ -200,27 +181,27 @@ var styles = css`
|
|
|
200
181
|
cursor: pointer;
|
|
201
182
|
width: 18px;
|
|
202
183
|
height: 18px;
|
|
203
|
-
accent-color: var(--
|
|
184
|
+
accent-color: var(--color-primary, #6366f1);
|
|
204
185
|
}
|
|
205
186
|
|
|
206
187
|
/* Striped variant */
|
|
207
188
|
:host([striped]) .table tbody tr:nth-child(even) {
|
|
208
|
-
background-color: var(--
|
|
189
|
+
background-color: var(--color-surface-container-low, #fafafa);
|
|
209
190
|
}
|
|
210
191
|
|
|
211
|
-
:host([striped]) .table tbody tr.selected:nth-child(even) {
|
|
212
|
-
background-color: var(--
|
|
192
|
+
:host([striped]) .table tbody tr.table-row-selected:nth-child(even) {
|
|
193
|
+
background-color: color-mix(in srgb, var(--color-primary, #6366f1) 15%, transparent);
|
|
213
194
|
}
|
|
214
195
|
|
|
215
196
|
/* Bordered variant */
|
|
216
|
-
:host([bordered]) .table-
|
|
217
|
-
:host([bordered]) .table-
|
|
218
|
-
border: 1px solid var(--
|
|
197
|
+
:host([bordered]) .table-cell,
|
|
198
|
+
:host([bordered]) .table-header-cell {
|
|
199
|
+
border: 1px solid var(--color-outline, #e0e0e0);
|
|
219
200
|
}
|
|
220
201
|
|
|
221
202
|
/* Compact variant */
|
|
222
|
-
:host([compact]) .table-
|
|
223
|
-
:host([compact]) .table-
|
|
203
|
+
:host([compact]) .table-header-cell,
|
|
204
|
+
:host([compact]) .table-cell {
|
|
224
205
|
padding: 0.5rem 0.75rem;
|
|
225
206
|
font-size: 0.8125rem;
|
|
226
207
|
}
|
|
@@ -233,15 +214,15 @@ var styles = css`
|
|
|
233
214
|
.loading-row td {
|
|
234
215
|
padding: 3rem;
|
|
235
216
|
text-align: center;
|
|
236
|
-
color: var(--
|
|
217
|
+
color: var(--color-on-surface-variant, #666);
|
|
237
218
|
}
|
|
238
219
|
|
|
239
220
|
.loading-spinner {
|
|
240
221
|
display: inline-block;
|
|
241
222
|
width: 24px;
|
|
242
223
|
height: 24px;
|
|
243
|
-
border: 2px solid var(--
|
|
244
|
-
border-top-color: var(--
|
|
224
|
+
border: 2px solid var(--color-outline, #e0e0e0);
|
|
225
|
+
border-top-color: var(--color-primary, #6366f1);
|
|
245
226
|
border-radius: 50%;
|
|
246
227
|
animation: spin 0.8s linear infinite;
|
|
247
228
|
}
|
|
@@ -256,7 +237,7 @@ var styles = css`
|
|
|
256
237
|
.empty-row td {
|
|
257
238
|
padding: 3rem;
|
|
258
239
|
text-align: center;
|
|
259
|
-
color: var(--
|
|
240
|
+
color: var(--color-on-surface-variant, #666);
|
|
260
241
|
}
|
|
261
242
|
|
|
262
243
|
/* Pagination styles */
|
|
@@ -267,15 +248,15 @@ var styles = css`
|
|
|
267
248
|
flex-wrap: wrap;
|
|
268
249
|
gap: 1rem;
|
|
269
250
|
padding: 0.75rem 1rem;
|
|
270
|
-
border: 1px solid var(--
|
|
251
|
+
border: 1px solid var(--color-outline, #e0e0e0);
|
|
271
252
|
border-top: none;
|
|
272
|
-
border-radius: 0 0 var(--
|
|
273
|
-
background-color: var(--
|
|
253
|
+
border-radius: 0 0 var(--radius-md, 0.5rem) var(--radius-md, 0.5rem);
|
|
254
|
+
background-color: var(--color-surface-container, #f5f5f5);
|
|
274
255
|
font-size: 0.875rem;
|
|
275
256
|
}
|
|
276
257
|
|
|
277
258
|
.pagination-info {
|
|
278
|
-
color: var(--
|
|
259
|
+
color: var(--color-on-surface-variant, #666);
|
|
279
260
|
}
|
|
280
261
|
|
|
281
262
|
.pagination-controls {
|
|
@@ -296,20 +277,20 @@ var styles = css`
|
|
|
296
277
|
justify-content: center;
|
|
297
278
|
width: 32px;
|
|
298
279
|
height: 32px;
|
|
299
|
-
border: 1px solid var(--
|
|
300
|
-
border-radius: var(--
|
|
301
|
-
background: var(--
|
|
280
|
+
border: 1px solid var(--color-outline, #e0e0e0);
|
|
281
|
+
border-radius: var(--radius-sm, 0.25rem);
|
|
282
|
+
background: var(--color-surface, #ffffff);
|
|
302
283
|
cursor: pointer;
|
|
303
284
|
transition: all 150ms ease;
|
|
304
|
-
color: var(--
|
|
285
|
+
color: var(--color-on-surface, #1a1a1a);
|
|
305
286
|
}
|
|
306
287
|
|
|
307
288
|
.pagination-btn:hover:not(:disabled) {
|
|
308
|
-
background: var(--
|
|
289
|
+
background: var(--color-surface-container-high, #ebebeb);
|
|
309
290
|
}
|
|
310
291
|
|
|
311
292
|
.pagination-btn:focus-visible {
|
|
312
|
-
outline: 2px solid var(--
|
|
293
|
+
outline: 2px solid var(--color-primary, #6366f1);
|
|
313
294
|
outline-offset: 2px;
|
|
314
295
|
}
|
|
315
296
|
|
|
@@ -320,22 +301,22 @@ var styles = css`
|
|
|
320
301
|
|
|
321
302
|
.pagination-current {
|
|
322
303
|
padding: 0 0.75rem;
|
|
323
|
-
color: var(--
|
|
304
|
+
color: var(--color-on-surface, #1a1a1a);
|
|
324
305
|
min-width: 100px;
|
|
325
306
|
text-align: center;
|
|
326
307
|
}
|
|
327
308
|
|
|
328
309
|
.page-size-select {
|
|
329
310
|
padding: 0.375rem 0.75rem;
|
|
330
|
-
border: 1px solid var(--
|
|
331
|
-
border-radius: var(--
|
|
332
|
-
background: var(--
|
|
311
|
+
border: 1px solid var(--color-outline, #e0e0e0);
|
|
312
|
+
border-radius: var(--radius-sm, 0.25rem);
|
|
313
|
+
background: var(--color-surface, #ffffff);
|
|
333
314
|
font-size: 0.875rem;
|
|
334
315
|
cursor: pointer;
|
|
335
316
|
}
|
|
336
317
|
|
|
337
318
|
.page-size-select:focus-visible {
|
|
338
|
-
outline: 2px solid var(--
|
|
319
|
+
outline: 2px solid var(--color-primary, #6366f1);
|
|
339
320
|
outline-offset: 2px;
|
|
340
321
|
}
|
|
341
322
|
|
|
@@ -406,7 +387,7 @@ class ElDmTable extends BaseElement2 {
|
|
|
406
387
|
this.update();
|
|
407
388
|
};
|
|
408
389
|
_attachEventListeners() {
|
|
409
|
-
this.shadowRoot?.querySelectorAll(".table-
|
|
390
|
+
this.shadowRoot?.querySelectorAll(".table-header-cell.table-sortable").forEach((th) => {
|
|
410
391
|
th.addEventListener("click", this._handleHeaderClick);
|
|
411
392
|
th.addEventListener("keydown", this._handleHeaderKeydown);
|
|
412
393
|
});
|
|
@@ -671,7 +652,7 @@ class ElDmTable extends BaseElement2 {
|
|
|
671
652
|
const sortIcon = isSorted ? this.sortDirection === "asc" ? ICONS.sortAsc : ICONS.sortDesc : ICONS.sort;
|
|
672
653
|
return `
|
|
673
654
|
<th
|
|
674
|
-
class="table-
|
|
655
|
+
class="table-header-cell ${sortable ? "table-sortable" : ""} ${isSorted ? "sorted" : ""}"
|
|
675
656
|
part="th"
|
|
676
657
|
data-column="${column.key}"
|
|
677
658
|
style="text-align: ${column.align || "left"}; ${column.width ? `width: ${column.width};` : ""}"
|
|
@@ -687,12 +668,12 @@ class ElDmTable extends BaseElement2 {
|
|
|
687
668
|
}
|
|
688
669
|
_renderSelectAllCell() {
|
|
689
670
|
if (this.selectionMode !== "multiple") {
|
|
690
|
-
return '<th class="table-
|
|
671
|
+
return '<th class="table-header-cell select-cell" part="th"></th>';
|
|
691
672
|
}
|
|
692
673
|
const isAllSelected = this._isAllSelected();
|
|
693
674
|
const isSomeSelected = this._isSomeSelected();
|
|
694
675
|
return `
|
|
695
|
-
<th class="table-
|
|
676
|
+
<th class="table-header-cell select-cell" part="th">
|
|
696
677
|
<input
|
|
697
678
|
type="checkbox"
|
|
698
679
|
class="select-all"
|
|
@@ -707,7 +688,7 @@ class ElDmTable extends BaseElement2 {
|
|
|
707
688
|
const isSelected = this._isRowSelected(row);
|
|
708
689
|
const inputType = this.selectionMode === "single" ? "radio" : "checkbox";
|
|
709
690
|
return `
|
|
710
|
-
<td class="table-
|
|
691
|
+
<td class="table-cell select-cell" part="td">
|
|
711
692
|
<input
|
|
712
693
|
type="${inputType}"
|
|
713
694
|
class="row-select"
|
|
@@ -724,7 +705,7 @@ class ElDmTable extends BaseElement2 {
|
|
|
724
705
|
const showSelectionColumn = this.selectionMode !== "none";
|
|
725
706
|
return `
|
|
726
707
|
<tr
|
|
727
|
-
class="table-row ${isSelected ? "selected" : ""}"
|
|
708
|
+
class="table-row ${isSelected ? "table-row-selected" : ""}"
|
|
728
709
|
part="row"
|
|
729
710
|
data-row-id="${row.id}"
|
|
730
711
|
data-row-index="${index}"
|
|
@@ -733,7 +714,7 @@ class ElDmTable extends BaseElement2 {
|
|
|
733
714
|
${showSelectionColumn ? this._renderSelectCell(row) : ""}
|
|
734
715
|
${columns.map((col) => `
|
|
735
716
|
<td
|
|
736
|
-
class="table-
|
|
717
|
+
class="table-cell"
|
|
737
718
|
part="td"
|
|
738
719
|
style="text-align: ${col.align || "left"};"
|
|
739
720
|
>
|
|
@@ -868,5 +849,5 @@ export {
|
|
|
868
849
|
ElDmTable
|
|
869
850
|
};
|
|
870
851
|
|
|
871
|
-
//# debugId=
|
|
852
|
+
//# debugId=92E35DC5D57C25D564756E2164756E21
|
|
872
853
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/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": ";AA2BA,wBAAS;;;ACZT;AAAA;AAGO,MAAM,wBAAwB,YAAY;AAAA,SACxC,aAAa;AAAA,IAClB,KAAK,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACrC,UAAU,EAAE,MAAM,SAAS,SAAS,KAAK;AAAA,IACzC,OAAO,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACrC,OAAO,EAAE,MAAM,QAAQ,SAAS,MAAM,SAAS,OAAO;AAAA,IACtD,QAAQ,EAAE,MAAM,SAAS,SAAS,KAAK;AAAA,EACzC;AAAA,EASA,iBAAiB,GAAS;AAAA,IACxB,MAAM,kBAAkB;AAAA,IAExB,KAAK,cAAc;AAAA;AAAA,EAGrB,oBAAoB,GAAS;AAAA,IAC3B,MAAM,qBAAqB;AAAA,IAE3B,KAAK,cAAc;AAAA;AAAA,EAGb,aAAa,GAAS;AAAA,IAC5B,KAAK,cACH,IAAI,YAAY,uBAAuB;AAAA,MACrC,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC,CACH;AAAA;AAAA,EAIF,WAAW,GAAgB;AAAA,IACzB,OAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,OAAO,KAAK,SAAS,KAAK,OAAO;AAAA,MACjC,UAAU,KAAK,YAAY;AAAA,MAC3B,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK,SAAS;AAAA,MACrB,QAAQ,KAAK,UAAU;AAAA,IACzB;AAAA;AAAA,EAGQ,MAAM,GAAW;AAAA,IAEzB,OAAO;AAAA;AAEX;AAEO,SAAS,mBAAmB,GAAS;AAAA,EAC1C,IAAI,CAAC,eAAe,IAAI,oBAAoB,GAAG;AAAA,IAC7C,eAAe,OAAO,sBAAsB,eAAe;AAAA,EAC7D;AAAA;;;ADpCF,IAAM,QAAQ;AAAA,EACZ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AACf;AAEA,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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",
|
|
10
|
-
"debugId": "
|
|
9
|
+
"mappings": ";AA4BA,wBAAS;AACT,gBAAS;;;ACdT;AAAA;AAGO,MAAM,wBAAwB,YAAY;AAAA,SACxC,aAAa;AAAA,IAClB,KAAK,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACrC,UAAU,EAAE,MAAM,SAAS,SAAS,KAAK;AAAA,IACzC,OAAO,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACrC,OAAO,EAAE,MAAM,QAAQ,SAAS,MAAM,SAAS,OAAO;AAAA,IACtD,QAAQ,EAAE,MAAM,SAAS,SAAS,KAAK;AAAA,EACzC;AAAA,EASA,iBAAiB,GAAS;AAAA,IACxB,MAAM,kBAAkB;AAAA,IAExB,KAAK,cAAc;AAAA;AAAA,EAGrB,oBAAoB,GAAS;AAAA,IAC3B,MAAM,qBAAqB;AAAA,IAE3B,KAAK,cAAc;AAAA;AAAA,EAGb,aAAa,GAAS;AAAA,IAC5B,KAAK,cACH,IAAI,YAAY,uBAAuB;AAAA,MACrC,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC,CACH;AAAA;AAAA,EAIF,WAAW,GAAgB;AAAA,IACzB,OAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,OAAO,KAAK,SAAS,KAAK,OAAO;AAAA,MACjC,UAAU,KAAK,YAAY;AAAA,MAC3B,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK,SAAS;AAAA,MACrB,QAAQ,KAAK,UAAU;AAAA,IACzB;AAAA;AAAA,EAGQ,MAAM,GAAW;AAAA,IAEzB,OAAO;AAAA;AAEX;AAEO,SAAS,mBAAmB,GAAS;AAAA,EAC1C,IAAI,CAAC,eAAe,IAAI,oBAAoB,GAAG;AAAA,IAC7C,eAAe,OAAO,sBAAsB,eAAe;AAAA,EAC7D;AAAA;;;ADlCF,IAAM,QAAQ;AAAA,EACZ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AACf;AAGA,IAAM,aAAa,SAAS,QAAQ,4BAA4B,EAAE,EAAE,QAAQ,UAAU,EAAE;AAExF,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
|
|
10
|
+
"debugId": "92E35DC5D57C25D564756E2164756E21",
|
|
11
11
|
"names": []
|
|
12
12
|
}
|