@ixfx/components 0.9.4 → 0.9.6

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.
@@ -32,6 +32,7 @@ let DetailListElement = class DetailListElement extends LitElement {
32
32
  this.#grid = [];
33
33
  this.#positions = /* @__PURE__ */ new Map();
34
34
  this.#geometryScheduled = false;
35
+ this.#sortRaf = 0;
35
36
  this.#animatedItems = /* @__PURE__ */ new WeakSet();
36
37
  this.#builtFromProvider = [];
37
38
  this.#providerBuilt = 0;
@@ -214,6 +215,7 @@ let DetailListElement = class DetailListElement extends LitElement {
214
215
  #grid;
215
216
  #positions;
216
217
  #geometryScheduled;
218
+ #sortRaf;
217
219
  #resizeObserver;
218
220
  #mutationObserver;
219
221
  /** Items that have already played (or been skipped for) their enter animation. */
@@ -352,6 +354,7 @@ let DetailListElement = class DetailListElement extends LitElement {
352
354
  this.removeEventListener(`click`, this._onClick);
353
355
  this.removeEventListener(`dblclick`, this._onDblClick);
354
356
  this.removeEventListener(`wheel`, this._onWheel);
357
+ cancelAnimationFrame(this.#sortRaf);
355
358
  this.#resizeObserver?.disconnect();
356
359
  this.#resizeObserver = void 0;
357
360
  this.#mutationObserver?.disconnect();
@@ -472,6 +475,28 @@ let DetailListElement = class DetailListElement extends LitElement {
472
475
  return this.#itemData.get(item);
473
476
  }
474
477
  /**
478
+ * Keys of items currently intersecting the viewport — for prioritising
479
+ * viewport-first work (e.g. metadata/thumbnail fetches). Items are laid
480
+ * out as a fixed-height, horizontally-scrolling column grid, so this is a
481
+ * horizontal intersection test against the scroll container; every row of
482
+ * an intersecting column counts as visible. Hidden (filtered-out) and
483
+ * keyless items are omitted. Mirrors `ixfx-grid-list.visibleKeys()` /
484
+ * `ixfx-data-grid.getVisibleRange()`.
485
+ */
486
+ visibleKeys() {
487
+ const container = this._listEl;
488
+ if (!container) return [];
489
+ const box = container.getBoundingClientRect();
490
+ const out = [];
491
+ for (const el of this._getVisibleItems()) {
492
+ const key = keyForElement(el);
493
+ if (key === void 0) continue;
494
+ const r = el.getBoundingClientRect();
495
+ if (r.right > box.left && r.left < box.right) out.push(key);
496
+ }
497
+ return out;
498
+ }
499
+ /**
475
500
  * Dispatch a command to this list — used by `ixfx-grouped-item-lister` to
476
501
  * forward commands. Routes through the command registry (so `list.search.*`
477
502
  * and any other registered commands work).
@@ -592,7 +617,10 @@ let DetailListElement = class DetailListElement extends LitElement {
592
617
  if (prefix === this.#builtFromProvider.length && prefix <= items.length) {
593
618
  const tail = items.slice(prefix);
594
619
  for (const item of tail) this.appendChild(this.#createItemEl(item, this.#providerBuilt++));
595
- if (this.sort !== `none`) this.#applySort();
620
+ if (this.sort !== `none`) {
621
+ cancelAnimationFrame(this.#sortRaf);
622
+ this.#sortRaf = requestAnimationFrame(() => this.#applySort());
623
+ }
596
624
  if (this.interactionMode === `checked`) this._syncCheckboxes();
597
625
  this._syncItemStates();
598
626
  this.#scheduleGeometry();
@@ -1 +1 @@
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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"}
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","#sortRaf","#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 #sortRaf = 0;\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 cancelAnimationFrame(this.#sortRaf);\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 * Keys of items currently intersecting the viewport — for prioritising\n * viewport-first work (e.g. metadata/thumbnail fetches). Items are laid\n * out as a fixed-height, horizontally-scrolling column grid, so this is a\n * horizontal intersection test against the scroll container; every row of\n * an intersecting column counts as visible. Hidden (filtered-out) and\n * keyless items are omitted. Mirrors `ixfx-grid-list.visibleKeys()` /\n * `ixfx-data-grid.getVisibleRange()`.\n */\n visibleKeys(): string[] {\n const container = this._listEl;\n if (!container)\n return [];\n const box = container.getBoundingClientRect();\n const out: string[] = [];\n for (const el of this._getVisibleItems()) {\n const key = keyForElement(el);\n if (key === undefined)\n continue;\n const r = el.getBoundingClientRect();\n if (r.right > box.left && r.left < box.right)\n out.push(key);\n }\n return out;\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 // Coalesce: many batches arriving within a frame should trigger a\n // single re-sort rather than one full re-sort per batch.\n cancelAnimationFrame(this.#sortRaf);\n this.#sortRaf = requestAnimationFrame(() => this.#applySort());\n }\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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"}
package/dist/index.d.ts CHANGED
@@ -12,12 +12,12 @@ import "./menu-item-ZmkXNjek.js";
12
12
  import { FuzzySearchResult, NarrowedTextChangeDetail, NarrowedTextChangeEvent, NarrowedTextElement, NarrowedTextItem, Orientation, SelectionMode } from "./narrowed-text.js";
13
13
  import { CrumbNavigationChangeDetail, CrumbNavigationChangeEvent, CrumbNavigationElement, CrumbNavigationElementEventMap, CrumbNavigationExpandDetail, CrumbNavigationExpandEvent, CrumbNavigationItemClickDetail, CrumbNavigationItemClickEvent } from "./crumbs.js";
14
14
  import { ConfigEntry, DataDisplayComponent, FormattingOptions, RendererStyle } from "./data-display.js";
15
- import { _ as DataGridSortDetail, a as DataGridColumnReorderDetail, c as DataGridColumnResizeEvent, d as DataGridElement, f as DataGridElementEventMap, g as DataGridSelectEvent, h as DataGridSelectDetail, i as DataGridCellEditEvent, l as DataGridColumnVisibilityDetail, m as DataGridGroupChangeEvent, n as DataGridCellClickEvent, o as DataGridColumnReorderEvent, p as DataGridGroupChangeDetail, r as DataGridCellEditDetail, s as DataGridColumnResizeDetail, t as DataGridCellClickDetail, u as DataGridColumnVisibilityEvent, v as DataGridSortEvent } from "./data-grid-pp8WaKxG.js";
15
+ import { A as DataGridGroupBy, C as DataGridColumn, D as DataGridEditorFactory, E as DataGridEditorContext, F as DataGridSortState, I as GlobalFormatter, M as DataGridInteractionMode, N as DataGridSelectionMode, O as DataGridEditorType, P as DataGridSortDirection, S as BuiltInFormatterOptions, T as DataGridEditability, _ as DataGridSelectDetail, a as DataGridColumnReorderDetail, b as DataGridSortEvent, c as DataGridColumnResizeEvent, d as DataGridElement, f as DataGridElementEventMap, g as DataGridRowActivateEvent, h as DataGridRowActivateDetail, i as DataGridCellEditEvent, j as DataGridGroupLabel, k as DataGridGetRowKey, l as DataGridColumnVisibilityDetail, m as DataGridGroupChangeEvent, n as DataGridCellClickEvent, o as DataGridColumnReorderEvent, p as DataGridGroupChangeDetail, r as DataGridCellEditDetail, s as DataGridColumnResizeDetail, t as DataGridCellClickDetail, u as DataGridColumnVisibilityEvent, v as DataGridSelectEvent, w as DataGridColumnMenu, x as BuiltInFormatterName, y as DataGridSortDetail } from "./data-grid-DIHhfsqS.js";
16
16
  import { A as FuzzySearch, C as ListSearchControllerOptions, D as IncrSearchTreeOptions, E as IncrSearchTreeController, F as IncrSearchChangeCallback, I as IncrSearchOptions, L as IncrSearchResult, M as HighlightOptions, N as HighlightTarget, O as createAcCompletionProvider, P as IncrSearch, R as IncrSearchState, S as ListSearchController, T as ListSearchMode, _ as DataListSearchAdapterOptions, a as RegisterListSearchCommandsOptions, b as LIST_SEARCH_MODES, c as applyHighlights, d as createFuzzySearch, f as ElementIncrSearch, g as createElementListSearchAdapter, h as ElementListSearchHost, i as LIST_SEARCH_COMMAND_IDS, j as FuzzySearchOptions, k as ElementIncrSearchOptions, l as buildHighlightTargets, m as ElementListSearchAdapterOptions, n as createTreeListSearchAdapter, o as registerListSearchCommands, p as createElementIncrSearch, r as listSearchStyles, s as createIncrSearch, t as TreeListSearchAdapterOptions, u as clearHighlights, v as DataListSearchItem, w as ListSearchHost, x as ListSearchAdapter, y as createDataListSearchAdapter } from "./index--qnhBWZJ.js";
17
17
  import { t as index_d_exports } from "./index-C59-JEPl.js";
18
18
  import { a as ListItemClickDetail, c as ListSelectEvent, d as ListTickleEvent, i as ListInteractionMode, l as ListSelectionMode, n as ListActivateEvent, o as ListItemClickEvent, r as ListElementEventMap, s as ListSelectDetail, t as ListActivateDetail, u as ListTickleDetail } from "./list-selection-types-B5ioL-dG.js";
19
19
  import { i as VerticalListElementEventMap, n as CustomCheckboxOptions, r as VerticalListElement, t as AddItemOptions } from "./vertical-list-CHrXmmQ3.js";
20
- import { a as DetailSortItem, i as DetailSortComparator, n as DetailListElementEventMap, o as DetailSortMode, r as DetailFormatter, t as DetailListElement } from "./detail-list-DbYaz-YX.js";
20
+ import { a as DetailSortItem, i as DetailSortComparator, n as DetailListElementEventMap, o as DetailSortMode, r as DetailFormatter, t as DetailListElement } from "./detail-list-CQguZg9h.js";
21
21
  import { a as EditableMode, i as EditableLabelChangeEvent, n as EditableLabel, o as EntryMode, r as EditableLabelChangeDetail, t as DisplayTextLogic } from "./editable-label-rzXkjf1H.js";
22
22
  import { FormElement } from "./form.js";
23
23
  import { A as ListSelectionModes, C as TreeKeyboardNavCallbacks, D as ListSelectionController, E as TreeKeyboardNavItemId, M as DragSelectRect, N as ListDragSelectController, O as ListSelectionControllerConfig, P as ListDragSelectControllerConfig, S as GridListViewportChangeEvent, T as TreeKeyboardNavControllerConfig, _ as GridListSelectDetail, a as GridListActivateEvent, b as GridListTickleEvent, c as GridListCaptionPosition, d as GridListElementEventMap, f as GridListFullElementEventMap, g as GridListOrientation, h as GridListItemEventDetail, i as GridListActivateDetail, j as isMultiMode, k as ListSelectionGesture, l as GridListCaptionStyle, m as GridListItemClickEvent, n as PanTextElement, o as GridListCaptionAlign, p as GridListItemClickDetail, r as PanTextMode, s as GridListCaptionBackdrop, t as GridListElement, u as GridListDataAdapter, v as GridListSelectEvent, w as TreeKeyboardNavController, x as GridListViewportChangeDetail, y as GridListTickleDetail } from "./grid-list-CSw1VMXT.js";
@@ -2099,5 +2099,5 @@ declare function monitorIndeterminate(targetElOrQuery: string | HTMLElement, wat
2099
2099
  //#region src/index.d.ts
2100
2100
  declare function init(): void;
2101
2101
  //#endregion
2102
- export { AcTextChangeDetail, AcTextChangeEvent, AcTextCompletionProvider, AcTextElement, AcTextItem, AcTextSelectDetail, AcTextSelectEvent, type AcTokenAddDetail, type AcTokenAddEvent, AcTokenElement, type AcTokenElementEventMap, type AcTokenItem, type AcTokenRemoveDetail, type AcTokenRemoveEvent, type AcTokenizerFn, type AcTokensChangeDetail, type AcTokensChangeEvent, AddItemOptions, Axis, BottomDrawerCloseEvent, BottomDrawerCommand, BottomDrawerElement, BottomDrawerElementEventMap, BottomDrawerResizeDetail, BottomDrawerResizeEvent, ButtonElement, Checkbox, CheckboxChangeDetail, CheckboxChangeEvent, CheckboxEventMap, ClickSnapMode, ColourMapConfig, ColourMode, ColourPicker, type ColourPickerChangeEvent, type ColourPickerEventDetail, type ColourPickerInputEvent, ColourPickerPopup, ColourResult, ConfigEntry, ContiguousSelectEventDetail, CrossoverBehaviour, CrumbNavChangeDetail, CrumbNavChangeEvent, CrumbNavExpandDetail, CrumbNavExpandEvent, CrumbNavNavigateDetail, CrumbNavNavigateEvent, CrumbNavigationChangeDetail, CrumbNavigationChangeEvent, CrumbNavigationElement, CrumbNavigationElementEventMap, CrumbNavigationExpandDetail, CrumbNavigationExpandEvent, CrumbNavigationItemClickDetail, CrumbNavigationItemClickEvent, CrumbPathController, CrumbPathControllerOptions, CrumbPathElement, CrumbPathElementEventMap, CrumbSegment, CrumbSiblingLookupFn, type CssVars, CustomCheckboxOptions, DataBatch, DataController, DataControllerOptions, DataDisplayComponent, DataGridCellClickDetail, DataGridCellClickEvent, DataGridCellEditDetail, DataGridCellEditEvent, DataGridColumnReorderDetail, DataGridColumnReorderEvent, DataGridColumnResizeDetail, DataGridColumnResizeEvent, DataGridColumnVisibilityDetail, DataGridColumnVisibilityEvent, DataGridElement, DataGridElementEventMap, DataGridGroupChangeDetail, DataGridGroupChangeEvent, DataGridSelectDetail, DataGridSelectEvent, DataGridSortDetail, DataGridSortEvent, type DataListSearchAdapterOptions, type DataListSearchItem, DataProviderResult, DataTableElement, DataTableElementEventMap, DataTableRow, DataTableRowClickDetail, DataTableRowClickEvent, type DetailFormatter, DetailListElement, DetailListElementEventMap, type DetailSortComparator, type DetailSortItem, type DetailSortMode, DisplayTextLogic, DistributeResult, DockAddPanelTarget, DockAxis, DockChangeDetail, DockChangeEvent, DockDirection, DockDragBoundaryDetail, DockDragBoundaryEvent, DockDropTarget, type DockDropZone, DockEdge, DockHostElement, DockHostElementEventMap, DockLayout, DockLeafContentRules, DockLeafInfo, DockLeafPlacementPolicy, DockLeafPlacementPolicyResolved, DockLeafRef, DockNeighbours, DockNode, DockOperation, DockPanelActivatedDetail, DockPanelActivatedEvent, DockPanelAddedDetail, DockPanelAddedEvent, DockPanelDragStartDetail, DockPanelDragStartEvent, DockPanelElement, DockPanelElementEventMap, DockPanelInit, DockPanelRemovedDetail, DockPanelRemovedEvent, DockPanelSnapshot, DockPanelTearOutDetail, DockPanelTearOutEvent, DockRect, DockSplitNode, DockStackNode, type DragSelectRect, DragSnappingFn, DragTarget, EditableLabel, EditableLabelChangeDetail, EditableLabelChangeEvent, EditableMode, EditableNumber, Effect, type ElementIncrSearch, type ElementIncrSearchOptions, type ElementListSearchAdapterOptions, type ElementListSearchHost, Endpoints, EntryMode, FormElement, FormGroupElement, FormPartElement, FormatValueForHuman, FormattingOptions, type FuzzySearch, type FuzzySearchOptions, FuzzySearchResult, type GridListActivateDetail, type GridListActivateEvent, type GridListCaptionAlign, type GridListCaptionBackdrop, type GridListCaptionPosition, type GridListCaptionStyle, type GridListDataAdapter, GridListElement, type GridListElementEventMap, type GridListFullElementEventMap, type GridListItemClickDetail, type GridListItemClickEvent, type GridListItemEventDetail, type GridListOrientation, type GridListSelectDetail, type GridListSelectEvent, type GridListTickleDetail, type GridListTickleEvent, type GridListViewportChangeDetail, type GridListViewportChangeEvent, GridMode, GridResolution, GroupNode, GroupedItemListerElement, type GroupedItemListerElementEventMap, type GroupedSelectDetail, type GroupedSelectEvent, HexChangeDetail, HexChangeEvent, type HighlightOptions, type HighlightTarget, ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE, IDataProvider, type IGroupedSubComponent, type IGroupedSubComponentEventMap, type IconChangedDetail, type IconChangedEvent, type IconEntry, type IncrSearch, type IncrSearchChangeCallback, IncrSearchTreeController as IncrSearchMillerController, IncrSearchTreeController, type IncrSearchTreeOptions as IncrSearchMillerOptions, type IncrSearchTreeOptions, type IncrSearchOptions, type IncrSearchResult, type IncrSearchState, type InputMode, ItemsProvider, IxfxHexEditorElement, IxfxIconElement, IxfxRatingElement, IxfxTimelineElement, KeyedElementIndex, LIST_ITEM_MOTION_MS, LIST_SEARCH_COMMAND_IDS, LIST_SEARCH_MODES, LabelledRadialInput, LabelledRangeInput, LabelledSliderInput, LaneData, LaneType, LayoutNode, LayoutSnapshot, LeafGeom, LedElement, LedMode, type ListActivateDetail, type ListActivateEvent, type ListDragEntry, type ListDragPreview, type ListDragPreviewContext, type ListDragPreviewRenderer, ListDragSelectController, type ListDragSelectControllerConfig, type ListDragSource, type ListElementEventMap, type ListInteractionMode, type ListItemClickDetail, type ListItemClickEvent, type ListItemMotionOptions, type ListItemOutResult, ListNativeDragController, type ListNativeDragControllerConfig, type ListNativeDragStartDetail, type ListNativeDragStartEvent, type ListSearchAdapter, ListSearchController, type ListSearchControllerOptions, type ListSearchHost, type ListSearchMode, type ListSelectDetail, type ListSelectEvent, ListSelectionController, type ListSelectionControllerConfig, type ListSelectionGesture, type ListSelectionMode, type ListSelectionModes, type ListTickleDetail, type ListTickleEvent, LoadChildrenCallback, MarkerStyle, index_d_exports as Menu, type TreeActivateDetail as MillerActivateDetail, TreeActivateDetail, type TreeActivateEvent as MillerActivateEvent, TreeActivateEvent, MillerBaseElement, MillerBaseElementEventMap, type TreeCollapseDetail as MillerCollapseDetail, TreeCollapseDetail, type TreeCollapseEvent as MillerCollapseEvent, TreeCollapseEvent, MillerConfig, type TreeExpandDetail as MillerExpandDetail, TreeExpandDetail, type TreeExpandEvent as MillerExpandEvent, TreeExpandEvent, MillerHeaderClickDetail, MillerHeaderClickEvent, MillerHeaderRightClickDetail, MillerHeaderRightClickEvent, type TreeItem as MillerItem, TreeItem, type TreeItemClickDetail as MillerItemClickDetail, TreeItemClickDetail, type TreeItemClickEvent as MillerItemClickEvent, TreeItemClickEvent, MillerItemDblClickDetail, MillerItemDblClickEvent, MillerItemRightClickDetail, MillerItemRightClickEvent, MillerItemState, MillerListElement, type TreeNode as MillerNode, TreeNode, MillerRebaseDetail, MillerRebaseEvent, type TreeSelectDetail as MillerSelectDetail, TreeSelectDetail, type TreeSelectEvent as MillerSelectEvent, TreeSelectEvent, MillerSelectionMode, type TreeTickleDetail as MillerTickleDetail, TreeTickleDetail, type TreeTickleEvent as MillerTickleEvent, TreeTickleEvent, MillerTreeController, MillerTreeControllerOptions, NarrowedTextChangeDetail, NarrowedTextChangeEvent, NarrowedTextElement, NarrowedTextItem, NoneSelectEventDetail, Notification, NotificationContent, NotificationManager, NotificationPillElement, NotificationPillElementEventMap, NotificationRenderer, NotificationRendererHooks, NotificationType, NotifierOptions, type OklchValue, Orientation, PanTextElement, PanTextMode, PanelCloseEvent, PanelElement, PanelElementEventMap, PanelGroupElement, PanelGroupElementEventMap, PanelGroupOrientation, PanelGroupReorderDetail, PanelGroupReorderEvent, PanelInfo, PanelNode, PanelOrientation, PanelToggleDetail, PanelToggleEvent, PanelToggleInteraction, PanelVariant, PillPosition, PillQueueDisplay, PillRendererOptions, PillSafeArea, PillTapDetail, PillTapEvent, PlotDataSeries, PlotDataSeriesOptions, PlotHistogram, PlotHistogramBucketClickDetail, PlotHistogramBucketClickEvent, PlotHistogramElementEventMap, PlotHistogramInteractionMode, PlotHistogramOrientation, PlotHistogramSelectionChangeDetail, PlotHistogramSelectionChangeEvent, PlotHistogramSelectionRange, PlotHistogramValueTooltips, PlotMultiAxis, PlotMultiAxisDataPointClickDetail, PlotMultiAxisDataPointClickEvent, PlotMultiAxisElementEventMap, PlotMultiAxisLayout, PlotSingleAxis, PlotSingleAxisElementEventMap, PlotSingleAxisPointerMoveDetail, PlotSingleAxisPointerMoveEvent, PlotXyAxis, PolarPad, PolarPadInputDetail, PolarPadInputEvent, PopupItem, RadialInputChangeDetail, RadialInputChangeEvent, RadialInputElement, RadialInputInputDetail, RadialInputInputEvent, RadioGroup, RadioGroupChangeDetail, RadioGroupChangeEvent, RadioGroupMode, RadioItem, RangeElement, RangeInput, RangeMultiElement, RangeMultiInputDetail, RangeMultiInputEvent, RatingChangeDetail, RatingChangeEvent, RatingElement, RatingElementEventMap, RatingInputEvent, RatingVariant, type Rect, RectangularSelectEventDetail, type RegisterListSearchCommandsOptions, RendererStyle, ResizeMode, SelectEventDetail, SelectHorizChangeDetail, SelectHorizChangeEvent, SelectHorizElement, SelectHorizEventMap, SelectionMode, SingleAxisAgeStyle, SingleAxisDrawStyle, SingleSelectEventDetail, SliderChangedField, SliderCrossover, SliderHandleKey, SliderInputChangeDetail, SliderInputChangeEvent, SliderInputElement, SliderInputElementEventMap, SliderInputInputDetail, SliderInputInputEvent, SliderLaneData, SliderLaneType, SliderMarkerStyle, SliderOrientation, SliderSingleStyle, SliderValueCFollow, SliderValueDrag, SliderValueMode, SlidingNumberElement, SlidingNumberTrend, SnackbarDismiss, SnackbarElement, SnackbarMode, SnackbarPlacement, SnapChangeDetail, SnapChangeEvent, SnapContainer, SnapInputDetail, SnapInputEvent, SnapLogic, SnapshotNode, SortCompareFn, SplitButton, SplitButtonMode, SplitButtonSelectDetail, SplitButtonSelectEvent, SplitChangeDetail, SplitChangeEvent, SplitCloseDetail, SplitCloseEvent, SplitCollapseDetail, SplitCollapseEvent, SplitExpandDetail, SplitExpandEvent, SplitLayoutElement, SplitLayoutElementEventMap, SplitPanelElement, SplitResizeDetail, SplitResizeEvent, type SubComponentActivateDetail, type SubComponentActivateEvent, type SubComponentFactory, type SubComponentItemClickDetail, type SubComponentItemClickEvent, type SubComponentSelectDetail, type SubComponentSelectEvent, type SubComponentTickleDetail, type SubComponentTickleEvent, SwipeElement, SwipeElementEventMap, SwipeInputDetail, SwipeInputEvent, SwitcherItem, Tab, TabAddOptions, TabController, TabControllerOptions, TabListChangeDetail, TabListChangeEvent, TabListDragMode, TabListElement, TabListItemElement, TabListReorderDetail, TabListReorderEvent, TabPanelElement, TabPanelsElement, TextShimmerElement, TickledController, type TickledControllerConfig, type TickledItem, TimelineController, TimelineControllerConfig, TimelineDraggingCallbackDetail, TimelineDraggingDetail, TimelineDraggingEvent, TimelineElementEventMap, TimelineEvent, TimelineEventMoveDetail, TimelineEventMoveEvent, TimelineEventResizeDetail, TimelineEventResizeEvent, TimelineSelectionChangeDetail, TimelineSelectionChangeEvent, TimelineTickleChangeDetail, TimelineTickleChangeEvent, TimelineTrack, TimelineTrackReorderDetail, TimelineTrackReorderEvent, TimelineTrackResizeDetail, TimelineTrackResizeEvent, TimelineTrackSelectDetail, TimelineTrackSelectEvent, TimelineTrackTabElement, TitlebarCloseEvent, TitlebarElement, TitlebarElementEventMap, TitlebarOrientation, TitlebarToggleDetail, TitlebarToggleEvent, TitlebarToggleInteraction, TitlebarVariant, ToolbarAlign, ToolbarElement, ToolbarGroupElement, ToolbarLayout, ToolbarOrientation, ToolbarVerticalWriting, TooltipElement, TooltipOrientations, TrackHeightMode, TrackLayout, TransitoryLabelElement, TreeBaseElement, TreeBaseElementEventMap, TreeCheckboxState, TreeComponent, TreeComponentEventMap, TreeConfig, TreeController, TreeControllerOptions, TreeDataModel, TreeDataModelOptions, TreeDndMode, TreeDragContext, TreeDragEndEvent, TreeDragOverEvent, TreeDragStartEvent, TreeDropApplyContext, TreeDropContext, TreeDropController, TreeDropControllerConfig, TreeDropDetail, TreeDropEvent, TreeDropPosition, TreeDropResolvedDrag, TreeDropTarget, TreeDropVisibleRow, TreeExclusivity, TreeFilterPredicate, TreeInteractionMode, TreeItemDblClickDetail, TreeItemDblClickEvent, type TreeKeyboardNavCallbacks, TreeKeyboardNavController, type TreeKeyboardNavControllerConfig, type TreeKeyboardNavItemId, TreeListAdapterOptions, TreeListElement, type TreeListSearchAdapterOptions, TreeSearchHost, TreeSelectionFilter, TwoSplitLayoutElement, UserScale, ValueMode, VerticalListAdapterOptions, VerticalListElement, VerticalListElementEventMap, ViewRange, WhenSmall, XyAgeStyle, XyDrawStyle, XyPad, XyPadEventMap, XyPadInputDetail, XyPadInputEvent, addPanelToStack, animateListItemIn, animateListItemOut, applyAgeModification, applyHighlights, applySnapshot, applyTreeDrop, attachTimelineInteractions, bottomDrawerCommandId, buildHighlightTargets, buildModel, captionForEntry, clearHighlights, collectContainerNames, collectDataResult, collectPanelIds, collectStackPaths, computeColour, computeLeafGeoms, createAcCompletionProvider, createDataListSearchAdapter, createDefaultListDragPreview, createElementIncrSearch, createElementListSearchAdapter, createEmptyLayout, createEmptyStack, createFuzzySearch, createIncrSearch, createPillRenderer, createSplit, createStack, createTreeListAdapter, createTreeListSearchAdapter, createVerticalListAdapter, distribute, dropTargetFor, extractStack, findNode, findParentOf, findStackOf, findStackPathByName, getActiveDragPanelId, getIcon, getIconEntry, getIconFont, getLeafNeighbours, hasIcon, iconBus, init, insertBeside, isDragging, isMultiMode, isSplit, isStack, keyForElement, listItemFadeKeyframes, listSearchStyles, monitorIndeterminate, moveLeafNodeToEdge, moveLeafStep, normalise, normalize, panelGapIndex, parseColourScaleAttr, parseLayout, pointerOverAnyHost, prefersReducedMotion, pruneDraggedDescendants, readBaseColour, registerFontIcon, registerIcon, registerListSearchCommands, removePanelFromStack, resolveCssVars, resolveGrid, resolveLeafPath, resolveTracks, serializeLayout, setActive, setIconFont, startListItemOutAnimation, svgToDataUri, swapLeaves, tickledItemStyles, tickledStyles, timelineStyles, toSnapshot, walk, wrapRoot };
2102
+ export { AcTextChangeDetail, AcTextChangeEvent, AcTextCompletionProvider, AcTextElement, AcTextItem, AcTextSelectDetail, AcTextSelectEvent, type AcTokenAddDetail, type AcTokenAddEvent, AcTokenElement, type AcTokenElementEventMap, type AcTokenItem, type AcTokenRemoveDetail, type AcTokenRemoveEvent, type AcTokenizerFn, type AcTokensChangeDetail, type AcTokensChangeEvent, AddItemOptions, Axis, BottomDrawerCloseEvent, BottomDrawerCommand, BottomDrawerElement, BottomDrawerElementEventMap, BottomDrawerResizeDetail, BottomDrawerResizeEvent, type BuiltInFormatterName, type BuiltInFormatterOptions, ButtonElement, Checkbox, CheckboxChangeDetail, CheckboxChangeEvent, CheckboxEventMap, ClickSnapMode, ColourMapConfig, ColourMode, ColourPicker, type ColourPickerChangeEvent, type ColourPickerEventDetail, type ColourPickerInputEvent, ColourPickerPopup, ColourResult, ConfigEntry, ContiguousSelectEventDetail, CrossoverBehaviour, CrumbNavChangeDetail, CrumbNavChangeEvent, CrumbNavExpandDetail, CrumbNavExpandEvent, CrumbNavNavigateDetail, CrumbNavNavigateEvent, CrumbNavigationChangeDetail, CrumbNavigationChangeEvent, CrumbNavigationElement, CrumbNavigationElementEventMap, CrumbNavigationExpandDetail, CrumbNavigationExpandEvent, CrumbNavigationItemClickDetail, CrumbNavigationItemClickEvent, CrumbPathController, CrumbPathControllerOptions, CrumbPathElement, CrumbPathElementEventMap, CrumbSegment, CrumbSiblingLookupFn, type CssVars, CustomCheckboxOptions, DataBatch, DataController, DataControllerOptions, DataDisplayComponent, DataGridCellClickDetail, DataGridCellClickEvent, DataGridCellEditDetail, DataGridCellEditEvent, type DataGridColumn, type DataGridColumnMenu, DataGridColumnReorderDetail, DataGridColumnReorderEvent, DataGridColumnResizeDetail, DataGridColumnResizeEvent, DataGridColumnVisibilityDetail, DataGridColumnVisibilityEvent, type DataGridEditability, type DataGridEditorContext, type DataGridEditorFactory, type DataGridEditorType, DataGridElement, DataGridElementEventMap, type DataGridGetRowKey, type DataGridGroupBy, DataGridGroupChangeDetail, DataGridGroupChangeEvent, type DataGridGroupLabel, type DataGridInteractionMode, DataGridRowActivateDetail, DataGridRowActivateEvent, DataGridSelectDetail, DataGridSelectEvent, type DataGridSelectionMode, DataGridSortDetail, type DataGridSortDirection, DataGridSortEvent, type DataGridSortState, type DataListSearchAdapterOptions, type DataListSearchItem, DataProviderResult, DataTableElement, DataTableElementEventMap, DataTableRow, DataTableRowClickDetail, DataTableRowClickEvent, type DetailFormatter, DetailListElement, DetailListElementEventMap, type DetailSortComparator, type DetailSortItem, type DetailSortMode, DisplayTextLogic, DistributeResult, DockAddPanelTarget, DockAxis, DockChangeDetail, DockChangeEvent, DockDirection, DockDragBoundaryDetail, DockDragBoundaryEvent, DockDropTarget, type DockDropZone, DockEdge, DockHostElement, DockHostElementEventMap, DockLayout, DockLeafContentRules, DockLeafInfo, DockLeafPlacementPolicy, DockLeafPlacementPolicyResolved, DockLeafRef, DockNeighbours, DockNode, DockOperation, DockPanelActivatedDetail, DockPanelActivatedEvent, DockPanelAddedDetail, DockPanelAddedEvent, DockPanelDragStartDetail, DockPanelDragStartEvent, DockPanelElement, DockPanelElementEventMap, DockPanelInit, DockPanelRemovedDetail, DockPanelRemovedEvent, DockPanelSnapshot, DockPanelTearOutDetail, DockPanelTearOutEvent, DockRect, DockSplitNode, DockStackNode, type DragSelectRect, DragSnappingFn, DragTarget, EditableLabel, EditableLabelChangeDetail, EditableLabelChangeEvent, EditableMode, EditableNumber, Effect, type ElementIncrSearch, type ElementIncrSearchOptions, type ElementListSearchAdapterOptions, type ElementListSearchHost, Endpoints, EntryMode, FormElement, FormGroupElement, FormPartElement, FormatValueForHuman, FormattingOptions, type FuzzySearch, type FuzzySearchOptions, FuzzySearchResult, type GlobalFormatter, type GridListActivateDetail, type GridListActivateEvent, type GridListCaptionAlign, type GridListCaptionBackdrop, type GridListCaptionPosition, type GridListCaptionStyle, type GridListDataAdapter, GridListElement, type GridListElementEventMap, type GridListFullElementEventMap, type GridListItemClickDetail, type GridListItemClickEvent, type GridListItemEventDetail, type GridListOrientation, type GridListSelectDetail, type GridListSelectEvent, type GridListTickleDetail, type GridListTickleEvent, type GridListViewportChangeDetail, type GridListViewportChangeEvent, GridMode, GridResolution, GroupNode, GroupedItemListerElement, type GroupedItemListerElementEventMap, type GroupedSelectDetail, type GroupedSelectEvent, HexChangeDetail, HexChangeEvent, type HighlightOptions, type HighlightTarget, ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE, IDataProvider, type IGroupedSubComponent, type IGroupedSubComponentEventMap, type IconChangedDetail, type IconChangedEvent, type IconEntry, type IncrSearch, type IncrSearchChangeCallback, IncrSearchTreeController as IncrSearchMillerController, IncrSearchTreeController, type IncrSearchTreeOptions as IncrSearchMillerOptions, type IncrSearchTreeOptions, type IncrSearchOptions, type IncrSearchResult, type IncrSearchState, type InputMode, ItemsProvider, IxfxHexEditorElement, IxfxIconElement, IxfxRatingElement, IxfxTimelineElement, KeyedElementIndex, LIST_ITEM_MOTION_MS, LIST_SEARCH_COMMAND_IDS, LIST_SEARCH_MODES, LabelledRadialInput, LabelledRangeInput, LabelledSliderInput, LaneData, LaneType, LayoutNode, LayoutSnapshot, LeafGeom, LedElement, LedMode, type ListActivateDetail, type ListActivateEvent, type ListDragEntry, type ListDragPreview, type ListDragPreviewContext, type ListDragPreviewRenderer, ListDragSelectController, type ListDragSelectControllerConfig, type ListDragSource, type ListElementEventMap, type ListInteractionMode, type ListItemClickDetail, type ListItemClickEvent, type ListItemMotionOptions, type ListItemOutResult, ListNativeDragController, type ListNativeDragControllerConfig, type ListNativeDragStartDetail, type ListNativeDragStartEvent, type ListSearchAdapter, ListSearchController, type ListSearchControllerOptions, type ListSearchHost, type ListSearchMode, type ListSelectDetail, type ListSelectEvent, ListSelectionController, type ListSelectionControllerConfig, type ListSelectionGesture, type ListSelectionMode, type ListSelectionModes, type ListTickleDetail, type ListTickleEvent, LoadChildrenCallback, MarkerStyle, index_d_exports as Menu, type TreeActivateDetail as MillerActivateDetail, TreeActivateDetail, type TreeActivateEvent as MillerActivateEvent, TreeActivateEvent, MillerBaseElement, MillerBaseElementEventMap, type TreeCollapseDetail as MillerCollapseDetail, TreeCollapseDetail, type TreeCollapseEvent as MillerCollapseEvent, TreeCollapseEvent, MillerConfig, type TreeExpandDetail as MillerExpandDetail, TreeExpandDetail, type TreeExpandEvent as MillerExpandEvent, TreeExpandEvent, MillerHeaderClickDetail, MillerHeaderClickEvent, MillerHeaderRightClickDetail, MillerHeaderRightClickEvent, type TreeItem as MillerItem, TreeItem, type TreeItemClickDetail as MillerItemClickDetail, TreeItemClickDetail, type TreeItemClickEvent as MillerItemClickEvent, TreeItemClickEvent, MillerItemDblClickDetail, MillerItemDblClickEvent, MillerItemRightClickDetail, MillerItemRightClickEvent, MillerItemState, MillerListElement, type TreeNode as MillerNode, TreeNode, MillerRebaseDetail, MillerRebaseEvent, type TreeSelectDetail as MillerSelectDetail, TreeSelectDetail, type TreeSelectEvent as MillerSelectEvent, TreeSelectEvent, MillerSelectionMode, type TreeTickleDetail as MillerTickleDetail, TreeTickleDetail, type TreeTickleEvent as MillerTickleEvent, TreeTickleEvent, MillerTreeController, MillerTreeControllerOptions, NarrowedTextChangeDetail, NarrowedTextChangeEvent, NarrowedTextElement, NarrowedTextItem, NoneSelectEventDetail, Notification, NotificationContent, NotificationManager, NotificationPillElement, NotificationPillElementEventMap, NotificationRenderer, NotificationRendererHooks, NotificationType, NotifierOptions, type OklchValue, Orientation, PanTextElement, PanTextMode, PanelCloseEvent, PanelElement, PanelElementEventMap, PanelGroupElement, PanelGroupElementEventMap, PanelGroupOrientation, PanelGroupReorderDetail, PanelGroupReorderEvent, PanelInfo, PanelNode, PanelOrientation, PanelToggleDetail, PanelToggleEvent, PanelToggleInteraction, PanelVariant, PillPosition, PillQueueDisplay, PillRendererOptions, PillSafeArea, PillTapDetail, PillTapEvent, PlotDataSeries, PlotDataSeriesOptions, PlotHistogram, PlotHistogramBucketClickDetail, PlotHistogramBucketClickEvent, PlotHistogramElementEventMap, PlotHistogramInteractionMode, PlotHistogramOrientation, PlotHistogramSelectionChangeDetail, PlotHistogramSelectionChangeEvent, PlotHistogramSelectionRange, PlotHistogramValueTooltips, PlotMultiAxis, PlotMultiAxisDataPointClickDetail, PlotMultiAxisDataPointClickEvent, PlotMultiAxisElementEventMap, PlotMultiAxisLayout, PlotSingleAxis, PlotSingleAxisElementEventMap, PlotSingleAxisPointerMoveDetail, PlotSingleAxisPointerMoveEvent, PlotXyAxis, PolarPad, PolarPadInputDetail, PolarPadInputEvent, PopupItem, RadialInputChangeDetail, RadialInputChangeEvent, RadialInputElement, RadialInputInputDetail, RadialInputInputEvent, RadioGroup, RadioGroupChangeDetail, RadioGroupChangeEvent, RadioGroupMode, RadioItem, RangeElement, RangeInput, RangeMultiElement, RangeMultiInputDetail, RangeMultiInputEvent, RatingChangeDetail, RatingChangeEvent, RatingElement, RatingElementEventMap, RatingInputEvent, RatingVariant, type Rect, RectangularSelectEventDetail, type RegisterListSearchCommandsOptions, RendererStyle, ResizeMode, SelectEventDetail, SelectHorizChangeDetail, SelectHorizChangeEvent, SelectHorizElement, SelectHorizEventMap, SelectionMode, SingleAxisAgeStyle, SingleAxisDrawStyle, SingleSelectEventDetail, SliderChangedField, SliderCrossover, SliderHandleKey, SliderInputChangeDetail, SliderInputChangeEvent, SliderInputElement, SliderInputElementEventMap, SliderInputInputDetail, SliderInputInputEvent, SliderLaneData, SliderLaneType, SliderMarkerStyle, SliderOrientation, SliderSingleStyle, SliderValueCFollow, SliderValueDrag, SliderValueMode, SlidingNumberElement, SlidingNumberTrend, SnackbarDismiss, SnackbarElement, SnackbarMode, SnackbarPlacement, SnapChangeDetail, SnapChangeEvent, SnapContainer, SnapInputDetail, SnapInputEvent, SnapLogic, SnapshotNode, SortCompareFn, SplitButton, SplitButtonMode, SplitButtonSelectDetail, SplitButtonSelectEvent, SplitChangeDetail, SplitChangeEvent, SplitCloseDetail, SplitCloseEvent, SplitCollapseDetail, SplitCollapseEvent, SplitExpandDetail, SplitExpandEvent, SplitLayoutElement, SplitLayoutElementEventMap, SplitPanelElement, SplitResizeDetail, SplitResizeEvent, type SubComponentActivateDetail, type SubComponentActivateEvent, type SubComponentFactory, type SubComponentItemClickDetail, type SubComponentItemClickEvent, type SubComponentSelectDetail, type SubComponentSelectEvent, type SubComponentTickleDetail, type SubComponentTickleEvent, SwipeElement, SwipeElementEventMap, SwipeInputDetail, SwipeInputEvent, SwitcherItem, Tab, TabAddOptions, TabController, TabControllerOptions, TabListChangeDetail, TabListChangeEvent, TabListDragMode, TabListElement, TabListItemElement, TabListReorderDetail, TabListReorderEvent, TabPanelElement, TabPanelsElement, TextShimmerElement, TickledController, type TickledControllerConfig, type TickledItem, TimelineController, TimelineControllerConfig, TimelineDraggingCallbackDetail, TimelineDraggingDetail, TimelineDraggingEvent, TimelineElementEventMap, TimelineEvent, TimelineEventMoveDetail, TimelineEventMoveEvent, TimelineEventResizeDetail, TimelineEventResizeEvent, TimelineSelectionChangeDetail, TimelineSelectionChangeEvent, TimelineTickleChangeDetail, TimelineTickleChangeEvent, TimelineTrack, TimelineTrackReorderDetail, TimelineTrackReorderEvent, TimelineTrackResizeDetail, TimelineTrackResizeEvent, TimelineTrackSelectDetail, TimelineTrackSelectEvent, TimelineTrackTabElement, TitlebarCloseEvent, TitlebarElement, TitlebarElementEventMap, TitlebarOrientation, TitlebarToggleDetail, TitlebarToggleEvent, TitlebarToggleInteraction, TitlebarVariant, ToolbarAlign, ToolbarElement, ToolbarGroupElement, ToolbarLayout, ToolbarOrientation, ToolbarVerticalWriting, TooltipElement, TooltipOrientations, TrackHeightMode, TrackLayout, TransitoryLabelElement, TreeBaseElement, TreeBaseElementEventMap, TreeCheckboxState, TreeComponent, TreeComponentEventMap, TreeConfig, TreeController, TreeControllerOptions, TreeDataModel, TreeDataModelOptions, TreeDndMode, TreeDragContext, TreeDragEndEvent, TreeDragOverEvent, TreeDragStartEvent, TreeDropApplyContext, TreeDropContext, TreeDropController, TreeDropControllerConfig, TreeDropDetail, TreeDropEvent, TreeDropPosition, TreeDropResolvedDrag, TreeDropTarget, TreeDropVisibleRow, TreeExclusivity, TreeFilterPredicate, TreeInteractionMode, TreeItemDblClickDetail, TreeItemDblClickEvent, type TreeKeyboardNavCallbacks, TreeKeyboardNavController, type TreeKeyboardNavControllerConfig, type TreeKeyboardNavItemId, TreeListAdapterOptions, TreeListElement, type TreeListSearchAdapterOptions, TreeSearchHost, TreeSelectionFilter, TwoSplitLayoutElement, UserScale, ValueMode, VerticalListAdapterOptions, VerticalListElement, VerticalListElementEventMap, ViewRange, WhenSmall, XyAgeStyle, XyDrawStyle, XyPad, XyPadEventMap, XyPadInputDetail, XyPadInputEvent, addPanelToStack, animateListItemIn, animateListItemOut, applyAgeModification, applyHighlights, applySnapshot, applyTreeDrop, attachTimelineInteractions, bottomDrawerCommandId, buildHighlightTargets, buildModel, captionForEntry, clearHighlights, collectContainerNames, collectDataResult, collectPanelIds, collectStackPaths, computeColour, computeLeafGeoms, createAcCompletionProvider, createDataListSearchAdapter, createDefaultListDragPreview, createElementIncrSearch, createElementListSearchAdapter, createEmptyLayout, createEmptyStack, createFuzzySearch, createIncrSearch, createPillRenderer, createSplit, createStack, createTreeListAdapter, createTreeListSearchAdapter, createVerticalListAdapter, distribute, dropTargetFor, extractStack, findNode, findParentOf, findStackOf, findStackPathByName, getActiveDragPanelId, getIcon, getIconEntry, getIconFont, getLeafNeighbours, hasIcon, iconBus, init, insertBeside, isDragging, isMultiMode, isSplit, isStack, keyForElement, listItemFadeKeyframes, listSearchStyles, monitorIndeterminate, moveLeafNodeToEdge, moveLeafStep, normalise, normalize, panelGapIndex, parseColourScaleAttr, parseLayout, pointerOverAnyHost, prefersReducedMotion, pruneDraggedDescendants, readBaseColour, registerFontIcon, registerIcon, registerListSearchCommands, removePanelFromStack, resolveCssVars, resolveGrid, resolveLeafPath, resolveTracks, serializeLayout, setActive, setIconFont, startListItemOutAnimation, svgToDataUri, swapLeaves, tickledItemStyles, tickledStyles, timelineStyles, toSnapshot, walk, wrapRoot };
2103
2103
  //# sourceMappingURL=index.d.ts.map
@@ -234,6 +234,19 @@ list.items = await fetchRows(); // Element refs are stale...
234
234
  list.selectKeys(keep); // ...keys still resolve
235
235
  ```
236
236
 
237
+ ### Viewport
238
+
239
+ ```typescript
240
+ list.visibleKeys(); // string[] — keys of items currently in the scroll viewport
241
+ ```
242
+
243
+ Items lay out as a fixed-height, horizontally-scrolling column grid, so this
244
+ is a horizontal intersection test against the scroll container — every row
245
+ of an intersecting column counts as visible. Hidden (filtered-out) and
246
+ keyless items are omitted. Use it to prioritise viewport-first work (e.g.
247
+ metadata or thumbnail fetches for what's on screen right now). Mirrors
248
+ `ixfx-grid-list.visibleKeys()` and `ixfx-data-grid.getVisibleRange()`.
249
+
237
250
  ---
238
251
 
239
252
  ## Interaction modes
@@ -446,6 +459,14 @@ The provider function can return:
446
459
 
447
460
  Streaming providers extend columns to the right as batches arrive.
448
461
 
462
+ **Performance.** When each batch is a pure append (identical items followed
463
+ only by new ones), the list appends DOM for just the new items rather than
464
+ rebuilding from scratch — streaming thousands of items over many small
465
+ batches stays cheap. If `sort` is set, re-sorting is coalesced: many batches
466
+ arriving within the same animation frame trigger a single re-sort, not one
467
+ per batch. A batch that isn't a pure append (items reordered, removed, or
468
+ replaced) falls back to a full rebuild.
469
+
449
470
  ---
450
471
 
451
472
  ## CSS variables
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ixfx/components",
3
- "version": "0.9.4",
4
- "generated": "2026-09-10T18:43:41.055Z",
3
+ "version": "0.9.5",
4
+ "generated": "2026-09-11T12:10:49.503Z",
5
5
  "components": [
6
6
  {
7
7
  "name": "ac-text",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ixfx/components",
3
3
  "type": "module",
4
- "version": "0.9.4",
4
+ "version": "0.9.6",
5
5
  "packageManager": "pnpm@10.0.0",
6
6
  "description": "Web components for ixfx — Lit-based UI toolkit",
7
7
  "author": "Clint Heyer",