@verbb/plugin-kit-web 2.0.17 → 2.0.18
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/CHANGELOG.md +5 -0
- package/dist/chunks/{pk-editable-table-BoqfveXO.js → pk-editable-table-BubcKCBn.js} +11 -6
- package/dist/chunks/{pk-editable-table-BoqfveXO.js.map → pk-editable-table-BubcKCBn.js.map} +1 -1
- package/dist/chunks/{register-aJw-9RWi.js → register-Bw9kG690.js} +2 -2
- package/dist/chunks/{register-aJw-9RWi.js.map → register-Bw9kG690.js.map} +1 -1
- package/dist/components/editable-table/pk-editable-table.d.ts.map +1 -1
- package/dist/components/editable-table/pk-editable-table.js +1 -1
- package/dist/components/editable-table.js +1 -1
- package/dist/index.js +2 -2
- package/dist/register.js +2 -2
- package/dist-loader/components/editable-table/editable-table.js +10 -5
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1244,7 +1244,12 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
|
|
|
1244
1244
|
moveRow(rowIndex, direction) {
|
|
1245
1245
|
const target = rowIndex + direction;
|
|
1246
1246
|
if (this.disabled || target < 0 || target >= this.internalRows.length) return;
|
|
1247
|
+
const rowId = String(this.internalRows[rowIndex]._id);
|
|
1248
|
+
const trigger = this.renderRoot.querySelector(`tr[data-row-id="${CSS.escape(rowId)}"] pk-button[slot="trigger"]`);
|
|
1247
1249
|
this.commitReorder(rowIndex, target);
|
|
1250
|
+
this.updateComplete.then(() => {
|
|
1251
|
+
if (trigger?.isConnected) trigger.focus({ preventScroll: true });
|
|
1252
|
+
});
|
|
1248
1253
|
}
|
|
1249
1254
|
commitReorder(fromIndex, toIndex) {
|
|
1250
1255
|
if (this.disabled || fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= this.internalRows.length || toIndex >= this.internalRows.length) return;
|
|
@@ -1499,7 +1504,7 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
|
|
|
1499
1504
|
radio-group=${item.radioGroup ?? nothing}
|
|
1500
1505
|
?checked=${Boolean(item.checked)}
|
|
1501
1506
|
?disabled=${this.disabled || Boolean(item.disabled)}
|
|
1502
|
-
@
|
|
1507
|
+
@pk-select=${() => {
|
|
1503
1508
|
if (this.disabled || item.disabled) return;
|
|
1504
1509
|
this.dispatchEvent(new CustomEvent("pk-row-menu-select", {
|
|
1505
1510
|
detail: {
|
|
@@ -1580,7 +1585,7 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
|
|
|
1580
1585
|
${this.allowInsert ? html`
|
|
1581
1586
|
<pk-dropdown-item
|
|
1582
1587
|
?disabled=${insertDisabled}
|
|
1583
|
-
@
|
|
1588
|
+
@pk-select=${() => {
|
|
1584
1589
|
this.insertRowAt(rowIndex);
|
|
1585
1590
|
}}
|
|
1586
1591
|
>
|
|
@@ -1589,7 +1594,7 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
|
|
|
1589
1594
|
</pk-dropdown-item>
|
|
1590
1595
|
<pk-dropdown-item
|
|
1591
1596
|
?disabled=${insertDisabled}
|
|
1592
|
-
@
|
|
1597
|
+
@pk-select=${() => {
|
|
1593
1598
|
this.insertRowAt(rowIndex + 1);
|
|
1594
1599
|
}}
|
|
1595
1600
|
>
|
|
@@ -1599,7 +1604,7 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
|
|
|
1599
1604
|
${this.allowReorder ? html`
|
|
1600
1605
|
<pk-dropdown-item
|
|
1601
1606
|
?disabled=${this.disabled || rowIndex === 0}
|
|
1602
|
-
@
|
|
1607
|
+
@pk-select=${() => {
|
|
1603
1608
|
this.moveRow(rowIndex, -1);
|
|
1604
1609
|
}}
|
|
1605
1610
|
>
|
|
@@ -1608,7 +1613,7 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
|
|
|
1608
1613
|
</pk-dropdown-item>
|
|
1609
1614
|
<pk-dropdown-item
|
|
1610
1615
|
?disabled=${this.disabled || rowIndex === rowCount - 1}
|
|
1611
|
-
@
|
|
1616
|
+
@pk-select=${() => {
|
|
1612
1617
|
this.moveRow(rowIndex, 1);
|
|
1613
1618
|
}}
|
|
1614
1619
|
>
|
|
@@ -1719,4 +1724,4 @@ PkEditableTable = __decorate([customElement("pk-editable-table")], PkEditableTab
|
|
|
1719
1724
|
//#endregion
|
|
1720
1725
|
export { nextRowId as a, isCustomColumn as i, BUILTIN_COLUMN_TYPES as n, getCustomCellSlotName as r, PkEditableTable as t };
|
|
1721
1726
|
|
|
1722
|
-
//# sourceMappingURL=pk-editable-table-
|
|
1727
|
+
//# sourceMappingURL=pk-editable-table-BubcKCBn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pk-editable-table-BoqfveXO.js","names":[],"sources":["../../src/components/editable-table/editable-table-dnd.ts","../../src/components/editable-table/pk-editable-table.styles.ts","../../src/components/editable-table/editable-table-model.ts","../../src/components/editable-table/pk-editable-table.ts"],"sourcesContent":["export type EditableTableSortableRow = {\n id: string;\n element: HTMLTableRowElement;\n handle?: HTMLElement;\n};\n\nexport type EditableTableDndCallbacks = {\n /**\n * Commit reorder from the seated DOM order (stable `data-row-id`s).\n * Prefer this over from/to indices — the floated source row stays in the\n * tbody during drag, so index math is easy to get wrong after cancels.\n */\n onReorderTo: (orderedIds: string[]) => void;\n};\n\n/**\n * Table-native pointer drag for `<pk-editable-table>` rows.\n *\n * The live source `<tr>` becomes the floating overlay (same custom-element\n * instances — no clone reflow / “shift”). A hidden placeholder clone stays in\n * the tbody as the gap. Overlay motion is vertical-axis + tbody constrained.\n * Gap steps when the probe enters ~30% of a neighbor (direction-aware).\n * Drop commits by reading `data-row-id` order after seating — not index arithmetic.\n */\nexport class EditableTableDndController {\n /** Fraction of each row height for the direction-aware swap band. */\n private static readonly SWAP_INSET = 0.3;\n\n private rows: EditableTableSortableRow[] = [];\n private disabled = false;\n private handleCleanups: Array<() => void> = [];\n private dragSession: DragSession | null = null;\n\n constructor(private readonly callbacks: EditableTableDndCallbacks) {}\n\n get isActive(): boolean {\n return this.handleCleanups.length > 0;\n }\n\n /** Lit must not reconcile tbody while pointer drag owns row order. */\n get isSessionActive(): boolean {\n return this.dragSession !== null;\n }\n\n sync(rows: EditableTableSortableRow[], disabled: boolean): void {\n if (this.dragSession) {\n return;\n }\n\n this.destroyHandles();\n this.rows = rows;\n this.disabled = disabled;\n\n for (const row of rows) {\n if (!row.handle) {\n continue;\n }\n\n const onPointerDown = (event: PointerEvent) => {\n this.handlePointerDown(event, row);\n };\n\n row.handle.addEventListener('pointerdown', onPointerDown);\n this.handleCleanups.push(() => {\n row.handle?.removeEventListener('pointerdown', onPointerDown);\n });\n }\n }\n\n destroy(): void {\n this.cancelDrag();\n this.destroyHandles();\n this.rows = [];\n }\n\n private handlePointerDown(event: PointerEvent, row: EditableTableSortableRow): void {\n if (\n this.disabled\n || this.dragSession\n || event.button !== 0\n || !event.isPrimary\n ) {\n return;\n }\n\n const fromIndex = this.rows.findIndex((candidate) => candidate.id === row.id);\n const tbody = row.element.parentElement;\n const table = row.element.closest('table');\n if (\n fromIndex < 0\n || !(tbody instanceof HTMLTableSectionElement)\n || !(table instanceof HTMLTableElement)\n ) {\n return;\n }\n\n event.preventDefault();\n\n const cellWidths = [...row.element.cells].map((cell) => cell.getBoundingClientRect().width);\n const unfreezeColumns = this.freezeTableColumns(table, cellWidths);\n const sourceRect = row.element.getBoundingClientRect();\n const tbodyRect = tbody.getBoundingClientRect();\n const pointerOffset = {\n x: event.clientX - sourceRect.left,\n y: event.clientY - sourceRect.top,\n };\n\n const placeholder = this.createPlaceholder(row.element, cellWidths, sourceRect.height);\n row.element.insertAdjacentElement('afterend', placeholder);\n\n // Float the live row — true visual snapshot (same pk-* instances, no clone shift).\n const fixedOrigin = this.liftRow(row.element, sourceRect, cellWidths);\n\n const session: DragSession = {\n row,\n fromIndex,\n table,\n tbody,\n placeholder,\n pointerId: event.pointerId,\n pointerOffset,\n startLeft: sourceRect.left,\n rowHeight: sourceRect.height,\n tbodyTop: tbodyRect.top,\n tbodyBottom: tbodyRect.bottom,\n fixedOrigin,\n unfreezeColumns,\n cleanup: [],\n committed: false,\n };\n\n const doc = row.element.ownerDocument;\n const onPointerMove = (moveEvent: PointerEvent) => {\n if (moveEvent.pointerId !== session.pointerId || session.committed) {\n return;\n }\n\n moveEvent.preventDefault();\n const liveTbody = session.tbody.getBoundingClientRect();\n session.tbodyTop = liveTbody.top;\n session.tbodyBottom = liveTbody.bottom;\n this.updateOverlay(session, moveEvent.clientY);\n this.updateGap(session, moveEvent.clientY - session.pointerOffset.y + session.rowHeight / 2);\n };\n\n const onPointerUp = (upEvent: PointerEvent) => {\n if (upEvent.pointerId !== session.pointerId || session.committed) {\n return;\n }\n\n upEvent.preventDefault();\n this.commitDrag(session);\n };\n\n const onPointerCancel = (cancelEvent: PointerEvent) => {\n if (cancelEvent.pointerId !== session.pointerId || session.committed) {\n return;\n }\n // Browser cancel must restore original slot — seating at the live\n // placeholder without a data commit left DOM/data diverged (random jumps).\n this.cancelDrag();\n };\n\n doc.addEventListener('pointermove', onPointerMove, { passive: false });\n doc.addEventListener('pointerup', onPointerUp, { passive: false });\n doc.addEventListener('pointercancel', onPointerCancel);\n session.cleanup.push(\n () => { doc.removeEventListener('pointermove', onPointerMove); },\n () => { doc.removeEventListener('pointerup', onPointerUp); },\n () => { doc.removeEventListener('pointercancel', onPointerCancel); },\n );\n\n this.dragSession = session;\n this.updateOverlay(session, event.clientY);\n }\n\n /** Vertical-axis + tbody-container constraints on the live floated row. */\n private updateOverlay(session: DragSession, clientY: number): void {\n const rawTop = clientY - session.pointerOffset.y;\n const minTop = session.tbodyTop;\n const maxTop = Math.max(minTop, session.tbodyBottom - session.rowHeight);\n const top = Math.min(maxTop, Math.max(minTop, rawTop));\n const row = session.row.element;\n // Viewport coords minus the fixed-positioning origin — a transformed ancestor\n // (e.g. pk-dialog panel) re-bases position:fixed away from the viewport.\n row.style.top = `${top - session.fixedOrigin.y}px`;\n row.style.left = `${session.startLeft - session.fixedOrigin.x}px`;\n }\n\n /**\n * Project the gap from the probe against the full row list.\n * Threshold is direction-aware so drag-up and drag-down feel the same.\n */\n private updateGap(session: DragSession, probeY: number): void {\n const placeholder = session.placeholder;\n const source = session.row.element;\n const rows = [...session.tbody.querySelectorAll<HTMLTableRowElement>('tr[data-row-id]')].filter(\n (row) => row !== source && !row.hasAttribute('data-pk-dnd-placeholder'),\n );\n\n const placeholderRect = placeholder.getBoundingClientRect();\n const movingUp = probeY < placeholderRect.top + placeholderRect.height / 2;\n const inset = EditableTableDndController.SWAP_INSET;\n\n let before: HTMLTableRowElement | null = null;\n for (const row of rows) {\n const rect = row.getBoundingClientRect();\n if (rect.height <= 0) {\n continue;\n }\n\n const thresholdY = movingUp\n ? rect.top + rect.height * (1 - inset)\n : rect.top + rect.height * inset;\n\n if (probeY < thresholdY) {\n before = row;\n break;\n }\n }\n\n if (before) {\n if (placeholder.nextElementSibling !== before) {\n session.tbody.insertBefore(placeholder, before);\n }\n return;\n }\n\n if (session.tbody.lastElementChild !== placeholder) {\n session.tbody.append(placeholder);\n }\n }\n\n private commitDrag(session: DragSession): void {\n if (session.committed || this.dragSession !== session) {\n return;\n }\n session.committed = true;\n\n // Seat the live row where the placeholder is — DOM order is source of truth.\n this.cleanupDrag(session);\n this.dragSession = null;\n\n const orderedIds = [...session.tbody.querySelectorAll<HTMLTableRowElement>('tr[data-row-id]')]\n .map((row) => row.dataset.rowId ?? '')\n .filter((id) => id !== '');\n\n this.callbacks.onReorderTo(orderedIds);\n }\n\n private cancelDrag(): void {\n const session = this.dragSession;\n if (!session || session.committed) {\n return;\n }\n session.committed = true;\n\n // Restore the gap to the pre-drag slot before seating, so we don't leave\n // a visually moved DOM that Lit later snaps back (or compounds on next drop).\n this.restorePlaceholderToOrigin(session);\n this.cleanupDrag(session);\n this.dragSession = null;\n }\n\n private restorePlaceholderToOrigin(session: DragSession): void {\n const others = [...session.tbody.querySelectorAll<HTMLTableRowElement>('tr[data-row-id]')].filter(\n (row) => row !== session.row.element && !row.hasAttribute('data-pk-dnd-placeholder'),\n );\n\n // among others+placeholder, origin slot is fromIndex (source removed from the count).\n if (session.fromIndex >= others.length) {\n if (session.tbody.lastElementChild !== session.placeholder) {\n session.tbody.append(session.placeholder);\n }\n return;\n }\n\n const before = others[session.fromIndex];\n if (before && session.placeholder.nextElementSibling !== before) {\n session.tbody.insertBefore(session.placeholder, before);\n }\n }\n\n private cleanupDrag(session: DragSession): void {\n for (const cleanup of session.cleanup) {\n cleanup();\n }\n\n const row = session.row.element;\n // Seat the live row where the placeholder was, then drop float styles.\n session.placeholder.replaceWith(row);\n this.unliftRow(row);\n session.unfreezeColumns();\n }\n\n private freezeTableColumns(table: HTMLTableElement, widths: number[]): () => void {\n const previous = table.querySelector(':scope > colgroup[data-pk-dnd-cols]');\n previous?.remove();\n\n const colgroup = table.ownerDocument.createElement('colgroup');\n colgroup.setAttribute('data-pk-dnd-cols', 'true');\n for (const width of widths) {\n const col = table.ownerDocument.createElement('col');\n col.style.width = `${width}px`;\n colgroup.append(col);\n }\n\n const previousLayout = table.style.tableLayout;\n table.prepend(colgroup);\n table.style.tableLayout = 'fixed';\n return () => {\n colgroup.remove();\n table.style.tableLayout = previousLayout;\n };\n }\n\n private createPlaceholder(\n row: HTMLTableRowElement,\n cellWidths: number[],\n height: number,\n ): HTMLTableRowElement {\n const placeholder = row.cloneNode(true) as HTMLTableRowElement;\n placeholder.setAttribute('data-pk-dnd-placeholder', 'true');\n placeholder.setAttribute('aria-hidden', 'true');\n placeholder.removeAttribute('data-row-id');\n placeholder.style.visibility = 'hidden';\n placeholder.style.pointerEvents = 'none';\n placeholder.style.height = `${height}px`;\n\n [...placeholder.cells].forEach((cell, index) => {\n const width = cellWidths[index];\n if (typeof width === 'number') {\n cell.style.width = `${width}px`;\n cell.style.minWidth = `${width}px`;\n cell.style.maxWidth = `${width}px`;\n cell.style.boxSizing = 'border-box';\n }\n // Drop cloned controls so they don't upgrade / steal focus while hidden.\n cell.replaceChildren();\n });\n\n return placeholder;\n }\n\n /**\n * Promote the live row to a fixed overlay. Same pattern dnd-kit Feedback uses\n * for `<tr>`: pin cell widths, then position:fixed (raw TR rects go 0×0 otherwise).\n *\n * Returns the fixed-positioning origin in viewport coords. `position: fixed`\n * is viewport-based only when no ancestor is a containing block; a transformed\n * ancestor (pk-dialog panel animation, filters, contain) re-bases it, which\n * silently threw the overlay outside the dialog and made the row \"disappear\".\n */\n private liftRow(row: HTMLTableRowElement, rect: DOMRect, cellWidths: number[]): { x: number; y: number } {\n row.classList.add('is-dragging');\n [...row.cells].forEach((cell, index) => {\n const width = cellWidths[index];\n if (typeof width === 'number') {\n cell.style.width = `${width}px`;\n cell.style.minWidth = `${width}px`;\n cell.style.maxWidth = `${width}px`;\n cell.style.boxSizing = 'border-box';\n }\n });\n\n row.style.position = 'fixed';\n // Probe where fixed (0,0) actually lands before applying real coords.\n row.style.top = '0px';\n row.style.left = '0px';\n row.style.width = `${rect.width}px`;\n row.style.height = `${rect.height}px`;\n row.style.margin = '0';\n row.style.zIndex = '2147483647';\n row.style.pointerEvents = 'none';\n // Tailwind shadow-lg — softer / lower than the old single-layer slate drop.\n row.style.boxShadow = '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)';\n row.style.background = 'var(--pk-color-white, #fff)';\n row.style.opacity = '0.96';\n\n const probe = row.getBoundingClientRect();\n const fixedOrigin = { x: probe.left, y: probe.top };\n row.style.top = `${rect.top - fixedOrigin.y}px`;\n row.style.left = `${rect.left - fixedOrigin.x}px`;\n\n return fixedOrigin;\n }\n\n private unliftRow(row: HTMLTableRowElement): void {\n row.classList.remove('is-dragging');\n row.style.position = '';\n row.style.top = '';\n row.style.left = '';\n row.style.width = '';\n row.style.height = '';\n row.style.margin = '';\n row.style.zIndex = '';\n row.style.pointerEvents = '';\n row.style.boxShadow = '';\n row.style.background = '';\n row.style.opacity = '';\n\n for (const cell of row.cells) {\n cell.style.width = '';\n cell.style.minWidth = '';\n cell.style.maxWidth = '';\n cell.style.boxSizing = '';\n }\n }\n\n private destroyHandles(): void {\n for (const cleanup of this.handleCleanups) {\n cleanup();\n }\n this.handleCleanups = [];\n }\n}\n\ntype DragSession = {\n row: EditableTableSortableRow;\n fromIndex: number;\n table: HTMLTableElement;\n tbody: HTMLTableSectionElement;\n placeholder: HTMLTableRowElement;\n pointerId: number;\n pointerOffset: { x: number; y: number };\n startLeft: number;\n rowHeight: number;\n tbodyTop: number;\n tbodyBottom: number;\n /** Viewport offset of the fixed-positioning containing block (0,0 unless an ancestor re-bases fixed). */\n fixedOrigin: { x: number; y: number };\n unfreezeColumns: () => void;\n cleanup: Array<() => void>;\n /** Prevents double commit from pointerup + pointercancel. */\n committed: boolean;\n};\n","import { css } from 'lit';\n\nexport const pkEditableTableStyles = css`\n @layer pk-component {\n :host {\n display: block;\n font-family: var(--pk-font-family);\n /* Craft CP body text (~gray-700), not gray-900. */\n color: var(--pk-color-gray-700);\n /* Shell matches v1 Table: border-gray-200 + rounded-md (token md = 4px). */\n --pk-et-border: 1px solid var(--pk-color-gray-200, #e5e7eb);\n --pk-et-radius: var(--pk-radius-md, 4px);\n --pk-et-gridline: var(--pk-color-gray-100, #f3f4f6);\n /* Static row height — matches v1 TableCell h-[34px] (border-box). */\n --pk-et-cell-height: 34px;\n --pk-et-action-size: 24px;\n --pk-et-action-icon: 12px;\n /* Grip reads smaller than ellipsis/x at the same token — nudge up slightly. */\n --pk-et-action-grip-icon: 14px;\n }\n\n /* v1 Table: shell scrolls horizontally; Add row sits outside so it stays full-width. */\n .et-scroll {\n width: 100%;\n max-width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n border: var(--pk-et-border);\n border-radius: var(--pk-et-radius) var(--pk-et-radius) 0 0;\n background: var(--pk-color-white, #fff);\n }\n\n .et {\n /* v1 Table uses w-full: fill the shell, squish toward column width hints /\n * content minima, then overflow-x on .et-scroll takes over. */\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n background: var(--pk-color-white, #fff);\n }\n\n thead {\n background: var(--pk-color-gray-50, #f8fafc);\n }\n\n thead th {\n padding: 0.375rem 0.5rem;\n text-align: left;\n font-size: 12px;\n font-weight: 500;\n color: var(--pk-color-gray-700, #374151);\n background: var(--pk-color-gray-50, #f8fafc);\n /* v1 TableHead has no cell borders — body cells own the gridlines. */\n border: 0;\n white-space: nowrap;\n }\n\n tbody td + td {\n border-inline-start: 1px solid var(--pk-et-gridline);\n }\n\n thead th.thin,\n tbody td.thin {\n width: 0.01%;\n white-space: nowrap;\n }\n\n thead th.actions,\n tbody td.actions {\n width: 0.01%;\n white-space: nowrap;\n }\n\n tbody td.actions {\n padding-inline: 0.25rem;\n /* v1 TableRow actions cell — soft cool wash so controls read as chrome, not data. */\n background: #fbfcfe;\n }\n\n .required {\n margin-left: 0.125rem;\n color: var(--pk-color-rose-600, #e11d48);\n }\n\n tbody td {\n box-sizing: border-box;\n padding: 0;\n height: var(--pk-et-cell-height);\n background: var(--pk-color-white, #fff);\n /* v1 TableCell: border-t gray-100 — also separates header once th borders are gone. */\n border-top: 1px solid var(--pk-et-gridline);\n vertical-align: middle;\n /* Match v1 TableCell whitespace-nowrap — drives intrinsic mins before scroll. */\n white-space: nowrap;\n /* Let auto table layout compress past control preferred sizes. */\n min-width: 0;\n }\n\n tbody tr.is-dragging {\n opacity: 0.4;\n }\n\n /* Semantic row tones from modifyRow — host Tailwind cannot style shadow <tr>. */\n tbody tr[data-tone='warning'] > td {\n background: color-mix(in srgb, var(--pk-color-amber-50, #fffbeb) 80%, transparent);\n }\n\n tbody tr[data-tone='muted'] > td {\n background: color-mix(in srgb, var(--pk-color-slate-100, #f1f5f9) 90%, transparent);\n }\n\n .cell-pk-control {\n display: block;\n width: 100%;\n min-width: 0;\n height: var(--pk-et-cell-height);\n min-height: var(--pk-et-cell-height);\n --pk-input-border-radius: 0;\n --pk-select-border-radius: 0;\n --pk-date-picker-border-radius: 0;\n --pk-input-bg: var(--pk-color-white, #fff);\n --pk-combobox-fill: var(--pk-color-white, #fff);\n --pk-input-height: var(--pk-et-cell-height);\n }\n\n pk-input.cell-pk-control::part(base) {\n padding-inline: 0.5rem;\n background: var(--pk-color-white, #fff);\n }\n\n /* v1 EditableTable Input is text-sm (14px); size=xs would be 11px. */\n pk-input.cell-pk-control:not([mono])::part(input) {\n font-size: var(--pk-font-size-base, 14px);\n }\n\n /* v1 handle/value: font-mono text-[0.9em] — do not let the 14px cell\n * override wipe pk-input[mono]'s optical scale. */\n pk-input.cell-pk-control[mono]::part(input) {\n font-size: calc(var(--pk-font-size-base, 14px) * 0.9);\n line-height: var(--pk-line-height-mono, 1.5);\n }\n\n /* Select/combobox sit inset horizontally only (v1 TableCell px-2).\n * No block padding — vertical inset comes from the size=xs chip itself. */\n tbody td:has(> pk-select.cell-pk-control),\n tbody td:has(> pk-combobox.cell-pk-control) {\n padding: 0 0.5rem;\n }\n\n pk-select.cell-pk-control,\n pk-combobox.cell-pk-control {\n display: block;\n width: 100%;\n max-width: 100%;\n min-width: 0;\n /* Override shared .cell-pk-control height so the chip centers in the row. */\n height: auto;\n min-height: 0;\n /* Don't inherit the 34px cell --pk-input-height into the trigger. */\n --pk-input-height: auto;\n --pk-select-item-min-height: 0;\n }\n\n pk-input.cell-pk-control {\n /* Text-like cells fill the td. Inner input text keeps padding via ::part(base);\n * invalid chrome should hit the gridlines, not sit inside an inset chip. */\n height: var(--pk-et-cell-height);\n min-height: var(--pk-et-cell-height);\n }\n\n /* Date/time fill the cell flush — no trigger chrome (v1 border-none + h/w-full).\n * display:block so the inline-block host doesn't baseline-shift off center. */\n pk-date-picker.cell-pk-control,\n pk-time-picker.cell-pk-control {\n display: block;\n width: 100%;\n min-width: 0;\n height: var(--pk-et-cell-height);\n --pk-date-picker-height: var(--pk-et-cell-height);\n --pk-date-picker-min-width: 0;\n --pk-select-item-min-height: var(--pk-et-cell-height);\n --pk-select-trigger-border-width: 0;\n }\n\n /* The base trigger sizes to 100% of the host, but the shared form-control\n * wrappers default to auto height, collapsing that chain and top-aligning\n * the date. Stretch the wrappers so 100% resolves and align-items centers. */\n pk-date-picker.cell-pk-control::part(form-control),\n pk-date-picker.cell-pk-control::part(form-control-input) {\n height: 100%;\n }\n\n pk-date-picker.cell-pk-control::part(base) {\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 100%;\n border: 0;\n border-radius: 0;\n background: transparent;\n }\n\n pk-date-picker.cell-pk-control::part(base):focus-visible {\n box-shadow: inset 0 0 0 1px var(--pk-color-gray-200, #e5e7eb);\n }\n\n pk-time-picker.cell-pk-control::part(control) {\n width: 100%;\n min-width: 0;\n height: 100% !important;\n min-height: 100% !important;\n border: 0 !important;\n border-radius: 0 !important;\n background: transparent !important;\n background-color: transparent !important;\n }\n\n pk-time-picker.cell-pk-control::part(control):focus-visible {\n box-shadow: inset 0 0 0 1px var(--pk-color-gray-200, #e5e7eb);\n }\n\n td.has-error .cell-pk-control {\n --pk-input-border-color: var(--pk-color-rose-600, #e11d48);\n }\n\n /* Flush/borderless date/time only — select/combobox/color paint their own\n * invalid chrome via ?invalid, so a host ring would double up. */\n td.has-error pk-date-picker.cell-pk-control,\n td.has-error pk-time-picker.cell-pk-control {\n box-shadow: inset 0 0 0 1px var(--pk-color-rose-600, #e11d48);\n }\n\n .cell-static {\n padding: 0.5rem;\n font-size: var(--pk-font-size-base, 14px);\n line-height: 1.4;\n color: inherit;\n }\n\n /* Custom / slotted cells — fill the td; light-DOM content keeps host styles. */\n .cell-slot {\n display: block;\n width: 100%;\n min-width: 0;\n min-height: var(--pk-et-cell-height);\n height: 100%;\n }\n\n .cell-slot ::slotted(*) {\n display: block;\n width: 100%;\n min-width: 0;\n min-height: var(--pk-et-cell-height);\n box-sizing: border-box;\n }\n\n .cell-heading {\n font-weight: 600;\n color: var(--pk-color-gray-800, #1f2937);\n }\n\n .cell-mono {\n font-family: var(--pk-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);\n font-size: var(--pk-font-size-mono, 0.9em);\n line-height: var(--pk-line-height-mono, 1.5);\n }\n\n .cell-check {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--pk-et-cell-height);\n min-width: 2.125rem;\n }\n\n .cell-check--switch {\n min-width: 3rem;\n }\n\n pk-checkbox,\n pk-radio,\n pk-lightswitch {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .row-actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n /* v1 packs 24px action buttons flush — no gap between hitboxes. */\n gap: 0;\n }\n\n .row-actions pk-dropdown-menu {\n display: inline-flex;\n }\n\n /* Action row buttons: fixed 24px hitbox (v1), variant=none, icon-only color hover. */\n .row-actions pk-button.action-btn {\n --pk-btn-height: var(--pk-et-action-size);\n --pk-btn-icon-size: var(--pk-et-action-icon);\n --pk-btn-padding-inline: 0;\n color: var(--pk-color-gray-500, #6b7280);\n width: var(--pk-et-action-size);\n flex: 0 0 var(--pk-et-action-size);\n }\n\n .row-actions pk-button.action-btn::part(base) {\n width: var(--pk-et-action-size);\n height: var(--pk-et-action-size);\n min-height: var(--pk-et-action-size);\n padding: 0;\n background: transparent;\n }\n\n .row-actions pk-button.action-btn::part(base):hover:not(:disabled) {\n /* No hover fill — only the glyph color shifts (v1 hover:bg-transparent). */\n background: transparent;\n color: var(--pk-color-sky-600, #0284c7);\n }\n\n .row-actions pk-button.action-btn.action-delete::part(base):hover:not(:disabled) {\n background: transparent;\n color: var(--pk-color-rose-500, #f43f5e);\n }\n\n .row-actions pk-button.action-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n /* Light-DOM handle wrapper (v1) — pointer drag binds here so shadow clicks don't interfere.\n pk-button :host { cursor: pointer } wins over inherited span cursor — set it on the host. */\n .row-actions .action-handle {\n display: inline-flex;\n cursor: move;\n }\n\n .row-actions .action-handle pk-button.action-btn {\n cursor: move;\n --pk-btn-icon-size: var(--pk-et-action-grip-icon);\n }\n\n .row-actions .action-handle:has(pk-button:disabled),\n .row-actions .action-handle pk-button.action-btn[disabled] {\n cursor: default;\n }\n\n /* Before deferred drag binding — grip visible but inactive (v1 faded controls). */\n .row-actions .action-handle.is-pending {\n opacity: 0.45;\n }\n\n /* Live row is floated as the overlay; placeholder clone holds the gap. */\n tr.is-dragging {\n display: table-row;\n }\n\n tr[data-pk-dnd-placeholder] {\n visibility: hidden;\n pointer-events: none;\n }\n\n /* Attach dashed add-row under the table shell (v1 Button variant=dashed). */\n pk-button.add-row {\n display: block;\n width: 100%;\n margin-top: -1px;\n --pk-btn-radius: 0;\n }\n\n pk-button.add-row::part(base) {\n width: 100%;\n border-top: 0;\n border-radius: 0 0 var(--pk-et-radius) var(--pk-et-radius);\n }\n\n :host([disabled]) pk-button.add-row {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .empty {\n padding: 0.75rem 0.625rem;\n color: var(--pk-color-gray-500, #6b7280);\n font-size: 13px;\n }\n }\n`;\n","/**\n * Shared types and pure helpers for `<pk-editable-table>`.\n * Kept free of Lit so facades and tests can reuse the same shapes.\n */\n\nexport type PkEditableTableColumnType =\n | 'text'\n | 'textarea'\n | 'number'\n | 'email'\n | 'url'\n | 'select'\n | 'combobox'\n | 'checkbox'\n | 'radio'\n | 'lightswitch'\n | 'color'\n | 'date'\n | 'time'\n | 'heading'\n | 'label'\n | 'handle'\n | 'value'\n /** Light-DOM projection via named slot — see `getCustomCellSlotName`. */\n | 'custom';\n\nexport interface PkEditableTableOption {\n label: string;\n value: string;\n}\n\nexport interface PkEditableTableColumn {\n name: string;\n type?: PkEditableTableColumnType;\n label?: string;\n required?: boolean;\n placeholder?: string;\n /** Explicit CSS width for the column (e.g. `120px`, `20%`). */\n width?: string;\n /** Narrow, content-width column (defaults on for checkbox/lightswitch/radio). */\n thin?: boolean;\n /**\n * Extra class names on `<th>` / `<td>` (space-separated).\n * Prefer over framework-specific `className` — facades can map.\n */\n class?: string;\n options?: Array<PkEditableTableOption | string>;\n /**\n * For `handle` / `value` columns: derive from this source column while the\n * cell is empty / auto-filled. Manual edits stick until cleared.\n */\n source?: string;\n /** Radio columns: allow clearing the selected row (otherwise one must stay on). */\n allowUnselect?: boolean;\n}\n\nexport type PkEditableTableRow = Record<string, unknown> & { _id?: string };\n\n/**\n * Descriptor for an extra row-menu item (rendered inside the ellipsis menu).\n * Nested host→menu slots cannot feed `pk-dropdown-menu` light DOM, so extras\n * stay data-driven; frameworks handle product logic via `pk-row-menu-select`.\n */\nexport interface PkEditableTableRowMenuItem {\n label: string;\n type?: 'normal' | 'radio' | 'checkbox';\n value?: string;\n radioGroup?: string;\n checked?: boolean;\n disabled?: boolean;\n /** Echoed on `pk-row-menu-select` so consumers can branch without parsing labels. */\n action?: string;\n /** Kit icon registry name (e.g. `gear`) — rendered as `slot=\"start\"`. */\n icon?: string;\n}\n\nexport interface PkEditableTableRowModifier {\n /** Space-separated class names applied to the `<tr>`. */\n class?: string;\n /**\n * Accessible name for the row (`aria-label`). Not a hover tooltip —\n * use visible tone/chrome for sighted status.\n */\n title?: string;\n /**\n * Semantic row chrome styled inside the CE (host Tailwind cannot reach shadow `<tr>`).\n * `warning` ≈ amber highlight; `muted` ≈ slate/disabled highlight.\n */\n tone?: 'warning' | 'muted';\n}\n\nexport type PkEditableTableModifyColumn = (\n row: PkEditableTableRow,\n columnName: string,\n column: PkEditableTableColumn,\n rowIndex: number,\n) => Partial<PkEditableTableColumn> | null | undefined;\n\nexport type PkEditableTableModifyRow = (\n row: PkEditableTableRow,\n rowIndex: number,\n) => PkEditableTableRowModifier | null | undefined;\n\nexport type PkEditableTableGetRowMenuItems = (\n row: PkEditableTableRow,\n rowIndex: number,\n) => PkEditableTableRowMenuItem[] | null | undefined;\n\nexport const GENERATED_CELL_MODE = {\n EMPTY: 'empty',\n AUTO: 'auto',\n MANUAL: 'manual',\n SEEDED: 'seeded',\n} as const;\n\nexport type GeneratedCellMode = (typeof GENERATED_CELL_MODE)[keyof typeof GENERATED_CELL_MODE];\n\nexport const isGeneratedColumn = (column: PkEditableTableColumn): boolean => {\n return (column.type === 'handle' || column.type === 'value')\n && Boolean(column.name)\n && Boolean(column.source);\n};\n\nexport const isThinColumn = (column: PkEditableTableColumn): boolean => {\n return Boolean(\n column.thin\n || column.type === 'checkbox'\n || column.type === 'lightswitch'\n || column.type === 'radio',\n );\n};\n\nexport const isEmptyCellValue = (value: unknown): boolean => {\n return value === undefined || value === null || value === '';\n};\n\nexport const getGeneratedCellKey = (rowId: string, columnName: string): string => {\n return `${rowId}:${columnName}`;\n};\n\nexport const normalizeOptions = (options: PkEditableTableColumn['options']): PkEditableTableOption[] => {\n if (!Array.isArray(options)) {\n return [];\n }\n\n return options.map((option) => {\n if (typeof option === 'string') {\n return { label: option, value: option };\n }\n\n return { label: String(option.label ?? option.value ?? ''), value: String(option.value ?? '') };\n });\n};\n\nexport const defaultValueForColumn = (column: PkEditableTableColumn): unknown => {\n if (column.type === 'checkbox' || column.type === 'lightswitch' || column.type === 'radio') {\n return false;\n }\n\n return '';\n};\n\n/**\n * Craft-free handle slug for derived `handle` columns.\n * Mirrors the camelCase path of `@verbb/plugin-kit-core` `generateHandle` without `window.Craft`.\n */\nexport const generateHandle = (sourceValue: string): string => {\n const words = sourceValue\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/['\"'\"\"[\\](){}:]/g, '')\n .split(/[^a-z0-9]+/)\n .filter(Boolean);\n\n if (words.length === 0) {\n return '';\n }\n\n return words\n .map((word, index) => (index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)))\n .join('');\n};\n\nlet rowIdCounter = 0;\n\nexport const nextRowId = (): string => {\n rowIdCounter += 1;\n return `etr_${Date.now().toString(36)}_${rowIdCounter}`;\n};\n\n/** Named slot for a `type: 'custom'` cell — light-DOM projection into the `<td>`. */\nexport const getCustomCellSlotName = (rowId: string, columnName: string): string => {\n return `cell:${rowId}:${columnName}`;\n};\n\nexport const BUILTIN_COLUMN_TYPES = new Set<string>([\n 'text',\n 'textarea',\n 'number',\n 'email',\n 'url',\n 'select',\n 'combobox',\n 'checkbox',\n 'radio',\n 'lightswitch',\n 'color',\n 'date',\n 'time',\n 'heading',\n 'label',\n 'handle',\n 'value',\n 'custom',\n]);\n\nexport const isCustomColumn = (column: PkEditableTableColumn): boolean => {\n const type = column.type;\n if (type === 'custom') {\n return true;\n }\n\n // Unknown / product types (e.g. Formie `variablePicker`) project via custom slots.\n return typeof type === 'string' && !BUILTIN_COLUMN_TYPES.has(type);\n};\n\n/**\n * Column types that receive TSV paste *writes* (Craft `importData` fills textual\n * cells; checkbox/radio/lightswitch and static/custom cells are skipped).\n */\nconst PASTE_IMPORT_SKIP_TYPES = new Set<string>([\n 'checkbox',\n 'radio',\n 'lightswitch',\n 'heading',\n 'label',\n]);\n\n/**\n * Types that intercept multi-cell paste (Craft attaches `handlePaste` to textual\n * inputs except multiline — native paste stays on `textarea`).\n */\nconst PASTE_INTERCEPT_TYPES = new Set<string>([\n 'text',\n 'number',\n 'email',\n 'url',\n 'handle',\n 'value',\n 'color',\n 'date',\n 'time',\n]);\n\n/** Whether a multi-cell paste gesturing from this cell should run `importData`. */\nexport const columnInterceptsPaste = (column: PkEditableTableColumn): boolean => {\n if (isCustomColumn(column)) {\n return false;\n }\n\n return PASTE_INTERCEPT_TYPES.has(column.type ?? 'text');\n};\n\n/** Whether `importData` should write a clipboard cell into this column. */\nexport const columnAcceptsPasteImport = (column: PkEditableTableColumn): boolean => {\n if (isCustomColumn(column)) {\n return false;\n }\n\n return !PASTE_IMPORT_SKIP_TYPES.has(column.type ?? 'text');\n};\n\n/**\n * Craft `Craft.trim(text, ' \\\\n\\\\r')` — strip spaces/newlines from both ends so a\n * trailing spreadsheet newline does not create an empty extra row.\n */\nexport const trimClipboardText = (text: string): string => {\n return String(text ?? '').replace(/^[\\n\\r ]+|[\\n\\r ]+$/g, '');\n};\n\n/** True when clipboard looks like a multi-cell / multi-row TSV paste. */\nexport const isMultiCellClipboard = (text: string): boolean => {\n return /[\\t\\r\\n]/.test(text);\n};\n\n/**\n * Parse spreadsheet clipboard text into a grid (rows → cells).\n * Excel / Sheets copy as tab-separated values with newline-separated rows.\n */\nexport const parseTsvClipboard = (text: string): string[][] => {\n const trimmed = trimClipboardText(text);\n if (!trimmed) {\n return [];\n }\n\n return trimmed.split(/\\r?\\n|\\r/).map((line) => line.split('\\t'));\n};\n","import { html, nothing } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { customElement, property, state } from '../../decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport type { PropertyValues, TemplateResult } from 'lit';\nimport { arrowDown, arrowUp, ellipsis, gear, getIcon, gripMove, plus, xmark } from '@verbb/plugin-kit-icons';\n\nimport { PkFormAssociatedElement } from '../../base/pk-form-associated-element.js';\nimport { renderIconHtml } from '../../icons/index.js';\nimport { RequiredValidator } from '../../validators/index.js';\nimport '../button/pk-button.js';\nimport '../checkbox/pk-checkbox.js';\nimport '../color-input/pk-color-input.js';\nimport '../combobox/pk-combobox.js';\nimport '../date-picker/pk-date-picker.js';\nimport '../dropdown-menu/pk-dropdown-item.js';\nimport '../dropdown-menu/pk-dropdown-menu.js';\nimport '../input/pk-input.js';\nimport '../lightswitch/pk-lightswitch.js';\nimport '../select/pk-option.js';\nimport '../select/pk-select.js';\nimport '../textarea/pk-textarea.js';\nimport '../time-picker/pk-time-picker.js';\nimport { EditableTableDndController } from './editable-table-dnd.js';\nimport { pkEditableTableStyles } from './pk-editable-table.styles.js';\nimport {\n columnAcceptsPasteImport,\n columnInterceptsPaste,\n defaultValueForColumn,\n generateHandle,\n GENERATED_CELL_MODE,\n getCustomCellSlotName,\n getGeneratedCellKey,\n isCustomColumn,\n isEmptyCellValue,\n isGeneratedColumn,\n isMultiCellClipboard,\n isThinColumn,\n nextRowId,\n normalizeOptions,\n parseTsvClipboard,\n trimClipboardText,\n type GeneratedCellMode,\n type PkEditableTableColumn,\n type PkEditableTableColumnType,\n type PkEditableTableGetRowMenuItems,\n type PkEditableTableModifyColumn,\n type PkEditableTableModifyRow,\n type PkEditableTableOption,\n type PkEditableTableRow,\n type PkEditableTableRowMenuItem,\n type PkEditableTableRowModifier,\n} from './editable-table-model.js';\n\n/** Craft CP reorder diamond (`grip-move`). */\nconst START_GRIP_MOVE_ICON = renderIconHtml(gripMove).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\nconst START_ELLIPSIS_ICON = renderIconHtml(ellipsis).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\nconst START_ARROW_UP_ICON = renderIconHtml(arrowUp).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\nconst START_ARROW_DOWN_ICON = renderIconHtml(arrowDown).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\nconst START_XMARK_ICON = renderIconHtml(xmark).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\nconst START_PLUS_ICON = renderIconHtml(plus).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\nconst START_GEAR_ICON = renderIconHtml(gear).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\n\nconst startIconHtml = (iconName?: string): string => {\n if (!iconName) {\n return '';\n }\n\n if (iconName === 'gear') {\n return START_GEAR_ICON;\n }\n\n const icon = getIcon(iconName);\n if (!icon) {\n return '';\n }\n\n return renderIconHtml(icon).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\n};\n\nexport type {\n PkEditableTableColumn,\n PkEditableTableColumnType,\n PkEditableTableGetRowMenuItems,\n PkEditableTableModifyColumn,\n PkEditableTableModifyRow,\n PkEditableTableOption,\n PkEditableTableRow,\n PkEditableTableRowMenuItem,\n PkEditableTableRowModifier,\n} from './editable-table-model.js';\n\nexport {\n getCustomCellSlotName,\n isCustomColumn,\n nextRowId,\n} from './editable-table-model.js';\n\n/**\n * Editable table — inline-editable rows with add/delete and drag/keyboard reorder.\n * Form-associated: submits a JSON array of row objects (internal `_id`s stripped).\n *\n * Canonical composite; framework facades wrap this rather than reimplementing the table.\n * Cell controls compose the same `pk-*` primitives exposed to consumers so the web\n * component keeps v1/Craft feel while owning the canonical table behaviour.\n */\n@customElement('pk-editable-table')\nexport class PkEditableTable extends PkFormAssociatedElement {\n static override styles = pkEditableTableStyles;\n\n static override get validators() {\n return [...super.validators, RequiredValidator()];\n }\n\n @property({ attribute: false })\n columns: PkEditableTableColumn[] = [];\n\n @property({ attribute: false })\n rows: PkEditableTableRow[] = [];\n\n @property({ type: Boolean, reflect: true, attribute: 'allow-add' })\n allowAdd = true;\n\n @property({ type: Boolean, reflect: true, attribute: 'allow-delete' })\n allowDelete = true;\n\n @property({ type: Boolean, reflect: true, attribute: 'allow-reorder' })\n allowReorder = true;\n\n /**\n * Show Insert above / Insert below in the row ellipsis menu.\n * Insert still requires `allowAdd` (disabled at max rows when the host turns add off).\n */\n @property({ type: Boolean, reflect: true, attribute: 'allow-insert' })\n allowInsert = true;\n\n /**\n * Optional hard cap on row count. When set, add / insert / paste expansion stop\n * at this length even if `allowAdd` is still true mid-batch.\n */\n @property({ type: Number, attribute: 'max-rows' })\n maxRows: number | null = null;\n\n @property({ attribute: 'add-row-label' })\n addRowLabel = '';\n\n /**\n * Optional form-field prefix for `cellErrors` keys.\n * Looks up `${fieldName}.${rowIndex}.${columnName}` then falls back to `${rowIndex}.${columnName}`.\n */\n @property({ attribute: 'field-name' })\n fieldName = '';\n\n /** Errors keyed by `${rowIndex}.${columnName}` or `${fieldName}.${rowIndex}.${columnName}`. */\n @property({ attribute: false })\n cellErrors: Record<string, string[] | string> = {};\n\n /** Merged into each newly added row after column defaults. */\n @property({ attribute: false })\n newRowDefaults: Record<string, unknown> = {};\n\n /**\n * Per-cell column override (e.g. swap value column to a select based on another cell).\n * Return a partial column merged over the base definition for that render.\n */\n @property({ attribute: false })\n modifyColumn: PkEditableTableModifyColumn | null = null;\n\n /** Per-row presentation — class / accessible name / tone on the `<tr>`. */\n @property({ attribute: false })\n modifyRow: PkEditableTableModifyRow | null = null;\n\n /**\n * Extra ellipsis-menu items for a row (data descriptors — not React nodes).\n * Selection fires `pk-row-menu-select` with `{ rowIndex, row, item, action, value }`.\n */\n @property({ attribute: false })\n getRowMenuItems: PkEditableTableGetRowMenuItems | null = null;\n\n @state()\n private internalRows: PkEditableTableRow[] = [];\n\n /**\n * Deferred drag binding. Grips render immediately but stay inactive until idle\n * so large tables don't pay pointer-listener setup on first paint.\n */\n @state()\n private dndReady = false;\n\n /** Per-cell mode for generated handle/value columns (`rowId:columnName` → mode). */\n private generatedCellModes = new Map<string, GeneratedCellMode>();\n\n private dndController = new EditableTableDndController({\n onReorderTo: (orderedIds) => {\n this.commitReorderByIds(orderedIds);\n },\n });\n\n private dndIdleId: number | null = null;\n private dndTimeoutId: ReturnType<typeof setTimeout> | null = null;\n /** Skip drag rebinding when row identity/order is unchanged (typing shouldn't resync 195 rows). */\n private dndRowSignature = '';\n\n protected override willUpdate(changed: PropertyValues): void {\n if (changed.has('rows')) {\n const incoming = Array.isArray(this.rows) ? this.rows : [];\n const previous = this.internalRows;\n // Preserve row identity across controlled writes. emitChange / consumers\n // often echo rows without `_id`; minting fresh ids each keystroke would\n // drop generated-cell AUTO modes and freeze handle/value after 1 char.\n this.internalRows = incoming.map((row, index) => {\n const existingId = typeof row._id === 'string'\n ? row._id\n : (typeof previous[index]?._id === 'string' ? String(previous[index]._id) : nextRowId());\n return { ...row, _id: existingId };\n });\n this.syncGeneratedModesFromRows();\n this.syncFormValue();\n }\n\n if (changed.has('allowReorder') || changed.has('disabled')) {\n this.scheduleDndHydration();\n }\n\n super.willUpdate(changed);\n }\n\n override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n this.scheduleDndHydration();\n }\n\n protected override shouldUpdate(changed: PropertyValues): boolean {\n // Pointer drag owns <tbody> order. Any Lit reconcile (controlled rows echo,\n // cell chrome, etc.) snaps rows back and fights the overlay — freeze paint.\n if (this.dndController.isSessionActive) {\n return false;\n }\n\n return super.shouldUpdate(changed);\n }\n\n // Match base visibility — `PkFormAssociatedElement.updated` is public.\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (this.dndReady && this.allowReorder && !this.disabled) {\n // Skip while pointer drag owns tbody order (source row + placeholder).\n if (!this.dndController.isSessionActive) {\n this.syncDndSortables();\n }\n } else if (this.dndController.isActive && (!this.allowReorder || this.disabled || !this.dndReady)) {\n this.dndController.destroy();\n this.dndRowSignature = '';\n }\n }\n\n override disconnectedCallback(): void {\n this.cancelDndHydration();\n this.dndController.destroy();\n this.dndReady = false;\n super.disconnectedCallback();\n }\n\n /** Serialized rows, used for form submission and required validation (empty when no rows). */\n get value(): string {\n return this.internalRows.length ? JSON.stringify(this.cleanRows()) : '';\n }\n\n private get validColumns(): PkEditableTableColumn[] {\n return (Array.isArray(this.columns) ? this.columns : []).filter((column) => {\n return typeof column?.name === 'string' && column.name.trim() !== '';\n });\n }\n\n private get generatedColumns(): PkEditableTableColumn[] {\n return this.validColumns.filter(isGeneratedColumn);\n }\n\n private get showActionsColumn(): boolean {\n // Extra row-menu items / insert need the actions column even when reorder/delete are off.\n return this.allowReorder || this.allowDelete || this.allowInsert || Boolean(this.getRowMenuItems);\n }\n\n private cleanRows(): PkEditableTableRow[] {\n return this.internalRows.map((row) => {\n const { _id, ...rest } = row;\n void _id;\n return rest;\n });\n }\n\n /**\n * Public cell write path for slotted / framework-projected custom cells.\n * Prefer this over mutating `rows` locally so generated columns + events stay in sync.\n */\n setCellValue(rowIndex: number, columnName: string, value: unknown): void {\n const row = this.internalRows[rowIndex];\n if (!row) {\n return;\n }\n\n const base = this.validColumns.find((column) => column.name === columnName);\n if (!base) {\n return;\n }\n\n this.updateCell(rowIndex, this.resolveColumn(row, base, rowIndex), value);\n }\n\n private resolveColumn(\n row: PkEditableTableRow,\n column: PkEditableTableColumn,\n rowIndex: number,\n ): PkEditableTableColumn {\n const patch = this.modifyColumn?.(row, column.name, column, rowIndex);\n if (!patch || typeof patch !== 'object') {\n return column;\n }\n\n return { ...column, ...patch, name: column.name };\n }\n\n private resolveRowModifier(row: PkEditableTableRow, rowIndex: number): PkEditableTableRowModifier {\n const patch = this.modifyRow?.(row, rowIndex);\n if (!patch || typeof patch !== 'object') {\n return {};\n }\n\n return patch;\n }\n\n private resolveRowMenuItems(row: PkEditableTableRow, rowIndex: number): PkEditableTableRowMenuItem[] {\n const items = this.getRowMenuItems?.(row, rowIndex);\n return Array.isArray(items) ? items.filter((item) => item && typeof item.label === 'string') : [];\n }\n\n private syncGeneratedModesFromRows(): void {\n const generated = this.generatedColumns;\n if (this.internalRows.length === 0 || generated.length === 0) {\n this.generatedCellModes.clear();\n return;\n }\n\n const validKeys = new Set<string>();\n\n for (const row of this.internalRows) {\n const rowId = String(row._id);\n for (const column of generated) {\n const key = getGeneratedCellKey(rowId, column.name);\n validKeys.add(key);\n\n if (this.generatedCellModes.has(key)) {\n continue;\n }\n\n this.generatedCellModes.set(\n key,\n isEmptyCellValue(row[column.name]) ? GENERATED_CELL_MODE.EMPTY : GENERATED_CELL_MODE.SEEDED,\n );\n }\n }\n\n for (const key of [...this.generatedCellModes.keys()]) {\n if (!validKeys.has(key)) {\n this.generatedCellModes.delete(key);\n }\n }\n }\n\n protected override syncFormValue(): void {\n const serialized = JSON.stringify(this.cleanRows());\n this.setFormValue(serialized, serialized);\n }\n\n protected override restoreFormState(state: string | File | FormData | null): void {\n if (typeof state !== 'string') {\n return;\n }\n\n try {\n const parsed = JSON.parse(state);\n if (Array.isArray(parsed)) {\n this.rows = parsed;\n }\n } catch {\n // Ignore malformed restore payloads.\n }\n }\n\n /**\n * Inner cell controls (lightswitch, checkbox, select, pickers, inputs) all\n * dispatch `pk-change`/`input`/`change` with `bubbles` + `composed`, so those\n * events would otherwise escape this component's shadow root and masquerade as\n * the table's own events. Consumers bind `pk-change` and read `detail.rows`; a\n * leaked lightswitch `pk-change` carries `{ checked }` (no `rows`), which would\n * reset `rows` to `undefined` and wipe every row. We stop them at the table\n * wrapper — cell `@pk-change`/`@input` handlers already ran at their target, and\n * the table re-dispatches its own `{ rows }` payload from the host in emitChange.\n */\n private stopInnerControlEvent(event: Event): void {\n if (event.target !== this) {\n event.stopPropagation();\n }\n }\n\n private emitChange(): void {\n // Keep `_id` on the rows property / event so controlled bindings don't\n // invalidate generated-column AUTO tracking. Form submit still strips ids.\n const rows = this.internalRows.map((row) => ({ ...row }));\n this.rows = rows;\n this.syncFormValue();\n\n this.dispatchEvent(new CustomEvent<{ rows: PkEditableTableRow[] }>('pk-change', {\n detail: { rows },\n bubbles: true,\n composed: true,\n }));\n\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n private emitCellChange(rowIndex: number, columnName: string, value: unknown, row: PkEditableTableRow): void {\n this.dispatchEvent(new CustomEvent<{\n rowIndex: number;\n columnName: string;\n value: unknown;\n row: PkEditableTableRow;\n }>('pk-cell-change', {\n detail: { rowIndex, columnName, value, row },\n bubbles: true,\n composed: true,\n }));\n }\n\n private commitRows(next: PkEditableTableRow[], cellChanges: Array<{\n rowIndex: number;\n columnName: string;\n value: unknown;\n row: PkEditableTableRow;\n }> = []): void {\n this.internalRows = next;\n this.emitChange();\n for (const change of cellChanges) {\n this.emitCellChange(change.rowIndex, change.columnName, change.value, change.row);\n }\n }\n\n private updateCell(rowIndex: number, column: PkEditableTableColumn, value: unknown): void {\n const row = this.internalRows[rowIndex];\n if (!row) {\n return;\n }\n\n // Exclusive radio: checking one row clears others in that column.\n if (column.type === 'radio') {\n const nextChecked = Boolean(value);\n const allowUnselect = Boolean(column.allowUnselect);\n const next = this.internalRows.map((item) => ({ ...item }));\n const cellChanges: Array<{\n rowIndex: number;\n columnName: string;\n value: unknown;\n row: PkEditableTableRow;\n }> = [];\n\n if (nextChecked) {\n next.forEach((item, index) => {\n const target = index === rowIndex;\n if (Boolean(item[column.name]) !== target) {\n next[index] = { ...item, [column.name]: target };\n cellChanges.push({\n rowIndex: index,\n columnName: column.name,\n value: target,\n row: this.internalRows[index],\n });\n }\n });\n } else if (allowUnselect && Boolean(row[column.name])) {\n next[rowIndex] = { ...row, [column.name]: false };\n cellChanges.push({\n rowIndex,\n columnName: column.name,\n value: false,\n row,\n });\n } else {\n return;\n }\n\n if (cellChanges.length === 0) {\n return;\n }\n\n this.commitRows(next, cellChanges);\n return;\n }\n\n if (isGeneratedColumn(column)) {\n // Manual edits stick; clearing the cell returns it to auto-derived mode.\n this.generatedCellModes.set(\n getGeneratedCellKey(String(row._id), column.name),\n isEmptyCellValue(value) ? GENERATED_CELL_MODE.EMPTY : GENERATED_CELL_MODE.MANUAL,\n );\n }\n\n const sourceUpdate: Record<string, unknown> = { [column.name]: value };\n const derivedUpdates: Record<string, unknown> = {};\n\n for (const targetColumn of this.generatedColumns) {\n if (targetColumn.source !== column.name) {\n continue;\n }\n\n const targetKey = getGeneratedCellKey(String(row._id), targetColumn.name);\n const currentTargetValue = row[targetColumn.name];\n const existingMode = this.generatedCellModes.get(targetKey)\n ?? (isEmptyCellValue(currentTargetValue) ? GENERATED_CELL_MODE.EMPTY : GENERATED_CELL_MODE.SEEDED);\n\n // Manual or already-seeded cells stay put until cleared.\n if (existingMode === GENERATED_CELL_MODE.MANUAL || existingMode === GENERATED_CELL_MODE.SEEDED) {\n continue;\n }\n\n if (targetColumn.type === 'handle') {\n derivedUpdates[targetColumn.name] = generateHandle(String(value ?? ''));\n this.generatedCellModes.set(targetKey, GENERATED_CELL_MODE.AUTO);\n } else if (targetColumn.type === 'value') {\n derivedUpdates[targetColumn.name] = value;\n this.generatedCellModes.set(targetKey, GENERATED_CELL_MODE.AUTO);\n }\n }\n\n const allUpdates = { ...sourceUpdate, ...derivedUpdates };\n const hasRealChange = Object.entries(allUpdates).some(([key, nextValue]) => row[key] !== nextValue);\n if (!hasRealChange) {\n return;\n }\n\n const next = this.internalRows.slice();\n next[rowIndex] = { ...row, ...allUpdates };\n const cellChanges = Object.entries(allUpdates).map(([columnName, nextValue]) => ({\n rowIndex,\n columnName,\n value: nextValue,\n row,\n }));\n this.commitRows(next, cellChanges);\n }\n\n private canAddRow(currentCount = this.internalRows.length): boolean {\n if (this.disabled || !this.allowAdd) {\n return false;\n }\n\n if (this.maxRows != null && Number.isFinite(this.maxRows) && currentCount >= this.maxRows) {\n return false;\n }\n\n return true;\n }\n\n private createEmptyRow(): PkEditableTableRow | null {\n if (!this.canAddRow()) {\n return null;\n }\n\n const row: PkEditableTableRow = {\n _id: nextRowId(),\n ...(this.newRowDefaults && typeof this.newRowDefaults === 'object' ? this.newRowDefaults : {}),\n };\n\n for (const column of this.validColumns) {\n if (!(column.name in row)) {\n row[column.name] = defaultValueForColumn(column);\n }\n }\n\n return row;\n }\n\n private addRow(): void {\n const row = this.createEmptyRow();\n if (!row) {\n return;\n }\n\n this.internalRows = [...this.internalRows, row];\n this.syncGeneratedModesFromRows();\n this.emitChange();\n }\n\n /** Insert a blank row at `index` (0 = above first row). No-ops when add is disallowed. */\n private insertRowAt(index: number): void {\n const row = this.createEmptyRow();\n if (!row) {\n return;\n }\n\n const clamped = Math.max(0, Math.min(index, this.internalRows.length));\n const next = this.internalRows.slice();\n next.splice(clamped, 0, row);\n this.internalRows = next;\n this.syncGeneratedModesFromRows();\n this.emitChange();\n }\n\n private removeRow(rowIndex: number): void {\n if (this.disabled || !this.allowDelete) {\n return;\n }\n\n this.internalRows = this.internalRows.filter((_, index) => index !== rowIndex);\n this.syncGeneratedModesFromRows();\n this.emitChange();\n }\n\n /**\n * Craft EditableTable paste: intercept only when the clipboard has tabs/newlines.\n * Listens on the scroll wrapper so events compose out of cell control shadows.\n */\n private handleTablePaste(event: ClipboardEvent): void {\n if (this.disabled || !event.clipboardData) {\n return;\n }\n\n const data = trimClipboardText(\n event.clipboardData.getData('text/plain')\n || event.clipboardData.getData('Text')\n || '',\n );\n\n if (!isMultiCellClipboard(data)) {\n return;\n }\n\n const path = event.composedPath();\n let cell: HTMLTableCellElement | null = null;\n let row: HTMLTableRowElement | null = null;\n\n for (const node of path) {\n if (node instanceof HTMLTableCellElement && node.tagName === 'TD' && !node.classList.contains('actions')) {\n cell = node;\n }\n\n if (node instanceof HTMLTableRowElement && node.dataset.rowId) {\n row = node;\n break;\n }\n }\n\n if (!cell || !row) {\n return;\n }\n\n const rowIndex = this.internalRows.findIndex((item) => String(item._id) === row!.dataset.rowId);\n const cells = [...row.querySelectorAll<HTMLTableCellElement>(':scope > td:not(.actions)')];\n const columnIndex = cells.indexOf(cell);\n if (rowIndex < 0 || columnIndex < 0) {\n return;\n }\n\n const column = this.validColumns[columnIndex];\n // Match Craft: don't steal paste from multiline / non-textual cells.\n if (!column || !columnInterceptsPaste(column)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.importTsvData(data, rowIndex, columnIndex);\n }\n\n /**\n * Apply a TSV grid starting at `[startRowIndex, startColumnIndex]`.\n * Skips non-textual columns (checkbox etc.) but still advances the column\n * cursor — same as Craft writing only into matching `textarea`/`input`s.\n */\n private importTsvData(data: string, startRowIndex: number, startColumnIndex: number): void {\n const grid = parseTsvClipboard(data);\n if (grid.length === 0) {\n return;\n }\n\n const columns = this.validColumns;\n if (columns.length === 0 || startColumnIndex >= columns.length) {\n return;\n }\n\n const next = this.internalRows.map((row) => ({ ...row }));\n let rowIndex = startRowIndex;\n let mutated = false;\n\n for (let lineIndex = 0; lineIndex < grid.length; lineIndex++) {\n if (rowIndex >= next.length) {\n // Expand only while add is still allowed (maxRows checked against draft length).\n if (!this.canAddRow(next.length)) {\n break;\n }\n\n const created: PkEditableTableRow = {\n _id: nextRowId(),\n ...(this.newRowDefaults && typeof this.newRowDefaults === 'object' ? this.newRowDefaults : {}),\n };\n for (const column of columns) {\n if (!(column.name in created)) {\n created[column.name] = defaultValueForColumn(column);\n }\n }\n next.push(created);\n mutated = true;\n }\n\n const cells = grid[lineIndex] ?? [];\n const row = next[rowIndex];\n if (!row) {\n break;\n }\n\n let rowPatch: Record<string, unknown> | null = null;\n for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n const column = columns[startColumnIndex + cellIndex];\n if (!column) {\n break;\n }\n\n if (!columnAcceptsPasteImport(column)) {\n continue;\n }\n\n const value = cells[cellIndex] ?? '';\n if (row[column.name] === value) {\n continue;\n }\n\n rowPatch = rowPatch ?? {};\n rowPatch[column.name] = value;\n }\n\n if (rowPatch) {\n next[rowIndex] = { ...row, ...rowPatch };\n mutated = true;\n }\n\n rowIndex += 1;\n }\n\n if (!mutated) {\n return;\n }\n\n this.internalRows = next;\n this.syncGeneratedModesFromRows();\n this.emitChange();\n }\n\n private moveRow(rowIndex: number, direction: number): void {\n const target = rowIndex + direction;\n if (this.disabled || target < 0 || target >= this.internalRows.length) {\n return;\n }\n\n this.commitReorder(rowIndex, target);\n }\n\n private commitReorder(fromIndex: number, toIndex: number): void {\n if (\n this.disabled\n || fromIndex === toIndex\n || fromIndex < 0\n || toIndex < 0\n || fromIndex >= this.internalRows.length\n || toIndex >= this.internalRows.length\n ) {\n return;\n }\n\n const next = this.internalRows.slice();\n const [moved] = next.splice(fromIndex, 1);\n next.splice(toIndex, 0, moved);\n this.internalRows = next;\n this.emitChange();\n }\n\n /**\n * Apply DOM-seated order after pointer drag. Uses stable `_id`s so a floated\n * source row left in the tbody can't skew from/to index arithmetic — and so a\n * cancelled drag that briefly moved the placeholder can't desync data vs DOM.\n */\n private commitReorderByIds(orderedIds: string[]): void {\n if (this.disabled || orderedIds.length === 0) {\n return;\n }\n\n const byId = new Map(this.internalRows.map((row) => [String(row._id), row]));\n if (orderedIds.length !== byId.size) {\n return;\n }\n\n const next: PkEditableTableRow[] = [];\n for (const id of orderedIds) {\n const row = byId.get(id);\n if (!row) {\n return;\n }\n next.push(row);\n }\n\n const unchanged = next.every((row, index) => row === this.internalRows[index]);\n if (unchanged) {\n return;\n }\n\n this.internalRows = next;\n this.emitChange();\n }\n\n private scheduleDndHydration(): void {\n this.cancelDndHydration();\n\n if (!this.allowReorder || this.disabled) {\n this.dndReady = false;\n this.dndController.destroy();\n return;\n }\n\n if (this.dndReady) {\n return;\n }\n\n // Defer Sortable registration past first paint (v1 requestIdleCallback + 1200ms cap).\n const enableDnd = () => {\n this.dndIdleId = null;\n this.dndTimeoutId = null;\n this.dndReady = true;\n };\n\n if (typeof window !== 'undefined' && typeof window.requestIdleCallback === 'function') {\n this.dndIdleId = window.requestIdleCallback(enableDnd, { timeout: 1200 });\n } else {\n this.dndTimeoutId = setTimeout(enableDnd, 250);\n }\n }\n\n private cancelDndHydration(): void {\n if (this.dndIdleId !== null && typeof window !== 'undefined' && typeof window.cancelIdleCallback === 'function') {\n window.cancelIdleCallback(this.dndIdleId);\n this.dndIdleId = null;\n }\n\n if (this.dndTimeoutId !== null) {\n clearTimeout(this.dndTimeoutId);\n this.dndTimeoutId = null;\n }\n }\n\n private syncDndSortables(): void {\n if (this.dndController.isSessionActive) {\n return;\n }\n\n const signature = `${this.internalRows.map((row) => String(row._id)).join('\\0')}|${this.disabled ? '1' : '0'}`;\n if (signature === this.dndRowSignature && this.dndController.isActive) {\n return;\n }\n\n // Placeholder clones strip data-row-id; keep the :not guard for safety.\n const rows = [...this.renderRoot.querySelectorAll<HTMLTableRowElement>(\n 'tr[data-row-id]:not([data-pk-dnd-placeholder])',\n )];\n this.dndController.sync(\n rows.map((row) => ({\n id: row.dataset.rowId ?? '',\n element: row,\n // Light-DOM span (v1) — pk-button shadow clicks otherwise hit PointerSensor's 200ms delay.\n handle: row.querySelector<HTMLElement>('.action-handle') ?? undefined,\n })).filter((row) => row.id !== ''),\n this.disabled,\n );\n this.dndRowSignature = signature;\n }\n\n private getCellErrors(rowIndex: number, columnName: string): string[] {\n const prefixed = this.fieldName\n ? this.cellErrors?.[`${this.fieldName}.${rowIndex}.${columnName}`]\n : undefined;\n const bare = this.cellErrors?.[`${rowIndex}.${columnName}`];\n const errors = prefixed ?? bare;\n\n if (!errors) {\n return [];\n }\n\n return Array.isArray(errors) ? errors.map(String) : [String(errors)];\n }\n\n private readValueFromEvent(event: Event): string {\n const detail = (event as CustomEvent<{ value?: unknown }>).detail;\n if (detail && 'value' in detail) {\n return String(detail.value ?? '');\n }\n\n return String((event.target as { value?: unknown }).value ?? '');\n }\n\n private readCheckedFromEvent(event: Event): boolean {\n const detail = (event as CustomEvent<{ checked?: unknown }>).detail;\n if (detail && 'checked' in detail) {\n return Boolean(detail.checked);\n }\n\n return Boolean((event.target as { checked?: unknown }).checked);\n }\n\n private renderOptionElements(column: PkEditableTableColumn): TemplateResult[] {\n return normalizeOptions(column.options).map((option) => {\n return html`<pk-option value=${option.value}>${option.label}</pk-option>`;\n });\n }\n\n private renderSelectLike(\n column: PkEditableTableColumn,\n value: unknown,\n rowIndex: number,\n invalid: boolean,\n { combobox = false }: { combobox?: boolean } = {},\n ): TemplateResult {\n const current = String(value ?? '');\n\n if (combobox) {\n return html`<pk-combobox\n class=\"cell-pk-control\"\n size=\"sm\"\n width=\"full\"\n allow-custom-value\n .value=${current}\n placeholder=${column.placeholder ?? ''}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readValueFromEvent(event));\n }}\n >\n ${this.renderOptionElements(column)}\n </pk-combobox>`;\n }\n\n // size=xs matches v1 EditableTable SelectInput — sm (~34px) fills the row and\n // looks flush against the gridlines. Adjacent toolbar selects outside the table\n // (conditions Show/All, Field picker) stay size=sm on their own.\n return html`<pk-select\n class=\"cell-pk-control\"\n size=\"xs\"\n width=\"full\"\n .value=${current}\n placeholder=${column.placeholder ?? ''}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readValueFromEvent(event));\n }}\n >\n ${this.renderOptionElements(column)}\n </pk-select>`;\n }\n\n private renderCell(\n column: PkEditableTableColumn,\n row: PkEditableTableRow,\n rowIndex: number,\n invalid: boolean,\n ): TemplateResult {\n const value = row[column.name];\n const type: PkEditableTableColumnType = column.type ?? 'text';\n const onInput = (event: Event) => {\n this.updateCell(\n rowIndex,\n column,\n this.readValueFromEvent(event),\n );\n };\n\n if (isCustomColumn(column)) {\n // Light-DOM projection — frameworks fill `slot={getCustomCellSlotName(rowId, name)}`.\n return html`<div class=\"cell-slot\">\n <slot name=${getCustomCellSlotName(String(row._id), column.name)}></slot>\n </div>`;\n }\n\n if (type === 'heading') {\n return html`<div class=\"cell-static cell-heading\">${String(value ?? '')}</div>`;\n }\n\n if (type === 'label') {\n return html`<div class=\"cell-static\">${String(value ?? '')}</div>`;\n }\n\n if (type === 'textarea') {\n return html`<pk-textarea\n class=\"cell-pk-control\"\n fit-cell\n size=\"sm\"\n rows=\"1\"\n .value=${String(value ?? '')}\n placeholder=${column.placeholder ?? nothing}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @input=${onInput}\n ></pk-textarea>`;\n }\n\n if (type === 'date') {\n return html`<pk-date-picker\n class=\"cell-pk-control\"\n size=\"sm\"\n width=\"full\"\n .value=${String(value ?? '')}\n placeholder=${column.placeholder ?? ''}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readValueFromEvent(event));\n }}\n ></pk-date-picker>`;\n }\n\n if (type === 'time') {\n return html`<pk-time-picker\n class=\"cell-pk-control\"\n size=\"sm\"\n width=\"full\"\n .value=${String(value ?? '')}\n placeholder=${column.placeholder ?? ''}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readValueFromEvent(event));\n }}\n ></pk-time-picker>`;\n }\n\n if (type === 'number' || type === 'email' || type === 'url') {\n return html`<pk-input\n class=\"cell-pk-control\"\n fit-cell\n size=\"xs\"\n type=${type}\n .value=${String(value ?? '')}\n placeholder=${column.placeholder ?? nothing}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @input=${onInput}\n ></pk-input>`;\n }\n\n if (type === 'select') {\n return this.renderSelectLike(column, value, rowIndex, invalid);\n }\n\n if (type === 'combobox') {\n return this.renderSelectLike(column, value, rowIndex, invalid, { combobox: true });\n }\n\n if (type === 'checkbox') {\n return html`<div class=\"cell-check\">\n <pk-checkbox\n aria-label=${column.label ?? column.name}\n .checked=${Boolean(value)}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readCheckedFromEvent(event));\n }}\n ></pk-checkbox>\n </div>`;\n }\n\n if (type === 'radio') {\n return html`<div class=\"cell-check\">\n <pk-checkbox\n aria-label=${column.label ?? column.name}\n .checked=${Boolean(value)}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n @pk-change=${(event: Event) => {\n // Radio columns intentionally use checkbox chrome, but the\n // update path below remains exclusive across rows.\n this.updateCell(rowIndex, column, this.readCheckedFromEvent(event));\n }}\n ></pk-checkbox>\n </div>`;\n }\n\n if (type === 'lightswitch') {\n return html`<div class=\"cell-check cell-check--switch\">\n <pk-lightswitch\n size=\"sm\"\n aria-label=${column.label ?? column.name}\n .checked=${Boolean(value)}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readCheckedFromEvent(event));\n }}\n ></pk-lightswitch>\n </div>`;\n }\n\n if (type === 'color') {\n return html`<pk-color-input\n class=\"cell-pk-control\"\n fit-cell\n size=\"xs\"\n .value=${String(value ?? '')}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readValueFromEvent(event));\n }}\n ></pk-color-input>`;\n }\n\n // text | handle | value | default\n return html`<pk-input\n class=\"cell-pk-control\"\n fit-cell\n size=\"xs\"\n type=\"text\"\n ?mono=${type === 'handle' || type === 'value'}\n .value=${String(value ?? '')}\n placeholder=${column.placeholder ?? nothing}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @input=${onInput}\n ></pk-input>`;\n }\n\n private renderExtraMenuItems(row: PkEditableTableRow, rowIndex: number): TemplateResult | typeof nothing {\n const items = this.resolveRowMenuItems(row, rowIndex);\n if (items.length === 0) {\n return nothing;\n }\n\n return html`${items.map((item) => {\n const iconHtml = startIconHtml(item.icon);\n return html`<pk-dropdown-item\n type=${item.type ?? 'normal'}\n value=${item.value ?? item.action ?? ''}\n radio-group=${item.radioGroup ?? nothing}\n ?checked=${Boolean(item.checked)}\n ?disabled=${this.disabled || Boolean(item.disabled)}\n @click=${() => {\n if (this.disabled || item.disabled) {\n return;\n }\n\n this.dispatchEvent(new CustomEvent<{\n rowIndex: number;\n row: PkEditableTableRow;\n item: PkEditableTableRowMenuItem;\n action: string;\n value: string;\n }>('pk-row-menu-select', {\n detail: {\n rowIndex,\n row,\n item,\n action: String(item.action ?? item.value ?? ''),\n value: String(item.value ?? ''),\n },\n bubbles: true,\n composed: true,\n }));\n }}\n >\n ${iconHtml ? unsafeHTML(iconHtml) : nothing}\n ${item.label}\n </pk-dropdown-item>`;\n })}`;\n }\n\n private renderRow(row: PkEditableTableRow, rowIndex: number): TemplateResult {\n const columns = this.validColumns;\n const rowCount = this.internalRows.length;\n const rowId = String(row._id);\n const rowMod = this.resolveRowModifier(row, rowIndex);\n const extraMenuItems = this.resolveRowMenuItems(row, rowIndex);\n const showRowMenu = this.allowReorder || this.allowInsert || extraMenuItems.length > 0;\n // Insert shares the add budget — disabled when the host turned `allowAdd` off.\n const insertDisabled = this.disabled || !this.canAddRow();\n\n return html`<tr\n data-row-id=${rowId}\n data-tone=${rowMod.tone || nothing}\n class=${rowMod.class\n ? classMap(Object.fromEntries(rowMod.class.split(/\\s+/).filter(Boolean).map((token) => [token, true])))\n : nothing}\n aria-label=${rowMod.title || nothing}\n >\n ${columns.map((column) => {\n const resolved = this.resolveColumn(row, column, rowIndex);\n const errors = this.getCellErrors(rowIndex, column.name);\n const columnClass = resolved.class || column.class || '';\n return html`<td\n class=${classMap({\n thin: isThinColumn(resolved),\n 'has-error': errors.length > 0,\n ...(columnClass\n ? Object.fromEntries(columnClass.split(/\\s+/).filter(Boolean).map((token) => [token, true]))\n : {}),\n })}\n style=${resolved.width || column.width ? `width: ${resolved.width || column.width}` : nothing}\n >\n ${this.renderCell(resolved, row, rowIndex, errors.length > 0)}\n </td>`;\n })}\n ${this.showActionsColumn\n ? html`<td class=\"actions\">\n <div class=\"row-actions\">\n ${this.allowReorder\n ? html`\n <span\n class=${classMap({\n 'action-handle': true,\n 'is-pending': !this.dndReady,\n })}\n >\n <pk-button\n type=\"button\"\n class=\"action-btn\"\n variant=\"none\"\n size=\"xs\"\n aria-label=${!this.dndReady && !this.disabled\n ? 'Preparing drag…'\n : 'Reorder row'}\n ?disabled=${this.disabled || !this.dndReady}\n >${unsafeHTML(START_GRIP_MOVE_ICON)}</pk-button>\n </span>`\n : nothing}\n ${showRowMenu\n ? html`<pk-dropdown-menu size=\"sm\" placement=\"bottom-end\" side-offset=\"2\">\n <pk-button\n slot=\"trigger\"\n type=\"button\"\n class=\"action-btn\"\n variant=\"none\"\n size=\"xs\"\n aria-label=\"Row actions\"\n ?disabled=${this.disabled}\n >${unsafeHTML(START_ELLIPSIS_ICON)}</pk-button>\n ${this.renderExtraMenuItems(row, rowIndex)}\n ${this.allowInsert\n ? html`\n <pk-dropdown-item\n ?disabled=${insertDisabled}\n @click=${() => { this.insertRowAt(rowIndex); }}\n >\n ${unsafeHTML(START_PLUS_ICON)}\n Insert above\n </pk-dropdown-item>\n <pk-dropdown-item\n ?disabled=${insertDisabled}\n @click=${() => { this.insertRowAt(rowIndex + 1); }}\n >\n ${unsafeHTML(START_PLUS_ICON)}\n Insert below\n </pk-dropdown-item>`\n : nothing}\n ${this.allowReorder\n ? html`\n <pk-dropdown-item\n ?disabled=${this.disabled || rowIndex === 0}\n @click=${() => { this.moveRow(rowIndex, -1); }}\n >\n ${unsafeHTML(START_ARROW_UP_ICON)}\n Move up\n </pk-dropdown-item>\n <pk-dropdown-item\n ?disabled=${this.disabled || rowIndex === rowCount - 1}\n @click=${() => { this.moveRow(rowIndex, 1); }}\n >\n ${unsafeHTML(START_ARROW_DOWN_ICON)}\n Move down\n </pk-dropdown-item>`\n : nothing}\n </pk-dropdown-menu>`\n : nothing}\n ${this.allowDelete\n ? html`<pk-button\n type=\"button\"\n class=\"action-btn action-delete\"\n variant=\"none\"\n size=\"xs\"\n aria-label=\"Delete row\"\n ?disabled=${this.disabled}\n @click=${() => { this.removeRow(rowIndex); }}\n >${unsafeHTML(START_XMARK_ICON)}</pk-button>`\n : nothing}\n </div>\n </td>`\n : nothing}\n </tr>`;\n }\n\n override render(): TemplateResult {\n const columns = this.validColumns;\n\n return html`\n <div\n class=\"et-scroll\"\n @pk-change=${this.stopInnerControlEvent}\n @input=${this.stopInnerControlEvent}\n @change=${this.stopInnerControlEvent}\n @paste=${this.handleTablePaste}\n >\n <table class=\"et\">\n <thead>\n <tr>\n ${columns.map((column) => {\n const columnClass = column.class || '';\n return html`<th\n class=${classMap({\n thin: isThinColumn(column),\n ...(columnClass\n ? Object.fromEntries(columnClass.split(/\\s+/).filter(Boolean).map((token) => [token, true]))\n : {}),\n })}\n style=${column.width ? `width: ${column.width}` : nothing}\n >\n ${column.label ?? column.name}\n ${column.required ? html`<span class=\"required\">*</span>` : nothing}\n </th>`;\n })}\n ${this.showActionsColumn ? html`<th class=\"actions\"></th>` : nothing}\n </tr>\n </thead>\n <tbody>\n ${repeat(\n this.internalRows,\n (row) => String(row._id),\n (row, index) => this.renderRow(row, index),\n )}\n </tbody>\n </table>\n </div>\n ${this.allowAdd\n ? html`<pk-button\n type=\"button\"\n class=\"add-row\"\n variant=\"dashed\"\n ?disabled=${this.disabled}\n @click=${() => { this.addRow(); }}\n >\n ${unsafeHTML(START_PLUS_ICON)}\n ${this.addRowLabel || 'Add row'}\n </pk-button>`\n : nothing}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-editable-table': PkEditableTable;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pk-editable-table-BubcKCBn.js","names":[],"sources":["../../src/components/editable-table/editable-table-dnd.ts","../../src/components/editable-table/pk-editable-table.styles.ts","../../src/components/editable-table/editable-table-model.ts","../../src/components/editable-table/pk-editable-table.ts"],"sourcesContent":["export type EditableTableSortableRow = {\n id: string;\n element: HTMLTableRowElement;\n handle?: HTMLElement;\n};\n\nexport type EditableTableDndCallbacks = {\n /**\n * Commit reorder from the seated DOM order (stable `data-row-id`s).\n * Prefer this over from/to indices — the floated source row stays in the\n * tbody during drag, so index math is easy to get wrong after cancels.\n */\n onReorderTo: (orderedIds: string[]) => void;\n};\n\n/**\n * Table-native pointer drag for `<pk-editable-table>` rows.\n *\n * The live source `<tr>` becomes the floating overlay (same custom-element\n * instances — no clone reflow / “shift”). A hidden placeholder clone stays in\n * the tbody as the gap. Overlay motion is vertical-axis + tbody constrained.\n * Gap steps when the probe enters ~30% of a neighbor (direction-aware).\n * Drop commits by reading `data-row-id` order after seating — not index arithmetic.\n */\nexport class EditableTableDndController {\n /** Fraction of each row height for the direction-aware swap band. */\n private static readonly SWAP_INSET = 0.3;\n\n private rows: EditableTableSortableRow[] = [];\n private disabled = false;\n private handleCleanups: Array<() => void> = [];\n private dragSession: DragSession | null = null;\n\n constructor(private readonly callbacks: EditableTableDndCallbacks) {}\n\n get isActive(): boolean {\n return this.handleCleanups.length > 0;\n }\n\n /** Lit must not reconcile tbody while pointer drag owns row order. */\n get isSessionActive(): boolean {\n return this.dragSession !== null;\n }\n\n sync(rows: EditableTableSortableRow[], disabled: boolean): void {\n if (this.dragSession) {\n return;\n }\n\n this.destroyHandles();\n this.rows = rows;\n this.disabled = disabled;\n\n for (const row of rows) {\n if (!row.handle) {\n continue;\n }\n\n const onPointerDown = (event: PointerEvent) => {\n this.handlePointerDown(event, row);\n };\n\n row.handle.addEventListener('pointerdown', onPointerDown);\n this.handleCleanups.push(() => {\n row.handle?.removeEventListener('pointerdown', onPointerDown);\n });\n }\n }\n\n destroy(): void {\n this.cancelDrag();\n this.destroyHandles();\n this.rows = [];\n }\n\n private handlePointerDown(event: PointerEvent, row: EditableTableSortableRow): void {\n if (\n this.disabled\n || this.dragSession\n || event.button !== 0\n || !event.isPrimary\n ) {\n return;\n }\n\n const fromIndex = this.rows.findIndex((candidate) => candidate.id === row.id);\n const tbody = row.element.parentElement;\n const table = row.element.closest('table');\n if (\n fromIndex < 0\n || !(tbody instanceof HTMLTableSectionElement)\n || !(table instanceof HTMLTableElement)\n ) {\n return;\n }\n\n event.preventDefault();\n\n const cellWidths = [...row.element.cells].map((cell) => cell.getBoundingClientRect().width);\n const unfreezeColumns = this.freezeTableColumns(table, cellWidths);\n const sourceRect = row.element.getBoundingClientRect();\n const tbodyRect = tbody.getBoundingClientRect();\n const pointerOffset = {\n x: event.clientX - sourceRect.left,\n y: event.clientY - sourceRect.top,\n };\n\n const placeholder = this.createPlaceholder(row.element, cellWidths, sourceRect.height);\n row.element.insertAdjacentElement('afterend', placeholder);\n\n // Float the live row — true visual snapshot (same pk-* instances, no clone shift).\n const fixedOrigin = this.liftRow(row.element, sourceRect, cellWidths);\n\n const session: DragSession = {\n row,\n fromIndex,\n table,\n tbody,\n placeholder,\n pointerId: event.pointerId,\n pointerOffset,\n startLeft: sourceRect.left,\n rowHeight: sourceRect.height,\n tbodyTop: tbodyRect.top,\n tbodyBottom: tbodyRect.bottom,\n fixedOrigin,\n unfreezeColumns,\n cleanup: [],\n committed: false,\n };\n\n const doc = row.element.ownerDocument;\n const onPointerMove = (moveEvent: PointerEvent) => {\n if (moveEvent.pointerId !== session.pointerId || session.committed) {\n return;\n }\n\n moveEvent.preventDefault();\n const liveTbody = session.tbody.getBoundingClientRect();\n session.tbodyTop = liveTbody.top;\n session.tbodyBottom = liveTbody.bottom;\n this.updateOverlay(session, moveEvent.clientY);\n this.updateGap(session, moveEvent.clientY - session.pointerOffset.y + session.rowHeight / 2);\n };\n\n const onPointerUp = (upEvent: PointerEvent) => {\n if (upEvent.pointerId !== session.pointerId || session.committed) {\n return;\n }\n\n upEvent.preventDefault();\n this.commitDrag(session);\n };\n\n const onPointerCancel = (cancelEvent: PointerEvent) => {\n if (cancelEvent.pointerId !== session.pointerId || session.committed) {\n return;\n }\n // Browser cancel must restore original slot — seating at the live\n // placeholder without a data commit left DOM/data diverged (random jumps).\n this.cancelDrag();\n };\n\n doc.addEventListener('pointermove', onPointerMove, { passive: false });\n doc.addEventListener('pointerup', onPointerUp, { passive: false });\n doc.addEventListener('pointercancel', onPointerCancel);\n session.cleanup.push(\n () => { doc.removeEventListener('pointermove', onPointerMove); },\n () => { doc.removeEventListener('pointerup', onPointerUp); },\n () => { doc.removeEventListener('pointercancel', onPointerCancel); },\n );\n\n this.dragSession = session;\n this.updateOverlay(session, event.clientY);\n }\n\n /** Vertical-axis + tbody-container constraints on the live floated row. */\n private updateOverlay(session: DragSession, clientY: number): void {\n const rawTop = clientY - session.pointerOffset.y;\n const minTop = session.tbodyTop;\n const maxTop = Math.max(minTop, session.tbodyBottom - session.rowHeight);\n const top = Math.min(maxTop, Math.max(minTop, rawTop));\n const row = session.row.element;\n // Viewport coords minus the fixed-positioning origin — a transformed ancestor\n // (e.g. pk-dialog panel) re-bases position:fixed away from the viewport.\n row.style.top = `${top - session.fixedOrigin.y}px`;\n row.style.left = `${session.startLeft - session.fixedOrigin.x}px`;\n }\n\n /**\n * Project the gap from the probe against the full row list.\n * Threshold is direction-aware so drag-up and drag-down feel the same.\n */\n private updateGap(session: DragSession, probeY: number): void {\n const placeholder = session.placeholder;\n const source = session.row.element;\n const rows = [...session.tbody.querySelectorAll<HTMLTableRowElement>('tr[data-row-id]')].filter(\n (row) => row !== source && !row.hasAttribute('data-pk-dnd-placeholder'),\n );\n\n const placeholderRect = placeholder.getBoundingClientRect();\n const movingUp = probeY < placeholderRect.top + placeholderRect.height / 2;\n const inset = EditableTableDndController.SWAP_INSET;\n\n let before: HTMLTableRowElement | null = null;\n for (const row of rows) {\n const rect = row.getBoundingClientRect();\n if (rect.height <= 0) {\n continue;\n }\n\n const thresholdY = movingUp\n ? rect.top + rect.height * (1 - inset)\n : rect.top + rect.height * inset;\n\n if (probeY < thresholdY) {\n before = row;\n break;\n }\n }\n\n if (before) {\n if (placeholder.nextElementSibling !== before) {\n session.tbody.insertBefore(placeholder, before);\n }\n return;\n }\n\n if (session.tbody.lastElementChild !== placeholder) {\n session.tbody.append(placeholder);\n }\n }\n\n private commitDrag(session: DragSession): void {\n if (session.committed || this.dragSession !== session) {\n return;\n }\n session.committed = true;\n\n // Seat the live row where the placeholder is — DOM order is source of truth.\n this.cleanupDrag(session);\n this.dragSession = null;\n\n const orderedIds = [...session.tbody.querySelectorAll<HTMLTableRowElement>('tr[data-row-id]')]\n .map((row) => row.dataset.rowId ?? '')\n .filter((id) => id !== '');\n\n this.callbacks.onReorderTo(orderedIds);\n }\n\n private cancelDrag(): void {\n const session = this.dragSession;\n if (!session || session.committed) {\n return;\n }\n session.committed = true;\n\n // Restore the gap to the pre-drag slot before seating, so we don't leave\n // a visually moved DOM that Lit later snaps back (or compounds on next drop).\n this.restorePlaceholderToOrigin(session);\n this.cleanupDrag(session);\n this.dragSession = null;\n }\n\n private restorePlaceholderToOrigin(session: DragSession): void {\n const others = [...session.tbody.querySelectorAll<HTMLTableRowElement>('tr[data-row-id]')].filter(\n (row) => row !== session.row.element && !row.hasAttribute('data-pk-dnd-placeholder'),\n );\n\n // among others+placeholder, origin slot is fromIndex (source removed from the count).\n if (session.fromIndex >= others.length) {\n if (session.tbody.lastElementChild !== session.placeholder) {\n session.tbody.append(session.placeholder);\n }\n return;\n }\n\n const before = others[session.fromIndex];\n if (before && session.placeholder.nextElementSibling !== before) {\n session.tbody.insertBefore(session.placeholder, before);\n }\n }\n\n private cleanupDrag(session: DragSession): void {\n for (const cleanup of session.cleanup) {\n cleanup();\n }\n\n const row = session.row.element;\n // Seat the live row where the placeholder was, then drop float styles.\n session.placeholder.replaceWith(row);\n this.unliftRow(row);\n session.unfreezeColumns();\n }\n\n private freezeTableColumns(table: HTMLTableElement, widths: number[]): () => void {\n const previous = table.querySelector(':scope > colgroup[data-pk-dnd-cols]');\n previous?.remove();\n\n const colgroup = table.ownerDocument.createElement('colgroup');\n colgroup.setAttribute('data-pk-dnd-cols', 'true');\n for (const width of widths) {\n const col = table.ownerDocument.createElement('col');\n col.style.width = `${width}px`;\n colgroup.append(col);\n }\n\n const previousLayout = table.style.tableLayout;\n table.prepend(colgroup);\n table.style.tableLayout = 'fixed';\n return () => {\n colgroup.remove();\n table.style.tableLayout = previousLayout;\n };\n }\n\n private createPlaceholder(\n row: HTMLTableRowElement,\n cellWidths: number[],\n height: number,\n ): HTMLTableRowElement {\n const placeholder = row.cloneNode(true) as HTMLTableRowElement;\n placeholder.setAttribute('data-pk-dnd-placeholder', 'true');\n placeholder.setAttribute('aria-hidden', 'true');\n placeholder.removeAttribute('data-row-id');\n placeholder.style.visibility = 'hidden';\n placeholder.style.pointerEvents = 'none';\n placeholder.style.height = `${height}px`;\n\n [...placeholder.cells].forEach((cell, index) => {\n const width = cellWidths[index];\n if (typeof width === 'number') {\n cell.style.width = `${width}px`;\n cell.style.minWidth = `${width}px`;\n cell.style.maxWidth = `${width}px`;\n cell.style.boxSizing = 'border-box';\n }\n // Drop cloned controls so they don't upgrade / steal focus while hidden.\n cell.replaceChildren();\n });\n\n return placeholder;\n }\n\n /**\n * Promote the live row to a fixed overlay. Same pattern dnd-kit Feedback uses\n * for `<tr>`: pin cell widths, then position:fixed (raw TR rects go 0×0 otherwise).\n *\n * Returns the fixed-positioning origin in viewport coords. `position: fixed`\n * is viewport-based only when no ancestor is a containing block; a transformed\n * ancestor (pk-dialog panel animation, filters, contain) re-bases it, which\n * silently threw the overlay outside the dialog and made the row \"disappear\".\n */\n private liftRow(row: HTMLTableRowElement, rect: DOMRect, cellWidths: number[]): { x: number; y: number } {\n row.classList.add('is-dragging');\n [...row.cells].forEach((cell, index) => {\n const width = cellWidths[index];\n if (typeof width === 'number') {\n cell.style.width = `${width}px`;\n cell.style.minWidth = `${width}px`;\n cell.style.maxWidth = `${width}px`;\n cell.style.boxSizing = 'border-box';\n }\n });\n\n row.style.position = 'fixed';\n // Probe where fixed (0,0) actually lands before applying real coords.\n row.style.top = '0px';\n row.style.left = '0px';\n row.style.width = `${rect.width}px`;\n row.style.height = `${rect.height}px`;\n row.style.margin = '0';\n row.style.zIndex = '2147483647';\n row.style.pointerEvents = 'none';\n // Tailwind shadow-lg — softer / lower than the old single-layer slate drop.\n row.style.boxShadow = '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)';\n row.style.background = 'var(--pk-color-white, #fff)';\n row.style.opacity = '0.96';\n\n const probe = row.getBoundingClientRect();\n const fixedOrigin = { x: probe.left, y: probe.top };\n row.style.top = `${rect.top - fixedOrigin.y}px`;\n row.style.left = `${rect.left - fixedOrigin.x}px`;\n\n return fixedOrigin;\n }\n\n private unliftRow(row: HTMLTableRowElement): void {\n row.classList.remove('is-dragging');\n row.style.position = '';\n row.style.top = '';\n row.style.left = '';\n row.style.width = '';\n row.style.height = '';\n row.style.margin = '';\n row.style.zIndex = '';\n row.style.pointerEvents = '';\n row.style.boxShadow = '';\n row.style.background = '';\n row.style.opacity = '';\n\n for (const cell of row.cells) {\n cell.style.width = '';\n cell.style.minWidth = '';\n cell.style.maxWidth = '';\n cell.style.boxSizing = '';\n }\n }\n\n private destroyHandles(): void {\n for (const cleanup of this.handleCleanups) {\n cleanup();\n }\n this.handleCleanups = [];\n }\n}\n\ntype DragSession = {\n row: EditableTableSortableRow;\n fromIndex: number;\n table: HTMLTableElement;\n tbody: HTMLTableSectionElement;\n placeholder: HTMLTableRowElement;\n pointerId: number;\n pointerOffset: { x: number; y: number };\n startLeft: number;\n rowHeight: number;\n tbodyTop: number;\n tbodyBottom: number;\n /** Viewport offset of the fixed-positioning containing block (0,0 unless an ancestor re-bases fixed). */\n fixedOrigin: { x: number; y: number };\n unfreezeColumns: () => void;\n cleanup: Array<() => void>;\n /** Prevents double commit from pointerup + pointercancel. */\n committed: boolean;\n};\n","import { css } from 'lit';\n\nexport const pkEditableTableStyles = css`\n @layer pk-component {\n :host {\n display: block;\n font-family: var(--pk-font-family);\n /* Craft CP body text (~gray-700), not gray-900. */\n color: var(--pk-color-gray-700);\n /* Shell matches v1 Table: border-gray-200 + rounded-md (token md = 4px). */\n --pk-et-border: 1px solid var(--pk-color-gray-200, #e5e7eb);\n --pk-et-radius: var(--pk-radius-md, 4px);\n --pk-et-gridline: var(--pk-color-gray-100, #f3f4f6);\n /* Static row height — matches v1 TableCell h-[34px] (border-box). */\n --pk-et-cell-height: 34px;\n --pk-et-action-size: 24px;\n --pk-et-action-icon: 12px;\n /* Grip reads smaller than ellipsis/x at the same token — nudge up slightly. */\n --pk-et-action-grip-icon: 14px;\n }\n\n /* v1 Table: shell scrolls horizontally; Add row sits outside so it stays full-width. */\n .et-scroll {\n width: 100%;\n max-width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n border: var(--pk-et-border);\n border-radius: var(--pk-et-radius) var(--pk-et-radius) 0 0;\n background: var(--pk-color-white, #fff);\n }\n\n .et {\n /* v1 Table uses w-full: fill the shell, squish toward column width hints /\n * content minima, then overflow-x on .et-scroll takes over. */\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n background: var(--pk-color-white, #fff);\n }\n\n thead {\n background: var(--pk-color-gray-50, #f8fafc);\n }\n\n thead th {\n padding: 0.375rem 0.5rem;\n text-align: left;\n font-size: 12px;\n font-weight: 500;\n color: var(--pk-color-gray-700, #374151);\n background: var(--pk-color-gray-50, #f8fafc);\n /* v1 TableHead has no cell borders — body cells own the gridlines. */\n border: 0;\n white-space: nowrap;\n }\n\n tbody td + td {\n border-inline-start: 1px solid var(--pk-et-gridline);\n }\n\n thead th.thin,\n tbody td.thin {\n width: 0.01%;\n white-space: nowrap;\n }\n\n thead th.actions,\n tbody td.actions {\n width: 0.01%;\n white-space: nowrap;\n }\n\n tbody td.actions {\n padding-inline: 0.25rem;\n /* v1 TableRow actions cell — soft cool wash so controls read as chrome, not data. */\n background: #fbfcfe;\n }\n\n .required {\n margin-left: 0.125rem;\n color: var(--pk-color-rose-600, #e11d48);\n }\n\n tbody td {\n box-sizing: border-box;\n padding: 0;\n height: var(--pk-et-cell-height);\n background: var(--pk-color-white, #fff);\n /* v1 TableCell: border-t gray-100 — also separates header once th borders are gone. */\n border-top: 1px solid var(--pk-et-gridline);\n vertical-align: middle;\n /* Match v1 TableCell whitespace-nowrap — drives intrinsic mins before scroll. */\n white-space: nowrap;\n /* Let auto table layout compress past control preferred sizes. */\n min-width: 0;\n }\n\n tbody tr.is-dragging {\n opacity: 0.4;\n }\n\n /* Semantic row tones from modifyRow — host Tailwind cannot style shadow <tr>. */\n tbody tr[data-tone='warning'] > td {\n background: color-mix(in srgb, var(--pk-color-amber-50, #fffbeb) 80%, transparent);\n }\n\n tbody tr[data-tone='muted'] > td {\n background: color-mix(in srgb, var(--pk-color-slate-100, #f1f5f9) 90%, transparent);\n }\n\n .cell-pk-control {\n display: block;\n width: 100%;\n min-width: 0;\n height: var(--pk-et-cell-height);\n min-height: var(--pk-et-cell-height);\n --pk-input-border-radius: 0;\n --pk-select-border-radius: 0;\n --pk-date-picker-border-radius: 0;\n --pk-input-bg: var(--pk-color-white, #fff);\n --pk-combobox-fill: var(--pk-color-white, #fff);\n --pk-input-height: var(--pk-et-cell-height);\n }\n\n pk-input.cell-pk-control::part(base) {\n padding-inline: 0.5rem;\n background: var(--pk-color-white, #fff);\n }\n\n /* v1 EditableTable Input is text-sm (14px); size=xs would be 11px. */\n pk-input.cell-pk-control:not([mono])::part(input) {\n font-size: var(--pk-font-size-base, 14px);\n }\n\n /* v1 handle/value: font-mono text-[0.9em] — do not let the 14px cell\n * override wipe pk-input[mono]'s optical scale. */\n pk-input.cell-pk-control[mono]::part(input) {\n font-size: calc(var(--pk-font-size-base, 14px) * 0.9);\n line-height: var(--pk-line-height-mono, 1.5);\n }\n\n /* Select/combobox sit inset horizontally only (v1 TableCell px-2).\n * No block padding — vertical inset comes from the size=xs chip itself. */\n tbody td:has(> pk-select.cell-pk-control),\n tbody td:has(> pk-combobox.cell-pk-control) {\n padding: 0 0.5rem;\n }\n\n pk-select.cell-pk-control,\n pk-combobox.cell-pk-control {\n display: block;\n width: 100%;\n max-width: 100%;\n min-width: 0;\n /* Override shared .cell-pk-control height so the chip centers in the row. */\n height: auto;\n min-height: 0;\n /* Don't inherit the 34px cell --pk-input-height into the trigger. */\n --pk-input-height: auto;\n --pk-select-item-min-height: 0;\n }\n\n pk-input.cell-pk-control {\n /* Text-like cells fill the td. Inner input text keeps padding via ::part(base);\n * invalid chrome should hit the gridlines, not sit inside an inset chip. */\n height: var(--pk-et-cell-height);\n min-height: var(--pk-et-cell-height);\n }\n\n /* Date/time fill the cell flush — no trigger chrome (v1 border-none + h/w-full).\n * display:block so the inline-block host doesn't baseline-shift off center. */\n pk-date-picker.cell-pk-control,\n pk-time-picker.cell-pk-control {\n display: block;\n width: 100%;\n min-width: 0;\n height: var(--pk-et-cell-height);\n --pk-date-picker-height: var(--pk-et-cell-height);\n --pk-date-picker-min-width: 0;\n --pk-select-item-min-height: var(--pk-et-cell-height);\n --pk-select-trigger-border-width: 0;\n }\n\n /* The base trigger sizes to 100% of the host, but the shared form-control\n * wrappers default to auto height, collapsing that chain and top-aligning\n * the date. Stretch the wrappers so 100% resolves and align-items centers. */\n pk-date-picker.cell-pk-control::part(form-control),\n pk-date-picker.cell-pk-control::part(form-control-input) {\n height: 100%;\n }\n\n pk-date-picker.cell-pk-control::part(base) {\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 100%;\n border: 0;\n border-radius: 0;\n background: transparent;\n }\n\n pk-date-picker.cell-pk-control::part(base):focus-visible {\n box-shadow: inset 0 0 0 1px var(--pk-color-gray-200, #e5e7eb);\n }\n\n pk-time-picker.cell-pk-control::part(control) {\n width: 100%;\n min-width: 0;\n height: 100% !important;\n min-height: 100% !important;\n border: 0 !important;\n border-radius: 0 !important;\n background: transparent !important;\n background-color: transparent !important;\n }\n\n pk-time-picker.cell-pk-control::part(control):focus-visible {\n box-shadow: inset 0 0 0 1px var(--pk-color-gray-200, #e5e7eb);\n }\n\n td.has-error .cell-pk-control {\n --pk-input-border-color: var(--pk-color-rose-600, #e11d48);\n }\n\n /* Flush/borderless date/time only — select/combobox/color paint their own\n * invalid chrome via ?invalid, so a host ring would double up. */\n td.has-error pk-date-picker.cell-pk-control,\n td.has-error pk-time-picker.cell-pk-control {\n box-shadow: inset 0 0 0 1px var(--pk-color-rose-600, #e11d48);\n }\n\n .cell-static {\n padding: 0.5rem;\n font-size: var(--pk-font-size-base, 14px);\n line-height: 1.4;\n color: inherit;\n }\n\n /* Custom / slotted cells — fill the td; light-DOM content keeps host styles. */\n .cell-slot {\n display: block;\n width: 100%;\n min-width: 0;\n min-height: var(--pk-et-cell-height);\n height: 100%;\n }\n\n .cell-slot ::slotted(*) {\n display: block;\n width: 100%;\n min-width: 0;\n min-height: var(--pk-et-cell-height);\n box-sizing: border-box;\n }\n\n .cell-heading {\n font-weight: 600;\n color: var(--pk-color-gray-800, #1f2937);\n }\n\n .cell-mono {\n font-family: var(--pk-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);\n font-size: var(--pk-font-size-mono, 0.9em);\n line-height: var(--pk-line-height-mono, 1.5);\n }\n\n .cell-check {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--pk-et-cell-height);\n min-width: 2.125rem;\n }\n\n .cell-check--switch {\n min-width: 3rem;\n }\n\n pk-checkbox,\n pk-radio,\n pk-lightswitch {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .row-actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n /* v1 packs 24px action buttons flush — no gap between hitboxes. */\n gap: 0;\n }\n\n .row-actions pk-dropdown-menu {\n display: inline-flex;\n }\n\n /* Action row buttons: fixed 24px hitbox (v1), variant=none, icon-only color hover. */\n .row-actions pk-button.action-btn {\n --pk-btn-height: var(--pk-et-action-size);\n --pk-btn-icon-size: var(--pk-et-action-icon);\n --pk-btn-padding-inline: 0;\n color: var(--pk-color-gray-500, #6b7280);\n width: var(--pk-et-action-size);\n flex: 0 0 var(--pk-et-action-size);\n }\n\n .row-actions pk-button.action-btn::part(base) {\n width: var(--pk-et-action-size);\n height: var(--pk-et-action-size);\n min-height: var(--pk-et-action-size);\n padding: 0;\n background: transparent;\n }\n\n .row-actions pk-button.action-btn::part(base):hover:not(:disabled) {\n /* No hover fill — only the glyph color shifts (v1 hover:bg-transparent). */\n background: transparent;\n color: var(--pk-color-sky-600, #0284c7);\n }\n\n .row-actions pk-button.action-btn.action-delete::part(base):hover:not(:disabled) {\n background: transparent;\n color: var(--pk-color-rose-500, #f43f5e);\n }\n\n .row-actions pk-button.action-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n /* Light-DOM handle wrapper (v1) — pointer drag binds here so shadow clicks don't interfere.\n pk-button :host { cursor: pointer } wins over inherited span cursor — set it on the host. */\n .row-actions .action-handle {\n display: inline-flex;\n cursor: move;\n }\n\n .row-actions .action-handle pk-button.action-btn {\n cursor: move;\n --pk-btn-icon-size: var(--pk-et-action-grip-icon);\n }\n\n .row-actions .action-handle:has(pk-button:disabled),\n .row-actions .action-handle pk-button.action-btn[disabled] {\n cursor: default;\n }\n\n /* Before deferred drag binding — grip visible but inactive (v1 faded controls). */\n .row-actions .action-handle.is-pending {\n opacity: 0.45;\n }\n\n /* Live row is floated as the overlay; placeholder clone holds the gap. */\n tr.is-dragging {\n display: table-row;\n }\n\n tr[data-pk-dnd-placeholder] {\n visibility: hidden;\n pointer-events: none;\n }\n\n /* Attach dashed add-row under the table shell (v1 Button variant=dashed). */\n pk-button.add-row {\n display: block;\n width: 100%;\n margin-top: -1px;\n --pk-btn-radius: 0;\n }\n\n pk-button.add-row::part(base) {\n width: 100%;\n border-top: 0;\n border-radius: 0 0 var(--pk-et-radius) var(--pk-et-radius);\n }\n\n :host([disabled]) pk-button.add-row {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .empty {\n padding: 0.75rem 0.625rem;\n color: var(--pk-color-gray-500, #6b7280);\n font-size: 13px;\n }\n }\n`;\n","/**\n * Shared types and pure helpers for `<pk-editable-table>`.\n * Kept free of Lit so facades and tests can reuse the same shapes.\n */\n\nexport type PkEditableTableColumnType =\n | 'text'\n | 'textarea'\n | 'number'\n | 'email'\n | 'url'\n | 'select'\n | 'combobox'\n | 'checkbox'\n | 'radio'\n | 'lightswitch'\n | 'color'\n | 'date'\n | 'time'\n | 'heading'\n | 'label'\n | 'handle'\n | 'value'\n /** Light-DOM projection via named slot — see `getCustomCellSlotName`. */\n | 'custom';\n\nexport interface PkEditableTableOption {\n label: string;\n value: string;\n}\n\nexport interface PkEditableTableColumn {\n name: string;\n type?: PkEditableTableColumnType;\n label?: string;\n required?: boolean;\n placeholder?: string;\n /** Explicit CSS width for the column (e.g. `120px`, `20%`). */\n width?: string;\n /** Narrow, content-width column (defaults on for checkbox/lightswitch/radio). */\n thin?: boolean;\n /**\n * Extra class names on `<th>` / `<td>` (space-separated).\n * Prefer over framework-specific `className` — facades can map.\n */\n class?: string;\n options?: Array<PkEditableTableOption | string>;\n /**\n * For `handle` / `value` columns: derive from this source column while the\n * cell is empty / auto-filled. Manual edits stick until cleared.\n */\n source?: string;\n /** Radio columns: allow clearing the selected row (otherwise one must stay on). */\n allowUnselect?: boolean;\n}\n\nexport type PkEditableTableRow = Record<string, unknown> & { _id?: string };\n\n/**\n * Descriptor for an extra row-menu item (rendered inside the ellipsis menu).\n * Nested host→menu slots cannot feed `pk-dropdown-menu` light DOM, so extras\n * stay data-driven; frameworks handle product logic via `pk-row-menu-select`.\n */\nexport interface PkEditableTableRowMenuItem {\n label: string;\n type?: 'normal' | 'radio' | 'checkbox';\n value?: string;\n radioGroup?: string;\n checked?: boolean;\n disabled?: boolean;\n /** Echoed on `pk-row-menu-select` so consumers can branch without parsing labels. */\n action?: string;\n /** Kit icon registry name (e.g. `gear`) — rendered as `slot=\"start\"`. */\n icon?: string;\n}\n\nexport interface PkEditableTableRowModifier {\n /** Space-separated class names applied to the `<tr>`. */\n class?: string;\n /**\n * Accessible name for the row (`aria-label`). Not a hover tooltip —\n * use visible tone/chrome for sighted status.\n */\n title?: string;\n /**\n * Semantic row chrome styled inside the CE (host Tailwind cannot reach shadow `<tr>`).\n * `warning` ≈ amber highlight; `muted` ≈ slate/disabled highlight.\n */\n tone?: 'warning' | 'muted';\n}\n\nexport type PkEditableTableModifyColumn = (\n row: PkEditableTableRow,\n columnName: string,\n column: PkEditableTableColumn,\n rowIndex: number,\n) => Partial<PkEditableTableColumn> | null | undefined;\n\nexport type PkEditableTableModifyRow = (\n row: PkEditableTableRow,\n rowIndex: number,\n) => PkEditableTableRowModifier | null | undefined;\n\nexport type PkEditableTableGetRowMenuItems = (\n row: PkEditableTableRow,\n rowIndex: number,\n) => PkEditableTableRowMenuItem[] | null | undefined;\n\nexport const GENERATED_CELL_MODE = {\n EMPTY: 'empty',\n AUTO: 'auto',\n MANUAL: 'manual',\n SEEDED: 'seeded',\n} as const;\n\nexport type GeneratedCellMode = (typeof GENERATED_CELL_MODE)[keyof typeof GENERATED_CELL_MODE];\n\nexport const isGeneratedColumn = (column: PkEditableTableColumn): boolean => {\n return (column.type === 'handle' || column.type === 'value')\n && Boolean(column.name)\n && Boolean(column.source);\n};\n\nexport const isThinColumn = (column: PkEditableTableColumn): boolean => {\n return Boolean(\n column.thin\n || column.type === 'checkbox'\n || column.type === 'lightswitch'\n || column.type === 'radio',\n );\n};\n\nexport const isEmptyCellValue = (value: unknown): boolean => {\n return value === undefined || value === null || value === '';\n};\n\nexport const getGeneratedCellKey = (rowId: string, columnName: string): string => {\n return `${rowId}:${columnName}`;\n};\n\nexport const normalizeOptions = (options: PkEditableTableColumn['options']): PkEditableTableOption[] => {\n if (!Array.isArray(options)) {\n return [];\n }\n\n return options.map((option) => {\n if (typeof option === 'string') {\n return { label: option, value: option };\n }\n\n return { label: String(option.label ?? option.value ?? ''), value: String(option.value ?? '') };\n });\n};\n\nexport const defaultValueForColumn = (column: PkEditableTableColumn): unknown => {\n if (column.type === 'checkbox' || column.type === 'lightswitch' || column.type === 'radio') {\n return false;\n }\n\n return '';\n};\n\n/**\n * Craft-free handle slug for derived `handle` columns.\n * Mirrors the camelCase path of `@verbb/plugin-kit-core` `generateHandle` without `window.Craft`.\n */\nexport const generateHandle = (sourceValue: string): string => {\n const words = sourceValue\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/['\"'\"\"[\\](){}:]/g, '')\n .split(/[^a-z0-9]+/)\n .filter(Boolean);\n\n if (words.length === 0) {\n return '';\n }\n\n return words\n .map((word, index) => (index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)))\n .join('');\n};\n\nlet rowIdCounter = 0;\n\nexport const nextRowId = (): string => {\n rowIdCounter += 1;\n return `etr_${Date.now().toString(36)}_${rowIdCounter}`;\n};\n\n/** Named slot for a `type: 'custom'` cell — light-DOM projection into the `<td>`. */\nexport const getCustomCellSlotName = (rowId: string, columnName: string): string => {\n return `cell:${rowId}:${columnName}`;\n};\n\nexport const BUILTIN_COLUMN_TYPES = new Set<string>([\n 'text',\n 'textarea',\n 'number',\n 'email',\n 'url',\n 'select',\n 'combobox',\n 'checkbox',\n 'radio',\n 'lightswitch',\n 'color',\n 'date',\n 'time',\n 'heading',\n 'label',\n 'handle',\n 'value',\n 'custom',\n]);\n\nexport const isCustomColumn = (column: PkEditableTableColumn): boolean => {\n const type = column.type;\n if (type === 'custom') {\n return true;\n }\n\n // Unknown / product types (e.g. Formie `variablePicker`) project via custom slots.\n return typeof type === 'string' && !BUILTIN_COLUMN_TYPES.has(type);\n};\n\n/**\n * Column types that receive TSV paste *writes* (Craft `importData` fills textual\n * cells; checkbox/radio/lightswitch and static/custom cells are skipped).\n */\nconst PASTE_IMPORT_SKIP_TYPES = new Set<string>([\n 'checkbox',\n 'radio',\n 'lightswitch',\n 'heading',\n 'label',\n]);\n\n/**\n * Types that intercept multi-cell paste (Craft attaches `handlePaste` to textual\n * inputs except multiline — native paste stays on `textarea`).\n */\nconst PASTE_INTERCEPT_TYPES = new Set<string>([\n 'text',\n 'number',\n 'email',\n 'url',\n 'handle',\n 'value',\n 'color',\n 'date',\n 'time',\n]);\n\n/** Whether a multi-cell paste gesturing from this cell should run `importData`. */\nexport const columnInterceptsPaste = (column: PkEditableTableColumn): boolean => {\n if (isCustomColumn(column)) {\n return false;\n }\n\n return PASTE_INTERCEPT_TYPES.has(column.type ?? 'text');\n};\n\n/** Whether `importData` should write a clipboard cell into this column. */\nexport const columnAcceptsPasteImport = (column: PkEditableTableColumn): boolean => {\n if (isCustomColumn(column)) {\n return false;\n }\n\n return !PASTE_IMPORT_SKIP_TYPES.has(column.type ?? 'text');\n};\n\n/**\n * Craft `Craft.trim(text, ' \\\\n\\\\r')` — strip spaces/newlines from both ends so a\n * trailing spreadsheet newline does not create an empty extra row.\n */\nexport const trimClipboardText = (text: string): string => {\n return String(text ?? '').replace(/^[\\n\\r ]+|[\\n\\r ]+$/g, '');\n};\n\n/** True when clipboard looks like a multi-cell / multi-row TSV paste. */\nexport const isMultiCellClipboard = (text: string): boolean => {\n return /[\\t\\r\\n]/.test(text);\n};\n\n/**\n * Parse spreadsheet clipboard text into a grid (rows → cells).\n * Excel / Sheets copy as tab-separated values with newline-separated rows.\n */\nexport const parseTsvClipboard = (text: string): string[][] => {\n const trimmed = trimClipboardText(text);\n if (!trimmed) {\n return [];\n }\n\n return trimmed.split(/\\r?\\n|\\r/).map((line) => line.split('\\t'));\n};\n","import { html, nothing } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { customElement, property, state } from '../../decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport type { PropertyValues, TemplateResult } from 'lit';\nimport { arrowDown, arrowUp, ellipsis, gear, getIcon, gripMove, plus, xmark } from '@verbb/plugin-kit-icons';\n\nimport { PkFormAssociatedElement } from '../../base/pk-form-associated-element.js';\nimport { renderIconHtml } from '../../icons/index.js';\nimport { RequiredValidator } from '../../validators/index.js';\nimport '../button/pk-button.js';\nimport '../checkbox/pk-checkbox.js';\nimport '../color-input/pk-color-input.js';\nimport '../combobox/pk-combobox.js';\nimport '../date-picker/pk-date-picker.js';\nimport '../dropdown-menu/pk-dropdown-item.js';\nimport '../dropdown-menu/pk-dropdown-menu.js';\nimport '../input/pk-input.js';\nimport '../lightswitch/pk-lightswitch.js';\nimport '../select/pk-option.js';\nimport '../select/pk-select.js';\nimport '../textarea/pk-textarea.js';\nimport '../time-picker/pk-time-picker.js';\nimport { EditableTableDndController } from './editable-table-dnd.js';\nimport { pkEditableTableStyles } from './pk-editable-table.styles.js';\nimport {\n columnAcceptsPasteImport,\n columnInterceptsPaste,\n defaultValueForColumn,\n generateHandle,\n GENERATED_CELL_MODE,\n getCustomCellSlotName,\n getGeneratedCellKey,\n isCustomColumn,\n isEmptyCellValue,\n isGeneratedColumn,\n isMultiCellClipboard,\n isThinColumn,\n nextRowId,\n normalizeOptions,\n parseTsvClipboard,\n trimClipboardText,\n type GeneratedCellMode,\n type PkEditableTableColumn,\n type PkEditableTableColumnType,\n type PkEditableTableGetRowMenuItems,\n type PkEditableTableModifyColumn,\n type PkEditableTableModifyRow,\n type PkEditableTableOption,\n type PkEditableTableRow,\n type PkEditableTableRowMenuItem,\n type PkEditableTableRowModifier,\n} from './editable-table-model.js';\n\n/** Craft CP reorder diamond (`grip-move`). */\nconst START_GRIP_MOVE_ICON = renderIconHtml(gripMove).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\nconst START_ELLIPSIS_ICON = renderIconHtml(ellipsis).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\nconst START_ARROW_UP_ICON = renderIconHtml(arrowUp).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\nconst START_ARROW_DOWN_ICON = renderIconHtml(arrowDown).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\nconst START_XMARK_ICON = renderIconHtml(xmark).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\nconst START_PLUS_ICON = renderIconHtml(plus).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\nconst START_GEAR_ICON = renderIconHtml(gear).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\n\nconst startIconHtml = (iconName?: string): string => {\n if (!iconName) {\n return '';\n }\n\n if (iconName === 'gear') {\n return START_GEAR_ICON;\n }\n\n const icon = getIcon(iconName);\n if (!icon) {\n return '';\n }\n\n return renderIconHtml(icon).replace('<svg', '<svg slot=\"start\" aria-hidden=\"true\"');\n};\n\nexport type {\n PkEditableTableColumn,\n PkEditableTableColumnType,\n PkEditableTableGetRowMenuItems,\n PkEditableTableModifyColumn,\n PkEditableTableModifyRow,\n PkEditableTableOption,\n PkEditableTableRow,\n PkEditableTableRowMenuItem,\n PkEditableTableRowModifier,\n} from './editable-table-model.js';\n\nexport {\n getCustomCellSlotName,\n isCustomColumn,\n nextRowId,\n} from './editable-table-model.js';\n\n/**\n * Editable table — inline-editable rows with add/delete and drag/keyboard reorder.\n * Form-associated: submits a JSON array of row objects (internal `_id`s stripped).\n *\n * Canonical composite; framework facades wrap this rather than reimplementing the table.\n * Cell controls compose the same `pk-*` primitives exposed to consumers so the web\n * component keeps v1/Craft feel while owning the canonical table behaviour.\n */\n@customElement('pk-editable-table')\nexport class PkEditableTable extends PkFormAssociatedElement {\n static override styles = pkEditableTableStyles;\n\n static override get validators() {\n return [...super.validators, RequiredValidator()];\n }\n\n @property({ attribute: false })\n columns: PkEditableTableColumn[] = [];\n\n @property({ attribute: false })\n rows: PkEditableTableRow[] = [];\n\n @property({ type: Boolean, reflect: true, attribute: 'allow-add' })\n allowAdd = true;\n\n @property({ type: Boolean, reflect: true, attribute: 'allow-delete' })\n allowDelete = true;\n\n @property({ type: Boolean, reflect: true, attribute: 'allow-reorder' })\n allowReorder = true;\n\n /**\n * Show Insert above / Insert below in the row ellipsis menu.\n * Insert still requires `allowAdd` (disabled at max rows when the host turns add off).\n */\n @property({ type: Boolean, reflect: true, attribute: 'allow-insert' })\n allowInsert = true;\n\n /**\n * Optional hard cap on row count. When set, add / insert / paste expansion stop\n * at this length even if `allowAdd` is still true mid-batch.\n */\n @property({ type: Number, attribute: 'max-rows' })\n maxRows: number | null = null;\n\n @property({ attribute: 'add-row-label' })\n addRowLabel = '';\n\n /**\n * Optional form-field prefix for `cellErrors` keys.\n * Looks up `${fieldName}.${rowIndex}.${columnName}` then falls back to `${rowIndex}.${columnName}`.\n */\n @property({ attribute: 'field-name' })\n fieldName = '';\n\n /** Errors keyed by `${rowIndex}.${columnName}` or `${fieldName}.${rowIndex}.${columnName}`. */\n @property({ attribute: false })\n cellErrors: Record<string, string[] | string> = {};\n\n /** Merged into each newly added row after column defaults. */\n @property({ attribute: false })\n newRowDefaults: Record<string, unknown> = {};\n\n /**\n * Per-cell column override (e.g. swap value column to a select based on another cell).\n * Return a partial column merged over the base definition for that render.\n */\n @property({ attribute: false })\n modifyColumn: PkEditableTableModifyColumn | null = null;\n\n /** Per-row presentation — class / accessible name / tone on the `<tr>`. */\n @property({ attribute: false })\n modifyRow: PkEditableTableModifyRow | null = null;\n\n /**\n * Extra ellipsis-menu items for a row (data descriptors — not React nodes).\n * Selection fires `pk-row-menu-select` with `{ rowIndex, row, item, action, value }`.\n */\n @property({ attribute: false })\n getRowMenuItems: PkEditableTableGetRowMenuItems | null = null;\n\n @state()\n private internalRows: PkEditableTableRow[] = [];\n\n /**\n * Deferred drag binding. Grips render immediately but stay inactive until idle\n * so large tables don't pay pointer-listener setup on first paint.\n */\n @state()\n private dndReady = false;\n\n /** Per-cell mode for generated handle/value columns (`rowId:columnName` → mode). */\n private generatedCellModes = new Map<string, GeneratedCellMode>();\n\n private dndController = new EditableTableDndController({\n onReorderTo: (orderedIds) => {\n this.commitReorderByIds(orderedIds);\n },\n });\n\n private dndIdleId: number | null = null;\n private dndTimeoutId: ReturnType<typeof setTimeout> | null = null;\n /** Skip drag rebinding when row identity/order is unchanged (typing shouldn't resync 195 rows). */\n private dndRowSignature = '';\n\n protected override willUpdate(changed: PropertyValues): void {\n if (changed.has('rows')) {\n const incoming = Array.isArray(this.rows) ? this.rows : [];\n const previous = this.internalRows;\n // Preserve row identity across controlled writes. emitChange / consumers\n // often echo rows without `_id`; minting fresh ids each keystroke would\n // drop generated-cell AUTO modes and freeze handle/value after 1 char.\n this.internalRows = incoming.map((row, index) => {\n const existingId = typeof row._id === 'string'\n ? row._id\n : (typeof previous[index]?._id === 'string' ? String(previous[index]._id) : nextRowId());\n return { ...row, _id: existingId };\n });\n this.syncGeneratedModesFromRows();\n this.syncFormValue();\n }\n\n if (changed.has('allowReorder') || changed.has('disabled')) {\n this.scheduleDndHydration();\n }\n\n super.willUpdate(changed);\n }\n\n override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n this.scheduleDndHydration();\n }\n\n protected override shouldUpdate(changed: PropertyValues): boolean {\n // Pointer drag owns <tbody> order. Any Lit reconcile (controlled rows echo,\n // cell chrome, etc.) snaps rows back and fights the overlay — freeze paint.\n if (this.dndController.isSessionActive) {\n return false;\n }\n\n return super.shouldUpdate(changed);\n }\n\n // Match base visibility — `PkFormAssociatedElement.updated` is public.\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (this.dndReady && this.allowReorder && !this.disabled) {\n // Skip while pointer drag owns tbody order (source row + placeholder).\n if (!this.dndController.isSessionActive) {\n this.syncDndSortables();\n }\n } else if (this.dndController.isActive && (!this.allowReorder || this.disabled || !this.dndReady)) {\n this.dndController.destroy();\n this.dndRowSignature = '';\n }\n }\n\n override disconnectedCallback(): void {\n this.cancelDndHydration();\n this.dndController.destroy();\n this.dndReady = false;\n super.disconnectedCallback();\n }\n\n /** Serialized rows, used for form submission and required validation (empty when no rows). */\n get value(): string {\n return this.internalRows.length ? JSON.stringify(this.cleanRows()) : '';\n }\n\n private get validColumns(): PkEditableTableColumn[] {\n return (Array.isArray(this.columns) ? this.columns : []).filter((column) => {\n return typeof column?.name === 'string' && column.name.trim() !== '';\n });\n }\n\n private get generatedColumns(): PkEditableTableColumn[] {\n return this.validColumns.filter(isGeneratedColumn);\n }\n\n private get showActionsColumn(): boolean {\n // Extra row-menu items / insert need the actions column even when reorder/delete are off.\n return this.allowReorder || this.allowDelete || this.allowInsert || Boolean(this.getRowMenuItems);\n }\n\n private cleanRows(): PkEditableTableRow[] {\n return this.internalRows.map((row) => {\n const { _id, ...rest } = row;\n void _id;\n return rest;\n });\n }\n\n /**\n * Public cell write path for slotted / framework-projected custom cells.\n * Prefer this over mutating `rows` locally so generated columns + events stay in sync.\n */\n setCellValue(rowIndex: number, columnName: string, value: unknown): void {\n const row = this.internalRows[rowIndex];\n if (!row) {\n return;\n }\n\n const base = this.validColumns.find((column) => column.name === columnName);\n if (!base) {\n return;\n }\n\n this.updateCell(rowIndex, this.resolveColumn(row, base, rowIndex), value);\n }\n\n private resolveColumn(\n row: PkEditableTableRow,\n column: PkEditableTableColumn,\n rowIndex: number,\n ): PkEditableTableColumn {\n const patch = this.modifyColumn?.(row, column.name, column, rowIndex);\n if (!patch || typeof patch !== 'object') {\n return column;\n }\n\n return { ...column, ...patch, name: column.name };\n }\n\n private resolveRowModifier(row: PkEditableTableRow, rowIndex: number): PkEditableTableRowModifier {\n const patch = this.modifyRow?.(row, rowIndex);\n if (!patch || typeof patch !== 'object') {\n return {};\n }\n\n return patch;\n }\n\n private resolveRowMenuItems(row: PkEditableTableRow, rowIndex: number): PkEditableTableRowMenuItem[] {\n const items = this.getRowMenuItems?.(row, rowIndex);\n return Array.isArray(items) ? items.filter((item) => item && typeof item.label === 'string') : [];\n }\n\n private syncGeneratedModesFromRows(): void {\n const generated = this.generatedColumns;\n if (this.internalRows.length === 0 || generated.length === 0) {\n this.generatedCellModes.clear();\n return;\n }\n\n const validKeys = new Set<string>();\n\n for (const row of this.internalRows) {\n const rowId = String(row._id);\n for (const column of generated) {\n const key = getGeneratedCellKey(rowId, column.name);\n validKeys.add(key);\n\n if (this.generatedCellModes.has(key)) {\n continue;\n }\n\n this.generatedCellModes.set(\n key,\n isEmptyCellValue(row[column.name]) ? GENERATED_CELL_MODE.EMPTY : GENERATED_CELL_MODE.SEEDED,\n );\n }\n }\n\n for (const key of [...this.generatedCellModes.keys()]) {\n if (!validKeys.has(key)) {\n this.generatedCellModes.delete(key);\n }\n }\n }\n\n protected override syncFormValue(): void {\n const serialized = JSON.stringify(this.cleanRows());\n this.setFormValue(serialized, serialized);\n }\n\n protected override restoreFormState(state: string | File | FormData | null): void {\n if (typeof state !== 'string') {\n return;\n }\n\n try {\n const parsed = JSON.parse(state);\n if (Array.isArray(parsed)) {\n this.rows = parsed;\n }\n } catch {\n // Ignore malformed restore payloads.\n }\n }\n\n /**\n * Inner cell controls (lightswitch, checkbox, select, pickers, inputs) all\n * dispatch `pk-change`/`input`/`change` with `bubbles` + `composed`, so those\n * events would otherwise escape this component's shadow root and masquerade as\n * the table's own events. Consumers bind `pk-change` and read `detail.rows`; a\n * leaked lightswitch `pk-change` carries `{ checked }` (no `rows`), which would\n * reset `rows` to `undefined` and wipe every row. We stop them at the table\n * wrapper — cell `@pk-change`/`@input` handlers already ran at their target, and\n * the table re-dispatches its own `{ rows }` payload from the host in emitChange.\n */\n private stopInnerControlEvent(event: Event): void {\n if (event.target !== this) {\n event.stopPropagation();\n }\n }\n\n private emitChange(): void {\n // Keep `_id` on the rows property / event so controlled bindings don't\n // invalidate generated-column AUTO tracking. Form submit still strips ids.\n const rows = this.internalRows.map((row) => ({ ...row }));\n this.rows = rows;\n this.syncFormValue();\n\n this.dispatchEvent(new CustomEvent<{ rows: PkEditableTableRow[] }>('pk-change', {\n detail: { rows },\n bubbles: true,\n composed: true,\n }));\n\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n private emitCellChange(rowIndex: number, columnName: string, value: unknown, row: PkEditableTableRow): void {\n this.dispatchEvent(new CustomEvent<{\n rowIndex: number;\n columnName: string;\n value: unknown;\n row: PkEditableTableRow;\n }>('pk-cell-change', {\n detail: { rowIndex, columnName, value, row },\n bubbles: true,\n composed: true,\n }));\n }\n\n private commitRows(next: PkEditableTableRow[], cellChanges: Array<{\n rowIndex: number;\n columnName: string;\n value: unknown;\n row: PkEditableTableRow;\n }> = []): void {\n this.internalRows = next;\n this.emitChange();\n for (const change of cellChanges) {\n this.emitCellChange(change.rowIndex, change.columnName, change.value, change.row);\n }\n }\n\n private updateCell(rowIndex: number, column: PkEditableTableColumn, value: unknown): void {\n const row = this.internalRows[rowIndex];\n if (!row) {\n return;\n }\n\n // Exclusive radio: checking one row clears others in that column.\n if (column.type === 'radio') {\n const nextChecked = Boolean(value);\n const allowUnselect = Boolean(column.allowUnselect);\n const next = this.internalRows.map((item) => ({ ...item }));\n const cellChanges: Array<{\n rowIndex: number;\n columnName: string;\n value: unknown;\n row: PkEditableTableRow;\n }> = [];\n\n if (nextChecked) {\n next.forEach((item, index) => {\n const target = index === rowIndex;\n if (Boolean(item[column.name]) !== target) {\n next[index] = { ...item, [column.name]: target };\n cellChanges.push({\n rowIndex: index,\n columnName: column.name,\n value: target,\n row: this.internalRows[index],\n });\n }\n });\n } else if (allowUnselect && Boolean(row[column.name])) {\n next[rowIndex] = { ...row, [column.name]: false };\n cellChanges.push({\n rowIndex,\n columnName: column.name,\n value: false,\n row,\n });\n } else {\n return;\n }\n\n if (cellChanges.length === 0) {\n return;\n }\n\n this.commitRows(next, cellChanges);\n return;\n }\n\n if (isGeneratedColumn(column)) {\n // Manual edits stick; clearing the cell returns it to auto-derived mode.\n this.generatedCellModes.set(\n getGeneratedCellKey(String(row._id), column.name),\n isEmptyCellValue(value) ? GENERATED_CELL_MODE.EMPTY : GENERATED_CELL_MODE.MANUAL,\n );\n }\n\n const sourceUpdate: Record<string, unknown> = { [column.name]: value };\n const derivedUpdates: Record<string, unknown> = {};\n\n for (const targetColumn of this.generatedColumns) {\n if (targetColumn.source !== column.name) {\n continue;\n }\n\n const targetKey = getGeneratedCellKey(String(row._id), targetColumn.name);\n const currentTargetValue = row[targetColumn.name];\n const existingMode = this.generatedCellModes.get(targetKey)\n ?? (isEmptyCellValue(currentTargetValue) ? GENERATED_CELL_MODE.EMPTY : GENERATED_CELL_MODE.SEEDED);\n\n // Manual or already-seeded cells stay put until cleared.\n if (existingMode === GENERATED_CELL_MODE.MANUAL || existingMode === GENERATED_CELL_MODE.SEEDED) {\n continue;\n }\n\n if (targetColumn.type === 'handle') {\n derivedUpdates[targetColumn.name] = generateHandle(String(value ?? ''));\n this.generatedCellModes.set(targetKey, GENERATED_CELL_MODE.AUTO);\n } else if (targetColumn.type === 'value') {\n derivedUpdates[targetColumn.name] = value;\n this.generatedCellModes.set(targetKey, GENERATED_CELL_MODE.AUTO);\n }\n }\n\n const allUpdates = { ...sourceUpdate, ...derivedUpdates };\n const hasRealChange = Object.entries(allUpdates).some(([key, nextValue]) => row[key] !== nextValue);\n if (!hasRealChange) {\n return;\n }\n\n const next = this.internalRows.slice();\n next[rowIndex] = { ...row, ...allUpdates };\n const cellChanges = Object.entries(allUpdates).map(([columnName, nextValue]) => ({\n rowIndex,\n columnName,\n value: nextValue,\n row,\n }));\n this.commitRows(next, cellChanges);\n }\n\n private canAddRow(currentCount = this.internalRows.length): boolean {\n if (this.disabled || !this.allowAdd) {\n return false;\n }\n\n if (this.maxRows != null && Number.isFinite(this.maxRows) && currentCount >= this.maxRows) {\n return false;\n }\n\n return true;\n }\n\n private createEmptyRow(): PkEditableTableRow | null {\n if (!this.canAddRow()) {\n return null;\n }\n\n const row: PkEditableTableRow = {\n _id: nextRowId(),\n ...(this.newRowDefaults && typeof this.newRowDefaults === 'object' ? this.newRowDefaults : {}),\n };\n\n for (const column of this.validColumns) {\n if (!(column.name in row)) {\n row[column.name] = defaultValueForColumn(column);\n }\n }\n\n return row;\n }\n\n private addRow(): void {\n const row = this.createEmptyRow();\n if (!row) {\n return;\n }\n\n this.internalRows = [...this.internalRows, row];\n this.syncGeneratedModesFromRows();\n this.emitChange();\n }\n\n /** Insert a blank row at `index` (0 = above first row). No-ops when add is disallowed. */\n private insertRowAt(index: number): void {\n const row = this.createEmptyRow();\n if (!row) {\n return;\n }\n\n const clamped = Math.max(0, Math.min(index, this.internalRows.length));\n const next = this.internalRows.slice();\n next.splice(clamped, 0, row);\n this.internalRows = next;\n this.syncGeneratedModesFromRows();\n this.emitChange();\n }\n\n private removeRow(rowIndex: number): void {\n if (this.disabled || !this.allowDelete) {\n return;\n }\n\n this.internalRows = this.internalRows.filter((_, index) => index !== rowIndex);\n this.syncGeneratedModesFromRows();\n this.emitChange();\n }\n\n /**\n * Craft EditableTable paste: intercept only when the clipboard has tabs/newlines.\n * Listens on the scroll wrapper so events compose out of cell control shadows.\n */\n private handleTablePaste(event: ClipboardEvent): void {\n if (this.disabled || !event.clipboardData) {\n return;\n }\n\n const data = trimClipboardText(\n event.clipboardData.getData('text/plain')\n || event.clipboardData.getData('Text')\n || '',\n );\n\n if (!isMultiCellClipboard(data)) {\n return;\n }\n\n const path = event.composedPath();\n let cell: HTMLTableCellElement | null = null;\n let row: HTMLTableRowElement | null = null;\n\n for (const node of path) {\n if (node instanceof HTMLTableCellElement && node.tagName === 'TD' && !node.classList.contains('actions')) {\n cell = node;\n }\n\n if (node instanceof HTMLTableRowElement && node.dataset.rowId) {\n row = node;\n break;\n }\n }\n\n if (!cell || !row) {\n return;\n }\n\n const rowIndex = this.internalRows.findIndex((item) => String(item._id) === row!.dataset.rowId);\n const cells = [...row.querySelectorAll<HTMLTableCellElement>(':scope > td:not(.actions)')];\n const columnIndex = cells.indexOf(cell);\n if (rowIndex < 0 || columnIndex < 0) {\n return;\n }\n\n const column = this.validColumns[columnIndex];\n // Match Craft: don't steal paste from multiline / non-textual cells.\n if (!column || !columnInterceptsPaste(column)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.importTsvData(data, rowIndex, columnIndex);\n }\n\n /**\n * Apply a TSV grid starting at `[startRowIndex, startColumnIndex]`.\n * Skips non-textual columns (checkbox etc.) but still advances the column\n * cursor — same as Craft writing only into matching `textarea`/`input`s.\n */\n private importTsvData(data: string, startRowIndex: number, startColumnIndex: number): void {\n const grid = parseTsvClipboard(data);\n if (grid.length === 0) {\n return;\n }\n\n const columns = this.validColumns;\n if (columns.length === 0 || startColumnIndex >= columns.length) {\n return;\n }\n\n const next = this.internalRows.map((row) => ({ ...row }));\n let rowIndex = startRowIndex;\n let mutated = false;\n\n for (let lineIndex = 0; lineIndex < grid.length; lineIndex++) {\n if (rowIndex >= next.length) {\n // Expand only while add is still allowed (maxRows checked against draft length).\n if (!this.canAddRow(next.length)) {\n break;\n }\n\n const created: PkEditableTableRow = {\n _id: nextRowId(),\n ...(this.newRowDefaults && typeof this.newRowDefaults === 'object' ? this.newRowDefaults : {}),\n };\n for (const column of columns) {\n if (!(column.name in created)) {\n created[column.name] = defaultValueForColumn(column);\n }\n }\n next.push(created);\n mutated = true;\n }\n\n const cells = grid[lineIndex] ?? [];\n const row = next[rowIndex];\n if (!row) {\n break;\n }\n\n let rowPatch: Record<string, unknown> | null = null;\n for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n const column = columns[startColumnIndex + cellIndex];\n if (!column) {\n break;\n }\n\n if (!columnAcceptsPasteImport(column)) {\n continue;\n }\n\n const value = cells[cellIndex] ?? '';\n if (row[column.name] === value) {\n continue;\n }\n\n rowPatch = rowPatch ?? {};\n rowPatch[column.name] = value;\n }\n\n if (rowPatch) {\n next[rowIndex] = { ...row, ...rowPatch };\n mutated = true;\n }\n\n rowIndex += 1;\n }\n\n if (!mutated) {\n return;\n }\n\n this.internalRows = next;\n this.syncGeneratedModesFromRows();\n this.emitChange();\n }\n\n private moveRow(rowIndex: number, direction: number): void {\n const target = rowIndex + direction;\n if (this.disabled || target < 0 || target >= this.internalRows.length) {\n return;\n }\n\n const rowId = String(this.internalRows[rowIndex]._id);\n const trigger = this.renderRoot.querySelector<HTMLElement>(\n `tr[data-row-id=\"${CSS.escape(rowId)}\"] pk-button[slot=\"trigger\"]`,\n );\n this.commitReorder(rowIndex, target);\n\n // Moving the focused row can blur its trigger after the menu closes.\n // Restore focus once Lit has placed the row in its new position.\n void this.updateComplete.then(() => {\n if (trigger?.isConnected) {\n trigger.focus({ preventScroll: true });\n }\n });\n }\n\n private commitReorder(fromIndex: number, toIndex: number): void {\n if (\n this.disabled\n || fromIndex === toIndex\n || fromIndex < 0\n || toIndex < 0\n || fromIndex >= this.internalRows.length\n || toIndex >= this.internalRows.length\n ) {\n return;\n }\n\n const next = this.internalRows.slice();\n const [moved] = next.splice(fromIndex, 1);\n next.splice(toIndex, 0, moved);\n this.internalRows = next;\n this.emitChange();\n }\n\n /**\n * Apply DOM-seated order after pointer drag. Uses stable `_id`s so a floated\n * source row left in the tbody can't skew from/to index arithmetic — and so a\n * cancelled drag that briefly moved the placeholder can't desync data vs DOM.\n */\n private commitReorderByIds(orderedIds: string[]): void {\n if (this.disabled || orderedIds.length === 0) {\n return;\n }\n\n const byId = new Map(this.internalRows.map((row) => [String(row._id), row]));\n if (orderedIds.length !== byId.size) {\n return;\n }\n\n const next: PkEditableTableRow[] = [];\n for (const id of orderedIds) {\n const row = byId.get(id);\n if (!row) {\n return;\n }\n next.push(row);\n }\n\n const unchanged = next.every((row, index) => row === this.internalRows[index]);\n if (unchanged) {\n return;\n }\n\n this.internalRows = next;\n this.emitChange();\n }\n\n private scheduleDndHydration(): void {\n this.cancelDndHydration();\n\n if (!this.allowReorder || this.disabled) {\n this.dndReady = false;\n this.dndController.destroy();\n return;\n }\n\n if (this.dndReady) {\n return;\n }\n\n // Defer Sortable registration past first paint (v1 requestIdleCallback + 1200ms cap).\n const enableDnd = () => {\n this.dndIdleId = null;\n this.dndTimeoutId = null;\n this.dndReady = true;\n };\n\n if (typeof window !== 'undefined' && typeof window.requestIdleCallback === 'function') {\n this.dndIdleId = window.requestIdleCallback(enableDnd, { timeout: 1200 });\n } else {\n this.dndTimeoutId = setTimeout(enableDnd, 250);\n }\n }\n\n private cancelDndHydration(): void {\n if (this.dndIdleId !== null && typeof window !== 'undefined' && typeof window.cancelIdleCallback === 'function') {\n window.cancelIdleCallback(this.dndIdleId);\n this.dndIdleId = null;\n }\n\n if (this.dndTimeoutId !== null) {\n clearTimeout(this.dndTimeoutId);\n this.dndTimeoutId = null;\n }\n }\n\n private syncDndSortables(): void {\n if (this.dndController.isSessionActive) {\n return;\n }\n\n const signature = `${this.internalRows.map((row) => String(row._id)).join('\\0')}|${this.disabled ? '1' : '0'}`;\n if (signature === this.dndRowSignature && this.dndController.isActive) {\n return;\n }\n\n // Placeholder clones strip data-row-id; keep the :not guard for safety.\n const rows = [...this.renderRoot.querySelectorAll<HTMLTableRowElement>(\n 'tr[data-row-id]:not([data-pk-dnd-placeholder])',\n )];\n this.dndController.sync(\n rows.map((row) => ({\n id: row.dataset.rowId ?? '',\n element: row,\n // Light-DOM span (v1) — pk-button shadow clicks otherwise hit PointerSensor's 200ms delay.\n handle: row.querySelector<HTMLElement>('.action-handle') ?? undefined,\n })).filter((row) => row.id !== ''),\n this.disabled,\n );\n this.dndRowSignature = signature;\n }\n\n private getCellErrors(rowIndex: number, columnName: string): string[] {\n const prefixed = this.fieldName\n ? this.cellErrors?.[`${this.fieldName}.${rowIndex}.${columnName}`]\n : undefined;\n const bare = this.cellErrors?.[`${rowIndex}.${columnName}`];\n const errors = prefixed ?? bare;\n\n if (!errors) {\n return [];\n }\n\n return Array.isArray(errors) ? errors.map(String) : [String(errors)];\n }\n\n private readValueFromEvent(event: Event): string {\n const detail = (event as CustomEvent<{ value?: unknown }>).detail;\n if (detail && 'value' in detail) {\n return String(detail.value ?? '');\n }\n\n return String((event.target as { value?: unknown }).value ?? '');\n }\n\n private readCheckedFromEvent(event: Event): boolean {\n const detail = (event as CustomEvent<{ checked?: unknown }>).detail;\n if (detail && 'checked' in detail) {\n return Boolean(detail.checked);\n }\n\n return Boolean((event.target as { checked?: unknown }).checked);\n }\n\n private renderOptionElements(column: PkEditableTableColumn): TemplateResult[] {\n return normalizeOptions(column.options).map((option) => {\n return html`<pk-option value=${option.value}>${option.label}</pk-option>`;\n });\n }\n\n private renderSelectLike(\n column: PkEditableTableColumn,\n value: unknown,\n rowIndex: number,\n invalid: boolean,\n { combobox = false }: { combobox?: boolean } = {},\n ): TemplateResult {\n const current = String(value ?? '');\n\n if (combobox) {\n return html`<pk-combobox\n class=\"cell-pk-control\"\n size=\"sm\"\n width=\"full\"\n allow-custom-value\n .value=${current}\n placeholder=${column.placeholder ?? ''}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readValueFromEvent(event));\n }}\n >\n ${this.renderOptionElements(column)}\n </pk-combobox>`;\n }\n\n // size=xs matches v1 EditableTable SelectInput — sm (~34px) fills the row and\n // looks flush against the gridlines. Adjacent toolbar selects outside the table\n // (conditions Show/All, Field picker) stay size=sm on their own.\n return html`<pk-select\n class=\"cell-pk-control\"\n size=\"xs\"\n width=\"full\"\n .value=${current}\n placeholder=${column.placeholder ?? ''}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readValueFromEvent(event));\n }}\n >\n ${this.renderOptionElements(column)}\n </pk-select>`;\n }\n\n private renderCell(\n column: PkEditableTableColumn,\n row: PkEditableTableRow,\n rowIndex: number,\n invalid: boolean,\n ): TemplateResult {\n const value = row[column.name];\n const type: PkEditableTableColumnType = column.type ?? 'text';\n const onInput = (event: Event) => {\n this.updateCell(\n rowIndex,\n column,\n this.readValueFromEvent(event),\n );\n };\n\n if (isCustomColumn(column)) {\n // Light-DOM projection — frameworks fill `slot={getCustomCellSlotName(rowId, name)}`.\n return html`<div class=\"cell-slot\">\n <slot name=${getCustomCellSlotName(String(row._id), column.name)}></slot>\n </div>`;\n }\n\n if (type === 'heading') {\n return html`<div class=\"cell-static cell-heading\">${String(value ?? '')}</div>`;\n }\n\n if (type === 'label') {\n return html`<div class=\"cell-static\">${String(value ?? '')}</div>`;\n }\n\n if (type === 'textarea') {\n return html`<pk-textarea\n class=\"cell-pk-control\"\n fit-cell\n size=\"sm\"\n rows=\"1\"\n .value=${String(value ?? '')}\n placeholder=${column.placeholder ?? nothing}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @input=${onInput}\n ></pk-textarea>`;\n }\n\n if (type === 'date') {\n return html`<pk-date-picker\n class=\"cell-pk-control\"\n size=\"sm\"\n width=\"full\"\n .value=${String(value ?? '')}\n placeholder=${column.placeholder ?? ''}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readValueFromEvent(event));\n }}\n ></pk-date-picker>`;\n }\n\n if (type === 'time') {\n return html`<pk-time-picker\n class=\"cell-pk-control\"\n size=\"sm\"\n width=\"full\"\n .value=${String(value ?? '')}\n placeholder=${column.placeholder ?? ''}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readValueFromEvent(event));\n }}\n ></pk-time-picker>`;\n }\n\n if (type === 'number' || type === 'email' || type === 'url') {\n return html`<pk-input\n class=\"cell-pk-control\"\n fit-cell\n size=\"xs\"\n type=${type}\n .value=${String(value ?? '')}\n placeholder=${column.placeholder ?? nothing}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @input=${onInput}\n ></pk-input>`;\n }\n\n if (type === 'select') {\n return this.renderSelectLike(column, value, rowIndex, invalid);\n }\n\n if (type === 'combobox') {\n return this.renderSelectLike(column, value, rowIndex, invalid, { combobox: true });\n }\n\n if (type === 'checkbox') {\n return html`<div class=\"cell-check\">\n <pk-checkbox\n aria-label=${column.label ?? column.name}\n .checked=${Boolean(value)}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readCheckedFromEvent(event));\n }}\n ></pk-checkbox>\n </div>`;\n }\n\n if (type === 'radio') {\n return html`<div class=\"cell-check\">\n <pk-checkbox\n aria-label=${column.label ?? column.name}\n .checked=${Boolean(value)}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n @pk-change=${(event: Event) => {\n // Radio columns intentionally use checkbox chrome, but the\n // update path below remains exclusive across rows.\n this.updateCell(rowIndex, column, this.readCheckedFromEvent(event));\n }}\n ></pk-checkbox>\n </div>`;\n }\n\n if (type === 'lightswitch') {\n return html`<div class=\"cell-check cell-check--switch\">\n <pk-lightswitch\n size=\"sm\"\n aria-label=${column.label ?? column.name}\n .checked=${Boolean(value)}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readCheckedFromEvent(event));\n }}\n ></pk-lightswitch>\n </div>`;\n }\n\n if (type === 'color') {\n return html`<pk-color-input\n class=\"cell-pk-control\"\n fit-cell\n size=\"xs\"\n .value=${String(value ?? '')}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @pk-change=${(event: Event) => {\n this.updateCell(rowIndex, column, this.readValueFromEvent(event));\n }}\n ></pk-color-input>`;\n }\n\n // text | handle | value | default\n return html`<pk-input\n class=\"cell-pk-control\"\n fit-cell\n size=\"xs\"\n type=\"text\"\n ?mono=${type === 'handle' || type === 'value'}\n .value=${String(value ?? '')}\n placeholder=${column.placeholder ?? nothing}\n ?disabled=${this.disabled}\n ?invalid=${invalid}\n aria-label=${column.label ?? column.name}\n @input=${onInput}\n ></pk-input>`;\n }\n\n private renderExtraMenuItems(row: PkEditableTableRow, rowIndex: number): TemplateResult | typeof nothing {\n const items = this.resolveRowMenuItems(row, rowIndex);\n if (items.length === 0) {\n return nothing;\n }\n\n return html`${items.map((item) => {\n const iconHtml = startIconHtml(item.icon);\n return html`<pk-dropdown-item\n type=${item.type ?? 'normal'}\n value=${item.value ?? item.action ?? ''}\n radio-group=${item.radioGroup ?? nothing}\n ?checked=${Boolean(item.checked)}\n ?disabled=${this.disabled || Boolean(item.disabled)}\n @pk-select=${() => {\n if (this.disabled || item.disabled) {\n return;\n }\n\n this.dispatchEvent(new CustomEvent<{\n rowIndex: number;\n row: PkEditableTableRow;\n item: PkEditableTableRowMenuItem;\n action: string;\n value: string;\n }>('pk-row-menu-select', {\n detail: {\n rowIndex,\n row,\n item,\n action: String(item.action ?? item.value ?? ''),\n value: String(item.value ?? ''),\n },\n bubbles: true,\n composed: true,\n }));\n }}\n >\n ${iconHtml ? unsafeHTML(iconHtml) : nothing}\n ${item.label}\n </pk-dropdown-item>`;\n })}`;\n }\n\n private renderRow(row: PkEditableTableRow, rowIndex: number): TemplateResult {\n const columns = this.validColumns;\n const rowCount = this.internalRows.length;\n const rowId = String(row._id);\n const rowMod = this.resolveRowModifier(row, rowIndex);\n const extraMenuItems = this.resolveRowMenuItems(row, rowIndex);\n const showRowMenu = this.allowReorder || this.allowInsert || extraMenuItems.length > 0;\n // Insert shares the add budget — disabled when the host turned `allowAdd` off.\n const insertDisabled = this.disabled || !this.canAddRow();\n\n return html`<tr\n data-row-id=${rowId}\n data-tone=${rowMod.tone || nothing}\n class=${rowMod.class\n ? classMap(Object.fromEntries(rowMod.class.split(/\\s+/).filter(Boolean).map((token) => [token, true])))\n : nothing}\n aria-label=${rowMod.title || nothing}\n >\n ${columns.map((column) => {\n const resolved = this.resolveColumn(row, column, rowIndex);\n const errors = this.getCellErrors(rowIndex, column.name);\n const columnClass = resolved.class || column.class || '';\n return html`<td\n class=${classMap({\n thin: isThinColumn(resolved),\n 'has-error': errors.length > 0,\n ...(columnClass\n ? Object.fromEntries(columnClass.split(/\\s+/).filter(Boolean).map((token) => [token, true]))\n : {}),\n })}\n style=${resolved.width || column.width ? `width: ${resolved.width || column.width}` : nothing}\n >\n ${this.renderCell(resolved, row, rowIndex, errors.length > 0)}\n </td>`;\n })}\n ${this.showActionsColumn\n ? html`<td class=\"actions\">\n <div class=\"row-actions\">\n ${this.allowReorder\n ? html`\n <span\n class=${classMap({\n 'action-handle': true,\n 'is-pending': !this.dndReady,\n })}\n >\n <pk-button\n type=\"button\"\n class=\"action-btn\"\n variant=\"none\"\n size=\"xs\"\n aria-label=${!this.dndReady && !this.disabled\n ? 'Preparing drag…'\n : 'Reorder row'}\n ?disabled=${this.disabled || !this.dndReady}\n >${unsafeHTML(START_GRIP_MOVE_ICON)}</pk-button>\n </span>`\n : nothing}\n ${showRowMenu\n ? html`<pk-dropdown-menu size=\"sm\" placement=\"bottom-end\" side-offset=\"2\">\n <pk-button\n slot=\"trigger\"\n type=\"button\"\n class=\"action-btn\"\n variant=\"none\"\n size=\"xs\"\n aria-label=\"Row actions\"\n ?disabled=${this.disabled}\n >${unsafeHTML(START_ELLIPSIS_ICON)}</pk-button>\n ${this.renderExtraMenuItems(row, rowIndex)}\n ${this.allowInsert\n ? html`\n <pk-dropdown-item\n ?disabled=${insertDisabled}\n @pk-select=${() => { this.insertRowAt(rowIndex); }}\n >\n ${unsafeHTML(START_PLUS_ICON)}\n Insert above\n </pk-dropdown-item>\n <pk-dropdown-item\n ?disabled=${insertDisabled}\n @pk-select=${() => { this.insertRowAt(rowIndex + 1); }}\n >\n ${unsafeHTML(START_PLUS_ICON)}\n Insert below\n </pk-dropdown-item>`\n : nothing}\n ${this.allowReorder\n ? html`\n <pk-dropdown-item\n ?disabled=${this.disabled || rowIndex === 0}\n @pk-select=${() => { this.moveRow(rowIndex, -1); }}\n >\n ${unsafeHTML(START_ARROW_UP_ICON)}\n Move up\n </pk-dropdown-item>\n <pk-dropdown-item\n ?disabled=${this.disabled || rowIndex === rowCount - 1}\n @pk-select=${() => { this.moveRow(rowIndex, 1); }}\n >\n ${unsafeHTML(START_ARROW_DOWN_ICON)}\n Move down\n </pk-dropdown-item>`\n : nothing}\n </pk-dropdown-menu>`\n : nothing}\n ${this.allowDelete\n ? html`<pk-button\n type=\"button\"\n class=\"action-btn action-delete\"\n variant=\"none\"\n size=\"xs\"\n aria-label=\"Delete row\"\n ?disabled=${this.disabled}\n @click=${() => { this.removeRow(rowIndex); }}\n >${unsafeHTML(START_XMARK_ICON)}</pk-button>`\n : nothing}\n </div>\n </td>`\n : nothing}\n </tr>`;\n }\n\n override render(): TemplateResult {\n const columns = this.validColumns;\n\n return html`\n <div\n class=\"et-scroll\"\n @pk-change=${this.stopInnerControlEvent}\n @input=${this.stopInnerControlEvent}\n @change=${this.stopInnerControlEvent}\n @paste=${this.handleTablePaste}\n >\n <table class=\"et\">\n <thead>\n <tr>\n ${columns.map((column) => {\n const columnClass = column.class || '';\n return html`<th\n class=${classMap({\n thin: isThinColumn(column),\n ...(columnClass\n ? Object.fromEntries(columnClass.split(/\\s+/).filter(Boolean).map((token) => [token, true]))\n : {}),\n })}\n style=${column.width ? `width: ${column.width}` : nothing}\n >\n ${column.label ?? column.name}\n ${column.required ? html`<span class=\"required\">*</span>` : nothing}\n </th>`;\n })}\n ${this.showActionsColumn ? html`<th class=\"actions\"></th>` : nothing}\n </tr>\n </thead>\n <tbody>\n ${repeat(\n this.internalRows,\n (row) => String(row._id),\n (row, index) => this.renderRow(row, index),\n )}\n </tbody>\n </table>\n </div>\n ${this.allowAdd\n ? html`<pk-button\n type=\"button\"\n class=\"add-row\"\n variant=\"dashed\"\n ?disabled=${this.disabled}\n @click=${() => { this.addRow(); }}\n >\n ${unsafeHTML(START_PLUS_ICON)}\n ${this.addRowLabel || 'Add row'}\n </pk-button>`\n : nothing}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-editable-table': PkEditableTable;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAa,6BAAb,MAAa,2BAA2B;;oBAEC;;CAOrC,YAAY,WAAuD;AAAtC,OAAA,YAAA;cALc,EAAE;kBAC1B;wBACyB,EAAE;qBACJ;;CAI1C,IAAI,WAAoB;AACpB,SAAO,KAAK,eAAe,SAAS;;;CAIxC,IAAI,kBAA2B;AAC3B,SAAO,KAAK,gBAAgB;;CAGhC,KAAK,MAAkC,UAAyB;AAC5D,MAAI,KAAK,YACL;AAGJ,OAAK,gBAAgB;AACrB,OAAK,OAAO;AACZ,OAAK,WAAW;AAEhB,OAAK,MAAM,OAAO,MAAM;AACpB,OAAI,CAAC,IAAI,OACL;GAGJ,MAAM,iBAAiB,UAAwB;AAC3C,SAAK,kBAAkB,OAAO,IAAI;;AAGtC,OAAI,OAAO,iBAAiB,eAAe,cAAc;AACzD,QAAK,eAAe,WAAW;AAC3B,QAAI,QAAQ,oBAAoB,eAAe,cAAc;KAC/D;;;CAIV,UAAgB;AACZ,OAAK,YAAY;AACjB,OAAK,gBAAgB;AACrB,OAAK,OAAO,EAAE;;CAGlB,kBAA0B,OAAqB,KAAqC;AAChF,MACI,KAAK,YACF,KAAK,eACL,MAAM,WAAW,KACjB,CAAC,MAAM,UAEV;EAGJ,MAAM,YAAY,KAAK,KAAK,WAAW,cAAc,UAAU,OAAO,IAAI,GAAG;EAC7E,MAAM,QAAQ,IAAI,QAAQ;EAC1B,MAAM,QAAQ,IAAI,QAAQ,QAAQ,QAAQ;AAC1C,MACI,YAAY,KACT,EAAE,iBAAiB,4BACnB,EAAE,iBAAiB,kBAEtB;AAGJ,QAAM,gBAAgB;EAEtB,MAAM,aAAa,CAAC,GAAG,IAAI,QAAQ,MAAM,CAAC,KAAK,SAAS,KAAK,uBAAuB,CAAC,MAAM;EAC3F,MAAM,kBAAkB,KAAK,mBAAmB,OAAO,WAAW;EAClE,MAAM,aAAa,IAAI,QAAQ,uBAAuB;EACtD,MAAM,YAAY,MAAM,uBAAuB;EAC/C,MAAM,gBAAgB;GAClB,GAAG,MAAM,UAAU,WAAW;GAC9B,GAAG,MAAM,UAAU,WAAW;GACjC;EAED,MAAM,cAAc,KAAK,kBAAkB,IAAI,SAAS,YAAY,WAAW,OAAO;AACtF,MAAI,QAAQ,sBAAsB,YAAY,YAAY;EAG1D,MAAM,cAAc,KAAK,QAAQ,IAAI,SAAS,YAAY,WAAW;EAErE,MAAM,UAAuB;GACzB;GACA;GACA;GACA;GACA;GACA,WAAW,MAAM;GACjB;GACA,WAAW,WAAW;GACtB,WAAW,WAAW;GACtB,UAAU,UAAU;GACpB,aAAa,UAAU;GACvB;GACA;GACA,SAAS,EAAE;GACX,WAAW;GACd;EAED,MAAM,MAAM,IAAI,QAAQ;EACxB,MAAM,iBAAiB,cAA4B;AAC/C,OAAI,UAAU,cAAc,QAAQ,aAAa,QAAQ,UACrD;AAGJ,aAAU,gBAAgB;GAC1B,MAAM,YAAY,QAAQ,MAAM,uBAAuB;AACvD,WAAQ,WAAW,UAAU;AAC7B,WAAQ,cAAc,UAAU;AAChC,QAAK,cAAc,SAAS,UAAU,QAAQ;AAC9C,QAAK,UAAU,SAAS,UAAU,UAAU,QAAQ,cAAc,IAAI,QAAQ,YAAY,EAAE;;EAGhG,MAAM,eAAe,YAA0B;AAC3C,OAAI,QAAQ,cAAc,QAAQ,aAAa,QAAQ,UACnD;AAGJ,WAAQ,gBAAgB;AACxB,QAAK,WAAW,QAAQ;;EAG5B,MAAM,mBAAmB,gBAA8B;AACnD,OAAI,YAAY,cAAc,QAAQ,aAAa,QAAQ,UACvD;AAIJ,QAAK,YAAY;;AAGrB,MAAI,iBAAiB,eAAe,eAAe,EAAE,SAAS,OAAO,CAAC;AACtE,MAAI,iBAAiB,aAAa,aAAa,EAAE,SAAS,OAAO,CAAC;AAClE,MAAI,iBAAiB,iBAAiB,gBAAgB;AACtD,UAAQ,QAAQ,WACN;AAAE,OAAI,oBAAoB,eAAe,cAAc;WACvD;AAAE,OAAI,oBAAoB,aAAa,YAAY;WACnD;AAAE,OAAI,oBAAoB,iBAAiB,gBAAgB;IACpE;AAED,OAAK,cAAc;AACnB,OAAK,cAAc,SAAS,MAAM,QAAQ;;;CAI9C,cAAsB,SAAsB,SAAuB;EAC/D,MAAM,SAAS,UAAU,QAAQ,cAAc;EAC/C,MAAM,SAAS,QAAQ;EACvB,MAAM,SAAS,KAAK,IAAI,QAAQ,QAAQ,cAAc,QAAQ,UAAU;EACxE,MAAM,MAAM,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,OAAO,CAAC;EACtD,MAAM,MAAM,QAAQ,IAAI;AAGxB,MAAI,MAAM,MAAM,GAAG,MAAM,QAAQ,YAAY,EAAE;AAC/C,MAAI,MAAM,OAAO,GAAG,QAAQ,YAAY,QAAQ,YAAY,EAAE;;;;;;CAOlE,UAAkB,SAAsB,QAAsB;EAC1D,MAAM,cAAc,QAAQ;EAC5B,MAAM,SAAS,QAAQ,IAAI;EAC3B,MAAM,OAAO,CAAC,GAAG,QAAQ,MAAM,iBAAsC,kBAAkB,CAAC,CAAC,QACpF,QAAQ,QAAQ,UAAU,CAAC,IAAI,aAAa,0BAA0B,CAC1E;EAED,MAAM,kBAAkB,YAAY,uBAAuB;EAC3D,MAAM,WAAW,SAAS,gBAAgB,MAAM,gBAAgB,SAAS;EACzE,MAAM,QAAQ,2BAA2B;EAEzC,IAAI,SAAqC;AACzC,OAAK,MAAM,OAAO,MAAM;GACpB,MAAM,OAAO,IAAI,uBAAuB;AACxC,OAAI,KAAK,UAAU,EACf;AAOJ,OAAI,UAJe,WACb,KAAK,MAAM,KAAK,UAAU,IAAI,SAC9B,KAAK,MAAM,KAAK,SAAS,QAEN;AACrB,aAAS;AACT;;;AAIR,MAAI,QAAQ;AACR,OAAI,YAAY,uBAAuB,OACnC,SAAQ,MAAM,aAAa,aAAa,OAAO;AAEnD;;AAGJ,MAAI,QAAQ,MAAM,qBAAqB,YACnC,SAAQ,MAAM,OAAO,YAAY;;CAIzC,WAAmB,SAA4B;AAC3C,MAAI,QAAQ,aAAa,KAAK,gBAAgB,QAC1C;AAEJ,UAAQ,YAAY;AAGpB,OAAK,YAAY,QAAQ;AACzB,OAAK,cAAc;EAEnB,MAAM,aAAa,CAAC,GAAG,QAAQ,MAAM,iBAAsC,kBAAkB,CAAC,CACzF,KAAK,QAAQ,IAAI,QAAQ,SAAS,GAAG,CACrC,QAAQ,OAAO,OAAO,GAAG;AAE9B,OAAK,UAAU,YAAY,WAAW;;CAG1C,aAA2B;EACvB,MAAM,UAAU,KAAK;AACrB,MAAI,CAAC,WAAW,QAAQ,UACpB;AAEJ,UAAQ,YAAY;AAIpB,OAAK,2BAA2B,QAAQ;AACxC,OAAK,YAAY,QAAQ;AACzB,OAAK,cAAc;;CAGvB,2BAAmC,SAA4B;EAC3D,MAAM,SAAS,CAAC,GAAG,QAAQ,MAAM,iBAAsC,kBAAkB,CAAC,CAAC,QACtF,QAAQ,QAAQ,QAAQ,IAAI,WAAW,CAAC,IAAI,aAAa,0BAA0B,CACvF;AAGD,MAAI,QAAQ,aAAa,OAAO,QAAQ;AACpC,OAAI,QAAQ,MAAM,qBAAqB,QAAQ,YAC3C,SAAQ,MAAM,OAAO,QAAQ,YAAY;AAE7C;;EAGJ,MAAM,SAAS,OAAO,QAAQ;AAC9B,MAAI,UAAU,QAAQ,YAAY,uBAAuB,OACrD,SAAQ,MAAM,aAAa,QAAQ,aAAa,OAAO;;CAI/D,YAAoB,SAA4B;AAC5C,OAAK,MAAM,WAAW,QAAQ,QAC1B,UAAS;EAGb,MAAM,MAAM,QAAQ,IAAI;AAExB,UAAQ,YAAY,YAAY,IAAI;AACpC,OAAK,UAAU,IAAI;AACnB,UAAQ,iBAAiB;;CAG7B,mBAA2B,OAAyB,QAA8B;AAC7D,QAAM,cAAc,sCACrC,EAAU,QAAQ;EAElB,MAAM,WAAW,MAAM,cAAc,cAAc,WAAW;AAC9D,WAAS,aAAa,oBAAoB,OAAO;AACjD,OAAK,MAAM,SAAS,QAAQ;GACxB,MAAM,MAAM,MAAM,cAAc,cAAc,MAAM;AACpD,OAAI,MAAM,QAAQ,GAAG,MAAM;AAC3B,YAAS,OAAO,IAAI;;EAGxB,MAAM,iBAAiB,MAAM,MAAM;AACnC,QAAM,QAAQ,SAAS;AACvB,QAAM,MAAM,cAAc;AAC1B,eAAa;AACT,YAAS,QAAQ;AACjB,SAAM,MAAM,cAAc;;;CAIlC,kBACI,KACA,YACA,QACmB;EACnB,MAAM,cAAc,IAAI,UAAU,KAAK;AACvC,cAAY,aAAa,2BAA2B,OAAO;AAC3D,cAAY,aAAa,eAAe,OAAO;AAC/C,cAAY,gBAAgB,cAAc;AAC1C,cAAY,MAAM,aAAa;AAC/B,cAAY,MAAM,gBAAgB;AAClC,cAAY,MAAM,SAAS,GAAG,OAAO;AAErC,GAAC,GAAG,YAAY,MAAM,CAAC,SAAS,MAAM,UAAU;GAC5C,MAAM,QAAQ,WAAW;AACzB,OAAI,OAAO,UAAU,UAAU;AAC3B,SAAK,MAAM,QAAQ,GAAG,MAAM;AAC5B,SAAK,MAAM,WAAW,GAAG,MAAM;AAC/B,SAAK,MAAM,WAAW,GAAG,MAAM;AAC/B,SAAK,MAAM,YAAY;;AAG3B,QAAK,iBAAiB;IACxB;AAEF,SAAO;;;;;;;;;;;CAYX,QAAgB,KAA0B,MAAe,YAAgD;AACrG,MAAI,UAAU,IAAI,cAAc;AAChC,GAAC,GAAG,IAAI,MAAM,CAAC,SAAS,MAAM,UAAU;GACpC,MAAM,QAAQ,WAAW;AACzB,OAAI,OAAO,UAAU,UAAU;AAC3B,SAAK,MAAM,QAAQ,GAAG,MAAM;AAC5B,SAAK,MAAM,WAAW,GAAG,MAAM;AAC/B,SAAK,MAAM,WAAW,GAAG,MAAM;AAC/B,SAAK,MAAM,YAAY;;IAE7B;AAEF,MAAI,MAAM,WAAW;AAErB,MAAI,MAAM,MAAM;AAChB,MAAI,MAAM,OAAO;AACjB,MAAI,MAAM,QAAQ,GAAG,KAAK,MAAM;AAChC,MAAI,MAAM,SAAS,GAAG,KAAK,OAAO;AAClC,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,gBAAgB;AAE1B,MAAI,MAAM,YAAY;AACtB,MAAI,MAAM,aAAa;AACvB,MAAI,MAAM,UAAU;EAEpB,MAAM,QAAQ,IAAI,uBAAuB;EACzC,MAAM,cAAc;GAAE,GAAG,MAAM;GAAM,GAAG,MAAM;GAAK;AACnD,MAAI,MAAM,MAAM,GAAG,KAAK,MAAM,YAAY,EAAE;AAC5C,MAAI,MAAM,OAAO,GAAG,KAAK,OAAO,YAAY,EAAE;AAE9C,SAAO;;CAGX,UAAkB,KAAgC;AAC9C,MAAI,UAAU,OAAO,cAAc;AACnC,MAAI,MAAM,WAAW;AACrB,MAAI,MAAM,MAAM;AAChB,MAAI,MAAM,OAAO;AACjB,MAAI,MAAM,QAAQ;AAClB,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,gBAAgB;AAC1B,MAAI,MAAM,YAAY;AACtB,MAAI,MAAM,aAAa;AACvB,MAAI,MAAM,UAAU;AAEpB,OAAK,MAAM,QAAQ,IAAI,OAAO;AAC1B,QAAK,MAAM,QAAQ;AACnB,QAAK,MAAM,WAAW;AACtB,QAAK,MAAM,WAAW;AACtB,QAAK,MAAM,YAAY;;;CAI/B,iBAA+B;AAC3B,OAAK,MAAM,WAAW,KAAK,eACvB,UAAS;AAEb,OAAK,iBAAiB,EAAE;;;;;AC3ZhC,IAAa,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0GxC,IAAa,sBAAsB;CAC/B,OAAO;CACP,MAAM;CACN,QAAQ;CACR,QAAQ;CACX;AAID,IAAa,qBAAqB,WAA2C;AACzE,SAAQ,OAAO,SAAS,YAAY,OAAO,SAAS,YAC7C,QAAQ,OAAO,KAAK,IACpB,QAAQ,OAAO,OAAO;;AAGjC,IAAa,gBAAgB,WAA2C;AACpE,QAAO,QACH,OAAO,QACJ,OAAO,SAAS,cAChB,OAAO,SAAS,iBAChB,OAAO,SAAS,QACtB;;AAGL,IAAa,oBAAoB,UAA4B;AACzD,QAAO,UAAU,KAAA,KAAa,UAAU,QAAQ,UAAU;;AAG9D,IAAa,uBAAuB,OAAe,eAA+B;AAC9E,QAAO,GAAG,MAAM,GAAG;;AAGvB,IAAa,oBAAoB,YAAuE;AACpG,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACvB,QAAO,EAAE;AAGb,QAAO,QAAQ,KAAK,WAAW;AAC3B,MAAI,OAAO,WAAW,SAClB,QAAO;GAAE,OAAO;GAAQ,OAAO;GAAQ;AAG3C,SAAO;GAAE,OAAO,OAAO,OAAO,SAAS,OAAO,SAAS,GAAG;GAAE,OAAO,OAAO,OAAO,SAAS,GAAG;GAAE;GACjG;;AAGN,IAAa,yBAAyB,WAA2C;AAC7E,KAAI,OAAO,SAAS,cAAc,OAAO,SAAS,iBAAiB,OAAO,SAAS,QAC/E,QAAO;AAGX,QAAO;;;;;;AAOX,IAAa,kBAAkB,gBAAgC;CAC3D,MAAM,QAAQ,YACT,UAAU,OAAO,CACjB,QAAQ,oBAAoB,GAAG,CAC/B,aAAa,CACb,QAAQ,oBAAoB,GAAG,CAC/B,MAAM,aAAa,CACnB,OAAO,QAAQ;AAEpB,KAAI,MAAM,WAAW,EACjB,QAAO;AAGX,QAAO,MACF,KAAK,MAAM,UAAW,UAAU,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE,CAAE,CACzF,KAAK,GAAG;;AAGjB,IAAI,eAAe;AAEnB,IAAa,kBAA0B;AACnC,iBAAgB;AAChB,QAAO,OAAO,KAAK,KAAK,CAAC,SAAS,GAAG,CAAC,GAAG;;;AAI7C,IAAa,yBAAyB,OAAe,eAA+B;AAChF,QAAO,QAAQ,MAAM,GAAG;;AAG5B,IAAa,uBAAuB,IAAI,IAAY;CAChD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACH,CAAC;AAEF,IAAa,kBAAkB,WAA2C;CACtE,MAAM,OAAO,OAAO;AACpB,KAAI,SAAS,SACT,QAAO;AAIX,QAAO,OAAO,SAAS,YAAY,CAAC,qBAAqB,IAAI,KAAK;;;;;;AAOtE,IAAM,0BAA0B,IAAI,IAAY;CAC5C;CACA;CACA;CACA;CACA;CACH,CAAC;;;;;AAMF,IAAM,wBAAwB,IAAI,IAAY;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACH,CAAC;;AAGF,IAAa,yBAAyB,WAA2C;AAC7E,KAAI,eAAe,OAAO,CACtB,QAAO;AAGX,QAAO,sBAAsB,IAAI,OAAO,QAAQ,OAAO;;;AAI3D,IAAa,4BAA4B,WAA2C;AAChF,KAAI,eAAe,OAAO,CACtB,QAAO;AAGX,QAAO,CAAC,wBAAwB,IAAI,OAAO,QAAQ,OAAO;;;;;;AAO9D,IAAa,qBAAqB,SAAyB;AACvD,QAAO,OAAO,QAAQ,GAAG,CAAC,QAAQ,wBAAwB,GAAG;;;AAIjE,IAAa,wBAAwB,SAA0B;AAC3D,QAAO,WAAW,KAAK,KAAK;;;;;;AAOhC,IAAa,qBAAqB,SAA6B;CAC3D,MAAM,UAAU,kBAAkB,KAAK;AACvC,KAAI,CAAC,QACD,QAAO,EAAE;AAGb,QAAO,QAAQ,MAAM,WAAW,CAAC,KAAK,SAAS,KAAK,MAAM,IAAK,CAAC;;;;;AChPpE,IAAM,uBAAuB,eAAe,SAAS,CAAC,QAAQ,QAAQ,2CAAuC;AAC7G,IAAM,sBAAsB,eAAe,SAAS,CAAC,QAAQ,QAAQ,2CAAuC;AAC5G,IAAM,sBAAsB,eAAe,QAAQ,CAAC,QAAQ,QAAQ,2CAAuC;AAC3G,IAAM,wBAAwB,eAAe,UAAU,CAAC,QAAQ,QAAQ,2CAAuC;AAC/G,IAAM,mBAAmB,eAAe,MAAM,CAAC,QAAQ,QAAQ,2CAAuC;AACtG,IAAM,kBAAkB,eAAe,KAAK,CAAC,QAAQ,QAAQ,2CAAuC;AACpG,IAAM,kBAAkB,eAAe,KAAK,CAAC,QAAQ,QAAQ,2CAAuC;AAEpG,IAAM,iBAAiB,aAA8B;AACjD,KAAI,CAAC,SACD,QAAO;AAGX,KAAI,aAAa,OACb,QAAO;CAGX,MAAM,OAAO,QAAQ,SAAS;AAC9B,KAAI,CAAC,KACD,QAAO;AAGX,QAAO,eAAe,KAAK,CAAC,QAAQ,QAAQ,2CAAuC;;AA8BhF,IAAA,kBAAA,MAAM,wBAAwB,wBAAwB;;;iBAQtB,EAAE;cAGR,EAAE;kBAGpB;qBAGG;sBAGC;qBAOD;iBAOW;qBAGX;mBAOF;oBAIoC,EAAE;wBAIR,EAAE;sBAOO;mBAIN;yBAOY;sBAGZ,EAAE;kBAO5B;4CAGU,IAAI,KAAgC;uBAEzC,IAAI,2BAA2B,EACnD,cAAc,eAAe;AACzB,QAAK,mBAAmB,WAAW;KAE1C,CAAC;mBAEiC;sBAC0B;yBAEnC;;;gBA7FD;;CAEzB,WAAoB,aAAa;AAC7B,SAAO,CAAC,GAAG,MAAM,YAAY,mBAAmB,CAAC;;CA4FrD,WAA8B,SAA+B;AACzD,MAAI,QAAQ,IAAI,OAAO,EAAE;GACrB,MAAM,WAAW,MAAM,QAAQ,KAAK,KAAK,GAAG,KAAK,OAAO,EAAE;GAC1D,MAAM,WAAW,KAAK;AAItB,QAAK,eAAe,SAAS,KAAK,KAAK,UAAU;IAC7C,MAAM,aAAa,OAAO,IAAI,QAAQ,WAChC,IAAI,MACH,OAAO,SAAS,QAAQ,QAAQ,WAAW,OAAO,SAAS,OAAO,IAAI,GAAG,WAAW;AAC3F,WAAO;KAAE,GAAG;KAAK,KAAK;KAAY;KACpC;AACF,QAAK,4BAA4B;AACjC,QAAK,eAAe;;AAGxB,MAAI,QAAQ,IAAI,eAAe,IAAI,QAAQ,IAAI,WAAW,CACtD,MAAK,sBAAsB;AAG/B,QAAM,WAAW,QAAQ;;CAG7B,aAAsB,SAA+B;AACjD,QAAM,aAAa,QAAQ;AAC3B,OAAK,sBAAsB;;CAG/B,aAAgC,SAAkC;AAG9D,MAAI,KAAK,cAAc,gBACnB,QAAO;AAGX,SAAO,MAAM,aAAa,QAAQ;;CAItC,QAAiB,SAA+B;AAC5C,QAAM,QAAQ,QAAQ;AACtB,MAAI,KAAK,YAAY,KAAK,gBAAgB,CAAC,KAAK;OAExC,CAAC,KAAK,cAAc,gBACpB,MAAK,kBAAkB;aAEpB,KAAK,cAAc,aAAa,CAAC,KAAK,gBAAgB,KAAK,YAAY,CAAC,KAAK,WAAW;AAC/F,QAAK,cAAc,SAAS;AAC5B,QAAK,kBAAkB;;;CAI/B,uBAAsC;AAClC,OAAK,oBAAoB;AACzB,OAAK,cAAc,SAAS;AAC5B,OAAK,WAAW;AAChB,QAAM,sBAAsB;;;CAIhC,IAAI,QAAgB;AAChB,SAAO,KAAK,aAAa,SAAS,KAAK,UAAU,KAAK,WAAW,CAAC,GAAG;;CAGzE,IAAY,eAAwC;AAChD,UAAQ,MAAM,QAAQ,KAAK,QAAQ,GAAG,KAAK,UAAU,EAAE,EAAE,QAAQ,WAAW;AACxE,UAAO,OAAO,QAAQ,SAAS,YAAY,OAAO,KAAK,MAAM,KAAK;IACpE;;CAGN,IAAY,mBAA4C;AACpD,SAAO,KAAK,aAAa,OAAO,kBAAkB;;CAGtD,IAAY,oBAA6B;AAErC,SAAO,KAAK,gBAAgB,KAAK,eAAe,KAAK,eAAe,QAAQ,KAAK,gBAAgB;;CAGrG,YAA0C;AACtC,SAAO,KAAK,aAAa,KAAK,QAAQ;GAClC,MAAM,EAAE,KAAK,GAAG,SAAS;AAEzB,UAAO;IACT;;;;;;CAON,aAAa,UAAkB,YAAoB,OAAsB;EACrE,MAAM,MAAM,KAAK,aAAa;AAC9B,MAAI,CAAC,IACD;EAGJ,MAAM,OAAO,KAAK,aAAa,MAAM,WAAW,OAAO,SAAS,WAAW;AAC3E,MAAI,CAAC,KACD;AAGJ,OAAK,WAAW,UAAU,KAAK,cAAc,KAAK,MAAM,SAAS,EAAE,MAAM;;CAG7E,cACI,KACA,QACA,UACqB;EACrB,MAAM,QAAQ,KAAK,eAAe,KAAK,OAAO,MAAM,QAAQ,SAAS;AACrE,MAAI,CAAC,SAAS,OAAO,UAAU,SAC3B,QAAO;AAGX,SAAO;GAAE,GAAG;GAAQ,GAAG;GAAO,MAAM,OAAO;GAAM;;CAGrD,mBAA2B,KAAyB,UAA8C;EAC9F,MAAM,QAAQ,KAAK,YAAY,KAAK,SAAS;AAC7C,MAAI,CAAC,SAAS,OAAO,UAAU,SAC3B,QAAO,EAAE;AAGb,SAAO;;CAGX,oBAA4B,KAAyB,UAAgD;EACjG,MAAM,QAAQ,KAAK,kBAAkB,KAAK,SAAS;AACnD,SAAO,MAAM,QAAQ,MAAM,GAAG,MAAM,QAAQ,SAAS,QAAQ,OAAO,KAAK,UAAU,SAAS,GAAG,EAAE;;CAGrG,6BAA2C;EACvC,MAAM,YAAY,KAAK;AACvB,MAAI,KAAK,aAAa,WAAW,KAAK,UAAU,WAAW,GAAG;AAC1D,QAAK,mBAAmB,OAAO;AAC/B;;EAGJ,MAAM,4BAAY,IAAI,KAAa;AAEnC,OAAK,MAAM,OAAO,KAAK,cAAc;GACjC,MAAM,QAAQ,OAAO,IAAI,IAAI;AAC7B,QAAK,MAAM,UAAU,WAAW;IAC5B,MAAM,MAAM,oBAAoB,OAAO,OAAO,KAAK;AACnD,cAAU,IAAI,IAAI;AAElB,QAAI,KAAK,mBAAmB,IAAI,IAAI,CAChC;AAGJ,SAAK,mBAAmB,IACpB,KACA,iBAAiB,IAAI,OAAO,MAAM,GAAG,oBAAoB,QAAQ,oBAAoB,OACxF;;;AAIT,OAAK,MAAM,OAAO,CAAC,GAAG,KAAK,mBAAmB,MAAM,CAAC,CACjD,KAAI,CAAC,UAAU,IAAI,IAAI,CACnB,MAAK,mBAAmB,OAAO,IAAI;;CAK/C,gBAAyC;EACrC,MAAM,aAAa,KAAK,UAAU,KAAK,WAAW,CAAC;AACnD,OAAK,aAAa,YAAY,WAAW;;CAG7C,iBAAoC,OAA8C;AAC9E,MAAI,OAAO,UAAU,SACjB;AAGJ,MAAI;GACA,MAAM,SAAS,KAAK,MAAM,MAAM;AAChC,OAAI,MAAM,QAAQ,OAAO,CACrB,MAAK,OAAO;UAEZ;;;;;;;;;;;;CAeZ,sBAA8B,OAAoB;AAC9C,MAAI,MAAM,WAAW,KACjB,OAAM,iBAAiB;;CAI/B,aAA2B;EAGvB,MAAM,OAAO,KAAK,aAAa,KAAK,SAAS,EAAE,GAAG,KAAK,EAAE;AACzD,OAAK,OAAO;AACZ,OAAK,eAAe;AAEpB,OAAK,cAAc,IAAI,YAA4C,aAAa;GAC5E,QAAQ,EAAE,MAAM;GAChB,SAAS;GACT,UAAU;GACb,CAAC,CAAC;AAEH,OAAK,cAAc,IAAI,MAAM,SAAS;GAAE,SAAS;GAAM,UAAU;GAAM,CAAC,CAAC;AACzE,OAAK,cAAc,IAAI,MAAM,UAAU;GAAE,SAAS;GAAM,UAAU;GAAM,CAAC,CAAC;;CAG9E,eAAuB,UAAkB,YAAoB,OAAgB,KAA+B;AACxG,OAAK,cAAc,IAAI,YAKpB,kBAAkB;GACjB,QAAQ;IAAE;IAAU;IAAY;IAAO;IAAK;GAC5C,SAAS;GACT,UAAU;GACb,CAAC,CAAC;;CAGP,WAAmB,MAA4B,cAK1C,EAAE,EAAQ;AACX,OAAK,eAAe;AACpB,OAAK,YAAY;AACjB,OAAK,MAAM,UAAU,YACjB,MAAK,eAAe,OAAO,UAAU,OAAO,YAAY,OAAO,OAAO,OAAO,IAAI;;CAIzF,WAAmB,UAAkB,QAA+B,OAAsB;EACtF,MAAM,MAAM,KAAK,aAAa;AAC9B,MAAI,CAAC,IACD;AAIJ,MAAI,OAAO,SAAS,SAAS;GACzB,MAAM,cAAc,QAAQ,MAAM;GAClC,MAAM,gBAAgB,QAAQ,OAAO,cAAc;GACnD,MAAM,OAAO,KAAK,aAAa,KAAK,UAAU,EAAE,GAAG,MAAM,EAAE;GAC3D,MAAM,cAKD,EAAE;AAEP,OAAI,YACA,MAAK,SAAS,MAAM,UAAU;IAC1B,MAAM,SAAS,UAAU;AACzB,QAAI,QAAQ,KAAK,OAAO,MAAM,KAAK,QAAQ;AACvC,UAAK,SAAS;MAAE,GAAG;OAAO,OAAO,OAAO;MAAQ;AAChD,iBAAY,KAAK;MACb,UAAU;MACV,YAAY,OAAO;MACnB,OAAO;MACP,KAAK,KAAK,aAAa;MAC1B,CAAC;;KAER;YACK,iBAAiB,QAAQ,IAAI,OAAO,MAAM,EAAE;AACnD,SAAK,YAAY;KAAE,GAAG;MAAM,OAAO,OAAO;KAAO;AACjD,gBAAY,KAAK;KACb;KACA,YAAY,OAAO;KACnB,OAAO;KACP;KACH,CAAC;SAEF;AAGJ,OAAI,YAAY,WAAW,EACvB;AAGJ,QAAK,WAAW,MAAM,YAAY;AAClC;;AAGJ,MAAI,kBAAkB,OAAO,CAEzB,MAAK,mBAAmB,IACpB,oBAAoB,OAAO,IAAI,IAAI,EAAE,OAAO,KAAK,EACjD,iBAAiB,MAAM,GAAG,oBAAoB,QAAQ,oBAAoB,OAC7E;EAGL,MAAM,eAAwC,GAAG,OAAO,OAAO,OAAO;EACtE,MAAM,iBAA0C,EAAE;AAElD,OAAK,MAAM,gBAAgB,KAAK,kBAAkB;AAC9C,OAAI,aAAa,WAAW,OAAO,KAC/B;GAGJ,MAAM,YAAY,oBAAoB,OAAO,IAAI,IAAI,EAAE,aAAa,KAAK;GACzE,MAAM,qBAAqB,IAAI,aAAa;GAC5C,MAAM,eAAe,KAAK,mBAAmB,IAAI,UAAU,KACnD,iBAAiB,mBAAmB,GAAG,oBAAoB,QAAQ,oBAAoB;AAG/F,OAAI,iBAAiB,oBAAoB,UAAU,iBAAiB,oBAAoB,OACpF;AAGJ,OAAI,aAAa,SAAS,UAAU;AAChC,mBAAe,aAAa,QAAQ,eAAe,OAAO,SAAS,GAAG,CAAC;AACvE,SAAK,mBAAmB,IAAI,WAAW,oBAAoB,KAAK;cACzD,aAAa,SAAS,SAAS;AACtC,mBAAe,aAAa,QAAQ;AACpC,SAAK,mBAAmB,IAAI,WAAW,oBAAoB,KAAK;;;EAIxE,MAAM,aAAa;GAAE,GAAG;GAAc,GAAG;GAAgB;AAEzD,MAAI,CADkB,OAAO,QAAQ,WAAW,CAAC,MAAM,CAAC,KAAK,eAAe,IAAI,SAAS,UACpF,CACD;EAGJ,MAAM,OAAO,KAAK,aAAa,OAAO;AACtC,OAAK,YAAY;GAAE,GAAG;GAAK,GAAG;GAAY;EAC1C,MAAM,cAAc,OAAO,QAAQ,WAAW,CAAC,KAAK,CAAC,YAAY,gBAAgB;GAC7E;GACA;GACA,OAAO;GACP;GACH,EAAE;AACH,OAAK,WAAW,MAAM,YAAY;;CAGtC,UAAkB,eAAe,KAAK,aAAa,QAAiB;AAChE,MAAI,KAAK,YAAY,CAAC,KAAK,SACvB,QAAO;AAGX,MAAI,KAAK,WAAW,QAAQ,OAAO,SAAS,KAAK,QAAQ,IAAI,gBAAgB,KAAK,QAC9E,QAAO;AAGX,SAAO;;CAGX,iBAAoD;AAChD,MAAI,CAAC,KAAK,WAAW,CACjB,QAAO;EAGX,MAAM,MAA0B;GAC5B,KAAK,WAAW;GAChB,GAAI,KAAK,kBAAkB,OAAO,KAAK,mBAAmB,WAAW,KAAK,iBAAiB,EAAE;GAChG;AAED,OAAK,MAAM,UAAU,KAAK,aACtB,KAAI,EAAE,OAAO,QAAQ,KACjB,KAAI,OAAO,QAAQ,sBAAsB,OAAO;AAIxD,SAAO;;CAGX,SAAuB;EACnB,MAAM,MAAM,KAAK,gBAAgB;AACjC,MAAI,CAAC,IACD;AAGJ,OAAK,eAAe,CAAC,GAAG,KAAK,cAAc,IAAI;AAC/C,OAAK,4BAA4B;AACjC,OAAK,YAAY;;;CAIrB,YAAoB,OAAqB;EACrC,MAAM,MAAM,KAAK,gBAAgB;AACjC,MAAI,CAAC,IACD;EAGJ,MAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK,aAAa,OAAO,CAAC;EACtE,MAAM,OAAO,KAAK,aAAa,OAAO;AACtC,OAAK,OAAO,SAAS,GAAG,IAAI;AAC5B,OAAK,eAAe;AACpB,OAAK,4BAA4B;AACjC,OAAK,YAAY;;CAGrB,UAAkB,UAAwB;AACtC,MAAI,KAAK,YAAY,CAAC,KAAK,YACvB;AAGJ,OAAK,eAAe,KAAK,aAAa,QAAQ,GAAG,UAAU,UAAU,SAAS;AAC9E,OAAK,4BAA4B;AACjC,OAAK,YAAY;;;;;;CAOrB,iBAAyB,OAA6B;AAClD,MAAI,KAAK,YAAY,CAAC,MAAM,cACxB;EAGJ,MAAM,OAAO,kBACT,MAAM,cAAc,QAAQ,aAAa,IACtC,MAAM,cAAc,QAAQ,OAAO,IACnC,GACN;AAED,MAAI,CAAC,qBAAqB,KAAK,CAC3B;EAGJ,MAAM,OAAO,MAAM,cAAc;EACjC,IAAI,OAAoC;EACxC,IAAI,MAAkC;AAEtC,OAAK,MAAM,QAAQ,MAAM;AACrB,OAAI,gBAAgB,wBAAwB,KAAK,YAAY,QAAQ,CAAC,KAAK,UAAU,SAAS,UAAU,CACpG,QAAO;AAGX,OAAI,gBAAgB,uBAAuB,KAAK,QAAQ,OAAO;AAC3D,UAAM;AACN;;;AAIR,MAAI,CAAC,QAAQ,CAAC,IACV;EAGJ,MAAM,WAAW,KAAK,aAAa,WAAW,SAAS,OAAO,KAAK,IAAI,KAAK,IAAK,QAAQ,MAAM;EAE/F,MAAM,cAAc,CADL,GAAG,IAAI,iBAAuC,4BAA4B,CACrE,CAAM,QAAQ,KAAK;AACvC,MAAI,WAAW,KAAK,cAAc,EAC9B;EAGJ,MAAM,SAAS,KAAK,aAAa;AAEjC,MAAI,CAAC,UAAU,CAAC,sBAAsB,OAAO,CACzC;AAGJ,QAAM,gBAAgB;AACtB,QAAM,iBAAiB;AACvB,OAAK,cAAc,MAAM,UAAU,YAAY;;;;;;;CAQnD,cAAsB,MAAc,eAAuB,kBAAgC;EACvF,MAAM,OAAO,kBAAkB,KAAK;AACpC,MAAI,KAAK,WAAW,EAChB;EAGJ,MAAM,UAAU,KAAK;AACrB,MAAI,QAAQ,WAAW,KAAK,oBAAoB,QAAQ,OACpD;EAGJ,MAAM,OAAO,KAAK,aAAa,KAAK,SAAS,EAAE,GAAG,KAAK,EAAE;EACzD,IAAI,WAAW;EACf,IAAI,UAAU;AAEd,OAAK,IAAI,YAAY,GAAG,YAAY,KAAK,QAAQ,aAAa;AAC1D,OAAI,YAAY,KAAK,QAAQ;AAEzB,QAAI,CAAC,KAAK,UAAU,KAAK,OAAO,CAC5B;IAGJ,MAAM,UAA8B;KAChC,KAAK,WAAW;KAChB,GAAI,KAAK,kBAAkB,OAAO,KAAK,mBAAmB,WAAW,KAAK,iBAAiB,EAAE;KAChG;AACD,SAAK,MAAM,UAAU,QACjB,KAAI,EAAE,OAAO,QAAQ,SACjB,SAAQ,OAAO,QAAQ,sBAAsB,OAAO;AAG5D,SAAK,KAAK,QAAQ;AAClB,cAAU;;GAGd,MAAM,QAAQ,KAAK,cAAc,EAAE;GACnC,MAAM,MAAM,KAAK;AACjB,OAAI,CAAC,IACD;GAGJ,IAAI,WAA2C;AAC/C,QAAK,IAAI,YAAY,GAAG,YAAY,MAAM,QAAQ,aAAa;IAC3D,MAAM,SAAS,QAAQ,mBAAmB;AAC1C,QAAI,CAAC,OACD;AAGJ,QAAI,CAAC,yBAAyB,OAAO,CACjC;IAGJ,MAAM,QAAQ,MAAM,cAAc;AAClC,QAAI,IAAI,OAAO,UAAU,MACrB;AAGJ,eAAW,YAAY,EAAE;AACzB,aAAS,OAAO,QAAQ;;AAG5B,OAAI,UAAU;AACV,SAAK,YAAY;KAAE,GAAG;KAAK,GAAG;KAAU;AACxC,cAAU;;AAGd,eAAY;;AAGhB,MAAI,CAAC,QACD;AAGJ,OAAK,eAAe;AACpB,OAAK,4BAA4B;AACjC,OAAK,YAAY;;CAGrB,QAAgB,UAAkB,WAAyB;EACvD,MAAM,SAAS,WAAW;AAC1B,MAAI,KAAK,YAAY,SAAS,KAAK,UAAU,KAAK,aAAa,OAC3D;EAGJ,MAAM,QAAQ,OAAO,KAAK,aAAa,UAAU,IAAI;EACrD,MAAM,UAAU,KAAK,WAAW,cAC5B,mBAAmB,IAAI,OAAO,MAAM,CAAC,8BACxC;AACD,OAAK,cAAc,UAAU,OAAO;AAI/B,OAAK,eAAe,WAAW;AAChC,OAAI,SAAS,YACT,SAAQ,MAAM,EAAE,eAAe,MAAM,CAAC;IAE5C;;CAGN,cAAsB,WAAmB,SAAuB;AAC5D,MACI,KAAK,YACF,cAAc,WACd,YAAY,KACZ,UAAU,KACV,aAAa,KAAK,aAAa,UAC/B,WAAW,KAAK,aAAa,OAEhC;EAGJ,MAAM,OAAO,KAAK,aAAa,OAAO;EACtC,MAAM,CAAC,SAAS,KAAK,OAAO,WAAW,EAAE;AACzC,OAAK,OAAO,SAAS,GAAG,MAAM;AAC9B,OAAK,eAAe;AACpB,OAAK,YAAY;;;;;;;CAQrB,mBAA2B,YAA4B;AACnD,MAAI,KAAK,YAAY,WAAW,WAAW,EACvC;EAGJ,MAAM,OAAO,IAAI,IAAI,KAAK,aAAa,KAAK,QAAQ,CAAC,OAAO,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC;AAC5E,MAAI,WAAW,WAAW,KAAK,KAC3B;EAGJ,MAAM,OAA6B,EAAE;AACrC,OAAK,MAAM,MAAM,YAAY;GACzB,MAAM,MAAM,KAAK,IAAI,GAAG;AACxB,OAAI,CAAC,IACD;AAEJ,QAAK,KAAK,IAAI;;AAIlB,MADkB,KAAK,OAAO,KAAK,UAAU,QAAQ,KAAK,aAAa,OACnE,CACA;AAGJ,OAAK,eAAe;AACpB,OAAK,YAAY;;CAGrB,uBAAqC;AACjC,OAAK,oBAAoB;AAEzB,MAAI,CAAC,KAAK,gBAAgB,KAAK,UAAU;AACrC,QAAK,WAAW;AAChB,QAAK,cAAc,SAAS;AAC5B;;AAGJ,MAAI,KAAK,SACL;EAIJ,MAAM,kBAAkB;AACpB,QAAK,YAAY;AACjB,QAAK,eAAe;AACpB,QAAK,WAAW;;AAGpB,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,wBAAwB,WACvE,MAAK,YAAY,OAAO,oBAAoB,WAAW,EAAE,SAAS,MAAM,CAAC;MAEzE,MAAK,eAAe,WAAW,WAAW,IAAI;;CAItD,qBAAmC;AAC/B,MAAI,KAAK,cAAc,QAAQ,OAAO,WAAW,eAAe,OAAO,OAAO,uBAAuB,YAAY;AAC7G,UAAO,mBAAmB,KAAK,UAAU;AACzC,QAAK,YAAY;;AAGrB,MAAI,KAAK,iBAAiB,MAAM;AAC5B,gBAAa,KAAK,aAAa;AAC/B,QAAK,eAAe;;;CAI5B,mBAAiC;AAC7B,MAAI,KAAK,cAAc,gBACnB;EAGJ,MAAM,YAAY,GAAG,KAAK,aAAa,KAAK,QAAQ,OAAO,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,WAAW,MAAM;AACzG,MAAI,cAAc,KAAK,mBAAmB,KAAK,cAAc,SACzD;EAIJ,MAAM,OAAO,CAAC,GAAG,KAAK,WAAW,iBAC7B,iDACH,CAAC;AACF,OAAK,cAAc,KACf,KAAK,KAAK,SAAS;GACf,IAAI,IAAI,QAAQ,SAAS;GACzB,SAAS;GAET,QAAQ,IAAI,cAA2B,iBAAiB,IAAI,KAAA;GAC/D,EAAE,CAAC,QAAQ,QAAQ,IAAI,OAAO,GAAG,EAClC,KAAK,SACR;AACD,OAAK,kBAAkB;;CAG3B,cAAsB,UAAkB,YAA8B;EAKlE,MAAM,UAJW,KAAK,YAChB,KAAK,aAAa,GAAG,KAAK,UAAU,GAAG,SAAS,GAAG,gBACnD,KAAA,MACO,KAAK,aAAa,GAAG,SAAS,GAAG;AAG9C,MAAI,CAAC,OACD,QAAO,EAAE;AAGb,SAAO,MAAM,QAAQ,OAAO,GAAG,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,OAAO,CAAC;;CAGxE,mBAA2B,OAAsB;EAC7C,MAAM,SAAU,MAA2C;AAC3D,MAAI,UAAU,WAAW,OACrB,QAAO,OAAO,OAAO,SAAS,GAAG;AAGrC,SAAO,OAAQ,MAAM,OAA+B,SAAS,GAAG;;CAGpE,qBAA6B,OAAuB;EAChD,MAAM,SAAU,MAA6C;AAC7D,MAAI,UAAU,aAAa,OACvB,QAAO,QAAQ,OAAO,QAAQ;AAGlC,SAAO,QAAS,MAAM,OAAiC,QAAQ;;CAGnE,qBAA6B,QAAiD;AAC1E,SAAO,iBAAiB,OAAO,QAAQ,CAAC,KAAK,WAAW;AACpD,UAAO,IAAI,oBAAoB,OAAO,MAAM,GAAG,OAAO,MAAM;IAC9D;;CAGN,iBACI,QACA,OACA,UACA,SACA,EAAE,WAAW,UAAkC,EAAE,EACnC;EACd,MAAM,UAAU,OAAO,SAAS,GAAG;AAEnC,MAAI,SACA,QAAO,IAAI;;;;;yBAKE,QAAQ;8BACH,OAAO,eAAe,GAAG;4BAC3B,KAAK,SAAS;2BACf,QAAQ;6BACN,OAAO,SAAS,OAAO,KAAK;8BAC3B,UAAiB;AAC3B,QAAK,WAAW,UAAU,QAAQ,KAAK,mBAAmB,MAAM,CAAC;IACnE;;kBAEA,KAAK,qBAAqB,OAAO,CAAC;;AAO5C,SAAO,IAAI;;;;qBAIE,QAAQ;0BACH,OAAO,eAAe,GAAG;wBAC3B,KAAK,SAAS;uBACf,QAAQ;yBACN,OAAO,SAAS,OAAO,KAAK;0BAC3B,UAAiB;AAC3B,QAAK,WAAW,UAAU,QAAQ,KAAK,mBAAmB,MAAM,CAAC;IACnE;;cAEA,KAAK,qBAAqB,OAAO,CAAC;;;CAI5C,WACI,QACA,KACA,UACA,SACc;EACd,MAAM,QAAQ,IAAI,OAAO;EACzB,MAAM,OAAkC,OAAO,QAAQ;EACvD,MAAM,WAAW,UAAiB;AAC9B,QAAK,WACD,UACA,QACA,KAAK,mBAAmB,MAAM,CACjC;;AAGL,MAAI,eAAe,OAAO,CAEtB,QAAO,IAAI;6BACM,sBAAsB,OAAO,IAAI,IAAI,EAAE,OAAO,KAAK,CAAC;;AAIzE,MAAI,SAAS,UACT,QAAO,IAAI,yCAAyC,OAAO,SAAS,GAAG,CAAC;AAG5E,MAAI,SAAS,QACT,QAAO,IAAI,4BAA4B,OAAO,SAAS,GAAG,CAAC;AAG/D,MAAI,SAAS,WACT,QAAO,IAAI;;;;;yBAKE,OAAO,SAAS,GAAG,CAAC;8BACf,OAAO,eAAe,QAAQ;4BAChC,KAAK,SAAS;2BACf,QAAQ;6BACN,OAAO,SAAS,OAAO,KAAK;yBAChC,QAAQ;;AAIzB,MAAI,SAAS,OACT,QAAO,IAAI;;;;yBAIE,OAAO,SAAS,GAAG,CAAC;8BACf,OAAO,eAAe,GAAG;4BAC3B,KAAK,SAAS;2BACf,QAAQ;6BACN,OAAO,SAAS,OAAO,KAAK;8BAC3B,UAAiB;AAC3B,QAAK,WAAW,UAAU,QAAQ,KAAK,mBAAmB,MAAM,CAAC;IACnE;;AAIV,MAAI,SAAS,OACT,QAAO,IAAI;;;;yBAIE,OAAO,SAAS,GAAG,CAAC;8BACf,OAAO,eAAe,GAAG;4BAC3B,KAAK,SAAS;2BACf,QAAQ;6BACN,OAAO,SAAS,OAAO,KAAK;8BAC3B,UAAiB;AAC3B,QAAK,WAAW,UAAU,QAAQ,KAAK,mBAAmB,MAAM,CAAC;IACnE;;AAIV,MAAI,SAAS,YAAY,SAAS,WAAW,SAAS,MAClD,QAAO,IAAI;;;;uBAIA,KAAK;yBACH,OAAO,SAAS,GAAG,CAAC;8BACf,OAAO,eAAe,QAAQ;4BAChC,KAAK,SAAS;2BACf,QAAQ;6BACN,OAAO,SAAS,OAAO,KAAK;yBAChC,QAAQ;;AAIzB,MAAI,SAAS,SACT,QAAO,KAAK,iBAAiB,QAAQ,OAAO,UAAU,QAAQ;AAGlE,MAAI,SAAS,WACT,QAAO,KAAK,iBAAiB,QAAQ,OAAO,UAAU,SAAS,EAAE,UAAU,MAAM,CAAC;AAGtF,MAAI,SAAS,WACT,QAAO,IAAI;;iCAEU,OAAO,SAAS,OAAO,KAAK;+BAC9B,QAAQ,MAAM,CAAC;gCACd,KAAK,SAAS;+BACf,QAAQ;kCACL,UAAiB;AAC3B,QAAK,WAAW,UAAU,QAAQ,KAAK,qBAAqB,MAAM,CAAC;IACrE;;;AAKd,MAAI,SAAS,QACT,QAAO,IAAI;;iCAEU,OAAO,SAAS,OAAO,KAAK;+BAC9B,QAAQ,MAAM,CAAC;gCACd,KAAK,SAAS;+BACf,QAAQ;kCACL,UAAiB;AAG3B,QAAK,WAAW,UAAU,QAAQ,KAAK,qBAAqB,MAAM,CAAC;IACrE;;;AAKd,MAAI,SAAS,cACT,QAAO,IAAI;;;iCAGU,OAAO,SAAS,OAAO,KAAK;+BAC9B,QAAQ,MAAM,CAAC;gCACd,KAAK,SAAS;+BACf,QAAQ;kCACL,UAAiB;AAC3B,QAAK,WAAW,UAAU,QAAQ,KAAK,qBAAqB,MAAM,CAAC;IACrE;;;AAKd,MAAI,SAAS,QACT,QAAO,IAAI;;;;yBAIE,OAAO,SAAS,GAAG,CAAC;4BACjB,KAAK,SAAS;2BACf,QAAQ;6BACN,OAAO,SAAS,OAAO,KAAK;8BAC3B,UAAiB;AAC3B,QAAK,WAAW,UAAU,QAAQ,KAAK,mBAAmB,MAAM,CAAC;IACnE;;AAKV,SAAO,IAAI;;;;;oBAKC,SAAS,YAAY,SAAS,QAAQ;qBACrC,OAAO,SAAS,GAAG,CAAC;0BACf,OAAO,eAAe,QAAQ;wBAChC,KAAK,SAAS;uBACf,QAAQ;yBACN,OAAO,SAAS,OAAO,KAAK;qBAChC,QAAQ;;;CAIzB,qBAA6B,KAAyB,UAAmD;EACrG,MAAM,QAAQ,KAAK,oBAAoB,KAAK,SAAS;AACrD,MAAI,MAAM,WAAW,EACjB,QAAO;AAGX,SAAO,IAAI,GAAG,MAAM,KAAK,SAAS;GAC9B,MAAM,WAAW,cAAc,KAAK,KAAK;AACzC,UAAO,IAAI;uBACA,KAAK,QAAQ,SAAS;wBACrB,KAAK,SAAS,KAAK,UAAU,GAAG;8BAC1B,KAAK,cAAc,QAAQ;2BAC9B,QAAQ,KAAK,QAAQ,CAAC;4BACrB,KAAK,YAAY,QAAQ,KAAK,SAAS,CAAC;mCACjC;AACf,QAAI,KAAK,YAAY,KAAK,SACtB;AAGJ,SAAK,cAAc,IAAI,YAMpB,sBAAsB;KACrB,QAAQ;MACJ;MACA;MACA;MACA,QAAQ,OAAO,KAAK,UAAU,KAAK,SAAS,GAAG;MAC/C,OAAO,OAAO,KAAK,SAAS,GAAG;MAClC;KACD,SAAS;KACT,UAAU;KACb,CAAC,CAAC;KACL;;kBAEA,WAAW,WAAW,SAAS,GAAG,QAAQ;kBAC1C,KAAK,MAAM;;IAEnB;;CAGN,UAAkB,KAAyB,UAAkC;EACzE,MAAM,UAAU,KAAK;EACrB,MAAM,WAAW,KAAK,aAAa;EACnC,MAAM,QAAQ,OAAO,IAAI,IAAI;EAC7B,MAAM,SAAS,KAAK,mBAAmB,KAAK,SAAS;EACrD,MAAM,iBAAiB,KAAK,oBAAoB,KAAK,SAAS;EAC9D,MAAM,cAAc,KAAK,gBAAgB,KAAK,eAAe,eAAe,SAAS;EAErF,MAAM,iBAAiB,KAAK,YAAY,CAAC,KAAK,WAAW;AAEzD,SAAO,IAAI;0BACO,MAAM;wBACR,OAAO,QAAQ,QAAQ;oBAC3B,OAAO,QACT,SAAS,OAAO,YAAY,OAAO,MAAM,MAAM,MAAM,CAAC,OAAO,QAAQ,CAAC,KAAK,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,GACrG,QAAQ;yBACD,OAAO,SAAS,QAAQ;;cAEnC,QAAQ,KAAK,WAAW;GACtB,MAAM,WAAW,KAAK,cAAc,KAAK,QAAQ,SAAS;GAC1D,MAAM,SAAS,KAAK,cAAc,UAAU,OAAO,KAAK;GACxD,MAAM,cAAc,SAAS,SAAS,OAAO,SAAS;AACtD,UAAO,IAAI;4BACC,SAAS;IACb,MAAM,aAAa,SAAS;IAC5B,aAAa,OAAO,SAAS;IAC7B,GAAI,cACE,OAAO,YAAY,YAAY,MAAM,MAAM,CAAC,OAAO,QAAQ,CAAC,KAAK,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,GAC1F,EAAE;IACX,CAAC,CAAC;4BACK,SAAS,SAAS,OAAO,QAAQ,UAAU,SAAS,SAAS,OAAO,UAAU,QAAQ;;sBAE5F,KAAK,WAAW,UAAU,KAAK,UAAU,OAAO,SAAS,EAAE,CAAC;;IAEpE,CAAC;cACD,KAAK,oBACD,IAAI;;0BAEI,KAAK,eACD,IAAI;;4CAEU,SAAS;GACb,iBAAiB;GACjB,cAAc,CAAC,KAAK;GACvB,CAAC,CAAC;;;;;;;qDAOc,CAAC,KAAK,YAAY,CAAC,KAAK,WAC/B,oBACA,cAAc;oDACR,KAAK,YAAY,CAAC,KAAK,SAAS;uCAC7C,WAAW,qBAAqB,CAAC;2CAE1C,QAAQ;0BACZ,cACI,IAAI;;;;;;;;oDAQkB,KAAK,SAAS;uCAC3B,WAAW,oBAAoB,CAAC;sCACjC,KAAK,qBAAqB,KAAK,SAAS,CAAC;sCACzC,KAAK,cACD,IAAI;;4DAEc,eAAe;mEACR;AAAE,QAAK,YAAY,SAAS;IAAI;;kDAEjD,WAAW,gBAAgB,CAAC;;;;4DAIlB,eAAe;mEACR;AAAE,QAAK,YAAY,WAAW,EAAE;IAAI;;kDAErD,WAAW,gBAAgB,CAAC;;mEAGpC,QAAQ;sCACZ,KAAK,eACD,IAAI;;4DAEc,KAAK,YAAY,aAAa,EAAE;mEACzB;AAAE,QAAK,QAAQ,UAAU,GAAG;IAAI;;kDAEjD,WAAW,oBAAoB,CAAC;;;;4DAItB,KAAK,YAAY,aAAa,WAAW,EAAE;mEACpC;AAAE,QAAK,QAAQ,UAAU,EAAE;IAAI;;kDAEhD,WAAW,sBAAsB,CAAC;;mEAG1C,QAAQ;uDAEpB,QAAQ;0BACZ,KAAK,cACD,IAAI;;;;;;4CAMU,KAAK,SAAS;+CACX;AAAE,QAAK,UAAU,SAAS;IAAI;+BAC9C,WAAW,iBAAiB,CAAC,gBAC9B,QAAQ;;yBAGpB,QAAQ;;;CAItB,SAAkC;EAC9B,MAAM,UAAU,KAAK;AAErB,SAAO,IAAI;;;6BAGU,KAAK,sBAAsB;yBAC/B,KAAK,sBAAsB;0BAC1B,KAAK,sBAAsB;yBAC5B,KAAK,iBAAiB;;;;;8BAKjB,QAAQ,KAAK,WAAW;GACtB,MAAM,cAAc,OAAO,SAAS;AACpC,UAAO,IAAI;4CACC,SAAS;IACb,MAAM,aAAa,OAAO;IAC1B,GAAI,cACE,OAAO,YAAY,YAAY,MAAM,MAAM,CAAC,OAAO,QAAQ,CAAC,KAAK,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,GAC1F,EAAE;IACX,CAAC,CAAC;4CACK,OAAO,QAAQ,UAAU,OAAO,UAAU,QAAQ;;sCAExD,OAAO,SAAS,OAAO,KAAK;sCAC5B,OAAO,WAAW,IAAI,oCAAoC,QAAQ;;IAE1E,CAAC;8BACD,KAAK,oBAAoB,IAAI,8BAA8B,QAAQ;;;;0BAIvE,OACE,KAAK,eACJ,QAAQ,OAAO,IAAI,IAAI,GACvB,KAAK,UAAU,KAAK,UAAU,KAAK,MAAM,CAC7C,CAAC;;;;cAIZ,KAAK,WACD,IAAI;;;;gCAIU,KAAK,SAAS;mCACX;AAAE,QAAK,QAAQ;IAAI;;sBAEhC,WAAW,gBAAgB,CAAC;sBAC5B,KAAK,eAAe,UAAU;gCAElC,QAAQ;;;;YA/uCrB,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,gBAAA,WAAA,WAAA,KAAA,EAAA;YAG9B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,gBAAA,WAAA,QAAA,KAAA,EAAA;YAG9B,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;CAAa,CAAC,CAAA,EAAA,gBAAA,WAAA,YAAA,KAAA,EAAA;YAGlE,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;CAAgB,CAAC,CAAA,EAAA,gBAAA,WAAA,eAAA,KAAA,EAAA;YAGrE,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;CAAiB,CAAC,CAAA,EAAA,gBAAA,WAAA,gBAAA,KAAA,EAAA;YAOtE,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;CAAgB,CAAC,CAAA,EAAA,gBAAA,WAAA,eAAA,KAAA,EAAA;YAOrE,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAY,CAAC,CAAA,EAAA,gBAAA,WAAA,WAAA,KAAA,EAAA;YAGjD,SAAS,EAAE,WAAW,iBAAiB,CAAC,CAAA,EAAA,gBAAA,WAAA,eAAA,KAAA,EAAA;YAOxC,SAAS,EAAE,WAAW,cAAc,CAAC,CAAA,EAAA,gBAAA,WAAA,aAAA,KAAA,EAAA;YAIrC,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,gBAAA,WAAA,cAAA,KAAA,EAAA;YAI9B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,gBAAA,WAAA,kBAAA,KAAA,EAAA;YAO9B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,gBAAA,WAAA,gBAAA,KAAA,EAAA;YAI9B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,gBAAA,WAAA,aAAA,KAAA,EAAA;YAO9B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,gBAAA,WAAA,mBAAA,KAAA,EAAA;YAG9B,OAAO,CAAA,EAAA,gBAAA,WAAA,gBAAA,KAAA,EAAA;YAOP,OAAO,CAAA,EAAA,gBAAA,WAAA,YAAA,KAAA,EAAA;8BAhFX,cAAc,oBAAoB,CAAA,EAAA,gBAAA"}
|
|
@@ -53,7 +53,7 @@ import { t as PkDatePicker } from "./pk-date-picker-BEAd4Ngl.js";
|
|
|
53
53
|
import { t as PkOption } from "./pk-option-DQZHV9jL.js";
|
|
54
54
|
import { t as PkSelect } from "./pk-select-CdQdhnZN.js";
|
|
55
55
|
import { t as PkTimePicker } from "./pk-time-picker-CebRqydV.js";
|
|
56
|
-
import { t as PkEditableTable } from "./pk-editable-table-
|
|
56
|
+
import { t as PkEditableTable } from "./pk-editable-table-BubcKCBn.js";
|
|
57
57
|
import { t as PkField } from "./pk-field-UAlMq6mQ.js";
|
|
58
58
|
import "../components/field.js";
|
|
59
59
|
import { t as PkPopover } from "./pk-popover-D3jkHfwB.js";
|
|
@@ -145,4 +145,4 @@ function registerAll() {
|
|
|
145
145
|
//#endregion
|
|
146
146
|
export { registerAll as t };
|
|
147
147
|
|
|
148
|
-
//# sourceMappingURL=register-
|
|
148
|
+
//# sourceMappingURL=register-Bw9kG690.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-aJw-9RWi.js","names":[],"sources":["../../src/register.ts"],"sourcesContent":["// Full-library path: every curated glyph is available to `<pk-icon icon=\"…\">`.\nimport '@verbb/plugin-kit-icons/all.js';\n\nimport { PkButton } from './components/button/pk-button.js';\nimport { PkButtonGroup } from './components/button-group/pk-button-group.js';\nimport { PkButtonGroupSeparator } from './components/button-group/pk-button-group-separator.js';\nimport { PkButtonGroupText } from './components/button-group/pk-button-group-text.js';\nimport { PkCheckbox } from './components/checkbox/pk-checkbox.js';\nimport { PkCheckboxSelect } from './components/checkbox-select/pk-checkbox-select.js';\nimport { PkCodeEditor } from './components/code-editor/pk-code-editor.js';\nimport { PkColorInput } from './components/color-input/pk-color-input.js';\nimport { PkCalendar } from './components/calendar/pk-calendar.js';\nimport { PkDatePicker } from './components/date-picker/pk-date-picker.js';\nimport { PkCombobox } from './components/combobox/pk-combobox.js';\nimport { PkConnect } from './components/connect/pk-connect.js';\nimport { PkConnectOauth } from './components/connect/pk-connect-oauth.js';\nimport { PkCopyButton } from './components/copy-button/pk-copy-button.js';\nimport { PkDialog } from './components/dialog/pk-dialog.js';\nimport { PkDropdownLabel } from './components/dropdown-menu/pk-dropdown-label.js';\nimport { PkDropdownMenu } from './components/dropdown-menu/pk-dropdown-menu.js';\nimport { PkDropdownItem } from './components/dropdown-menu/pk-dropdown-item.js';\nimport { PkDropdownSeparator } from './components/dropdown-menu/pk-dropdown-separator.js';\nimport { PkEditableTable } from './components/editable-table/pk-editable-table.js';\nimport { PkField } from './components/field/pk-field.js';\nimport { PkIcon } from './components/icon/pk-icon.js';\nimport { PkInput } from './components/input/pk-input.js';\nimport { PkInputGroup } from './components/input-group/pk-input-group.js';\nimport { PkInputGroupAddon } from './components/input-group/pk-input-group-addon.js';\nimport { PkInputGroupButton } from './components/input-group/pk-input-group-button.js';\nimport { PkInputGroupInput } from './components/input-group/pk-input-group-input.js';\nimport { PkInputGroupText } from './components/input-group/pk-input-group-text.js';\nimport { PkInputGroupTextarea } from './components/input-group/pk-input-group-textarea.js';\nimport { PkLightswitch } from './components/lightswitch/pk-lightswitch.js';\nimport { PkOption } from './components/select/pk-option.js';\nimport { PkOptionGroup } from './components/select/pk-option-group.js';\nimport { PkPopover } from './components/popover/pk-popover.js';\nimport { PkPopup } from './components/popup/pk-popup.js';\nimport { PkRadio } from './components/radio-group/pk-radio.js';\nimport { PkRadioGroup } from './components/radio-group/pk-radio-group.js';\nimport { PkScrollArea } from './components/scroll-area/pk-scroll-area.js';\nimport { PkSelect } from './components/select/pk-select.js';\nimport { PkSeparator } from './components/separator/pk-separator.js';\nimport { PkSpinner } from './components/spinner/pk-spinner.js';\nimport { PkStatus } from './components/status/pk-status.js';\nimport { PkTab } from './components/tabs/pk-tab.js';\nimport { PkTabHeading } from './components/tabs/pk-tab-heading.js';\nimport { PkTabPanel } from './components/tabs/pk-tab-panel.js';\nimport { PkTabs } from './components/tabs/pk-tabs.js';\nimport { PkTextarea } from './components/textarea/pk-textarea.js';\nimport { PkTiptapContent } from './components/tiptap/pk-tiptap-content.js';\nimport { PkTiptapEditor } from './components/tiptap/pk-tiptap-editor.js';\nimport { PkTiptapInput } from './components/tiptap/pk-tiptap-input.js';\nimport { PkTimePicker } from './components/time-picker/pk-time-picker.js';\nimport { PkToggle } from './components/toggle/pk-toggle.js';\nimport { PkToggleGroup } from './components/toggle-group/pk-toggle-group.js';\nimport { PkTooltip } from './components/tooltip/pk-tooltip.js';\n\nexport * from './components/button/index.js';\nexport * from './components/button-group/index.js';\nexport * from './components/checkbox/index.js';\nexport * from './components/checkbox-select/index.js';\nexport * from './components/input/index.js';\nexport * from './components/input-group/index.js';\nexport * from './components/textarea/index.js';\nexport * from './components/separator/index.js';\nexport * from './components/status/index.js';\nexport * from './components/toggle/index.js';\nexport * from './components/toggle-group/index.js';\nexport * from './components/lightswitch/index.js';\nexport * from './components/connect/index.js';\nexport * from './components/copy-button/index.js';\nexport * from './components/dialog/index.js';\nexport * from './components/dropdown-menu/index.js';\nexport * from './components/field/index.js';\nexport * from './components/popover/index.js';\nexport * from './components/popup/index.js';\nexport * from './components/tooltip/index.js';\nexport * from './components/radio-group/index.js';\nexport * from './components/tabs/index.js';\nexport * from './components/scroll-area/index.js';\nexport * from './components/color-input/index.js';\nexport * from './components/code-editor/index.js';\nexport * from './components/calendar/index.js';\nexport * from './components/date-picker/index.js';\nexport * from './components/select/index.js';\nexport * from './components/spinner/index.js';\nexport * from './components/time-picker/index.js';\nexport * from './components/tiptap/index.js';\n\nexport {\n PkButton,\n PkButtonGroup,\n PkButtonGroupSeparator,\n PkButtonGroupText,\n PkCheckbox,\n PkCheckboxSelect,\n PkColorInput,\n PkCodeEditor,\n PkCalendar,\n PkDatePicker,\n PkCombobox,\n PkConnect,\n PkConnectOauth,\n PkCopyButton,\n PkDialog,\n PkDropdownMenu,\n PkDropdownItem,\n PkDropdownSeparator,\n PkEditableTable,\n PkField,\n PkIcon,\n PkInput,\n PkInputGroup,\n PkInputGroupAddon,\n PkInputGroupButton,\n PkInputGroupInput,\n PkInputGroupText,\n PkInputGroupTextarea,\n PkLightswitch,\n PkOption,\n PkOptionGroup,\n PkPopover,\n PkPopup,\n PkRadio,\n PkRadioGroup,\n PkScrollArea,\n PkSelect,\n PkSeparator,\n PkSpinner,\n PkStatus,\n PkTab,\n PkTabPanel,\n PkTabs,\n PkTextarea,\n PkTimePicker,\n PkTiptapContent,\n PkTiptapEditor,\n PkTiptapInput,\n PkToggle,\n PkToggleGroup,\n PkTooltip,\n};\n\nconst COMPONENTS: [string, CustomElementConstructor][] = [\n ['pk-spinner', PkSpinner],\n ['pk-icon', PkIcon],\n ['pk-button', PkButton],\n ['pk-checkbox', PkCheckbox],\n ['pk-checkbox-select', PkCheckboxSelect],\n ['pk-color-input', PkColorInput],\n ['pk-code-editor', PkCodeEditor],\n ['pk-input', PkInput],\n ['pk-input-group', PkInputGroup],\n ['pk-input-group-addon', PkInputGroupAddon],\n ['pk-input-group-button', PkInputGroupButton],\n ['pk-input-group-input', PkInputGroupInput],\n ['pk-input-group-text', PkInputGroupText],\n ['pk-input-group-textarea', PkInputGroupTextarea],\n ['pk-textarea', PkTextarea],\n ['pk-tiptap-editor', PkTiptapEditor],\n ['pk-tiptap-input', PkTiptapInput],\n ['pk-tiptap-content', PkTiptapContent],\n ['pk-field', PkField],\n ['pk-separator', PkSeparator],\n ['pk-status', PkStatus],\n ['pk-toggle', PkToggle],\n ['pk-toggle-group', PkToggleGroup],\n ['pk-lightswitch', PkLightswitch],\n ['pk-button-group', PkButtonGroup],\n ['pk-button-group-separator', PkButtonGroupSeparator],\n ['pk-button-group-text', PkButtonGroupText],\n ['pk-dialog', PkDialog],\n ['pk-popup', PkPopup],\n ['pk-dropdown-label', PkDropdownLabel],\n ['pk-dropdown-item', PkDropdownItem],\n ['pk-dropdown-separator', PkDropdownSeparator],\n ['pk-dropdown-menu', PkDropdownMenu],\n ['pk-editable-table', PkEditableTable],\n ['pk-popover', PkPopover],\n ['pk-tooltip', PkTooltip],\n ['pk-radio', PkRadio],\n ['pk-radio-group', PkRadioGroup],\n ['pk-tab', PkTab],\n ['pk-tab-heading', PkTabHeading],\n ['pk-tab-panel', PkTabPanel],\n ['pk-tabs', PkTabs],\n ['pk-scroll-area', PkScrollArea],\n ['pk-option', PkOption],\n ['pk-option-group', PkOptionGroup],\n ['pk-select', PkSelect],\n ['pk-calendar', PkCalendar],\n ['pk-date-picker', PkDatePicker],\n ['pk-combobox', PkCombobox],\n ['pk-connect', PkConnect],\n ['pk-connect-oauth', PkConnectOauth],\n ['pk-time-picker', PkTimePicker],\n ['pk-copy-button', PkCopyButton],\n];\n\n/** Side-effect registration for all Plugin Kit web components. */\nexport function registerAll(): void {\n for (const [tag, ctor] of COMPONENTS) {\n if (!customElements.get(tag)) {\n customElements.define(tag, ctor);\n }\n }\n}\n\nexport {\n createRegisterComponents,\n type PkComponentTag,\n} from './register-components.js';\n\nexport { BUNDLER_TAG_IMPORT_PATHS as componentImportPaths } from './component-registry.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+IA,IAAM,aAAmD;CACrD,CAAC,cAAc,UAAU;CACzB,CAAC,WAAW,OAAO;CACnB,CAAC,aAAa,SAAS;CACvB,CAAC,eAAe,WAAW;CAC3B,CAAC,sBAAsB,iBAAiB;CACxC,CAAC,kBAAkB,aAAa;CAChC,CAAC,kBAAkB,aAAa;CAChC,CAAC,YAAY,QAAQ;CACrB,CAAC,kBAAkB,aAAa;CAChC,CAAC,wBAAwB,kBAAkB;CAC3C,CAAC,yBAAyB,mBAAmB;CAC7C,CAAC,wBAAwB,kBAAkB;CAC3C,CAAC,uBAAuB,iBAAiB;CACzC,CAAC,2BAA2B,qBAAqB;CACjD,CAAC,eAAe,WAAW;CAC3B,CAAC,oBAAoB,eAAe;CACpC,CAAC,mBAAmB,cAAc;CAClC,CAAC,qBAAqB,gBAAgB;CACtC,CAAC,YAAY,QAAQ;CACrB,CAAC,gBAAgB,YAAY;CAC7B,CAAC,aAAa,SAAS;CACvB,CAAC,aAAa,SAAS;CACvB,CAAC,mBAAmB,cAAc;CAClC,CAAC,kBAAkB,cAAc;CACjC,CAAC,mBAAmB,cAAc;CAClC,CAAC,6BAA6B,uBAAuB;CACrD,CAAC,wBAAwB,kBAAkB;CAC3C,CAAC,aAAa,SAAS;CACvB,CAAC,YAAY,QAAQ;CACrB,CAAC,qBAAqB,gBAAgB;CACtC,CAAC,oBAAoB,eAAe;CACpC,CAAC,yBAAyB,oBAAoB;CAC9C,CAAC,oBAAoB,eAAe;CACpC,CAAC,qBAAqB,gBAAgB;CACtC,CAAC,cAAc,UAAU;CACzB,CAAC,cAAc,UAAU;CACzB,CAAC,YAAY,QAAQ;CACrB,CAAC,kBAAkB,aAAa;CAChC,CAAC,UAAU,MAAM;CACjB,CAAC,kBAAkB,aAAa;CAChC,CAAC,gBAAgB,WAAW;CAC5B,CAAC,WAAW,OAAO;CACnB,CAAC,kBAAkB,aAAa;CAChC,CAAC,aAAa,SAAS;CACvB,CAAC,mBAAmB,cAAc;CAClC,CAAC,aAAa,SAAS;CACvB,CAAC,eAAe,WAAW;CAC3B,CAAC,kBAAkB,aAAa;CAChC,CAAC,eAAe,WAAW;CAC3B,CAAC,cAAc,UAAU;CACzB,CAAC,oBAAoB,eAAe;CACpC,CAAC,kBAAkB,aAAa;CAChC,CAAC,kBAAkB,aAAa;CACnC;;AAGD,SAAgB,cAAoB;AAChC,MAAK,MAAM,CAAC,KAAK,SAAS,WACtB,KAAI,CAAC,eAAe,IAAI,IAAI,CACxB,gBAAe,OAAO,KAAK,KAAK"}
|
|
1
|
+
{"version":3,"file":"register-Bw9kG690.js","names":[],"sources":["../../src/register.ts"],"sourcesContent":["// Full-library path: every curated glyph is available to `<pk-icon icon=\"…\">`.\nimport '@verbb/plugin-kit-icons/all.js';\n\nimport { PkButton } from './components/button/pk-button.js';\nimport { PkButtonGroup } from './components/button-group/pk-button-group.js';\nimport { PkButtonGroupSeparator } from './components/button-group/pk-button-group-separator.js';\nimport { PkButtonGroupText } from './components/button-group/pk-button-group-text.js';\nimport { PkCheckbox } from './components/checkbox/pk-checkbox.js';\nimport { PkCheckboxSelect } from './components/checkbox-select/pk-checkbox-select.js';\nimport { PkCodeEditor } from './components/code-editor/pk-code-editor.js';\nimport { PkColorInput } from './components/color-input/pk-color-input.js';\nimport { PkCalendar } from './components/calendar/pk-calendar.js';\nimport { PkDatePicker } from './components/date-picker/pk-date-picker.js';\nimport { PkCombobox } from './components/combobox/pk-combobox.js';\nimport { PkConnect } from './components/connect/pk-connect.js';\nimport { PkConnectOauth } from './components/connect/pk-connect-oauth.js';\nimport { PkCopyButton } from './components/copy-button/pk-copy-button.js';\nimport { PkDialog } from './components/dialog/pk-dialog.js';\nimport { PkDropdownLabel } from './components/dropdown-menu/pk-dropdown-label.js';\nimport { PkDropdownMenu } from './components/dropdown-menu/pk-dropdown-menu.js';\nimport { PkDropdownItem } from './components/dropdown-menu/pk-dropdown-item.js';\nimport { PkDropdownSeparator } from './components/dropdown-menu/pk-dropdown-separator.js';\nimport { PkEditableTable } from './components/editable-table/pk-editable-table.js';\nimport { PkField } from './components/field/pk-field.js';\nimport { PkIcon } from './components/icon/pk-icon.js';\nimport { PkInput } from './components/input/pk-input.js';\nimport { PkInputGroup } from './components/input-group/pk-input-group.js';\nimport { PkInputGroupAddon } from './components/input-group/pk-input-group-addon.js';\nimport { PkInputGroupButton } from './components/input-group/pk-input-group-button.js';\nimport { PkInputGroupInput } from './components/input-group/pk-input-group-input.js';\nimport { PkInputGroupText } from './components/input-group/pk-input-group-text.js';\nimport { PkInputGroupTextarea } from './components/input-group/pk-input-group-textarea.js';\nimport { PkLightswitch } from './components/lightswitch/pk-lightswitch.js';\nimport { PkOption } from './components/select/pk-option.js';\nimport { PkOptionGroup } from './components/select/pk-option-group.js';\nimport { PkPopover } from './components/popover/pk-popover.js';\nimport { PkPopup } from './components/popup/pk-popup.js';\nimport { PkRadio } from './components/radio-group/pk-radio.js';\nimport { PkRadioGroup } from './components/radio-group/pk-radio-group.js';\nimport { PkScrollArea } from './components/scroll-area/pk-scroll-area.js';\nimport { PkSelect } from './components/select/pk-select.js';\nimport { PkSeparator } from './components/separator/pk-separator.js';\nimport { PkSpinner } from './components/spinner/pk-spinner.js';\nimport { PkStatus } from './components/status/pk-status.js';\nimport { PkTab } from './components/tabs/pk-tab.js';\nimport { PkTabHeading } from './components/tabs/pk-tab-heading.js';\nimport { PkTabPanel } from './components/tabs/pk-tab-panel.js';\nimport { PkTabs } from './components/tabs/pk-tabs.js';\nimport { PkTextarea } from './components/textarea/pk-textarea.js';\nimport { PkTiptapContent } from './components/tiptap/pk-tiptap-content.js';\nimport { PkTiptapEditor } from './components/tiptap/pk-tiptap-editor.js';\nimport { PkTiptapInput } from './components/tiptap/pk-tiptap-input.js';\nimport { PkTimePicker } from './components/time-picker/pk-time-picker.js';\nimport { PkToggle } from './components/toggle/pk-toggle.js';\nimport { PkToggleGroup } from './components/toggle-group/pk-toggle-group.js';\nimport { PkTooltip } from './components/tooltip/pk-tooltip.js';\n\nexport * from './components/button/index.js';\nexport * from './components/button-group/index.js';\nexport * from './components/checkbox/index.js';\nexport * from './components/checkbox-select/index.js';\nexport * from './components/input/index.js';\nexport * from './components/input-group/index.js';\nexport * from './components/textarea/index.js';\nexport * from './components/separator/index.js';\nexport * from './components/status/index.js';\nexport * from './components/toggle/index.js';\nexport * from './components/toggle-group/index.js';\nexport * from './components/lightswitch/index.js';\nexport * from './components/connect/index.js';\nexport * from './components/copy-button/index.js';\nexport * from './components/dialog/index.js';\nexport * from './components/dropdown-menu/index.js';\nexport * from './components/field/index.js';\nexport * from './components/popover/index.js';\nexport * from './components/popup/index.js';\nexport * from './components/tooltip/index.js';\nexport * from './components/radio-group/index.js';\nexport * from './components/tabs/index.js';\nexport * from './components/scroll-area/index.js';\nexport * from './components/color-input/index.js';\nexport * from './components/code-editor/index.js';\nexport * from './components/calendar/index.js';\nexport * from './components/date-picker/index.js';\nexport * from './components/select/index.js';\nexport * from './components/spinner/index.js';\nexport * from './components/time-picker/index.js';\nexport * from './components/tiptap/index.js';\n\nexport {\n PkButton,\n PkButtonGroup,\n PkButtonGroupSeparator,\n PkButtonGroupText,\n PkCheckbox,\n PkCheckboxSelect,\n PkColorInput,\n PkCodeEditor,\n PkCalendar,\n PkDatePicker,\n PkCombobox,\n PkConnect,\n PkConnectOauth,\n PkCopyButton,\n PkDialog,\n PkDropdownMenu,\n PkDropdownItem,\n PkDropdownSeparator,\n PkEditableTable,\n PkField,\n PkIcon,\n PkInput,\n PkInputGroup,\n PkInputGroupAddon,\n PkInputGroupButton,\n PkInputGroupInput,\n PkInputGroupText,\n PkInputGroupTextarea,\n PkLightswitch,\n PkOption,\n PkOptionGroup,\n PkPopover,\n PkPopup,\n PkRadio,\n PkRadioGroup,\n PkScrollArea,\n PkSelect,\n PkSeparator,\n PkSpinner,\n PkStatus,\n PkTab,\n PkTabPanel,\n PkTabs,\n PkTextarea,\n PkTimePicker,\n PkTiptapContent,\n PkTiptapEditor,\n PkTiptapInput,\n PkToggle,\n PkToggleGroup,\n PkTooltip,\n};\n\nconst COMPONENTS: [string, CustomElementConstructor][] = [\n ['pk-spinner', PkSpinner],\n ['pk-icon', PkIcon],\n ['pk-button', PkButton],\n ['pk-checkbox', PkCheckbox],\n ['pk-checkbox-select', PkCheckboxSelect],\n ['pk-color-input', PkColorInput],\n ['pk-code-editor', PkCodeEditor],\n ['pk-input', PkInput],\n ['pk-input-group', PkInputGroup],\n ['pk-input-group-addon', PkInputGroupAddon],\n ['pk-input-group-button', PkInputGroupButton],\n ['pk-input-group-input', PkInputGroupInput],\n ['pk-input-group-text', PkInputGroupText],\n ['pk-input-group-textarea', PkInputGroupTextarea],\n ['pk-textarea', PkTextarea],\n ['pk-tiptap-editor', PkTiptapEditor],\n ['pk-tiptap-input', PkTiptapInput],\n ['pk-tiptap-content', PkTiptapContent],\n ['pk-field', PkField],\n ['pk-separator', PkSeparator],\n ['pk-status', PkStatus],\n ['pk-toggle', PkToggle],\n ['pk-toggle-group', PkToggleGroup],\n ['pk-lightswitch', PkLightswitch],\n ['pk-button-group', PkButtonGroup],\n ['pk-button-group-separator', PkButtonGroupSeparator],\n ['pk-button-group-text', PkButtonGroupText],\n ['pk-dialog', PkDialog],\n ['pk-popup', PkPopup],\n ['pk-dropdown-label', PkDropdownLabel],\n ['pk-dropdown-item', PkDropdownItem],\n ['pk-dropdown-separator', PkDropdownSeparator],\n ['pk-dropdown-menu', PkDropdownMenu],\n ['pk-editable-table', PkEditableTable],\n ['pk-popover', PkPopover],\n ['pk-tooltip', PkTooltip],\n ['pk-radio', PkRadio],\n ['pk-radio-group', PkRadioGroup],\n ['pk-tab', PkTab],\n ['pk-tab-heading', PkTabHeading],\n ['pk-tab-panel', PkTabPanel],\n ['pk-tabs', PkTabs],\n ['pk-scroll-area', PkScrollArea],\n ['pk-option', PkOption],\n ['pk-option-group', PkOptionGroup],\n ['pk-select', PkSelect],\n ['pk-calendar', PkCalendar],\n ['pk-date-picker', PkDatePicker],\n ['pk-combobox', PkCombobox],\n ['pk-connect', PkConnect],\n ['pk-connect-oauth', PkConnectOauth],\n ['pk-time-picker', PkTimePicker],\n ['pk-copy-button', PkCopyButton],\n];\n\n/** Side-effect registration for all Plugin Kit web components. */\nexport function registerAll(): void {\n for (const [tag, ctor] of COMPONENTS) {\n if (!customElements.get(tag)) {\n customElements.define(tag, ctor);\n }\n }\n}\n\nexport {\n createRegisterComponents,\n type PkComponentTag,\n} from './register-components.js';\n\nexport { BUNDLER_TAG_IMPORT_PATHS as componentImportPaths } from './component-registry.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+IA,IAAM,aAAmD;CACrD,CAAC,cAAc,UAAU;CACzB,CAAC,WAAW,OAAO;CACnB,CAAC,aAAa,SAAS;CACvB,CAAC,eAAe,WAAW;CAC3B,CAAC,sBAAsB,iBAAiB;CACxC,CAAC,kBAAkB,aAAa;CAChC,CAAC,kBAAkB,aAAa;CAChC,CAAC,YAAY,QAAQ;CACrB,CAAC,kBAAkB,aAAa;CAChC,CAAC,wBAAwB,kBAAkB;CAC3C,CAAC,yBAAyB,mBAAmB;CAC7C,CAAC,wBAAwB,kBAAkB;CAC3C,CAAC,uBAAuB,iBAAiB;CACzC,CAAC,2BAA2B,qBAAqB;CACjD,CAAC,eAAe,WAAW;CAC3B,CAAC,oBAAoB,eAAe;CACpC,CAAC,mBAAmB,cAAc;CAClC,CAAC,qBAAqB,gBAAgB;CACtC,CAAC,YAAY,QAAQ;CACrB,CAAC,gBAAgB,YAAY;CAC7B,CAAC,aAAa,SAAS;CACvB,CAAC,aAAa,SAAS;CACvB,CAAC,mBAAmB,cAAc;CAClC,CAAC,kBAAkB,cAAc;CACjC,CAAC,mBAAmB,cAAc;CAClC,CAAC,6BAA6B,uBAAuB;CACrD,CAAC,wBAAwB,kBAAkB;CAC3C,CAAC,aAAa,SAAS;CACvB,CAAC,YAAY,QAAQ;CACrB,CAAC,qBAAqB,gBAAgB;CACtC,CAAC,oBAAoB,eAAe;CACpC,CAAC,yBAAyB,oBAAoB;CAC9C,CAAC,oBAAoB,eAAe;CACpC,CAAC,qBAAqB,gBAAgB;CACtC,CAAC,cAAc,UAAU;CACzB,CAAC,cAAc,UAAU;CACzB,CAAC,YAAY,QAAQ;CACrB,CAAC,kBAAkB,aAAa;CAChC,CAAC,UAAU,MAAM;CACjB,CAAC,kBAAkB,aAAa;CAChC,CAAC,gBAAgB,WAAW;CAC5B,CAAC,WAAW,OAAO;CACnB,CAAC,kBAAkB,aAAa;CAChC,CAAC,aAAa,SAAS;CACvB,CAAC,mBAAmB,cAAc;CAClC,CAAC,aAAa,SAAS;CACvB,CAAC,eAAe,WAAW;CAC3B,CAAC,kBAAkB,aAAa;CAChC,CAAC,eAAe,WAAW;CAC3B,CAAC,cAAc,UAAU;CACzB,CAAC,oBAAoB,eAAe;CACpC,CAAC,kBAAkB,aAAa;CAChC,CAAC,kBAAkB,aAAa;CACnC;;AAGD,SAAgB,cAAoB;AAChC,MAAK,MAAM,CAAC,KAAK,SAAS,WACtB,KAAI,CAAC,eAAe,IAAI,IAAI,CACxB,gBAAe,OAAO,KAAK,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pk-editable-table.d.ts","sourceRoot":"","sources":["../../../src/components/editable-table/pk-editable-table.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAG1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAGnF,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,4BAA4B,CAAC;AACpC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,sBAAsB,CAAC;AAC9B,OAAO,kCAAkC,CAAC;AAC1C,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kCAAkC,CAAC;AAG1C,OAAO,EAkBH,KAAK,qBAAqB,EAE1B,KAAK,8BAA8B,EACnC,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAE7B,KAAK,kBAAkB,EAG1B,MAAM,2BAA2B,CAAC;AA4BnC,YAAY,EACR,qBAAqB,EACrB,yBAAyB,EACzB,8BAA8B,EAC9B,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAClB,0BAA0B,EAC1B,0BAA0B,GAC7B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACH,qBAAqB,EACrB,cAAc,EACd,SAAS,GACZ,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;GAOG;AACH,qBACa,eAAgB,SAAQ,uBAAuB;IACxD,OAAgB,MAAM,0BAAyB;IAE/C,WAAoB,UAAU,2CAE7B;IAGD,OAAO,EAAE,qBAAqB,EAAE,CAAM;IAGtC,IAAI,EAAE,kBAAkB,EAAE,CAAM;IAGhC,QAAQ,UAAQ;IAGhB,WAAW,UAAQ;IAGnB,YAAY,UAAQ;IAEpB;;;OAGG;IAEH,WAAW,UAAQ;IAEnB;;;OAGG;IAEH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG9B,WAAW,SAAM;IAEjB;;;OAGG;IAEH,SAAS,SAAM;IAEf,+FAA+F;IAE/F,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAM;IAEnD,8DAA8D;IAE9D,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAE7C;;;OAGG;IAEH,YAAY,EAAE,2BAA2B,GAAG,IAAI,CAAQ;IAExD,2EAA2E;IAE3E,SAAS,EAAE,wBAAwB,GAAG,IAAI,CAAQ;IAElD;;;OAGG;IAEH,eAAe,EAAE,8BAA8B,GAAG,IAAI,CAAQ;IAG9D,OAAO,CAAC,YAAY,CAA4B;IAEhD;;;OAGG;IAEH,OAAO,CAAC,QAAQ,CAAS;IAEzB,oFAAoF;IACpF,OAAO,CAAC,kBAAkB,CAAwC;IAElE,OAAO,CAAC,aAAa,CAIlB;IAEH,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,YAAY,CAA8C;IAClE,mGAAmG;IACnG,OAAO,CAAC,eAAe,CAAM;cAEV,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAwBnD,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;cAKjC,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;IAWxD,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAatC,oBAAoB,IAAI,IAAI;IAOrC,8FAA8F;IAC9F,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,OAAO,KAAK,YAAY,GAIvB;IAED,OAAO,KAAK,gBAAgB,GAE3B;IAED,OAAO,KAAK,iBAAiB,GAG5B;IAED,OAAO,CAAC,SAAS;IAQjB;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAcxE,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,0BAA0B;cAiCf,aAAa,IAAI,IAAI;cAKrB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,GAAG,IAAI;IAejF;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;IAM7B,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,UAAU;IAuGlB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,MAAM;IAWd,0FAA0F;IAC1F,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,SAAS;IAUjB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAoDxB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IA8ErB,OAAO,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"pk-editable-table.d.ts","sourceRoot":"","sources":["../../../src/components/editable-table/pk-editable-table.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as nextRowId, i as isCustomColumn, r as getCustomCellSlotName, t as PkEditableTable } from "../../chunks/pk-editable-table-
|
|
1
|
+
import { a as nextRowId, i as isCustomColumn, r as getCustomCellSlotName, t as PkEditableTable } from "../../chunks/pk-editable-table-BubcKCBn.js";
|
|
2
2
|
export { PkEditableTable, getCustomCellSlotName, isCustomColumn, nextRowId };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as nextRowId, i as isCustomColumn, n as BUILTIN_COLUMN_TYPES, r as getCustomCellSlotName, t as PkEditableTable } from "../chunks/pk-editable-table-
|
|
1
|
+
import { a as nextRowId, i as isCustomColumn, n as BUILTIN_COLUMN_TYPES, r as getCustomCellSlotName, t as PkEditableTable } from "../chunks/pk-editable-table-BubcKCBn.js";
|
|
2
2
|
export { BUILTIN_COLUMN_TYPES, PkEditableTable, getCustomCellSlotName, isCustomColumn, nextRowId };
|
package/dist/index.js
CHANGED
|
@@ -66,7 +66,7 @@ import { t as PkDatePicker } from "./chunks/pk-date-picker-BEAd4Ngl.js";
|
|
|
66
66
|
import { t as PkOption } from "./chunks/pk-option-DQZHV9jL.js";
|
|
67
67
|
import { t as PkSelect } from "./chunks/pk-select-CdQdhnZN.js";
|
|
68
68
|
import { t as PkTimePicker } from "./chunks/pk-time-picker-CebRqydV.js";
|
|
69
|
-
import { a as nextRowId, i as isCustomColumn, n as BUILTIN_COLUMN_TYPES, r as getCustomCellSlotName, t as PkEditableTable } from "./chunks/pk-editable-table-
|
|
69
|
+
import { a as nextRowId, i as isCustomColumn, n as BUILTIN_COLUMN_TYPES, r as getCustomCellSlotName, t as PkEditableTable } from "./chunks/pk-editable-table-BubcKCBn.js";
|
|
70
70
|
import "./components/editable-table.js";
|
|
71
71
|
import { t as PkField } from "./chunks/pk-field-UAlMq6mQ.js";
|
|
72
72
|
import "./components/field.js";
|
|
@@ -96,7 +96,7 @@ import "./components/spinner.js";
|
|
|
96
96
|
import { t as PkTiptapContent } from "./chunks/pk-tiptap-content-CL8smjGi.js";
|
|
97
97
|
import { t as PkTiptapEditor } from "./chunks/pk-tiptap-editor-CTz-yfHL.js";
|
|
98
98
|
import { t as PkTiptapInput } from "./chunks/pk-tiptap-input-Y9eog9Zn.js";
|
|
99
|
-
import { t as registerAll } from "./chunks/register-
|
|
99
|
+
import { t as registerAll } from "./chunks/register-Bw9kG690.js";
|
|
100
100
|
import { _ as setPortalClassName, a as startLoader, c as setBasePath, d as getPortalClassName, f as getPortalContainer, g as resolvePositionMethod, h as getShadowRootSelectors, i as preventTurboFouce, l as allDefined, m as getPortalTargetForAppend, n as FOUCE_TIMEOUT_MS, o as stopLoader, p as getPortalMountElement, r as discover, s as getBasePath, t as DISCOVERY_COMPLETE_EVENT, u as configurePluginKitWeb, v as setPortalContainer, y as setShadowRootSelectors } from "./chunks/autoloader-dJO3tYOX.js";
|
|
101
101
|
import { t as BUNDLER_TAG_IMPORT_PATHS } from "./chunks/component-registry-D34fm8xW.js";
|
|
102
102
|
import { t as createRegisterComponents } from "./chunks/register-components-BT9THgdh.js";
|
package/dist/register.js
CHANGED
|
@@ -54,7 +54,7 @@ import { t as PkDatePicker } from "./chunks/pk-date-picker-BEAd4Ngl.js";
|
|
|
54
54
|
import { t as PkOption } from "./chunks/pk-option-DQZHV9jL.js";
|
|
55
55
|
import { t as PkSelect } from "./chunks/pk-select-CdQdhnZN.js";
|
|
56
56
|
import { t as PkTimePicker } from "./chunks/pk-time-picker-CebRqydV.js";
|
|
57
|
-
import { t as PkEditableTable } from "./chunks/pk-editable-table-
|
|
57
|
+
import { t as PkEditableTable } from "./chunks/pk-editable-table-BubcKCBn.js";
|
|
58
58
|
import { t as PkField } from "./chunks/pk-field-UAlMq6mQ.js";
|
|
59
59
|
import "./components/field.js";
|
|
60
60
|
import { t as PkPopover } from "./chunks/pk-popover-D3jkHfwB.js";
|
|
@@ -82,7 +82,7 @@ import "./components/spinner.js";
|
|
|
82
82
|
import { t as PkTiptapContent } from "./chunks/pk-tiptap-content-CL8smjGi.js";
|
|
83
83
|
import { t as PkTiptapEditor } from "./chunks/pk-tiptap-editor-CTz-yfHL.js";
|
|
84
84
|
import { t as PkTiptapInput } from "./chunks/pk-tiptap-input-Y9eog9Zn.js";
|
|
85
|
-
import { t as registerAll } from "./chunks/register-
|
|
85
|
+
import { t as registerAll } from "./chunks/register-Bw9kG690.js";
|
|
86
86
|
import { t as BUNDLER_TAG_IMPORT_PATHS } from "./chunks/component-registry-D34fm8xW.js";
|
|
87
87
|
import { t as createRegisterComponents } from "./chunks/register-components-BT9THgdh.js";
|
|
88
88
|
export { ALL_VALUE, PkButton, PkButtonGroup, PkButtonGroupSeparator, PkButtonGroupText, PkCalendar, PkCheckbox, PkCheckboxSelect, PkCodeEditor, PkColorInput, PkCombobox, PkConnect, PkConnectOauth, PkCopyButton, PkDatePicker, PkDialog, PkDropdownItem, PkDropdownLabel, PkDropdownMenu, PkDropdownSeparator, PkEditableTable, PkField, PkIcon, PkInput, PkInputGroup, PkInputGroupAddon, PkInputGroupButton, PkInputGroupInput, PkInputGroupText, PkInputGroupTextarea, PkLightswitch, PkOption, PkOptionGroup, PkPopover, PkPopup, PkRadio, PkRadioGroup, PkScrollArea, PkSelect, PkSeparator, PkSpinner, PkStatus, PkTab, PkTabHeading, PkTabPanel, PkTabs, PkTextarea, PkTimePicker, PkTiptapContent, PkTiptapEditor, PkTiptapInput, PkToggle, PkToggleGroup, PkTooltip, BUNDLER_TAG_IMPORT_PATHS as componentImportPaths, createRegisterComponents, getButtonSpinnerSize, registerAll, resolveSpinnerVariant };
|
|
@@ -1241,7 +1241,12 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
|
|
|
1241
1241
|
moveRow(rowIndex, direction) {
|
|
1242
1242
|
const target = rowIndex + direction;
|
|
1243
1243
|
if (this.disabled || target < 0 || target >= this.internalRows.length) return;
|
|
1244
|
+
const rowId = String(this.internalRows[rowIndex]._id);
|
|
1245
|
+
const trigger = this.renderRoot.querySelector(`tr[data-row-id="${CSS.escape(rowId)}"] pk-button[slot="trigger"]`);
|
|
1244
1246
|
this.commitReorder(rowIndex, target);
|
|
1247
|
+
this.updateComplete.then(() => {
|
|
1248
|
+
if (trigger?.isConnected) trigger.focus({ preventScroll: true });
|
|
1249
|
+
});
|
|
1245
1250
|
}
|
|
1246
1251
|
commitReorder(fromIndex, toIndex) {
|
|
1247
1252
|
if (this.disabled || fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= this.internalRows.length || toIndex >= this.internalRows.length) return;
|
|
@@ -1496,7 +1501,7 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
|
|
|
1496
1501
|
radio-group=${item.radioGroup ?? A}
|
|
1497
1502
|
?checked=${Boolean(item.checked)}
|
|
1498
1503
|
?disabled=${this.disabled || Boolean(item.disabled)}
|
|
1499
|
-
@
|
|
1504
|
+
@pk-select=${() => {
|
|
1500
1505
|
if (this.disabled || item.disabled) return;
|
|
1501
1506
|
this.dispatchEvent(new CustomEvent("pk-row-menu-select", {
|
|
1502
1507
|
detail: {
|
|
@@ -1577,7 +1582,7 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
|
|
|
1577
1582
|
${this.allowInsert ? b`
|
|
1578
1583
|
<pk-dropdown-item
|
|
1579
1584
|
?disabled=${insertDisabled}
|
|
1580
|
-
@
|
|
1585
|
+
@pk-select=${() => {
|
|
1581
1586
|
this.insertRowAt(rowIndex);
|
|
1582
1587
|
}}
|
|
1583
1588
|
>
|
|
@@ -1586,7 +1591,7 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
|
|
|
1586
1591
|
</pk-dropdown-item>
|
|
1587
1592
|
<pk-dropdown-item
|
|
1588
1593
|
?disabled=${insertDisabled}
|
|
1589
|
-
@
|
|
1594
|
+
@pk-select=${() => {
|
|
1590
1595
|
this.insertRowAt(rowIndex + 1);
|
|
1591
1596
|
}}
|
|
1592
1597
|
>
|
|
@@ -1596,7 +1601,7 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
|
|
|
1596
1601
|
${this.allowReorder ? b`
|
|
1597
1602
|
<pk-dropdown-item
|
|
1598
1603
|
?disabled=${this.disabled || rowIndex === 0}
|
|
1599
|
-
@
|
|
1604
|
+
@pk-select=${() => {
|
|
1600
1605
|
this.moveRow(rowIndex, -1);
|
|
1601
1606
|
}}
|
|
1602
1607
|
>
|
|
@@ -1605,7 +1610,7 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
|
|
|
1605
1610
|
</pk-dropdown-item>
|
|
1606
1611
|
<pk-dropdown-item
|
|
1607
1612
|
?disabled=${this.disabled || rowIndex === rowCount - 1}
|
|
1608
|
-
@
|
|
1613
|
+
@pk-select=${() => {
|
|
1609
1614
|
this.moveRow(rowIndex, 1);
|
|
1610
1615
|
}}
|
|
1611
1616
|
>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verbb/plugin-kit-web",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.18",
|
|
4
4
|
"repository": {
|
|
5
5
|
"url": "git+https://github.com/verbb/plugin-kit.git"
|
|
6
6
|
},
|
|
@@ -1027,18 +1027,18 @@
|
|
|
1027
1027
|
},
|
|
1028
1028
|
"peerDependencies": {
|
|
1029
1029
|
"@floating-ui/dom": "^1.7.3",
|
|
1030
|
-
"@verbb/plugin-kit-core": "^2.0.
|
|
1031
|
-
"@verbb/plugin-kit-icons": "^2.0.
|
|
1030
|
+
"@verbb/plugin-kit-core": "^2.0.18",
|
|
1031
|
+
"@verbb/plugin-kit-icons": "^2.0.18",
|
|
1032
1032
|
"lit": "^3.3.0"
|
|
1033
1033
|
},
|
|
1034
1034
|
"license": "MIT",
|
|
1035
1035
|
"dependencies": {
|
|
1036
1036
|
"@floating-ui/dom": "^1.7.3",
|
|
1037
1037
|
"@tiptap/core": "3.22.4",
|
|
1038
|
-
"@verbb/plugin-kit-codemirror-core": "2.0.
|
|
1039
|
-
"@verbb/plugin-kit-core": "^2.0.
|
|
1040
|
-
"@verbb/plugin-kit-icons": "^2.0.
|
|
1041
|
-
"@verbb/plugin-kit-tiptap-core": "^2.0.
|
|
1038
|
+
"@verbb/plugin-kit-codemirror-core": "2.0.18",
|
|
1039
|
+
"@verbb/plugin-kit-core": "^2.0.18",
|
|
1040
|
+
"@verbb/plugin-kit-icons": "^2.0.18",
|
|
1041
|
+
"@verbb/plugin-kit-tiptap-core": "^2.0.18",
|
|
1042
1042
|
"composed-offset-position": "^0.0.6",
|
|
1043
1043
|
"lit": "^3.3.0"
|
|
1044
1044
|
},
|