@ixfx/components 0.7.3 → 0.7.4

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.
Files changed (121) hide show
  1. package/bundle/index.d.ts +727 -256
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +2046 -35
  4. package/bundle/index.js.map +1 -1
  5. package/dist/ac-text.d.ts +1 -1
  6. package/dist/ac-text.js +1 -1
  7. package/dist/{ac-token-TCLAZeVg.d.ts → ac-token--_vCHXWw.d.ts} +2 -2
  8. package/dist/{ac-token-TCLAZeVg.d.ts.map → ac-token--_vCHXWw.d.ts.map} +1 -1
  9. package/dist/ac-token.d.ts +1 -1
  10. package/dist/ac-token.js +1 -1
  11. package/dist/button.d.ts +1 -1
  12. package/dist/button.d.ts.map +1 -1
  13. package/dist/colour-picker.d.ts +1 -1
  14. package/dist/crumbs.d.ts +1 -1
  15. package/dist/crumbs.js +3 -3
  16. package/dist/{data-grid-Db4QpnII.d.ts → data-grid-BddUjAti.d.ts} +34 -2
  17. package/dist/data-grid-BddUjAti.d.ts.map +1 -0
  18. package/dist/data-grid.d.ts +1 -1
  19. package/dist/data-grid.js +180 -7
  20. package/dist/data-grid.js.map +1 -1
  21. package/dist/detail-list-Br0WAnry.d.ts +167 -0
  22. package/dist/detail-list-Br0WAnry.d.ts.map +1 -0
  23. package/dist/detail-list.d.ts +3 -0
  24. package/dist/detail-list.js +1115 -0
  25. package/dist/detail-list.js.map +1 -0
  26. package/dist/grid-list-B_orPsot.d.ts +304 -0
  27. package/dist/grid-list-B_orPsot.d.ts.map +1 -0
  28. package/dist/grid-list.d.ts +3 -0
  29. package/dist/grid-list.js +933 -0
  30. package/dist/grid-list.js.map +1 -0
  31. package/dist/{grouped-item-lister-BWlC9S4e.d.ts → grouped-item-lister-fdZHVxFM.d.ts} +3 -3
  32. package/dist/{grouped-item-lister-BWlC9S4e.d.ts.map → grouped-item-lister-fdZHVxFM.d.ts.map} +1 -1
  33. package/dist/grouped-item-lister.d.ts +1 -1
  34. package/dist/{icon-DR_3rSyZ.d.ts → icon-CDGprSdE.d.ts} +2 -2
  35. package/dist/icon-CDGprSdE.d.ts.map +1 -0
  36. package/dist/icons.d.ts +2 -2
  37. package/dist/{index-C59-JEPl.d.ts → index-9AhaHIT2.d.ts} +3 -3
  38. package/dist/{index-C59-JEPl.d.ts.map → index-9AhaHIT2.d.ts.map} +1 -1
  39. package/dist/{index-DsjpDksO.d.ts → index-CS9yM8L-.d.ts} +2 -2
  40. package/dist/{index-DsjpDksO.d.ts.map → index-CS9yM8L-.d.ts.map} +1 -1
  41. package/dist/{index-BUB5SICW.d.ts → index-CoqtMSd9.d.ts} +2 -2
  42. package/dist/{index-BUB5SICW.d.ts.map → index-CoqtMSd9.d.ts.map} +1 -1
  43. package/dist/{index-CJ5fshD3.d.ts → index-UvnoZUAo.d.ts} +2 -2
  44. package/dist/{index-CJ5fshD3.d.ts.map → index-UvnoZUAo.d.ts.map} +1 -1
  45. package/dist/{index-BOUaDIW-.d.ts → index-tq6f8007.d.ts} +2 -2
  46. package/dist/{index-BOUaDIW-.d.ts.map → index-tq6f8007.d.ts.map} +1 -1
  47. package/dist/index.d.ts +185 -240
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +375 -1002
  50. package/dist/index.js.map +1 -1
  51. package/dist/interaction-Cr13azbM.js +3 -0
  52. package/dist/{labelled-input-base-Dp_9KP0G.d.ts → labelled-input-base-DiTme1JO.d.ts} +2 -2
  53. package/dist/{labelled-input-base-Dp_9KP0G.d.ts.map → labelled-input-base-DiTme1JO.d.ts.map} +1 -1
  54. package/dist/labelled-radial-input.d.ts +2 -2
  55. package/dist/labelled-radial-input.d.ts.map +1 -1
  56. package/dist/labelled-range-input.d.ts +1 -1
  57. package/dist/labelled-slider-input.d.ts +1 -1
  58. package/dist/list-item-animation-DuiwgN3l.js +112 -0
  59. package/dist/list-item-animation-DuiwgN3l.js.map +1 -0
  60. package/dist/list-selection-controller-CUo-Hhcm.js +338 -0
  61. package/dist/list-selection-controller-CUo-Hhcm.js.map +1 -0
  62. package/dist/{list-selection-types-DSuRNWpx.d.ts → list-selection-types-B5ioL-dG.d.ts} +6 -1
  63. package/dist/list-selection-types-B5ioL-dG.d.ts.map +1 -0
  64. package/dist/{menu-DMzjkVnK.js → menu-Bg90Qr0B.js} +3 -3
  65. package/dist/{menu-DMzjkVnK.js.map → menu-Bg90Qr0B.js.map} +1 -1
  66. package/dist/{menu-item-D2S4i8u1.js → menu-item-Bx-Fs7jq.js} +3 -3
  67. package/dist/{menu-item-D2S4i8u1.js.map → menu-item-Bx-Fs7jq.js.map} +1 -1
  68. package/dist/{menu-item-ZmkXNjek.d.ts → menu-item-CZi9vy5O.d.ts} +2 -2
  69. package/dist/{menu-item-ZmkXNjek.d.ts.map → menu-item-CZi9vy5O.d.ts.map} +1 -1
  70. package/dist/menu.d.ts +2 -2
  71. package/dist/menu.js +2 -2
  72. package/dist/miller.d.ts +1 -1
  73. package/dist/miller.js +2 -2
  74. package/dist/narrowed-text.js +2 -2
  75. package/dist/panel.d.ts +1 -1
  76. package/dist/plots.js +1 -1
  77. package/dist/select-horiz.js +2 -2
  78. package/dist/{split-layout-C5SYbDrq.d.ts → split-layout-JK3xWVX2.d.ts} +2 -2
  79. package/dist/{split-layout-C5SYbDrq.d.ts.map → split-layout-JK3xWVX2.d.ts.map} +1 -1
  80. package/dist/split-layout.d.ts +1 -1
  81. package/dist/{tab-list-DbMIL520.d.ts → tab-list-CGyPt07Z.d.ts} +2 -2
  82. package/dist/{tab-list-DbMIL520.d.ts.map → tab-list-CGyPt07Z.d.ts.map} +1 -1
  83. package/dist/tabs.d.ts +1 -1
  84. package/dist/{tickled-controller-Ds1DMyG7.d.ts → tickled-controller-Bn3YdQsM.d.ts} +12 -1
  85. package/dist/{tickled-controller-Ds1DMyG7.d.ts.map → tickled-controller-Bn3YdQsM.d.ts.map} +1 -1
  86. package/dist/{tickled-controller-h9GmJ_bU.js → tickled-controller-C66DgJHl.js} +16 -1
  87. package/dist/tickled-controller-C66DgJHl.js.map +1 -0
  88. package/dist/{titlebar-B23MrIbI.d.ts → titlebar-Bj5pfdw_.d.ts} +2 -2
  89. package/dist/{titlebar-B23MrIbI.d.ts.map → titlebar-Bj5pfdw_.d.ts.map} +1 -1
  90. package/dist/titlebar.d.ts +1 -1
  91. package/dist/{tree-Ch4W8qXQ.js → tree-B74zdI60.js} +116 -17
  92. package/dist/tree-B74zdI60.js.map +1 -0
  93. package/dist/tree.d.ts +6 -3
  94. package/dist/tree.d.ts.map +1 -1
  95. package/dist/tree.js +1 -1
  96. package/dist/vertical-list-CQSEVeOT.d.ts +140 -0
  97. package/dist/vertical-list-CQSEVeOT.d.ts.map +1 -0
  98. package/dist/vertical-list.d.ts +3 -121
  99. package/dist/vertical-list.js +710 -1
  100. package/dist/vertical-list.js.map +1 -0
  101. package/dist/{xy-axis-DWizs0bt.js → xy-axis-VrX8dmvS.js} +2 -2
  102. package/dist/{xy-axis-DWizs0bt.js.map → xy-axis-VrX8dmvS.js.map} +1 -1
  103. package/docs-user/README.md +1 -0
  104. package/docs-user/data-grid.md +51 -2
  105. package/docs-user/detail-list.md +38 -0
  106. package/docs-user/grid-list.md +274 -0
  107. package/docs-user/index.json +7 -2
  108. package/docs-user/llms.txt +1 -0
  109. package/docs-user/tree.md +13 -0
  110. package/docs-user/vertical-list.md +51 -1
  111. package/llms.txt +1 -0
  112. package/package.json +17 -2
  113. package/dist/data-grid-Db4QpnII.d.ts.map +0 -1
  114. package/dist/icon-DR_3rSyZ.d.ts.map +0 -1
  115. package/dist/interaction-D5XdKzbR.js +0 -2
  116. package/dist/list-selection-types-DSuRNWpx.d.ts.map +0 -1
  117. package/dist/tickled-controller-h9GmJ_bU.js.map +0 -1
  118. package/dist/tree-Ch4W8qXQ.js.map +0 -1
  119. package/dist/vertical-list-B4w_ksJk.js +0 -814
  120. package/dist/vertical-list-B4w_ksJk.js.map +0 -1
  121. package/dist/vertical-list.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"data-grid.js","names":["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, 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 { 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, 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 .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 @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 private _visibleColumns: DataGridColumn[] = [];\n private _colOffsets: number[] = [];\n private _colWidthSum = 0;\n private _raf = 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 }\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(`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 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 }\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 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 <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` : ``}\" 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":["#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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"}
@@ -0,0 +1,167 @@
1
+ import "./icon-CDGprSdE.js";
2
+ import { r as IDataProvider } from "./data-provider-BAn_-oR1.js";
3
+ 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-CQSEVeOT.js";
5
+ import { LitElement, PropertyValues } from "lit";
6
+ import { CommandId } from "@clinth/ui-commands";
7
+ //#region src/detail-list/types.d.ts
8
+ /** Sort direction applied to the item columns. */
9
+ type DetailSortMode = `none` | `ascending` | `descending`;
10
+ /** Per-item view of a row passed to `sortComparator`. */
11
+ type DetailSortItem = {
12
+ readonly element: HTMLElement;
13
+ readonly data: unknown;
14
+ readonly label: string;
15
+ };
16
+ /** Custom comparator — return negative when `a` sorts before `b`. */
17
+ type DetailSortComparator = (a: DetailSortItem, b: DetailSortItem) => number;
18
+ /** Turns one object item into row content — a plain string or a DOM node. */
19
+ type DetailFormatter = (item: unknown, index: number) => string | Node;
20
+ //#endregion
21
+ //#region src/detail-list/detail-list.d.ts
22
+ /**
23
+ * A list that scales horizontally, not vertically.
24
+ *
25
+ * Items are laid out in equal-width columns; they flow top→bottom down a
26
+ * column, then wrap to the top of the next column to the right. The
27
+ * component has a fixed vertical extent and scrolls horizontally.
28
+ *
29
+ * Selection semantics match `ixfx-vertical-list` — same modes, same
30
+ * `list-*` events, same keyboard gestures — but navigation is a 2-D grid
31
+ * (Up/Down move within a column, Left/Right jump columns).
32
+ *
33
+ * Items come from any of three sources (later writes win):
34
+ * 1. declarative `<li>` children in light DOM,
35
+ * 2. `addItem()` / `setItems()`,
36
+ * 3. an `items` array of objects rendered via `displayProperty` /
37
+ * `formatter`, optionally streamed in via a `provider`.
38
+ */
39
+ declare class DetailListElement extends LitElement {
40
+ #private;
41
+ selectionMode: ListSelectionMode;
42
+ interactionMode: ListInteractionMode;
43
+ sort: DetailSortMode;
44
+ sortBy: string;
45
+ sortComparator: DetailSortComparator | undefined;
46
+ items: readonly unknown[];
47
+ provider: IDataProvider<void, unknown> | undefined;
48
+ displayProperty: string;
49
+ formatter: DetailFormatter | undefined;
50
+ iconProperty: string;
51
+ keyProperty: string;
52
+ filterPredicate: ((el: Element) => boolean) | undefined;
53
+ /**
54
+ * Whether keyboard navigation wraps from last to first and vice versa.
55
+ * - 'stop' (default): navigation stops at the boundary
56
+ * - 'wrap': navigation wraps around
57
+ */
58
+ itemWrap: `stop` | `wrap`;
59
+ /** Optional renderer for the checkbox shown in `checked` interactionMode. */
60
+ checkboxRenderer: ((checked: boolean) => unknown) | CustomCheckboxOptions | undefined;
61
+ private _searchVisible;
62
+ private _searchQuery;
63
+ private _searchInputEl;
64
+ private _listEl;
65
+ private readonly selection;
66
+ private tickled;
67
+ connectedCallback(): void;
68
+ disconnectedCallback(): void;
69
+ firstUpdated(): void;
70
+ updated(changed: PropertyValues): void;
71
+ /** The most recently selected item, or `undefined` if nothing is selected. */
72
+ get selectedItem(): Element | undefined;
73
+ /** The full current selection set (read-only). */
74
+ get selectedItems(): ReadonlySet<Element>;
75
+ /**
76
+ * Force an immediate geometry recompute. Called automatically on resize,
77
+ * DOM changes, sort/filter/search changes — only needed when layout is
78
+ * changed by outside forces (e.g. an external font load).
79
+ */
80
+ refreshLayout(): void;
81
+ addItem(item: Element | string, options?: AddItemOptions): void;
82
+ /**
83
+ * Collapse + fade `item` out, then detach it; the rows after it slide up to
84
+ * close the gap. Resolves once removed. Immediate under reduced motion.
85
+ */
86
+ removeItem(item: Element): Promise<void>;
87
+ /** {@link removeItem} for several items at once. */
88
+ removeItems(items: Iterable<Element>): Promise<void>;
89
+ clearItems(): void;
90
+ /**
91
+ * Replace the entire item list in one call.
92
+ * Equivalent to `clearItems()` followed by `addItem()` for each element.
93
+ */
94
+ setItems(items: readonly Element[]): void;
95
+ /**
96
+ * Get the source object behind an `<li>` built from an `items` array or
97
+ * provider. Returns `undefined` for declarative / programmatic elements.
98
+ */
99
+ getItemData(item: HTMLLIElement): unknown;
100
+ /** Dispatch a command to this list. No-op by default (grouped-lister parity). */
101
+ dispatch(_commandId: CommandId, _args?: Record<string, unknown>): void;
102
+ select(item: Element): void;
103
+ selectMany(items: Iterable<Element>): void;
104
+ deselect(item: Element): void;
105
+ clearSelection(): void;
106
+ selectAll(): void;
107
+ /** The selection as stable `data-key` / `data-value` strings. */
108
+ get selectedKeys(): ReadonlySet<string>;
109
+ /** The key of the item under the cursor, or `undefined`. */
110
+ get tickledKey(): string | undefined;
111
+ /** Replace the selection with the items carrying these keys (unknown keys ignored). */
112
+ selectKeys(keys: Iterable<string>): void;
113
+ /** Add items by key to the selection (multi-select modes only). */
114
+ addSelectedKeys(keys: Iterable<string>): void;
115
+ /** Remove items by key from the selection. */
116
+ removeSelectedKeys(keys: Iterable<string>): void;
117
+ /** Move the cursor to the item with this key and scroll it into view. */
118
+ focusKey(key: string): void;
119
+ selectedFilter(kind: `selected` | `checked` | `either`): Generator<Element>;
120
+ private _getVisibleItems;
121
+ /**
122
+ * Set the column width to fit the widest visible item.
123
+ *
124
+ * This is opt-in; detail lists continue to use `--detail-list-column-width`
125
+ * (or its 220px fallback) until this method is called. The measured value is
126
+ * set directly on this element, so it takes precedence over an inherited
127
+ * value. Returns the applied width in pixels, or 0 when there are no items.
128
+ */
129
+ fitColumnWidth(): Promise<number>;
130
+ private _isCheckable;
131
+ private _setLabel;
132
+ private _syncItemStates;
133
+ private _syncCheckboxes;
134
+ /**
135
+ * Native checkbox cell: a span that stretches to the row's full cross-axis
136
+ * (so the entire column height is a click target) with a real `<input>`
137
+ * centred inside. The span owns the click; the input is purely visual and
138
+ * has `pointer-events:none` so a single click produces one toggle.
139
+ */
140
+ private _createNativeCheckboxCell;
141
+ /** Custom checkbox cell: same shape as the native cell; renderer content inside. */
142
+ private _createCustomCheckbox;
143
+ private _findListItem;
144
+ private _dispatch;
145
+ private _openSearch;
146
+ private _closeSearch;
147
+ private _onPointerOver;
148
+ private _onPointerLeave;
149
+ private _onKeyDown;
150
+ private _onClick;
151
+ private _onDblClick;
152
+ private _onWheel;
153
+ private _activateItem;
154
+ private _onSearchInput;
155
+ private _onSearchKeydown;
156
+ static styles: import("lit").CSSResult[];
157
+ render(): import("lit").TemplateResult<1>;
158
+ }
159
+ declare global {
160
+ interface HTMLElementTagNameMap {
161
+ 'ixfx-detail-list': DetailListElement;
162
+ }
163
+ interface HTMLElementEventMap extends ListElementEventMap {}
164
+ }
165
+ //#endregion
166
+ export { DetailSortMode as a, DetailSortItem as i, DetailFormatter as n, DetailSortComparator as r, DetailListElement as t };
167
+ //# sourceMappingURL=detail-list-Br0WAnry.d.ts.map