@ixfx/components 0.7.4 → 0.7.5
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/bundle/index.d.ts +536 -178
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +1324 -442
- package/bundle/index.js.map +1 -1
- package/dist/ac-token.js +1 -1
- package/dist/crumbs.d.ts +5 -1
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +10 -0
- package/dist/crumbs.js.map +1 -1
- package/dist/{data-grid-BddUjAti.d.ts → data-grid-CtJ35v8L.d.ts} +26 -1
- package/dist/data-grid-CtJ35v8L.d.ts.map +1 -0
- package/dist/data-grid.d.ts +1 -1
- package/dist/data-grid.js +88 -7
- package/dist/data-grid.js.map +1 -1
- package/dist/{detail-list-Br0WAnry.d.ts → detail-list-BS5dRDda.d.ts} +20 -12
- package/dist/detail-list-BS5dRDda.d.ts.map +1 -0
- package/dist/detail-list.d.ts +2 -2
- package/dist/detail-list.js +51 -135
- package/dist/detail-list.js.map +1 -1
- package/dist/{grid-list-B_orPsot.d.ts → grid-list-D-GbghSH.d.ts} +18 -1
- package/dist/grid-list-D-GbghSH.d.ts.map +1 -0
- package/dist/grid-list.d.ts +1 -1
- package/dist/grid-list.js +76 -15
- package/dist/grid-list.js.map +1 -1
- package/dist/incr-search-DpbSJtgj.js +962 -0
- package/dist/incr-search-DpbSJtgj.js.map +1 -0
- package/dist/incr-search.d.ts +2 -2
- package/dist/incr-search.js +2 -3
- package/dist/index-CBS4z1v-.d.ts +365 -0
- package/dist/index-CBS4z1v-.d.ts.map +1 -0
- package/dist/index.d.ts +8 -8
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/{list-selection-controller-CUo-Hhcm.js → list-selection-controller-DTFI40li.js} +2 -76
- package/dist/list-selection-controller-DTFI40li.js.map +1 -0
- package/dist/miller.d.ts +81 -3
- package/dist/miller.d.ts.map +1 -1
- package/dist/miller.js +327 -68
- package/dist/miller.js.map +1 -1
- package/dist/narrowed-text.js +1 -2
- package/dist/narrowed-text.js.map +1 -1
- package/dist/{tree-B74zdI60.js → tree-DAii2A1g.js} +77 -15
- package/dist/tree-DAii2A1g.js.map +1 -0
- package/dist/{tree-component-BvV4muxx.d.ts → tree-component-F6qZ0Gdv.d.ts} +9 -1
- package/dist/{tree-component-BvV4muxx.d.ts.map → tree-component-F6qZ0Gdv.d.ts.map} +1 -1
- package/dist/tree.d.ts +22 -1
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -1
- package/dist/{vertical-list-CQSEVeOT.d.ts → vertical-list-DwtCPy1b.d.ts} +17 -14
- package/dist/vertical-list-DwtCPy1b.d.ts.map +1 -0
- package/dist/vertical-list.d.ts +1 -1
- package/dist/vertical-list.js +59 -127
- package/dist/vertical-list.js.map +1 -1
- package/docs-user/data-grid.md +19 -0
- package/docs-user/detail-list.md +1 -1
- package/docs-user/grid-list.md +24 -0
- package/docs-user/incr-search.md +12 -2
- package/docs-user/index.json +2 -2
- package/docs-user/tree.md +22 -1
- package/docs-user/vertical-list.md +7 -1
- package/package.json +1 -1
- package/dist/data-grid-BddUjAti.d.ts.map +0 -1
- package/dist/detail-list-Br0WAnry.d.ts.map +0 -1
- package/dist/element-search-Y8SRfPGM.js +0 -185
- package/dist/element-search-Y8SRfPGM.js.map +0 -1
- package/dist/grid-list-B_orPsot.d.ts.map +0 -1
- package/dist/incr-search-vCzuao-2.js +0 -137
- package/dist/incr-search-vCzuao-2.js.map +0 -1
- package/dist/index-Cu5i8zZY.d.ts +0 -160
- package/dist/index-Cu5i8zZY.d.ts.map +0 -1
- package/dist/list-selection-controller-CUo-Hhcm.js.map +0 -1
- package/dist/tree-B74zdI60.js.map +0 -1
- package/dist/vertical-list-CQSEVeOT.d.ts.map +0 -1
package/dist/data-grid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-grid.js","names":["#rowReflowTimer","#appendInProgress","#noteFlatMutation","#prevFlatKeys","#dataGridRenderedOnce","#enteringRowKeys","#appendToFlat","#resortRaf","customElement"],"sources":["../src/data-grid/data-grid.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { DragGhost } from '../util/drag-ghost.js';\nimport type { BuiltInFormatterName, BuiltInFormatterOptions, DataGridColumn, DataGridColumnMenu, DataGridEditability, DataGridEditorFactory, DataGridGetRowKey, DataGridGroupBy, DataGridGroupLabel, DataGridInteractionMode, DataGridSelectionMode, DataGridSortState, GlobalFormatter } from './types.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { listItemFadeKeyframes, TickledController, tickledItemStyles, tickledStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { createDragGhost } from '../util/drag-ghost.js';\nimport '../menu/index.js';\n\n// Events\nexport type DataGridSortDetail = { readonly sort: DataGridSortState; readonly previous: DataGridSortState };\nexport type DataGridSortEvent = CustomEvent<DataGridSortDetail>;\nexport type DataGridSelectDetail = { readonly selectedKeys: ReadonlySet<string>; readonly previous: ReadonlySet<string> };\nexport type DataGridSelectEvent = CustomEvent<DataGridSelectDetail>;\nexport type DataGridColumnReorderDetail = { readonly from: number; readonly to: number; readonly columns: readonly DataGridColumn[] };\nexport type DataGridColumnReorderEvent = CustomEvent<DataGridColumnReorderDetail>;\nexport type DataGridColumnResizeDetail = { readonly key: string; readonly width: number };\nexport type DataGridColumnResizeEvent = CustomEvent<DataGridColumnResizeDetail>;\nexport type DataGridColumnVisibilityDetail = { readonly key: string; readonly visible: boolean };\nexport type DataGridColumnVisibilityEvent = CustomEvent<DataGridColumnVisibilityDetail>;\nexport type DataGridCellClickDetail = { readonly rowKey: string; readonly colKey: string; readonly rowIndex: number; readonly colIndex: number };\nexport type DataGridCellClickEvent = CustomEvent<DataGridCellClickDetail>;\nexport type DataGridCellEditDetail = { readonly rowKey: string; readonly colKey: string; readonly oldValue: unknown; readonly newValue: unknown };\nexport type DataGridCellEditEvent = CustomEvent<DataGridCellEditDetail>;\n\nexport type DataGridGroupChangeDetail = { readonly groupBy: DataGridGroupBy<unknown> | null };\nexport type DataGridGroupChangeEvent = CustomEvent<DataGridGroupChangeDetail>;\nexport interface DataGridElementEventMap {\n 'datagrid-sort': DataGridSortEvent;\n 'datagrid-select': DataGridSelectEvent;\n 'datagrid-column-reorder': DataGridColumnReorderEvent;\n 'datagrid-column-resize': DataGridColumnResizeEvent;\n 'datagrid-column-visibility': DataGridColumnVisibilityEvent;\n 'datagrid-cell-click': DataGridCellClickEvent;\n 'datagrid-cell-edit': DataGridCellEditEvent;\n 'datagrid-group-change': DataGridGroupChangeEvent;\n}\n\n@customElement(`ixfx-data-grid`)\nexport class DataGridElement extends LitElement {\n static override styles = [themeFallbacks, tickledStyles, tickledItemStyles, listItemFadeKeyframes, css`\n :host {\n --data-grid-row-height: 28px;\n --data-grid-header-height: 32px;\n --data-grid-bg: var(--surface-3);\n --data-grid-header-bg: var(--surface-2);\n --data-grid-border: var(--border);\n --data-grid-header-text: var(--surface-3-text);\n display: block;\n overflow: hidden;\n border: var(--data-grid-border);\n border-radius: var(--radius-m);\n background: var(--data-grid-bg);\n color: var(--surface-3-text);\n font-family: var(--font-family);\n font-size: var(--text-m);\n }\n :host(:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; }\n .grid { display: flex; flex-direction: column; height: 100%; min-height: 200px; position: relative; }\n .header-bar {\n display: flex; align-items: stretch; height: var(--data-grid-header-height);\n background: var(--data-grid-header-bg); border-bottom: var(--data-grid-border);\n overflow: visible; flex-shrink: 0; position: relative;\n }\n .header-scroll {\n display: flex; flex: 1; overflow: hidden;\n }\n .header-cell {\n display: flex; align-items: center; gap: var(--space-xs);\n padding: 0 var(--space-s); border-right: var(--border-subtle);\n flex-shrink: 0; user-select: none; cursor: pointer; position: relative;\n background: var(--data-grid-header-bg);\n box-sizing: border-box;\n }\n .header-cell[data-tickled] { background: var(--surface-5); }\n .header-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .sort-icon { font-size: 10px; opacity: 0.7; }\n .resize-handle { position: absolute; right: 0; top: 0; bottom: 0; width: 8px; cursor: col-resize; z-index: 1; }\n .reorder-handle { cursor: grab; opacity: 0.5; padding: 0 2px; }\n .flyout-trigger { flex-shrink: 0; width: 36px; display: flex; align-items: center; justify-content: center; cursor: pointer; border-left: var(--border-subtle); background: var(--data-grid-header-bg); }\n .viewport { flex: 1; overflow: auto; position: relative; }\n .spacer { position: relative; }\n .row.item {\n position: absolute; left: 0; right: 0; display: flex; align-items: stretch;\n gap: 0;\n height: var(--data-grid-row-height);\n border: none;\n box-shadow: inset 0 0 0 1px var(--item-border-color, transparent);\n background: var(--item-bg);\n border-radius: var(--item-border-radius);\n padding: 0;\n box-sizing: border-box;\n }\n .row.item.tickled { background: var(--item-bg-tickled); border: var(--item-border-tickled); color: var(--item-text-tickled); }\n .row.item.selected { background: var(--item-bg-selected); border: var(--item-border-selected); color: var(--item-text-selected); }\n .row.item.selected.tickled { background: var(--item-bg-selected-tickled); }\n\n /* Insertion / removal animation. Only while [reflowing] — the ~0.3s after\n the row set changes — do rows slide (their top transitions) to make or\n close a gap; a freshly inserted row also fades in. Kept scoped so it\n never fires while scrolling the virtualised list. */\n :host([reflowing]) .row.item,\n :host([reflowing]) .group-row {\n transition: top var(--data-grid-row-move-duration, 200ms) cubic-bezier(0.2, 0, 0, 1);\n }\n .row.item.entering {\n animation: ixfx-list-item-in var(--data-grid-row-move-duration, 200ms) ease both;\n }\n @media (prefers-reduced-motion: reduce) {\n :host([reflowing]) .row.item, :host([reflowing]) .group-row { transition: none; }\n .row.item.entering { animation: none; }\n }\n .cell {\n flex-shrink: 0; display: flex; align-items: center; padding: 0 var(--space-s);\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap; border-right: var(--border-subtle);\n box-sizing: border-box;\n font-variant-numeric: tabular-nums;\n }\n .cell.editable-text { cursor: text; }\n .cell input, .cell select { width: 100%; font: inherit; }\n .checkbox-col { width: 28px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n ixfx-menu-trigger { flex-shrink: 0; border-left: var(--border-subtle); background: var(--data-grid-header-bg); display: flex; align-items: center; --ixfx-button-padding: var(--space-s) var(--space-m); min-width: 44px; min-height: var(--data-grid-header-height); justify-content: center; }\n .header-cell[drag-source] { opacity: 0.4; }\n .drop-caret {\n position: absolute; top: 0; bottom: 0; width: 2px;\n background: var(--accent); border-radius: 1px; pointer-events: none; z-index: 2;\n }\n .group-row {\n position: absolute; left: 0; right: 0; display: flex; align-items: center; gap: var(--space-s);\n height: var(--data-grid-row-height); background: transparent; color: var(--surface-3-text);\n border-bottom: 1px solid var(--border); font-weight: 600; padding: 0 var(--space-s);\n cursor: pointer; user-select: none;\n }\n .group-row .caret { transition: transform 0.15s; display: inline-flex; }\n .group-row.collapsed .caret { transform: rotate(-90deg); }\n .group-row .divider { flex: 1; height: 1px; background: var(--border); margin-left: var(--space-s); }\n .group-row .count { opacity: 0.6; font-weight: 400; font-size: 0.9em; }\n\n `];\n\n @property({ type: Array }) columns: DataGridColumn[] = [];\n @property({ type: Array }) rows: unknown[] = [];\n @property({ type: String, attribute: `selection-mode` }) selectionMode: DataGridSelectionMode = `single`;\n @property({ type: String, attribute: `interaction-mode` }) interactionMode: DataGridInteractionMode = `standard`;\n @property({ attribute: false }) sortState: DataGridSortState = null;\n @property({ type: Number, attribute: `row-height` }) rowHeight = 28;\n @property({ attribute: false }) getRowKey: DataGridGetRowKey<unknown> = (r: unknown, i: number) => (r as Record<string, unknown>).key as string ?? (r as Record<string, unknown>).id as string ?? String(i);\n @property({ attribute: false }) checkboxRenderer?: (checked: boolean) => unknown;\n @property({ attribute: false }) editable: boolean | ((row: unknown, col: DataGridColumn) => boolean) = false;\n @property({ type: String, reflect: true }) editability: DataGridEditability = `user`;\n\n @property({ attribute: false }) groupBy: DataGridGroupBy<unknown> | null = null;\n @property({ type: Boolean, attribute: `allow-grouping` }) allowGrouping = false;\n @property({ attribute: false }) groupLabel: DataGridGroupLabel | undefined;\n /** Columns keys that can be grouped by; undefined = all groupable columns */\n @property({ attribute: false }) groupableColumns: string[] | undefined;\n @property({ type: Boolean, attribute: `cross-group-selection`, reflect: true }) crossGroupSelection = false;\n /**\n * `auto` (default): render the built-in header column/group menu.\n * `none`: don't render it — for hosts that supply their own column UI via\n * `column.visible` + `datagrid-column-visibility`.\n */\n @property({ type: String, attribute: `column-menu` }) columnMenu: DataGridColumnMenu = `auto`;\n @property({ attribute: false }) globalFormatter?: GlobalFormatter;\n private _columnFormatters = new Map<string, (value: unknown) => unknown>();\n\n @state() private _selectedKeys = new Set<string>();\n @state() private _scrollTop = 0;\n @state() private _scrollLeft = 0;\n @state() private _viewportH = 300;\n @state() private _viewportW = 600;\n @state() private _collapsedGroups = new Set<string>();\n @state() private _editing: { rowKey: string; colKey: string } | null = null;\n @state() private _editingRow: string | null = null;\n @state() private _lastClick: { key: string; col: string; time: number } | null = null;\n @state() private _lastClickedCell: { rowKey: string; colKey: string } | null = null;\n @state() private _editValue: unknown = ``;\n\n @query(`.viewport`) private _viewportEl!: HTMLElement;\n @query(`.header-scroll`) private _headerScrollEl!: HTMLElement;\n\n private _tickled = new TickledController<string>(this, {\n getItems: () => this._flatKeys.map(k => ({ id: k, enabled: true })),\n onStateChange: () => this.requestUpdate(),\n });\n\n private _sortedRows: unknown[] = [];\n private _flat: Array<{ type: `group`; key: string; label: string; count: number } | { type: `row`; key: string; row: unknown; idx: number }> = [];\n private _flatKeys: string[] = [];\n /** Row-key snapshot from the previous update, for the insertion / removal animation. */\n #prevFlatKeys: string[] = [];\n #enteringRowKeys = new Set<string>();\n #rowReflowTimer = 0;\n #dataGridRenderedOnce = false;\n private _visibleColumns: DataGridColumn[] = [];\n private _colOffsets: number[] = [];\n private _colWidthSum = 0;\n private _raf = 0;\n #appendInProgress = false;\n #resortRaf = 0;\n private _drag: { pointerId: number; from: number; startX: number; startY: number; active: boolean; ghost: DragGhost | null; gap: number | undefined; sourceCol: DataGridColumn } | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`tabindex`))\n this.tabIndex = 0;\n this.addEventListener(`keydown`, this._onKeyDown as EventListener);\n this.addEventListener(`focusout`, this._onFocusOut as EventListener);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`keydown`, this._onKeyDown as EventListener);\n this.removeEventListener(`focusout`, this._onFocusOut as EventListener);\n cancelAnimationFrame(this._raf);\n if (this.#rowReflowTimer) {\n clearTimeout(this.#rowReflowTimer);\n this.#rowReflowTimer = 0;\n }\n }\n\n private _onFocusOut = (e: FocusEvent): void => {\n if (this._suppressBlurCommit)\n return;\n if (this.editability === `immediate`)\n return;\n if (!this._editing && !this._editingRow)\n return;\n const next = e.relatedTarget as Node | null;\n if (next && this.contains(next))\n return;\n // focus moved outside component → revert editors\n this._editing = null;\n this._editingRow = null;\n this.requestUpdate();\n };\n\n protected override firstUpdated(): void {\n const ro = new ResizeObserver(() => {\n if (!this._viewportEl)\n return;\n this._viewportH = this._viewportEl.clientHeight;\n this._viewportW = this._viewportEl.clientWidth;\n this.requestUpdate();\n });\n ro.observe(this._viewportEl);\n this._viewportH = this._viewportEl.clientHeight;\n this._viewportW = this._viewportEl.clientWidth;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has(`_editing`) || changed.has(`_editingRow`)) {\n requestAnimationFrame(() => {\n let sel: string | null = null;\n if (this._editing)\n sel = `.row[data-key=\"${this._editing.rowKey}\"] .cell[data-col=\"${this._editing.colKey}\"] input, .row[data-key=\"${this._editing.rowKey}\"] .cell[data-col=\"${this._editing.colKey}\"] select`;\n else if (this._editingRow)\n sel = `.row[data-key=\"${this._editingRow}\"] .cell input, .row[data-key=\"${this._editingRow}\"] .cell select`;\n if (!sel)\n return;\n const el = this.renderRoot.querySelector(sel) as HTMLElement | null;\n el?.focus();\n if (el instanceof HTMLInputElement && el.type === `text`)\n el.select();\n });\n }\n }\n\n protected override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n this.setAttribute(`data-input-mode`, this._tickled.inputMode);\n // `appendRows()` maintains the derived arrays itself and coalesces any\n // re-sort — skip the full rebuild that a plain `rows` reassignment triggers.\n if (!this.#appendInProgress) {\n if (changed.has(`rows`) || changed.has(`sortState`) || changed.has(`columns`) || changed.has(`groupBy`) || changed.has(`groupLabel`)) {\n this._sortedRows = this._applySort([...this.rows]);\n }\n this._rebuildFlat();\n }\n this._visibleColumns = this.columns.filter(c => c.visible !== false);\n let off = 0;\n this._colOffsets = this._visibleColumns.map((c) => {\n const o = off;\n off += c.width ?? 150;\n return o;\n });\n this._colWidthSum = off;\n if (this.interactionMode === `checked`)\n this._colWidthSum += 28;\n this.#noteFlatMutation();\n }\n\n /**\n * Diff the row-key list against the previous update. Rows that appeared get an\n * enter fade; any add/remove opens a short `[reflowing]` window so the rows\n * that shift slide (their `top` transitions) instead of snapping. Bounded in\n * time so it never bleeds into scroll virtualisation.\n */\n #noteFlatMutation(): void {\n const now = this._flatKeys;\n const prev = this.#prevFlatKeys;\n this.#prevFlatKeys = now.slice();\n if (!this.#dataGridRenderedOnce) {\n this.#dataGridRenderedOnce = true;\n return;\n }\n if (prev.length === 0 || now.length === 0) {\n this.#enteringRowKeys.clear();\n return;\n }\n const before = new Set(prev);\n const after = new Set(now);\n const added = now.filter(k => !before.has(k));\n const removed = prev.filter(k => !after.has(k));\n if (added.length === now.length || (added.length === 0 && removed.length === 0))\n return;\n this.#enteringRowKeys = new Set(added);\n this.toggleAttribute(`reflowing`, true);\n if (this.#rowReflowTimer)\n clearTimeout(this.#rowReflowTimer);\n this.#rowReflowTimer = window.setTimeout(() => {\n this.#rowReflowTimer = 0;\n this.#enteringRowKeys.clear();\n this.toggleAttribute(`reflowing`, false);\n this.requestUpdate();\n }, 320);\n }\n\n private _getGroupKey(row: unknown): string | null {\n if (!this.groupBy)\n return null;\n if (typeof this.groupBy === `string`)\n return String((row as Record<string, unknown>)[this.groupBy] ?? ``);\n return String((this.groupBy as (r: unknown) => string)(row));\n }\n\n private _rebuildFlat(): void {\n if (!this.groupBy) {\n this._flat = this._sortedRows.map((r, i) => ({ type: `row` as const, key: this.getRowKey(r, i), row: r, idx: i }));\n this._flatKeys = this._flat.map(f => f.key);\n return;\n }\n const groups = new Map<string, unknown[]>();\n for (const r of this._sortedRows) {\n const k = this._getGroupKey(r) ?? ``;\n const arr = groups.get(k);\n if (arr)\n arr.push(r); else groups.set(k, [r]);\n }\n const flat: typeof this._flat = [];\n const keys: string[] = [];\n for (const [gKey, rows] of groups) {\n const label = this.groupLabel ? this.groupLabel(gKey, rows) : gKey;\n const gId = `__group__${gKey}`;\n flat.push({ type: `group`, key: gId, label, count: rows.length });\n keys.push(gId);\n if (this._collapsedGroups.has(gKey))\n continue;\n for (const r of rows) {\n const idx = this._sortedRows.indexOf(r);\n const rk = this.getRowKey(r, idx);\n flat.push({ type: `row`, key: rk, row: r, idx });\n keys.push(rk);\n }\n }\n this._flat = flat;\n this._flatKeys = keys;\n }\n\n private _toggleGroup(gKey: string): void {\n const next = new Set(this._collapsedGroups);\n if (next.has(gKey))\n next.delete(gKey); else next.add(gKey);\n this._collapsedGroups = next;\n }\n\n private _applySort(rows: unknown[]): unknown[] {\n if (!this.sortState)\n return rows;\n const col = this.columns.find(c => c.key === this.sortState!.key);\n if (!col)\n return rows;\n const dir = this.sortState.direction === `asc` ? 1 : -1;\n if (col.sortFn)\n return rows.sort((a, b) => dir * col.sortFn!(a as never, b as never));\n return rows.sort((a, b) => {\n const av = (a as Record<string, unknown>)[col.key];\n const bv = (b as Record<string, unknown>)[col.key];\n if (av === bv)\n return 0;\n if (typeof av === `number` && typeof bv === `number`)\n return dir * (av - bv);\n return dir * String(av).localeCompare(String(bv));\n });\n }\n\n private _onScroll = (e: Event): void => {\n const el = e.target as HTMLElement;\n cancelAnimationFrame(this._raf);\n this._raf = requestAnimationFrame(() => {\n this._scrollTop = el.scrollTop;\n this._scrollLeft = el.scrollLeft;\n if (this._headerScrollEl)\n this._headerScrollEl.scrollLeft = el.scrollLeft;\n this.requestUpdate();\n });\n };\n\n private _onHeaderClick(col: DataGridColumn): void {\n if (col.sortable === false)\n return;\n const prev = this.sortState;\n let next: DataGridSortState = null;\n if (!prev || prev.key !== col.key)\n next = { key: col.key, direction: `asc` };\n else if (prev.direction === `asc`)\n next = { key: col.key, direction: `desc` };\n else next = null;\n this.sortState = next;\n this.dispatchEvent(new CustomEvent<DataGridSortDetail>(`datagrid-sort`, { detail: { sort: next, previous: prev }, bubbles: true, composed: true }));\n }\n\n private _onRowClick(rowKey: string, col: DataGridColumn | null, e: MouseEvent): void {\n if (col && col.selectable === false)\n return;\n if (this.selectionMode === `none` && this.interactionMode !== `checked` && this.interactionMode !== `sticky`)\n return;\n if (this.interactionMode === `manual`)\n return;\n if (this.interactionMode === `implicit`) {\n this._replaceSelection(rowKey); return;\n }\n if (this.interactionMode === `checked`)\n return;\n if (this.interactionMode === `sticky`) {\n this._toggleSelection(rowKey); return;\n }\n // standard / vscode\n if (e.ctrlKey || e.metaKey) {\n if (this.selectionMode === `multiple` || this.interactionMode === `vscode`)\n this._toggleSelection(rowKey);\n } else if (e.shiftKey && (this.selectionMode === `multiple` || this.interactionMode === `vscode`)) {\n this._rangeSelectTo(rowKey);\n } else {\n this._replaceSelection(rowKey);\n }\n }\n\n private _onCheckboxClick(rowKey: string, e: MouseEvent): void {\n e.stopPropagation();\n this._onRowClick(rowKey, null, e);\n }\n\n private _onVisibilityToggle(col: DataGridColumn, checked: boolean): void {\n col.visible = checked;\n this.columns = [...this.columns];\n this.dispatchEvent(new CustomEvent<DataGridColumnVisibilityDetail>(`datagrid-column-visibility`, { detail: { key: col.key, visible: checked }, bubbles: true, composed: true }));\n }\n\n private _beginHeaderDrag(e: PointerEvent, col: DataGridColumn, idx: number): void {\n e.stopPropagation();\n const anchor = (e.currentTarget as HTMLElement).closest(`.header-cell`) as HTMLElement ?? e.currentTarget as HTMLElement;\n this._drag = { pointerId: e.pointerId, from: idx, startX: e.clientX, startY: e.clientY, active: false, ghost: null, gap: undefined, sourceCol: col };\n const onMove = (ev: PointerEvent): void => {\n if (!this._drag || ev.pointerId !== this._drag.pointerId)\n return;\n const dx = ev.clientX - this._drag.startX;\n const dy = ev.clientY - this._drag.startY;\n if (!this._drag.active) {\n if (Math.hypot(dx, dy) < 5)\n return;\n this._drag.active = true;\n const content = document.createElement(`span`);\n content.textContent = col.label;\n try {\n this._drag.ghost = createDragGhost({ anchor, content });\n this._drag.ghost.move(ev.clientX, ev.clientY);\n } catch { /* ignore */ }\n try {\n this._headerScrollEl?.setPointerCapture(ev.pointerId);\n } catch { /* ignore */ }\n }\n this._drag.ghost?.move(ev.clientX, ev.clientY);\n const x = ev.clientX - (this._headerScrollEl?.getBoundingClientRect().left ?? 0) + (this._headerScrollEl?.scrollLeft ?? 0);\n let gap = this._drag.from;\n let bestDist = Infinity;\n for (let i = 0; i < this._visibleColumns.length; i++) {\n if (i === this._drag.from)\n continue;\n const rectLeft = this._colOffsets[i];\n const rectRight = rectLeft + (this._visibleColumns[i].width ?? 150);\n const mid = (rectLeft + rectRight) / 2;\n // gap before i\n const gapPos = x < mid ? rectLeft : rectRight;\n const gapIdx = x < mid ? i : i + 1;\n const d = Math.abs(x - gapPos);\n if (d < bestDist) {\n bestDist = d; gap = gapIdx > this._drag.from ? gapIdx - 1 : gapIdx;\n }\n }\n // handle gap after last\n if (this._visibleColumns.length > 0) {\n const lastOff = this._colOffsets[this._colOffsets.length - 1] + (this._visibleColumns[this._visibleColumns.length - 1].width ?? 150);\n const d = Math.abs(x - lastOff);\n if (d < bestDist) {\n bestDist = d; gap = this._visibleColumns.length - 1; if (this._drag.from === this._visibleColumns.length - 1)\n gap = this._drag.from; else if (gap >= this._drag.from)\n gap = this._visibleColumns.length - 1;\n }\n }\n // normalized gap for reorder (visible index without source)\n const siblings = this._visibleColumns.length - 1;\n let normalizedGap = gap;\n if (normalizedGap < 0)\n normalizedGap = 0;\n if (normalizedGap > siblings)\n normalizedGap = siblings;\n this._drag.gap = normalizedGap;\n this.requestUpdate();\n };\n const onUp = (ev: PointerEvent): void => {\n if (!this._drag || ev.pointerId !== this._drag.pointerId)\n return;\n const active = this._drag.active;\n const from = this._drag.from;\n const gap = this._drag.gap;\n this._drag.ghost?.destroy();\n try {\n this._headerScrollEl?.releasePointerCapture(ev.pointerId);\n } catch { /* ignore */ }\n window.removeEventListener(`pointermove`, onMove);\n window.removeEventListener(`pointerup`, onUp);\n window.removeEventListener(`pointercancel`, onUp);\n this._drag = null;\n this.requestUpdate();\n if (active && gap !== undefined && gap !== from) {\n // convert visible gap to actual reorder (filter hidden)\n this._onReorderDrag(from, gap);\n }\n };\n window.addEventListener(`pointermove`, onMove);\n window.addEventListener(`pointerup`, onUp);\n window.addEventListener(`pointercancel`, onUp as EventListener);\n }\n\n private _onReorderDrag(fromIdx: number, toIdx: number): void {\n if (fromIdx === toIdx)\n return;\n const cols = [...this.columns];\n const vis = cols.filter(c => c.visible !== false);\n const hidden = cols.filter(c => c.visible === false);\n const [moved] = vis.splice(fromIdx, 1);\n vis.splice(toIdx, 0, moved);\n this.columns = [...vis, ...hidden];\n this.dispatchEvent(new CustomEvent<DataGridColumnReorderDetail>(`datagrid-column-reorder`, { detail: { from: fromIdx, to: toIdx, columns: [...this.columns] }, bubbles: true, composed: true }));\n }\n\n private _anchorKey: string | undefined;\n\n private _scrollRowIntoView(key: string): void {\n const idx = this._flat.findIndex(f => f.key === key);\n if (idx < 0 || !this._viewportEl)\n return;\n const top = idx * this.rowHeight;\n const bottom = top + this.rowHeight;\n const vt = this._viewportEl.scrollTop;\n const vb = vt + this._viewportEl.clientHeight;\n if (top < vt)\n this._viewportEl.scrollTop = top;\n else if (bottom > vb)\n this._viewportEl.scrollTop = bottom - this._viewportEl.clientHeight;\n }\n\n private _getRowForKey(key: string): unknown | undefined {\n const entry = this._flat.find(f => f.key === key) as { row?: unknown } | undefined;\n return (entry as { row?: unknown })?.row;\n }\n\n // --- Public keyed API ---\n\n /** The selected row keys (read-only). */\n get selectedKeys(): ReadonlySet<string> {\n return this._selectedKeys;\n }\n\n /** Replace the selection with these row keys (clamped to known rows). */\n set selectedKeys(keys: Iterable<string>) {\n this.selectKeys(keys);\n }\n\n /**\n * Replace the selection with the given row keys. Unknown keys are dropped;\n * in a single-select mode only the last surviving key is kept;\n * `selectionMode=\"none\"` clears. Fires `datagrid-select` with the previous\n * set when the selection actually changes.\n */\n selectKeys(keys: Iterable<string>): void {\n const known = new Set(this._flat.filter(f => f.type === `row`).map(f => f.key));\n let next = new Set([...keys].filter(k => known.has(k)));\n const multi = this.selectionMode === `multiple`\n || this.interactionMode === `checked`\n || this.interactionMode === `sticky`\n || this.interactionMode === `vscode`;\n if (this.selectionMode === `none`) {\n next = new Set();\n } else if (!multi && next.size > 1) {\n const last = [...next].at(-1);\n next = last === undefined ? new Set() : new Set([last]);\n }\n const prev = new Set(this._selectedKeys);\n if (prev.size === next.size && [...next].every(k => prev.has(k)))\n return;\n this._selectedKeys = next;\n this._anchorKey = [...next].at(-1);\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, {\n detail: { selectedKeys: new Set(next), previous: prev },\n bubbles: true,\n composed: true,\n }));\n }\n\n /** The row key under the cursor, or `undefined`. */\n get tickledKey(): string | undefined {\n return this._tickled.tickledId;\n }\n\n /** Move the cursor to this row key and scroll it into view. */\n tickleRow(key: string): void {\n if (!this._flatKeys.includes(key))\n return;\n this._tickled.focus(key);\n this._scrollRowIntoView(key);\n }\n\n /**\n * Append rows without the full O(n log n) rebuild that reassigning `rows`\n * incurs. `rows` still gets a new array reference (reactivity is preserved),\n * but the derived arrays are extended over the appended slice only. When a\n * sort is active the new rows show unsorted for one frame, then a single\n * coalesced re-sort runs. Scroll position, selection and cursor are kept.\n */\n appendRows(rows: readonly unknown[]): void {\n if (rows.length === 0)\n return;\n const startIdx = this.rows.length;\n this.#appendInProgress = true;\n this.rows = [...this.rows, ...rows];\n const appended = this.rows.slice(startIdx);\n\n if (this._sortedRows.length === startIdx) {\n this._sortedRows = [...this._sortedRows, ...appended];\n } else {\n // derived arrays out of sync — fall back to a full rebuild\n this._sortedRows = this._applySort([...this.rows]);\n this._rebuildFlat();\n this.#appendInProgress = false;\n this.requestUpdate();\n return;\n }\n this.#appendToFlat(appended, startIdx);\n this.#appendInProgress = false;\n this.requestUpdate();\n\n if (this.sortState != null) {\n cancelAnimationFrame(this.#resortRaf);\n this.#resortRaf = requestAnimationFrame(() => {\n this._sortedRows = this._applySort([...this.rows]);\n this._rebuildFlat();\n this.requestUpdate();\n });\n }\n }\n\n #appendToFlat(appended: readonly unknown[], startIdx: number): void {\n if (this.groupBy) {\n // grouped flat layout can't be extended in place — rebuild it\n this._rebuildFlat();\n return;\n }\n for (let j = 0; j < appended.length; j++) {\n const idx = startIdx + j;\n const key = this.getRowKey(appended[j], idx);\n this._flat.push({ type: `row`, key, row: appended[j], idx });\n this._flatKeys.push(key);\n }\n }\n\n private _replaceSelection(key: string): void {\n if (this.selectionMode === `none`)\n return;\n const prev = new Set(this._selectedKeys);\n if (this.groupBy && !this.crossGroupSelection) {\n const g = this._getGroupKey(this._getRowForKey(key) ?? { key });\n const keep = [...prev].filter(k => this._getGroupKey(this._getRowForKey(k) ?? { key: k }) === g);\n // cross-group off → keep only same-group, then replace\n this._selectedKeys = new Set([key]);\n void keep;\n } else {\n this._selectedKeys = new Set([key]);\n }\n this._anchorKey = key;\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n\n private _toggleSelection(key: string): void {\n const prev = new Set(this._selectedKeys);\n const next = new Set(this._selectedKeys);\n if (next.has(key)) {\n next.delete(key);\n } else {\n if (this.groupBy && !this.crossGroupSelection) {\n const g = this._getGroupKey(this._getRowForKey(key) ?? { key });\n for (const k of [...next]) {\n if (this._getGroupKey(this._getRowForKey(k) ?? { key: k }) !== g)\n next.delete(k);\n }\n }\n if (this.selectionMode !== `multiple` && this.interactionMode !== `checked` && this.interactionMode !== `sticky`)\n next.clear();\n next.add(key);\n }\n this._selectedKeys = next;\n this._anchorKey = key;\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n\n private _rangeSelectTo(key: string): void {\n if (!this._anchorKey) {\n this._replaceSelection(key); return;\n }\n const keys = this._flat.filter(f => f.type === `row`).map(f => f.key);\n const a = keys.indexOf(this._anchorKey);\n const b = keys.indexOf(key);\n if (a < 0 || b < 0) {\n this._replaceSelection(key); return;\n }\n if (this.groupBy && !this.crossGroupSelection) {\n const anchorGroup = this._getGroupKey(this._getRowForKey(this._anchorKey) ?? { key: this._anchorKey });\n const targetGroup = this._getGroupKey(this._getRowForKey(key) ?? { key });\n if (anchorGroup !== targetGroup) {\n this._replaceSelection(key); return;\n }\n // restrict range to rows of that group\n const groupKeys = keys.filter(k => this._getGroupKey(this._getRowForKey(k) ?? { key: k }) === anchorGroup);\n const ga = groupKeys.indexOf(this._anchorKey);\n const gb = groupKeys.indexOf(key);\n if (ga < 0 || gb < 0) {\n this._replaceSelection(key); return;\n }\n const lo = Math.min(ga, gb); const hi = Math.max(ga, gb);\n const prev = new Set(this._selectedKeys);\n this._selectedKeys = new Set(groupKeys.slice(lo, hi + 1));\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n return;\n }\n const lo = Math.min(a, b); const hi = Math.max(a, b);\n const prev = new Set(this._selectedKeys);\n this._selectedKeys = new Set(keys.slice(lo, hi + 1));\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === `a`) {\n if (this.selectionMode === `multiple` || this.interactionMode === `checked` || this.interactionMode === `sticky` || this.interactionMode === `vscode` || this.interactionMode === `standard`) {\n e.preventDefault();\n const prev = new Set(this._selectedKeys);\n if (this.groupBy && !this.crossGroupSelection && this._anchorKey) {\n const g = this._getGroupKey(this._getRowForKey(this._anchorKey) ?? { key: this._anchorKey });\n this._selectedKeys = new Set(this._flat.filter(f => f.type === `row` && this._getGroupKey((f as { row: unknown }).row) === g).map(f => f.key));\n } else {\n this._selectedKeys = new Set(this._flat.filter(f => f.type === `row`).map(f => f.key));\n }\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n return;\n }\n // If editing, Up/Down commits and moves to same column in adjacent row\n if (this._editing && (e.key === `ArrowDown` || e.key === `ArrowUp`)) {\n const active = this.shadowRoot?.activeElement as HTMLElement | null;\n if (active?.tagName === `SELECT`)\n return; // let native select handle\n e.preventDefault();\n const cur = this._editing;\n const dir = e.key === `ArrowDown` ? 1 : -1;\n const colKey = cur.colKey;\n this._suppressBlurCommit = true;\n this._commitEdit();\n const rowKeys = this._flat.filter(f => f.type === `row`).map(f => f.key);\n const idx = rowKeys.indexOf(cur.rowKey);\n let nextIdx = idx + dir;\n while (nextIdx >= 0 && nextIdx < rowKeys.length) {\n const nk = rowKeys[nextIdx];\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === nk);\n const col = this._visibleColumns.find(c => c.key === colKey);\n if (row && col && this._isEditable(row, col)) {\n this._startEdit(nk, colKey);\n this._tickled.handleKeyboardNavigation(nextIdx > idx ? `next` : `previous`);\n this._scrollRowIntoView(nk);\n break;\n }\n nextIdx += dir;\n }\n if (nextIdx < 0 || nextIdx >= rowKeys.length) {\n // no editable target, stay on current row tickled\n this._tickled.handleKeyboardNavigation(dir > 0 ? `next` : `previous`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n }\n requestAnimationFrame(() => {\n this._suppressBlurCommit = false;\n });\n return;\n }\n if (e.key === `ArrowDown` || e.key === `ArrowUp` || e.key === `Home` || e.key === `End`) {\n e.preventDefault();\n this._tickled.setInputMode(`keyboard`);\n }\n switch (e.key) {\n case `ArrowDown`: {\n this._tickled.handleKeyboardNavigation(`next`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n if (this.interactionMode === `implicit` && this._tickled.tickledId)\n this._replaceSelection(this._tickled.tickledId);\n if (e.shiftKey && (this.interactionMode === `standard` || this.interactionMode === `vscode`) && this._tickled.tickledId)\n this._rangeSelectTo(this._tickled.tickledId);\n break;\n }\n case `ArrowUp`: {\n this._tickled.handleKeyboardNavigation(`previous`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n if (this.interactionMode === `implicit` && this._tickled.tickledId)\n this._replaceSelection(this._tickled.tickledId);\n if (e.shiftKey && (this.interactionMode === `standard` || this.interactionMode === `vscode`) && this._tickled.tickledId)\n this._rangeSelectTo(this._tickled.tickledId);\n break;\n }\n case `Home`: {\n this._tickled.handleKeyboardNavigation(`first`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n break;\n }\n case `End`: {\n this._tickled.handleKeyboardNavigation(`last`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n break;\n }\n case `Enter`: {\n const key = this._tickled.tickledId;\n if (!key)\n break;\n e.preventDefault();\n if (!this._editing && this.editability === `user`) {\n const idx = this._sortedRows.findIndex((r, i) => this.getRowKey(r, i) === key);\n if (idx >= 0) {\n const row = this._sortedRows[idx];\n // prefer lastClickedCell if it is in this row and editable\n if (this._lastClickedCell?.rowKey === key) {\n const col = this._visibleColumns.find(c => c.key === this._lastClickedCell!.colKey);\n if (col && this._isEditable(row, col)) {\n this._startEdit(key, col.key); break;\n }\n }\n const firstEditable = this._visibleColumns.find(c => this._isEditable(row, c));\n if (firstEditable) {\n this._startEdit(key, firstEditable.key); break;\n }\n }\n }\n if (!this._editing) {\n const idx = this._sortedRows.findIndex((r, i) => this.getRowKey(r, i) === key);\n if (this.interactionMode !== `manual` && this.interactionMode !== `checked`)\n this._replaceSelection(key);\n this.dispatchEvent(new CustomEvent<DataGridCellClickDetail>(`datagrid-cell-click`, { detail: { rowKey: key, colKey: ``, rowIndex: idx, colIndex: -1 }, bubbles: true, composed: true }));\n }\n break;\n }\n case ` `: {\n if (this._editing) {\n const col = this.columns.find(c => c.key === this._editing!.colKey);\n if (col?.editor === `boolean`) {\n e.preventDefault();\n const isImmediate = this.editability === `immediate`;\n const rowKey = this._editing.rowKey;\n const colKey = this._editing.colKey;\n // Toggle: use checkbox checked if focused, else flip _editValue / row value\n const active = this.shadowRoot?.activeElement as HTMLInputElement | null;\n let next: boolean;\n if (active?.type === `checkbox`) {\n next = !active.checked;\n active.checked = next;\n } else {\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) as Record<string, unknown> | undefined;\n const cur = this._editValue !== `` ? Boolean(this._editValue) : Boolean(row?.[colKey]);\n next = !cur;\n }\n if (isImmediate) {\n this._commitImmediate(rowKey, colKey, next);\n } else {\n this._editValue = next; this._commitEdit();\n }\n }\n break;\n }\n const key = this._tickled.tickledId;\n if (!key)\n break;\n e.preventDefault();\n if (this.interactionMode === `checked` || this.interactionMode === `sticky` || this.interactionMode === `standard` || this.interactionMode === `vscode` || this.interactionMode === `manual`)\n this._toggleSelection(key);\n else this._replaceSelection(key);\n break;\n }\n case `Escape`: {\n if (this._editing || this._editingRow) {\n e.preventDefault(); this._editing = null; this._editingRow = null; this.requestUpdate();\n } else if (this._selectedKeys.size) {\n e.preventDefault(); const prev = new Set(this._selectedKeys); this._selectedKeys = new Set(); this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(), previous: prev }, bubbles: true, composed: true }));\n }\n break;\n }\n }\n };\n\n private _isEditable(row: unknown, col: DataGridColumn): boolean {\n if (this.editability === `disabled`)\n return false;\n if (typeof this.editable === `function`)\n return (this.editable as (r: unknown, c: DataGridColumn) => boolean)(row, col);\n if (this.editable === true)\n return col.editable !== false;\n return !!col.editable;\n }\n\n private _isTextEditor(col: DataGridColumn): boolean {\n const e = col.editor;\n return !e || e === `text` || e === `number`;\n }\n\n private _isCellEditing(rowKey: string, colKey: string): boolean {\n if (this.editability === `immediate` && this._isEditable(this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) ?? {}, this.columns.find(c => c.key === colKey)!))\n return true;\n if (this._editingRow === rowKey)\n return this._isEditable(this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) ?? {}, this.columns.find(c => c.key === colKey)!);\n return this._editing?.rowKey === rowKey && this._editing?.colKey === colKey;\n }\n\n private _startEdit(rowKey: string, colKey: string): void {\n if (this.editability === `disabled`)\n return;\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey);\n if (!row)\n return;\n const col = this.columns.find(c => c.key === colKey);\n if (!col || !this._isEditable(row, col))\n return;\n this._editing = { rowKey, colKey };\n this._editingRow = null;\n this._editValue = (row as Record<string, unknown>)[colKey];\n }\n\n /** Programmatic: put a single cell in edit mode. Works in manual/user/immediate (no-op if disabled or not editable). */\n startEdit(rowKey: string, colKey: string): void {\n this._startEdit(rowKey, colKey);\n }\n\n /** Programmatic: put all editable cells of a row in edit mode. */\n startRowEdit(rowKey: string): void {\n if (this.editability === `disabled`)\n return;\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey);\n if (!row)\n return;\n this._editing = null;\n this._editingRow = rowKey;\n this.requestUpdate();\n }\n\n stopEdit(): void {\n this._editing = null; this._editingRow = null;\n }\n\n setColumnFormatter(columnKey: string, formatter: ((value: unknown) => unknown) | BuiltInFormatterName | null, options?: BuiltInFormatterOptions): void {\n if (!formatter) {\n this._columnFormatters.delete(columnKey); this.requestUpdate(); return;\n }\n if (typeof formatter === `string`) {\n const digits = options?.digits ?? (formatter === `integer` ? 0 : 2);\n if (formatter === `fixed`)\n this._columnFormatters.set(columnKey, v => typeof v === `number` && Number.isFinite(v) ? v.toFixed(digits) : String(v ?? ``));\n else if (formatter === `percentage`)\n this._columnFormatters.set(columnKey, v => typeof v === `number` && Number.isFinite(v) ? `${v.toFixed(digits)}%` : String(v ?? ``));\n else if (formatter === `integer`)\n this._columnFormatters.set(columnKey, v => typeof v === `number` && Number.isFinite(v) ? Math.round(v).toString() : String(v ?? ``));\n } else {\n this._columnFormatters.set(columnKey, formatter as (value: unknown) => unknown);\n }\n this.requestUpdate();\n }\n\n private _formatValue(value: unknown, col: DataGridColumn, row: unknown): unknown {\n const perCol = this._columnFormatters.get(col.key);\n if (perCol)\n return perCol(value);\n if (col.formatter)\n return col.formatter(value, row, col);\n if (this.globalFormatter)\n return this.globalFormatter(value, col.key, row);\n return value;\n }\n\n private _handleCellSecondClick(rowKey: string, col: DataGridColumn): void {\n if (this.editability !== `user`)\n return;\n const now = Date.now();\n if (this._lastClick && this._lastClick.key === rowKey && this._lastClick.col === col.key && now - this._lastClick.time < 700 && now - this._lastClick.time > 150) {\n this._startEdit(rowKey, col.key);\n this._lastClick = null;\n } else {\n this._lastClick = { key: rowKey, col: col.key, time: now };\n }\n }\n\n private _commitEdit(fromImmediate = false): void {\n // immediate/row-edit: commit uses current _editValue or val; keep simple single-cell path\n if (!this._editing && !fromImmediate)\n return;\n const target = this._editing;\n if (!target)\n return;\n const { rowKey, colKey } = target;\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) as Record<string, unknown> | undefined;\n if (!row) {\n this._editing = null; return;\n }\n const oldValue = row[colKey];\n const newValue = this._editValue;\n const col = this.columns.find(c => c.key === colKey);\n if (col?.editor && typeof col.editor === `function`) {\n // custom factory handles commit itself\n } else {\n row[colKey] = newValue as never;\n this.rows = [...this.rows];\n }\n this._editing = null;\n this.dispatchEvent(new CustomEvent<DataGridCellEditDetail>(`datagrid-cell-edit`, { detail: { rowKey, colKey, oldValue, newValue }, bubbles: true, composed: true }));\n }\n\n private _suppressBlurCommit = false;\n private _tabToNext(rowKey: string, curColKey: string, dir: number): void {\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey);\n if (!row)\n return;\n const cols = this._visibleColumns;\n const curIdx = cols.findIndex(c => c.key === curColKey);\n let next = curIdx + dir;\n while (next >= 0 && next < cols.length) {\n if (this._isEditable(row, cols[next])) {\n // commit current before moving (use _editValue if pending)\n if (this._editing)\n this._commitEdit();\n this._suppressBlurCommit = true;\n this._startEdit(rowKey, cols[next].key);\n requestAnimationFrame(() => {\n this._suppressBlurCommit = false;\n });\n return;\n }\n next += dir;\n }\n if (this._editing)\n this._commitEdit();\n this._editing = null;\n this.requestUpdate();\n }\n\n private _commitImmediate(rowKey: string, colKey: string, value: unknown): void {\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) as Record<string, unknown> | undefined;\n if (!row)\n return;\n const oldValue = row[colKey];\n if (oldValue === value)\n return;\n row[colKey] = value as never;\n this.rows = [...this.rows];\n this.dispatchEvent(new CustomEvent<DataGridCellEditDetail>(`datagrid-cell-edit`, { detail: { rowKey, colKey, oldValue, newValue: value }, bubbles: true, composed: true }));\n }\n\n private _autoSizeColumn(col: DataGridColumn): void {\n const cs = getComputedStyle(this);\n const font = `${cs.fontSize} ${cs.fontFamily}`;\n const canvas = document.createElement(`canvas`);\n const ctx = canvas.getContext(`2d`);\n const cellPad = 32; // 2 * var(--space-s) approx + border\n const headerExtra = 40; // sort icon + reorder handle + resize handle\n const measure = (text: string): number => {\n if (!ctx)\n return text.length * 8;\n ctx.font = font;\n return Math.ceil(ctx.measureText(text).width);\n };\n let maxW = measure(col.label) + headerExtra;\n for (const r of this.rows) {\n const v = (r as Record<string, unknown>)[col.key];\n if (v === null || v === undefined || v === ``)\n continue;\n // For custom renderers we can only estimate from raw value\n const text = String(v);\n const w = measure(text) + cellPad;\n if (w > maxW)\n maxW = w;\n }\n // Also consider rendered text for visible cells (more accurate for formatted values)\n // Measure actual cell widths after render if available\n const min = col.minWidth ?? 40;\n const max = col.maxWidth ?? 600;\n const w = Math.max(min, Math.min(max, maxW));\n col.width = w;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent<DataGridColumnResizeDetail>(`datagrid-column-resize`, { detail: { key: col.key, width: w }, bubbles: true, composed: true }));\n }\n\n private _onResizePointerDown(e: PointerEvent, col: DataGridColumn): void {\n e.preventDefault(); e.stopPropagation();\n const startX = e.clientX;\n const startW = col.width ?? 150;\n const onMove = (ev: PointerEvent): void => {\n const w = Math.max(col.minWidth ?? 40, Math.min(col.maxWidth ?? 600, startW + ev.clientX - startX));\n col.width = w;\n this.requestUpdate();\n };\n const onUp = (ev: PointerEvent): void => {\n window.removeEventListener(`pointermove`, onMove);\n window.removeEventListener(`pointerup`, onUp);\n const w = Math.max(col.minWidth ?? 40, Math.min(col.maxWidth ?? 600, startW + ev.clientX - startX));\n this.dispatchEvent(new CustomEvent<DataGridColumnResizeDetail>(`datagrid-column-resize`, { detail: { key: col.key, width: w }, bubbles: true, composed: true }));\n };\n window.addEventListener(`pointermove`, onMove);\n window.addEventListener(`pointerup`, onUp);\n }\n\n // Public API for stress demo\n getVisibleRange(): { startRow: number; endRow: number; startCol: number; endCol: number } {\n const rh = this.rowHeight;\n const startRow = Math.max(0, Math.floor(this._scrollTop / rh) - 2);\n const endRow = Math.min(this._flat.length, Math.ceil((this._scrollTop + this._viewportH) / rh) + 2);\n const startCol = this._findFirstVisibleCol(this._scrollLeft);\n const endCol = this._findLastVisibleCol(this._scrollLeft + this._viewportW);\n return { startRow, endRow, startCol, endCol };\n }\n\n private _findFirstVisibleCol(scrollLeft: number): number {\n let lo = 0; let hi = this._colOffsets.length - 1; let ans = 0;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (this._colOffsets[mid] <= scrollLeft) {\n ans = mid; lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return ans;\n }\n\n private _findLastVisibleCol(right: number): number {\n for (let i = 0; i < this._colOffsets.length; i++) {\n if (this._colOffsets[i] > right)\n return i;\n }\n return this._colOffsets.length;\n }\n\n protected override render() {\n const rh = this.rowHeight;\n const startRow = Math.max(0, Math.floor(this._scrollTop / rh) - 2);\n const endRow = Math.min(this._flat.length, Math.ceil((this._scrollTop + this._viewportH) / rh) + 2);\n const visibleFlat = this._flat.slice(startRow, endRow);\n const showCheckbox = this.interactionMode === `checked`;\n\n return html`\n <div class=\"grid\" style=\"height:400px\">\n <div class=\"header-bar\">\n <div class=\"header-scroll\">\n ${showCheckbox ? html`<div class=\"header-cell checkbox-col\"></div>` : nothing}\n ${repeat(this._visibleColumns, c => c.key, (col, idx) => html`\n <div class=\"header-cell\" style=\"width:${col.width ?? 150}px\" ?drag-source=${this._drag?.active && this._drag.sourceCol.key === col.key}\n @click=${() => this._onHeaderClick(col)}\n @pointerenter=${() => this._tickled.handlePointerEnter(col.key)}>\n ${col.reorderable !== false\n ? html`<span class=\"reorder-handle\" draggable=\"false\"\n @pointerdown=${(e: PointerEvent) => this._beginHeaderDrag(e, col, idx)}\n >⠿</span>`\n : nothing}\n <span class=\"header-label\">${col.label}</span>\n ${this.sortState?.key === col.key ? html`<span class=\"sort-icon\">${this.sortState.direction === `asc` ? `▲` : `▼`}</span>` : nothing}\n ${col.resizable !== false\n ? html`<span class=\"resize-handle\" @pointerdown=${(e: PointerEvent) => this._onResizePointerDown(e, col)} @click=${(e: MouseEvent) => e.stopPropagation()} @dblclick=${(e: MouseEvent) => {\n e.preventDefault(); e.stopPropagation(); this._autoSizeColumn(col);\n }}></span>`\n : nothing}\n </div>\n `)}\n ${this._drag?.active && this._drag.gap !== undefined\n ? html`<div class=\"drop-caret\" style=\"left:${(() => {\n const gap = this._drag!.gap!;\n if (gap < this._colOffsets.length)\n return this._colOffsets[gap];\n const last = this._colOffsets.length - 1;\n return last >= 0 ? this._colOffsets[last] + (this._visibleColumns[last].width ?? 150) : 0;\n })()}px\"></div>`\n : nothing}\n </div>\n ${this.columnMenu === `none`\n ? nothing\n : html`\n <ixfx-menu-trigger label=\"⚙\" placement=\"bottom-end\" @menu-command=${(e: CustomEvent) => {\n const cmd = (e.detail as { command?: string; checked?: boolean; value?: string }).command;\n const checked = (e.detail as { checked?: boolean }).checked;\n const value = (e.detail as { value?: string }).value;\n if (cmd?.startsWith(`col:`)) {\n const key = cmd.slice(4);\n const col = this.columns.find(c => c.key === key);\n if (col)\n this._onVisibilityToggle(col, !!checked);\n e.stopPropagation();\n return;\n }\n if (cmd === `groupBy`) {\n const v = value ?? ``;\n this.groupBy = v || null;\n this._collapsedGroups = new Set();\n this.dispatchEvent(new CustomEvent<DataGridGroupChangeDetail>(`datagrid-group-change`, { detail: { groupBy: this.groupBy as DataGridGroupBy<unknown> | null }, bubbles: true, composed: true }));\n e.stopPropagation();\n }\n }}>\n <ixfx-menu-container slot=\"menu\">\n <ixfx-menu-header label=\"Columns\"></ixfx-menu-header>\n ${repeat(this.columns, c => c.key, col => html`\n <ixfx-menu-check-item command=\"col:${col.key}\" label=${col.label} ?checked=${col.visible !== false}></ixfx-menu-check-item>\n `)}\n ${this.allowGrouping\n ? html`\n <ixfx-menu-separator></ixfx-menu-separator>\n <ixfx-menu-header label=\"Group by\"></ixfx-menu-header>\n <ixfx-menu-radio-group name=\"groupBy\" value=${typeof this.groupBy === `string` ? this.groupBy : ``}>\n <ixfx-menu-radio-item value=\"\" label=\"None\"></ixfx-menu-radio-item>\n ${this.columns.filter(c => c.groupable !== false && (!this.groupableColumns || this.groupableColumns.includes(c.key))).map(col => html`\n <ixfx-menu-radio-item value=${col.key} label=${col.label}></ixfx-menu-radio-item>\n `)}\n </ixfx-menu-radio-group>\n `\n : nothing}\n </ixfx-menu-container>\n </ixfx-menu-trigger>`}\n </div>\n <div class=\"viewport\" @scroll=${this._onScroll}>\n <div class=\"spacer\" style=\"height:${this._flat.length * rh}px; width:${this._colWidthSum}px\">\n ${repeat(visibleFlat, f => f.key, (entry, i) => {\n const absIdx = startRow + i;\n if (entry.type === `group`) {\n const gKey = entry.key.replace(/^__group__/, ``);\n const collapsed = this._collapsedGroups.has(gKey);\n return html`<div class=\"group-row ${collapsed ? `collapsed` : ``}\" style=\"top:${absIdx * rh}px; height:${rh}px\" @click=${() => this._toggleGroup(gKey)}><span class=\"caret\">▼</span><span>${entry.label}</span><span class=\"count\">(${entry.count})</span><span class=\"divider\"></span></div>`;\n }\n const row = entry.row;\n const absIdx2 = entry.idx;\n const rowKey = entry.key;\n const selected = this._selectedKeys.has(rowKey);\n const tickled = this._tickled.isTickled(rowKey);\n return html`\n <div class=\"row item ${selected ? `selected` : ``} ${tickled ? `tickled` : ``} ${this.#enteringRowKeys.has(rowKey) ? `entering` : ``}\" style=\"top:${absIdx * rh}px; height:${rh}px\"\n data-key=${rowKey}\n @click=${(e: MouseEvent) => {\n this._onRowClick(rowKey, null, e); this.dispatchEvent(new CustomEvent<DataGridCellClickDetail>(`datagrid-cell-click`, { detail: { rowKey, colKey: ``, rowIndex: absIdx2, colIndex: -1 }, bubbles: true, composed: true }));\n }}\n @pointerenter=${() => this._tickled.handlePointerEnter(rowKey)}\n @pointerleave=${() => this._tickled.clearTickled()}\n @dblclick=${() => {\n if (this._visibleColumns[0] && this._isEditable(row, this._visibleColumns[0]))\n this._startEdit(rowKey, this._visibleColumns[0].key);\n }}>\n ${showCheckbox ? html`<div class=\"checkbox-col\"><input type=\"checkbox\" .checked=${selected} @click=${(e: MouseEvent) => this._onCheckboxClick(rowKey, e)} /></div>` : nothing}\n ${repeat(this._visibleColumns, c => c.key, (col) => {\n const val = (row as Record<string, unknown>)[col.key];\n const isEditing = this._isCellEditing(rowKey, col.key);\n if (isEditing) {\n const immediate = this.editability === `immediate` || this._editingRow === rowKey;\n const curVal = immediate ? val : (this._editValue ?? val);\n if (col.editor === `boolean` || (col.editor as string) === `boolean`) {\n return html`<div class=\"cell\" data-col=${col.key} style=\"width:${col.width ?? 150}px;justify-content:center;align-items:center\"><input type=\"checkbox\" .checked=${Boolean(curVal)} @change=${(e: Event) => {\n const v = (e.target as HTMLInputElement).checked;\n if (immediate) {\n this._commitImmediate(rowKey, col.key, v);\n } else {\n this._editValue = v; this._commitEdit();\n }\n }} /></div>`;\n }\n if (col.editor === `select`) {\n const opts = (col.editorOptions ?? []) as ReadonlyArray<string | { value: string; label: string }>;\n return html`<div class=\"cell\" data-col=${col.key} style=\"width:${col.width ?? 150}px\"><select @change=${(e: Event) => {\n const v = (e.target as HTMLSelectElement).value;\n if (immediate) {\n this._commitImmediate(rowKey, col.key, v);\n } else {\n this._editValue = v; this._commitEdit();\n }\n }} @keydown=${(e: KeyboardEvent) => {\n if (e.key === `Tab`) {\n e.preventDefault(); e.stopPropagation(); this._tabToNext(rowKey, col.key, e.shiftKey ? -1 : 1);\n } if (e.key === `Escape`) {\n this._editing = null; this._editingRow = null;\n }\n }} @blur=${() => {\n if (this._suppressBlurCommit)\n return; if (!immediate)\n this._commitEdit();\n }}><option value=\"\"></option>${opts.map((o) => {\n const v = typeof o === `string` ? o : o.value;\n const l = typeof o === `string` ? o : o.label;\n return html`<option value=${v} ?selected=${String(curVal) === v}>${l}</option>`;\n })}</select></div>`;\n }\n if (typeof col.editor === `function`) {\n const factory = col.editor as DataGridEditorFactory;\n const ctx = { row, column: col, rowIndex: absIdx2, colIndex: 0, value: curVal, commit: (v: unknown) => {\n if (immediate) {\n this._commitImmediate(rowKey, col.key, v);\n } else {\n this._editValue = v; this._commitEdit();\n }\n }, cancel: () => {\n this._editing = null; this._editingRow = null;\n } };\n return html`<div class=\"cell\" data-col=${col.key} style=\"width:${col.width ?? 150}px\">${factory(ctx)}</div>`;\n }\n return html`<div class=\"cell\" data-col=${col.key} style=\"width:${col.width ?? 150}px\"><input .value=${String(curVal ?? ``)} @input=${(e: Event) => this._editValue = (e.target as HTMLInputElement).value} @keydown=${(e: KeyboardEvent) => {\n if (e.key === `Enter`)\n this._commitEdit(); if (e.key === `Escape`) {\n this._editing = null; this._editingRow = null;\n } if (e.key === `Tab`) {\n e.preventDefault(); e.stopPropagation(); this._tabToNext(rowKey, col.key, e.shiftKey ? -1 : 1);\n }\n }} @blur=${() => {\n if (this._suppressBlurCommit)\n return; if (!immediate)\n this._commitEdit();\n }} autofocus /></div>`;\n }\n const displayVal = this._formatValue(val, col, row);\n const rendered = col.renderer ? col.renderer(row as never, col as never, absIdx2) : displayVal;\n // renderer may return TemplateResult or primitive; if renderer not used, display formatted\n const cellContent = col.renderer ? rendered : displayVal;\n const editable = this._isEditable(row, col);\n const textEditable = editable && this._isTextEditor(col);\n return html`<div class=\"cell ${textEditable ? `editable-text` : ``}\" data-col=${col.key} style=\"width:${col.width ?? 150}px; justify-content:${col.align === `right` ? `flex-end` : col.align === `center` ? `center` : `flex-start`}\"\n @click=${(e: MouseEvent) => {\n this._lastClickedCell = { rowKey, colKey: col.key }; if (col.selectable !== false) {\n e.stopPropagation(); this._onRowClick(rowKey, col, e); this._handleCellSecondClick(rowKey, col);\n } this.dispatchEvent(new CustomEvent<DataGridCellClickDetail>(`datagrid-cell-click`, { detail: { rowKey, colKey: col.key, rowIndex: absIdx2, colIndex: this.columns.indexOf(col) }, bubbles: true, composed: true }));\n }}\n >${cellContent as unknown as string}</div>`;\n })}\n </div>\n `;\n })}\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap { 'ixfx-data-grid': DataGridElement }\n}\nexport interface DataGridElement {\n addEventListener: (<K extends keyof DataGridElementEventMap>(type: K, listener: (this: DataGridElement, event: DataGridElementEventMap[K]) => void, options?: boolean | AddEventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) => void);\n removeEventListener: (<K extends keyof DataGridElementEventMap>(type: K, listener: (this: DataGridElement, event: DataGridElementEventMap[K]) => void, options?: boolean | EventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions) => void);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-grid.js","names":["#createSearchAdapter","#searchRegistry","#searchKeyByRow","#rowSearchText","#effectiveSearchModes","#unregisterSearchCommands","#syncSearchCommands","#rowReflowTimer","#appendInProgress","#noteFlatMutation","#prevFlatKeys","#dataGridRenderedOnce","#enteringRowKeys","#appendToFlat","#resortRaf","customElement"],"sources":["../src/data-grid/data-grid.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { CommandId, CommandRegistry } from '@clinth/ui-commands';\nimport type { ListSearchAdapter, ListSearchMode } from '../incr-search/index.js';\nimport type { DragGhost } from '../util/drag-ghost.js';\nimport type { BuiltInFormatterName, BuiltInFormatterOptions, DataGridColumn, DataGridColumnMenu, DataGridEditability, DataGridEditorFactory, DataGridGetRowKey, DataGridGroupBy, DataGridGroupLabel, DataGridInteractionMode, DataGridSelectionMode, DataGridSortState, GlobalFormatter } from './types.js';\nimport { createCommandRegistry } from '@clinth/ui-commands';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport {\n LIST_SEARCH_MODES,\n ListSearchController,\n listSearchStyles,\n registerListSearchCommands,\n} from '../incr-search/index.js';\nimport { listItemFadeKeyframes, TickledController, tickledItemStyles, tickledStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { createDragGhost } from '../util/drag-ghost.js';\nimport '../menu/index.js';\n\n// Events\nexport type DataGridSortDetail = { readonly sort: DataGridSortState; readonly previous: DataGridSortState };\nexport type DataGridSortEvent = CustomEvent<DataGridSortDetail>;\nexport type DataGridSelectDetail = { readonly selectedKeys: ReadonlySet<string>; readonly previous: ReadonlySet<string> };\nexport type DataGridSelectEvent = CustomEvent<DataGridSelectDetail>;\nexport type DataGridColumnReorderDetail = { readonly from: number; readonly to: number; readonly columns: readonly DataGridColumn[] };\nexport type DataGridColumnReorderEvent = CustomEvent<DataGridColumnReorderDetail>;\nexport type DataGridColumnResizeDetail = { readonly key: string; readonly width: number };\nexport type DataGridColumnResizeEvent = CustomEvent<DataGridColumnResizeDetail>;\nexport type DataGridColumnVisibilityDetail = { readonly key: string; readonly visible: boolean };\nexport type DataGridColumnVisibilityEvent = CustomEvent<DataGridColumnVisibilityDetail>;\nexport type DataGridCellClickDetail = { readonly rowKey: string; readonly colKey: string; readonly rowIndex: number; readonly colIndex: number };\nexport type DataGridCellClickEvent = CustomEvent<DataGridCellClickDetail>;\nexport type DataGridCellEditDetail = { readonly rowKey: string; readonly colKey: string; readonly oldValue: unknown; readonly newValue: unknown };\nexport type DataGridCellEditEvent = CustomEvent<DataGridCellEditDetail>;\n\nexport type DataGridGroupChangeDetail = { readonly groupBy: DataGridGroupBy<unknown> | null };\nexport type DataGridGroupChangeEvent = CustomEvent<DataGridGroupChangeDetail>;\nexport interface DataGridElementEventMap {\n 'datagrid-sort': DataGridSortEvent;\n 'datagrid-select': DataGridSelectEvent;\n 'datagrid-column-reorder': DataGridColumnReorderEvent;\n 'datagrid-column-resize': DataGridColumnResizeEvent;\n 'datagrid-column-visibility': DataGridColumnVisibilityEvent;\n 'datagrid-cell-click': DataGridCellClickEvent;\n 'datagrid-cell-edit': DataGridCellEditEvent;\n 'datagrid-group-change': DataGridGroupChangeEvent;\n}\n\n@customElement(`ixfx-data-grid`)\nexport class DataGridElement extends LitElement {\n static override styles = [themeFallbacks, tickledStyles, tickledItemStyles, listItemFadeKeyframes, listSearchStyles, css`\n :host {\n --data-grid-row-height: 28px;\n --data-grid-header-height: 32px;\n --data-grid-bg: var(--surface-3);\n --data-grid-header-bg: var(--surface-2);\n --data-grid-border: var(--border);\n --data-grid-header-text: var(--surface-3-text);\n position: relative;\n display: block;\n overflow: hidden;\n border: var(--data-grid-border);\n border-radius: var(--radius-m);\n background: var(--data-grid-bg);\n color: var(--surface-3-text);\n font-family: var(--font-family);\n font-size: var(--text-m);\n }\n :host(:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; }\n .grid { display: flex; flex-direction: column; height: 100%; min-height: 200px; position: relative; }\n .header-bar {\n display: flex; align-items: stretch; height: var(--data-grid-header-height);\n background: var(--data-grid-header-bg); border-bottom: var(--data-grid-border);\n overflow: visible; flex-shrink: 0; position: relative;\n }\n .header-scroll {\n display: flex; flex: 1; overflow: hidden;\n }\n .header-cell {\n display: flex; align-items: center; gap: var(--space-xs);\n padding: 0 var(--space-s); border-right: var(--border-subtle);\n flex-shrink: 0; user-select: none; cursor: pointer; position: relative;\n background: var(--data-grid-header-bg);\n box-sizing: border-box;\n }\n .header-cell[data-tickled] { background: var(--surface-5); }\n .header-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .sort-icon { font-size: 10px; opacity: 0.7; }\n .resize-handle { position: absolute; right: 0; top: 0; bottom: 0; width: 8px; cursor: col-resize; z-index: 1; }\n .reorder-handle { cursor: grab; opacity: 0.5; padding: 0 2px; }\n .flyout-trigger { flex-shrink: 0; width: 36px; display: flex; align-items: center; justify-content: center; cursor: pointer; border-left: var(--border-subtle); background: var(--data-grid-header-bg); }\n .viewport { flex: 1; overflow: auto; position: relative; }\n .spacer { position: relative; }\n .row.item {\n position: absolute; left: 0; right: 0; display: flex; align-items: stretch;\n gap: 0;\n height: var(--data-grid-row-height);\n border: none;\n box-shadow: inset 0 0 0 1px var(--item-border-color, transparent);\n background: var(--item-bg);\n border-radius: var(--item-border-radius);\n padding: 0;\n box-sizing: border-box;\n }\n .row.item.tickled { background: var(--item-bg-tickled); border: var(--item-border-tickled); color: var(--item-text-tickled); }\n .row.item.selected { background: var(--item-bg-selected); border: var(--item-border-selected); color: var(--item-text-selected); }\n .row.item.selected.tickled { background: var(--item-bg-selected-tickled); }\n\n /* Insertion / removal animation. Only while [reflowing] — the ~0.3s after\n the row set changes — do rows slide (their top transitions) to make or\n close a gap; a freshly inserted row also fades in. Kept scoped so it\n never fires while scrolling the virtualised list. */\n :host([reflowing]) .row.item,\n :host([reflowing]) .group-row {\n transition: top var(--data-grid-row-move-duration, 200ms) cubic-bezier(0.2, 0, 0, 1);\n }\n .row.item.entering {\n animation: ixfx-list-item-in var(--data-grid-row-move-duration, 200ms) ease both;\n }\n @media (prefers-reduced-motion: reduce) {\n :host([reflowing]) .row.item, :host([reflowing]) .group-row { transition: none; }\n .row.item.entering { animation: none; }\n }\n .cell {\n flex-shrink: 0; display: flex; align-items: center; padding: 0 var(--space-s);\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap; border-right: var(--border-subtle);\n box-sizing: border-box;\n font-variant-numeric: tabular-nums;\n }\n .cell.editable-text { cursor: text; }\n .cell input, .cell select { width: 100%; font: inherit; }\n .checkbox-col { width: 28px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n ixfx-menu-trigger { flex-shrink: 0; border-left: var(--border-subtle); background: var(--data-grid-header-bg); display: flex; align-items: center; --ixfx-button-padding: var(--space-s) var(--space-m); min-width: 44px; min-height: var(--data-grid-header-height); justify-content: center; }\n .header-cell[drag-source] { opacity: 0.4; }\n .drop-caret {\n position: absolute; top: 0; bottom: 0; width: 2px;\n background: var(--accent); border-radius: 1px; pointer-events: none; z-index: 2;\n }\n .group-row {\n position: absolute; left: 0; right: 0; display: flex; align-items: center; gap: var(--space-s);\n height: var(--data-grid-row-height); background: transparent; color: var(--surface-3-text);\n border-bottom: 1px solid var(--border); font-weight: 600; padding: 0 var(--space-s);\n cursor: pointer; user-select: none;\n }\n .group-row .caret { transition: transform 0.15s; display: inline-flex; }\n .group-row.collapsed .caret { transform: rotate(-90deg); }\n .group-row .divider { flex: 1; height: 1px; background: var(--border); margin-left: var(--space-s); }\n .group-row .count { opacity: 0.6; font-weight: 400; font-size: 0.9em; }\n\n `];\n\n @property({ type: Array }) columns: DataGridColumn[] = [];\n @property({ type: Array }) rows: unknown[] = [];\n @property({ type: String, attribute: `selection-mode` }) selectionMode: DataGridSelectionMode = `single`;\n @property({ type: String, attribute: `interaction-mode` }) interactionMode: DataGridInteractionMode = `standard`;\n @property({ attribute: false }) sortState: DataGridSortState = null;\n @property({ type: Number, attribute: `row-height` }) rowHeight = 28;\n @property({ attribute: false }) getRowKey: DataGridGetRowKey<unknown> = (r: unknown, i: number) => (r as Record<string, unknown>).key as string ?? (r as Record<string, unknown>).id as string ?? String(i);\n @property({ attribute: false }) checkboxRenderer?: (checked: boolean) => unknown;\n @property({ attribute: false }) editable: boolean | ((row: unknown, col: DataGridColumn) => boolean) = false;\n @property({ type: String, reflect: true }) editability: DataGridEditability = `user`;\n\n @property({ attribute: false }) groupBy: DataGridGroupBy<unknown> | null = null;\n @property({ type: Boolean, attribute: `allow-grouping` }) allowGrouping = false;\n @property({ attribute: false }) groupLabel: DataGridGroupLabel | undefined;\n /** Columns keys that can be grouped by; undefined = all groupable columns */\n @property({ attribute: false }) groupableColumns: string[] | undefined;\n @property({ type: Boolean, attribute: `cross-group-selection`, reflect: true }) crossGroupSelection = false;\n /**\n * `auto` (default): render the built-in header column/group menu.\n * `none`: don't render it — for hosts that supply their own column UI via\n * `column.visible` + `datagrid-column-visibility`.\n */\n @property({ type: String, attribute: `column-menu` }) columnMenu: DataGridColumnMenu = `auto`;\n @property({ attribute: false }) globalFormatter?: GlobalFormatter;\n\n /**\n * Predicate used by incremental filter-search (and callable directly). Rows\n * for which it returns `false` are dropped from the flat list — hidden from\n * view and navigation.\n */\n @property({ attribute: false }) filterPredicate?: (row: unknown) => boolean;\n\n /** Text a row is matched against by incremental search. Default: its visible cells joined by a space. */\n @property({ attribute: false }) rowSearchText?: (row: unknown) => string;\n\n /**\n * Space-separated subset of `navigate select filter` — limits which\n * incremental-search modes are offered. Unset ⇒ all three; empty ⇒ search\n * disabled. See `docs/infra-incremental.md`.\n */\n @property({ type: String, attribute: `search-modes`, reflect: true }) searchModes: string | undefined;\n\n private _columnFormatters = new Map<string, (value: unknown) => unknown>();\n\n @state() private _selectedKeys = new Set<string>();\n @state() private _scrollTop = 0;\n @state() private _scrollLeft = 0;\n @state() private _viewportH = 300;\n @state() private _viewportW = 600;\n @state() private _collapsedGroups = new Set<string>();\n @state() private _editing: { rowKey: string; colKey: string } | null = null;\n @state() private _editingRow: string | null = null;\n @state() private _lastClick: { key: string; col: string; time: number } | null = null;\n @state() private _lastClickedCell: { rowKey: string; colKey: string } | null = null;\n @state() private _editValue: unknown = ``;\n\n @query(`.viewport`) private _viewportEl!: HTMLElement;\n @query(`.header-scroll`) private _headerScrollEl!: HTMLElement;\n\n private _tickled = new TickledController<string>(this, {\n getItems: () => this._flatKeys.map(k => ({ id: k, enabled: true })),\n onStateChange: () => this.requestUpdate(),\n });\n\n private _sortedRows: unknown[] = [];\n private _flat: Array<{ type: `group`; key: string; label: string; count: number } | { type: `row`; key: string; row: unknown; idx: number }> = [];\n private _flatKeys: string[] = [];\n\n #searchRegistry: CommandRegistry<unknown> | undefined;\n #unregisterSearchCommands: (() => void) | undefined;\n #searchKeyByRow = new Map<unknown, string>();\n\n /** Incremental search (navigate / select / filter). See `docs/infra-incremental.md`. */\n readonly search = new ListSearchController<unknown>(this, {\n adapter: this.#createSearchAdapter(),\n });\n\n /** Command registry carrying this grid's `list.search.*` commands. */\n get registry(): CommandRegistry<unknown> | undefined {\n return this.#searchRegistry;\n }\n\n #rowSearchText(row: unknown): string {\n if (this.rowSearchText)\n return this.rowSearchText(row);\n const rec = row as Record<string, unknown>;\n return this._visibleColumns.map(c => String(rec[c.key] ?? ``)).join(` `);\n }\n\n #createSearchAdapter(): ListSearchAdapter<unknown> {\n return {\n getItems: () => {\n this.#searchKeyByRow.clear();\n this._sortedRows.forEach((r, i) => this.#searchKeyByRow.set(r, this.getRowKey(r, i)));\n return this._sortedRows;\n },\n getLabel: row => this.#rowSearchText(row),\n getKey: row => this.#searchKeyByRow.get(row) ?? String(this._sortedRows.indexOf(row)),\n focusItem: (row) => {\n if (row === undefined)\n return;\n const key = this.#searchKeyByRow.get(row);\n if (key !== undefined)\n this.tickleRow(key);\n },\n selectItems: (rows) => {\n this.selectKeys(rows.map(r => this.#searchKeyByRow.get(r)).filter((k): k is string => k !== undefined));\n },\n applyFilter: (matched) => {\n this.filterPredicate = matched === undefined\n ? undefined\n : (row) => {\n const k = this.#searchKeyByRow.get(row);\n return k === undefined || matched.has(k);\n };\n },\n // No character highlights: match positions index into the whole-row search\n // text, which spans multiple cells, so they can't be mapped to one cell.\n };\n }\n\n #effectiveSearchModes(): ListSearchMode[] {\n const raw = this.searchModes?.trim();\n if (raw === undefined)\n return [...LIST_SEARCH_MODES];\n const requested = new Set(raw.split(/\\s+/));\n return LIST_SEARCH_MODES.filter(m => requested.has(m));\n }\n\n #syncSearchCommands(): void {\n if (!this.#searchRegistry)\n return;\n this.search.setModes(this.#effectiveSearchModes());\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = registerListSearchCommands(this.#searchRegistry, this.search);\n }\n\n /** Row-key snapshot from the previous update, for the insertion / removal animation. */\n #prevFlatKeys: string[] = [];\n #enteringRowKeys = new Set<string>();\n #rowReflowTimer = 0;\n #dataGridRenderedOnce = false;\n private _visibleColumns: DataGridColumn[] = [];\n private _colOffsets: number[] = [];\n private _colWidthSum = 0;\n private _raf = 0;\n #appendInProgress = false;\n #resortRaf = 0;\n private _drag: { pointerId: number; from: number; startX: number; startY: number; active: boolean; ghost: DragGhost | null; gap: number | undefined; sourceCol: DataGridColumn } | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`tabindex`))\n this.tabIndex = 0;\n this.addEventListener(`keydown`, this._onKeyDown as EventListener);\n this.addEventListener(`focusout`, this._onFocusOut as EventListener);\n this.#searchRegistry ??= createCommandRegistry();\n this.#syncSearchCommands();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`keydown`, this._onKeyDown as EventListener);\n this.removeEventListener(`focusout`, this._onFocusOut as EventListener);\n cancelAnimationFrame(this._raf);\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = undefined;\n this.#searchRegistry = undefined;\n if (this.#rowReflowTimer) {\n clearTimeout(this.#rowReflowTimer);\n this.#rowReflowTimer = 0;\n }\n }\n\n /**\n * Dispatch a command to this grid — routes through the command registry so\n * `list.search.*` (and any other registered commands) work.\n */\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n this.#searchRegistry?.invoke(commandId, args);\n }\n\n private _onFocusOut = (e: FocusEvent): void => {\n if (this._suppressBlurCommit)\n return;\n if (this.editability === `immediate`)\n return;\n if (!this._editing && !this._editingRow)\n return;\n const next = e.relatedTarget as Node | null;\n if (next && this.contains(next))\n return;\n // focus moved outside component → revert editors\n this._editing = null;\n this._editingRow = null;\n this.requestUpdate();\n };\n\n protected override firstUpdated(): void {\n const ro = new ResizeObserver(() => {\n if (!this._viewportEl)\n return;\n this._viewportH = this._viewportEl.clientHeight;\n this._viewportW = this._viewportEl.clientWidth;\n this.requestUpdate();\n });\n ro.observe(this._viewportEl);\n this._viewportH = this._viewportEl.clientHeight;\n this._viewportW = this._viewportEl.clientWidth;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has(`_editing`) || changed.has(`_editingRow`)) {\n requestAnimationFrame(() => {\n let sel: string | null = null;\n if (this._editing)\n sel = `.row[data-key=\"${this._editing.rowKey}\"] .cell[data-col=\"${this._editing.colKey}\"] input, .row[data-key=\"${this._editing.rowKey}\"] .cell[data-col=\"${this._editing.colKey}\"] select`;\n else if (this._editingRow)\n sel = `.row[data-key=\"${this._editingRow}\"] .cell input, .row[data-key=\"${this._editingRow}\"] .cell select`;\n if (!sel)\n return;\n const el = this.renderRoot.querySelector(sel) as HTMLElement | null;\n el?.focus();\n if (el instanceof HTMLInputElement && el.type === `text`)\n el.select();\n });\n }\n }\n\n protected override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n this.setAttribute(`data-input-mode`, this._tickled.inputMode);\n if (changed.has(`searchModes`)) {\n this.#syncSearchCommands();\n }\n // `appendRows()` maintains the derived arrays itself and coalesces any\n // re-sort — skip the full rebuild that a plain `rows` reassignment triggers.\n if (!this.#appendInProgress) {\n if (changed.has(`rows`) || changed.has(`sortState`) || changed.has(`columns`) || changed.has(`groupBy`) || changed.has(`groupLabel`)) {\n this._sortedRows = this._applySort([...this.rows]);\n }\n this._rebuildFlat();\n }\n this._visibleColumns = this.columns.filter(c => c.visible !== false);\n let off = 0;\n this._colOffsets = this._visibleColumns.map((c) => {\n const o = off;\n off += c.width ?? 150;\n return o;\n });\n this._colWidthSum = off;\n if (this.interactionMode === `checked`)\n this._colWidthSum += 28;\n this.#noteFlatMutation();\n }\n\n /**\n * Diff the row-key list against the previous update. Rows that appeared get an\n * enter fade; any add/remove opens a short `[reflowing]` window so the rows\n * that shift slide (their `top` transitions) instead of snapping. Bounded in\n * time so it never bleeds into scroll virtualisation.\n */\n #noteFlatMutation(): void {\n const now = this._flatKeys;\n const prev = this.#prevFlatKeys;\n this.#prevFlatKeys = now.slice();\n if (!this.#dataGridRenderedOnce) {\n this.#dataGridRenderedOnce = true;\n return;\n }\n if (prev.length === 0 || now.length === 0) {\n this.#enteringRowKeys.clear();\n return;\n }\n const before = new Set(prev);\n const after = new Set(now);\n const added = now.filter(k => !before.has(k));\n const removed = prev.filter(k => !after.has(k));\n if (added.length === now.length || (added.length === 0 && removed.length === 0))\n return;\n this.#enteringRowKeys = new Set(added);\n this.toggleAttribute(`reflowing`, true);\n if (this.#rowReflowTimer)\n clearTimeout(this.#rowReflowTimer);\n this.#rowReflowTimer = window.setTimeout(() => {\n this.#rowReflowTimer = 0;\n this.#enteringRowKeys.clear();\n this.toggleAttribute(`reflowing`, false);\n this.requestUpdate();\n }, 320);\n }\n\n private _getGroupKey(row: unknown): string | null {\n if (!this.groupBy)\n return null;\n if (typeof this.groupBy === `string`)\n return String((row as Record<string, unknown>)[this.groupBy] ?? ``);\n return String((this.groupBy as (r: unknown) => string)(row));\n }\n\n private _rebuildFlat(): void {\n const filtered = this.filterPredicate !== undefined;\n const source = filtered\n ? this._sortedRows.filter(r => this.filterPredicate!(r))\n : this._sortedRows;\n if (!this.groupBy) {\n this._flat = source.map((r, i) => {\n const idx = filtered ? this._sortedRows.indexOf(r) : i;\n return { type: `row` as const, key: this.getRowKey(r, idx), row: r, idx };\n });\n this._flatKeys = this._flat.map(f => f.key);\n return;\n }\n const groups = new Map<string, unknown[]>();\n for (const r of source) {\n const k = this._getGroupKey(r) ?? ``;\n const arr = groups.get(k);\n if (arr)\n arr.push(r); else groups.set(k, [r]);\n }\n const flat: typeof this._flat = [];\n const keys: string[] = [];\n for (const [gKey, rows] of groups) {\n const label = this.groupLabel ? this.groupLabel(gKey, rows) : gKey;\n const gId = `__group__${gKey}`;\n flat.push({ type: `group`, key: gId, label, count: rows.length });\n keys.push(gId);\n if (this._collapsedGroups.has(gKey))\n continue;\n for (const r of rows) {\n const idx = this._sortedRows.indexOf(r);\n const rk = this.getRowKey(r, idx);\n flat.push({ type: `row`, key: rk, row: r, idx });\n keys.push(rk);\n }\n }\n this._flat = flat;\n this._flatKeys = keys;\n }\n\n private _toggleGroup(gKey: string): void {\n const next = new Set(this._collapsedGroups);\n if (next.has(gKey))\n next.delete(gKey); else next.add(gKey);\n this._collapsedGroups = next;\n }\n\n private _applySort(rows: unknown[]): unknown[] {\n if (!this.sortState)\n return rows;\n const col = this.columns.find(c => c.key === this.sortState!.key);\n if (!col)\n return rows;\n const dir = this.sortState.direction === `asc` ? 1 : -1;\n if (col.sortFn)\n return rows.sort((a, b) => dir * col.sortFn!(a as never, b as never));\n return rows.sort((a, b) => {\n const av = (a as Record<string, unknown>)[col.key];\n const bv = (b as Record<string, unknown>)[col.key];\n if (av === bv)\n return 0;\n if (typeof av === `number` && typeof bv === `number`)\n return dir * (av - bv);\n return dir * String(av).localeCompare(String(bv));\n });\n }\n\n private _onScroll = (e: Event): void => {\n const el = e.target as HTMLElement;\n cancelAnimationFrame(this._raf);\n this._raf = requestAnimationFrame(() => {\n this._scrollTop = el.scrollTop;\n this._scrollLeft = el.scrollLeft;\n if (this._headerScrollEl)\n this._headerScrollEl.scrollLeft = el.scrollLeft;\n this.requestUpdate();\n });\n };\n\n private _onHeaderClick(col: DataGridColumn): void {\n if (col.sortable === false)\n return;\n const prev = this.sortState;\n let next: DataGridSortState = null;\n if (!prev || prev.key !== col.key)\n next = { key: col.key, direction: `asc` };\n else if (prev.direction === `asc`)\n next = { key: col.key, direction: `desc` };\n else next = null;\n this.sortState = next;\n this.dispatchEvent(new CustomEvent<DataGridSortDetail>(`datagrid-sort`, { detail: { sort: next, previous: prev }, bubbles: true, composed: true }));\n }\n\n private _onRowClick(rowKey: string, col: DataGridColumn | null, e: MouseEvent): void {\n if (col && col.selectable === false)\n return;\n if (this.selectionMode === `none` && this.interactionMode !== `checked` && this.interactionMode !== `sticky`)\n return;\n if (this.interactionMode === `manual`)\n return;\n if (this.interactionMode === `implicit`) {\n this._replaceSelection(rowKey); return;\n }\n if (this.interactionMode === `checked`)\n return;\n if (this.interactionMode === `sticky`) {\n this._toggleSelection(rowKey); return;\n }\n // standard / vscode\n if (e.ctrlKey || e.metaKey) {\n if (this.selectionMode === `multiple` || this.interactionMode === `vscode`)\n this._toggleSelection(rowKey);\n } else if (e.shiftKey && (this.selectionMode === `multiple` || this.interactionMode === `vscode`)) {\n this._rangeSelectTo(rowKey);\n } else {\n this._replaceSelection(rowKey);\n }\n }\n\n private _onCheckboxClick(rowKey: string, e: MouseEvent): void {\n e.stopPropagation();\n this._onRowClick(rowKey, null, e);\n }\n\n private _onVisibilityToggle(col: DataGridColumn, checked: boolean): void {\n col.visible = checked;\n this.columns = [...this.columns];\n this.dispatchEvent(new CustomEvent<DataGridColumnVisibilityDetail>(`datagrid-column-visibility`, { detail: { key: col.key, visible: checked }, bubbles: true, composed: true }));\n }\n\n private _beginHeaderDrag(e: PointerEvent, col: DataGridColumn, idx: number): void {\n e.stopPropagation();\n const anchor = (e.currentTarget as HTMLElement).closest(`.header-cell`) as HTMLElement ?? e.currentTarget as HTMLElement;\n this._drag = { pointerId: e.pointerId, from: idx, startX: e.clientX, startY: e.clientY, active: false, ghost: null, gap: undefined, sourceCol: col };\n const onMove = (ev: PointerEvent): void => {\n if (!this._drag || ev.pointerId !== this._drag.pointerId)\n return;\n const dx = ev.clientX - this._drag.startX;\n const dy = ev.clientY - this._drag.startY;\n if (!this._drag.active) {\n if (Math.hypot(dx, dy) < 5)\n return;\n this._drag.active = true;\n const content = document.createElement(`span`);\n content.textContent = col.label;\n try {\n this._drag.ghost = createDragGhost({ anchor, content });\n this._drag.ghost.move(ev.clientX, ev.clientY);\n } catch { /* ignore */ }\n try {\n this._headerScrollEl?.setPointerCapture(ev.pointerId);\n } catch { /* ignore */ }\n }\n this._drag.ghost?.move(ev.clientX, ev.clientY);\n const x = ev.clientX - (this._headerScrollEl?.getBoundingClientRect().left ?? 0) + (this._headerScrollEl?.scrollLeft ?? 0);\n let gap = this._drag.from;\n let bestDist = Infinity;\n for (let i = 0; i < this._visibleColumns.length; i++) {\n if (i === this._drag.from)\n continue;\n const rectLeft = this._colOffsets[i];\n const rectRight = rectLeft + (this._visibleColumns[i].width ?? 150);\n const mid = (rectLeft + rectRight) / 2;\n // gap before i\n const gapPos = x < mid ? rectLeft : rectRight;\n const gapIdx = x < mid ? i : i + 1;\n const d = Math.abs(x - gapPos);\n if (d < bestDist) {\n bestDist = d; gap = gapIdx > this._drag.from ? gapIdx - 1 : gapIdx;\n }\n }\n // handle gap after last\n if (this._visibleColumns.length > 0) {\n const lastOff = this._colOffsets[this._colOffsets.length - 1] + (this._visibleColumns[this._visibleColumns.length - 1].width ?? 150);\n const d = Math.abs(x - lastOff);\n if (d < bestDist) {\n bestDist = d; gap = this._visibleColumns.length - 1; if (this._drag.from === this._visibleColumns.length - 1)\n gap = this._drag.from; else if (gap >= this._drag.from)\n gap = this._visibleColumns.length - 1;\n }\n }\n // normalized gap for reorder (visible index without source)\n const siblings = this._visibleColumns.length - 1;\n let normalizedGap = gap;\n if (normalizedGap < 0)\n normalizedGap = 0;\n if (normalizedGap > siblings)\n normalizedGap = siblings;\n this._drag.gap = normalizedGap;\n this.requestUpdate();\n };\n const onUp = (ev: PointerEvent): void => {\n if (!this._drag || ev.pointerId !== this._drag.pointerId)\n return;\n const active = this._drag.active;\n const from = this._drag.from;\n const gap = this._drag.gap;\n this._drag.ghost?.destroy();\n try {\n this._headerScrollEl?.releasePointerCapture(ev.pointerId);\n } catch { /* ignore */ }\n window.removeEventListener(`pointermove`, onMove);\n window.removeEventListener(`pointerup`, onUp);\n window.removeEventListener(`pointercancel`, onUp);\n this._drag = null;\n this.requestUpdate();\n if (active && gap !== undefined && gap !== from) {\n // convert visible gap to actual reorder (filter hidden)\n this._onReorderDrag(from, gap);\n }\n };\n window.addEventListener(`pointermove`, onMove);\n window.addEventListener(`pointerup`, onUp);\n window.addEventListener(`pointercancel`, onUp as EventListener);\n }\n\n private _onReorderDrag(fromIdx: number, toIdx: number): void {\n if (fromIdx === toIdx)\n return;\n const cols = [...this.columns];\n const vis = cols.filter(c => c.visible !== false);\n const hidden = cols.filter(c => c.visible === false);\n const [moved] = vis.splice(fromIdx, 1);\n vis.splice(toIdx, 0, moved);\n this.columns = [...vis, ...hidden];\n this.dispatchEvent(new CustomEvent<DataGridColumnReorderDetail>(`datagrid-column-reorder`, { detail: { from: fromIdx, to: toIdx, columns: [...this.columns] }, bubbles: true, composed: true }));\n }\n\n private _anchorKey: string | undefined;\n\n private _scrollRowIntoView(key: string): void {\n const idx = this._flat.findIndex(f => f.key === key);\n if (idx < 0 || !this._viewportEl)\n return;\n const top = idx * this.rowHeight;\n const bottom = top + this.rowHeight;\n const vt = this._viewportEl.scrollTop;\n const vb = vt + this._viewportEl.clientHeight;\n if (top < vt)\n this._viewportEl.scrollTop = top;\n else if (bottom > vb)\n this._viewportEl.scrollTop = bottom - this._viewportEl.clientHeight;\n }\n\n private _getRowForKey(key: string): unknown | undefined {\n const entry = this._flat.find(f => f.key === key) as { row?: unknown } | undefined;\n return (entry as { row?: unknown })?.row;\n }\n\n // --- Public keyed API ---\n\n /** The selected row keys (read-only). */\n get selectedKeys(): ReadonlySet<string> {\n return this._selectedKeys;\n }\n\n /** Replace the selection with these row keys (clamped to known rows). */\n set selectedKeys(keys: Iterable<string>) {\n this.selectKeys(keys);\n }\n\n /**\n * Replace the selection with the given row keys. Unknown keys are dropped;\n * in a single-select mode only the last surviving key is kept;\n * `selectionMode=\"none\"` clears. Fires `datagrid-select` with the previous\n * set when the selection actually changes.\n */\n selectKeys(keys: Iterable<string>): void {\n const known = new Set(this._flat.filter(f => f.type === `row`).map(f => f.key));\n let next = new Set([...keys].filter(k => known.has(k)));\n const multi = this.selectionMode === `multiple`\n || this.interactionMode === `checked`\n || this.interactionMode === `sticky`\n || this.interactionMode === `vscode`;\n if (this.selectionMode === `none`) {\n next = new Set();\n } else if (!multi && next.size > 1) {\n const last = [...next].at(-1);\n next = last === undefined ? new Set() : new Set([last]);\n }\n const prev = new Set(this._selectedKeys);\n if (prev.size === next.size && [...next].every(k => prev.has(k)))\n return;\n this._selectedKeys = next;\n this._anchorKey = [...next].at(-1);\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, {\n detail: { selectedKeys: new Set(next), previous: prev },\n bubbles: true,\n composed: true,\n }));\n }\n\n /** The row key under the cursor, or `undefined`. */\n get tickledKey(): string | undefined {\n return this._tickled.tickledId;\n }\n\n /** Move the cursor to this row key and scroll it into view. */\n tickleRow(key: string): void {\n if (!this._flatKeys.includes(key))\n return;\n this._tickled.focus(key);\n this._scrollRowIntoView(key);\n }\n\n /**\n * Append rows without the full O(n log n) rebuild that reassigning `rows`\n * incurs. `rows` still gets a new array reference (reactivity is preserved),\n * but the derived arrays are extended over the appended slice only. When a\n * sort is active the new rows show unsorted for one frame, then a single\n * coalesced re-sort runs. Scroll position, selection and cursor are kept.\n */\n appendRows(rows: readonly unknown[]): void {\n if (rows.length === 0)\n return;\n const startIdx = this.rows.length;\n this.#appendInProgress = true;\n this.rows = [...this.rows, ...rows];\n const appended = this.rows.slice(startIdx);\n\n if (this._sortedRows.length === startIdx) {\n this._sortedRows = [...this._sortedRows, ...appended];\n } else {\n // derived arrays out of sync — fall back to a full rebuild\n this._sortedRows = this._applySort([...this.rows]);\n this._rebuildFlat();\n this.#appendInProgress = false;\n this.requestUpdate();\n return;\n }\n this.#appendToFlat(appended, startIdx);\n this.#appendInProgress = false;\n this.requestUpdate();\n\n if (this.sortState != null) {\n cancelAnimationFrame(this.#resortRaf);\n this.#resortRaf = requestAnimationFrame(() => {\n this._sortedRows = this._applySort([...this.rows]);\n this._rebuildFlat();\n this.requestUpdate();\n });\n }\n }\n\n #appendToFlat(appended: readonly unknown[], startIdx: number): void {\n if (this.groupBy) {\n // grouped flat layout can't be extended in place — rebuild it\n this._rebuildFlat();\n return;\n }\n for (let j = 0; j < appended.length; j++) {\n const idx = startIdx + j;\n const key = this.getRowKey(appended[j], idx);\n this._flat.push({ type: `row`, key, row: appended[j], idx });\n this._flatKeys.push(key);\n }\n }\n\n private _replaceSelection(key: string): void {\n if (this.selectionMode === `none`)\n return;\n const prev = new Set(this._selectedKeys);\n if (this.groupBy && !this.crossGroupSelection) {\n const g = this._getGroupKey(this._getRowForKey(key) ?? { key });\n const keep = [...prev].filter(k => this._getGroupKey(this._getRowForKey(k) ?? { key: k }) === g);\n // cross-group off → keep only same-group, then replace\n this._selectedKeys = new Set([key]);\n void keep;\n } else {\n this._selectedKeys = new Set([key]);\n }\n this._anchorKey = key;\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n\n private _toggleSelection(key: string): void {\n const prev = new Set(this._selectedKeys);\n const next = new Set(this._selectedKeys);\n if (next.has(key)) {\n next.delete(key);\n } else {\n if (this.groupBy && !this.crossGroupSelection) {\n const g = this._getGroupKey(this._getRowForKey(key) ?? { key });\n for (const k of [...next]) {\n if (this._getGroupKey(this._getRowForKey(k) ?? { key: k }) !== g)\n next.delete(k);\n }\n }\n if (this.selectionMode !== `multiple` && this.interactionMode !== `checked` && this.interactionMode !== `sticky`)\n next.clear();\n next.add(key);\n }\n this._selectedKeys = next;\n this._anchorKey = key;\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n\n private _rangeSelectTo(key: string): void {\n if (!this._anchorKey) {\n this._replaceSelection(key); return;\n }\n const keys = this._flat.filter(f => f.type === `row`).map(f => f.key);\n const a = keys.indexOf(this._anchorKey);\n const b = keys.indexOf(key);\n if (a < 0 || b < 0) {\n this._replaceSelection(key); return;\n }\n if (this.groupBy && !this.crossGroupSelection) {\n const anchorGroup = this._getGroupKey(this._getRowForKey(this._anchorKey) ?? { key: this._anchorKey });\n const targetGroup = this._getGroupKey(this._getRowForKey(key) ?? { key });\n if (anchorGroup !== targetGroup) {\n this._replaceSelection(key); return;\n }\n // restrict range to rows of that group\n const groupKeys = keys.filter(k => this._getGroupKey(this._getRowForKey(k) ?? { key: k }) === anchorGroup);\n const ga = groupKeys.indexOf(this._anchorKey);\n const gb = groupKeys.indexOf(key);\n if (ga < 0 || gb < 0) {\n this._replaceSelection(key); return;\n }\n const lo = Math.min(ga, gb); const hi = Math.max(ga, gb);\n const prev = new Set(this._selectedKeys);\n this._selectedKeys = new Set(groupKeys.slice(lo, hi + 1));\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n return;\n }\n const lo = Math.min(a, b); const hi = Math.max(a, b);\n const prev = new Set(this._selectedKeys);\n this._selectedKeys = new Set(keys.slice(lo, hi + 1));\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === `a`) {\n if (this.selectionMode === `multiple` || this.interactionMode === `checked` || this.interactionMode === `sticky` || this.interactionMode === `vscode` || this.interactionMode === `standard`) {\n e.preventDefault();\n const prev = new Set(this._selectedKeys);\n if (this.groupBy && !this.crossGroupSelection && this._anchorKey) {\n const g = this._getGroupKey(this._getRowForKey(this._anchorKey) ?? { key: this._anchorKey });\n this._selectedKeys = new Set(this._flat.filter(f => f.type === `row` && this._getGroupKey((f as { row: unknown }).row) === g).map(f => f.key));\n } else {\n this._selectedKeys = new Set(this._flat.filter(f => f.type === `row`).map(f => f.key));\n }\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n return;\n }\n // If editing, Up/Down commits and moves to same column in adjacent row\n if (this._editing && (e.key === `ArrowDown` || e.key === `ArrowUp`)) {\n const active = this.shadowRoot?.activeElement as HTMLElement | null;\n if (active?.tagName === `SELECT`)\n return; // let native select handle\n e.preventDefault();\n const cur = this._editing;\n const dir = e.key === `ArrowDown` ? 1 : -1;\n const colKey = cur.colKey;\n this._suppressBlurCommit = true;\n this._commitEdit();\n const rowKeys = this._flat.filter(f => f.type === `row`).map(f => f.key);\n const idx = rowKeys.indexOf(cur.rowKey);\n let nextIdx = idx + dir;\n while (nextIdx >= 0 && nextIdx < rowKeys.length) {\n const nk = rowKeys[nextIdx];\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === nk);\n const col = this._visibleColumns.find(c => c.key === colKey);\n if (row && col && this._isEditable(row, col)) {\n this._startEdit(nk, colKey);\n this._tickled.handleKeyboardNavigation(nextIdx > idx ? `next` : `previous`);\n this._scrollRowIntoView(nk);\n break;\n }\n nextIdx += dir;\n }\n if (nextIdx < 0 || nextIdx >= rowKeys.length) {\n // no editable target, stay on current row tickled\n this._tickled.handleKeyboardNavigation(dir > 0 ? `next` : `previous`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n }\n requestAnimationFrame(() => {\n this._suppressBlurCommit = false;\n });\n return;\n }\n if (e.key === `ArrowDown` || e.key === `ArrowUp` || e.key === `Home` || e.key === `End`) {\n e.preventDefault();\n this._tickled.setInputMode(`keyboard`);\n }\n switch (e.key) {\n case `ArrowDown`: {\n this._tickled.handleKeyboardNavigation(`next`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n if (this.interactionMode === `implicit` && this._tickled.tickledId)\n this._replaceSelection(this._tickled.tickledId);\n if (e.shiftKey && (this.interactionMode === `standard` || this.interactionMode === `vscode`) && this._tickled.tickledId)\n this._rangeSelectTo(this._tickled.tickledId);\n break;\n }\n case `ArrowUp`: {\n this._tickled.handleKeyboardNavigation(`previous`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n if (this.interactionMode === `implicit` && this._tickled.tickledId)\n this._replaceSelection(this._tickled.tickledId);\n if (e.shiftKey && (this.interactionMode === `standard` || this.interactionMode === `vscode`) && this._tickled.tickledId)\n this._rangeSelectTo(this._tickled.tickledId);\n break;\n }\n case `Home`: {\n this._tickled.handleKeyboardNavigation(`first`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n break;\n }\n case `End`: {\n this._tickled.handleKeyboardNavigation(`last`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n break;\n }\n case `Enter`: {\n const key = this._tickled.tickledId;\n if (!key)\n break;\n e.preventDefault();\n if (!this._editing && this.editability === `user`) {\n const idx = this._sortedRows.findIndex((r, i) => this.getRowKey(r, i) === key);\n if (idx >= 0) {\n const row = this._sortedRows[idx];\n // prefer lastClickedCell if it is in this row and editable\n if (this._lastClickedCell?.rowKey === key) {\n const col = this._visibleColumns.find(c => c.key === this._lastClickedCell!.colKey);\n if (col && this._isEditable(row, col)) {\n this._startEdit(key, col.key); break;\n }\n }\n const firstEditable = this._visibleColumns.find(c => this._isEditable(row, c));\n if (firstEditable) {\n this._startEdit(key, firstEditable.key); break;\n }\n }\n }\n if (!this._editing) {\n const idx = this._sortedRows.findIndex((r, i) => this.getRowKey(r, i) === key);\n if (this.interactionMode !== `manual` && this.interactionMode !== `checked`)\n this._replaceSelection(key);\n this.dispatchEvent(new CustomEvent<DataGridCellClickDetail>(`datagrid-cell-click`, { detail: { rowKey: key, colKey: ``, rowIndex: idx, colIndex: -1 }, bubbles: true, composed: true }));\n }\n break;\n }\n case ` `: {\n if (this._editing) {\n const col = this.columns.find(c => c.key === this._editing!.colKey);\n if (col?.editor === `boolean`) {\n e.preventDefault();\n const isImmediate = this.editability === `immediate`;\n const rowKey = this._editing.rowKey;\n const colKey = this._editing.colKey;\n // Toggle: use checkbox checked if focused, else flip _editValue / row value\n const active = this.shadowRoot?.activeElement as HTMLInputElement | null;\n let next: boolean;\n if (active?.type === `checkbox`) {\n next = !active.checked;\n active.checked = next;\n } else {\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) as Record<string, unknown> | undefined;\n const cur = this._editValue !== `` ? Boolean(this._editValue) : Boolean(row?.[colKey]);\n next = !cur;\n }\n if (isImmediate) {\n this._commitImmediate(rowKey, colKey, next);\n } else {\n this._editValue = next; this._commitEdit();\n }\n }\n break;\n }\n const key = this._tickled.tickledId;\n if (!key)\n break;\n e.preventDefault();\n if (this.interactionMode === `checked` || this.interactionMode === `sticky` || this.interactionMode === `standard` || this.interactionMode === `vscode` || this.interactionMode === `manual`)\n this._toggleSelection(key);\n else this._replaceSelection(key);\n break;\n }\n case `Escape`: {\n if (this._editing || this._editingRow) {\n e.preventDefault(); this._editing = null; this._editingRow = null; this.requestUpdate();\n } else if (this._selectedKeys.size) {\n e.preventDefault(); const prev = new Set(this._selectedKeys); this._selectedKeys = new Set(); this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(), previous: prev }, bubbles: true, composed: true }));\n }\n break;\n }\n }\n };\n\n private _isEditable(row: unknown, col: DataGridColumn): boolean {\n if (this.editability === `disabled`)\n return false;\n if (typeof this.editable === `function`)\n return (this.editable as (r: unknown, c: DataGridColumn) => boolean)(row, col);\n if (this.editable === true)\n return col.editable !== false;\n return !!col.editable;\n }\n\n private _isTextEditor(col: DataGridColumn): boolean {\n const e = col.editor;\n return !e || e === `text` || e === `number`;\n }\n\n private _isCellEditing(rowKey: string, colKey: string): boolean {\n if (this.editability === `immediate` && this._isEditable(this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) ?? {}, this.columns.find(c => c.key === colKey)!))\n return true;\n if (this._editingRow === rowKey)\n return this._isEditable(this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) ?? {}, this.columns.find(c => c.key === colKey)!);\n return this._editing?.rowKey === rowKey && this._editing?.colKey === colKey;\n }\n\n private _startEdit(rowKey: string, colKey: string): void {\n if (this.editability === `disabled`)\n return;\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey);\n if (!row)\n return;\n const col = this.columns.find(c => c.key === colKey);\n if (!col || !this._isEditable(row, col))\n return;\n this._editing = { rowKey, colKey };\n this._editingRow = null;\n this._editValue = (row as Record<string, unknown>)[colKey];\n }\n\n /** Programmatic: put a single cell in edit mode. Works in manual/user/immediate (no-op if disabled or not editable). */\n startEdit(rowKey: string, colKey: string): void {\n this._startEdit(rowKey, colKey);\n }\n\n /** Programmatic: put all editable cells of a row in edit mode. */\n startRowEdit(rowKey: string): void {\n if (this.editability === `disabled`)\n return;\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey);\n if (!row)\n return;\n this._editing = null;\n this._editingRow = rowKey;\n this.requestUpdate();\n }\n\n stopEdit(): void {\n this._editing = null; this._editingRow = null;\n }\n\n setColumnFormatter(columnKey: string, formatter: ((value: unknown) => unknown) | BuiltInFormatterName | null, options?: BuiltInFormatterOptions): void {\n if (!formatter) {\n this._columnFormatters.delete(columnKey); this.requestUpdate(); return;\n }\n if (typeof formatter === `string`) {\n const digits = options?.digits ?? (formatter === `integer` ? 0 : 2);\n if (formatter === `fixed`)\n this._columnFormatters.set(columnKey, v => typeof v === `number` && Number.isFinite(v) ? v.toFixed(digits) : String(v ?? ``));\n else if (formatter === `percentage`)\n this._columnFormatters.set(columnKey, v => typeof v === `number` && Number.isFinite(v) ? `${v.toFixed(digits)}%` : String(v ?? ``));\n else if (formatter === `integer`)\n this._columnFormatters.set(columnKey, v => typeof v === `number` && Number.isFinite(v) ? Math.round(v).toString() : String(v ?? ``));\n } else {\n this._columnFormatters.set(columnKey, formatter as (value: unknown) => unknown);\n }\n this.requestUpdate();\n }\n\n private _formatValue(value: unknown, col: DataGridColumn, row: unknown): unknown {\n const perCol = this._columnFormatters.get(col.key);\n if (perCol)\n return perCol(value);\n if (col.formatter)\n return col.formatter(value, row, col);\n if (this.globalFormatter)\n return this.globalFormatter(value, col.key, row);\n return value;\n }\n\n private _handleCellSecondClick(rowKey: string, col: DataGridColumn): void {\n if (this.editability !== `user`)\n return;\n const now = Date.now();\n if (this._lastClick && this._lastClick.key === rowKey && this._lastClick.col === col.key && now - this._lastClick.time < 700 && now - this._lastClick.time > 150) {\n this._startEdit(rowKey, col.key);\n this._lastClick = null;\n } else {\n this._lastClick = { key: rowKey, col: col.key, time: now };\n }\n }\n\n private _commitEdit(fromImmediate = false): void {\n // immediate/row-edit: commit uses current _editValue or val; keep simple single-cell path\n if (!this._editing && !fromImmediate)\n return;\n const target = this._editing;\n if (!target)\n return;\n const { rowKey, colKey } = target;\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) as Record<string, unknown> | undefined;\n if (!row) {\n this._editing = null; return;\n }\n const oldValue = row[colKey];\n const newValue = this._editValue;\n const col = this.columns.find(c => c.key === colKey);\n if (col?.editor && typeof col.editor === `function`) {\n // custom factory handles commit itself\n } else {\n row[colKey] = newValue as never;\n this.rows = [...this.rows];\n }\n this._editing = null;\n this.dispatchEvent(new CustomEvent<DataGridCellEditDetail>(`datagrid-cell-edit`, { detail: { rowKey, colKey, oldValue, newValue }, bubbles: true, composed: true }));\n }\n\n private _suppressBlurCommit = false;\n private _tabToNext(rowKey: string, curColKey: string, dir: number): void {\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey);\n if (!row)\n return;\n const cols = this._visibleColumns;\n const curIdx = cols.findIndex(c => c.key === curColKey);\n let next = curIdx + dir;\n while (next >= 0 && next < cols.length) {\n if (this._isEditable(row, cols[next])) {\n // commit current before moving (use _editValue if pending)\n if (this._editing)\n this._commitEdit();\n this._suppressBlurCommit = true;\n this._startEdit(rowKey, cols[next].key);\n requestAnimationFrame(() => {\n this._suppressBlurCommit = false;\n });\n return;\n }\n next += dir;\n }\n if (this._editing)\n this._commitEdit();\n this._editing = null;\n this.requestUpdate();\n }\n\n private _commitImmediate(rowKey: string, colKey: string, value: unknown): void {\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) as Record<string, unknown> | undefined;\n if (!row)\n return;\n const oldValue = row[colKey];\n if (oldValue === value)\n return;\n row[colKey] = value as never;\n this.rows = [...this.rows];\n this.dispatchEvent(new CustomEvent<DataGridCellEditDetail>(`datagrid-cell-edit`, { detail: { rowKey, colKey, oldValue, newValue: value }, bubbles: true, composed: true }));\n }\n\n private _autoSizeColumn(col: DataGridColumn): void {\n const cs = getComputedStyle(this);\n const font = `${cs.fontSize} ${cs.fontFamily}`;\n const canvas = document.createElement(`canvas`);\n const ctx = canvas.getContext(`2d`);\n const cellPad = 32; // 2 * var(--space-s) approx + border\n const headerExtra = 40; // sort icon + reorder handle + resize handle\n const measure = (text: string): number => {\n if (!ctx)\n return text.length * 8;\n ctx.font = font;\n return Math.ceil(ctx.measureText(text).width);\n };\n let maxW = measure(col.label) + headerExtra;\n for (const r of this.rows) {\n const v = (r as Record<string, unknown>)[col.key];\n if (v === null || v === undefined || v === ``)\n continue;\n // For custom renderers we can only estimate from raw value\n const text = String(v);\n const w = measure(text) + cellPad;\n if (w > maxW)\n maxW = w;\n }\n // Also consider rendered text for visible cells (more accurate for formatted values)\n // Measure actual cell widths after render if available\n const min = col.minWidth ?? 40;\n const max = col.maxWidth ?? 600;\n const w = Math.max(min, Math.min(max, maxW));\n col.width = w;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent<DataGridColumnResizeDetail>(`datagrid-column-resize`, { detail: { key: col.key, width: w }, bubbles: true, composed: true }));\n }\n\n private _onResizePointerDown(e: PointerEvent, col: DataGridColumn): void {\n e.preventDefault(); e.stopPropagation();\n const startX = e.clientX;\n const startW = col.width ?? 150;\n const onMove = (ev: PointerEvent): void => {\n const w = Math.max(col.minWidth ?? 40, Math.min(col.maxWidth ?? 600, startW + ev.clientX - startX));\n col.width = w;\n this.requestUpdate();\n };\n const onUp = (ev: PointerEvent): void => {\n window.removeEventListener(`pointermove`, onMove);\n window.removeEventListener(`pointerup`, onUp);\n const w = Math.max(col.minWidth ?? 40, Math.min(col.maxWidth ?? 600, startW + ev.clientX - startX));\n this.dispatchEvent(new CustomEvent<DataGridColumnResizeDetail>(`datagrid-column-resize`, { detail: { key: col.key, width: w }, bubbles: true, composed: true }));\n };\n window.addEventListener(`pointermove`, onMove);\n window.addEventListener(`pointerup`, onUp);\n }\n\n // Public API for stress demo\n getVisibleRange(): { startRow: number; endRow: number; startCol: number; endCol: number } {\n const rh = this.rowHeight;\n const startRow = Math.max(0, Math.floor(this._scrollTop / rh) - 2);\n const endRow = Math.min(this._flat.length, Math.ceil((this._scrollTop + this._viewportH) / rh) + 2);\n const startCol = this._findFirstVisibleCol(this._scrollLeft);\n const endCol = this._findLastVisibleCol(this._scrollLeft + this._viewportW);\n return { startRow, endRow, startCol, endCol };\n }\n\n private _findFirstVisibleCol(scrollLeft: number): number {\n let lo = 0; let hi = this._colOffsets.length - 1; let ans = 0;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (this._colOffsets[mid] <= scrollLeft) {\n ans = mid; lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return ans;\n }\n\n private _findLastVisibleCol(right: number): number {\n for (let i = 0; i < this._colOffsets.length; i++) {\n if (this._colOffsets[i] > right)\n return i;\n }\n return this._colOffsets.length;\n }\n\n protected override render() {\n const rh = this.rowHeight;\n const startRow = Math.max(0, Math.floor(this._scrollTop / rh) - 2);\n const endRow = Math.min(this._flat.length, Math.ceil((this._scrollTop + this._viewportH) / rh) + 2);\n const visibleFlat = this._flat.slice(startRow, endRow);\n const showCheckbox = this.interactionMode === `checked`;\n\n return html`\n <div class=\"grid\" style=\"height:400px\">\n <div class=\"header-bar\">\n <div class=\"header-scroll\">\n ${showCheckbox ? html`<div class=\"header-cell checkbox-col\"></div>` : nothing}\n ${repeat(this._visibleColumns, c => c.key, (col, idx) => html`\n <div class=\"header-cell\" style=\"width:${col.width ?? 150}px\" ?drag-source=${this._drag?.active && this._drag.sourceCol.key === col.key}\n @click=${() => this._onHeaderClick(col)}\n @pointerenter=${() => this._tickled.handlePointerEnter(col.key)}>\n ${col.reorderable !== false\n ? html`<span class=\"reorder-handle\" draggable=\"false\"\n @pointerdown=${(e: PointerEvent) => this._beginHeaderDrag(e, col, idx)}\n >⠿</span>`\n : nothing}\n <span class=\"header-label\">${col.label}</span>\n ${this.sortState?.key === col.key ? html`<span class=\"sort-icon\">${this.sortState.direction === `asc` ? `▲` : `▼`}</span>` : nothing}\n ${col.resizable !== false\n ? html`<span class=\"resize-handle\" @pointerdown=${(e: PointerEvent) => this._onResizePointerDown(e, col)} @click=${(e: MouseEvent) => e.stopPropagation()} @dblclick=${(e: MouseEvent) => {\n e.preventDefault(); e.stopPropagation(); this._autoSizeColumn(col);\n }}></span>`\n : nothing}\n </div>\n `)}\n ${this._drag?.active && this._drag.gap !== undefined\n ? html`<div class=\"drop-caret\" style=\"left:${(() => {\n const gap = this._drag!.gap!;\n if (gap < this._colOffsets.length)\n return this._colOffsets[gap];\n const last = this._colOffsets.length - 1;\n return last >= 0 ? this._colOffsets[last] + (this._visibleColumns[last].width ?? 150) : 0;\n })()}px\"></div>`\n : nothing}\n </div>\n ${this.columnMenu === `none`\n ? nothing\n : html`\n <ixfx-menu-trigger label=\"⚙\" placement=\"bottom-end\" @menu-command=${(e: CustomEvent) => {\n const cmd = (e.detail as { command?: string; checked?: boolean; value?: string }).command;\n const checked = (e.detail as { checked?: boolean }).checked;\n const value = (e.detail as { value?: string }).value;\n if (cmd?.startsWith(`col:`)) {\n const key = cmd.slice(4);\n const col = this.columns.find(c => c.key === key);\n if (col)\n this._onVisibilityToggle(col, !!checked);\n e.stopPropagation();\n return;\n }\n if (cmd === `groupBy`) {\n const v = value ?? ``;\n this.groupBy = v || null;\n this._collapsedGroups = new Set();\n this.dispatchEvent(new CustomEvent<DataGridGroupChangeDetail>(`datagrid-group-change`, { detail: { groupBy: this.groupBy as DataGridGroupBy<unknown> | null }, bubbles: true, composed: true }));\n e.stopPropagation();\n }\n }}>\n <ixfx-menu-container slot=\"menu\">\n <ixfx-menu-header label=\"Columns\"></ixfx-menu-header>\n ${repeat(this.columns, c => c.key, col => html`\n <ixfx-menu-check-item command=\"col:${col.key}\" label=${col.label} ?checked=${col.visible !== false}></ixfx-menu-check-item>\n `)}\n ${this.allowGrouping\n ? html`\n <ixfx-menu-separator></ixfx-menu-separator>\n <ixfx-menu-header label=\"Group by\"></ixfx-menu-header>\n <ixfx-menu-radio-group name=\"groupBy\" value=${typeof this.groupBy === `string` ? this.groupBy : ``}>\n <ixfx-menu-radio-item value=\"\" label=\"None\"></ixfx-menu-radio-item>\n ${this.columns.filter(c => c.groupable !== false && (!this.groupableColumns || this.groupableColumns.includes(c.key))).map(col => html`\n <ixfx-menu-radio-item value=${col.key} label=${col.label}></ixfx-menu-radio-item>\n `)}\n </ixfx-menu-radio-group>\n `\n : nothing}\n </ixfx-menu-container>\n </ixfx-menu-trigger>`}\n </div>\n <div class=\"viewport\" @scroll=${this._onScroll}>\n <div class=\"spacer\" style=\"height:${this._flat.length * rh}px; width:${this._colWidthSum}px\">\n ${repeat(visibleFlat, f => f.key, (entry, i) => {\n const absIdx = startRow + i;\n if (entry.type === `group`) {\n const gKey = entry.key.replace(/^__group__/, ``);\n const collapsed = this._collapsedGroups.has(gKey);\n return html`<div class=\"group-row ${collapsed ? `collapsed` : ``}\" style=\"top:${absIdx * rh}px; height:${rh}px\" @click=${() => this._toggleGroup(gKey)}><span class=\"caret\">▼</span><span>${entry.label}</span><span class=\"count\">(${entry.count})</span><span class=\"divider\"></span></div>`;\n }\n const row = entry.row;\n const absIdx2 = entry.idx;\n const rowKey = entry.key;\n const selected = this._selectedKeys.has(rowKey);\n const tickled = this._tickled.isTickled(rowKey);\n return html`\n <div class=\"row item ${selected ? `selected` : ``} ${tickled ? `tickled` : ``} ${this.#enteringRowKeys.has(rowKey) ? `entering` : ``}\" style=\"top:${absIdx * rh}px; height:${rh}px\"\n data-key=${rowKey}\n @click=${(e: MouseEvent) => {\n this._onRowClick(rowKey, null, e); this.dispatchEvent(new CustomEvent<DataGridCellClickDetail>(`datagrid-cell-click`, { detail: { rowKey, colKey: ``, rowIndex: absIdx2, colIndex: -1 }, bubbles: true, composed: true }));\n }}\n @pointerenter=${() => this._tickled.handlePointerEnter(rowKey)}\n @pointerleave=${() => this._tickled.clearTickled()}\n @dblclick=${() => {\n if (this._visibleColumns[0] && this._isEditable(row, this._visibleColumns[0]))\n this._startEdit(rowKey, this._visibleColumns[0].key);\n }}>\n ${showCheckbox ? html`<div class=\"checkbox-col\"><input type=\"checkbox\" .checked=${selected} @click=${(e: MouseEvent) => this._onCheckboxClick(rowKey, e)} /></div>` : nothing}\n ${repeat(this._visibleColumns, c => c.key, (col) => {\n const val = (row as Record<string, unknown>)[col.key];\n const isEditing = this._isCellEditing(rowKey, col.key);\n if (isEditing) {\n const immediate = this.editability === `immediate` || this._editingRow === rowKey;\n const curVal = immediate ? val : (this._editValue ?? val);\n if (col.editor === `boolean` || (col.editor as string) === `boolean`) {\n return html`<div class=\"cell\" data-col=${col.key} style=\"width:${col.width ?? 150}px;justify-content:center;align-items:center\"><input type=\"checkbox\" .checked=${Boolean(curVal)} @change=${(e: Event) => {\n const v = (e.target as HTMLInputElement).checked;\n if (immediate) {\n this._commitImmediate(rowKey, col.key, v);\n } else {\n this._editValue = v; this._commitEdit();\n }\n }} /></div>`;\n }\n if (col.editor === `select`) {\n const opts = (col.editorOptions ?? []) as ReadonlyArray<string | { value: string; label: string }>;\n return html`<div class=\"cell\" data-col=${col.key} style=\"width:${col.width ?? 150}px\"><select @change=${(e: Event) => {\n const v = (e.target as HTMLSelectElement).value;\n if (immediate) {\n this._commitImmediate(rowKey, col.key, v);\n } else {\n this._editValue = v; this._commitEdit();\n }\n }} @keydown=${(e: KeyboardEvent) => {\n if (e.key === `Tab`) {\n e.preventDefault(); e.stopPropagation(); this._tabToNext(rowKey, col.key, e.shiftKey ? -1 : 1);\n } if (e.key === `Escape`) {\n this._editing = null; this._editingRow = null;\n }\n }} @blur=${() => {\n if (this._suppressBlurCommit)\n return; if (!immediate)\n this._commitEdit();\n }}><option value=\"\"></option>${opts.map((o) => {\n const v = typeof o === `string` ? o : o.value;\n const l = typeof o === `string` ? o : o.label;\n return html`<option value=${v} ?selected=${String(curVal) === v}>${l}</option>`;\n })}</select></div>`;\n }\n if (typeof col.editor === `function`) {\n const factory = col.editor as DataGridEditorFactory;\n const ctx = { row, column: col, rowIndex: absIdx2, colIndex: 0, value: curVal, commit: (v: unknown) => {\n if (immediate) {\n this._commitImmediate(rowKey, col.key, v);\n } else {\n this._editValue = v; this._commitEdit();\n }\n }, cancel: () => {\n this._editing = null; this._editingRow = null;\n } };\n return html`<div class=\"cell\" data-col=${col.key} style=\"width:${col.width ?? 150}px\">${factory(ctx)}</div>`;\n }\n return html`<div class=\"cell\" data-col=${col.key} style=\"width:${col.width ?? 150}px\"><input .value=${String(curVal ?? ``)} @input=${(e: Event) => this._editValue = (e.target as HTMLInputElement).value} @keydown=${(e: KeyboardEvent) => {\n if (e.key === `Enter`)\n this._commitEdit(); if (e.key === `Escape`) {\n this._editing = null; this._editingRow = null;\n } if (e.key === `Tab`) {\n e.preventDefault(); e.stopPropagation(); this._tabToNext(rowKey, col.key, e.shiftKey ? -1 : 1);\n }\n }} @blur=${() => {\n if (this._suppressBlurCommit)\n return; if (!immediate)\n this._commitEdit();\n }} autofocus /></div>`;\n }\n const displayVal = this._formatValue(val, col, row);\n const rendered = col.renderer ? col.renderer(row as never, col as never, absIdx2) : displayVal;\n // renderer may return TemplateResult or primitive; if renderer not used, display formatted\n const cellContent = col.renderer ? rendered : displayVal;\n const editable = this._isEditable(row, col);\n const textEditable = editable && this._isTextEditor(col);\n return html`<div class=\"cell ${textEditable ? `editable-text` : ``}\" data-col=${col.key} style=\"width:${col.width ?? 150}px; justify-content:${col.align === `right` ? `flex-end` : col.align === `center` ? `center` : `flex-start`}\"\n @click=${(e: MouseEvent) => {\n this._lastClickedCell = { rowKey, colKey: col.key }; if (col.selectable !== false) {\n e.stopPropagation(); this._onRowClick(rowKey, col, e); this._handleCellSecondClick(rowKey, col);\n } this.dispatchEvent(new CustomEvent<DataGridCellClickDetail>(`datagrid-cell-click`, { detail: { rowKey, colKey: col.key, rowIndex: absIdx2, colIndex: this.columns.indexOf(col) }, bubbles: true, composed: true }));\n }}\n >${cellContent as unknown as string}</div>`;\n })}\n </div>\n `;\n })}\n </div>\n </div>\n ${this.search.renderField()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap { 'ixfx-data-grid': DataGridElement }\n}\nexport interface DataGridElement {\n addEventListener: (<K extends keyof DataGridElementEventMap>(type: K, listener: (this: DataGridElement, event: DataGridElementEventMap[K]) => void, options?: boolean | AddEventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) => void);\n removeEventListener: (<K extends keyof DataGridElementEventMap>(type: K, listener: (this: DataGridElement, event: DataGridElementEventMap[K]) => void, options?: boolean | EventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions) => void);\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import "./icon-CDGprSdE.js";
|
|
2
2
|
import { r as IDataProvider } from "./data-provider-BAn_-oR1.js";
|
|
3
|
+
import { y as ListSearchController } from "./index-CBS4z1v-.js";
|
|
3
4
|
import { i as ListInteractionMode, l as ListSelectionMode, r as ListElementEventMap } from "./list-selection-types-B5ioL-dG.js";
|
|
4
|
-
import { n as CustomCheckboxOptions, t as AddItemOptions } from "./vertical-list-
|
|
5
|
+
import { n as CustomCheckboxOptions, t as AddItemOptions } from "./vertical-list-DwtCPy1b.js";
|
|
5
6
|
import { LitElement, PropertyValues } from "lit";
|
|
6
|
-
import { CommandId } from "@clinth/ui-commands";
|
|
7
|
+
import { CommandId, CommandRegistry } from "@clinth/ui-commands";
|
|
7
8
|
//#region src/detail-list/types.d.ts
|
|
8
9
|
/** Sort direction applied to the item columns. */
|
|
9
10
|
type DetailSortMode = `none` | `ascending` | `descending`;
|
|
@@ -58,12 +59,19 @@ declare class DetailListElement extends LitElement {
|
|
|
58
59
|
itemWrap: `stop` | `wrap`;
|
|
59
60
|
/** Optional renderer for the checkbox shown in `checked` interactionMode. */
|
|
60
61
|
checkboxRenderer: ((checked: boolean) => unknown) | CustomCheckboxOptions | undefined;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
/**
|
|
63
|
+
* Space-separated subset of `navigate select filter` — limits which
|
|
64
|
+
* incremental-search modes are offered. Unset ⇒ all three; empty ⇒ search
|
|
65
|
+
* disabled. See `docs/infra-incremental.md`.
|
|
66
|
+
*/
|
|
67
|
+
searchModes: string | undefined;
|
|
64
68
|
private _listEl;
|
|
65
69
|
private readonly selection;
|
|
66
70
|
private tickled;
|
|
71
|
+
/** Incremental search (navigate / select / filter). See `docs/infra-incremental.md`. */
|
|
72
|
+
readonly search: ListSearchController<Element>;
|
|
73
|
+
/** Command registry carrying this list's `list.search.*` commands. */
|
|
74
|
+
get registry(): CommandRegistry<unknown> | undefined;
|
|
67
75
|
connectedCallback(): void;
|
|
68
76
|
disconnectedCallback(): void;
|
|
69
77
|
firstUpdated(): void;
|
|
@@ -97,8 +105,12 @@ declare class DetailListElement extends LitElement {
|
|
|
97
105
|
* provider. Returns `undefined` for declarative / programmatic elements.
|
|
98
106
|
*/
|
|
99
107
|
getItemData(item: HTMLLIElement): unknown;
|
|
100
|
-
/**
|
|
101
|
-
|
|
108
|
+
/**
|
|
109
|
+
* Dispatch a command to this list — used by `ixfx-grouped-item-lister` to
|
|
110
|
+
* forward commands. Routes through the command registry (so `list.search.*`
|
|
111
|
+
* and any other registered commands work).
|
|
112
|
+
*/
|
|
113
|
+
dispatch(commandId: CommandId, args?: Record<string, unknown>): void;
|
|
102
114
|
select(item: Element): void;
|
|
103
115
|
selectMany(items: Iterable<Element>): void;
|
|
104
116
|
deselect(item: Element): void;
|
|
@@ -142,8 +154,6 @@ declare class DetailListElement extends LitElement {
|
|
|
142
154
|
private _createCustomCheckbox;
|
|
143
155
|
private _findListItem;
|
|
144
156
|
private _dispatch;
|
|
145
|
-
private _openSearch;
|
|
146
|
-
private _closeSearch;
|
|
147
157
|
private _onPointerOver;
|
|
148
158
|
private _onPointerLeave;
|
|
149
159
|
private _onKeyDown;
|
|
@@ -151,8 +161,6 @@ declare class DetailListElement extends LitElement {
|
|
|
151
161
|
private _onDblClick;
|
|
152
162
|
private _onWheel;
|
|
153
163
|
private _activateItem;
|
|
154
|
-
private _onSearchInput;
|
|
155
|
-
private _onSearchKeydown;
|
|
156
164
|
static styles: import("lit").CSSResult[];
|
|
157
165
|
render(): import("lit").TemplateResult<1>;
|
|
158
166
|
}
|
|
@@ -164,4 +172,4 @@ declare global {
|
|
|
164
172
|
}
|
|
165
173
|
//#endregion
|
|
166
174
|
export { DetailSortMode as a, DetailSortItem as i, DetailFormatter as n, DetailSortComparator as r, DetailListElement as t };
|
|
167
|
-
//# sourceMappingURL=detail-list-
|
|
175
|
+
//# sourceMappingURL=detail-list-BS5dRDda.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail-list-BS5dRDda.d.ts","names":[],"sources":["../src/detail-list/types.ts","../src/detail-list/detail-list.ts"],"mappings":";;;;;;;;;KACY;;KAGA;WACD,SAAS;WACT;WACA;;;KAIC,wBAAwB,GAAG,gBAAgB,GAAG;;KAG9C,mBAAmB,eAAe,2BAA2B;;;;;;;;;;;;;;;;;;;;cC4D5D,0BAA0B;;EAErC,eAAe;EAGf,iBAAiB;EAGjB,MAAM;EAGN;EAGA,gBAAgB;EAGhB;EAGA,UAAU;EAGV;EAGA,WAAW;EAGX;EAGA;EAGA,mBAAmB,IAAI;;;;;;EAQvB;;EAIA,oBAAoB,gCAAgC;;;;;;EAQpD;UAGQ;mBAeS;UAeT;;WAeC,QAAM,qBAAA;;MAYX,YAAY;EAoBP;EA4DA;EAiBA;EAQA,QAAQ,SAAS;;MAqCtB,gBAAgB;;MAKhB,iBAAiB,YAAY;;;;;;EASjC;EAIA,QAAQ,MAAM,kBAAkB,UAAU;;;;;EAuB1C,WAAW,MAAM,UAAU;;EAW3B,YAAY,OAAO,SAAS,WAAW;EAIvC;;;;;EAYA,SAAS,gBAAgB;;;;;EAgBzB,YAAY,MAAM;;;;;;EASlB,SAAS,WAAW,WAAW,OAAO;EAItC,OAAO,MAAM;EAIb,WAAW,OAAO,SAAS;EAI3B,SAAS,MAAM;EAIf;EAIA;;MAQI,gBAAgB;;MAKhB;;EAMJ,WAAW,MAAM;;EAKjB,gBAAgB,MAAM;;EAKtB,mBAAmB,MAAM;;EAKzB,SAAS;EAgBP,eAAe,0CAA0C,UAAU;UAoa7D;;;;;;;;;EAkBF,kBAAkB;UAwBhB;UAMA;UAgCA;UAiBA;;;;;;;UA2DA;;UAoBA;UAcA;UAYA;UAUA;UAMA;UAIA;UA4EA;UASA;UAMA;UAKA;SAUQ,sBAAM;EA6Hb,wBAAM;;QAmBT;YACI;IACR,oBAAoB;;YAGZ,4BAA4B"}
|
package/dist/detail-list.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { n as CustomCheckboxOptions, t as AddItemOptions } from "./vertical-list-
|
|
2
|
-
import { a as DetailSortMode, i as DetailSortItem, n as DetailFormatter, r as DetailSortComparator, t as DetailListElement } from "./detail-list-
|
|
1
|
+
import { n as CustomCheckboxOptions, t as AddItemOptions } from "./vertical-list-DwtCPy1b.js";
|
|
2
|
+
import { a as DetailSortMode, i as DetailSortItem, n as DetailFormatter, r as DetailSortComparator, t as DetailListElement } from "./detail-list-BS5dRDda.js";
|
|
3
3
|
export { type AddItemOptions, type CustomCheckboxOptions, type DetailFormatter, DetailListElement, type DetailSortComparator, type DetailSortItem, type DetailSortMode };
|