@ixfx/components 0.8.6 → 0.8.8

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 (76) hide show
  1. package/bundle/index.d.ts +570 -389
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +1033 -200
  4. package/bundle/index.js.map +1 -1
  5. package/dist/crumbs.d.ts +1 -1
  6. package/dist/crumbs.js +2 -2
  7. package/dist/{data-grid-D-z7bx5-.d.ts → data-grid-BKa9i86q.d.ts} +15 -2
  8. package/dist/data-grid-BKa9i86q.d.ts.map +1 -0
  9. package/dist/data-grid.d.ts +3 -2
  10. package/dist/data-grid.js +95 -5
  11. package/dist/data-grid.js.map +1 -1
  12. package/dist/{detail-list-_ZJHYEBr.d.ts → detail-list-CHTomlbR.d.ts} +22 -5
  13. package/dist/detail-list-CHTomlbR.d.ts.map +1 -0
  14. package/dist/detail-list.d.ts +4 -3
  15. package/dist/detail-list.js +103 -3
  16. package/dist/detail-list.js.map +1 -1
  17. package/dist/{grid-list-j5C7qtlG.js → grid-list-C8oMxLl-.js} +77 -164
  18. package/dist/grid-list-C8oMxLl-.js.map +1 -0
  19. package/dist/{grid-list-x550wJ0X.d.ts → grid-list-CsZcXxMC.d.ts} +259 -109
  20. package/dist/grid-list-CsZcXxMC.d.ts.map +1 -0
  21. package/dist/grid-list.d.ts +3 -2
  22. package/dist/grid-list.js +1 -1
  23. package/dist/incr-search.d.ts +1 -1
  24. package/dist/{index-h6gxtfHH.d.ts → index-Dgrx-DIA.d.ts} +2 -2
  25. package/dist/{index-h6gxtfHH.d.ts.map → index-Dgrx-DIA.d.ts.map} +1 -1
  26. package/dist/index.d.ts +190 -252
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +8 -7
  29. package/dist/index.js.map +1 -1
  30. package/dist/{interaction-B9AAlsFO.js → interaction-BskmlA9t.js} +1 -1
  31. package/dist/list-drag-types-kpaXz2pZ.d.ts +42 -0
  32. package/dist/list-drag-types-kpaXz2pZ.d.ts.map +1 -0
  33. package/dist/{list-item-animation-DuiwgN3l.js → list-item-animation-BUoEKi5s.js} +29 -10
  34. package/dist/list-item-animation-BUoEKi5s.js.map +1 -0
  35. package/dist/list-native-drag-controller-DrY3qeJM.js +555 -0
  36. package/dist/list-native-drag-controller-DrY3qeJM.js.map +1 -0
  37. package/dist/{menu-HMoxCPY2.js → menu-CMXhIaNZ.js} +3 -3
  38. package/dist/{menu-HMoxCPY2.js.map → menu-CMXhIaNZ.js.map} +1 -1
  39. package/dist/{menu-item-BQDYxk5A.js → menu-item-BYGQzyCe.js} +2 -2
  40. package/dist/{menu-item-BQDYxk5A.js.map → menu-item-BYGQzyCe.js.map} +1 -1
  41. package/dist/menu.js +2 -2
  42. package/dist/miller.d.ts +2 -2
  43. package/dist/miller.js +1 -1
  44. package/dist/narrowed-text.js +1 -1
  45. package/dist/select-horiz.js +1 -1
  46. package/dist/{tree-DTQon838.js → tree-DSMn566I.js} +90 -27
  47. package/dist/tree-DSMn566I.js.map +1 -0
  48. package/dist/{tree-component-F6qZ0Gdv.d.ts → tree-component-nPP5Y-WS.d.ts} +12 -2
  49. package/dist/tree-component-nPP5Y-WS.d.ts.map +1 -0
  50. package/dist/tree.d.ts +3 -2
  51. package/dist/tree.d.ts.map +1 -1
  52. package/dist/tree.js +1 -1
  53. package/dist/{vertical-list-CFuFDygi.d.ts → vertical-list-A6oWfivZ.d.ts} +21 -4
  54. package/dist/vertical-list-A6oWfivZ.d.ts.map +1 -0
  55. package/dist/vertical-list.d.ts +3 -2
  56. package/dist/vertical-list.js +103 -3
  57. package/dist/vertical-list.js.map +1 -1
  58. package/docs-user/README.md +1 -0
  59. package/docs-user/data-grid.md +30 -0
  60. package/docs-user/data-table.md +104 -0
  61. package/docs-user/detail-list.md +29 -0
  62. package/docs-user/grid-list.md +34 -4
  63. package/docs-user/index.json +7 -2
  64. package/docs-user/llms.txt +1 -0
  65. package/docs-user/tree.md +5 -4
  66. package/docs-user/vertical-list.md +30 -1
  67. package/llms.txt +1 -0
  68. package/package.json +1 -1
  69. package/dist/data-grid-D-z7bx5-.d.ts.map +0 -1
  70. package/dist/detail-list-_ZJHYEBr.d.ts.map +0 -1
  71. package/dist/grid-list-j5C7qtlG.js.map +0 -1
  72. package/dist/grid-list-x550wJ0X.d.ts.map +0 -1
  73. package/dist/list-item-animation-DuiwgN3l.js.map +0 -1
  74. package/dist/tree-DTQon838.js.map +0 -1
  75. package/dist/tree-component-F6qZ0Gdv.d.ts.map +0 -1
  76. package/dist/vertical-list-CFuFDygi.d.ts.map +0 -1
@@ -4,8 +4,9 @@ import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js"
4
4
  import "./icon-Dy33gu4Z.js";
5
5
  import { t as DataController } from "./data-controller-DOlmqNKb.js";
6
6
  import { c as createElementListSearchAdapter, i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, u as keyForElement } from "./incr-search-C05WjbZh.js";
7
+ import { t as ListNativeDragController } from "./list-native-drag-controller-DrY3qeJM.js";
7
8
  import { r as ListDragSelectController, t as ListSelectionController } from "./list-selection-controller-SA4piSBi.js";
8
- import { n as animateListItemIn, r as animateListItemOut } from "./list-item-animation-DuiwgN3l.js";
9
+ import { n as animateListItemIn, r as animateListItemOut } from "./list-item-animation-BUoEKi5s.js";
9
10
  import { t as scrollFadeStyles } from "./scroll-fade-CAs1EabA.js";
10
11
  import { LitElement, css, html, nothing, render } from "lit";
11
12
  import { property, query } from "lit/decorators.js";
@@ -26,6 +27,7 @@ let DetailListElement = class DetailListElement extends LitElement {
26
27
  this.iconProperty = ``;
27
28
  this.keyProperty = ``;
28
29
  this.itemWrap = `stop`;
30
+ this.itemsDraggable = false;
29
31
  this.#itemData = /* @__PURE__ */ new WeakMap();
30
32
  this.#grid = [];
31
33
  this.#positions = /* @__PURE__ */ new Map();
@@ -61,7 +63,41 @@ let DetailListElement = class DetailListElement extends LitElement {
61
63
  },
62
64
  onStateChange: () => this._syncItemStates(),
63
65
  itemWrap: this.itemWrap,
64
- hoverDisabled: () => this.#dragSelect.isDragging
66
+ hoverDisabled: () => this.#dragSelect.isDragging || this.#nativeDrag.isDragging
67
+ });
68
+ this.#nativeDragging = false;
69
+ this.#postDragSuppressTimer = 0;
70
+ this.#nativeDrag = new ListNativeDragController(this, {
71
+ source: `detail-list`,
72
+ isEnabled: () => this.itemsDraggable && this.selectionMode !== `none` && this._getVisibleItems().length > 0,
73
+ resolveEventToKey: (target) => {
74
+ if (!(target instanceof Element)) return void 0;
75
+ const li = target.closest?.(`li`);
76
+ if (!li || !this.contains(li)) return void 0;
77
+ return keyForElement(li);
78
+ },
79
+ prepareSelection: (originKey) => this.#prepareNativeDrag(originKey),
80
+ getMetrics: () => ({}),
81
+ getRenderer: () => this.dragPreviewRenderer,
82
+ dispatch: (detail) => this._dispatchCancelable(`list-native-drag-start`, detail),
83
+ onActiveChange: (active, originKey) => {
84
+ this.#nativeDragging = active;
85
+ this.toggleAttribute(`data-native-dragging`, active);
86
+ for (const el of this.querySelectorAll(`li`)) el.toggleAttribute(`data-drag-origin`, active && originKey !== void 0 && keyForElement(el) === originKey);
87
+ if (active) {
88
+ const count = this.selection.selected.size;
89
+ this.setAttribute(`aria-label`, count <= 1 ? `Dragging 1 item` : `Dragging ${count} items`);
90
+ } else this.removeAttribute(`aria-label`);
91
+ this.requestUpdate();
92
+ },
93
+ onEnd: () => {
94
+ this.#nativeDragging = false;
95
+ this.toggleAttribute(`data-native-dragging`, false);
96
+ this.removeAttribute(`aria-label`);
97
+ for (const el of this.querySelectorAll(`li`)) el.removeAttribute(`data-drag-origin`);
98
+ this.#startPostDragSuppressTimer();
99
+ },
100
+ syncLightDomDraggable: () => this._syncNativeDraggable()
65
101
  });
66
102
  this.#dragSelect = new ListDragSelectController(this, {
67
103
  getSurface: () => this.renderRoot.querySelector(`.container`),
@@ -158,7 +194,7 @@ let DetailListElement = class DetailListElement extends LitElement {
158
194
  }
159
195
  };
