@duskmoon-dev/el-table 0.4.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.
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/el-dm-table.ts", "../../src/el-dm-table-column.ts", "../../src/index.ts", "../../src/register.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * DuskMoon Table Element\n *\n * A full-featured data table with sorting, pagination, and row selection.\n *\n * @element el-dm-table\n *\n * @fires sort - When sort changes\n * @fires select - When selection changes\n * @fires page-change - When page changes\n * @fires row-click - When a row is clicked\n *\n * @slot header-actions - Actions above the table\n * @slot footer-actions - Actions below the table\n * @slot empty - Custom empty state content\n *\n * @csspart wrapper - Main wrapper container\n * @csspart container - Scrollable table container\n * @csspart table - The table element\n * @csspart thead - Table header\n * @csspart tbody - Table body\n * @csspart th - Header cell\n * @csspart td - Body cell\n * @csspart row - Body row\n * @csspart pagination - Pagination container\n */\n\nimport { BaseElement, css } from '@duskmoon-dev/el-core';\nimport type {\n TableColumn,\n TableRow,\n SortDirection,\n SelectionMode,\n TableSortEventDetail,\n TableSelectEventDetail,\n TablePageEventDetail,\n TableRowClickEventDetail,\n} from './types.js';\nimport { ElDmTableColumn } from './el-dm-table-column.js';\n\n// SVG Icons\nconst ICONS = {\n sortAsc: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 16 4 4 4-4\"/><path d=\"M7 20V4\"/><path d=\"M11 4h4\"/><path d=\"M11 8h7\"/><path d=\"M11 12h10\"/></svg>`,\n sortDesc: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 8 4-4 4 4\"/><path d=\"M7 4v16\"/><path d=\"M11 12h4\"/><path d=\"M11 16h7\"/><path d=\"M11 20h10\"/></svg>`,\n sort: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 16 4 4 4-4\"/><path d=\"M7 20V4\"/><path d=\"m21 8-4-4-4 4\"/><path d=\"M17 4v16\"/></svg>`,\n chevronLeft: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>`,\n chevronRight: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>`,\n chevronFirst: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m17 18-6-6 6-6\"/><path d=\"M7 6v12\"/></svg>`,\n chevronLast: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m7 18 6-6-6-6\"/><path d=\"M17 6v12\"/></svg>`,\n};\n\nconst styles = css`\n :host {\n display: block;\n font-family: inherit;\n }\n\n :host([hidden]) {\n display: none !important;\n }\n\n /* Main wrapper */\n .table-wrapper {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n /* Header/Footer action slots */\n .table-header-actions,\n .table-footer-actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .table-header-actions:empty,\n .table-footer-actions:empty {\n display: none;\n }\n\n /* Container for scrolling */\n .table-container {\n overflow-x: auto;\n border: 1px solid var(--dm-color-outline, #e0e0e0);\n border-radius: var(--dm-radius-md, 0.5rem);\n }\n\n /* Sticky header variant */\n :host([sticky-header]) .table-container {\n max-height: var(--table-max-height, 400px);\n overflow-y: auto;\n }\n\n :host([sticky-header]) .table thead {\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n /* Base table */\n .table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.875rem;\n background-color: var(--dm-color-surface, #ffffff);\n }\n\n /* Header styles */\n .table-th {\n padding: 0.75rem 1rem;\n text-align: left;\n font-weight: 600;\n color: var(--dm-color-on-surface, #1a1a1a);\n background-color: var(--dm-color-surface-variant, #f5f5f5);\n border-bottom: 2px solid var(--dm-color-outline, #e0e0e0);\n white-space: nowrap;\n }\n\n .table-th.sortable {\n cursor: pointer;\n user-select: none;\n }\n\n .table-th.sortable:hover {\n background-color: var(--dm-color-surface-container, #ebebeb);\n }\n\n .table-th.sortable:focus-visible {\n outline: 2px solid var(--dm-color-primary, #6366f1);\n outline-offset: -2px;\n }\n\n .table-th.sorted {\n color: var(--dm-color-primary, #6366f1);\n }\n\n .th-content {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .sort-icon {\n display: flex;\n width: 1rem;\n height: 1rem;\n opacity: 0.5;\n flex-shrink: 0;\n }\n\n .table-th.sorted .sort-icon {\n opacity: 1;\n }\n\n /* Cell styles */\n .table-td {\n padding: 0.75rem 1rem;\n border-bottom: 1px solid var(--dm-color-outline-variant, #e8e8e8);\n color: var(--dm-color-on-surface, #1a1a1a);\n }\n\n /* Row styles */\n .table-row {\n transition: background-color 150ms ease;\n }\n\n :host([hoverable]) .table-row:hover {\n background-color: var(--dm-color-surface-variant, #f5f5f5);\n }\n\n .table-row.selected {\n background-color: var(--dm-color-primary-container, #e8e8ff);\n }\n\n :host([hoverable]) .table-row.selected:hover {\n background-color: color-mix(\n in srgb,\n var(--dm-color-primary-container, #e8e8ff) 90%,\n var(--dm-color-primary, #6366f1)\n );\n }\n\n /* Selection column */\n .select-cell {\n width: 48px;\n text-align: center;\n padding: 0.5rem;\n }\n\n .select-cell input {\n cursor: pointer;\n width: 18px;\n height: 18px;\n accent-color: var(--dm-color-primary, #6366f1);\n }\n\n /* Striped variant */\n :host([striped]) .table tbody tr:nth-child(even) {\n background-color: var(--dm-color-surface-variant, #fafafa);\n }\n\n :host([striped]) .table tbody tr.selected:nth-child(even) {\n background-color: var(--dm-color-primary-container, #e8e8ff);\n }\n\n /* Bordered variant */\n :host([bordered]) .table-td,\n :host([bordered]) .table-th {\n border: 1px solid var(--dm-color-outline, #e0e0e0);\n }\n\n /* Compact variant */\n :host([compact]) .table-th,\n :host([compact]) .table-td {\n padding: 0.5rem 0.75rem;\n font-size: 0.8125rem;\n }\n\n :host([compact]) .select-cell {\n padding: 0.375rem 0.5rem;\n }\n\n /* Loading state */\n .loading-row td {\n padding: 3rem;\n text-align: center;\n color: var(--dm-color-on-surface-variant, #666);\n }\n\n .loading-spinner {\n display: inline-block;\n width: 24px;\n height: 24px;\n border: 2px solid var(--dm-color-outline, #e0e0e0);\n border-top-color: var(--dm-color-primary, #6366f1);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n /* Empty state */\n .empty-row td {\n padding: 3rem;\n text-align: center;\n color: var(--dm-color-on-surface-variant, #666);\n }\n\n /* Pagination styles */\n .table-pagination {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 1rem;\n padding: 0.75rem 1rem;\n border: 1px solid var(--dm-color-outline, #e0e0e0);\n border-top: none;\n border-radius: 0 0 var(--dm-radius-md, 0.5rem) var(--dm-radius-md, 0.5rem);\n background-color: var(--dm-color-surface-variant, #f5f5f5);\n font-size: 0.875rem;\n }\n\n .pagination-info {\n color: var(--dm-color-on-surface-variant, #666);\n }\n\n .pagination-controls {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n\n .pagination-nav {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n\n .pagination-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid var(--dm-color-outline, #e0e0e0);\n border-radius: var(--dm-radius-sm, 0.25rem);\n background: var(--dm-color-surface, #ffffff);\n cursor: pointer;\n transition: all 150ms ease;\n color: var(--dm-color-on-surface, #1a1a1a);\n }\n\n .pagination-btn:hover:not(:disabled) {\n background: var(--dm-color-surface-container, #ebebeb);\n }\n\n .pagination-btn:focus-visible {\n outline: 2px solid var(--dm-color-primary, #6366f1);\n outline-offset: 2px;\n }\n\n .pagination-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .pagination-current {\n padding: 0 0.75rem;\n color: var(--dm-color-on-surface, #1a1a1a);\n min-width: 100px;\n text-align: center;\n }\n\n .page-size-select {\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--dm-color-outline, #e0e0e0);\n border-radius: var(--dm-radius-sm, 0.25rem);\n background: var(--dm-color-surface, #ffffff);\n font-size: 0.875rem;\n cursor: pointer;\n }\n\n .page-size-select:focus-visible {\n outline: 2px solid var(--dm-color-primary, #6366f1);\n outline-offset: 2px;\n }\n\n /* Clickable rows */\n :host([selection-mode='single']) .table-row,\n :host([selection-mode='multiple']) .table-row {\n cursor: pointer;\n }\n`;\n\nexport class ElDmTable extends BaseElement {\n static properties = {\n // Data\n columns: { type: Array, attribute: false as const },\n data: { type: Array, attribute: false as const },\n\n // Sorting\n sortColumn: { type: String, reflect: true, attribute: 'sort-column' },\n sortDirection: {\n type: String,\n reflect: true,\n attribute: 'sort-direction',\n default: 'asc',\n },\n\n // Pagination\n paginated: { type: Boolean, reflect: true },\n page: { type: Number, reflect: true, default: 1 },\n pageSize: { type: Number, reflect: true, attribute: 'page-size', default: 10 },\n pageSizeOptions: { type: Array, attribute: false as const },\n\n // Selection\n selectionMode: {\n type: String,\n reflect: true,\n attribute: 'selection-mode',\n default: 'none',\n },\n selectedIds: { type: Array, attribute: false as const },\n\n // Display options\n striped: { type: Boolean, reflect: true },\n bordered: { type: Boolean, reflect: true },\n hoverable: { type: Boolean, reflect: true, default: true },\n compact: { type: Boolean, reflect: true },\n stickyHeader: { type: Boolean, reflect: true, attribute: 'sticky-header' },\n\n // State\n loading: { type: Boolean, reflect: true },\n emptyMessage: {\n type: String,\n reflect: true,\n attribute: 'empty-message',\n default: 'No data available',\n },\n };\n\n // Type declarations\n declare columns: TableColumn[];\n declare data: TableRow[];\n declare sortColumn: string;\n declare sortDirection: SortDirection;\n declare paginated: boolean;\n declare page: number;\n declare pageSize: number;\n declare pageSizeOptions: number[];\n declare selectionMode: SelectionMode;\n declare selectedIds: (string | number)[];\n declare striped: boolean;\n declare bordered: boolean;\n declare hoverable: boolean;\n declare compact: boolean;\n declare stickyHeader: boolean;\n declare loading: boolean;\n declare emptyMessage: string;\n\n // Private state\n private _internalSelectedIds: Set<string | number> = new Set();\n\n constructor() {\n super();\n this.attachStyles(styles);\n this.columns = [];\n this.data = [];\n this.selectedIds = [];\n this.pageSizeOptions = [5, 10, 25, 50];\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // Listen for child column changes\n this.addEventListener('table-column-change', this._handleColumnChange);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('table-column-change', this._handleColumnChange);\n }\n\n protected update(): void {\n super.update();\n this._attachEventListeners();\n }\n\n private _handleColumnChange = (): void => {\n // Re-render when child columns change\n this.update();\n };\n\n private _attachEventListeners(): void {\n // Sort handlers\n this.shadowRoot?.querySelectorAll('.table-th.sortable').forEach((th) => {\n th.addEventListener('click', this._handleHeaderClick);\n th.addEventListener('keydown', this._handleHeaderKeydown);\n });\n\n // Row click handlers\n this.shadowRoot?.querySelectorAll('.table-row').forEach((row) => {\n row.addEventListener('click', this._handleRowClick);\n });\n\n // Selection handlers\n this.shadowRoot?.querySelectorAll('.row-select').forEach((input) => {\n input.addEventListener('change', this._handleRowSelectChange);\n });\n\n // Select all handler\n const selectAll = this.shadowRoot?.querySelector('.select-all');\n selectAll?.addEventListener('change', this._handleSelectAllChange);\n\n // Pagination handlers\n this.shadowRoot?.querySelectorAll('.pagination-btn').forEach((btn) => {\n btn.addEventListener('click', this._handlePaginationClick);\n });\n\n const pageSizeSelect = this.shadowRoot?.querySelector('.page-size-select');\n pageSizeSelect?.addEventListener('change', this._handlePageSizeChange);\n }\n\n // ============ Sorting ============\n\n private _handleHeaderClick = (e: Event): void => {\n const th = (e.currentTarget as HTMLElement).closest('[data-column]');\n const column = th?.getAttribute('data-column');\n if (column) {\n this.sort(column);\n }\n };\n\n private _handleHeaderKeydown = (e: Event): void => {\n const keyEvent = e as KeyboardEvent;\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n keyEvent.preventDefault();\n this._handleHeaderClick(e);\n }\n };\n\n /** Sort by column - toggles direction if same column */\n sort(column: string, direction?: SortDirection): void {\n if (direction) {\n this.sortColumn = column;\n this.sortDirection = direction;\n } else if (this.sortColumn === column) {\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this.sortColumn = column;\n this.sortDirection = 'asc';\n }\n\n this.emit<TableSortEventDetail>('sort', {\n column: this.sortColumn,\n direction: this.sortDirection,\n });\n }\n\n private _sortData(data: TableRow[]): TableRow[] {\n if (!this.sortColumn) return data;\n\n return [...data].sort((a, b) => {\n const aVal = a[this.sortColumn];\n const bVal = b[this.sortColumn];\n\n let comparison = 0;\n if (aVal === null || aVal === undefined) comparison = 1;\n else if (bVal === null || bVal === undefined) comparison = -1;\n else if (typeof aVal === 'string' && typeof bVal === 'string') {\n comparison = aVal.localeCompare(bVal);\n } else if (typeof aVal === 'number' && typeof bVal === 'number') {\n comparison = aVal - bVal;\n } else {\n comparison = String(aVal).localeCompare(String(bVal));\n }\n\n return this.sortDirection === 'desc' ? -comparison : comparison;\n });\n }\n\n // ============ Pagination ============\n\n private _handlePaginationClick = (e: Event): void => {\n const btn = e.currentTarget as HTMLElement;\n const action = btn.getAttribute('data-action');\n\n switch (action) {\n case 'first':\n this.goToPage(1);\n break;\n case 'prev':\n this.goToPage(this.page - 1);\n break;\n case 'next':\n this.goToPage(this.page + 1);\n break;\n case 'last':\n this.goToPage(this._getTotalPages());\n break;\n }\n };\n\n private _handlePageSizeChange = (e: Event): void => {\n const select = e.target as HTMLSelectElement;\n const newPageSize = parseInt(select.value, 10);\n this.pageSize = newPageSize;\n this.page = 1; // Reset to first page\n\n this.emit<TablePageEventDetail>('page-change', {\n page: this.page,\n pageSize: this.pageSize,\n });\n };\n\n /** Go to specific page */\n goToPage(page: number): void {\n const totalPages = this._getTotalPages();\n const newPage = Math.max(1, Math.min(page, totalPages));\n\n if (newPage !== this.page) {\n this.page = newPage;\n this.emit<TablePageEventDetail>('page-change', {\n page: this.page,\n pageSize: this.pageSize,\n });\n }\n }\n\n private _getTotalPages(): number {\n return Math.max(1, Math.ceil(this.data.length / this.pageSize));\n }\n\n private _paginateData(data: TableRow[]): TableRow[] {\n if (!this.paginated) return data;\n\n const start = (this.page - 1) * this.pageSize;\n const end = start + this.pageSize;\n return data.slice(start, end);\n }\n\n private _getStartRow(): number {\n if (this.data.length === 0) return 0;\n return (this.page - 1) * this.pageSize + 1;\n }\n\n private _getEndRow(): number {\n return Math.min(this.page * this.pageSize, this.data.length);\n }\n\n // ============ Selection ============\n\n private _handleRowClick = (e: Event): void => {\n const row = (e.target as HTMLElement).closest('.table-row');\n if (!row) return;\n\n // Don't handle if clicking on checkbox/radio\n if ((e.target as HTMLElement).closest('.select-cell')) return;\n\n const rowId = row.getAttribute('data-row-id');\n const rowIndex = parseInt(row.getAttribute('data-row-index') || '0', 10);\n\n if (rowId !== null) {\n const id = this._parseId(rowId);\n const rowData = this.data.find((r) => r.id === id);\n\n if (rowData) {\n this.emit<TableRowClickEventDetail>('row-click', {\n row: rowData,\n rowIndex,\n });\n\n // Toggle selection on row click\n if (this.selectionMode !== 'none') {\n this.toggleRowSelection(id);\n }\n }\n }\n };\n\n private _handleRowSelectChange = (e: Event): void => {\n const input = e.target as HTMLInputElement;\n const rowId = input.getAttribute('data-row-id');\n\n if (rowId !== null) {\n const id = this._parseId(rowId);\n if (input.checked) {\n this.selectRow(id);\n } else {\n this.deselectRow(id);\n }\n }\n };\n\n private _handleSelectAllChange = (e: Event): void => {\n const input = e.target as HTMLInputElement;\n if (input.checked) {\n this.selectAll();\n } else {\n this.deselectAll();\n }\n };\n\n private _parseId(idStr: string): string | number {\n const num = Number(idStr);\n return isNaN(num) ? idStr : num;\n }\n\n /** Select a row by ID */\n selectRow(id: string | number): void {\n if (this.selectionMode === 'single') {\n this._internalSelectedIds.clear();\n }\n this._internalSelectedIds.add(id);\n this._emitSelectionChange();\n }\n\n /** Deselect a row by ID */\n deselectRow(id: string | number): void {\n this._internalSelectedIds.delete(id);\n this._emitSelectionChange();\n }\n\n /** Toggle row selection */\n toggleRowSelection(id: string | number): void {\n if (this._internalSelectedIds.has(id)) {\n this.deselectRow(id);\n } else {\n this.selectRow(id);\n }\n }\n\n /** Select all visible rows */\n selectAll(): void {\n const visibleData = this._getProcessedData();\n visibleData.forEach((row) => this._internalSelectedIds.add(row.id));\n this._emitSelectionChange();\n }\n\n /** Deselect all rows */\n deselectAll(): void {\n this._internalSelectedIds.clear();\n this._emitSelectionChange();\n }\n\n /** Get currently selected rows */\n getSelectedRows(): TableRow[] {\n return this.data.filter((row) => this._internalSelectedIds.has(row.id));\n }\n\n private _emitSelectionChange(): void {\n this.selectedIds = Array.from(this._internalSelectedIds);\n this.emit<TableSelectEventDetail>('select', {\n selectedIds: this.selectedIds,\n selectedRows: this.getSelectedRows(),\n });\n this.update();\n }\n\n private _isRowSelected(row: TableRow): boolean {\n return this._internalSelectedIds.has(row.id);\n }\n\n private _isAllSelected(): boolean {\n const visibleData = this._getProcessedData();\n if (visibleData.length === 0) return false;\n return visibleData.every((row) => this._internalSelectedIds.has(row.id));\n }\n\n private _isSomeSelected(): boolean {\n const visibleData = this._getProcessedData();\n return (\n visibleData.some((row) => this._internalSelectedIds.has(row.id)) && !this._isAllSelected()\n );\n }\n\n // ============ Data Processing ============\n\n private _getEffectiveColumns(): TableColumn[] {\n // First check for columns prop\n if (this.columns && this.columns.length > 0) {\n return this.columns.filter((col) => !col.hidden);\n }\n\n // Fall back to child <el-dm-table-column> elements\n const columnElements = this.querySelectorAll('el-dm-table-column');\n const cols: TableColumn[] = [];\n\n columnElements.forEach((el) => {\n if (el instanceof ElDmTableColumn) {\n const colDef = el.toColumnDef();\n if (!colDef.hidden) {\n cols.push(colDef);\n }\n }\n });\n\n return cols;\n }\n\n private _getProcessedData(): TableRow[] {\n let result = [...(this.data || [])];\n result = this._sortData(result);\n result = this._paginateData(result);\n return result;\n }\n\n /** Get visible (processed) data */\n getVisibleData(): TableRow[] {\n return this._getProcessedData();\n }\n\n /** Refresh the table */\n refresh(): void {\n this.update();\n }\n\n // ============ Rendering ============\n\n private _formatCellValue(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n if (value instanceof Date) return value.toLocaleDateString();\n return String(value);\n }\n\n private _renderHeaderCell(column: TableColumn): string {\n const sortable = column.sortable;\n const isSorted = this.sortColumn === column.key;\n const sortIcon = isSorted\n ? this.sortDirection === 'asc'\n ? ICONS.sortAsc\n : ICONS.sortDesc\n : ICONS.sort;\n\n return `\n <th\n class=\"table-th ${sortable ? 'sortable' : ''} ${isSorted ? 'sorted' : ''}\"\n part=\"th\"\n data-column=\"${column.key}\"\n style=\"text-align: ${column.align || 'left'}; ${column.width ? `width: ${column.width};` : ''}\"\n scope=\"col\"\n ${sortable ? `role=\"columnheader\" aria-sort=\"${isSorted ? (this.sortDirection === 'asc' ? 'ascending' : 'descending') : 'none'}\" tabindex=\"0\"` : ''}\n >\n <span class=\"th-content\">\n <span>${column.label}</span>\n ${sortable ? `<span class=\"sort-icon\">${sortIcon}</span>` : ''}\n </span>\n </th>\n `;\n }\n\n private _renderSelectAllCell(): string {\n if (this.selectionMode !== 'multiple') {\n return '<th class=\"table-th select-cell\" part=\"th\"></th>';\n }\n\n const isAllSelected = this._isAllSelected();\n const isSomeSelected = this._isSomeSelected();\n\n return `\n <th class=\"table-th select-cell\" part=\"th\">\n <input\n type=\"checkbox\"\n class=\"select-all\"\n ${isAllSelected ? 'checked' : ''}\n ${isSomeSelected ? 'data-indeterminate=\"true\"' : ''}\n aria-label=\"Select all rows\"\n />\n </th>\n `;\n }\n\n private _renderSelectCell(row: TableRow): string {\n const isSelected = this._isRowSelected(row);\n const inputType = this.selectionMode === 'single' ? 'radio' : 'checkbox';\n\n return `\n <td class=\"table-td select-cell\" part=\"td\">\n <input\n type=\"${inputType}\"\n class=\"row-select\"\n name=\"table-selection\"\n data-row-id=\"${row.id}\"\n ${isSelected ? 'checked' : ''}\n aria-label=\"Select row\"\n />\n </td>\n `;\n }\n\n private _renderDataRow(row: TableRow, index: number, columns: TableColumn[]): string {\n const isSelected = this._isRowSelected(row);\n const showSelectionColumn = this.selectionMode !== 'none';\n\n return `\n <tr\n class=\"table-row ${isSelected ? 'selected' : ''}\"\n part=\"row\"\n data-row-id=\"${row.id}\"\n data-row-index=\"${index}\"\n ${isSelected ? 'aria-selected=\"true\"' : ''}\n >\n ${showSelectionColumn ? this._renderSelectCell(row) : ''}\n ${columns\n .map(\n (col) => `\n <td\n class=\"table-td\"\n part=\"td\"\n style=\"text-align: ${col.align || 'left'};\"\n >\n ${this._formatCellValue(row[col.key])}\n </td>\n `,\n )\n .join('')}\n </tr>\n `;\n }\n\n private _renderLoadingRow(colCount: number): string {\n const totalCols = this.selectionMode !== 'none' ? colCount + 1 : colCount;\n return `\n <tr class=\"loading-row\">\n <td colspan=\"${totalCols}\">\n <div class=\"loading-spinner\"></div>\n <div>Loading...</div>\n </td>\n </tr>\n `;\n }\n\n private _renderEmptyRow(colCount: number): string {\n const totalCols = this.selectionMode !== 'none' ? colCount + 1 : colCount;\n return `\n <tr class=\"empty-row\">\n <td colspan=\"${totalCols}\">\n <slot name=\"empty\">${this.emptyMessage}</slot>\n </td>\n </tr>\n `;\n }\n\n private _renderPagination(): string {\n const totalPages = this._getTotalPages();\n const showPageSizeSelect = this.pageSizeOptions && this.pageSizeOptions.length > 0;\n\n return `\n <div class=\"table-pagination\" part=\"pagination\">\n <div class=\"pagination-info\">\n Showing ${this._getStartRow()} to ${this._getEndRow()} of ${this.data.length} entries\n </div>\n <div class=\"pagination-controls\">\n ${\n showPageSizeSelect\n ? `\n <select class=\"page-size-select\" aria-label=\"Rows per page\">\n ${this.pageSizeOptions\n .map(\n (size) => `\n <option value=\"${size}\" ${size === this.pageSize ? 'selected' : ''}>\n ${size} / page\n </option>\n `,\n )\n .join('')}\n </select>\n `\n : ''\n }\n <div class=\"pagination-nav\">\n <button\n class=\"pagination-btn\"\n data-action=\"first\"\n ${this.page <= 1 ? 'disabled' : ''}\n aria-label=\"First page\"\n >${ICONS.chevronFirst}</button>\n <button\n class=\"pagination-btn\"\n data-action=\"prev\"\n ${this.page <= 1 ? 'disabled' : ''}\n aria-label=\"Previous page\"\n >${ICONS.chevronLeft}</button>\n <span class=\"pagination-current\">\n Page ${this.page} of ${totalPages}\n </span>\n <button\n class=\"pagination-btn\"\n data-action=\"next\"\n ${this.page >= totalPages ? 'disabled' : ''}\n aria-label=\"Next page\"\n >${ICONS.chevronRight}</button>\n <button\n class=\"pagination-btn\"\n data-action=\"last\"\n ${this.page >= totalPages ? 'disabled' : ''}\n aria-label=\"Last page\"\n >${ICONS.chevronLast}</button>\n </div>\n </div>\n </div>\n `;\n }\n\n protected render(): string {\n const columns = this._getEffectiveColumns();\n const processedData = this._getProcessedData();\n const showSelectionColumn = this.selectionMode !== 'none';\n\n return `\n <div class=\"table-wrapper\" part=\"wrapper\">\n <div class=\"table-header-actions\" part=\"header-actions\">\n <slot name=\"header-actions\"></slot>\n </div>\n\n <div class=\"table-container\" part=\"container\">\n <table class=\"table\" part=\"table\" role=\"grid\" aria-busy=\"${this.loading}\">\n <thead part=\"thead\">\n <tr part=\"header-row\">\n ${showSelectionColumn ? this._renderSelectAllCell() : ''}\n ${columns.map((col) => this._renderHeaderCell(col)).join('')}\n </tr>\n </thead>\n <tbody part=\"tbody\">\n ${this.loading ? this._renderLoadingRow(columns.length) : ''}\n ${!this.loading && processedData.length === 0 ? this._renderEmptyRow(columns.length) : ''}\n ${!this.loading ? processedData.map((row, idx) => this._renderDataRow(row, idx, columns)).join('') : ''}\n </tbody>\n </table>\n </div>\n\n ${this.paginated ? this._renderPagination() : ''}\n\n <div class=\"table-footer-actions\" part=\"footer-actions\">\n <slot name=\"footer-actions\"></slot>\n </div>\n </div>\n `;\n }\n}\n\nexport function registerTable(): void {\n if (!customElements.get('el-dm-table')) {\n customElements.define('el-dm-table', ElDmTable);\n }\n}\n",
6
+ "/**\n * DuskMoon Table Column Element\n *\n * Declarative column definition for el-dm-table.\n *\n * @element el-dm-table-column\n *\n * @attr {string} key - Column key for data mapping (required)\n * @attr {string} label - Column header label\n * @attr {boolean} sortable - Whether column is sortable\n * @attr {string} width - Column width (CSS value)\n * @attr {string} align - Text alignment: left, center, right\n * @attr {boolean} hidden - Whether column is hidden\n */\n\nimport { BaseElement } from '@duskmoon-dev/el-core';\nimport type { TableColumn } from './types.js';\n\nexport class ElDmTableColumn extends BaseElement {\n static properties = {\n key: { type: String, reflect: true },\n label: { type: String, reflect: true },\n sortable: { type: Boolean, reflect: true },\n width: { type: String, reflect: true },\n align: { type: String, reflect: true, default: 'left' },\n hidden: { type: Boolean, reflect: true },\n };\n\n declare key: string;\n declare label: string;\n declare sortable: boolean;\n declare width: string;\n declare align: 'left' | 'center' | 'right';\n declare hidden: boolean;\n\n connectedCallback(): void {\n super.connectedCallback();\n // Notify parent table that columns changed\n this._notifyParent();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n // Notify parent table that columns changed\n this._notifyParent();\n }\n\n private _notifyParent(): void {\n this.dispatchEvent(\n new CustomEvent('table-column-change', {\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /** Convert to TableColumn interface */\n toColumnDef(): TableColumn {\n return {\n key: this.key,\n label: this.label || this.key || '',\n sortable: this.sortable || false,\n width: this.width,\n align: this.align || 'left',\n hidden: this.hidden || false,\n };\n }\n\n protected render(): string {\n // Hidden element - no visual output, just holds data\n return `<slot></slot>`;\n }\n}\n\nexport function registerTableColumn(): void {\n if (!customElements.get('el-dm-table-column')) {\n customElements.define('el-dm-table-column', ElDmTableColumn);\n }\n}\n",
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
+ "import { register } from './index.js';\nregister();\n"
9
+ ],
10
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BiC,IAAjC;;;ACZ4B,IAA5B;AAAA;AAGO,MAAM,wBAAwB,2BAAY;AAAA,SACxC,aAAa;AAAA,IAClB,KAAK,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACrC,UAAU,EAAE,MAAM,SAAS,SAAS,KAAK;AAAA,IACzC,OAAO,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,IACrC,OAAO,EAAE,MAAM,QAAQ,SAAS,MAAM,SAAS,OAAO;AAAA,IACtD,QAAQ,EAAE,MAAM,SAAS,SAAS,KAAK;AAAA,EACzC;AAAA,EASA,iBAAiB,GAAS;AAAA,IACxB,MAAM,kBAAkB;AAAA,IAExB,KAAK,cAAc;AAAA;AAAA,EAGrB,oBAAoB,GAAS;AAAA,IAC3B,MAAM,qBAAqB;AAAA,IAE3B,KAAK,cAAc;AAAA;AAAA,EAGb,aAAa,GAAS;AAAA,IAC5B,KAAK,cACH,IAAI,YAAY,uBAAuB;AAAA,MACrC,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC,CACH;AAAA;AAAA,EAIF,WAAW,GAAgB;AAAA,IACzB,OAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,OAAO,KAAK,SAAS,KAAK,OAAO;AAAA,MACjC,UAAU,KAAK,YAAY;AAAA,MAC3B,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK,SAAS;AAAA,MACrB,QAAQ,KAAK,UAAU;AAAA,IACzB;AAAA;AAAA,EAGQ,MAAM,GAAW;AAAA,IAEzB,OAAO;AAAA;AAEX;AAEO,SAAS,mBAAmB,GAAS;AAAA,EAC1C,IAAI,CAAC,eAAe,IAAI,oBAAoB,GAAG;AAAA,IAC7C,eAAe,OAAO,sBAAsB,eAAe;AAAA,EAC7D;AAAA;;;ADpCF,IAAM,QAAQ;AAAA,EACZ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AACf;AAEA,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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",
11
+ "debugId": "4218FA58F85C0BD264756E2164756E21",
12
+ "names": []
13
+ }