160
196
  this._onClick = (e) => {
161
- if (this.#dragSelect.isDragging) return;
197
+ if (this.#dragSelect.isDragging || this.#nativeDrag.isDragging || this.#postDragSuppressTimer !== 0) return;
162
198
  const item = this._findListItem(e.composedPath());
163
199
  if (!item) return;
164
200
  this.focus();
@@ -185,6 +221,42 @@ let DetailListElement = class DetailListElement extends LitElement {
185
221
  #builtFromProvider;
186
222
  #providerBuilt;
187
223
  #data;
224
+ #nativeDragging;
225
+ #postDragSuppressTimer;
226
+ #nativeDrag;
227
+ #prepareNativeDrag(originKey) {
228
+ const visible = this._getVisibleItems();
229
+ const originEl = visible.find((el) => keyForElement(el) === originKey);
230
+ if (!originEl || !this._isCheckable(originEl)) return void 0;
231
+ if (!this.selection.selected.has(originEl)) this.selection.replace(originEl);
232
+ const selected = [];
233
+ visible.forEach((el, index) => {
234
+ if (!this.selection.selected.has(el)) return;
235
+ const key = keyForElement(el) ?? originKey;
236
+ selected.push({
237
+ key,
238
+ index,
239
+ item: this.#itemData.get(el) ?? el,
240
+ element: el
241
+ });
242
+ });
243
+ const origin = selected.find((entry) => entry.key === originKey);
244
+ if (!origin) return void 0;
245
+ return {
246
+ origin,
247
+ selected
248
+ };
249
+ }
250
+ _syncNativeDraggable() {
251
+ if (!this.isConnected) return;
252
+ for (const el of this.querySelectorAll(`li`)) if (el instanceof HTMLElement) el.draggable = this.itemsDraggable && this._isCheckable(el);
253
+ }
254
+ #startPostDragSuppressTimer() {
255
+ if (this.#postDragSuppressTimer) clearTimeout(this.#postDragSuppressTimer);
256
+ this.#postDragSuppressTimer = window.setTimeout(() => {
257
+ this.#postDragSuppressTimer = 0;
258
+ }, 0);
259
+ }
188
260
  /** Live drag-select preview rect (surface-relative); the covered items carry `data-marquee`. */
189
261
  #marqueeRect;
190
262
  #dragSelect;
@@ -287,11 +359,16 @@ let DetailListElement = class DetailListElement extends LitElement {
287
359
  this.#unregisterSearchCommands?.();
288
360
  this.#unregisterSearchCommands = void 0;
289
361
  this.#searchRegistry = void 0;
362
+ if (this.#postDragSuppressTimer) {
363
+ clearTimeout(this.#postDragSuppressTimer);
364
+ this.#postDragSuppressTimer = 0;
365
+ }
290
366
  }
291
367
  firstUpdated() {
292
368
  this.#processChildren();
293
369
  if (this.filterPredicate) this.#applyFilterPredicate();
294
370
  this.#recomputeGeometry();
371
+ this._syncNativeDraggable();
295
372
  }
296
373
  updated(changed) {
297
374
  super.updated(changed);
@@ -315,7 +392,12 @@ let DetailListElement = class DetailListElement extends LitElement {
315
392
  if (changed.has(`interactionMode`)) {
316
393
  this.selection.clearAnchor();
317
394
  this._syncItemStates();
395
+ this._syncNativeDraggable();
318
396
  } else if (changed.has(`checkboxRenderer`) && this.interactionMode === `checked`) this._syncCheckboxes();
397
+ if (changed.has(`itemsDraggable`)) {
398
+ this._syncNativeDraggable();
399
+ this.#nativeDrag.refreshDraggable();
400
+ }
319
401
  }
320
402
  /** The most recently selected item, or `undefined` if nothing is selected. */
321
403
  get selectedItem() {
@@ -880,6 +962,14 @@ let DetailListElement = class DetailListElement extends LitElement {
880
962
  composed: true
881
963
  }));
882
964
  }
965
+ _dispatchCancelable(name, detail) {
966
+ return this.dispatchEvent(new CustomEvent(name, {
967
+ detail,
968
+ bubbles: true,
969
+ composed: true,
970
+ cancelable: true
971
+ }));
972
+ }
883
973
  _activateItem(item) {
884
974
  if (this.interactionMode !== `manual`) this.selection.replace(item);
885
975
  this._dispatch(`list-activate`, { item });
@@ -997,6 +1087,10 @@ let DetailListElement = class DetailListElement extends LitElement {
997
1087
  color: var(--item-text-selected);
998
1088
  }
999
1089
 
1090
+ ::slotted([data-drag-origin]) {
1091
+ opacity: 0.6;
1092
+ }
1093
+
1000
1094
  /* checked mode: the injected checkbox communicates selection — suppress bg */
1001
1095
  :host([interaction-mode="checked"]) ::slotted([data-selected]) {
1002
1096
  background: transparent;
@@ -1086,6 +1180,12 @@ __decorate([property({
1086
1180
  attribute: `search-modes`,
1087
1181
  reflect: true
1088
1182
  })], DetailListElement.prototype, "searchModes", void 0);
1183
+ __decorate([property({
1184
+ type: Boolean,
1185
+ attribute: `items-draggable`,
1186
+ reflect: true
1187
+ })], DetailListElement.prototype, "itemsDraggable", void 0);
1188
+ __decorate([property({ attribute: false })], DetailListElement.prototype, "dragPreviewRenderer", void 0);
1089
1189
  __decorate([query(`ul`)], DetailListElement.prototype, "_listEl", void 0);
1090
1190
  DetailListElement = __decorate([safeCustomElement(`ixfx-detail-list`)], DetailListElement);
1091
1191
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"detail-list.js","names":["#dragSelect","#marqueeHitTest","#marqueeRect","#navigateDown","#navigateUp","#navigateRight","#navigateLeft","#navigateTo","#findFirstCheckable","#findLastCheckable","#data","#searchRegistry","#effectiveSearchModes","#unregisterSearchCommands","#resizeObserver","#scheduleGeometry","#mutationObserver","#processChildren","#animateChildMutations","#animatedItems","#syncSearchCommands","#applyFilterPredicate","#recomputeGeometry","#builtFromProvider","#providerBuilt","#rebuildFromObjects","#syncFromProvider","#applySort","#ensureIcon","#itemData","#itemForKey","#createItemEl","#propertyValue","#geometryScheduled","#grid","#positions","#gridSize","#itemAt","#positionOf","#findNextCheckable","#marqueeStyle","customElement"],"sources":["../src/detail-list/detail-list.ts"],"sourcesContent":["import type { CommandId, CommandRegistry } from '@clinth/ui-commands';\nimport type { PropertyValues } from 'lit';\nimport type { IDataProvider } from '../common/data-provider.js';\nimport type { ListSearchMode } from '../incr-search/index.js';\nimport type { DragSelectRect } from '../interaction/list-drag-select-controller.js';\nimport type {\n ListActivateDetail,\n ListElementEventMap,\n ListInteractionMode,\n ListItemClickDetail,\n ListSelectDetail,\n ListSelectionMode,\n ListTickleDetail,\n} from '../interaction/list-selection-types.js';\nimport type {\n AddItemOptions,\n CustomCheckboxOptions,\n DetailFormatter,\n DetailSortComparator,\n DetailSortItem,\n DetailSortMode,\n} from './types.js';\nimport { createCommandRegistry } from '@clinth/ui-commands';\nimport { css, html, LitElement, nothing, render } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { DataController } from '../common/data-controller.js';\nimport {\n createElementListSearchAdapter,\n LIST_SEARCH_MODES,\n ListSearchController,\n listSearchStyles,\n registerListSearchCommands,\n} from '../incr-search/index.js';\nimport { keyForElement } from '../interaction/keyed-list.js';\nimport { ListDragSelectController } from '../interaction/list-drag-select-controller.js';\nimport { animateListItemIn, animateListItemOut, LIST_ITEM_MOTION_MS } from '../interaction/list-item-animation.js';\nimport { ListSelectionController } from '../interaction/list-selection-controller.js';\nimport { TickledController } from '../interaction/tickled-controller.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { scrollFadeStyles } from '../styles/scroll-fade.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type {\n AddItemOptions,\n CustomCheckboxOptions,\n DetailFormatter,\n DetailSortComparator,\n DetailSortItem,\n DetailSortMode,\n} from './types.js';\n\nconst ITEM_SELECTOR = `:scope > li`;\nconst SEARCH_HIGHLIGHT_KEY = `detail-list-search`;\nconst LABEL_SPAN_CSS = `overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0`;\n\ntype GridPosition = { readonly col: number; readonly row: number };\n\n/**\n * A list that scales horizontally, not vertically.\n *\n * Items are laid out in equal-width columns; they flow top→bottom down a\n * column, then wrap to the top of the next column to the right. The\n * component has a fixed vertical extent and scrolls horizontally.\n *\n * Selection semantics match `ixfx-vertical-list` — same modes, same\n * `list-*` events, same keyboard gestures — but navigation is a 2-D grid\n * (Up/Down move within a column, Left/Right jump columns).\n *\n * Items come from any of three sources (later writes win):\n * 1. declarative `<li>` children in light DOM,\n * 2. `addItem()` / `setItems()`,\n * 3. an `items` array of objects rendered via `displayProperty` /\n * `formatter`, optionally streamed in via a `provider`.\n */\n@customElement(`ixfx-detail-list`)\nexport class DetailListElement extends LitElement {\n @property({ type: String, attribute: `selection-mode` })\n selectionMode: ListSelectionMode = `single`;\n\n @property({ type: String, attribute: `interaction-mode` })\n interactionMode: ListInteractionMode = `standard`;\n\n @property({ type: String })\n sort: DetailSortMode = `none`;\n\n @property({ type: String, attribute: `sort-by` })\n sortBy = ``;\n\n @property({ attribute: false })\n sortComparator: DetailSortComparator | undefined;\n\n @property({ attribute: false })\n items: readonly unknown[] = [];\n\n @property({ attribute: false })\n provider: IDataProvider<void, unknown> | undefined;\n\n @property({ type: String, attribute: `display-property` })\n displayProperty = ``;\n\n @property({ attribute: false })\n formatter: DetailFormatter | undefined;\n\n @property({ type: String, attribute: `icon-property` })\n iconProperty = ``;\n\n @property({ type: String, attribute: `key-property` })\n keyProperty = ``;\n\n @property({ attribute: false })\n filterPredicate: ((el: Element) => boolean) | undefined;\n\n /**\n * Whether keyboard navigation wraps from last to first and vice versa.\n * - 'stop' (default): navigation stops at the boundary\n * - 'wrap': navigation wraps around\n */\n @property({ type: String, attribute: `item-wrap` })\n itemWrap: `stop` | `wrap` = `stop`;\n\n /** Optional renderer for the checkbox shown in `checked` interactionMode. */\n @property({ attribute: false })\n checkboxRenderer: ((checked: boolean) => unknown) | CustomCheckboxOptions | undefined;\n\n /**\n * Space-separated subset of `navigate select filter` — limits which\n * incremental-search modes are offered. Unset ⇒ all three; empty ⇒ search\n * disabled. See `docs/infra-incremental.md`.\n */\n @property({ type: String, attribute: `search-modes`, reflect: true })\n searchModes: string | undefined;\n\n @query(`ul`)\n private _listEl!: HTMLUListElement;\n\n #itemData = new WeakMap<HTMLLIElement, unknown>();\n #grid: Element[][] = [];\n #positions = new Map<Element, GridPosition>();\n #geometryScheduled = false;\n #resizeObserver: ResizeObserver | undefined;\n #mutationObserver: MutationObserver | undefined;\n /** Items that have already played (or been skipped for) their enter animation. */\n #animatedItems = new WeakSet<Element>();\n #builtFromProvider: readonly unknown[] = [];\n #providerBuilt = 0;\n\n readonly #data = new DataController<void, unknown>(this);\n\n private readonly selection = new ListSelectionController<Element>({\n getOrderedItems: () => this._getVisibleItems(),\n isSelectable: el => this._isCheckable(el),\n getModes: () => ({ selectionMode: this.selectionMode, interactionMode: this.interactionMode }),\n getKey: keyForElement,\n onChange: (selected, previous) => {\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, {\n selected,\n previous,\n selectedKeys: this.selection.selectedKeys,\n });\n },\n });\n\n private tickled = new TickledController<Element>(this, {\n getItems: () => this._getVisibleItems().map(el => ({\n id: el,\n enabled: !el.hasAttribute(`not-checked`),\n })),\n onTickle: (id) => {\n if (id !== undefined) {\n this._dispatch<ListTickleDetail>(`list-tickle`, { item: id });\n }\n },\n onStateChange: () => this._syncItemStates(),\n itemWrap: this.itemWrap,\n hoverDisabled: () => this.#dragSelect.isDragging,\n });\n\n /** Live drag-select preview rect (surface-relative); the covered items carry `data-marquee`. */\n #marqueeRect: DragSelectRect | undefined;\n\n readonly #dragSelect = new ListDragSelectController<Element>(this, {\n getSurface: () => this.renderRoot.querySelector(`.container`) as HTMLElement | undefined,\n isEnabled: () =>\n this.selection.canDragSelect()\n && this._getVisibleItems().length > 0\n && !this.hasAttribute(`disable-drag-select`),\n hitTest: rect => this.#marqueeHitTest(rect),\n getBaseSelection: () => this.selection.selected,\n onPreview: (preview, rect) => {\n this.#marqueeRect = rect;\n for (const el of this._getVisibleItems())\n el.toggleAttribute(`data-marquee`, preview.has(el));\n this.requestUpdate();\n },\n onCommit: (finalSet) => {\n this.selection.applyDragSelection(finalSet);\n for (const el of this._getVisibleItems())\n el.removeAttribute(`data-marquee`);\n this.#marqueeRect = undefined;\n this.requestUpdate();\n },\n autoScroll: (dx, _dy) => {\n if (this._listEl)\n this._listEl.scrollLeft += dx;\n },\n });\n\n /** Collect visible items whose surface-relative box intersects `rect`. */\n #marqueeHitTest(rect: DragSelectRect): Element[] {\n const surface = this.renderRoot.querySelector(`.container`);\n if (!surface)\n return [];\n const box = surface.getBoundingClientRect();\n const rx0 = rect.x;\n const ry0 = rect.y;\n const rx1 = rect.x + rect.width;\n const ry1 = rect.y + rect.height;\n const out: Element[] = [];\n for (const el of this._getVisibleItems()) {\n const r = el.getBoundingClientRect();\n const left = r.left - box.left;\n const top = r.top - box.top;\n if (left <= rx1 && left + r.width >= rx0 && top <= ry1 && top + r.height >= ry0)\n out.push(el);\n }\n return out;\n }\n\n #marqueeStyle(rect: DragSelectRect): string {\n return `left:${rect.x}px;top:${rect.y}px;width:${Math.max(0, rect.width)}px;height:${Math.max(0, rect.height)}px`;\n }\n\n /** Incremental search (navigate / select / filter). See `docs/infra-incremental.md`. */\n readonly search = new ListSearchController<Element>(this, {\n adapter: createElementListSearchAdapter(this, {\n itemSelector: ITEM_SELECTOR,\n getLabel: el => el.getAttribute(`data-search-label`) ?? el.textContent?.trim() ?? ``,\n highlightKey: SEARCH_HIGHLIGHT_KEY,\n }),\n });\n\n #searchRegistry: CommandRegistry<unknown> | undefined;\n #unregisterSearchCommands: (() => void) | undefined;\n\n /** Command registry carrying this list's `list.search.*` commands. */\n get registry(): CommandRegistry<unknown> | undefined {\n return this.#searchRegistry;\n }\n\n #effectiveSearchModes(): ListSearchMode[] {\n const raw = this.searchModes?.trim();\n if (raw === undefined)\n return [...LIST_SEARCH_MODES];\n const requested = new Set(raw.split(/\\s+/));\n return LIST_SEARCH_MODES.filter(m => requested.has(m));\n }\n\n #syncSearchCommands(): void {\n if (!this.#searchRegistry)\n return;\n this.search.setModes(this.#effectiveSearchModes());\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = registerListSearchCommands(this.#searchRegistry, this.search);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`tabindex`))\n this.tabIndex = 0;\n this.addEventListener(`pointerover`, this._onPointerOver);\n this.addEventListener(`pointerleave`, this._onPointerLeave);\n this.addEventListener(`keydown`, this._onKeyDown);\n this.addEventListener(`click`, this._onClick);\n this.addEventListener(`dblclick`, this._onDblClick);\n this.addEventListener(`wheel`, this._onWheel);\n\n this.#resizeObserver = new ResizeObserver(() => this.#scheduleGeometry());\n this.#resizeObserver.observe(this);\n this.#mutationObserver = new MutationObserver((records) => {\n this.#processChildren();\n this.#animateChildMutations(records);\n this.#scheduleGeometry();\n });\n this.#mutationObserver.observe(this, {\n childList: true,\n subtree: false,\n attributeFilter: [`hidden`],\n });\n for (const el of this.querySelectorAll(ITEM_SELECTOR))\n this.#animatedItems.add(el);\n this.#searchRegistry ??= createCommandRegistry();\n this.#syncSearchCommands();\n }\n\n /**\n * Collapse-in items appended to the light DOM (however they got there). A bulk\n * populate is left alone. Geometry is re-read once the animations settle so\n * keyboard navigation lines back up with the final layout.\n */\n #animateChildMutations(records: MutationRecord[]): void {\n if (!this.isConnected)\n return;\n const fresh: HTMLElement[] = [];\n for (const record of records) {\n for (const node of record.addedNodes) {\n // ITEM_SELECTOR is `:scope > li`, which can't be used with `.matches()`\n // — every item here is a direct `<li>` child, so check that directly.\n if (!(node instanceof HTMLElement) || node.parentElement !== this || node.localName !== `li`)\n continue;\n if (this.#animatedItems.has(node))\n continue;\n this.#animatedItems.add(node);\n fresh.push(node);\n }\n }\n if (fresh.length === 0)\n return;\n const total = this.querySelectorAll(ITEM_SELECTOR).length;\n if (fresh.length >= total)\n return; // first populate / wholesale replace\n for (const el of fresh)\n animateListItemIn(el);\n window.setTimeout(() => this.#scheduleGeometry(), LIST_ITEM_MOTION_MS + 30);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointerover`, this._onPointerOver);\n this.removeEventListener(`pointerleave`, this._onPointerLeave);\n this.removeEventListener(`keydown`, this._onKeyDown);\n this.removeEventListener(`click`, this._onClick);\n this.removeEventListener(`dblclick`, this._onDblClick);\n this.removeEventListener(`wheel`, this._onWheel);\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = undefined;\n this.#mutationObserver?.disconnect();\n this.#mutationObserver = undefined;\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = undefined;\n this.#searchRegistry = undefined;\n }\n\n override firstUpdated(): void {\n this.#processChildren();\n if (this.filterPredicate) {\n this.#applyFilterPredicate();\n }\n this.#recomputeGeometry();\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`searchModes`)) {\n this.#syncSearchCommands();\n }\n if (changed.has(`provider`)) {\n this.#builtFromProvider = [];\n this.#providerBuilt = 0;\n this.#data.provider = this.provider;\n queueMicrotask(() => {\n if (this.provider)\n this.#data.request(undefined);\n });\n return;\n }\n if (changed.has(`items`) && this.provider === undefined && this.items.length > 0) {\n this.#rebuildFromObjects(this.items);\n }\n this.#syncFromProvider();\n if (changed.has(`sort`) || changed.has(`sortBy`) || changed.has(`sortComparator`)) {\n this.#applySort();\n }\n if (changed.has(`filterPredicate`)) {\n this.#applyFilterPredicate();\n this.#scheduleGeometry();\n }\n if (changed.has(`interactionMode`)) {\n this.selection.clearAnchor();\n this._syncItemStates();\n } else if (changed.has(`checkboxRenderer`) && this.interactionMode === `checked`) {\n this._syncCheckboxes();\n }\n }\n\n // --- Public API ---\n\n /** The most recently selected item, or `undefined` if nothing is selected. */\n get selectedItem(): Element | undefined {\n return [...this.selection.selected].at(-1);\n }\n\n /** The full current selection set (read-only). */\n get selectedItems(): ReadonlySet<Element> {\n return this.selection.selected;\n }\n\n /**\n * Force an immediate geometry recompute. Called automatically on resize,\n * DOM changes, sort/filter/search changes — only needed when layout is\n * changed by outside forces (e.g. an external font load).\n */\n refreshLayout(): void {\n this.#recomputeGeometry();\n }\n\n addItem(item: Element | string, options?: AddItemOptions): void {\n let el: Element;\n if (typeof item === `string`) {\n const li = document.createElement(`li`);\n this._setLabel(li, item);\n el = li;\n } else {\n el = item;\n }\n if (options?.notChecked)\n el.setAttribute(`not-checked`, ``);\n this.appendChild(el);\n this.#ensureIcon(el as HTMLLIElement);\n if (this.sort !== `none`)\n this.#applySort();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n }\n\n /**\n * Collapse + fade `item` out, then detach it; the rows after it slide up to\n * close the gap. Resolves once removed. Immediate under reduced motion.\n */\n removeItem(item: Element): Promise<void> {\n this.selection.deselect(item);\n return animateListItemOut(item as HTMLElement).then(() => {\n item.remove();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n this.#recomputeGeometry();\n });\n }\n\n /** {@link removeItem} for several items at once. */\n removeItems(items: Iterable<Element>): Promise<void> {\n return Promise.all([...items].map(item => this.removeItem(item))).then(() => undefined);\n }\n\n clearItems(): void {\n this.replaceChildren();\n this.selection.reset();\n this.#builtFromProvider = [];\n this.#providerBuilt = 0;\n this._syncItemStates();\n }\n\n /**\n * Replace the entire item list in one call.\n * Equivalent to `clearItems()` followed by `addItem()` for each element.\n */\n setItems(items: readonly Element[]): void {\n this.clearItems();\n for (const item of items) {\n this.appendChild(item);\n this.#ensureIcon(item as HTMLLIElement);\n }\n if (this.sort !== `none`)\n this.#applySort();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n }\n\n /**\n * Get the source object behind an `<li>` built from an `items` array or\n * provider. Returns `undefined` for declarative / programmatic elements.\n */\n getItemData(item: HTMLLIElement): unknown {\n return this.#itemData.get(item);\n }\n\n /**\n * Dispatch a command to this list — used by `ixfx-grouped-item-lister` to\n * forward commands. Routes through the command registry (so `list.search.*`\n * and any other registered commands work).\n */\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n this.#searchRegistry?.invoke(commandId, args);\n }\n\n select(item: Element): void {\n this.selection.replace(item);\n }\n\n selectMany(items: Iterable<Element>): void {\n this.selection.selectMany(items);\n }\n\n deselect(item: Element): void {\n this.selection.deselect(item);\n }\n\n clearSelection(): void {\n this.selection.clear();\n }\n\n selectAll(): void {\n if (this.selection.canSelectAll())\n this.selection.selectAll();\n }\n\n // --- Key-based selection & cursor ---\n\n /** The selection as stable `data-key` / `data-value` strings. */\n get selectedKeys(): ReadonlySet<string> {\n return this.selection.selectedKeys;\n }\n\n /** The key of the item under the cursor, or `undefined`. */\n get tickledKey(): string | undefined {\n const id = this.tickled.tickledId;\n return id ? keyForElement(id) : undefined;\n }\n\n /** Replace the selection with the items carrying these keys (unknown keys ignored). */\n selectKeys(keys: Iterable<string>): void {\n this.selection.selectKeys(keys, key => this.#itemForKey(key));\n }\n\n /** Add items by key to the selection (multi-select modes only). */\n addSelectedKeys(keys: Iterable<string>): void {\n this.selection.addKeys(keys, key => this.#itemForKey(key));\n }\n\n /** Remove items by key from the selection. */\n removeSelectedKeys(keys: Iterable<string>): void {\n this.selection.removeKeys(keys, key => this.#itemForKey(key));\n }\n\n /** Move the cursor to the item with this key and scroll it into view. */\n focusKey(key: string): void {\n const el = this.#itemForKey(key);\n if (!el)\n return;\n this.tickled.focus(el);\n el.scrollIntoView({ block: `nearest`, inline: `nearest` });\n }\n\n #itemForKey(key: string): Element | undefined {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if (keyForElement(el) === key)\n return el;\n }\n return undefined;\n }\n\n * selectedFilter(kind: `selected` | `checked` | `either`): Generator<Element> {\n const wanted = (el: Element) => {\n switch (kind) {\n case `selected`: return el.hasAttribute(`data-selected`);\n case `checked`: return el.hasAttribute(`data-checked`);\n case `either`: return el.hasAttribute(`data-selected`) || el.hasAttribute(`data-checked`);\n }\n };\n\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if ((el as HTMLElement).hidden)\n continue;\n if (wanted(el))\n yield el;\n }\n }\n\n // --- Object items ---\n\n #rebuildFromObjects(items: readonly unknown[]): void {\n const keyOf = (el: Element): string | null =>\n el.getAttribute(`data-key`) ?? el.getAttribute(`data-search-label`) ?? null;\n const previousKeys = new Set(\n [...this.selection.selected].map(keyOf).filter((k): k is string => k !== null),\n );\n const anchorKey = this.selection.anchor ? keyOf(this.selection.anchor) : null;\n\n this.replaceChildren(...items.map((item, index) => this.#createItemEl(item, index)));\n\n // Re-select by key so selection survives the element-reference rebuild\n if (previousKeys.size > 0 || anchorKey !== null) {\n const next: Element[] = [];\n let anchor: Element | undefined;\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n const key = keyOf(el);\n if (key !== null && previousKeys.has(key))\n next.push(el);\n if (key !== null && key === anchorKey)\n anchor = el;\n }\n this.selection.seed(next, anchor);\n }\n\n if (this.sort !== `none`)\n this.#applySort();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n this._syncItemStates();\n this.#scheduleGeometry();\n }\n\n #createItemEl(item: unknown, index: number): HTMLLIElement {\n const li = document.createElement(`li`);\n this.#itemData.set(li, item);\n\n const content = this.formatter\n ? this.formatter(item, index)\n : (this.displayProperty\n ? this.#propertyValue(item, this.displayProperty)\n : item);\n if (typeof content === `string`) {\n this._setLabel(li, content);\n if (this.iconProperty) {\n const icon = this.#propertyValue(item, this.iconProperty);\n if (typeof icon === `string` && icon.length > 0)\n li.setAttribute(`data-icon`, icon);\n }\n } else if (content instanceof Node) {\n li.appendChild(content);\n }\n\n if (this.keyProperty) {\n const key = this.#propertyValue(item, this.keyProperty);\n if (key !== undefined && key !== null)\n li.setAttribute(`data-key`, String(key));\n }\n this.#ensureIcon(li);\n return li;\n }\n\n #propertyValue(item: unknown, prop: string): unknown {\n if (typeof item !== `object` || item === null || !(prop in item))\n return undefined;\n return (item as Record<string, unknown>)[prop];\n }\n\n // --- Provider (async) items ---\n\n #syncFromProvider(): void {\n if (this.provider === undefined)\n return;\n const items = this.#data.items;\n if (items === this.#builtFromProvider)\n return;\n\n // Longest common prefix by identity — pure appends extend the columns,\n // anything else rebuilds.\n let prefix = 0;\n while (\n prefix < this.#builtFromProvider.length\n && prefix < items.length\n && this.#builtFromProvider[prefix] === items[prefix]\n ) {\n prefix++;\n }\n\n if (prefix === this.#builtFromProvider.length && prefix <= items.length) {\n const tail = items.slice(prefix);\n for (const item of tail) {\n this.appendChild(this.#createItemEl(item, this.#providerBuilt++));\n }\n if (this.sort !== `none`)\n this.#applySort();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n this._syncItemStates();\n this.#scheduleGeometry();\n } else {\n this.#providerBuilt = 0;\n this.#rebuildFromObjects(items);\n }\n this.#builtFromProvider = items;\n }\n\n // --- Filtering ---\n\n #applyFilterPredicate(): void {\n if (!this.filterPredicate) {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n el.removeAttribute(`hidden`);\n }\n return;\n }\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if (this.filterPredicate(el)) {\n el.removeAttribute(`hidden`);\n } else {\n el.setAttribute(`hidden`, ``);\n }\n }\n }\n\n // --- Sorting ---\n\n #applySort(): void {\n if (this.sort === `none`)\n return;\n const rows = [...this.querySelectorAll(ITEM_SELECTOR)] as HTMLLIElement[];\n if (rows.length < 2)\n return;\n\n const dir = this.sort === `descending` ? -1 : 1;\n const meta = (el: HTMLLIElement): DetailSortItem => ({\n element: el,\n data: this.getItemData(el),\n label: el.getAttribute(`data-search-label`) ?? el.textContent?.trim() ?? ``,\n });\n\n let cmp: (a: HTMLLIElement, b: HTMLLIElement) => number;\n if (this.sortComparator) {\n const user = this.sortComparator;\n cmp = (a, b) => user(meta(a), meta(b));\n } else if (this.sortBy) {\n const prop = this.sortBy;\n const key = (el: HTMLLIElement): string | number => {\n const v = this.#propertyValue(this.getItemData(el), prop);\n if (typeof v === `number`)\n return v;\n return v === undefined || v === null ? `` : String(v);\n };\n cmp = (a, b) => {\n const ka = key(a);\n const kb = key(b);\n if (typeof ka === `number` && typeof kb === `number`)\n return ka - kb;\n return String(ka).localeCompare(String(kb), undefined, { numeric: true });\n };\n } else {\n cmp = (a, b) =>\n meta(a).label.localeCompare(meta(b).label, undefined, { numeric: true });\n }\n\n const indexed = rows.map((el, i) => ({ el, i }));\n indexed.sort((a, b) => cmp(a.el, b.el) * dir || a.i - b.i); // stable\n for (const { el } of indexed)\n this.appendChild(el); // moving reorders in place\n this.#scheduleGeometry();\n }\n\n // --- Geometry (measured grid) ---\n\n #scheduleGeometry(): void {\n if (this.#geometryScheduled)\n return;\n this.#geometryScheduled = true;\n requestAnimationFrame(() => {\n this.#geometryScheduled = false;\n this.#recomputeGeometry();\n });\n }\n\n #recomputeGeometry(): void {\n this.#grid = [];\n this.#positions.clear();\n if (!this.isConnected)\n return;\n\n const columns: Array<{ left: number; items: Element[] }> = [];\n for (const el of this._getVisibleItems()) {\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0)\n continue;\n let ci = columns.findIndex(c => Math.abs(c.left - rect.left) <= 1);\n if (ci === -1) {\n columns.push({ left: rect.left, items: [] });\n ci = columns.length - 1;\n }\n columns[ci].items.push(el);\n }\n columns.sort((a, b) => a.left - b.left);\n for (const col of columns)\n col.items.sort((a, b) => a.getBoundingClientRect().top - b.getBoundingClientRect().top);\n\n this.#grid = columns.map(c => c.items);\n this.#grid.forEach((col, colIdx) =>\n col.forEach((el, rowIdx) => this.#positions.set(el, { col: colIdx, row: rowIdx })),\n );\n }\n\n #positionOf(el: Element): GridPosition | undefined {\n let pos = this.#positions.get(el);\n if (pos === undefined) {\n this.#recomputeGeometry();\n pos = this.#positions.get(el);\n }\n return pos;\n }\n\n #itemAt(col: number, row: number): Element | undefined {\n return this.#grid[col]?.[row];\n }\n\n #gridSize(): { cols: number; rows: number } {\n if (this.#grid.length === 0)\n this.#recomputeGeometry();\n return { cols: this.#grid.length, rows: Math.max(0, ...this.#grid.map(c => c.length)) };\n }\n\n // --- Keyboard navigation ---\n\n #navigateTo(target: Element | undefined): void {\n if (!target)\n return;\n this.tickled.handleKeyboardNavigation(target);\n this.tickled.tickledId?.scrollIntoView({ block: `nearest`, inline: `nearest` });\n }\n\n #findNextCheckable(fromCol: number, fromRow: number, deltaCol: number, deltaRow: number): Element | undefined {\n const { cols } = this.#gridSize();\n const visibleItems = this._getVisibleItems();\n const maxIterations = visibleItems.length + 1;\n\n // Start from the next position\n // For horizontal nav: move to next column first, keep same row\n // For vertical nav: stay in same column, move row\n // For diagonal nav: both change\n let col = deltaCol !== 0 ? fromCol + deltaCol : fromCol;\n let row = deltaRow !== 0 ? fromRow + deltaRow : fromRow;\n\n // Track whether we've tried wrapping columns\n let wrappedColumns = false;\n\n for (let iterations = 0; iterations < maxIterations; iterations++) {\n // Check bounds\n const colLength = this.#grid[col]?.length ?? 0;\n\n if (row < 0 || row >= colLength) {\n // Need to move to another column\n if (deltaCol !== 0 || wrappedColumns) {\n // Already tried wrapping, or horizontal nav - stop or wrap\n if (this.itemWrap === `wrap`) {\n // Simple wrap: if deltaCol < 0, go to last column; if deltaCol > 0, go to first\n if (deltaCol < 0) {\n col = cols - 1;\n } else if (deltaCol > 0) {\n col = 0;\n }\n wrappedColumns = true;\n } else {\n return undefined;\n }\n }\n\n // Try next/prev column\n if (deltaRow > 0) {\n // Going down - try next column at row 0\n if (col + 1 < cols) {\n col = col + 1;\n row = 0;\n wrappedColumns = true;\n } else if (this.itemWrap === `wrap`) {\n col = 0;\n row = 0;\n wrappedColumns = true;\n } else {\n return undefined;\n }\n } else if (deltaRow < 0) {\n // Going up - try prev column at last row\n if (col - 1 >= 0) {\n col = col - 1;\n row = (this.#grid[col]?.length ?? 1) - 1;\n wrappedColumns = true;\n } else if (this.itemWrap === `wrap`) {\n col = cols - 1;\n row = (this.#grid[col]?.length ?? 1) - 1;\n wrappedColumns = true;\n } else {\n return undefined;\n }\n } else if (deltaCol !== 0) {\n // Horizontal navigation - adjust row if target column is shorter\n const targetColLength = this.#grid[col]?.length ?? 0;\n if (row >= targetColLength && targetColLength > 0) {\n row = targetColLength - 1;\n }\n }\n\n // If we're now at same position as start, we've looped\n if (col === fromCol && row === fromRow + deltaRow) {\n return undefined;\n }\n continue;\n }\n\n const item = this.#itemAt(col, row);\n if (item && this._isCheckable(item)) {\n return item;\n }\n\n // Move to next position\n row += deltaRow;\n }\n\n return undefined;\n }\n\n #findFirstCheckable(): Element | undefined {\n const visibleItems = this._getVisibleItems();\n return visibleItems.find(item => this._isCheckable(item));\n }\n\n #findLastCheckable(): Element | undefined {\n const visibleItems = this._getVisibleItems();\n for (let i = visibleItems.length - 1; i >= 0; i--) {\n if (this._isCheckable(visibleItems[i])) {\n return visibleItems[i];\n }\n }\n return undefined;\n }\n\n #navigateDown(): void {\n this.#recomputeGeometry();\n const cur = this.tickled.tickledId ? this.#positionOf(this.tickled.tickledId) : undefined;\n if (!cur) {\n this.#navigateTo(this.#findFirstCheckable());\n return;\n }\n const next = this.#findNextCheckable(cur.col, cur.row, 0, 1);\n if (next) {\n this.#navigateTo(next);\n }\n }\n\n #navigateUp(): void {\n this.#recomputeGeometry();\n const cur = this.tickled.tickledId ? this.#positionOf(this.tickled.tickledId) : undefined;\n if (!cur) {\n this.#navigateTo(this.#findLastCheckable());\n return;\n }\n const next = this.#findNextCheckable(cur.col, cur.row, 0, -1);\n if (next) {\n this.#navigateTo(next);\n }\n }\n\n #navigateRight(): void {\n this.#recomputeGeometry();\n const cur = this.tickled.tickledId ? this.#positionOf(this.tickled.tickledId) : undefined;\n if (!cur) {\n this.#navigateTo(this.#findFirstCheckable());\n return;\n }\n const next = this.#findNextCheckable(cur.col, cur.row, 1, 0);\n if (next) {\n this.#navigateTo(next);\n } else if (this.itemWrap === `wrap`) {\n this.#navigateTo(this.#findFirstCheckable());\n }\n }\n\n #navigateLeft(): void {\n this.#recomputeGeometry();\n const cur = this.tickled.tickledId ? this.#positionOf(this.tickled.tickledId) : undefined;\n if (!cur) {\n this.#navigateTo(this.#findFirstCheckable());\n return;\n }\n const next = this.#findNextCheckable(cur.col, cur.row, -1, 0);\n if (next) {\n this.#navigateTo(next);\n } else if (this.itemWrap === `wrap`) {\n this.#navigateTo(this.#findLastCheckable());\n }\n }\n\n // --- Helpers ---\n\n private _getVisibleItems(): Element[] {\n return Array.from(this.querySelectorAll(ITEM_SELECTOR)).filter((el) => {\n if ((el as HTMLElement).hidden)\n return false;\n if (this.filterPredicate && !this.filterPredicate(el))\n return false;\n return true;\n });\n }\n\n /**\n * Set the column width to fit the widest visible item.\n *\n * This is opt-in; detail lists continue to use `--detail-list-column-width`\n * (or its 220px fallback) until this method is called. The measured value is\n * set directly on this element, so it takes precedence over an inherited\n * value. Returns the applied width in pixels, or 0 when there are no items.\n */\n async fitColumnWidth(): Promise<number> {\n await this.updateComplete;\n\n const items = this._getVisibleItems();\n if (items.length === 0)\n return 0;\n\n const previousWidth = this.style.getPropertyValue(`--detail-list-column-width`);\n const previousPriority = this.style.getPropertyPriority(`--detail-list-column-width`);\n this.style.setProperty(`--detail-list-column-width`, `max-content`);\n\n // Reading the layout forces the temporary max-content width to resolve.\n const width = Math.ceil(Math.max(...items.map(item => item.getBoundingClientRect().width)));\n\n if (previousWidth) {\n this.style.setProperty(`--detail-list-column-width`, previousWidth, previousPriority);\n } else {\n this.style.removeProperty(`--detail-list-column-width`);\n }\n this.style.setProperty(`--detail-list-column-width`, `${width}px`);\n this.#scheduleGeometry();\n return width;\n }\n\n private _isCheckable(item: Element): boolean {\n if (this.interactionMode !== `checked`)\n return true;\n return !item.hasAttribute(`not-checked`);\n }\n\n private _setLabel(li: HTMLLIElement, label: string): void {\n const span = document.createElement(`span`);\n span.style.cssText = LABEL_SPAN_CSS;\n span.textContent = label;\n li.appendChild(span);\n li.setAttribute(`data-search-label`, label);\n }\n\n /**\n * Inject a leading `<ixfx-icon>` into an item carrying `data-icon`.\n * Idempotent — skips when the item already starts with an icon.\n */\n #ensureIcon(li: HTMLLIElement): void {\n const name = li.getAttribute(`data-icon`);\n if (!name)\n return;\n if (li.firstElementChild?.tagName === `IXFX-ICON`)\n return;\n const icon = document.createElement(`ixfx-icon`);\n icon.setAttribute(`name`, name);\n icon.style.marginInlineEnd = `var(--detail-list-icon-gap, 6px)`;\n icon.style.flexShrink = `0`;\n li.prepend(icon);\n }\n\n /** Scan light-DOM children for unprocessed `data-icon` items. */\n #processChildren(): void {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n this.#ensureIcon(el as HTMLLIElement);\n }\n }\n\n private _syncItemStates(): void {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n el.toggleAttribute(`data-tickled`, this.tickled.isTickled(el));\n el.toggleAttribute(`data-selected`, this.selection.selected.has(el));\n if (this.interactionMode === `checked`) {\n el.toggleAttribute(\n `data-checked`,\n !el.hasAttribute(`not-checked`) && this.selection.selected.has(el),\n );\n } else {\n el.removeAttribute(`data-checked`);\n }\n }\n this.dataset.inputMode = this.tickled.inputMode;\n this._syncCheckboxes();\n }\n\n private _syncCheckboxes(): void {\n const inCheckedMode = this.interactionMode === `checked`;\n const wantsCustom = typeof this.checkboxRenderer === `function`;\n\n for (const el of this.querySelectorAll<HTMLElement>(`li`)) {\n const existing = el.querySelector<HTMLElement>(`.ixfx-list-checkbox`);\n if (!inCheckedMode) {\n if (existing)\n existing.remove();\n continue;\n }\n // Rows marked `not-checked` get no checkbox column and can't be checked\n if (el.hasAttribute(`not-checked`)) {\n if (existing)\n existing.remove();\n continue;\n }\n\n const existingIsCustom = existing?.classList.contains(`ixfx-list-checkbox-custom`) ?? false;\n if (existing && existingIsCustom !== wantsCustom)\n existing.remove();\n\n let cb: HTMLElement | null = el.querySelector<HTMLElement>(`.ixfx-list-checkbox`);\n if (!cb) {\n if (wantsCustom) {\n const opts = this.checkboxRenderer as CustomCheckboxOptions;\n const margin = opts.margin ?? `0`;\n const width = opts.width ?? `24px`;\n cb = this._createCustomCheckbox(el, margin, width);\n } else {\n cb = this._createNativeCheckboxCell(el);\n }\n el.prepend(cb);\n }\n\n const checked = this.selection.selected.has(el);\n if (wantsCustom) {\n cb.setAttribute(`aria-checked`, String(checked));\n cb.toggleAttribute(`data-checked`, checked);\n if (this.checkboxRenderer) {\n const renderer = typeof this.checkboxRenderer === `function`\n ? this.checkboxRenderer\n : (this.checkboxRenderer as CustomCheckboxOptions).renderer;\n render(renderer(checked), cb);\n }\n } else {\n const input = cb.querySelector<HTMLInputElement>(`input.ixfx-list-checkbox`);\n if (input)\n input.checked = checked;\n }\n }\n }\n\n /**\n * Native checkbox cell: a span that stretches to the row's full cross-axis\n * (so the entire column height is a click target) with a real `<input>`\n * centred inside. The span owns the click; the input is purely visual and\n * has `pointer-events:none` so a single click produces one toggle.\n */\n private _createNativeCheckboxCell(el: HTMLElement): HTMLSpanElement {\n const cell = document.createElement(`span`);\n cell.className = `ixfx-list-checkbox ixfx-list-checkbox-native`;\n cell.style.cssText = `display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:stretch;width:18px;margin:0 6px 0 0;cursor:pointer;pointer-events:auto`;\n cell.tabIndex = -1;\n cell.setAttribute(`role`, `checkbox`);\n cell.setAttribute(`part`, `checkbox`);\n cell.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this.selection.toggle(el);\n });\n const input = document.createElement(`input`);\n input.type = `checkbox`;\n input.className = `ixfx-list-checkbox`;\n input.style.cssText = `pointer-events:none;cursor:pointer;margin:0`;\n cell.appendChild(input);\n return cell;\n }\n\n /** Custom checkbox cell: same shape as the native cell; renderer content inside. */\n private _createCustomCheckbox(el: HTMLElement, margin: string, width: string): HTMLSpanElement {\n const span = document.createElement(`span`);\n span.className = `ixfx-list-checkbox ixfx-list-checkbox-custom`;\n span.style.cssText = `display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:stretch;width:${width};margin:${margin};cursor:pointer;pointer-events:auto`;\n span.tabIndex = -1;\n span.setAttribute(`role`, `checkbox`);\n span.setAttribute(`part`, `checkbox`);\n span.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this.selection.toggle(el);\n });\n return span;\n }\n\n private _findListItem(path: EventTarget[]): Element | undefined {\n for (const target of path) {\n if (!(target instanceof Element))\n continue;\n if (target === this)\n break;\n if (target.parentElement === this && target.matches(`li`))\n return target;\n }\n return undefined;\n }\n\n private _dispatch<T>(name: keyof ListElementEventMap, detail: T): void {\n this.dispatchEvent(new CustomEvent<T>(name as string, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n // --- Event handlers ---\n\n private _onPointerOver = (e: PointerEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (item)\n this.tickled.handlePointerEnter(item);\n };\n\n private _onPointerLeave = (e: PointerEvent): void => {\n this.tickled.handlePointerLeave(e);\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (this.search.isOpen)\n return;\n if ((e.ctrlKey || e.metaKey) && e.key === `a`) {\n if (this.selection.canSelectAll()) {\n e.preventDefault();\n this.selection.selectAll();\n }\n return;\n }\n\n switch (e.key) {\n case `ArrowDown`: {\n e.preventDefault();\n this.#navigateDown();\n // vscode: Shift+Arrow extends range from anchor\n if (e.shiftKey && this.interactionMode === `vscode`) {\n const cur = this.tickled.tickledId;\n if (cur)\n this.selection.rangeTo(cur);\n }\n break;\n }\n case `ArrowUp`: {\n e.preventDefault();\n this.#navigateUp();\n if (e.shiftKey && this.interactionMode === `vscode`) {\n const cur = this.tickled.tickledId;\n if (cur)\n this.selection.rangeTo(cur);\n }\n break;\n }\n case `ArrowRight`: {\n e.preventDefault();\n this.#navigateRight();\n break;\n }\n case `ArrowLeft`: {\n e.preventDefault();\n this.#navigateLeft();\n break;\n }\n case `Home`: {\n e.preventDefault();\n this.#navigateTo(this.#findFirstCheckable());\n break;\n }\n case `End`: {\n e.preventDefault();\n this.#navigateTo(this.#findLastCheckable());\n break;\n }\n case `Enter`: {\n const id = this.tickled.tickledId;\n if (id) {\n e.preventDefault();\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item: id });\n this._activateItem(id);\n }\n break;\n }\n case ` `: {\n const id = this.tickled.tickledId;\n if (id) {\n e.preventDefault();\n this.selection.handleSpace(id);\n }\n break;\n }\n case `Escape`:\n this.selection.clear();\n break;\n }\n };\n\n private _onClick = (e: MouseEvent): void => {\n if (this.#dragSelect.isDragging)\n return;\n const item = this._findListItem(e.composedPath());\n if (!item)\n return;\n this.focus();\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item });\n this.selection.handleClick(item, e);\n };\n\n private _onDblClick = (e: MouseEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (item)\n this._activateItem(item);\n };\n\n private _onWheel = (e: WheelEvent): void => {\n e.preventDefault();\n this._listEl.scrollLeft += e.deltaY;\n };\n\n private _activateItem(item: Element): void {\n // manual mode: never auto-select; just fire the event\n if (this.interactionMode !== `manual`) {\n this.selection.replace(item);\n }\n this._dispatch<ListActivateDetail>(`list-activate`, { item });\n }\n\n // --- Styles ---\n\n static override styles = [themeFallbacks, scrollFadeStyles(`x`), listSearchStyles, css`\n :host {\n display: block;\n position: relative;\n background: var(--detail-list-bg, var(--surface-3));\n color: var(--detail-list-text, var(--surface-3-text));\n border-radius: var(--detail-list-radius, var(--radius-s));\n border: 1px solid var(--detail-list-border, var(--border));\n width: 100%;\n height: 100%;\n overflow: hidden;\n box-sizing: border-box;\n outline: none;\n --_detail-list-item-padding:\n var(--ixfx-detail-list-item-padding, var(--detail-list-item-padding, 0 var(--space-xs, 3px)));\n }\n\n :host(:focus-visible) {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n\n .container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n ul {\n list-style: none;\n margin: 0;\n padding: 0;\n /* keep the last column clear of the scrollbar / right edge */\n padding-inline-end: calc(var(--detail-list-column-gap, 8px) + 4px);\n width: 100%;\n height: 100%;\n display: flex;\n flex-flow: column wrap;\n align-content: flex-start;\n column-gap: var(--detail-list-column-gap, 8px);\n overflow-x: auto;\n overflow-y: hidden;\n box-sizing: border-box;\n /* Scrollbar theming: consumers override these CSS variables to control\n the native scrollbar (scrollbar-width, scrollbar-gutter, scrollbar-color). */\n scrollbar-width: var(--detail-list-scrollbar-width, auto);\n scrollbar-gutter: var(--detail-list-scrollbar-gutter, auto);\n scrollbar-color: var(--detail-list-scrollbar-color, auto);\n }\n\n ::slotted([hidden]) {\n display: none !important;\n }\n\n ::slotted(li) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n flex: none;\n width: var(--detail-list-column-width, 220px);\n height: var(--detail-list-item-height, 28px);\n padding: var(--_detail-list-item-padding);\n cursor: pointer;\n user-select: none;\n transition: background var(--transition, 0.1s ease-out),\n outline-color var(--transition, 0.1s ease-out);\n outline: 1px solid transparent;\n }\n\n /* In checked mode, only the checkbox column is clickable; the row body\n gets a default cursor so it doesn't suggest otherwise. */\n :host([interaction-mode=\"checked\"]) ::slotted(li) {\n cursor: default;\n }\n\n ::slotted([data-tickled]) {\n background: var(--item-bg-tickled);\n outline: var(--item-border-tickled);\n }\n\n ::slotted([data-selected]) {\n background: var(--item-bg-selected);\n color: var(--item-text-selected);\n outline: 1px solid transparent;\n }\n\n ::slotted([data-selected][data-tickled]) {\n background: var(--item-bg-selected-tickled);\n outline: 2px dashed var(--surface-3);\n outline-offset: -2px;\n }\n\n /* Drag-select (marquee) rectangle + covered-row preview.\n Style hooks: part=\"marquee\", --detail-list-marquee-border,\n --detail-list-marquee-fill. */\n .marquee {\n position: absolute;\n pointer-events: none;\n z-index: 5;\n border: 1px solid var(--detail-list-marquee-border, var(--accent));\n background: var(--detail-list-marquee-fill, color-mix(in srgb, var(--accent) 15%, transparent));\n }\n\n ::slotted([data-marquee]) {\n background: var(--item-bg-selected);\n color: var(--item-text-selected);\n }\n\n /* checked mode: the injected checkbox communicates selection — suppress bg */\n :host([interaction-mode=\"checked\"]) ::slotted([data-selected]) {\n background: transparent;\n color: inherit;\n outline: 1px solid transparent;\n }\n\n :host([interaction-mode=\"checked\"]) ::slotted([data-selected][data-tickled]) {\n background: var(--item-bg-tickled);\n color: inherit;\n outline: var(--item-border-tickled);\n }\n\n .loading {\n position: absolute;\n bottom: 8px;\n right: 8px;\n z-index: 10;\n background: var(--surface-4, #2a2a2a);\n border: 1px solid var(--border, #444);\n border-radius: var(--radius-m, 4px);\n padding: 2px 8px;\n font-size: var(--text-s, 11px);\n color: var(--surface-muted-text, #888);\n }\n\n .loading[hidden] {\n display: none;\n }\n `];\n\n // --- Render ---\n\n override render() {\n const loading = this.#data.loading;\n const progress = this.#data.progress;\n return html`\n <div class=\"container\">\n <ul part=\"list\" class=\"scroll-fade-x\">\n <slot></slot>\n </ul>\n ${this.#marqueeRect\n ? html`<div class=\"marquee\" part=\"marquee\" style=${this.#marqueeStyle(this.#marqueeRect)}></div>`\n : ``}\n <div class=\"loading\" part=\"loading\" ?hidden=${!loading}>\n ${loading\n ? (progress !== undefined ? `${Math.round(progress * 100)}%` : `loading…`)\n : nothing}\n </div>\n ${this.search.renderField()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-detail-list': DetailListElement;\n }\n\n interface HTMLElementEventMap extends ListElementEventMap {}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"detail-list.js","names":["#dragSelect","#nativeDrag","#prepareNativeDrag","#nativeDragging","#startPostDragSuppressTimer","#marqueeHitTest","#marqueeRect","#navigateDown","#navigateUp","#navigateRight","#navigateLeft","#navigateTo","#findFirstCheckable","#findLastCheckable","#postDragSuppressTimer","#data","#itemData","#searchRegistry","#effectiveSearchModes","#unregisterSearchCommands","#resizeObserver","#scheduleGeometry","#mutationObserver","#processChildren","#animateChildMutations","#animatedItems","#syncSearchCommands","#applyFilterPredicate","#recomputeGeometry","#builtFromProvider","#providerBuilt","#rebuildFromObjects","#syncFromProvider","#applySort","#ensureIcon","#itemForKey","#createItemEl","#propertyValue","#geometryScheduled","#grid","#positions","#gridSize","#itemAt","#positionOf","#findNextCheckable","#marqueeStyle","customElement"],"sources":["../src/detail-list/detail-list.ts"],"sourcesContent":["import type { CommandId, CommandRegistry } from '@clinth/ui-commands';\nimport type { PropertyValues } from 'lit';\nimport type { IDataProvider } from '../common/data-provider.js';\nimport type { ListSearchMode } from '../incr-search/index.js';\nimport type { DragSelectRect } from '../interaction/list-drag-select-controller.js';\nimport type {\n ListDragEntry,\n ListDragPreviewRenderer,\n ListNativeDragStartEvent,\n} from '../interaction/list-drag-types.js';\nimport type {\n ListActivateDetail,\n ListElementEventMap,\n ListInteractionMode,\n ListItemClickDetail,\n ListSelectDetail,\n ListSelectionMode,\n ListTickleDetail,\n} from '../interaction/list-selection-types.js';\nimport type {\n AddItemOptions,\n CustomCheckboxOptions,\n DetailFormatter,\n DetailSortComparator,\n DetailSortItem,\n DetailSortMode,\n} from './types.js';\nimport { createCommandRegistry } from '@clinth/ui-commands';\nimport { css, html, LitElement, nothing, render } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { DataController } from '../common/data-controller.js';\nimport {\n createElementListSearchAdapter,\n LIST_SEARCH_MODES,\n ListSearchController,\n listSearchStyles,\n registerListSearchCommands,\n} from '../incr-search/index.js';\nimport { keyForElement } from '../interaction/keyed-list.js';\nimport { ListDragSelectController } from '../interaction/list-drag-select-controller.js';\nimport { animateListItemIn, animateListItemOut, LIST_ITEM_MOTION_MS } from '../interaction/list-item-animation.js';\nimport { ListNativeDragController } from '../interaction/list-native-drag-controller.js';\nimport { ListSelectionController } from '../interaction/list-selection-controller.js';\nimport { TickledController } from '../interaction/tickled-controller.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { scrollFadeStyles } from '../styles/scroll-fade.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type {\n ListDragEntry,\n ListDragPreview,\n ListDragPreviewContext,\n ListDragPreviewRenderer,\n ListDragSource,\n ListNativeDragStartDetail,\n ListNativeDragStartEvent,\n} from '../interaction/list-drag-types.js';\nexport type {\n AddItemOptions,\n CustomCheckboxOptions,\n DetailFormatter,\n DetailSortComparator,\n DetailSortItem,\n DetailSortMode,\n} from './types.js';\n\nconst ITEM_SELECTOR = `:scope > li`;\nconst SEARCH_HIGHLIGHT_KEY = `detail-list-search`;\nconst LABEL_SPAN_CSS = `overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0`;\n\ntype GridPosition = { readonly col: number; readonly row: number };\n\n/**\n * A list that scales horizontally, not vertically.\n *\n * Items are laid out in equal-width columns; they flow top→bottom down a\n * column, then wrap to the top of the next column to the right. The\n * component has a fixed vertical extent and scrolls horizontally.\n *\n * Selection semantics match `ixfx-vertical-list` — same modes, same\n * `list-*` events, same keyboard gestures — but navigation is a 2-D grid\n * (Up/Down move within a column, Left/Right jump columns).\n *\n * Items come from any of three sources (later writes win):\n * 1. declarative `<li>` children in light DOM,\n * 2. `addItem()` / `setItems()`,\n * 3. an `items` array of objects rendered via `displayProperty` /\n * `formatter`, optionally streamed in via a `provider`.\n */\n@customElement(`ixfx-detail-list`)\nexport class DetailListElement extends LitElement {\n @property({ type: String, attribute: `selection-mode` })\n selectionMode: ListSelectionMode = `single`;\n\n @property({ type: String, attribute: `interaction-mode` })\n interactionMode: ListInteractionMode = `standard`;\n\n @property({ type: String })\n sort: DetailSortMode = `none`;\n\n @property({ type: String, attribute: `sort-by` })\n sortBy = ``;\n\n @property({ attribute: false })\n sortComparator: DetailSortComparator | undefined;\n\n @property({ attribute: false })\n items: readonly unknown[] = [];\n\n @property({ attribute: false })\n provider: IDataProvider<void, unknown> | undefined;\n\n @property({ type: String, attribute: `display-property` })\n displayProperty = ``;\n\n @property({ attribute: false })\n formatter: DetailFormatter | undefined;\n\n @property({ type: String, attribute: `icon-property` })\n iconProperty = ``;\n\n @property({ type: String, attribute: `key-property` })\n keyProperty = ``;\n\n @property({ attribute: false })\n filterPredicate: ((el: Element) => boolean) | undefined;\n\n /**\n * Whether keyboard navigation wraps from last to first and vice versa.\n * - 'stop' (default): navigation stops at the boundary\n * - 'wrap': navigation wraps around\n */\n @property({ type: String, attribute: `item-wrap` })\n itemWrap: `stop` | `wrap` = `stop`;\n\n /** Optional renderer for the checkbox shown in `checked` interactionMode. */\n @property({ attribute: false })\n checkboxRenderer: ((checked: boolean) => unknown) | CustomCheckboxOptions | undefined;\n\n /**\n * Space-separated subset of `navigate select filter` — limits which\n * incremental-search modes are offered. Unset ⇒ all three; empty ⇒ search\n * disabled. See `docs/infra-incremental.md`.\n */\n @property({ type: String, attribute: `search-modes`, reflect: true })\n searchModes: string | undefined;\n\n /**\n * Enable native browser drag-and-drop for selectable items. When true,\n * selectable rows become draggable and the list emits\n * `list-native-drag-start` when a drag begins.\n */\n @property({ type: Boolean, attribute: `items-draggable`, reflect: true })\n itemsDraggable = false;\n\n /**\n * Custom drag preview renderer (synchronous). Defaults to the shared\n * built-in HTML+canvas preview.\n */\n @property({ attribute: false })\n dragPreviewRenderer: ListDragPreviewRenderer<Element> | undefined;\n\n @query(`ul`)\n private _listEl!: HTMLUListElement;\n\n #itemData = new WeakMap<HTMLLIElement, unknown>();\n #grid: Element[][] = [];\n #positions = new Map<Element, GridPosition>();\n #geometryScheduled = false;\n #resizeObserver: ResizeObserver | undefined;\n #mutationObserver: MutationObserver | undefined;\n /** Items that have already played (or been skipped for) their enter animation. */\n #animatedItems = new WeakSet<Element>();\n #builtFromProvider: readonly unknown[] = [];\n #providerBuilt = 0;\n\n readonly #data = new DataController<void, unknown>(this);\n\n private readonly selection = new ListSelectionController<Element>({\n getOrderedItems: () => this._getVisibleItems(),\n isSelectable: el => this._isCheckable(el),\n getModes: () => ({ selectionMode: this.selectionMode, interactionMode: this.interactionMode }),\n getKey: keyForElement,\n onChange: (selected, previous) => {\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, {\n selected,\n previous,\n selectedKeys: this.selection.selectedKeys,\n });\n },\n });\n\n private tickled = new TickledController<Element>(this, {\n getItems: () => this._getVisibleItems().map(el => ({\n id: el,\n enabled: !el.hasAttribute(`not-checked`),\n })),\n onTickle: (id) => {\n if (id !== undefined) {\n this._dispatch<ListTickleDetail>(`list-tickle`, { item: id });\n }\n },\n onStateChange: () => this._syncItemStates(),\n itemWrap: this.itemWrap,\n hoverDisabled: () => this.#dragSelect.isDragging || this.#nativeDrag.isDragging,\n });\n\n #nativeDragging = false;\n #postDragSuppressTimer = 0;\n\n readonly #nativeDrag = new ListNativeDragController<Element>(this, {\n source: `detail-list`,\n isEnabled: () => this.itemsDraggable && this.selectionMode !== `none` && this._getVisibleItems().length > 0,\n resolveEventToKey: (target) => {\n if (!(target instanceof Element))\n return undefined;\n const li = target.closest?.(`li`) as HTMLElement | null;\n if (!li || !this.contains(li))\n return undefined;\n return keyForElement(li);\n },\n prepareSelection: originKey => this.#prepareNativeDrag(originKey),\n getMetrics: () => ({}),\n getRenderer: () => this.dragPreviewRenderer,\n dispatch: detail => this._dispatchCancelable(`list-native-drag-start`, detail),\n onActiveChange: (active, originKey) => {\n this.#nativeDragging = active;\n this.toggleAttribute(`data-native-dragging`, active);\n for (const el of this.querySelectorAll(`li`))\n el.toggleAttribute(`data-drag-origin`, active && originKey !== undefined && keyForElement(el) === originKey);\n if (active) {\n const count = this.selection.selected.size;\n this.setAttribute(`aria-label`, count <= 1 ? `Dragging 1 item` : `Dragging ${count} items`);\n } else {\n this.removeAttribute(`aria-label`);\n }\n this.requestUpdate();\n },\n onEnd: () => {\n this.#nativeDragging = false;\n this.toggleAttribute(`data-native-dragging`, false);\n this.removeAttribute(`aria-label`);\n for (const el of this.querySelectorAll(`li`))\n el.removeAttribute(`data-drag-origin`);\n this.#startPostDragSuppressTimer();\n },\n syncLightDomDraggable: () => this._syncNativeDraggable(),\n });\n\n #prepareNativeDrag(originKey: string): { origin: ListDragEntry<Element>; selected: Array<ListDragEntry<Element>> } | undefined {\n const visible = this._getVisibleItems();\n const originEl = visible.find(el => keyForElement(el) === originKey);\n if (!originEl || !this._isCheckable(originEl))\n return undefined;\n if (!this.selection.selected.has(originEl))\n this.selection.replace(originEl);\n const selected: Array<ListDragEntry<Element>> = [];\n visible.forEach((el, index) => {\n if (!this.selection.selected.has(el))\n return;\n const key = keyForElement(el) ?? originKey;\n selected.push({\n key,\n index,\n item: (this.#itemData.get(el as HTMLLIElement) ?? el) as Element,\n element: el,\n });\n });\n const origin = selected.find(entry => entry.key === originKey);\n if (!origin)\n return undefined;\n return { origin, selected };\n }\n\n private _syncNativeDraggable(): void {\n if (!this.isConnected)\n return;\n for (const el of this.querySelectorAll(`li`)) {\n if (el instanceof HTMLElement)\n el.draggable = this.itemsDraggable && this._isCheckable(el);\n }\n }\n\n #startPostDragSuppressTimer(): void {\n if (this.#postDragSuppressTimer)\n clearTimeout(this.#postDragSuppressTimer);\n this.#postDragSuppressTimer = window.setTimeout(() => {\n this.#postDragSuppressTimer = 0;\n }, 0);\n }\n\n /** Live drag-select preview rect (surface-relative); the covered items carry `data-marquee`. */\n #marqueeRect: DragSelectRect | undefined;\n\n readonly #dragSelect = new ListDragSelectController<Element>(this, {\n getSurface: () => this.renderRoot.querySelector(`.container`) as HTMLElement | undefined,\n isEnabled: () =>\n this.selection.canDragSelect()\n && this._getVisibleItems().length > 0\n && !this.hasAttribute(`disable-drag-select`),\n hitTest: rect => this.#marqueeHitTest(rect),\n getBaseSelection: () => this.selection.selected,\n onPreview: (preview, rect) => {\n this.#marqueeRect = rect;\n for (const el of this._getVisibleItems())\n el.toggleAttribute(`data-marquee`, preview.has(el));\n this.requestUpdate();\n },\n onCommit: (finalSet) => {\n this.selection.applyDragSelection(finalSet);\n for (const el of this._getVisibleItems())\n el.removeAttribute(`data-marquee`);\n this.#marqueeRect = undefined;\n this.requestUpdate();\n },\n autoScroll: (dx, _dy) => {\n if (this._listEl)\n this._listEl.scrollLeft += dx;\n },\n });\n\n /** Collect visible items whose surface-relative box intersects `rect`. */\n #marqueeHitTest(rect: DragSelectRect): Element[] {\n const surface = this.renderRoot.querySelector(`.container`);\n if (!surface)\n return [];\n const box = surface.getBoundingClientRect();\n const rx0 = rect.x;\n const ry0 = rect.y;\n const rx1 = rect.x + rect.width;\n const ry1 = rect.y + rect.height;\n const out: Element[] = [];\n for (const el of this._getVisibleItems()) {\n const r = el.getBoundingClientRect();\n const left = r.left - box.left;\n const top = r.top - box.top;\n if (left <= rx1 && left + r.width >= rx0 && top <= ry1 && top + r.height >= ry0)\n out.push(el);\n }\n return out;\n }\n\n #marqueeStyle(rect: DragSelectRect): string {\n return `left:${rect.x}px;top:${rect.y}px;width:${Math.max(0, rect.width)}px;height:${Math.max(0, rect.height)}px`;\n }\n\n /** Incremental search (navigate / select / filter). See `docs/infra-incremental.md`. */\n readonly search = new ListSearchController<Element>(this, {\n adapter: createElementListSearchAdapter(this, {\n itemSelector: ITEM_SELECTOR,\n getLabel: el => el.getAttribute(`data-search-label`) ?? el.textContent?.trim() ?? ``,\n highlightKey: SEARCH_HIGHLIGHT_KEY,\n }),\n });\n\n #searchRegistry: CommandRegistry<unknown> | undefined;\n #unregisterSearchCommands: (() => void) | undefined;\n\n /** Command registry carrying this list's `list.search.*` commands. */\n get registry(): CommandRegistry<unknown> | undefined {\n return this.#searchRegistry;\n }\n\n #effectiveSearchModes(): ListSearchMode[] {\n const raw = this.searchModes?.trim();\n if (raw === undefined)\n return [...LIST_SEARCH_MODES];\n const requested = new Set(raw.split(/\\s+/));\n return LIST_SEARCH_MODES.filter(m => requested.has(m));\n }\n\n #syncSearchCommands(): void {\n if (!this.#searchRegistry)\n return;\n this.search.setModes(this.#effectiveSearchModes());\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = registerListSearchCommands(this.#searchRegistry, this.search);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`tabindex`))\n this.tabIndex = 0;\n this.addEventListener(`pointerover`, this._onPointerOver);\n this.addEventListener(`pointerleave`, this._onPointerLeave);\n this.addEventListener(`keydown`, this._onKeyDown);\n this.addEventListener(`click`, this._onClick);\n this.addEventListener(`dblclick`, this._onDblClick);\n this.addEventListener(`wheel`, this._onWheel);\n\n this.#resizeObserver = new ResizeObserver(() => this.#scheduleGeometry());\n this.#resizeObserver.observe(this);\n this.#mutationObserver = new MutationObserver((records) => {\n this.#processChildren();\n this.#animateChildMutations(records);\n this.#scheduleGeometry();\n });\n this.#mutationObserver.observe(this, {\n childList: true,\n subtree: false,\n attributeFilter: [`hidden`],\n });\n for (const el of this.querySelectorAll(ITEM_SELECTOR))\n this.#animatedItems.add(el);\n this.#searchRegistry ??= createCommandRegistry();\n this.#syncSearchCommands();\n }\n\n /**\n * Collapse-in items appended to the light DOM (however they got there). A bulk\n * populate is left alone. Geometry is re-read once the animations settle so\n * keyboard navigation lines back up with the final layout.\n */\n #animateChildMutations(records: MutationRecord[]): void {\n if (!this.isConnected)\n return;\n const fresh: HTMLElement[] = [];\n for (const record of records) {\n for (const node of record.addedNodes) {\n // ITEM_SELECTOR is `:scope > li`, which can't be used with `.matches()`\n // — every item here is a direct `<li>` child, so check that directly.\n if (!(node instanceof HTMLElement) || node.parentElement !== this || node.localName !== `li`)\n continue;\n if (this.#animatedItems.has(node))\n continue;\n this.#animatedItems.add(node);\n fresh.push(node);\n }\n }\n if (fresh.length === 0)\n return;\n const total = this.querySelectorAll(ITEM_SELECTOR).length;\n if (fresh.length >= total)\n return; // first populate / wholesale replace\n for (const el of fresh)\n animateListItemIn(el);\n window.setTimeout(() => this.#scheduleGeometry(), LIST_ITEM_MOTION_MS + 30);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointerover`, this._onPointerOver);\n this.removeEventListener(`pointerleave`, this._onPointerLeave);\n this.removeEventListener(`keydown`, this._onKeyDown);\n this.removeEventListener(`click`, this._onClick);\n this.removeEventListener(`dblclick`, this._onDblClick);\n this.removeEventListener(`wheel`, this._onWheel);\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = undefined;\n this.#mutationObserver?.disconnect();\n this.#mutationObserver = undefined;\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = undefined;\n this.#searchRegistry = undefined;\n if (this.#postDragSuppressTimer) {\n clearTimeout(this.#postDragSuppressTimer);\n this.#postDragSuppressTimer = 0;\n }\n }\n\n override firstUpdated(): void {\n this.#processChildren();\n if (this.filterPredicate) {\n this.#applyFilterPredicate();\n }\n this.#recomputeGeometry();\n this._syncNativeDraggable();\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`searchModes`)) {\n this.#syncSearchCommands();\n }\n if (changed.has(`provider`)) {\n this.#builtFromProvider = [];\n this.#providerBuilt = 0;\n this.#data.provider = this.provider;\n queueMicrotask(() => {\n if (this.provider)\n this.#data.request(undefined);\n });\n return;\n }\n if (changed.has(`items`) && this.provider === undefined && this.items.length > 0) {\n this.#rebuildFromObjects(this.items);\n }\n this.#syncFromProvider();\n if (changed.has(`sort`) || changed.has(`sortBy`) || changed.has(`sortComparator`)) {\n this.#applySort();\n }\n if (changed.has(`filterPredicate`)) {\n this.#applyFilterPredicate();\n this.#scheduleGeometry();\n }\n if (changed.has(`interactionMode`)) {\n this.selection.clearAnchor();\n this._syncItemStates();\n this._syncNativeDraggable();\n } else if (changed.has(`checkboxRenderer`) && this.interactionMode === `checked`) {\n this._syncCheckboxes();\n }\n if (changed.has(`itemsDraggable`)) {\n this._syncNativeDraggable();\n this.#nativeDrag.refreshDraggable();\n }\n }\n\n // --- Public API ---\n\n /** The most recently selected item, or `undefined` if nothing is selected. */\n get selectedItem(): Element | undefined {\n return [...this.selection.selected].at(-1);\n }\n\n /** The full current selection set (read-only). */\n get selectedItems(): ReadonlySet<Element> {\n return this.selection.selected;\n }\n\n /**\n * Force an immediate geometry recompute. Called automatically on resize,\n * DOM changes, sort/filter/search changes — only needed when layout is\n * changed by outside forces (e.g. an external font load).\n */\n refreshLayout(): void {\n this.#recomputeGeometry();\n }\n\n addItem(item: Element | string, options?: AddItemOptions): void {\n let el: Element;\n if (typeof item === `string`) {\n const li = document.createElement(`li`);\n this._setLabel(li, item);\n el = li;\n } else {\n el = item;\n }\n if (options?.notChecked)\n el.setAttribute(`not-checked`, ``);\n this.appendChild(el);\n this.#ensureIcon(el as HTMLLIElement);\n if (this.sort !== `none`)\n this.#applySort();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n }\n\n /**\n * Collapse + fade `item` out, then detach it; the rows after it slide up to\n * close the gap. Resolves once removed. Immediate under reduced motion.\n */\n removeItem(item: Element): Promise<void> {\n this.selection.deselect(item);\n return animateListItemOut(item as HTMLElement).then(() => {\n item.remove();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n this.#recomputeGeometry();\n });\n }\n\n /** {@link removeItem} for several items at once. */\n removeItems(items: Iterable<Element>): Promise<void> {\n return Promise.all([...items].map(item => this.removeItem(item))).then(() => undefined);\n }\n\n clearItems(): void {\n this.replaceChildren();\n this.selection.reset();\n this.#builtFromProvider = [];\n this.#providerBuilt = 0;\n this._syncItemStates();\n }\n\n /**\n * Replace the entire item list in one call.\n * Equivalent to `clearItems()` followed by `addItem()` for each element.\n */\n setItems(items: readonly Element[]): void {\n this.clearItems();\n for (const item of items) {\n this.appendChild(item);\n this.#ensureIcon(item as HTMLLIElement);\n }\n if (this.sort !== `none`)\n this.#applySort();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n }\n\n /**\n * Get the source object behind an `<li>` built from an `items` array or\n * provider. Returns `undefined` for declarative / programmatic elements.\n */\n getItemData(item: HTMLLIElement): unknown {\n return this.#itemData.get(item);\n }\n\n /**\n * Dispatch a command to this list — used by `ixfx-grouped-item-lister` to\n * forward commands. Routes through the command registry (so `list.search.*`\n * and any other registered commands work).\n */\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n this.#searchRegistry?.invoke(commandId, args);\n }\n\n select(item: Element): void {\n this.selection.replace(item);\n }\n\n selectMany(items: Iterable<Element>): void {\n this.selection.selectMany(items);\n }\n\n deselect(item: Element): void {\n this.selection.deselect(item);\n }\n\n clearSelection(): void {\n this.selection.clear();\n }\n\n selectAll(): void {\n if (this.selection.canSelectAll())\n this.selection.selectAll();\n }\n\n // --- Key-based selection & cursor ---\n\n /** The selection as stable `data-key` / `data-value` strings. */\n get selectedKeys(): ReadonlySet<string> {\n return this.selection.selectedKeys;\n }\n\n /** The key of the item under the cursor, or `undefined`. */\n get tickledKey(): string | undefined {\n const id = this.tickled.tickledId;\n return id ? keyForElement(id) : undefined;\n }\n\n /** Replace the selection with the items carrying these keys (unknown keys ignored). */\n selectKeys(keys: Iterable<string>): void {\n this.selection.selectKeys(keys, key => this.#itemForKey(key));\n }\n\n /** Add items by key to the selection (multi-select modes only). */\n addSelectedKeys(keys: Iterable<string>): void {\n this.selection.addKeys(keys, key => this.#itemForKey(key));\n }\n\n /** Remove items by key from the selection. */\n removeSelectedKeys(keys: Iterable<string>): void {\n this.selection.removeKeys(keys, key => this.#itemForKey(key));\n }\n\n /** Move the cursor to the item with this key and scroll it into view. */\n focusKey(key: string): void {\n const el = this.#itemForKey(key);\n if (!el)\n return;\n this.tickled.focus(el);\n el.scrollIntoView({ block: `nearest`, inline: `nearest` });\n }\n\n #itemForKey(key: string): Element | undefined {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if (keyForElement(el) === key)\n return el;\n }\n return undefined;\n }\n\n * selectedFilter(kind: `selected` | `checked` | `either`): Generator<Element> {\n const wanted = (el: Element) => {\n switch (kind) {\n case `selected`: return el.hasAttribute(`data-selected`);\n case `checked`: return el.hasAttribute(`data-checked`);\n case `either`: return el.hasAttribute(`data-selected`) || el.hasAttribute(`data-checked`);\n }\n };\n\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if ((el as HTMLElement).hidden)\n continue;\n if (wanted(el))\n yield el;\n }\n }\n\n // --- Object items ---\n\n #rebuildFromObjects(items: readonly unknown[]): void {\n const keyOf = (el: Element): string | null =>\n el.getAttribute(`data-key`) ?? el.getAttribute(`data-search-label`) ?? null;\n const previousKeys = new Set(\n [...this.selection.selected].map(keyOf).filter((k): k is string => k !== null),\n );\n const anchorKey = this.selection.anchor ? keyOf(this.selection.anchor) : null;\n\n this.replaceChildren(...items.map((item, index) => this.#createItemEl(item, index)));\n\n // Re-select by key so selection survives the element-reference rebuild\n if (previousKeys.size > 0 || anchorKey !== null) {\n const next: Element[] = [];\n let anchor: Element | undefined;\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n const key = keyOf(el);\n if (key !== null && previousKeys.has(key))\n next.push(el);\n if (key !== null && key === anchorKey)\n anchor = el;\n }\n this.selection.seed(next, anchor);\n }\n\n if (this.sort !== `none`)\n this.#applySort();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n this._syncItemStates();\n this.#scheduleGeometry();\n }\n\n #createItemEl(item: unknown, index: number): HTMLLIElement {\n const li = document.createElement(`li`);\n this.#itemData.set(li, item);\n\n const content = this.formatter\n ? this.formatter(item, index)\n : (this.displayProperty\n ? this.#propertyValue(item, this.displayProperty)\n : item);\n if (typeof content === `string`) {\n this._setLabel(li, content);\n if (this.iconProperty) {\n const icon = this.#propertyValue(item, this.iconProperty);\n if (typeof icon === `string` && icon.length > 0)\n li.setAttribute(`data-icon`, icon);\n }\n } else if (content instanceof Node) {\n li.appendChild(content);\n }\n\n if (this.keyProperty) {\n const key = this.#propertyValue(item, this.keyProperty);\n if (key !== undefined && key !== null)\n li.setAttribute(`data-key`, String(key));\n }\n this.#ensureIcon(li);\n return li;\n }\n\n #propertyValue(item: unknown, prop: string): unknown {\n if (typeof item !== `object` || item === null || !(prop in item))\n return undefined;\n return (item as Record<string, unknown>)[prop];\n }\n\n // --- Provider (async) items ---\n\n #syncFromProvider(): void {\n if (this.provider === undefined)\n return;\n const items = this.#data.items;\n if (items === this.#builtFromProvider)\n return;\n\n // Longest common prefix by identity — pure appends extend the columns,\n // anything else rebuilds.\n let prefix = 0;\n while (\n prefix < this.#builtFromProvider.length\n && prefix < items.length\n && this.#builtFromProvider[prefix] === items[prefix]\n ) {\n prefix++;\n }\n\n if (prefix === this.#builtFromProvider.length && prefix <= items.length) {\n const tail = items.slice(prefix);\n for (const item of tail) {\n this.appendChild(this.#createItemEl(item, this.#providerBuilt++));\n }\n if (this.sort !== `none`)\n this.#applySort();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n this._syncItemStates();\n this.#scheduleGeometry();\n } else {\n this.#providerBuilt = 0;\n this.#rebuildFromObjects(items);\n }\n this.#builtFromProvider = items;\n }\n\n // --- Filtering ---\n\n #applyFilterPredicate(): void {\n if (!this.filterPredicate) {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n el.removeAttribute(`hidden`);\n }\n return;\n }\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if (this.filterPredicate(el)) {\n el.removeAttribute(`hidden`);\n } else {\n el.setAttribute(`hidden`, ``);\n }\n }\n }\n\n // --- Sorting ---\n\n #applySort(): void {\n if (this.sort === `none`)\n return;\n const rows = [...this.querySelectorAll(ITEM_SELECTOR)] as HTMLLIElement[];\n if (rows.length < 2)\n return;\n\n const dir = this.sort === `descending` ? -1 : 1;\n const meta = (el: HTMLLIElement): DetailSortItem => ({\n element: el,\n data: this.getItemData(el),\n label: el.getAttribute(`data-search-label`) ?? el.textContent?.trim() ?? ``,\n });\n\n let cmp: (a: HTMLLIElement, b: HTMLLIElement) => number;\n if (this.sortComparator) {\n const user = this.sortComparator;\n cmp = (a, b) => user(meta(a), meta(b));\n } else if (this.sortBy) {\n const prop = this.sortBy;\n const key = (el: HTMLLIElement): string | number => {\n const v = this.#propertyValue(this.getItemData(el), prop);\n if (typeof v === `number`)\n return v;\n return v === undefined || v === null ? `` : String(v);\n };\n cmp = (a, b) => {\n const ka = key(a);\n const kb = key(b);\n if (typeof ka === `number` && typeof kb === `number`)\n return ka - kb;\n return String(ka).localeCompare(String(kb), undefined, { numeric: true });\n };\n } else {\n cmp = (a, b) =>\n meta(a).label.localeCompare(meta(b).label, undefined, { numeric: true });\n }\n\n const indexed = rows.map((el, i) => ({ el, i }));\n indexed.sort((a, b) => cmp(a.el, b.el) * dir || a.i - b.i); // stable\n for (const { el } of indexed)\n this.appendChild(el); // moving reorders in place\n this.#scheduleGeometry();\n }\n\n // --- Geometry (measured grid) ---\n\n #scheduleGeometry(): void {\n if (this.#geometryScheduled)\n return;\n this.#geometryScheduled = true;\n requestAnimationFrame(() => {\n this.#geometryScheduled = false;\n this.#recomputeGeometry();\n });\n }\n\n #recomputeGeometry(): void {\n this.#grid = [];\n this.#positions.clear();\n if (!this.isConnected)\n return;\n\n const columns: Array<{ left: number; items: Element[] }> = [];\n for (const el of this._getVisibleItems()) {\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0)\n continue;\n let ci = columns.findIndex(c => Math.abs(c.left - rect.left) <= 1);\n if (ci === -1) {\n columns.push({ left: rect.left, items: [] });\n ci = columns.length - 1;\n }\n columns[ci].items.push(el);\n }\n columns.sort((a, b) => a.left - b.left);\n for (const col of columns)\n col.items.sort((a, b) => a.getBoundingClientRect().top - b.getBoundingClientRect().top);\n\n this.#grid = columns.map(c => c.items);\n this.#grid.forEach((col, colIdx) =>\n col.forEach((el, rowIdx) => this.#positions.set(el, { col: colIdx, row: rowIdx })),\n );\n }\n\n #positionOf(el: Element): GridPosition | undefined {\n let pos = this.#positions.get(el);\n if (pos === undefined) {\n this.#recomputeGeometry();\n pos = this.#positions.get(el);\n }\n return pos;\n }\n\n #itemAt(col: number, row: number): Element | undefined {\n return this.#grid[col]?.[row];\n }\n\n #gridSize(): { cols: number; rows: number } {\n if (this.#grid.length === 0)\n this.#recomputeGeometry();\n return { cols: this.#grid.length, rows: Math.max(0, ...this.#grid.map(c => c.length)) };\n }\n\n // --- Keyboard navigation ---\n\n #navigateTo(target: Element | undefined): void {\n if (!target)\n return;\n this.tickled.handleKeyboardNavigation(target);\n this.tickled.tickledId?.scrollIntoView({ block: `nearest`, inline: `nearest` });\n }\n\n #findNextCheckable(fromCol: number, fromRow: number, deltaCol: number, deltaRow: number): Element | undefined {\n const { cols } = this.#gridSize();\n const visibleItems = this._getVisibleItems();\n const maxIterations = visibleItems.length + 1;\n\n // Start from the next position\n // For horizontal nav: move to next column first, keep same row\n // For vertical nav: stay in same column, move row\n // For diagonal nav: both change\n let col = deltaCol !== 0 ? fromCol + deltaCol : fromCol;\n let row = deltaRow !== 0 ? fromRow + deltaRow : fromRow;\n\n // Track whether we've tried wrapping columns\n let wrappedColumns = false;\n\n for (let iterations = 0; iterations < maxIterations; iterations++) {\n // Check bounds\n const colLength = this.#grid[col]?.length ?? 0;\n\n if (row < 0 || row >= colLength) {\n // Need to move to another column\n if (deltaCol !== 0 || wrappedColumns) {\n // Already tried wrapping, or horizontal nav - stop or wrap\n if (this.itemWrap === `wrap`) {\n // Simple wrap: if deltaCol < 0, go to last column; if deltaCol > 0, go to first\n if (deltaCol < 0) {\n col = cols - 1;\n } else if (deltaCol > 0) {\n col = 0;\n }\n wrappedColumns = true;\n } else {\n return undefined;\n }\n }\n\n // Try next/prev column\n if (deltaRow > 0) {\n // Going down - try next column at row 0\n if (col + 1 < cols) {\n col = col + 1;\n row = 0;\n wrappedColumns = true;\n } else if (this.itemWrap === `wrap`) {\n col = 0;\n row = 0;\n wrappedColumns = true;\n } else {\n return undefined;\n }\n } else if (deltaRow < 0) {\n // Going up - try prev column at last row\n if (col - 1 >= 0) {\n col = col - 1;\n row = (this.#grid[col]?.length ?? 1) - 1;\n wrappedColumns = true;\n } else if (this.itemWrap === `wrap`) {\n col = cols - 1;\n row = (this.#grid[col]?.length ?? 1) - 1;\n wrappedColumns = true;\n } else {\n return undefined;\n }\n } else if (deltaCol !== 0) {\n // Horizontal navigation - adjust row if target column is shorter\n const targetColLength = this.#grid[col]?.length ?? 0;\n if (row >= targetColLength && targetColLength > 0) {\n row = targetColLength - 1;\n }\n }\n\n // If we're now at same position as start, we've looped\n if (col === fromCol && row === fromRow + deltaRow) {\n return undefined;\n }\n continue;\n }\n\n const item = this.#itemAt(col, row);\n if (item && this._isCheckable(item)) {\n return item;\n }\n\n // Move to next position\n row += deltaRow;\n }\n\n return undefined;\n }\n\n #findFirstCheckable(): Element | undefined {\n const visibleItems = this._getVisibleItems();\n return visibleItems.find(item => this._isCheckable(item));\n }\n\n #findLastCheckable(): Element | undefined {\n const visibleItems = this._getVisibleItems();\n for (let i = visibleItems.length - 1; i >= 0; i--) {\n if (this._isCheckable(visibleItems[i])) {\n return visibleItems[i];\n }\n }\n return undefined;\n }\n\n #navigateDown(): void {\n this.#recomputeGeometry();\n const cur = this.tickled.tickledId ? this.#positionOf(this.tickled.tickledId) : undefined;\n if (!cur) {\n this.#navigateTo(this.#findFirstCheckable());\n return;\n }\n const next = this.#findNextCheckable(cur.col, cur.row, 0, 1);\n if (next) {\n this.#navigateTo(next);\n }\n }\n\n #navigateUp(): void {\n this.#recomputeGeometry();\n const cur = this.tickled.tickledId ? this.#positionOf(this.tickled.tickledId) : undefined;\n if (!cur) {\n this.#navigateTo(this.#findLastCheckable());\n return;\n }\n const next = this.#findNextCheckable(cur.col, cur.row, 0, -1);\n if (next) {\n this.#navigateTo(next);\n }\n }\n\n #navigateRight(): void {\n this.#recomputeGeometry();\n const cur = this.tickled.tickledId ? this.#positionOf(this.tickled.tickledId) : undefined;\n if (!cur) {\n this.#navigateTo(this.#findFirstCheckable());\n return;\n }\n const next = this.#findNextCheckable(cur.col, cur.row, 1, 0);\n if (next) {\n this.#navigateTo(next);\n } else if (this.itemWrap === `wrap`) {\n this.#navigateTo(this.#findFirstCheckable());\n }\n }\n\n #navigateLeft(): void {\n this.#recomputeGeometry();\n const cur = this.tickled.tickledId ? this.#positionOf(this.tickled.tickledId) : undefined;\n if (!cur) {\n this.#navigateTo(this.#findFirstCheckable());\n return;\n }\n const next = this.#findNextCheckable(cur.col, cur.row, -1, 0);\n if (next) {\n this.#navigateTo(next);\n } else if (this.itemWrap === `wrap`) {\n this.#navigateTo(this.#findLastCheckable());\n }\n }\n\n // --- Helpers ---\n\n private _getVisibleItems(): Element[] {\n return Array.from(this.querySelectorAll(ITEM_SELECTOR)).filter((el) => {\n if ((el as HTMLElement).hidden)\n return false;\n if (this.filterPredicate && !this.filterPredicate(el))\n return false;\n return true;\n });\n }\n\n /**\n * Set the column width to fit the widest visible item.\n *\n * This is opt-in; detail lists continue to use `--detail-list-column-width`\n * (or its 220px fallback) until this method is called. The measured value is\n * set directly on this element, so it takes precedence over an inherited\n * value. Returns the applied width in pixels, or 0 when there are no items.\n */\n async fitColumnWidth(): Promise<number> {\n await this.updateComplete;\n\n const items = this._getVisibleItems();\n if (items.length === 0)\n return 0;\n\n const previousWidth = this.style.getPropertyValue(`--detail-list-column-width`);\n const previousPriority = this.style.getPropertyPriority(`--detail-list-column-width`);\n this.style.setProperty(`--detail-list-column-width`, `max-content`);\n\n // Reading the layout forces the temporary max-content width to resolve.\n const width = Math.ceil(Math.max(...items.map(item => item.getBoundingClientRect().width)));\n\n if (previousWidth) {\n this.style.setProperty(`--detail-list-column-width`, previousWidth, previousPriority);\n } else {\n this.style.removeProperty(`--detail-list-column-width`);\n }\n this.style.setProperty(`--detail-list-column-width`, `${width}px`);\n this.#scheduleGeometry();\n return width;\n }\n\n private _isCheckable(item: Element): boolean {\n if (this.interactionMode !== `checked`)\n return true;\n return !item.hasAttribute(`not-checked`);\n }\n\n private _setLabel(li: HTMLLIElement, label: string): void {\n const span = document.createElement(`span`);\n span.style.cssText = LABEL_SPAN_CSS;\n span.textContent = label;\n li.appendChild(span);\n li.setAttribute(`data-search-label`, label);\n }\n\n /**\n * Inject a leading `<ixfx-icon>` into an item carrying `data-icon`.\n * Idempotent — skips when the item already starts with an icon.\n */\n #ensureIcon(li: HTMLLIElement): void {\n const name = li.getAttribute(`data-icon`);\n if (!name)\n return;\n if (li.firstElementChild?.tagName === `IXFX-ICON`)\n return;\n const icon = document.createElement(`ixfx-icon`);\n icon.setAttribute(`name`, name);\n icon.style.marginInlineEnd = `var(--detail-list-icon-gap, 6px)`;\n icon.style.flexShrink = `0`;\n li.prepend(icon);\n }\n\n /** Scan light-DOM children for unprocessed `data-icon` items. */\n #processChildren(): void {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n this.#ensureIcon(el as HTMLLIElement);\n }\n }\n\n private _syncItemStates(): void {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n el.toggleAttribute(`data-tickled`, this.tickled.isTickled(el));\n el.toggleAttribute(`data-selected`, this.selection.selected.has(el));\n if (this.interactionMode === `checked`) {\n el.toggleAttribute(\n `data-checked`,\n !el.hasAttribute(`not-checked`) && this.selection.selected.has(el),\n );\n } else {\n el.removeAttribute(`data-checked`);\n }\n }\n this.dataset.inputMode = this.tickled.inputMode;\n this._syncCheckboxes();\n }\n\n private _syncCheckboxes(): void {\n const inCheckedMode = this.interactionMode === `checked`;\n const wantsCustom = typeof this.checkboxRenderer === `function`;\n\n for (const el of this.querySelectorAll<HTMLElement>(`li`)) {\n const existing = el.querySelector<HTMLElement>(`.ixfx-list-checkbox`);\n if (!inCheckedMode) {\n if (existing)\n existing.remove();\n continue;\n }\n // Rows marked `not-checked` get no checkbox column and can't be checked\n if (el.hasAttribute(`not-checked`)) {\n if (existing)\n existing.remove();\n continue;\n }\n\n const existingIsCustom = existing?.classList.contains(`ixfx-list-checkbox-custom`) ?? false;\n if (existing && existingIsCustom !== wantsCustom)\n existing.remove();\n\n let cb: HTMLElement | null = el.querySelector<HTMLElement>(`.ixfx-list-checkbox`);\n if (!cb) {\n if (wantsCustom) {\n const opts = this.checkboxRenderer as CustomCheckboxOptions;\n const margin = opts.margin ?? `0`;\n const width = opts.width ?? `24px`;\n cb = this._createCustomCheckbox(el, margin, width);\n } else {\n cb = this._createNativeCheckboxCell(el);\n }\n el.prepend(cb);\n }\n\n const checked = this.selection.selected.has(el);\n if (wantsCustom) {\n cb.setAttribute(`aria-checked`, String(checked));\n cb.toggleAttribute(`data-checked`, checked);\n if (this.checkboxRenderer) {\n const renderer = typeof this.checkboxRenderer === `function`\n ? this.checkboxRenderer\n : (this.checkboxRenderer as CustomCheckboxOptions).renderer;\n render(renderer(checked), cb);\n }\n } else {\n const input = cb.querySelector<HTMLInputElement>(`input.ixfx-list-checkbox`);\n if (input)\n input.checked = checked;\n }\n }\n }\n\n /**\n * Native checkbox cell: a span that stretches to the row's full cross-axis\n * (so the entire column height is a click target) with a real `<input>`\n * centred inside. The span owns the click; the input is purely visual and\n * has `pointer-events:none` so a single click produces one toggle.\n */\n private _createNativeCheckboxCell(el: HTMLElement): HTMLSpanElement {\n const cell = document.createElement(`span`);\n cell.className = `ixfx-list-checkbox ixfx-list-checkbox-native`;\n cell.style.cssText = `display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:stretch;width:18px;margin:0 6px 0 0;cursor:pointer;pointer-events:auto`;\n cell.tabIndex = -1;\n cell.setAttribute(`role`, `checkbox`);\n cell.setAttribute(`part`, `checkbox`);\n cell.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this.selection.toggle(el);\n });\n const input = document.createElement(`input`);\n input.type = `checkbox`;\n input.className = `ixfx-list-checkbox`;\n input.style.cssText = `pointer-events:none;cursor:pointer;margin:0`;\n cell.appendChild(input);\n return cell;\n }\n\n /** Custom checkbox cell: same shape as the native cell; renderer content inside. */\n private _createCustomCheckbox(el: HTMLElement, margin: string, width: string): HTMLSpanElement {\n const span = document.createElement(`span`);\n span.className = `ixfx-list-checkbox ixfx-list-checkbox-custom`;\n span.style.cssText = `display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:stretch;width:${width};margin:${margin};cursor:pointer;pointer-events:auto`;\n span.tabIndex = -1;\n span.setAttribute(`role`, `checkbox`);\n span.setAttribute(`part`, `checkbox`);\n span.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this.selection.toggle(el);\n });\n return span;\n }\n\n private _findListItem(path: EventTarget[]): Element | undefined {\n for (const target of path) {\n if (!(target instanceof Element))\n continue;\n if (target === this)\n break;\n if (target.parentElement === this && target.matches(`li`))\n return target;\n }\n return undefined;\n }\n\n private _dispatch<T>(name: keyof ListElementEventMap, detail: T): void {\n this.dispatchEvent(new CustomEvent<T>(name as string, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _dispatchCancelable<T>(name: string, detail: T): boolean {\n return this.dispatchEvent(new CustomEvent<T>(name, {\n detail,\n bubbles: true,\n composed: true,\n cancelable: true,\n }));\n }\n\n // --- Event handlers ---\n\n private _onPointerOver = (e: PointerEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (item)\n this.tickled.handlePointerEnter(item);\n };\n\n private _onPointerLeave = (e: PointerEvent): void => {\n this.tickled.handlePointerLeave(e);\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (this.search.isOpen)\n return;\n if ((e.ctrlKey || e.metaKey) && e.key === `a`) {\n if (this.selection.canSelectAll()) {\n e.preventDefault();\n this.selection.selectAll();\n }\n return;\n }\n\n switch (e.key) {\n case `ArrowDown`: {\n e.preventDefault();\n this.#navigateDown();\n // vscode: Shift+Arrow extends range from anchor\n if (e.shiftKey && this.interactionMode === `vscode`) {\n const cur = this.tickled.tickledId;\n if (cur)\n this.selection.rangeTo(cur);\n }\n break;\n }\n case `ArrowUp`: {\n e.preventDefault();\n this.#navigateUp();\n if (e.shiftKey && this.interactionMode === `vscode`) {\n const cur = this.tickled.tickledId;\n if (cur)\n this.selection.rangeTo(cur);\n }\n break;\n }\n case `ArrowRight`: {\n e.preventDefault();\n this.#navigateRight();\n break;\n }\n case `ArrowLeft`: {\n e.preventDefault();\n this.#navigateLeft();\n break;\n }\n case `Home`: {\n e.preventDefault();\n this.#navigateTo(this.#findFirstCheckable());\n break;\n }\n case `End`: {\n e.preventDefault();\n this.#navigateTo(this.#findLastCheckable());\n break;\n }\n case `Enter`: {\n const id = this.tickled.tickledId;\n if (id) {\n e.preventDefault();\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item: id });\n this._activateItem(id);\n }\n break;\n }\n case ` `: {\n const id = this.tickled.tickledId;\n if (id) {\n e.preventDefault();\n this.selection.handleSpace(id);\n }\n break;\n }\n case `Escape`:\n this.selection.clear();\n break;\n }\n };\n\n private _onClick = (e: MouseEvent): void => {\n if (this.#dragSelect.isDragging || this.#nativeDrag.isDragging || this.#postDragSuppressTimer !== 0)\n return;\n const item = this._findListItem(e.composedPath());\n if (!item)\n return;\n this.focus();\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item });\n this.selection.handleClick(item, e);\n };\n\n private _onDblClick = (e: MouseEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (item)\n this._activateItem(item);\n };\n\n private _onWheel = (e: WheelEvent): void => {\n e.preventDefault();\n this._listEl.scrollLeft += e.deltaY;\n };\n\n private _activateItem(item: Element): void {\n // manual mode: never auto-select; just fire the event\n if (this.interactionMode !== `manual`) {\n this.selection.replace(item);\n }\n this._dispatch<ListActivateDetail>(`list-activate`, { item });\n }\n\n // --- Styles ---\n\n static override styles = [themeFallbacks, scrollFadeStyles(`x`), listSearchStyles, css`\n :host {\n display: block;\n position: relative;\n background: var(--detail-list-bg, var(--surface-3));\n color: var(--detail-list-text, var(--surface-3-text));\n border-radius: var(--detail-list-radius, var(--radius-s));\n border: 1px solid var(--detail-list-border, var(--border));\n width: 100%;\n height: 100%;\n overflow: hidden;\n box-sizing: border-box;\n outline: none;\n --_detail-list-item-padding:\n var(--ixfx-detail-list-item-padding, var(--detail-list-item-padding, 0 var(--space-xs, 3px)));\n }\n\n :host(:focus-visible) {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n\n .container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n ul {\n list-style: none;\n margin: 0;\n padding: 0;\n /* keep the last column clear of the scrollbar / right edge */\n padding-inline-end: calc(var(--detail-list-column-gap, 8px) + 4px);\n width: 100%;\n height: 100%;\n display: flex;\n flex-flow: column wrap;\n align-content: flex-start;\n column-gap: var(--detail-list-column-gap, 8px);\n overflow-x: auto;\n overflow-y: hidden;\n box-sizing: border-box;\n /* Scrollbar theming: consumers override these CSS variables to control\n the native scrollbar (scrollbar-width, scrollbar-gutter, scrollbar-color). */\n scrollbar-width: var(--detail-list-scrollbar-width, auto);\n scrollbar-gutter: var(--detail-list-scrollbar-gutter, auto);\n scrollbar-color: var(--detail-list-scrollbar-color, auto);\n }\n\n ::slotted([hidden]) {\n display: none !important;\n }\n\n ::slotted(li) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n flex: none;\n width: var(--detail-list-column-width, 220px);\n height: var(--detail-list-item-height, 28px);\n padding: var(--_detail-list-item-padding);\n cursor: pointer;\n user-select: none;\n transition: background var(--transition, 0.1s ease-out),\n outline-color var(--transition, 0.1s ease-out);\n outline: 1px solid transparent;\n }\n\n /* In checked mode, only the checkbox column is clickable; the row body\n gets a default cursor so it doesn't suggest otherwise. */\n :host([interaction-mode=\"checked\"]) ::slotted(li) {\n cursor: default;\n }\n\n ::slotted([data-tickled]) {\n background: var(--item-bg-tickled);\n outline: var(--item-border-tickled);\n }\n\n ::slotted([data-selected]) {\n background: var(--item-bg-selected);\n color: var(--item-text-selected);\n outline: 1px solid transparent;\n }\n\n ::slotted([data-selected][data-tickled]) {\n background: var(--item-bg-selected-tickled);\n outline: 2px dashed var(--surface-3);\n outline-offset: -2px;\n }\n\n /* Drag-select (marquee) rectangle + covered-row preview.\n Style hooks: part=\"marquee\", --detail-list-marquee-border,\n --detail-list-marquee-fill. */\n .marquee {\n position: absolute;\n pointer-events: none;\n z-index: 5;\n border: 1px solid var(--detail-list-marquee-border, var(--accent));\n background: var(--detail-list-marquee-fill, color-mix(in srgb, var(--accent) 15%, transparent));\n }\n\n ::slotted([data-marquee]) {\n background: var(--item-bg-selected);\n color: var(--item-text-selected);\n }\n\n ::slotted([data-drag-origin]) {\n opacity: 0.6;\n }\n\n /* checked mode: the injected checkbox communicates selection — suppress bg */\n :host([interaction-mode=\"checked\"]) ::slotted([data-selected]) {\n background: transparent;\n color: inherit;\n outline: 1px solid transparent;\n }\n\n :host([interaction-mode=\"checked\"]) ::slotted([data-selected][data-tickled]) {\n background: var(--item-bg-tickled);\n color: inherit;\n outline: var(--item-border-tickled);\n }\n\n .loading {\n position: absolute;\n bottom: 8px;\n right: 8px;\n z-index: 10;\n background: var(--surface-4, #2a2a2a);\n border: 1px solid var(--border, #444);\n border-radius: var(--radius-m, 4px);\n padding: 2px 8px;\n font-size: var(--text-s, 11px);\n color: var(--surface-muted-text, #888);\n }\n\n .loading[hidden] {\n display: none;\n }\n `];\n\n // --- Render ---\n\n override render() {\n const loading = this.#data.loading;\n const progress = this.#data.progress;\n return html`\n <div class=\"container\">\n <ul part=\"list\" class=\"scroll-fade-x\">\n <slot></slot>\n </ul>\n ${this.#marqueeRect\n ? html`<div class=\"marquee\" part=\"marquee\" style=${this.#marqueeStyle(this.#marqueeRect)}></div>`\n : ``}\n <div class=\"loading\" part=\"loading\" ?hidden=${!loading}>\n ${loading\n ? (progress !== undefined ? `${Math.round(progress * 100)}%` : `loading…`)\n : nothing}\n </div>\n ${this.search.renderField()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-detail-list': DetailListElement;\n }\n\n interface HTMLElementEventMap extends DetailListElementEventMap {}\n}\n\nexport interface DetailListElementEventMap extends ListElementEventMap {\n 'list-native-drag-start': ListNativeDragStartEvent<Element>;\n}\n"],"mappings":"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"}