@ixfx/components 0.13.2 → 0.13.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/bundle/index.d.ts +97 -14
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +2183 -636
  4. package/bundle/index.js.map +1 -1
  5. package/dist/ac-token.js +1 -1
  6. package/dist/{data-grid-Ck1Qx2H1.d.ts → data-grid-DHWJN66w.d.ts} +7 -5
  7. package/dist/{data-grid-Ck1Qx2H1.d.ts.map → data-grid-DHWJN66w.d.ts.map} +1 -1
  8. package/dist/data-grid.d.ts +1 -1
  9. package/dist/data-grid.js +210 -120
  10. package/dist/data-grid.js.map +1 -1
  11. package/dist/detail-list-C96B5Txz.js +2001 -0
  12. package/dist/detail-list-C96B5Txz.js.map +1 -0
  13. package/dist/{detail-list-C1xzr1z7.d.ts → detail-list-dX7jLO6b.d.ts} +12 -3
  14. package/dist/{detail-list-C1xzr1z7.d.ts.map → detail-list-dX7jLO6b.d.ts.map} +1 -1
  15. package/dist/detail-list.d.ts +2 -2
  16. package/dist/detail-list.js +1 -1680
  17. package/dist/{flat-list-Ohxqsy0g.d.ts → flat-list-Y98IqH00.d.ts} +2 -2
  18. package/dist/{flat-list-Ohxqsy0g.d.ts.map → flat-list-Y98IqH00.d.ts.map} +1 -1
  19. package/dist/flat-list.d.ts +1 -1
  20. package/dist/flat-list.js +5 -1
  21. package/dist/flat-list.js.map +1 -1
  22. package/dist/{grid-list-pefLORIr.d.ts → grid-list-CoT9e1jB.d.ts} +9 -2
  23. package/dist/{grid-list-pefLORIr.d.ts.map → grid-list-CoT9e1jB.d.ts.map} +1 -1
  24. package/dist/{grid-list-DjIl910A.js → grid-list-DeqAd9-h.js} +189 -40
  25. package/dist/grid-list-DeqAd9-h.js.map +1 -0
  26. package/dist/grid-list.d.ts +1 -1
  27. package/dist/grid-list.js +1 -1
  28. package/dist/{incr-search-D91M4Ozq.js → incr-search-JIhwB49y.js} +27 -5
  29. package/dist/incr-search-JIhwB49y.js.map +1 -0
  30. package/dist/incr-search.d.ts +1 -1
  31. package/dist/incr-search.js +1 -1
  32. package/dist/index-CnQPCywE.d.ts +325 -0
  33. package/dist/index-CnQPCywE.d.ts.map +1 -0
  34. package/dist/{index-CxZ61DO1.d.ts → index-Dlah7Zfi.d.ts} +8 -1
  35. package/dist/{index-CxZ61DO1.d.ts.map → index-Dlah7Zfi.d.ts.map} +1 -1
  36. package/dist/index.d.ts +9 -9
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +46 -25
  39. package/dist/index.js.map +1 -1
  40. package/dist/miller.d.ts +1 -1
  41. package/dist/miller.d.ts.map +1 -1
  42. package/dist/miller.js +146 -100
  43. package/dist/miller.js.map +1 -1
  44. package/dist/narrowed-text.js +1 -1
  45. package/dist/split-layout-C5SYbDrq.d.ts.map +1 -1
  46. package/dist/{split-layout-CXotkdbx.js → split-layout-Deoxy47d.js} +6 -1
  47. package/dist/{split-layout-CXotkdbx.js.map → split-layout-Deoxy47d.js.map} +1 -1
  48. package/dist/split-layout.js +1 -1
  49. package/dist/{tab-list-v8mKX7Fu.d.ts → tab-list-D_dmImJM.d.ts} +2 -3
  50. package/dist/tab-list-D_dmImJM.d.ts.map +1 -0
  51. package/dist/tabs.d.ts +1 -1
  52. package/dist/tabs.js +22 -0
  53. package/dist/tabs.js.map +1 -1
  54. package/dist/{tree-DGveys4K.js → tree-DD8OaqsK.js} +1010 -230
  55. package/dist/tree-DD8OaqsK.js.map +1 -0
  56. package/dist/tree.d.ts +4 -267
  57. package/dist/tree.js +1 -1
  58. package/dist/{vertical-list-CqBc-t8w.d.ts → vertical-list-lj_19DCx.d.ts} +3 -2
  59. package/dist/{vertical-list-CqBc-t8w.d.ts.map → vertical-list-lj_19DCx.d.ts.map} +1 -1
  60. package/dist/vertical-list.d.ts +1 -1
  61. package/dist/vertical-list.js +113 -24
  62. package/dist/vertical-list.js.map +1 -1
  63. package/docs-user/data-grid.md +74 -4
  64. package/docs-user/detail-list.md +65 -0
  65. package/docs-user/grid-list.md +81 -4
  66. package/docs-user/index.json +1 -1
  67. package/docs-user/miller.md +59 -3
  68. package/docs-user/tree.md +63 -2
  69. package/docs-user/vertical-list.md +9 -1
  70. package/package.json +6 -1
  71. package/dist/detail-list.js.map +0 -1
  72. package/dist/grid-list-DjIl910A.js.map +0 -1
  73. package/dist/incr-search-D91M4Ozq.js.map +0 -1
  74. package/dist/tab-list-v8mKX7Fu.d.ts.map +0 -1
  75. package/dist/tree-DGveys4K.js.map +0 -1
  76. package/dist/tree.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail-list-C96B5Txz.js","names":["#groupIndex","#tickledItemsCache","#dragSelect","#nativeDrag","#blankItemPressPending","#prepareNativeDrag","#nativeDragging","#startPostDragSuppressTimer","#marqueeHitTest","#marqueeRect","#findGroupHeader","#isBlankItemPress","#viewportScrollRaf","#emitViewportChangeIfChanged","#navigateDown","#navigateUp","#navigateRight","#navigateLeft","#navigateTo","#findFirstCheckable","#findLastCheckable","#postDragSuppressTimer","#data","#itemData","#draggableApplied","#searchRegistry","#effectiveSearchModes","#unregisterSearchCommands","#clearBlankItemPress","#resizeObserver","#scheduleGeometry","#mutationObserver","#processAddedChildren","#animateChildMutations","#scheduleGroups","#animatedItems","#cacheObserver","#dropItemCaches","#syncSearchCommands","#allItems","#sortRaf","#groupObserver","#processChildren","#applyFilterPredicate","#recomputeGeometry","#scheduleViewportChangeEmit","#groupByChanged","#builtFromProvider","#providerBuilt","#rebuildFromObjects","#syncFromProvider","#applySort","#itemStatesFullSync","#ensureIcon","#headerEls","#itemForKey","#keyIndexCache","#reconcileObjectRows","#createItemEl","#itemIndex","#groupingActive","#seq","#seqNext","#propertyValue","#colorValue","#ensureBadge","#sortRows","#groupsScheduled","#wasGrouped","#syncGroups","#groupValue","#groupKeyOf","#isItemVisible","#headerFor","#groupList","#syncGroupObserver","#geometryDirty","#geometryScheduled","#geometry","#column","#ensureGeometry","#gridSize","#itemAt","#positionOf","#findNextCheckable","#horizontalTarget","#validateItemCaches","#visibleCachePredicate","#dropVisibleCaches","#visibleCache","#allItemsCache","#renderedKeysCache","#appliedSelected","#appliedChecked","#appliedTickled","#hasCheckboxes","#renderedKeys","#lastViewportRenderedKeys","#lastViewportVisibleKeys","#onListScroll","#marqueeStyle","customElement"],"sources":["../src/detail-list/detail-list-geometry.ts","../src/detail-list/detail-list.ts"],"sourcesContent":["/**\n * Measured column geometry for `ixfx-detail-list`.\n *\n * Items flow top→bottom down a column, then wrap right. The grid is measured\n * from layout once and stored in *content* coordinates (relative to the\n * scroller's content box, independent of `scrollLeft`), so it stays valid\n * while scrolling and only needs re-measuring when layout actually changes.\n */\n\nexport type GridPosition = { readonly col: number; readonly row: number };\n\nexport type GridColumn = {\n /** Content-space left edge. */\n readonly left: number;\n readonly width: number;\n readonly items: readonly Element[];\n};\n\nexport type Geometry = {\n readonly columns: readonly GridColumn[];\n readonly positions: ReadonlyMap<Element, GridPosition>;\n /** Content-space `top` per item — lines rows up across columns. */\n readonly tops: ReadonlyMap<Element, number>;\n /** Content-space `left` per item, for cheap staleness probes. */\n readonly lefts: ReadonlyMap<Element, number>;\n};\n\nexport const EMPTY_GEOMETRY: Geometry = {\n columns: [],\n positions: new Map(),\n tops: new Map(),\n lefts: new Map(),\n};\n\n/** Where the scroller's content box sits in the viewport right now. */\nexport type ContentOrigin = { readonly left: number; readonly top: number };\n\nexport function contentOrigin(scroller: Element): ContentOrigin {\n const r = scroller.getBoundingClientRect();\n return { left: r.left - scroller.scrollLeft, top: r.top - scroller.scrollTop };\n}\n\ntype Measured = { readonly el: Element; readonly left: number; readonly top: number; readonly width: number };\n\n/** Items closer than this (px) horizontally share a column (sub-pixel layout). */\nconst COLUMN_TOLERANCE_PX = 1;\n\n/**\n * Measure `items` (one rect read each — a single layout flush) and bucket them\n * into columns. Zero-sized items (e.g. `display:none`) are skipped.\n */\nexport function measureGeometry(items: readonly Element[], origin: ContentOrigin): Geometry {\n const measured: Measured[] = [];\n for (const el of items) {\n const r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0)\n continue;\n measured.push({ el, left: r.left - origin.left, top: r.top - origin.top, width: r.width });\n }\n measured.sort((a, b) => a.left - b.left || a.top - b.top);\n\n const columns: Array<{ left: number; width: number; items: Element[] }> = [];\n const positions = new Map<Element, GridPosition>();\n const tops = new Map<Element, number>();\n const lefts = new Map<Element, number>();\n for (const m of measured) {\n let col = columns.at(-1);\n if (!col || m.left - col.left > COLUMN_TOLERANCE_PX) {\n col = { left: m.left, width: m.width, items: [] };\n columns.push(col);\n }\n positions.set(m.el, { col: columns.length - 1, row: col.items.length });\n col.items.push(m.el);\n col.width = Math.max(col.width, m.width);\n tops.set(m.el, m.top);\n lefts.set(m.el, m.left);\n }\n return { columns, positions, tops, lefts };\n}\n\n/**\n * Whether `geometry` still matches layout, judged by re-reading a few probe\n * elements. Layout shifts that matter (column width, row height, reflow after\n * an insert) move at least one of first / cursor / last.\n */\nexport function geometryMatches(geometry: Geometry, probes: ReadonlyArray<Element | undefined>, origin: ContentOrigin): boolean {\n for (const el of probes) {\n if (!el)\n continue;\n const left = geometry.lefts.get(el);\n const top = geometry.tops.get(el);\n if (left === undefined || top === undefined)\n return false;\n const r = el.getBoundingClientRect();\n if (Math.abs(r.left - origin.left - left) > 0.5 || Math.abs(r.top - origin.top - top) > 0.5)\n return false;\n }\n return true;\n}\n\n/** First index in `[lo, hi)` for which `pred` holds, given `pred` is monotonic (false… then true…). */\nfunction partitionPoint(lo: number, hi: number, pred: (i: number) => boolean): number {\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (pred(mid))\n hi = mid;\n else\n lo = mid + 1;\n }\n return lo;\n}\n\n/**\n * Items (in DOM order) whose box intersects the content-space span\n * `[start, end)`, found with O(log n) layout reads — no full measure.\n * Relies on column flow: DOM order is column order, so `left` only moves in\n * one direction along the list (increasing for LTR, decreasing for RTL).\n */\nexport function itemsInSpanByOrder(items: readonly Element[], origin: ContentOrigin, start: number, end: number): readonly Element[] {\n if (items.length === 0)\n return [];\n const box = (i: number): { left: number; right: number } => {\n const r = items[i].getBoundingClientRect();\n return { left: r.left - origin.left, right: r.right - origin.left };\n };\n const first = box(0);\n const last = box(items.length - 1);\n if (first.left === last.left) // a single column: all in view or none\n return first.right > start && first.left < end ? items : [];\n const n = items.length;\n if (last.left > first.left) { // LTR\n const from = partitionPoint(0, n, i => box(i).right > start);\n const to = partitionPoint(from, n, i => box(i).left >= end);\n return items.slice(from, to);\n }\n // RTL: columns run right → left as the DOM index grows.\n const from = partitionPoint(0, n, i => box(i).left < end);\n const to = partitionPoint(from, n, i => box(i).right <= start);\n return items.slice(from, to);\n}\n","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 { ListGroupChangeDetail, ListGroupEventMap, ListGroupInfo, ListGroupLabel, ListGroupToggleDetail } from '../interaction/grouping.js';\nimport type { DragSelectRect } from '../interaction/list-drag-select-controller.js';\nimport type {\n ListDragEntry,\n ListDragPreviewRenderer,\n ListDragPreviewSourceResolver,\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 { ListViewportChangeDetail, ListViewportChangeEvent } from '../interaction/list-viewport-types.js';\nimport type { Geometry, GridPosition } from './detail-list-geometry.js';\nimport type {\n AddItemOptions,\n CustomCheckboxOptions,\n DetailFormatter,\n DetailGroupBy,\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, state } from 'lit/decorators.js';\nimport { DataController } from '../common/data-controller.js';\nimport { appearanceAbsent, appearanceColor } from '../common/item-appearance.js';\nimport {\n createElementListSearchAdapter,\n LIST_SEARCH_MODES,\n ListSearchController,\n listSearchStyles,\n registerListSearchCommands,\n} from '../incr-search/index.js';\nimport { partitionByGroup, toGroupKey } from '../interaction/grouping.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 { contentOrigin, EMPTY_GEOMETRY, geometryMatches, itemsInSpanByOrder, measureGeometry } from './detail-list-geometry.js';\nimport '../icons/icon.js';\nimport '../list-group-header/list-group-header.js';\n\nexport type {\n ListGroupBy,\n ListGroupChangeDetail,\n ListGroupChangeEvent,\n ListGroupInfo,\n ListGroupLabel,\n ListGroupToggleDetail,\n ListGroupToggleEvent,\n} from '../interaction/grouping.js';\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 { ListViewportChangeDetail, ListViewportChangeEvent } from '../interaction/list-viewport-types.js';\nexport type {\n AddItemOptions,\n CustomCheckboxOptions,\n DetailFormatter,\n DetailGroupBy,\n DetailSortComparator,\n DetailSortItem,\n DetailSortMode,\n} from './types.js';\n\nconst ITEM_SELECTOR = `:scope > li`;\nconst GROUP_HEADER_ATTR = `data-ixfx-group-header`;\nconst GROUP_COLLAPSED_ATTR = `data-group-collapsed`;\nconst SEARCH_HIGHLIGHT_KEY = `detail-list-search`;\nconst NAV_KEYS = new Set([`ArrowDown`, `ArrowUp`, `ArrowLeft`, `ArrowRight`, `Home`, `End`]);\nconst LABEL_SPAN_CSS = `overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0`;\n\n/**\n * Layout for the per-item badge wrapper `#ensureBadge` adds. Applied as inline\n * `cssText` rather than shadow CSS because `::slotted()` only matches the\n * host's *direct* children — the badge lives inside a slotted `<li>`, so a\n * `::slotted()` rule could never reach it. The values still read the CSS\n * custom property, so it stays themeable from the outside.\n */\nconst BADGE_EL_CSS = `flex-shrink:0;display:inline-flex;align-items:center;margin-inline-start:auto;padding-inline-start:var(--detail-list-badge-gap,8px)`;\n\nfunction pointInRect(x: number, y: number, rect: DOMRect | DOMRectReadOnly): boolean {\n return rect.width > 0 && rect.height > 0\n && x >= rect.left && x < rect.right && y >= rect.top && y < rect.bottom;\n}\n\n/** Hit-test the painted content, not a layout wrapper that may fill the row. */\nfunction contentAtPoint(node: Node, x: number, y: number): boolean {\n if (node instanceof Text) {\n if (!node.textContent?.trim())\n return false;\n const range = document.createRange();\n range.selectNodeContents(node);\n return Array.from(range.getClientRects()).some(rect => pointInRect(x, y, rect));\n }\n if (!(node instanceof Element))\n return false;\n if (node.hasAttribute(`data-drag-select-blank`))\n return false;\n if (node.hasAttribute(`data-drag-select-content`))\n return pointInRect(x, y, node.getBoundingClientRect());\n if (Array.from(node.childNodes).some(child => contentAtPoint(child, x, y)))\n return true;\n // A leaf can be an image, icon, canvas, or consumer-defined custom element.\n return node.childNodes.length === 0 && pointInRect(x, y, node.getBoundingClientRect());\n}\n\n/** Shallow key-array equality, treating `undefined` (never dispatched) as different. */\nfunction sameKeys(a: readonly string[] | undefined, b: readonly string[]): boolean {\n if (a === undefined || a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n}\n\nfunction sameMembers(a: ReadonlySet<Element>, b: ReadonlySet<Element>): boolean {\n if (a.size !== b.size)\n return false;\n for (const el of a) {\n if (!b.has(el))\n return false;\n }\n return true;\n}\n\n/** Remove `attr` from elements leaving the set, add it to elements entering it. */\nfunction applySetDiff(prev: ReadonlySet<Element>, next: ReadonlySet<Element>, attr: string): void {\n for (const el of prev) {\n if (!next.has(el))\n el.removeAttribute(attr);\n }\n for (const el of next) {\n if (!prev.has(el))\n el.setAttribute(attr, ``);\n }\n}\n\n/** Attributes on an item that change list membership, visibility, keys or selectability. */\nconst ITEM_CACHE_ATTRS = [`hidden`, GROUP_COLLAPSED_ATTR, `not-checked`, `data-key`, `data-value`];\n\n/** Whether a mutation record can change the item caches (direct children / their cache attributes). */\nfunction affectsItemCaches(host: Element, record: MutationRecord): boolean {\n if (record.type === `childList`)\n return record.target === host;\n return (record.target as Element).parentElement === host;\n}\n\n/**\n * Make `parent`'s managed children equal `nodes`, in order, with the fewest\n * DOM moves — a single insert stays a single move instead of re-appending\n * every row. `nodes` must contain every managed child; unmanaged children\n * (text, foreign elements) are left where they are.\n */\nfunction syncChildOrder(parent: Element, nodes: readonly Element[], managed: (el: Element) => boolean): void {\n const nextManaged = (from: Element | null): Element | null => {\n let el = from;\n while (el && !managed(el))\n el = el.nextElementSibling;\n return el;\n };\n let cursor = nextManaged(parent.firstElementChild);\n for (const node of nodes) {\n if (node === cursor) {\n cursor = nextManaged(cursor.nextElementSibling);\n continue;\n }\n parent.insertBefore(node, cursor);\n }\n}\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 /**\n * Property on each `items` entry holding a CSS colour for the item's\n * `<ixfx-icon>`. Only read when `iconProperty` also resolves an icon.\n */\n @property({ type: String, attribute: `icon-color-property` })\n iconColorProperty = ``;\n\n /**\n * Property on each `items` entry holding a CSS colour for the item's caption\n * text. Inline, so it wins over the selected/tickled text colours.\n */\n @property({ type: String, attribute: `text-color-property` })\n textColorProperty = ``;\n\n /**\n * Property on each `items` entry holding a Finder-style badge — a\n * `TemplateResult`, a DOM `Node`, or anything Lit can render. Rendered\n * right-justified on the row, after the caption.\n */\n @property({ type: String, attribute: `badge-property` })\n badgeProperty = ``;\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 @property({ attribute: false })\n dragPreviewSource: ListDragPreviewSourceResolver<Element> | undefined;\n\n /**\n * Group rows under collapsible headers that flow inline in the columns. A\n * string names an item property (object items) or a `data-<name>` attribute;\n * a function derives the key from `(data, element)`. `null` = ungrouped.\n * Groups appear in first-encounter order (after sorting and filtering).\n */\n @property({ attribute: `group-by` })\n groupBy: DetailGroupBy | null = null;\n\n /** Header label for a group. Defaults to the key (`(none)` for the empty key). */\n @property({ attribute: false })\n groupLabel: ListGroupLabel | undefined;\n\n /**\n * Let selection span groups. When `false` (default) selecting in one group\n * clears the others and Shift-range / select-all stay inside one group.\n */\n @property({ type: Boolean, attribute: `cross-group-selection`, reflect: true })\n crossGroupSelection = false;\n\n @state() private _collapsedGroups: ReadonlySet<string> = new Set();\n\n @query(`ul`)\n private _listEl!: HTMLUListElement;\n\n #itemData = new WeakMap<HTMLLIElement, unknown>();\n /** The `index` each object item was formatted with — reuse is only safe at the same index. */\n #itemIndex = new WeakMap<HTMLLIElement, number>();\n /** Measured column grid (content coordinates). See `#ensureGeometry`. */\n #geometry: Geometry = EMPTY_GEOMETRY;\n /** Layout may have changed since `#geometry` was measured. */\n #geometryDirty = true;\n #geometryScheduled = false;\n /**\n * Watches child / visibility / key changes so the item caches below can be\n * validated synchronously (via `takeRecords()`) on every read — they are\n * never stale, even within the same task as the mutation.\n */\n #cacheObserver: MutationObserver | undefined;\n #allItemsCache: HTMLLIElement[] | undefined;\n #visibleCache: Element[] | undefined;\n #visibleCachePredicate: ((el: Element) => boolean) | undefined;\n #tickledItemsCache: Array<{ id: Element; enabled: boolean }> | undefined;\n #renderedKeysCache: string[] | undefined;\n #keyIndexCache: Map<string, Element> | undefined;\n /** Item states as last written to the DOM, so `_syncItemStates` can apply just the diff. */\n #appliedTickled: Element | undefined;\n #appliedSelected: ReadonlySet<Element> = new Set();\n #appliedChecked: ReadonlySet<Element> = new Set();\n #itemStatesFullSync = true;\n #hasCheckboxes = false;\n #draggableApplied = false;\n #sortRaf = 0;\n #viewportScrollRaf = 0;\n /** Key sets as of the last viewport-change dispatch, for dedupe. */\n #lastViewportRenderedKeys: readonly string[] | undefined;\n #lastViewportVisibleKeys: readonly string[] | undefined;\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 /** Element → group key, for the selection controller. Empty while ungrouped. */\n #groupIndex = new Map<Element, string>();\n #groupList: readonly ListGroupInfo[] = [];\n #headerEls = new Map<string, HTMLElement>();\n /** Insertion sequence per item, so regrouping starts from the original order. */\n #seq = new WeakMap<Element, number>();\n #seqNext = 0;\n #wasGrouped = false;\n #groupsScheduled = false;\n #groupByChanged = false;\n #groupObserver: MutationObserver | undefined;\n #providerBuilt = 0;\n\n readonly #data = new DataController<void, unknown>(this);\n\n private readonly selection: ListSelectionController<Element> = 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 getGroupKey: el => this.#groupIndex.get(el) ?? null,\n crossGroupSelection: () => this.crossGroupSelection,\n getFallbackGroupKey: (): string | null => {\n const t = this.tickled.tickledId;\n return t ? this.#groupIndex.get(t) ?? null : null;\n },\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: TickledController<Element> = new TickledController<Element>(this, {\n getItems: () => {\n const visible = this._getVisibleItems();\n // `_getVisibleItems` drops this cache whenever the visible set changes.\n this.#tickledItemsCache ??= visible.map(el => ({ id: el, enabled: !el.hasAttribute(`not-checked`) }));\n return this.#tickledItemsCache;\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 #blankItemPressPending = false;\n\n #clearBlankItemPress = (): void => {\n this.#blankItemPressPending = false;\n };\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 getDragPreviewSourceResolver: () => this.dragPreviewSource,\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 shouldStart: () => !this.#blankItemPressPending,\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 // Nothing was ever made draggable and nothing should be — skip the pass.\n if (!this.itemsDraggable && !this.#draggableApplied)\n return;\n this.#draggableApplied = this.itemsDraggable;\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 shouldStart: (event) => {\n if (this.#findGroupHeader(event.composedPath()))\n return false;\n this.#blankItemPressPending = this.itemsDraggable && this.#isBlankItemPress(event);\n return !this.itemsDraggable || this.#blankItemPressPending;\n },\n });\n\n /** A row's padding/empty area may start marquee; its actual content may drag out. */\n #isBlankItemPress(event: PointerEvent): boolean {\n const path = event.composedPath();\n const item = this._findListItem(path);\n if (!item)\n return false;\n for (const node of path) {\n if (node === item)\n break;\n if (node instanceof Element) {\n if (node.matches(`input, button, a, select, textarea, [contenteditable], .ixfx-list-checkbox, [role=\"checkbox\"]`))\n return false;\n if (node.hasAttribute(`data-drag-select-blank`))\n return true;\n if (node.hasAttribute(`data-drag-select-content`))\n return false;\n }\n }\n return !Array.from(item.childNodes).some(node => contentAtPoint(node, event.clientX, event.clientY));\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(`pointermove`, this._endKeyboardNav);\n this.addEventListener(`pointerdown`, this._endKeyboardNav);\n this.addEventListener(`click`, this._onClick);\n this.addEventListener(`dblclick`, this._onDblClick);\n this.addEventListener(`wheel`, this._onWheel);\n window.addEventListener(`pointerup`, this.#clearBlankItemPress);\n window.addEventListener(`pointercancel`, this.#clearBlankItemPress);\n\n this.#resizeObserver = new ResizeObserver(() => this.#scheduleGeometry());\n this.#resizeObserver.observe(this);\n this.#mutationObserver = new MutationObserver((records) => {\n this.#processAddedChildren(records);\n this.#animateChildMutations(records);\n this.#scheduleGeometry();\n this.#scheduleGroups();\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.#cacheObserver = new MutationObserver((records) => {\n if (records.some(r => affectsItemCaches(this, r)))\n this.#dropItemCaches();\n });\n this.#cacheObserver.observe(this, { childList: true, subtree: true, attributes: true, attributeFilter: ITEM_CACHE_ATTRS });\n this.#dropItemCaches();\n this.#searchRegistry ??= createCommandRegistry();\n this.#syncSearchCommands();\n this.#scheduleGroups();\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.#allItems().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(`pointermove`, this._endKeyboardNav);\n this.removeEventListener(`pointerdown`, this._endKeyboardNav);\n this.removeEventListener(`click`, this._onClick);\n this.removeEventListener(`dblclick`, this._onDblClick);\n this.removeEventListener(`wheel`, this._onWheel);\n window.removeEventListener(`pointerup`, this.#clearBlankItemPress);\n window.removeEventListener(`pointercancel`, this.#clearBlankItemPress);\n this.#blankItemPressPending = false;\n cancelAnimationFrame(this.#sortRaf);\n cancelAnimationFrame(this.#viewportScrollRaf);\n this.#viewportScrollRaf = 0;\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = undefined;\n this.#mutationObserver?.disconnect();\n this.#mutationObserver = undefined;\n this.#groupObserver?.disconnect();\n this.#groupObserver = undefined;\n this.#cacheObserver?.disconnect();\n this.#cacheObserver = undefined;\n this.#dropItemCaches();\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.#scheduleViewportChangeEmit();\n this._syncNativeDraggable();\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n if (changed.has(`groupBy`) && this.hasUpdated) {\n if (this._collapsedGroups.size > 0)\n this._collapsedGroups = new Set();\n this.#groupByChanged = true;\n }\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`groupBy`) || changed.has(`groupLabel`) || (changed as Map<PropertyKey, unknown>).has(`_collapsedGroups`)) {\n this.#scheduleGroups();\n if (this.#groupByChanged) {\n this.#groupByChanged = false;\n this._dispatch<ListGroupChangeDetail>(`list-group-change`, { groupBy: this.groupBy as ListGroupChangeDetail[`groupBy`] });\n }\n }\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 // Every property that shapes how an object item is built has to rebuild\n // the rows — they are baked into the `<li>` at creation time.\n const shapeChanged = changed.has(`displayProperty`)\n || changed.has(`formatter`)\n || changed.has(`iconProperty`)\n || changed.has(`iconColorProperty`)\n || changed.has(`textColorProperty`)\n || changed.has(`badgeProperty`)\n || changed.has(`keyProperty`);\n if ((changed.has(`items`) || shapeChanged) && this.provider === undefined && this.items.length > 0) {\n // When only `items` changed, rows for objects that are still present can be kept.\n this.#rebuildFromObjects(this.items, !shapeChanged);\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 this.#scheduleGroups();\n }\n if (changed.has(`interactionMode`)) {\n this.selection.clearAnchor();\n this.#itemStatesFullSync = true;\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 this.#scheduleViewportChangeEmit();\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 this.#scheduleGroups();\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 this.#scheduleGroups();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n this.#scheduleGeometry();\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.#headerEls.clear();\n this.#scheduleGroups();\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 this.#scheduleGroups();\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 // Runs every scroll frame and after every mutation, so it binary-searches\n // the column flow (O(log n) layout reads) instead of measuring every item.\n const start = container.scrollLeft;\n const end = start + container.getBoundingClientRect().width;\n const out: string[] = [];\n for (const el of itemsInSpanByOrder(this._getVisibleItems(), contentOrigin(container), start, end)) {\n const key = keyForElement(el);\n if (key !== undefined)\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 if (!this.#keyIndexCache) {\n const index = new Map<string, Element>();\n for (const el of this.#allItems()) {\n const k = keyForElement(el);\n if (k !== undefined && !index.has(k))\n index.set(k, el);\n }\n this.#keyIndexCache = index;\n }\n return this.#keyIndexCache.get(key);\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[], reuseRows = false): 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 if (reuseRows)\n this.#reconcileObjectRows(items);\n else\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 this.#scheduleGroups();\n }\n\n /**\n * Update the rows to match `items`, keeping the `<li>` of every object that\n * is still present (by identity) instead of rebuilding all of them — so\n * `items = [...items, next]` creates one row, not thousands. A row built by\n * a `formatter` is only kept at the same index, since the formatter receives\n * the index.\n */\n #reconcileObjectRows(items: readonly unknown[]): void {\n const reusable = new Map<unknown, HTMLLIElement>();\n for (const li of this.#allItems()) {\n if (this.#itemData.has(li) && !reusable.has(this.#itemData.get(li)))\n reusable.set(this.#itemData.get(li), li);\n }\n const next = items.map((item, index) => {\n const li = reusable.get(item);\n if (li && (!this.formatter || this.#itemIndex.get(li) === index)) {\n reusable.delete(item);\n return li;\n }\n return this.#createItemEl(item, index);\n });\n const keep = new Set<Element>(next);\n for (const li of this.#allItems()) {\n if (!keep.has(li))\n li.remove();\n }\n if (this.#groupingActive()) {\n // Grouping owns the DOM order (`#syncGroups`, from insertion sequence):\n // renumber to the new `items` order, add the new rows, and let it place\n // them — putting rows in ungrouped order first would move every row twice.\n for (const li of next)\n this.#seq.set(li, this.#seqNext++);\n this.append(...next.filter(li => li.parentElement !== this));\n this.#scheduleGroups();\n return;\n }\n syncChildOrder(this, next, el => el.localName === `li`);\n }\n\n #createItemEl(item: unknown, index: number): HTMLLIElement {\n const li = document.createElement(`li`);\n this.#itemData.set(li, item);\n this.#itemIndex.set(li, index);\n\n const content = this.formatter\n ? this.formatter(item, index)\n : (this.displayProperty\n ? this.#propertyValue(item, this.displayProperty)\n : item);\n const textColor = this.#colorValue(item, this.textColorProperty);\n const iconColor = this.#colorValue(item, this.iconColorProperty);\n if (iconColor !== undefined)\n li.setAttribute(`data-icon-color`, iconColor);\n if (typeof content === `string`) {\n const span = this._setLabel(li, content);\n if (textColor !== undefined)\n span.style.color = textColor;\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 if (textColor !== undefined)\n li.style.color = textColor;\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 this.#ensureBadge(li, this.#propertyValue(item, this.badgeProperty));\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 /** A non-empty string from `item[prop]`, else `undefined`. */\n #colorValue(item: unknown, prop: string): string | undefined {\n return prop ? appearanceColor(this.#propertyValue(item, prop)) : undefined;\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 this.#scheduleGroups();\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 // Grouped lists are ordered (sorted, then partitioned) in one pass by #syncGroups.\n if (this.#groupingActive()) {\n this.#scheduleGroups();\n return;\n }\n syncChildOrder(this, this.#sortRows(rows), el => el.localName === `li`);\n this.#scheduleGeometry();\n this.#scheduleGroups();\n }\n\n /** Stable sort of `rows` by the current `sort` / `sortBy` / `sortComparator`. */\n #sortRows(rows: HTMLLIElement[]): HTMLLIElement[] {\n const dir = this.sort === `descending` ? -1 : 1;\n // Each row's sort inputs are read from the DOM once, not once per comparison.\n const metas = rows.map((el): DetailSortItem => ({\n element: el,\n data: this.getItemData(el),\n label: el.getAttribute(`data-search-label`) ?? el.textContent?.trim() ?? ``,\n }));\n const collator = new Intl.Collator(undefined, { numeric: true });\n\n let cmp: (a: number, b: number) => number;\n if (this.sortComparator) {\n const user = this.sortComparator;\n cmp = (a, b) => user(metas[a], metas[b]);\n } else if (this.sortBy) {\n const prop = this.sortBy;\n const keys = metas.map((m): string | number => {\n const v = this.#propertyValue(m.data, 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 = keys[a];\n const kb = keys[b];\n if (typeof ka === `number` && typeof kb === `number`)\n return ka - kb;\n return collator.compare(String(ka), String(kb));\n };\n } else {\n cmp = (a, b) => collator.compare(metas[a].label, metas[b].label);\n }\n\n const order = rows.map((_, i) => i);\n order.sort((a, b) => cmp(a, b) * dir || a - b); // stable\n return order.map(i => rows[i]);\n }\n\n // --- Grouping ---\n\n #groupingActive(): boolean {\n return this.groupBy !== null && this.groupBy !== undefined && this.groupBy !== ``;\n }\n\n /** Coalesce regrouping to one pass per microtask (streaming batches, search keystrokes). */\n #scheduleGroups(): void {\n if (this.#groupsScheduled || (!this.#groupingActive() && !this.#wasGrouped))\n return;\n this.#groupsScheduled = true;\n queueMicrotask(() => {\n this.#groupsScheduled = false;\n this.#syncGroups();\n });\n }\n\n #groupValue(el: Element, name: string): unknown {\n return this.#propertyValue(this.getItemData(el as HTMLLIElement), name) ?? el.getAttribute(`data-${name}`);\n }\n\n #groupKeyOf(el: Element): string {\n const by = this.groupBy!;\n if (typeof by === `string`)\n return toGroupKey(this.#groupValue(el, by));\n return toGroupKey(by(this.getItemData(el as HTMLLIElement), el));\n }\n\n #isItemVisible(el: Element): boolean {\n return !(el as HTMLElement).hidden && (!this.filterPredicate || this.filterPredicate(el));\n }\n\n #headerFor(key: string): HTMLElement {\n let header = this.#headerEls.get(key);\n if (!header) {\n header = document.createElement(`ixfx-list-group-header`);\n header.setAttribute(GROUP_HEADER_ATTR, ``);\n header.dataset.groupKey = key;\n this.#headerEls.set(key, header);\n }\n return header;\n }\n\n /**\n * Bring the light DOM into grouped order: original order → sort → partition\n * into contiguous groups, each preceded by a header row. Idempotent — it only\n * touches the DOM when the order actually changes, so it never loops through\n * the mutation observer. Ungrouping restores the original (sorted) order.\n */\n #syncGroups(): void {\n const active = this.#groupingActive();\n if (!active && !this.#wasGrouped)\n return;\n const items = this.#allItems();\n for (const el of items) {\n if (!this.#seq.has(el))\n this.#seq.set(el, this.#seqNext++);\n }\n let ordered = items.toSorted((a, b) => this.#seq.get(a)! - this.#seq.get(b)!);\n if (this.sort !== `none` && ordered.length > 1)\n ordered = this.#sortRows(ordered);\n\n const nodes: Element[] = [];\n const info: ListGroupInfo[] = [];\n const index = new Map<Element, string>();\n const liveHeaders = new Set<string>();\n if (active) {\n const label = this.groupLabel;\n const parts = partitionByGroup(\n ordered,\n el => this.#groupKeyOf(el),\n label ? (key, els) => label(key, (els as Element[]).map(el => this.getItemData(el as HTMLLIElement) ?? el)) : undefined,\n );\n for (const part of parts) {\n const count = part.items.filter(el => this.#isItemVisible(el)).length;\n const collapsed = count > 0 && this._collapsedGroups.has(part.key);\n if (count > 0) {\n const header = this.#headerFor(part.key) as HTMLElement & { label: string; count: number; collapsed: boolean };\n header.label = part.label;\n header.count = count;\n header.collapsed = collapsed;\n liveHeaders.add(part.key);\n nodes.push(header);\n info.push({ key: part.key, label: part.label, count, collapsed: this._collapsedGroups.has(part.key) });\n }\n for (const el of part.items) {\n index.set(el, part.key);\n el.toggleAttribute(GROUP_COLLAPSED_ATTR, collapsed);\n nodes.push(el);\n }\n }\n } else {\n for (const el of ordered)\n el.removeAttribute(GROUP_COLLAPSED_ATTR);\n nodes.push(...ordered);\n }\n for (const [key, header] of this.#headerEls) {\n if (!liveHeaders.has(key)) {\n header.remove();\n this.#headerEls.delete(key);\n }\n }\n this.#groupIndex = index;\n this.#groupList = info;\n this.#wasGrouped = active;\n\n // Moves only what's out of place — appending one row into a group is one move.\n syncChildOrder(this, nodes, c => c.localName === `li` || c.hasAttribute(GROUP_HEADER_ATTR));\n\n const cursor = this.tickled.tickledId;\n if (cursor?.hasAttribute(GROUP_COLLAPSED_ATTR))\n this.tickled.focus(undefined);\n this.#syncGroupObserver(active);\n this.#scheduleGeometry();\n }\n\n /** Filter-search hides rows via `hidden` on the `<li>`s — regroup when that changes. */\n #syncGroupObserver(active: boolean): void {\n if (!active) {\n this.#groupObserver?.disconnect();\n this.#groupObserver = undefined;\n return;\n }\n if (this.#groupObserver || !this.isConnected)\n return;\n this.#groupObserver = new MutationObserver(() => this.#scheduleGroups());\n this.#groupObserver.observe(this, { subtree: true, attributes: true, attributeFilter: [`hidden`] });\n }\n\n /** Groups in display order (empty when ungrouped). */\n get groups(): readonly ListGroupInfo[] {\n return this.#groupList;\n }\n\n /** Collapse or expand one group. Fires `list-group-toggle` when the state changes. */\n setGroupCollapsed(groupKey: string, collapsed: boolean): void {\n if (this._collapsedGroups.has(groupKey) === collapsed)\n return;\n const next = new Set(this._collapsedGroups);\n if (collapsed)\n next.add(groupKey);\n else\n next.delete(groupKey);\n this._collapsedGroups = next;\n this._dispatch<ListGroupToggleDetail>(`list-group-toggle`, { groupKey, collapsed });\n }\n\n toggleGroup(groupKey: string): void {\n this.setGroupCollapsed(groupKey, !this._collapsedGroups.has(groupKey));\n }\n\n collapseAllGroups(): void {\n for (const g of this.#groupList)\n this.setGroupCollapsed(g.key, true);\n }\n\n expandAllGroups(): void {\n for (const key of [...this._collapsedGroups])\n this.setGroupCollapsed(key, false);\n }\n\n #findGroupHeader(path: EventTarget[]): HTMLElement | undefined {\n for (const target of path) {\n if (target === this)\n break;\n if (target instanceof HTMLElement && target.parentElement === this && target.hasAttribute(GROUP_HEADER_ATTR))\n return target;\n }\n return undefined;\n }\n\n // --- Geometry (measured grid) ---\n\n /**\n * Mark the layout dirty and, next frame, check for a viewport change.\n * Geometry moves (resize, filter, sort, DOM changes) can change the visible\n * set without a scroll, so every layout-changing path comes through here.\n * The grid itself is re-measured lazily, by whoever needs it next.\n */\n #scheduleGeometry(): void {\n this.#geometryDirty = true;\n if (this.#geometryScheduled)\n return;\n this.#geometryScheduled = true;\n requestAnimationFrame(() => {\n this.#geometryScheduled = false;\n this.#emitViewportChangeIfChanged();\n });\n }\n\n /** Re-measure the column grid now (one layout read per visible item). */\n #recomputeGeometry(): void {\n this.#geometryDirty = false;\n this.#geometry = this.isConnected && this._listEl\n ? measureGeometry(this._getVisibleItems(), contentOrigin(this._listEl))\n : EMPTY_GEOMETRY;\n }\n\n /**\n * The column grid, re-measured only if it's known dirty or a few probe items\n * have moved (catches layout changes nothing told us about, e.g. a CSS\n * variable change). Cheap enough to call per keypress / scroll frame.\n */\n #ensureGeometry(): Geometry {\n const visible = this._getVisibleItems();\n if (this.#geometryDirty || !this._listEl) {\n this.#recomputeGeometry();\n return this.#geometry;\n }\n const cursor = this.tickled.tickledId;\n const probes = [visible[0], cursor && this.#geometry.positions.has(cursor) ? cursor : undefined, visible.at(-1)];\n if (!geometryMatches(this.#geometry, probes, contentOrigin(this._listEl)))\n this.#recomputeGeometry();\n return this.#geometry;\n }\n\n #positionOf(el: Element): GridPosition | undefined {\n let pos = this.#geometry.positions.get(el);\n if (pos === undefined) {\n this.#recomputeGeometry();\n pos = this.#geometry.positions.get(el);\n }\n return pos;\n }\n\n #column(col: number): readonly Element[] | undefined {\n return this.#geometry.columns[col]?.items;\n }\n\n #itemAt(col: number, row: number): Element | undefined {\n return this.#column(col)?.[row];\n }\n\n #gridSize(): { cols: number; rows: number } {\n const { columns } = this.#ensureGeometry();\n return { cols: columns.length, rows: Math.max(0, ...columns.map(c => c.items.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.#column(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.#column(col)?.length ?? 1) - 1;\n wrappedColumns = true;\n } else if (this.itemWrap === `wrap`) {\n col = cols - 1;\n row = (this.#column(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.#column(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.#ensureGeometry();\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.#ensureGeometry();\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 /**\n * Left/Right target. Ungrouped lists keep the row-index rule. Grouped lists\n * have headers at arbitrary heights, so an item's row index no longer equals\n * its visual row — pick the item in the neighbouring column whose top is\n * nearest the cursor's (ties go to the upper one).\n */\n #horizontalTarget(from: GridPosition, dir: -1 | 1): Element | undefined {\n if (this.#groupList.length === 0)\n return this.#findNextCheckable(from.col, from.row, dir, 0);\n const column = this.#column(from.col + dir);\n const current = this.tickled.tickledId;\n const top = current ? this.#geometry.tops.get(current) : undefined;\n if (!column || top === undefined)\n return undefined;\n let best: Element | undefined;\n let bestDelta = Number.POSITIVE_INFINITY;\n for (const el of column) {\n if (!this._isCheckable(el))\n continue;\n const delta = Math.abs((this.#geometry.tops.get(el) ?? Number.POSITIVE_INFINITY) - top);\n if (delta < bestDelta) {\n best = el;\n bestDelta = delta;\n }\n }\n return best;\n }\n\n #navigateRight(): void {\n this.#ensureGeometry();\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.#horizontalTarget(cur, 1);\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.#ensureGeometry();\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.#horizontalTarget(cur, -1);\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 /**\n * Visible items in DOM order. Cached — every per-hover / per-frame path\n * reads it — and validated on each call, so it is never stale.\n */\n private _getVisibleItems(): readonly Element[] {\n this.#validateItemCaches();\n if (this.#visibleCachePredicate !== this.filterPredicate) {\n this.#dropVisibleCaches();\n this.#visibleCachePredicate = this.filterPredicate;\n }\n this.#visibleCache ??= this.#allItems().filter((el) => {\n if (el.hidden)\n return false;\n if (el.hasAttribute(GROUP_COLLAPSED_ATTR))\n return false;\n if (this.filterPredicate && !this.filterPredicate(el))\n return false;\n return true;\n });\n return this.#visibleCache;\n }\n\n /** Every item (`<li>` child), in DOM order. Cached like `_getVisibleItems`. */\n #allItems(): readonly HTMLLIElement[] {\n this.#validateItemCaches();\n this.#allItemsCache ??= [...this.querySelectorAll<HTMLLIElement>(ITEM_SELECTOR)];\n return this.#allItemsCache;\n }\n\n /** Drop the item caches if anything relevant changed since they were built. */\n #validateItemCaches(): void {\n if (!this.#cacheObserver) {\n // Not observing (disconnected): never trust a cache.\n this.#dropItemCaches();\n return;\n }\n if (this.#cacheObserver.takeRecords().some(r => affectsItemCaches(this, r)))\n this.#dropItemCaches();\n }\n\n #dropItemCaches(): void {\n this.#allItemsCache = undefined;\n this.#keyIndexCache = undefined;\n this.#itemStatesFullSync = true;\n this.#dropVisibleCaches();\n }\n\n #dropVisibleCaches(): void {\n this.#visibleCache = undefined;\n this.#tickledItemsCache = undefined;\n this.#renderedKeysCache = undefined;\n this.#geometryDirty = true;\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 /** Appends the caption span; returns it so callers can style it per item. */\n private _setLabel(li: HTMLLIElement, label: string): HTMLSpanElement {\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 return span;\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 // Icons paint from `currentColor`, so tinting the host colours the glyph.\n const color = li.getAttribute(`data-icon-color`);\n if (color)\n icon.style.color = color;\n li.prepend(icon);\n }\n\n /**\n * Append a right-justified Finder-style badge. `badge` may be a DOM `Node`\n * or anything Lit can render (typically a `TemplateResult`). Idempotent —\n * a second call replaces the existing badge.\n */\n #ensureBadge(li: HTMLLIElement, badge: unknown): void {\n if (appearanceAbsent(badge))\n return;\n let holder = li.querySelector<HTMLElement>(`:scope > .item-badge`);\n if (!holder) {\n holder = document.createElement(`span`);\n holder.className = `item-badge`;\n holder.style.cssText = BADGE_EL_CSS;\n li.appendChild(holder);\n }\n holder.replaceChildren();\n if (badge instanceof Node)\n holder.appendChild(badge);\n else\n render(badge, holder);\n }\n\n /** Scan light-DOM children for unprocessed `data-icon` items. */\n #processChildren(): void {\n for (const el of this.#allItems())\n this.#ensureIcon(el);\n }\n\n /** `#processChildren` for just the items a batch of mutations added. */\n #processAddedChildren(records: readonly MutationRecord[]): void {\n for (const record of records) {\n for (const node of record.addedNodes) {\n if (node instanceof HTMLLIElement && node.parentElement === this)\n this.#ensureIcon(node);\n }\n }\n }\n\n /**\n * Reflect cursor / selection / checked state onto the items. After the item\n * set changes (or the interaction mode does) every item is visited; otherwise\n * only the items whose state changed are touched, so hovering is O(1).\n */\n private _syncItemStates(): void {\n const selected = this.selection.selected;\n const checked: ReadonlySet<Element> = this.interactionMode === `checked`\n ? new Set([...selected].filter(el => !el.hasAttribute(`not-checked`)))\n : new Set();\n const tickled = this.tickled.tickledId;\n const selectionChanged = this.#itemStatesFullSync\n || !sameMembers(this.#appliedSelected, selected)\n || !sameMembers(this.#appliedChecked, checked);\n if (this.#itemStatesFullSync) {\n for (const el of this.#allItems()) {\n el.toggleAttribute(`data-tickled`, el === tickled);\n el.toggleAttribute(`data-selected`, selected.has(el));\n el.toggleAttribute(`data-checked`, checked.has(el));\n }\n this.#itemStatesFullSync = false;\n } else {\n if (tickled !== this.#appliedTickled) {\n this.#appliedTickled?.removeAttribute(`data-tickled`);\n tickled?.setAttribute(`data-tickled`, ``);\n }\n applySetDiff(this.#appliedSelected, selected, `data-selected`);\n applySetDiff(this.#appliedChecked, checked, `data-checked`);\n }\n this.#appliedTickled = tickled;\n this.#appliedSelected = new Set(selected);\n this.#appliedChecked = checked;\n if (this.dataset.inputMode !== this.tickled.inputMode)\n this.dataset.inputMode = this.tickled.inputMode;\n if (selectionChanged)\n this._syncCheckboxes();\n }\n\n private _syncCheckboxes(): void {\n const inCheckedMode = this.interactionMode === `checked`;\n const wantsCustom = typeof this.checkboxRenderer === `function`;\n // Outside checked mode there's nothing to do unless checkboxes were added earlier.\n if (!inCheckedMode && !this.#hasCheckboxes)\n return;\n this.#hasCheckboxes = inCheckedMode;\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 DetailListElementEventMap, 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 /** Scroll on the `part=\"list\"` element — rAF-coalesced viewport-change check. */\n #onListScroll = (): void => {\n if (this.#viewportScrollRaf !== 0)\n return;\n this.#viewportScrollRaf = requestAnimationFrame(() => {\n this.#viewportScrollRaf = 0;\n this.#emitViewportChangeIfChanged();\n });\n };\n\n /** Coalesce non-scroll viewport checks to at most one per animation frame. */\n #scheduleViewportChangeEmit(): void {\n if (this.#viewportScrollRaf !== 0)\n return;\n this.#viewportScrollRaf = requestAnimationFrame(() => {\n this.#viewportScrollRaf = 0;\n this.#emitViewportChangeIfChanged();\n });\n }\n\n /**\n * Keys of everything currently rendered. The list has no virtual window —\n * every non-hidden item is in the DOM — so this is all keyed items, mirroring\n * `ixfx-vertical-list.renderedKeys()` in its non-virtualized mode.\n */\n #renderedKeys(): string[] {\n const visible = this._getVisibleItems();\n // `_getVisibleItems` drops this cache whenever the visible set changes.\n this.#renderedKeysCache ??= visible.flatMap((el) => {\n const key = keyForElement(el);\n return key === undefined ? [] : [key];\n });\n return this.#renderedKeysCache;\n }\n\n /**\n * Dispatch `detail-list-viewport-change` with the current key sets — unless\n * neither set changed since the last dispatch, so coalesced frames and\n * no-op scrolls stay silent.\n */\n #emitViewportChangeIfChanged(): void {\n const renderedKeys = this.#renderedKeys();\n const visibleKeys = this.visibleKeys();\n if (sameKeys(this.#lastViewportRenderedKeys, renderedKeys) && sameKeys(this.#lastViewportVisibleKeys, visibleKeys))\n return;\n this.#lastViewportRenderedKeys = renderedKeys;\n this.#lastViewportVisibleKeys = visibleKeys;\n this._dispatch<ListViewportChangeDetail>(`detail-list-viewport-change`, { renderedKeys, visibleKeys });\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 /** Restores hover transitions once the pointer takes over from the keyboard. */\n private _endKeyboardNav = (): void => {\n this.removeAttribute(`data-keyboard-nav`);\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 // Only when absent: even a same-value write re-matches `:host([data-keyboard-nav])`\n // against every row — a full style recalc per keypress on a big list.\n if (NAV_KEYS.has(e.key) && !this.hasAttribute(`data-keyboard-nav`))\n this.setAttribute(`data-keyboard-nav`, ``);\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 path = e.composedPath();\n const header = this.#findGroupHeader(path);\n if (header) {\n this.toggleGroup(header.dataset.groupKey ?? ``);\n return;\n }\n const item = this._findListItem(path);\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 // Mouse wheels report vertical-only deltaY; trackpads report a genuine\n // deltaX for horizontal swipes. Drive scrollLeft from whichever axis the\n // user is actually moving, so trackpad horizontal scrolling isn't\n // swallowed by a preventDefault() that only ever read deltaY.\n e.preventDefault();\n const delta = Math.abs(e.deltaX) > Math.abs(e.deltaY) ? e.deltaX : e.deltaY;\n this._listEl.scrollLeft += delta;\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 /* Rows of a collapsed group leave the flow; their header stays. */\n ::slotted([data-group-collapsed]) {\n display: none !important;\n }\n\n /* Group headers are rows in the column flow, the same size as an item. */\n ::slotted(ixfx-list-group-header) {\n box-sizing: border-box;\n flex: none;\n width: var(--detail-list-column-width, 220px);\n height: var(--detail-list-item-height, 28px);\n --list-group-header-height: var(--detail-list-group-header-height, var(--detail-list-item-height, 28px));\n }\n\n ::slotted(li) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n flex: none;\n /* Paint-isolates each row, so restyling one row (hover, selection)\n doesn't repaint the whole list: ~3.5x less render work per hover at\n 10k rows, for ~0.6ms more compositor commit per scroll frame. Paint\n only: layout/style containment add nothing here, and no size\n containment — fitColumnWidth() measures rows at max-content. */\n contain: paint;\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 /* While navigating by keyboard, key-repeat outpaces the 0.1s fade so the\n cursor smears across rows. Snap instead. */\n :host([data-keyboard-nav]) ::slotted(li) {\n transition: none;\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 /* Per-item icon / badge (adapter mode) are styled inline by\n #ensureBadge — ::slotted() only reaches the host's direct children,\n and these spans live inside a slotted <li>. */\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\" @scroll=${this.#onListScroll}>\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, ListGroupEventMap {\n 'detail-list-viewport-change': ListViewportChangeEvent;\n 'list-native-drag-start': ListNativeDragStartEvent<Element>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA2BA,MAAa,iBAA2B;CACtC,SAAS,CAAC;CACV,2BAAW,IAAI,IAAI;CACnB,sBAAM,IAAI,IAAI;CACd,uBAAO,IAAI,IAAI;AACjB;AAKA,SAAgB,cAAc,UAAkC;CAC9D,MAAM,IAAI,SAAS,sBAAsB;CACzC,OAAO;EAAE,MAAM,EAAE,OAAO,SAAS;EAAY,KAAK,EAAE,MAAM,SAAS;CAAU;AAC/E;;AAKA,MAAM,sBAAsB;;;;;AAM5B,SAAgB,gBAAgB,OAA2B,QAAiC;CAC1F,MAAM,WAAuB,CAAC;CAC9B,KAAK,MAAM,MAAM,OAAO;EACtB,MAAM,IAAI,GAAG,sBAAsB;EACnC,IAAI,EAAE,UAAU,KAAK,EAAE,WAAW,GAChC;EACF,SAAS,KAAK;GAAE;GAAI,MAAM,EAAE,OAAO,OAAO;GAAM,KAAK,EAAE,MAAM,OAAO;GAAK,OAAO,EAAE;EAAM,CAAC;CAC3F;CACA,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG;CAExD,MAAM,UAAoE,CAAC;CAC3E,MAAM,4BAAY,IAAI,IAA2B;CACjD,MAAM,uBAAO,IAAI,IAAqB;CACtC,MAAM,wBAAQ,IAAI,IAAqB;CACvC,KAAK,MAAM,KAAK,UAAU;EACxB,IAAI,MAAM,QAAQ,GAAG,EAAE;EACvB,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,OAAO,qBAAqB;GACnD,MAAM;IAAE,MAAM,EAAE;IAAM,OAAO,EAAE;IAAO,OAAO,CAAC;GAAE;GAChD,QAAQ,KAAK,GAAG;EAClB;EACA,UAAU,IAAI,EAAE,IAAI;GAAE,KAAK,QAAQ,SAAS;GAAG,KAAK,IAAI,MAAM;EAAO,CAAC;EACtE,IAAI,MAAM,KAAK,EAAE,EAAE;EACnB,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,EAAE,KAAK;EACvC,KAAK,IAAI,EAAE,IAAI,EAAE,GAAG;EACpB,MAAM,IAAI,EAAE,IAAI,EAAE,IAAI;CACxB;CACA,OAAO;EAAE;EAAS;EAAW;EAAM;CAAM;AAC3C;;;;;;AAOA,SAAgB,gBAAgB,UAAoB,QAA4C,QAAgC;CAC9H,KAAK,MAAM,MAAM,QAAQ;EACvB,IAAI,CAAC,IACH;EACF,MAAM,OAAO,SAAS,MAAM,IAAI,EAAE;EAClC,MAAM,MAAM,SAAS,KAAK,IAAI,EAAE;EAChC,IAAI,SAAS,KAAA,KAAa,QAAQ,KAAA,GAChC,OAAO;EACT,MAAM,IAAI,GAAG,sBAAsB;EACnC,IAAI,KAAK,IAAI,EAAE,OAAO,OAAO,OAAO,IAAI,IAAI,MAAO,KAAK,IAAI,EAAE,MAAM,OAAO,MAAM,GAAG,IAAI,IACtF,OAAO;CACX;CACA,OAAO;AACT;;AAGA,SAAS,eAAe,IAAY,IAAY,MAAsC;CACpF,OAAO,KAAK,IAAI;EACd,MAAM,MAAO,KAAK,MAAO;EACzB,IAAI,KAAK,GAAG,GACV,KAAK;OAEL,KAAK,MAAM;CACf;CACA,OAAO;AACT;;;;;;;AAQA,SAAgB,mBAAmB,OAA2B,QAAuB,OAAe,KAAiC;CACnI,IAAI,MAAM,WAAW,GACnB,OAAO,CAAC;CACV,MAAM,OAAO,MAA+C;EAC1D,MAAM,IAAI,MAAM,EAAE,CAAC,sBAAsB;EACzC,OAAO;GAAE,MAAM,EAAE,OAAO,OAAO;GAAM,OAAO,EAAE,QAAQ,OAAO;EAAK;CACpE;CACA,MAAM,QAAQ,IAAI,CAAC;CACnB,MAAM,OAAO,IAAI,MAAM,SAAS,CAAC;CACjC,IAAI,MAAM,SAAS,KAAK,MACtB,OAAO,MAAM,QAAQ,SAAS,MAAM,OAAO,MAAM,QAAQ,CAAC;CAC5D,MAAM,IAAI,MAAM;CAChB,IAAI,KAAK,OAAO,MAAM,MAAM;EAC1B,MAAM,OAAO,eAAe,GAAG,IAAG,MAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK;EAC3D,MAAM,KAAK,eAAe,MAAM,IAAG,MAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG;EAC1D,OAAO,MAAM,MAAM,MAAM,EAAE;CAC7B;CAEA,MAAM,OAAO,eAAe,GAAG,IAAG,MAAK,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG;CACxD,MAAM,KAAK,eAAe,MAAM,IAAG,MAAK,IAAI,CAAC,CAAC,CAAC,SAAS,KAAK;CAC7D,OAAO,MAAM,MAAM,MAAM,EAAE;AAC7B;;;ACpDA,MAAM,gBAAgB;AACtB,MAAM,oBAAoB;AAC1B,MAAM,uBAAuB;AAC7B,MAAM,uBAAuB;AAC7B,MAAM,2BAAW,IAAI,IAAI;CAAC;CAAa;CAAW;CAAa;CAAc;CAAQ;AAAK,CAAC;AAC3F,MAAM,iBAAiB;;;;;;;;AASvB,MAAM,eAAe;AAErB,SAAS,YAAY,GAAW,GAAW,MAA0C;CACnF,OAAO,KAAK,QAAQ,KAAK,KAAK,SAAS,KAClC,KAAK,KAAK,QAAQ,IAAI,KAAK,SAAS,KAAK,KAAK,OAAO,IAAI,KAAK;AACrE;;AAGA,SAAS,eAAe,MAAY,GAAW,GAAoB;CACjE,IAAI,gBAAgB,MAAM;EACxB,IAAI,CAAC,KAAK,aAAa,KAAK,GAC1B,OAAO;EACT,MAAM,QAAQ,SAAS,YAAY;EACnC,MAAM,mBAAmB,IAAI;EAC7B,OAAO,MAAM,KAAK,MAAM,eAAe,CAAC,CAAC,CAAC,MAAK,SAAQ,YAAY,GAAG,GAAG,IAAI,CAAC;CAChF;CACA,IAAI,EAAE,gBAAgB,UACpB,OAAO;CACT,IAAI,KAAK,aAAa,wBAAwB,GAC5C,OAAO;CACT,IAAI,KAAK,aAAa,0BAA0B,GAC9C,OAAO,YAAY,GAAG,GAAG,KAAK,sBAAsB,CAAC;CACvD,IAAI,MAAM,KAAK,KAAK,UAAU,CAAC,CAAC,MAAK,UAAS,eAAe,OAAO,GAAG,CAAC,CAAC,GACvE,OAAO;CAET,OAAO,KAAK,WAAW,WAAW,KAAK,YAAY,GAAG,GAAG,KAAK,sBAAsB,CAAC;AACvF;;AAGA,SAAS,SAAS,GAAkC,GAA+B;CACjF,IAAI,MAAM,KAAA,KAAa,EAAE,WAAW,EAAE,QACpC,OAAO;CACT,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAC5B,IAAI,EAAE,OAAO,EAAE,IACb,OAAO;CAEX,OAAO;AACT;AAEA,SAAS,YAAY,GAAyB,GAAkC;CAC9E,IAAI,EAAE,SAAS,EAAE,MACf,OAAO;CACT,KAAK,MAAM,MAAM,GACf,IAAI,CAAC,EAAE,IAAI,EAAE,GACX,OAAO;CAEX,OAAO;AACT;;AAGA,SAAS,aAAa,MAA4B,MAA4B,MAAoB;CAChG,KAAK,MAAM,MAAM,MACf,IAAI,CAAC,KAAK,IAAI,EAAE,GACd,GAAG,gBAAgB,IAAI;CAE3B,KAAK,MAAM,MAAM,MACf,IAAI,CAAC,KAAK,IAAI,EAAE,GACd,GAAG,aAAa,MAAM,EAAE;AAE9B;;AAGA,MAAM,mBAAmB;CAAC;CAAU;CAAsB;CAAe;CAAY;AAAY;;AAGjG,SAAS,kBAAkB,MAAe,QAAiC;CACzE,IAAI,OAAO,SAAS,aAClB,OAAO,OAAO,WAAW;CAC3B,OAAQ,OAAO,OAAmB,kBAAkB;AACtD;;;;;;;AAQA,SAAS,eAAe,QAAiB,OAA2B,SAAyC;CAC3G,MAAM,eAAe,SAAyC;EAC5D,IAAI,KAAK;EACT,OAAO,MAAM,CAAC,QAAQ,EAAE,GACtB,KAAK,GAAG;EACV,OAAO;CACT;CACA,IAAI,SAAS,YAAY,OAAO,iBAAiB;CACjD,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,SAAS,QAAQ;GACnB,SAAS,YAAY,OAAO,kBAAkB;GAC9C;EACF;EACA,OAAO,aAAa,MAAM,MAAM;CAClC;AACF;AAoBO,IAAM,oBAAN,MAAM,0BAA0B,WAAW;;;EAEb,KAAA,gBAAA;EAGI,KAAA,kBAAA;EAGhB,KAAA,OAAA;EAGd,KAAA,SAAA;EAMmB,KAAA,QAAA,CAAC;EAMX,KAAA,kBAAA;EAMH,KAAA,eAAA;EAOK,KAAA,oBAAA;EAOA,KAAA,oBAAA;EAQJ,KAAA,gBAAA;EAGF,KAAA,cAAA;EAWc,KAAA,WAAA;EAoBX,KAAA,iBAAA;EAmBe,KAAA,UAAA;EAWV,KAAA,sBAAA;EAEmC,KAAA,mCAAA,IAAI,IAAI;EAKrD,KAAA,4BAAA,IAAI,QAAgC;EAEnC,KAAA,6BAAA,IAAI,QAA+B;EAE1B,KAAA,YAAA;EAEL,KAAA,iBAAA;EACI,KAAA,qBAAA;EAeoB,KAAA,mCAAA,IAAI,IAAI;EACT,KAAA,kCAAA,IAAI,IAAI;EAC1B,KAAA,sBAAA;EACL,KAAA,iBAAA;EACG,KAAA,oBAAA;EACT,KAAA,WAAA;EACU,KAAA,qBAAA;EAOJ,KAAA,iCAAA,IAAI,QAAiB;EACG,KAAA,qBAAA,CAAC;EAE5B,KAAA,8BAAA,IAAI,IAAqB;EACA,KAAA,aAAA,CAAC;EAC3B,KAAA,6BAAA,IAAI,IAAyB;EAEnC,KAAA,uBAAA,IAAI,QAAyB;EACzB,KAAA,WAAA;EACG,KAAA,cAAA;EACK,KAAA,mBAAA;EACD,KAAA,kBAAA;EAED,KAAA,iBAAA;EAEA,KAAA,QAAA,IAAI,eAA8B,IAAI;EAEQ,KAAA,YAAA,IAAI,wBAAiC;GAClG,uBAAuB,KAAK,iBAAiB;GAC7C,eAAc,OAAM,KAAK,aAAa,EAAE;GACxC,iBAAiB;IAAE,eAAe,KAAK;IAAe,iBAAiB,KAAK;GAAgB;GAC5F,QAAQ;GACR,cAAa,OAAM,KAAKA,YAAY,IAAI,EAAE,KAAK;GAC/C,2BAA2B,KAAK;GAChC,2BAA0C;IACxC,MAAM,IAAI,KAAK,QAAQ;IACvB,OAAO,IAAI,KAAKA,YAAY,IAAI,CAAC,KAAK,OAAO;GAC/C;GACA,WAAW,UAAU,aAAa;IAChC,KAAK,gBAAgB;IACrB,KAAK,UAA4B,eAAe;KAC9C;KACA;KACA,cAAc,KAAK,UAAU;IAC/B,CAAC;GACH;EACF,CAAC;EAE6C,KAAA,UAAA,IAAI,kBAA2B,MAAM;GACjF,gBAAgB;IACd,MAAM,UAAU,KAAK,iBAAiB;IAEtC,KAAKC,uBAAuB,QAAQ,KAAI,QAAO;KAAE,IAAI;KAAI,SAAS,CAAC,GAAG,aAAa,aAAa;IAAE,EAAE;IACpG,OAAO,KAAKA;GACd;GACA,WAAW,OAAO;IAChB,IAAI,OAAO,KAAA,GACT,KAAK,UAA4B,eAAe,EAAE,MAAM,GAAG,CAAC;GAEhE;GACA,qBAAqB,KAAK,gBAAgB;GAC1C,UAAU,KAAK;GACf,qBAAqB,KAAKC,YAAY,cAAc,KAAKC,YAAY;EACvE,CAAC;EAEiB,KAAA,kBAAA;EACO,KAAA,yBAAA;EACA,KAAA,yBAAA;EAEU,KAAA,6BAAA;GACjC,KAAKC,yBAAyB;EAChC;EAEuB,KAAA,cAAA,IAAI,yBAAkC,MAAM;GACjE,QAAQ;GACR,iBAAiB,KAAK,kBAAkB,KAAK,kBAAkB,UAAU,KAAK,iBAAiB,CAAC,CAAC,SAAS;GAC1G,oBAAoB,WAAW;IAC7B,IAAI,EAAE,kBAAkB,UACtB,OAAO,KAAA;IACT,MAAM,KAAK,OAAO,UAAU,IAAI;IAChC,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,GAC1B,OAAO,KAAA;IACT,OAAO,cAAc,EAAE;GACzB;GACA,mBAAkB,cAAa,KAAKC,mBAAmB,SAAS;GAChE,mBAAmB,CAAC;GACpB,mBAAmB,KAAK;GACxB,oCAAoC,KAAK;GACzC,WAAU,WAAU,KAAK,oBAAoB,0BAA0B,MAAM;GAC7E,iBAAiB,QAAQ,cAAc;IACrC,KAAKC,kBAAkB;IACvB,KAAK,gBAAgB,wBAAwB,MAAM;IACnD,KAAK,MAAM,MAAM,KAAK,iBAAiB,IAAI,GACzC,GAAG,gBAAgB,oBAAoB,UAAU,cAAc,KAAA,KAAa,cAAc,EAAE,MAAM,SAAS;IAC7G,IAAI,QAAQ;KACV,MAAM,QAAQ,KAAK,UAAU,SAAS;KACtC,KAAK,aAAa,cAAc,SAAS,IAAI,oBAAoB,YAAY,MAAM,OAAO;IAC5F,OACE,KAAK,gBAAgB,YAAY;IAEnC,KAAK,cAAc;GACrB;GACA,aAAa;IACX,KAAKA,kBAAkB;IACvB,KAAK,gBAAgB,wBAAwB,KAAK;IAClD,KAAK,gBAAgB,YAAY;IACjC,KAAK,MAAM,MAAM,KAAK,iBAAiB,IAAI,GACzC,GAAG,gBAAgB,kBAAkB;IACvC,KAAKC,4BAA4B;GACnC;GACA,6BAA6B,KAAK,qBAAqB;GACvD,mBAAmB,CAAC,KAAKH;EAC3B,CAAC;EAmDsB,KAAA,cAAA,IAAI,yBAAkC,MAAM;GACjE,kBAAkB,KAAK,WAAW,cAAc,YAAY;GAC5D,iBACE,KAAK,UAAU,cAAc,KAC1B,KAAK,iBAAiB,CAAC,CAAC,SAAS,KACjC,CAAC,KAAK,aAAa,qBAAqB;GAC7C,UAAS,SAAQ,KAAKI,gBAAgB,IAAI;GAC1C,wBAAwB,KAAK,UAAU;GACvC,YAAY,SAAS,SAAS;IAC5B,KAAKC,eAAe;IACpB,KAAK,MAAM,MAAM,KAAK,iBAAiB,GACrC,GAAG,gBAAgB,gBAAgB,QAAQ,IAAI,EAAE,CAAC;IACpD,KAAK,cAAc;GACrB;GACA,WAAW,aAAa;IACtB,KAAK,UAAU,mBAAmB,QAAQ;IAC1C,KAAK,MAAM,MAAM,KAAK,iBAAiB,GACrC,GAAG,gBAAgB,cAAc;IACnC,KAAKA,eAAe,KAAA;IACpB,KAAK,cAAc;GACrB;GACA,aAAa,IAAI,QAAQ;IACvB,IAAI,KAAK,SACP,KAAK,QAAQ,cAAc;GAC/B;GACA,cAAc,UAAU;IACtB,IAAI,KAAKC,iBAAiB,MAAM,aAAa,CAAC,GAC5C,OAAO;IACT,KAAKN,yBAAyB,KAAK,kBAAkB,KAAKO,kBAAkB,KAAK;IACjF,OAAO,CAAC,KAAK,kBAAkB,KAAKP;GACtC;EACF,CAAC;EAiDiB,KAAA,SAAA,IAAI,qBAA8B,MAAM,EACxD,SAAS,+BAA+B,MAAM;GAC5C,cAAc;GACd,WAAU,OAAM,GAAG,aAAa,mBAAmB,KAAK,GAAG,aAAa,KAAK,KAAK;GAClF,cAAc;EAChB,CAAC,EACH,CAAC;EA85C2B,KAAA,sBAAA;GAC1B,IAAI,KAAKQ,uBAAuB,GAC9B;GACF,KAAKA,qBAAqB,4BAA4B;IACpD,KAAKA,qBAAqB;IAC1B,KAAKC,6BAA6B;GACpC,CAAC;EACH;EA4C0B,KAAA,kBAAA,MAA0B;GAClD,MAAM,OAAO,KAAK,cAAc,EAAE,aAAa,CAAC;GAChD,IAAI,MACF,KAAK,QAAQ,mBAAmB,IAAI;EACxC;EAE2B,KAAA,mBAAA,MAA0B;GACnD,KAAK,QAAQ,mBAAmB,CAAC;EACnC;EAGsC,KAAA,wBAAA;GACpC,KAAK,gBAAgB,mBAAmB;EAC1C;EAEsB,KAAA,cAAA,MAA2B;GAC/C,IAAI,KAAK,OAAO,QACd;GACF,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;IAC7C,IAAI,KAAK,UAAU,aAAa,GAAG;KACjC,EAAE,eAAe;KACjB,KAAK,UAAU,UAAU;IAC3B;IACA;GACF;GAIA,IAAI,SAAS,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,aAAa,mBAAmB,GAC/D,KAAK,aAAa,qBAAqB,EAAE;GAE3C,QAAQ,EAAE,KAAV;IACE,KAAK;KACH,EAAE,eAAe;KACjB,KAAKC,cAAc;KAEnB,IAAI,EAAE,YAAY,KAAK,oBAAoB,UAAU;MACnD,MAAM,MAAM,KAAK,QAAQ;MACzB,IAAI,KACF,KAAK,UAAU,QAAQ,GAAG;KAC9B;KACA;IAEF,KAAK;KACH,EAAE,eAAe;KACjB,KAAKC,YAAY;KACjB,IAAI,EAAE,YAAY,KAAK,oBAAoB,UAAU;MACnD,MAAM,MAAM,KAAK,QAAQ;MACzB,IAAI,KACF,KAAK,UAAU,QAAQ,GAAG;KAC9B;KACA;IAEF,KAAK;KACH,EAAE,eAAe;KACjB,KAAKC,eAAe;KACpB;IAEF,KAAK;KACH,EAAE,eAAe;KACjB,KAAKC,cAAc;KACnB;IAEF,KAAK;KACH,EAAE,eAAe;KACjB,KAAKC,YAAY,KAAKC,oBAAoB,CAAC;KAC3C;IAEF,KAAK;KACH,EAAE,eAAe;KACjB,KAAKD,YAAY,KAAKE,mBAAmB,CAAC;KAC1C;IAEF,KAAK,SAAS;KACZ,MAAM,KAAK,KAAK,QAAQ;KACxB,IAAI,IAAI;MACN,EAAE,eAAe;MACjB,KAAK,UAA+B,mBAAmB,EAAE,MAAM,GAAG,CAAC;MACnE,KAAK,cAAc,EAAE;KACvB;KACA;IACF;IACA,KAAK,KAAK;KACR,MAAM,KAAK,KAAK,QAAQ;KACxB,IAAI,IAAI;MACN,EAAE,eAAe;MACjB,KAAK,UAAU,YAAY,EAAE;KAC/B;KACA;IACF;IACA,KAAK,UACH,KAAK,UAAU,MAAM;GAEzB;EACF;EAEoB,KAAA,YAAA,MAAwB;GAC1C,IAAI,KAAKlB,YAAY,cAAc,KAAKC,YAAY,cAAc,KAAKkB,2BAA2B,GAChG;GACF,MAAM,OAAO,EAAE,aAAa;GAC5B,MAAM,SAAS,KAAKX,iBAAiB,IAAI;GACzC,IAAI,QAAQ;IACV,KAAK,YAAY,OAAO,QAAQ,YAAY,EAAE;IAC9C;GACF;GACA,MAAM,OAAO,KAAK,cAAc,IAAI;GACpC,IAAI,CAAC,MACH;GACF,KAAK,MAAM;GACX,KAAK,UAA+B,mBAAmB,EAAE,KAAK,CAAC;GAC/D,KAAK,UAAU,YAAY,MAAM,CAAC;EACpC;EAEuB,KAAA,eAAA,MAAwB;GAC7C,MAAM,OAAO,KAAK,cAAc,EAAE,aAAa,CAAC;GAChD,IAAI,MACF,KAAK,cAAc,IAAI;EAC3B;EAEoB,KAAA,YAAA,MAAwB;GAK1C,EAAE,eAAe;GACjB,MAAM,QAAQ,KAAK,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,EAAE,MAAM,IAAI,EAAE,SAAS,EAAE;GACrE,KAAK,QAAQ,cAAc;EAC7B;;CAl2DA;;CAEA;;CAEA;;CAEA;CACA;;;;;;CAMA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA;CACA;CACA;CACA;;CAEA;CACA;;CAEA;CACA;CACA;;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CAwCA;CACA;CACA;CAEA;CAIA;CAyCA,mBAAmB,WAA4G;EAC7H,MAAM,UAAU,KAAK,iBAAiB;EACtC,MAAM,WAAW,QAAQ,MAAK,OAAM,cAAc,EAAE,MAAM,SAAS;EACnE,IAAI,CAAC,YAAY,CAAC,KAAK,aAAa,QAAQ,GAC1C,OAAO,KAAA;EACT,IAAI,CAAC,KAAK,UAAU,SAAS,IAAI,QAAQ,GACvC,KAAK,UAAU,QAAQ,QAAQ;EACjC,MAAM,WAA0C,CAAC;EACjD,QAAQ,SAAS,IAAI,UAAU;GAC7B,IAAI,CAAC,KAAK,UAAU,SAAS,IAAI,EAAE,GACjC;GACF,MAAM,MAAM,cAAc,EAAE,KAAK;GACjC,SAAS,KAAK;IACZ;IACA;IACA,MAAO,KAAKa,UAAU,IAAI,EAAmB,KAAK;IAClD,SAAS;GACX,CAAC;EACH,CAAC;EACD,MAAM,SAAS,SAAS,MAAK,UAAS,MAAM,QAAQ,SAAS;EAC7D,IAAI,CAAC,QACH,OAAO,KAAA;EACT,OAAO;GAAE;GAAQ;EAAS;CAC5B;CAEA,uBAAqC;EACnC,IAAI,CAAC,KAAK,aACR;EAEF,IAAI,CAAC,KAAK,kBAAkB,CAAC,KAAKC,mBAChC;EACF,KAAKA,oBAAoB,KAAK;EAC9B,KAAK,MAAM,MAAM,KAAK,iBAAiB,IAAI,GACzC,IAAI,cAAc,aAChB,GAAG,YAAY,KAAK,kBAAkB,KAAK,aAAa,EAAE;CAEhE;CAEA,8BAAoC;EAClC,IAAI,KAAKH,wBACP,aAAa,KAAKA,sBAAsB;EAC1C,KAAKA,yBAAyB,OAAO,iBAAiB;GACpD,KAAKA,yBAAyB;EAChC,GAAG,CAAC;CACN;;CAGA;CAEA;;CAkCA,kBAAkB,OAA8B;EAC9C,MAAM,OAAO,MAAM,aAAa;EAChC,MAAM,OAAO,KAAK,cAAc,IAAI;EACpC,IAAI,CAAC,MACH,OAAO;EACT,KAAK,MAAM,QAAQ,MAAM;GACvB,IAAI,SAAS,MACX;GACF,IAAI,gBAAgB,SAAS;IAC3B,IAAI,KAAK,QAAQ,+FAA+F,GAC9G,OAAO;IACT,IAAI,KAAK,aAAa,wBAAwB,GAC5C,OAAO;IACT,IAAI,KAAK,aAAa,0BAA0B,GAC9C,OAAO;GACX;EACF;EACA,OAAO,CAAC,MAAM,KAAK,KAAK,UAAU,CAAC,CAAC,MAAK,SAAQ,eAAe,MAAM,MAAM,SAAS,MAAM,OAAO,CAAC;CACrG;;CAGA,gBAAgB,MAAiC;EAC/C,MAAM,UAAU,KAAK,WAAW,cAAc,YAAY;EAC1D,IAAI,CAAC,SACH,OAAO,CAAC;EACV,MAAM,MAAM,QAAQ,sBAAsB;EAC1C,MAAM,MAAM,KAAK;EACjB,MAAM,MAAM,KAAK;EACjB,MAAM,MAAM,KAAK,IAAI,KAAK;EAC1B,MAAM,MAAM,KAAK,IAAI,KAAK;EAC1B,MAAM,MAAiB,CAAC;EACxB,KAAK,MAAM,MAAM,KAAK,iBAAiB,GAAG;GACxC,MAAM,IAAI,GAAG,sBAAsB;GACnC,MAAM,OAAO,EAAE,OAAO,IAAI;GAC1B,MAAM,MAAM,EAAE,MAAM,IAAI;GACxB,IAAI,QAAQ,OAAO,OAAO,EAAE,SAAS,OAAO,OAAO,OAAO,MAAM,EAAE,UAAU,KAC1E,IAAI,KAAK,EAAE;EACf;EACA,OAAO;CACT;CAEA,cAAc,MAA8B;EAC1C,OAAO,QAAQ,KAAK,EAAE,SAAS,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,KAAK,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE;CAChH;CAWA;CACA;;CAGA,IAAI,WAAiD;EACnD,OAAO,KAAKI;CACd;CAEA,wBAA0C;EACxC,MAAM,MAAM,KAAK,aAAa,KAAK;EACnC,IAAI,QAAQ,KAAA,GACV,OAAO,CAAC,GAAG,iBAAiB;EAC9B,MAAM,YAAY,IAAI,IAAI,IAAI,MAAM,KAAK,CAAC;EAC1C,OAAO,kBAAkB,QAAO,MAAK,UAAU,IAAI,CAAC,CAAC;CACvD;CAEA,sBAA4B;EAC1B,IAAI,CAAC,KAAKA,iBACR;EACF,KAAK,OAAO,SAAS,KAAKC,sBAAsB,CAAC;EACjD,KAAKC,4BAA4B;EACjC,KAAKA,4BAA4B,2BAA2B,KAAKF,iBAAiB,KAAK,MAAM;CAC/F;CAEA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,IAAI,CAAC,KAAK,aAAa,UAAU,GAC/B,KAAK,WAAW;EAClB,KAAK,iBAAiB,eAAe,KAAK,cAAc;EACxD,KAAK,iBAAiB,gBAAgB,KAAK,eAAe;EAC1D,KAAK,iBAAiB,WAAW,KAAK,UAAU;EAChD,KAAK,iBAAiB,eAAe,KAAK,eAAe;EACzD,KAAK,iBAAiB,eAAe,KAAK,eAAe;EACzD,KAAK,iBAAiB,SAAS,KAAK,QAAQ;EAC5C,KAAK,iBAAiB,YAAY,KAAK,WAAW;EAClD,KAAK,iBAAiB,SAAS,KAAK,QAAQ;EAC5C,OAAO,iBAAiB,aAAa,KAAKG,oBAAoB;EAC9D,OAAO,iBAAiB,iBAAiB,KAAKA,oBAAoB;EAElE,KAAKC,kBAAkB,IAAI,qBAAqB,KAAKC,kBAAkB,CAAC;EACxE,KAAKD,gBAAgB,QAAQ,IAAI;EACjC,KAAKE,oBAAoB,IAAI,kBAAkB,YAAY;GACzD,KAAKC,sBAAsB,OAAO;GAClC,KAAKC,uBAAuB,OAAO;GACnC,KAAKH,kBAAkB;GACvB,KAAKI,gBAAgB;EACvB,CAAC;EACD,KAAKH,kBAAkB,QAAQ,MAAM;GACnC,WAAW;GACX,SAAS;GACT,iBAAiB,CAAC,QAAQ;EAC5B,CAAC;EACD,KAAK,MAAM,MAAM,KAAK,iBAAiB,aAAa,GAClD,KAAKI,eAAe,IAAI,EAAE;EAC5B,KAAKC,iBAAiB,IAAI,kBAAkB,YAAY;GACtD,IAAI,QAAQ,MAAK,MAAK,kBAAkB,MAAM,CAAC,CAAC,GAC9C,KAAKC,gBAAgB;EACzB,CAAC;EACD,KAAKD,eAAe,QAAQ,MAAM;GAAE,WAAW;GAAM,SAAS;GAAM,YAAY;GAAM,iBAAiB;EAAiB,CAAC;EACzH,KAAKC,gBAAgB;EACrB,KAAKZ,oBAAoB,sBAAsB;EAC/C,KAAKa,oBAAoB;EACzB,KAAKJ,gBAAgB;CACvB;;;;;;CAOA,uBAAuB,SAAiC;EACtD,IAAI,CAAC,KAAK,aACR;EACF,MAAM,QAAuB,CAAC;EAC9B,KAAK,MAAM,UAAU,SACnB,KAAK,MAAM,QAAQ,OAAO,YAAY;GAGpC,IAAI,EAAE,gBAAgB,gBAAgB,KAAK,kBAAkB,QAAQ,KAAK,cAAc,MACtF;GACF,IAAI,KAAKC,eAAe,IAAI,IAAI,GAC9B;GACF,KAAKA,eAAe,IAAI,IAAI;GAC5B,MAAM,KAAK,IAAI;EACjB;EAEF,IAAI,MAAM,WAAW,GACnB;EACF,MAAM,QAAQ,KAAKI,UAAU,CAAC,CAAC;EAC/B,IAAI,MAAM,UAAU,OAClB;EACF,KAAK,MAAM,MAAM,OACf,kBAAkB,EAAE;EACtB,OAAO,iBAAiB,KAAKT,kBAAkB,GAAA,GAA2B;CAC5E;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAK,oBAAoB,eAAe,KAAK,cAAc;EAC3D,KAAK,oBAAoB,gBAAgB,KAAK,eAAe;EAC7D,KAAK,oBAAoB,WAAW,KAAK,UAAU;EACnD,KAAK,oBAAoB,eAAe,KAAK,eAAe;EAC5D,KAAK,oBAAoB,eAAe,KAAK,eAAe;EAC5D,KAAK,oBAAoB,SAAS,KAAK,QAAQ;EAC/C,KAAK,oBAAoB,YAAY,KAAK,WAAW;EACrD,KAAK,oBAAoB,SAAS,KAAK,QAAQ;EAC/C,OAAO,oBAAoB,aAAa,KAAKF,oBAAoB;EACjE,OAAO,oBAAoB,iBAAiB,KAAKA,oBAAoB;EACrE,KAAKxB,yBAAyB;EAC9B,qBAAqB,KAAKoC,QAAQ;EAClC,qBAAqB,KAAK5B,kBAAkB;EAC5C,KAAKA,qBAAqB;EAC1B,KAAKiB,iBAAiB,WAAW;EACjC,KAAKA,kBAAkB,KAAA;EACvB,KAAKE,mBAAmB,WAAW;EACnC,KAAKA,oBAAoB,KAAA;EACzB,KAAKU,gBAAgB,WAAW;EAChC,KAAKA,iBAAiB,KAAA;EACtB,KAAKL,gBAAgB,WAAW;EAChC,KAAKA,iBAAiB,KAAA;EACtB,KAAKC,gBAAgB;EACrB,KAAKV,4BAA4B;EACjC,KAAKA,4BAA4B,KAAA;EACjC,KAAKF,kBAAkB,KAAA;EACvB,IAAI,KAAKJ,wBAAwB;GAC/B,aAAa,KAAKA,sBAAsB;GACxC,KAAKA,yBAAyB;EAChC;CACF;CAEA,eAA8B;EAC5B,KAAKqB,iBAAiB;EACtB,IAAI,KAAK,iBACP,KAAKC,sBAAsB;EAE7B,KAAKC,mBAAmB;EACxB,KAAKC,4BAA4B;EACjC,KAAK,qBAAqB;CAC5B;CAEA,WAA8B,SAA+B;EAC3D,MAAM,WAAW,OAAO;EACxB,IAAI,QAAQ,IAAI,SAAS,KAAK,KAAK,YAAY;GAC7C,IAAI,KAAK,iBAAiB,OAAO,GAC/B,KAAK,mCAAmB,IAAI,IAAI;GAClC,KAAKC,kBAAkB;EACzB;CACF;CAEA,QAAiB,SAA+B;EAC9C,MAAM,QAAQ,OAAO;EACrB,IAAI,QAAQ,IAAI,SAAS,KAAK,QAAQ,IAAI,YAAY,KAAM,QAAsC,IAAI,kBAAkB,GAAG;GACzH,KAAKZ,gBAAgB;GACrB,IAAI,KAAKY,iBAAiB;IACxB,KAAKA,kBAAkB;IACvB,KAAK,UAAiC,qBAAqB,EAAE,SAAS,KAAK,QAA4C,CAAC;GAC1H;EACF;EACA,IAAI,QAAQ,IAAI,aAAa,GAC3B,KAAKR,oBAAoB;EAE3B,IAAI,QAAQ,IAAI,UAAU,GAAG;GAC3B,KAAKS,qBAAqB,CAAC;GAC3B,KAAKC,iBAAiB;GACtB,KAAK1B,MAAM,WAAW,KAAK;GAC3B,qBAAqB;IACnB,IAAI,KAAK,UACP,KAAKA,MAAM,QAAQ,KAAA,CAAS;GAChC,CAAC;GACD;EACF;EAGA,MAAM,eAAe,QAAQ,IAAI,iBAAiB,KAC7C,QAAQ,IAAI,WAAW,KACvB,QAAQ,IAAI,cAAc,KAC1B,QAAQ,IAAI,mBAAmB,KAC/B,QAAQ,IAAI,mBAAmB,KAC/B,QAAQ,IAAI,eAAe,KAC3B,QAAQ,IAAI,aAAa;EAC9B,KAAK,QAAQ,IAAI,OAAO,KAAK,iBAAiB,KAAK,aAAa,KAAA,KAAa,KAAK,MAAM,SAAS,GAE/F,KAAK2B,oBAAoB,KAAK,OAAO,CAAC,YAAY;EAEpD,KAAKC,kBAAkB;EACvB,IAAI,QAAQ,IAAI,MAAM,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,gBAAgB,GAC9E,KAAKC,WAAW;EAElB,IAAI,QAAQ,IAAI,iBAAiB,GAAG;GAClC,KAAKR,sBAAsB;GAC3B,KAAKb,kBAAkB;GACvB,KAAKI,gBAAgB;EACvB;EACA,IAAI,QAAQ,IAAI,iBAAiB,GAAG;GAClC,KAAK,UAAU,YAAY;GAC3B,KAAKkB,sBAAsB;GAC3B,KAAK,gBAAgB;GACrB,KAAK,qBAAqB;EAC5B,OAAO,IAAI,QAAQ,IAAI,kBAAkB,KAAK,KAAK,oBAAoB,WACrE,KAAK,gBAAgB;EAEvB,IAAI,QAAQ,IAAI,gBAAgB,GAAG;GACjC,KAAK,qBAAqB;GAC1B,KAAKjD,YAAY,iBAAiB;EACpC;CACF;;CAKA,IAAI,eAAoC;EACtC,OAAO,CAAC,GAAG,KAAK,UAAU,QAAQ,CAAC,CAAC,GAAG,EAAE;CAC3C;;CAGA,IAAI,gBAAsC;EACxC,OAAO,KAAK,UAAU;CACxB;;;;;;CAOA,gBAAsB;EACpB,KAAKyC,mBAAmB;EACxB,KAAKC,4BAA4B;CACnC;CAEA,QAAQ,MAAwB,SAAgC;EAC9D,IAAI;EACJ,IAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,KAAK,SAAS,cAAc,IAAI;GACtC,KAAK,UAAU,IAAI,IAAI;GACvB,KAAK;EACP,OACE,KAAK;EAEP,IAAI,SAAS,YACX,GAAG,aAAa,eAAe,EAAE;EACnC,KAAK,YAAY,EAAE;EACnB,KAAKQ,YAAY,EAAmB;EACpC,IAAI,KAAK,SAAS,QAChB,KAAKF,WAAW;EAClB,IAAI,KAAK,oBAAoB,WAC3B,KAAK,gBAAgB;EACvB,KAAKjB,gBAAgB;CACvB;;;;;CAMA,WAAW,MAA8B;EACvC,KAAK,UAAU,SAAS,IAAI;EAC5B,OAAO,mBAAmB,IAAmB,CAAC,CAAC,WAAW;GACxD,KAAK,OAAO;GACZ,KAAKA,gBAAgB;GACrB,IAAI,KAAK,oBAAoB,WAC3B,KAAK,gBAAgB;GACvB,KAAKJ,kBAAkB;EACzB,CAAC;CACH;;CAGA,YAAY,OAAyC;EACnD,OAAO,QAAQ,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,SAAQ,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,KAAA,CAAS;CACxF;CAEA,aAAmB;EACjB,KAAK,gBAAgB;EACrB,KAAKwB,WAAW,MAAM;EACtB,KAAKpB,gBAAgB;EACrB,KAAK,UAAU,MAAM;EACrB,KAAKa,qBAAqB,CAAC;EAC3B,KAAKC,iBAAiB;EACtB,KAAK,gBAAgB;CACvB;;;;;CAMA,SAAS,OAAiC;EACxC,KAAK,WAAW;EAChB,KAAK,MAAM,QAAQ,OAAO;GACxB,KAAK,YAAY,IAAI;GACrB,KAAKK,YAAY,IAAqB;EACxC;EACA,IAAI,KAAK,SAAS,QAChB,KAAKF,WAAW;EAClB,IAAI,KAAK,oBAAoB,WAC3B,KAAK,gBAAgB;EACvB,KAAKjB,gBAAgB;CACvB;;;;;CAMA,YAAY,MAA8B;EACxC,OAAO,KAAKX,UAAU,IAAI,IAAI;CAChC;;;;;;;;;;CAWA,cAAwB;EACtB,MAAM,YAAY,KAAK;EACvB,IAAI,CAAC,WACH,OAAO,CAAC;EAGV,MAAM,QAAQ,UAAU;EACxB,MAAM,MAAM,QAAQ,UAAU,sBAAsB,CAAC,CAAC;EACtD,MAAM,MAAgB,CAAC;EACvB,KAAK,MAAM,MAAM,mBAAmB,KAAK,iBAAiB,GAAG,cAAc,SAAS,GAAG,OAAO,GAAG,GAAG;GAClG,MAAM,MAAM,cAAc,EAAE;GAC5B,IAAI,QAAQ,KAAA,GACV,IAAI,KAAK,GAAG;EAChB;EACA,OAAO;CACT;;;;;;CAOA,SAAS,WAAsB,MAAsC;EACnE,KAAKE,iBAAiB,OAAO,WAAW,IAAI;CAC9C;CAEA,OAAO,MAAqB;EAC1B,KAAK,UAAU,QAAQ,IAAI;CAC7B;CAEA,WAAW,OAAgC;EACzC,KAAK,UAAU,WAAW,KAAK;CACjC;CAEA,SAAS,MAAqB;EAC5B,KAAK,UAAU,SAAS,IAAI;CAC9B;CAEA,iBAAuB;EACrB,KAAK,UAAU,MAAM;CACvB;CAEA,YAAkB;EAChB,IAAI,KAAK,UAAU,aAAa,GAC9B,KAAK,UAAU,UAAU;CAC7B;;CAKA,IAAI,eAAoC;EACtC,OAAO,KAAK,UAAU;CACxB;;CAGA,IAAI,aAAiC;EACnC,MAAM,KAAK,KAAK,QAAQ;EACxB,OAAO,KAAK,cAAc,EAAE,IAAI,KAAA;CAClC;;CAGA,WAAW,MAA8B;EACvC,KAAK,UAAU,WAAW,OAAM,QAAO,KAAK8B,YAAY,GAAG,CAAC;CAC9D;;CAGA,gBAAgB,MAA8B;EAC5C,KAAK,UAAU,QAAQ,OAAM,QAAO,KAAKA,YAAY,GAAG,CAAC;CAC3D;;CAGA,mBAAmB,MAA8B;EAC/C,KAAK,UAAU,WAAW,OAAM,QAAO,KAAKA,YAAY,GAAG,CAAC;CAC9D;;CAGA,SAAS,KAAmB;EAC1B,MAAM,KAAK,KAAKA,YAAY,GAAG;EAC/B,IAAI,CAAC,IACH;EACF,KAAK,QAAQ,MAAM,EAAE;EACrB,GAAG,eAAe;GAAE,OAAO;GAAW,QAAQ;EAAU,CAAC;CAC3D;CAEA,YAAY,KAAkC;EAC5C,IAAI,CAAC,KAAKC,gBAAgB;GACxB,MAAM,wBAAQ,IAAI,IAAqB;GACvC,KAAK,MAAM,MAAM,KAAKjB,UAAU,GAAG;IACjC,MAAM,IAAI,cAAc,EAAE;IAC1B,IAAI,MAAM,KAAA,KAAa,CAAC,MAAM,IAAI,CAAC,GACjC,MAAM,IAAI,GAAG,EAAE;GACnB;GACA,KAAKiB,iBAAiB;EACxB;EACA,OAAO,KAAKA,eAAe,IAAI,GAAG;CACpC;CAEA,CAAE,eAAe,MAA6D;EAC5E,MAAM,UAAU,OAAgB;GAC9B,QAAQ,MAAR;IACE,KAAK,YAAY,OAAO,GAAG,aAAa,eAAe;IACvD,KAAK,WAAW,OAAO,GAAG,aAAa,cAAc;IACrD,KAAK,UAAU,OAAO,GAAG,aAAa,eAAe,KAAK,GAAG,aAAa,cAAc;GAC1F;EACF;EAEA,KAAK,MAAM,MAAM,KAAK,iBAAiB,aAAa,GAAG;GACrD,IAAK,GAAmB,QACtB;GACF,IAAI,OAAO,EAAE,GACX,MAAM;EACV;CACF;CAIA,oBAAoB,OAA2B,YAAY,OAAa;EACtE,MAAM,SAAS,OACb,GAAG,aAAa,UAAU,KAAK,GAAG,aAAa,mBAAmB,KAAK;EACzE,MAAM,eAAe,IAAI,IACvB,CAAC,GAAG,KAAK,UAAU,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,MAAmB,MAAM,IAAI,CAC/E;EACA,MAAM,YAAY,KAAK,UAAU,SAAS,MAAM,KAAK,UAAU,MAAM,IAAI;EAEzE,IAAI,WACF,KAAKC,qBAAqB,KAAK;OAE/B,KAAK,gBAAgB,GAAG,MAAM,KAAK,MAAM,UAAU,KAAKC,cAAc,MAAM,KAAK,CAAC,CAAC;EAGrF,IAAI,aAAa,OAAO,KAAK,cAAc,MAAM;GAC/C,MAAM,OAAkB,CAAC;GACzB,IAAI;GACJ,KAAK,MAAM,MAAM,KAAK,iBAAiB,aAAa,GAAG;IACrD,MAAM,MAAM,MAAM,EAAE;IACpB,IAAI,QAAQ,QAAQ,aAAa,IAAI,GAAG,GACtC,KAAK,KAAK,EAAE;IACd,IAAI,QAAQ,QAAQ,QAAQ,WAC1B,SAAS;GACb;GACA,KAAK,UAAU,KAAK,MAAM,MAAM;EAClC;EAEA,IAAI,KAAK,SAAS,QAChB,KAAKP,WAAW;EAClB,IAAI,KAAK,oBAAoB,WAC3B,KAAK,gBAAgB;EACvB,KAAK,gBAAgB;EACrB,KAAKrB,kBAAkB;EACvB,KAAKI,gBAAgB;CACvB;;;;;;;;CASA,qBAAqB,OAAiC;EACpD,MAAM,2BAAW,IAAI,IAA4B;EACjD,KAAK,MAAM,MAAM,KAAKK,UAAU,GAC9B,IAAI,KAAKhB,UAAU,IAAI,EAAE,KAAK,CAAC,SAAS,IAAI,KAAKA,UAAU,IAAI,EAAE,CAAC,GAChE,SAAS,IAAI,KAAKA,UAAU,IAAI,EAAE,GAAG,EAAE;EAE3C,MAAM,OAAO,MAAM,KAAK,MAAM,UAAU;GACtC,MAAM,KAAK,SAAS,IAAI,IAAI;GAC5B,IAAI,OAAO,CAAC,KAAK,aAAa,KAAKoC,WAAW,IAAI,EAAE,MAAM,QAAQ;IAChE,SAAS,OAAO,IAAI;IACpB,OAAO;GACT;GACA,OAAO,KAAKD,cAAc,MAAM,KAAK;EACvC,CAAC;EACD,MAAM,OAAO,IAAI,IAAa,IAAI;EAClC,KAAK,MAAM,MAAM,KAAKnB,UAAU,GAC9B,IAAI,CAAC,KAAK,IAAI,EAAE,GACd,GAAG,OAAO;EAEd,IAAI,KAAKqB,gBAAgB,GAAG;GAI1B,KAAK,MAAM,MAAM,MACf,KAAKC,KAAK,IAAI,IAAI,KAAKC,UAAU;GACnC,KAAK,OAAO,GAAG,KAAK,QAAO,OAAM,GAAG,kBAAkB,IAAI,CAAC;GAC3D,KAAK5B,gBAAgB;GACrB;EACF;EACA,eAAe,MAAM,OAAM,OAAM,GAAG,cAAc,IAAI;CACxD;CAEA,cAAc,MAAe,OAA8B;EACzD,MAAM,KAAK,SAAS,cAAc,IAAI;EACtC,KAAKX,UAAU,IAAI,IAAI,IAAI;EAC3B,KAAKoC,WAAW,IAAI,IAAI,KAAK;EAE7B,MAAM,UAAU,KAAK,YACjB,KAAK,UAAU,MAAM,KAAK,IACzB,KAAK,kBACF,KAAKI,eAAe,MAAM,KAAK,eAAe,IAC9C;EACR,MAAM,YAAY,KAAKC,YAAY,MAAM,KAAK,iBAAiB;EAC/D,MAAM,YAAY,KAAKA,YAAY,MAAM,KAAK,iBAAiB;EAC/D,IAAI,cAAc,KAAA,GAChB,GAAG,aAAa,mBAAmB,SAAS;EAC9C,IAAI,OAAO,YAAY,UAAU;GAC/B,MAAM,OAAO,KAAK,UAAU,IAAI,OAAO;GACvC,IAAI,cAAc,KAAA,GAChB,KAAK,MAAM,QAAQ;GACrB,IAAI,KAAK,cAAc;IACrB,MAAM,OAAO,KAAKD,eAAe,MAAM,KAAK,YAAY;IACxD,IAAI,OAAO,SAAS,YAAY,KAAK,SAAS,GAC5C,GAAG,aAAa,aAAa,IAAI;GACrC;EACF,OAAO,IAAI,mBAAmB,MAAM;GAClC,GAAG,YAAY,OAAO;GACtB,IAAI,cAAc,KAAA,GAChB,GAAG,MAAM,QAAQ;EACrB;EAEA,IAAI,KAAK,aAAa;GACpB,MAAM,MAAM,KAAKA,eAAe,MAAM,KAAK,WAAW;GACtD,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAC/B,GAAG,aAAa,YAAY,OAAO,GAAG,CAAC;EAC3C;EACA,KAAKV,YAAY,EAAE;EACnB,KAAKY,aAAa,IAAI,KAAKF,eAAe,MAAM,KAAK,aAAa,CAAC;EACnE,OAAO;CACT;CAEA,eAAe,MAAe,MAAuB;EACnD,IAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,EAAE,QAAQ,OACzD,OAAO,KAAA;EACT,OAAQ,KAAiC;CAC3C;;CAGA,YAAY,MAAe,MAAkC;EAC3D,OAAO,OAAO,gBAAgB,KAAKA,eAAe,MAAM,IAAI,CAAC,IAAI,KAAA;CACnE;CAIA,oBAA0B;EACxB,IAAI,KAAK,aAAa,KAAA,GACpB;EACF,MAAM,QAAQ,KAAKzC,MAAM;EACzB,IAAI,UAAU,KAAKyB,oBACjB;EAIF,IAAI,SAAS;EACb,OACE,SAAS,KAAKA,mBAAmB,UAC9B,SAAS,MAAM,UACf,KAAKA,mBAAmB,YAAY,MAAM,SAE7C;EAGF,IAAI,WAAW,KAAKA,mBAAmB,UAAU,UAAU,MAAM,QAAQ;GACvE,MAAM,OAAO,MAAM,MAAM,MAAM;GAC/B,KAAK,MAAM,QAAQ,MACjB,KAAK,YAAY,KAAKW,cAAc,MAAM,KAAKV,gBAAgB,CAAC;GAElE,IAAI,KAAK,SAAS,QAAQ;IAGxB,qBAAqB,KAAKR,QAAQ;IAClC,KAAKA,WAAW,4BAA4B,KAAKW,WAAW,CAAC;GAC/D;GACA,IAAI,KAAK,oBAAoB,WAC3B,KAAK,gBAAgB;GACvB,KAAK,gBAAgB;GACrB,KAAKrB,kBAAkB;GACvB,KAAKI,gBAAgB;EACvB,OAAO;GACL,KAAKc,iBAAiB;GACtB,KAAKC,oBAAoB,KAAK;EAChC;EACA,KAAKF,qBAAqB;CAC5B;CAIA,wBAA8B;EAC5B,IAAI,CAAC,KAAK,iBAAiB;GACzB,KAAK,MAAM,MAAM,KAAK,iBAAiB,aAAa,GAClD,GAAG,gBAAgB,QAAQ;GAE7B;EACF;EACA,KAAK,MAAM,MAAM,KAAK,iBAAiB,aAAa,GAClD,IAAI,KAAK,gBAAgB,EAAE,GACzB,GAAG,gBAAgB,QAAQ;OAE3B,GAAG,aAAa,UAAU,EAAE;CAGlC;CAIA,aAAmB;EACjB,IAAI,KAAK,SAAS,QAChB;EACF,MAAM,OAAO,CAAC,GAAG,KAAK,iBAAiB,aAAa,CAAC;EACrD,IAAI,KAAK,SAAS,GAChB;EAEF,IAAI,KAAKa,gBAAgB,GAAG;GAC1B,KAAK1B,gBAAgB;GACrB;EACF;EACA,eAAe,MAAM,KAAKgC,UAAU,IAAI,IAAG,OAAM,GAAG,cAAc,IAAI;EACtE,KAAKpC,kBAAkB;EACvB,KAAKI,gBAAgB;CACvB;;CAGA,UAAU,MAAwC;EAChD,MAAM,MAAM,KAAK,SAAS,eAAe,KAAK;EAE9C,MAAM,QAAQ,KAAK,KAAK,QAAwB;GAC9C,SAAS;GACT,MAAM,KAAK,YAAY,EAAE;GACzB,OAAO,GAAG,aAAa,mBAAmB,KAAK,GAAG,aAAa,KAAK,KAAK;EAC3E,EAAE;EACF,MAAM,WAAW,IAAI,KAAK,SAAS,KAAA,GAAW,EAAE,SAAS,KAAK,CAAC;EAE/D,IAAI;EACJ,IAAI,KAAK,gBAAgB;GACvB,MAAM,OAAO,KAAK;GAClB,OAAO,GAAG,MAAM,KAAK,MAAM,IAAI,MAAM,EAAE;EACzC,OAAO,IAAI,KAAK,QAAQ;GACtB,MAAM,OAAO,KAAK;GAClB,MAAM,OAAO,MAAM,KAAK,MAAuB;IAC7C,MAAM,IAAI,KAAK6B,eAAe,EAAE,MAAM,IAAI;IAC1C,IAAI,OAAO,MAAM,UACf,OAAO;IACT,OAAO,MAAM,KAAA,KAAa,MAAM,OAAO,KAAK,OAAO,CAAC;GACtD,CAAC;GACD,OAAO,GAAG,MAAM;IACd,MAAM,KAAK,KAAK;IAChB,MAAM,KAAK,KAAK;IAChB,IAAI,OAAO,OAAO,YAAY,OAAO,OAAO,UAC1C,OAAO,KAAK;IACd,OAAO,SAAS,QAAQ,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;GAChD;EACF,OACE,OAAO,GAAG,MAAM,SAAS,QAAQ,MAAM,EAAE,CAAC,OAAO,MAAM,EAAE,CAAC,KAAK;EAGjE,MAAM,QAAQ,KAAK,KAAK,GAAG,MAAM,CAAC;EAClC,MAAM,MAAM,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC;EAC7C,OAAO,MAAM,KAAI,MAAK,KAAK,EAAE;CAC/B;CAIA,kBAA2B;EACzB,OAAO,KAAK,YAAY,QAAQ,KAAK,YAAY,KAAA,KAAa,KAAK,YAAY;CACjF;;CAGA,kBAAwB;EACtB,IAAI,KAAKI,oBAAqB,CAAC,KAAKP,gBAAgB,KAAK,CAAC,KAAKQ,aAC7D;EACF,KAAKD,mBAAmB;EACxB,qBAAqB;GACnB,KAAKA,mBAAmB;GACxB,KAAKE,YAAY;EACnB,CAAC;CACH;CAEA,YAAY,IAAa,MAAuB;EAC9C,OAAO,KAAKN,eAAe,KAAK,YAAY,EAAmB,GAAG,IAAI,KAAK,GAAG,aAAa,QAAQ,MAAM;CAC3G;CAEA,YAAY,IAAqB;EAC/B,MAAM,KAAK,KAAK;EAChB,IAAI,OAAO,OAAO,UAChB,OAAO,WAAW,KAAKO,YAAY,IAAI,EAAE,CAAC;EAC5C,OAAO,WAAW,GAAG,KAAK,YAAY,EAAmB,GAAG,EAAE,CAAC;CACjE;CAEA,eAAe,IAAsB;EACnC,OAAO,CAAE,GAAmB,WAAW,CAAC,KAAK,mBAAmB,KAAK,gBAAgB,EAAE;CACzF;CAEA,WAAW,KAA0B;EACnC,IAAI,SAAS,KAAKhB,WAAW,IAAI,GAAG;EACpC,IAAI,CAAC,QAAQ;GACX,SAAS,SAAS,cAAc,wBAAwB;GACxD,OAAO,aAAa,mBAAmB,EAAE;GACzC,OAAO,QAAQ,WAAW;GAC1B,KAAKA,WAAW,IAAI,KAAK,MAAM;EACjC;EACA,OAAO;CACT;;;;;;;CAQA,cAAoB;EAClB,MAAM,SAAS,KAAKM,gBAAgB;EACpC,IAAI,CAAC,UAAU,CAAC,KAAKQ,aACnB;EACF,MAAM,QAAQ,KAAK7B,UAAU;EAC7B,KAAK,MAAM,MAAM,OACf,IAAI,CAAC,KAAKsB,KAAK,IAAI,EAAE,GACnB,KAAKA,KAAK,IAAI,IAAI,KAAKC,UAAU;EAErC,IAAI,UAAU,MAAM,UAAU,GAAG,MAAM,KAAKD,KAAK,IAAI,CAAC,IAAK,KAAKA,KAAK,IAAI,CAAC,CAAE;EAC5E,IAAI,KAAK,SAAS,UAAU,QAAQ,SAAS,GAC3C,UAAU,KAAKK,UAAU,OAAO;EAElC,MAAM,QAAmB,CAAC;EAC1B,MAAM,OAAwB,CAAC;EAC/B,MAAM,wBAAQ,IAAI,IAAqB;EACvC,MAAM,8BAAc,IAAI,IAAY;EACpC,IAAI,QAAQ;GACV,MAAM,QAAQ,KAAK;GACnB,MAAM,QAAQ,iBACZ,UACA,OAAM,KAAKK,YAAY,EAAE,GACzB,SAAS,KAAK,QAAQ,MAAM,KAAM,IAAkB,KAAI,OAAM,KAAK,YAAY,EAAmB,KAAK,EAAE,CAAC,IAAI,KAAA,CAChH;GACA,KAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,QAAQ,KAAK,MAAM,QAAO,OAAM,KAAKC,eAAe,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,YAAY,QAAQ,KAAK,KAAK,iBAAiB,IAAI,KAAK,GAAG;IACjE,IAAI,QAAQ,GAAG;KACb,MAAM,SAAS,KAAKC,WAAW,KAAK,GAAG;KACvC,OAAO,QAAQ,KAAK;KACpB,OAAO,QAAQ;KACf,OAAO,YAAY;KACnB,YAAY,IAAI,KAAK,GAAG;KACxB,MAAM,KAAK,MAAM;KACjB,KAAK,KAAK;MAAE,KAAK,KAAK;MAAK,OAAO,KAAK;MAAO;MAAO,WAAW,KAAK,iBAAiB,IAAI,KAAK,GAAG;KAAE,CAAC;IACvG;IACA,KAAK,MAAM,MAAM,KAAK,OAAO;KAC3B,MAAM,IAAI,IAAI,KAAK,GAAG;KACtB,GAAG,gBAAgB,sBAAsB,SAAS;KAClD,MAAM,KAAK,EAAE;IACf;GACF;EACF,OAAO;GACL,KAAK,MAAM,MAAM,SACf,GAAG,gBAAgB,oBAAoB;GACzC,MAAM,KAAK,GAAG,OAAO;EACvB;EACA,KAAK,MAAM,CAAC,KAAK,WAAW,KAAKnB,YAC/B,IAAI,CAAC,YAAY,IAAI,GAAG,GAAG;GACzB,OAAO,OAAO;GACd,KAAKA,WAAW,OAAO,GAAG;EAC5B;EAEF,KAAKtD,cAAc;EACnB,KAAK0E,aAAa;EAClB,KAAKN,cAAc;EAGnB,eAAe,MAAM,QAAO,MAAK,EAAE,cAAc,QAAQ,EAAE,aAAa,iBAAiB,CAAC;EAG1F,IADe,KAAK,QAAQ,WAChB,aAAa,oBAAoB,GAC3C,KAAK,QAAQ,MAAM,KAAA,CAAS;EAC9B,KAAKO,mBAAmB,MAAM;EAC9B,KAAK7C,kBAAkB;CACzB;;CAGA,mBAAmB,QAAuB;EACxC,IAAI,CAAC,QAAQ;GACX,KAAKW,gBAAgB,WAAW;GAChC,KAAKA,iBAAiB,KAAA;GACtB;EACF;EACA,IAAI,KAAKA,kBAAkB,CAAC,KAAK,aAC/B;EACF,KAAKA,iBAAiB,IAAI,uBAAuB,KAAKP,gBAAgB,CAAC;EACvE,KAAKO,eAAe,QAAQ,MAAM;GAAE,SAAS;GAAM,YAAY;GAAM,iBAAiB,CAAC,QAAQ;EAAE,CAAC;CACpG;;CAGA,IAAI,SAAmC;EACrC,OAAO,KAAKiC;CACd;;CAGA,kBAAkB,UAAkB,WAA0B;EAC5D,IAAI,KAAK,iBAAiB,IAAI,QAAQ,MAAM,WAC1C;EACF,MAAM,OAAO,IAAI,IAAI,KAAK,gBAAgB;EAC1C,IAAI,WACF,KAAK,IAAI,QAAQ;OAEjB,KAAK,OAAO,QAAQ;EACtB,KAAK,mBAAmB;EACxB,KAAK,UAAiC,qBAAqB;GAAE;GAAU;EAAU,CAAC;CACpF;CAEA,YAAY,UAAwB;EAClC,KAAK,kBAAkB,UAAU,CAAC,KAAK,iBAAiB,IAAI,QAAQ,CAAC;CACvE;CAEA,oBAA0B;EACxB,KAAK,MAAM,KAAK,KAAKA,YACnB,KAAK,kBAAkB,EAAE,KAAK,IAAI;CACtC;CAEA,kBAAwB;EACtB,KAAK,MAAM,OAAO,CAAC,GAAG,KAAK,gBAAgB,GACzC,KAAK,kBAAkB,KAAK,KAAK;CACrC;CAEA,iBAAiB,MAA8C;EAC7D,KAAK,MAAM,UAAU,MAAM;GACzB,IAAI,WAAW,MACb;GACF,IAAI,kBAAkB,eAAe,OAAO,kBAAkB,QAAQ,OAAO,aAAa,iBAAiB,GACzG,OAAO;EACX;CAEF;;;;;;;CAUA,oBAA0B;EACxB,KAAKE,iBAAiB;EACtB,IAAI,KAAKC,oBACP;EACF,KAAKA,qBAAqB;EAC1B,4BAA4B;GAC1B,KAAKA,qBAAqB;GAC1B,KAAKhE,6BAA6B;EACpC,CAAC;CACH;;CAGA,qBAA2B;EACzB,KAAK+D,iBAAiB;EACtB,KAAKE,YAAY,KAAK,eAAe,KAAK,UACtC,gBAAgB,KAAK,iBAAiB,GAAG,cAAc,KAAK,OAAO,CAAC,IACpE;CACN;;;;;;CAOA,kBAA4B;EAC1B,MAAM,UAAU,KAAK,iBAAiB;EACtC,IAAI,KAAKF,kBAAkB,CAAC,KAAK,SAAS;GACxC,KAAKhC,mBAAmB;GACxB,OAAO,KAAKkC;EACd;EACA,MAAM,SAAS,KAAK,QAAQ;EAC5B,MAAM,SAAS;GAAC,QAAQ;GAAI,UAAU,KAAKA,UAAU,UAAU,IAAI,MAAM,IAAI,SAAS,KAAA;GAAW,QAAQ,GAAG,EAAE;EAAC;EAC/G,IAAI,CAAC,gBAAgB,KAAKA,WAAW,QAAQ,cAAc,KAAK,OAAO,CAAC,GACtE,KAAKlC,mBAAmB;EAC1B,OAAO,KAAKkC;CACd;CAEA,YAAY,IAAuC;EACjD,IAAI,MAAM,KAAKA,UAAU,UAAU,IAAI,EAAE;EACzC,IAAI,QAAQ,KAAA,GAAW;GACrB,KAAKlC,mBAAmB;GACxB,MAAM,KAAKkC,UAAU,UAAU,IAAI,EAAE;EACvC;EACA,OAAO;CACT;CAEA,QAAQ,KAA6C;EACnD,OAAO,KAAKA,UAAU,QAAQ,IAAI,EAAE;CACtC;CAEA,QAAQ,KAAa,KAAkC;EACrD,OAAO,KAAKC,QAAQ,GAAG,CAAC,GAAG;CAC7B;CAEA,YAA4C;EAC1C,MAAM,EAAE,YAAY,KAAKC,gBAAgB;EACzC,OAAO;GAAE,MAAM,QAAQ;GAAQ,MAAM,KAAK,IAAI,GAAG,GAAG,QAAQ,KAAI,MAAK,EAAE,MAAM,MAAM,CAAC;EAAE;CACxF;CAIA,YAAY,QAAmC;EAC7C,IAAI,CAAC,QACH;EACF,KAAK,QAAQ,yBAAyB,MAAM;EAC5C,KAAK,QAAQ,WAAW,eAAe;GAAE,OAAO;GAAW,QAAQ;EAAU,CAAC;CAChF;CAEA,mBAAmB,SAAiB,SAAiB,UAAkB,UAAuC;EAC5G,MAAM,EAAE,SAAS,KAAKC,UAAU;EAEhC,MAAM,gBADe,KAAK,iBACO,CAAC,CAAC,SAAS;EAM5C,IAAI,MAAM,aAAa,IAAI,UAAU,WAAW;EAChD,IAAI,MAAM,aAAa,IAAI,UAAU,WAAW;EAGhD,IAAI,iBAAiB;EAErB,KAAK,IAAI,aAAa,GAAG,aAAa,eAAe,cAAc;GAEjE,MAAM,YAAY,KAAKF,QAAQ,GAAG,CAAC,EAAE,UAAU;GAE/C,IAAI,MAAM,KAAK,OAAO,WAAW;IAE/B,IAAI,aAAa,KAAK,gBAAgB;KAEpC,IAAI,KAAK,aAAa,QAAQ;MAE5B,IAAI,WAAW,GACb,MAAM,OAAO;WACR,IAAI,WAAW,GACpB,MAAM;MAER,iBAAiB;KACnB,OACE;IAEJ;IAGA,IAAI,WAAW,GAAG;KAEhB,IAAI,MAAM,IAAI,MAAM;MAClB,MAAM,MAAM;MACZ,MAAM;MACN,iBAAiB;KACnB,OAAO,IAAI,KAAK,aAAa,QAAQ;MACnC,MAAM;MACN,MAAM;MACN,iBAAiB;KACnB,OACE;IAEJ,OAAO,IAAI,WAAW,GAAG;KAEvB,IAAI,MAAM,KAAK,GAAG;MAChB,MAAM,MAAM;MACZ,OAAO,KAAKA,QAAQ,GAAG,CAAC,EAAE,UAAU,KAAK;MACzC,iBAAiB;KACnB,OAAO,IAAI,KAAK,aAAa,QAAQ;MACnC,MAAM,OAAO;MACb,OAAO,KAAKA,QAAQ,GAAG,CAAC,EAAE,UAAU,KAAK;MACzC,iBAAiB;KACnB,OACE;IAEJ,OAAO,IAAI,aAAa,GAAG;KAEzB,MAAM,kBAAkB,KAAKA,QAAQ,GAAG,CAAC,EAAE,UAAU;KACrD,IAAI,OAAO,mBAAmB,kBAAkB,GAC9C,MAAM,kBAAkB;IAE5B;IAGA,IAAI,QAAQ,WAAW,QAAQ,UAAU,UACvC;IAEF;GACF;GAEA,MAAM,OAAO,KAAKG,QAAQ,KAAK,GAAG;GAClC,IAAI,QAAQ,KAAK,aAAa,IAAI,GAChC,OAAO;GAIT,OAAO;EACT;CAGF;CAEA,sBAA2C;EAEzC,OADqB,KAAK,iBACR,CAAC,CAAC,MAAK,SAAQ,KAAK,aAAa,IAAI,CAAC;CAC1D;CAEA,qBAA0C;EACxC,MAAM,eAAe,KAAK,iBAAiB;EAC3C,KAAK,IAAI,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAC5C,IAAI,KAAK,aAAa,aAAa,EAAE,GACnC,OAAO,aAAa;CAI1B;CAEA,gBAAsB;EACpB,KAAKF,gBAAgB;EACrB,MAAM,MAAM,KAAK,QAAQ,YAAY,KAAKG,YAAY,KAAK,QAAQ,SAAS,IAAI,KAAA;EAChF,IAAI,CAAC,KAAK;GACR,KAAKjE,YAAY,KAAKC,oBAAoB,CAAC;GAC3C;EACF;EACA,MAAM,OAAO,KAAKiE,mBAAmB,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC;EAC3D,IAAI,MACF,KAAKlE,YAAY,IAAI;CAEzB;CAEA,cAAoB;EAClB,KAAK8D,gBAAgB;EACrB,MAAM,MAAM,KAAK,QAAQ,YAAY,KAAKG,YAAY,KAAK,QAAQ,SAAS,IAAI,KAAA;EAChF,IAAI,CAAC,KAAK;GACR,KAAKjE,YAAY,KAAKE,mBAAmB,CAAC;GAC1C;EACF;EACA,MAAM,OAAO,KAAKgE,mBAAmB,IAAI,KAAK,IAAI,KAAK,GAAG,EAAE;EAC5D,IAAI,MACF,KAAKlE,YAAY,IAAI;CAEzB;;;;;;;CAQA,kBAAkB,MAAoB,KAAkC;EACtE,IAAI,KAAKwD,WAAW,WAAW,GAC7B,OAAO,KAAKU,mBAAmB,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC;EAC3D,MAAM,SAAS,KAAKL,QAAQ,KAAK,MAAM,GAAG;EAC1C,MAAM,UAAU,KAAK,QAAQ;EAC7B,MAAM,MAAM,UAAU,KAAKD,UAAU,KAAK,IAAI,OAAO,IAAI,KAAA;EACzD,IAAI,CAAC,UAAU,QAAQ,KAAA,GACrB,OAAO,KAAA;EACT,IAAI;EACJ,IAAI,YAAY,OAAO;EACvB,KAAK,MAAM,MAAM,QAAQ;GACvB,IAAI,CAAC,KAAK,aAAa,EAAE,GACvB;GACF,MAAM,QAAQ,KAAK,KAAK,KAAKA,UAAU,KAAK,IAAI,EAAE,KAAK,OAAO,qBAAqB,GAAG;GACtF,IAAI,QAAQ,WAAW;IACrB,OAAO;IACP,YAAY;GACd;EACF;EACA,OAAO;CACT;CAEA,iBAAuB;EACrB,KAAKE,gBAAgB;EACrB,MAAM,MAAM,KAAK,QAAQ,YAAY,KAAKG,YAAY,KAAK,QAAQ,SAAS,IAAI,KAAA;EAChF,IAAI,CAAC,KAAK;GACR,KAAKjE,YAAY,KAAKC,oBAAoB,CAAC;GAC3C;EACF;EACA,MAAM,OAAO,KAAKkE,kBAAkB,KAAK,CAAC;EAC1C,IAAI,MACF,KAAKnE,YAAY,IAAI;OAChB,IAAI,KAAK,aAAa,QAC3B,KAAKA,YAAY,KAAKC,oBAAoB,CAAC;CAE/C;CAEA,gBAAsB;EACpB,KAAK6D,gBAAgB;EACrB,MAAM,MAAM,KAAK,QAAQ,YAAY,KAAKG,YAAY,KAAK,QAAQ,SAAS,IAAI,KAAA;EAChF,IAAI,CAAC,KAAK;GACR,KAAKjE,YAAY,KAAKC,oBAAoB,CAAC;GAC3C;EACF;EACA,MAAM,OAAO,KAAKkE,kBAAkB,KAAK,EAAE;EAC3C,IAAI,MACF,KAAKnE,YAAY,IAAI;OAChB,IAAI,KAAK,aAAa,QAC3B,KAAKA,YAAY,KAAKE,mBAAmB,CAAC;CAE9C;;;;;CAQA,mBAA+C;EAC7C,KAAKkE,oBAAoB;EACzB,IAAI,KAAKC,2BAA2B,KAAK,iBAAiB;GACxD,KAAKC,mBAAmB;GACxB,KAAKD,yBAAyB,KAAK;EACrC;EACA,KAAKE,kBAAkB,KAAKlD,UAAU,CAAC,CAAC,QAAQ,OAAO;GACrD,IAAI,GAAG,QACL,OAAO;GACT,IAAI,GAAG,aAAa,oBAAoB,GACtC,OAAO;GACT,IAAI,KAAK,mBAAmB,CAAC,KAAK,gBAAgB,EAAE,GAClD,OAAO;GACT,OAAO;EACT,CAAC;EACD,OAAO,KAAKkD;CACd;;CAGA,YAAsC;EACpC,KAAKH,oBAAoB;EACzB,KAAKI,mBAAmB,CAAC,GAAG,KAAK,iBAAgC,aAAa,CAAC;EAC/E,OAAO,KAAKA;CACd;;CAGA,sBAA4B;EAC1B,IAAI,CAAC,KAAKtD,gBAAgB;GAExB,KAAKC,gBAAgB;GACrB;EACF;EACA,IAAI,KAAKD,eAAe,YAAY,CAAC,CAAC,MAAK,MAAK,kBAAkB,MAAM,CAAC,CAAC,GACxE,KAAKC,gBAAgB;CACzB;CAEA,kBAAwB;EACtB,KAAKqD,iBAAiB,KAAA;EACtB,KAAKlC,iBAAiB,KAAA;EACtB,KAAKJ,sBAAsB;EAC3B,KAAKoC,mBAAmB;CAC1B;CAEA,qBAA2B;EACzB,KAAKC,gBAAgB,KAAA;EACrB,KAAKxF,qBAAqB,KAAA;EAC1B,KAAK0F,qBAAqB,KAAA;EAC1B,KAAKf,iBAAiB;CACxB;;;;;;;;;CAUA,MAAM,iBAAkC;EACtC,MAAM,KAAK;EAEX,MAAM,QAAQ,KAAK,iBAAiB;EACpC,IAAI,MAAM,WAAW,GACnB,OAAO;EAET,MAAM,gBAAgB,KAAK,MAAM,iBAAiB,4BAA4B;EAC9E,MAAM,mBAAmB,KAAK,MAAM,oBAAoB,4BAA4B;EACpF,KAAK,MAAM,YAAY,8BAA8B,aAAa;EAGlE,MAAM,QAAQ,KAAK,KAAK,KAAK,IAAI,GAAG,MAAM,KAAI,SAAQ,KAAK,sBAAsB,CAAC,CAAC,KAAK,CAAC,CAAC;EAE1F,IAAI,eACF,KAAK,MAAM,YAAY,8BAA8B,eAAe,gBAAgB;OAEpF,KAAK,MAAM,eAAe,4BAA4B;EAExD,KAAK,MAAM,YAAY,8BAA8B,GAAG,MAAM,GAAG;EACjE,KAAK9C,kBAAkB;EACvB,OAAO;CACT;CAEA,aAAqB,MAAwB;EAC3C,IAAI,KAAK,oBAAoB,WAC3B,OAAO;EACT,OAAO,CAAC,KAAK,aAAa,aAAa;CACzC;;CAGA,UAAkB,IAAmB,OAAgC;EACnE,MAAM,OAAO,SAAS,cAAc,MAAM;EAC1C,KAAK,MAAM,UAAU;EACrB,KAAK,cAAc;EACnB,GAAG,YAAY,IAAI;EACnB,GAAG,aAAa,qBAAqB,KAAK;EAC1C,OAAO;CACT;;;;;CAMA,YAAY,IAAyB;EACnC,MAAM,OAAO,GAAG,aAAa,WAAW;EACxC,IAAI,CAAC,MACH;EACF,IAAI,GAAG,mBAAmB,YAAY,aACpC;EACF,MAAM,OAAO,SAAS,cAAc,WAAW;EAC/C,KAAK,aAAa,QAAQ,IAAI;EAC9B,KAAK,MAAM,kBAAkB;EAC7B,KAAK,MAAM,aAAa;EAExB,MAAM,QAAQ,GAAG,aAAa,iBAAiB;EAC/C,IAAI,OACF,KAAK,MAAM,QAAQ;EACrB,GAAG,QAAQ,IAAI;CACjB;;;;;;CAOA,aAAa,IAAmB,OAAsB;EACpD,IAAI,iBAAiB,KAAK,GACxB;EACF,IAAI,SAAS,GAAG,cAA2B,sBAAsB;EACjE,IAAI,CAAC,QAAQ;GACX,SAAS,SAAS,cAAc,MAAM;GACtC,OAAO,YAAY;GACnB,OAAO,MAAM,UAAU;GACvB,GAAG,YAAY,MAAM;EACvB;EACA,OAAO,gBAAgB;EACvB,IAAI,iBAAiB,MACnB,OAAO,YAAY,KAAK;OAExB,OAAO,OAAO,MAAM;CACxB;;CAGA,mBAAyB;EACvB,KAAK,MAAM,MAAM,KAAKS,UAAU,GAC9B,KAAKc,YAAY,EAAE;CACvB;;CAGA,sBAAsB,SAA0C;EAC9D,KAAK,MAAM,UAAU,SACnB,KAAK,MAAM,QAAQ,OAAO,YACxB,IAAI,gBAAgB,iBAAiB,KAAK,kBAAkB,MAC1D,KAAKA,YAAY,IAAI;CAG7B;;;;;;CAOA,kBAAgC;EAC9B,MAAM,WAAW,KAAK,UAAU;EAChC,MAAM,UAAgC,KAAK,oBAAoB,YAC3D,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,QAAO,OAAM,CAAC,GAAG,aAAa,aAAa,CAAC,CAAC,oBACnE,IAAI,IAAI;EACZ,MAAM,UAAU,KAAK,QAAQ;EAC7B,MAAM,mBAAmB,KAAKD,uBACzB,CAAC,YAAY,KAAKwC,kBAAkB,QAAQ,KAC5C,CAAC,YAAY,KAAKC,iBAAiB,OAAO;EAC/C,IAAI,KAAKzC,qBAAqB;GAC5B,KAAK,MAAM,MAAM,KAAKb,UAAU,GAAG;IACjC,GAAG,gBAAgB,gBAAgB,OAAO,OAAO;IACjD,GAAG,gBAAgB,iBAAiB,SAAS,IAAI,EAAE,CAAC;IACpD,GAAG,gBAAgB,gBAAgB,QAAQ,IAAI,EAAE,CAAC;GACpD;GACA,KAAKa,sBAAsB;EAC7B,OAAO;GACL,IAAI,YAAY,KAAK0C,iBAAiB;IACpC,KAAKA,iBAAiB,gBAAgB,cAAc;IACpD,SAAS,aAAa,gBAAgB,EAAE;GAC1C;GACA,aAAa,KAAKF,kBAAkB,UAAU,eAAe;GAC7D,aAAa,KAAKC,iBAAiB,SAAS,cAAc;EAC5D;EACA,KAAKC,kBAAkB;EACvB,KAAKF,mBAAmB,IAAI,IAAI,QAAQ;EACxC,KAAKC,kBAAkB;EACvB,IAAI,KAAK,QAAQ,cAAc,KAAK,QAAQ,WAC1C,KAAK,QAAQ,YAAY,KAAK,QAAQ;EACxC,IAAI,kBACF,KAAK,gBAAgB;CACzB;CAEA,kBAAgC;EAC9B,MAAM,gBAAgB,KAAK,oBAAoB;EAC/C,MAAM,cAAc,OAAO,KAAK,qBAAqB;EAErD,IAAI,CAAC,iBAAiB,CAAC,KAAKE,gBAC1B;EACF,KAAKA,iBAAiB;EAEtB,KAAK,MAAM,MAAM,KAAK,iBAA8B,IAAI,GAAG;GACzD,MAAM,WAAW,GAAG,cAA2B,qBAAqB;GACpE,IAAI,CAAC,eAAe;IAClB,IAAI,UACF,SAAS,OAAO;IAClB;GACF;GAEA,IAAI,GAAG,aAAa,aAAa,GAAG;IAClC,IAAI,UACF,SAAS,OAAO;IAClB;GACF;GAEA,MAAM,mBAAmB,UAAU,UAAU,SAAS,2BAA2B,KAAK;GACtF,IAAI,YAAY,qBAAqB,aACnC,SAAS,OAAO;GAElB,IAAI,KAAyB,GAAG,cAA2B,qBAAqB;GAChF,IAAI,CAAC,IAAI;IACP,IAAI,aAAa;KACf,MAAM,OAAO,KAAK;KAClB,MAAM,SAAS,KAAK,UAAU;KAC9B,MAAM,QAAQ,KAAK,SAAS;KAC5B,KAAK,KAAK,sBAAsB,IAAI,QAAQ,KAAK;IACnD,OACE,KAAK,KAAK,0BAA0B,EAAE;IAExC,GAAG,QAAQ,EAAE;GACf;GAEA,MAAM,UAAU,KAAK,UAAU,SAAS,IAAI,EAAE;GAC9C,IAAI,aAAa;IACf,GAAG,aAAa,gBAAgB,OAAO,OAAO,CAAC;IAC/C,GAAG,gBAAgB,gBAAgB,OAAO;IAC1C,IAAI,KAAK,kBAAkB;KACzB,MAAM,WAAW,OAAO,KAAK,qBAAqB,aAC9C,KAAK,mBACJ,KAAK,iBAA2C;KACrD,OAAO,SAAS,OAAO,GAAG,EAAE;IAC9B;GACF,OAAO;IACL,MAAM,QAAQ,GAAG,cAAgC,0BAA0B;IAC3E,IAAI,OACF,MAAM,UAAU;GACpB;EACF;CACF;;;;;;;CAQA,0BAAkC,IAAkC;EAClE,MAAM,OAAO,SAAS,cAAc,MAAM;EAC1C,KAAK,YAAY;EACjB,KAAK,MAAM,UAAU;EACrB,KAAK,WAAW;EAChB,KAAK,aAAa,QAAQ,UAAU;EACpC,KAAK,aAAa,QAAQ,UAAU;EACpC,KAAK,iBAAiB,UAAU,MAAM;GACpC,EAAE,gBAAgB;GAClB,KAAK,UAAU,OAAO,EAAE;EAC1B,CAAC;EACD,MAAM,QAAQ,SAAS,cAAc,OAAO;EAC5C,MAAM,OAAO;EACb,MAAM,YAAY;EAClB,MAAM,MAAM,UAAU;EACtB,KAAK,YAAY,KAAK;EACtB,OAAO;CACT;;CAGA,sBAA8B,IAAiB,QAAgB,OAAgC;EAC7F,MAAM,OAAO,SAAS,cAAc,MAAM;EAC1C,KAAK,YAAY;EACjB,KAAK,MAAM,UAAU,wGAAwG,MAAM,UAAU,OAAO;EACpJ,KAAK,WAAW;EAChB,KAAK,aAAa,QAAQ,UAAU;EACpC,KAAK,aAAa,QAAQ,UAAU;EACpC,KAAK,iBAAiB,UAAU,MAAM;GACpC,EAAE,gBAAgB;GAClB,KAAK,UAAU,OAAO,EAAE;EAC1B,CAAC;EACD,OAAO;CACT;CAEA,cAAsB,MAA0C;EAC9D,KAAK,MAAM,UAAU,MAAM;GACzB,IAAI,EAAE,kBAAkB,UACtB;GACF,IAAI,WAAW,MACb;GACF,IAAI,OAAO,kBAAkB,QAAQ,OAAO,QAAQ,IAAI,GACtD,OAAO;EACX;CAEF;CAEA,UAAqB,MAAuC,QAAiB;EAC3E,KAAK,cAAc,IAAI,YAAe,MAAgB;GACpD;GACA,SAAS;GACT,UAAU;EACZ,CAAC,CAAC;CACJ;CAEA,oBAA+B,MAAc,QAAoB;EAC/D,OAAO,KAAK,cAAc,IAAI,YAAe,MAAM;GACjD;GACA,SAAS;GACT,UAAU;GACV,YAAY;EACd,CAAC,CAAC;CACJ;;CAGA;;CAUA,8BAAoC;EAClC,IAAI,KAAKnF,uBAAuB,GAC9B;EACF,KAAKA,qBAAqB,4BAA4B;GACpD,KAAKA,qBAAqB;GAC1B,KAAKC,6BAA6B;EACpC,CAAC;CACH;;;;;;CAOA,gBAA0B;EACxB,MAAM,UAAU,KAAK,iBAAiB;EAEtC,KAAK8E,uBAAuB,QAAQ,SAAS,OAAO;GAClD,MAAM,MAAM,cAAc,EAAE;GAC5B,OAAO,QAAQ,KAAA,IAAY,CAAC,IAAI,CAAC,GAAG;EACtC,CAAC;EACD,OAAO,KAAKA;CACd;;;;;;CAOA,+BAAqC;EACnC,MAAM,eAAe,KAAKK,cAAc;EACxC,MAAM,cAAc,KAAK,YAAY;EACrC,IAAI,SAAS,KAAKC,2BAA2B,YAAY,KAAK,SAAS,KAAKC,0BAA0B,WAAW,GAC/G;EACF,KAAKD,4BAA4B;EACjC,KAAKC,2BAA2B;EAChC,KAAK,UAAoC,+BAA+B;GAAE;GAAc;EAAY,CAAC;CACvG;CAqIA,cAAsB,MAAqB;EAEzC,IAAI,KAAK,oBAAoB,UAC3B,KAAK,UAAU,QAAQ,IAAI;EAE7B,KAAK,UAA8B,iBAAiB,EAAE,KAAK,CAAC;CAC9D;;EAIyB,KAAA,SAAA;GAAC;GAAgB,iBAAiB,GAAG;GAAG;GAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2KrF;;CAID,SAAkB;EAChB,MAAM,UAAU,KAAK5E,MAAM;EAC3B,MAAM,WAAW,KAAKA,MAAM;EAC5B,OAAO,IAAI;;wDAEyC,KAAK6E,cAAc;;;UAGjE,KAAK1F,eACH,IAAI,6CAA6C,KAAK2F,cAAc,KAAK3F,YAAY,EAAE,WACvF,GAAG;sDACuC,CAAC,QAAQ;YACnD,UACG,aAAa,KAAA,IAAY,GAAG,KAAK,MAAM,WAAW,GAAG,EAAE,KAAK,aAC7D,QAAQ;;UAEZ,KAAK,OAAO,YAAY,EAAE;;;CAGlC;AACF;AA1qEG,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAiB,CAAC,CAAA,GAAA,kBAAA,WAAA,iBAAA,KAAA,CAAA;AAGtD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAmB,CAAC,CAAA,GAAA,kBAAA,WAAA,mBAAA,KAAA,CAAA;AAGxD,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,kBAAA,WAAA,QAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAU,CAAC,CAAA,GAAA,kBAAA,WAAA,UAAA,KAAA,CAAA;AAG/C,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,kBAAA,WAAA,kBAAA,KAAA,CAAA;AAG7B,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,kBAAA,WAAA,SAAA,KAAA,CAAA;AAG7B,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,kBAAA,WAAA,YAAA,KAAA,CAAA;AAG7B,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAmB,CAAC,CAAA,GAAA,kBAAA,WAAA,mBAAA,KAAA,CAAA;AAGxD,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,kBAAA,WAAA,aAAA,KAAA,CAAA;AAG7B,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAgB,CAAC,CAAA,GAAA,kBAAA,WAAA,gBAAA,KAAA,CAAA;AAOrD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAsB,CAAC,CAAA,GAAA,kBAAA,WAAA,qBAAA,KAAA,CAAA;AAO3D,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAsB,CAAC,CAAA,GAAA,kBAAA,WAAA,qBAAA,KAAA,CAAA;AAQ3D,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAiB,CAAC,CAAA,GAAA,kBAAA,WAAA,iBAAA,KAAA,CAAA;AAGtD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAe,CAAC,CAAA,GAAA,kBAAA,WAAA,eAAA,KAAA,CAAA;AAGpD,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,kBAAA,WAAA,mBAAA,KAAA,CAAA;AAQ7B,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAY,CAAC,CAAA,GAAA,kBAAA,WAAA,YAAA,KAAA,CAAA;AAIjD,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,kBAAA,WAAA,oBAAA,KAAA,CAAA;AAQ7B,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAgB,SAAS;AAAK,CAAC,CAAA,GAAA,kBAAA,WAAA,eAAA,KAAA,CAAA;AAQnE,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAmB,SAAS;AAAK,CAAC,CAAA,GAAA,kBAAA,WAAA,kBAAA,KAAA,CAAA;AAOvE,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,kBAAA,WAAA,uBAAA,KAAA,CAAA;AAG7B,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,kBAAA,WAAA,qBAAA,KAAA,CAAA;AAS7B,WAAA,CAAA,SAAS,EAAE,WAAW,WAAW,CAAC,CAAA,GAAA,kBAAA,WAAA,WAAA,KAAA,CAAA;AAIlC,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,kBAAA,WAAA,cAAA,KAAA,CAAA;AAO7B,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAyB,SAAS;AAAK,CAAC,CAAA,GAAA,kBAAA,WAAA,uBAAA,KAAA,CAAA;AAG7E,WAAA,CAAA,MAAM,CAAA,GAAA,kBAAA,WAAA,oBAAA,KAAA,CAAA;AAEN,WAAA,CAAA,MAAM,IAAI,CAAA,GAAA,kBAAA,WAAA,WAAA,KAAA,CAAA;AAxHZ4F,oBAAAA,WAAAA,CAAAA,kBAAc,kBAAkB,CAAA,GAAA,iBAAA"}
@@ -2,10 +2,10 @@ import "./icon-DR_3rSyZ.js";
2
2
  import { r as IDataProvider } from "./data-provider-BAn_-oR1.js";
3
3
  import { F as ListDragPreviewSourceResolver, P as ListDragPreviewRenderer, R as ListNativeDragStartEvent } from "./tree-component-Cj8V3uar.js";
4
4
  import { n as ListViewportChangeEvent } from "./list-viewport-types-BRZsLcvp.js";
5
- import { S as ListSearchController } from "./index-CxZ61DO1.js";
5
+ import { S as ListSearchController } from "./index-Dlah7Zfi.js";
6
6
  import { a as ListGroupEventMap, o as ListGroupInfo, s as ListGroupLabel } from "./grouping-CUKgmkMm.js";
7
7
  import { i as ListInteractionMode, l as ListSelectionMode, r as ListElementEventMap } from "./list-selection-types-PjKdhF-a.js";
8
- import { n as CustomCheckboxOptions, t as AddItemOptions } from "./vertical-list-CqBc-t8w.js";
8
+ import { n as CustomCheckboxOptions, t as AddItemOptions } from "./vertical-list-lj_19DCx.js";
9
9
  import "./list-group-header.js";
10
10
  import { LitElement, PropertyValues } from "lit";
11
11
  import { CommandId, CommandRegistry } from "@clinth/ui-commands";
@@ -201,6 +201,10 @@ declare class DetailListElement extends LitElement {
201
201
  toggleGroup(groupKey: string): void;
202
202
  collapseAllGroups(): void;
203
203
  expandAllGroups(): void;
204
+ /**
205
+ * Visible items in DOM order. Cached — every per-hover / per-frame path
206
+ * reads it — and validated on each call, so it is never stale.
207
+ */
204
208
  private _getVisibleItems;
205
209
  /**
206
210
  * Set the column width to fit the widest visible item.
@@ -214,6 +218,11 @@ declare class DetailListElement extends LitElement {
214
218
  private _isCheckable;
215
219
  /** Appends the caption span; returns it so callers can style it per item. */
216
220
  private _setLabel;
221
+ /**
222
+ * Reflect cursor / selection / checked state onto the items. After the item
223
+ * set changes (or the interaction mode does) every item is visited; otherwise
224
+ * only the items whose state changed are touched, so hovering is O(1).
225
+ */
217
226
  private _syncItemStates;
218
227
  private _syncCheckboxes;
219
228
  /**
@@ -252,4 +261,4 @@ interface DetailListElementEventMap extends ListElementEventMap, ListGroupEventM
252
261
  }
253
262
  //#endregion
254
263
  export { DetailSortComparator as a, DetailGroupBy as i, DetailListElementEventMap as n, DetailSortItem as o, DetailFormatter as r, DetailSortMode as s, DetailListElement as t };
255
- //# sourceMappingURL=detail-list-C1xzr1z7.d.ts.map
264
+ //# sourceMappingURL=detail-list-dX7jLO6b.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detail-list-C1xzr1z7.d.ts","names":[],"sources":["../src/detail-list/types.ts","../src/detail-list/detail-list.ts"],"mappings":";;;;;;;;;;;;;KACY;;KAGA;WACD,SAAS;WACT;WACA;;;KAIC,wBAAwB,GAAG,gBAAgB,GAAG;;KAG9C,mBAAmB,eAAe,2BAA2B;;;;;;KAc7D,2BAA2B,eAAe,IAAI;;;;;;;;;;;;;;;;;;;;cCkI7C,0BAA0B;;EAErC,eAAe;EAGf,iBAAiB;EAGjB,MAAM;EAGN;EAGA,gBAAgB;EAGhB;EAGA,UAAU;EAGV;EAGA,WAAW;EAGX;;;;;EAOA;;;;;EAOA;;;;;;EAQA;EAGA;EAGA,mBAAmB,IAAI;;;;;;EAQvB;;EAIA,oBAAoB,gCAAgC;;;;;;EAQpD;;;;;;EAQA;;;;;EAOA,qBAAqB,wBAAwB;EAG7C,mBAAmB,8BAA8B;;;;;;;EASjD,SAAS;;EAIT,YAAY;;;;;EAOZ;UAEiB;UAGT;mBAiCS;UAqBT;UAyFA;;WAoGC,QAAM,qBAAA;;MAYX,YAAY;EAoBP;EAkEA;EA+BA;YASU,WAAW,SAAS;EAS9B,QAAQ,SAAS;;MA+DtB,gBAAgB;;MAKhB,iBAAiB,YAAY;;;;;;EASjC;EAIA,QAAQ,MAAM,kBAAkB,UAAU;;;;;EAwB1C,WAAW,MAAM,UAAU;;EAY3B,YAAY,OAAO,SAAS,WAAW;EAIvC;;;;;EAcA,SAAS,gBAAgB;;;;;EAiBzB,YAAY,MAAM;;;;;;;;;;EAalB;;;;;;EAsBA,SAAS,WAAW,WAAW,OAAO;EAItC,OAAO,MAAM;EAIb,WAAW,OAAO,SAAS;EAI3B,SAAS,MAAM;EAIf;EAIA;;MAQI,gBAAgB;;MAKhB;;EAMJ,WAAW,MAAM;;EAKjB,gBAAgB,MAAM;;EAKtB,mBAAmB,MAAM;;EAKzB,SAAS;EAgBP,eAAe,0CAA0C,UAAU;;MA8VjE,mBAAmB;;EAKvB,kBAAkB,kBAAkB;EAYpC,YAAY;EAIZ;EAKA;UAwRQ;;;;;;;;;EAoBF,kBAAkB;UAwBhB;;UAOA;UA2DA;UAiBA;;;;;;;UA2DA;;UAoBA;UAcA;UAYA;UAQA;UA6DA;UAMA;;UAKA;UAIA;UA+EA;UAiBA;UAMA;UAUA;SAUQ,sBAAM;EAyKb,wBAAM;;QAsBT;YACI;IACR,oBAAoB;;YAGZ,4BAA4B;;UAGvB,kCAAkC,qBAAqB;EACtE,+BAA+B;EAC/B,0BAA0B,yBAAyB"}
1
+ {"version":3,"file":"detail-list-dX7jLO6b.d.ts","names":[],"sources":["../src/detail-list/types.ts","../src/detail-list/detail-list.ts"],"mappings":";;;;;;;;;;;;;KACY;;KAGA;WACD,SAAS;WACT;WACA;;;KAIC,wBAAwB,GAAG,gBAAgB,GAAG;;KAG9C,mBAAmB,eAAe,2BAA2B;;;;;;KAc7D,2BAA2B,eAAe,IAAI;;;;;;;;;;;;;;;;;;;;cCyL7C,0BAA0B;;EAErC,eAAe;EAGf,iBAAiB;EAGjB,MAAM;EAGN;EAGA,gBAAgB;EAGhB;EAGA,UAAU;EAGV;EAGA,WAAW;EAGX;;;;;EAOA;;;;;EAOA;;;;;;EAQA;EAGA;EAGA,mBAAmB,IAAI;;;;;;EAQvB;;EAIA,oBAAoB,gCAAgC;;;;;;EAQpD;;;;;;EAQA;;;;;EAOA,qBAAqB,wBAAwB;EAG7C,mBAAmB,8BAA8B;;;;;;;EASjD,SAAS;;EAIT,YAAY;;;;;EAOZ;UAEiB;UAGT;mBAsDS;UAqBT;UA2FA;;WAwGC,QAAM,qBAAA;;MAYX,YAAY;EAoBP;EAwEA;EAkCA;YAUU,WAAW,SAAS;EAS9B,QAAQ,SAAS;;MA6DtB,gBAAgB;;MAKhB,iBAAiB,YAAY;;;;;;EASjC;EAKA,QAAQ,MAAM,kBAAkB,UAAU;;;;;EAwB1C,WAAW,MAAM,UAAU;;EAY3B,YAAY,OAAO,SAAS,WAAW;EAIvC;;;;;EAcA,SAAS,gBAAgB;;;;;EAiBzB,YAAY,MAAM;;;;;;;;;;EAalB;;;;;;EAsBA,SAAS,WAAW,WAAW,OAAO;EAItC,OAAO,MAAM;EAIb,WAAW,OAAO,SAAS;EAI3B,SAAS,MAAM;EAIf;EAIA;;MAQI,gBAAgB;;MAKhB;;EAMJ,WAAW,MAAM;;EAKjB,gBAAgB,MAAM;;EAKtB,mBAAmB,MAAM;;EAKzB,SAAS;EAqBP,eAAe,0CAA0C,UAAU;;MAwYjE,mBAAmB;;EAKvB,kBAAkB,kBAAkB;EAYpC,YAAY;EAIZ;EAKA;;;;;UA8RQ;;;;;;;;;EA0DF,kBAAkB;UAwBhB;;UAOA;;;;;;UAyEA;UAiCA;;;;;;;UA+DA;;UAoBA;UAcA;UAYA;UAQA;UA6DA;UAMA;;UAKA;UAIA;UAiFA;UAiBA;UAMA;UAUA;SAUQ,sBAAM;EA+Kb,wBAAM;;QAsBT;YACI;IACR,oBAAoB;;YAGZ,4BAA4B;;UAGvB,kCAAkC,qBAAqB;EACtE,+BAA+B;EAC/B,0BAA0B,yBAAyB"}
@@ -1,6 +1,6 @@
1
1
  import { I as ListDragSource, L as ListNativeDragStartDetail, M as ListDragPreview, N as ListDragPreviewContext, P as ListDragPreviewRenderer, R as ListNativeDragStartEvent, j as ListDragEntry } from "./tree-component-Cj8V3uar.js";
2
2
  import { n as ListViewportChangeEvent, t as ListViewportChangeDetail } from "./list-viewport-types-BRZsLcvp.js";
3
3
  import { i as ListGroupChangeEvent, l as ListGroupToggleDetail, n as ListGroupBy, o as ListGroupInfo, r as ListGroupChangeDetail, s as ListGroupLabel, u as ListGroupToggleEvent } from "./grouping-CUKgmkMm.js";
4
- import { n as CustomCheckboxOptions, t as AddItemOptions } from "./vertical-list-CqBc-t8w.js";
5
- import { a as DetailSortComparator, i as DetailGroupBy, n as DetailListElementEventMap, o as DetailSortItem, r as DetailFormatter, s as DetailSortMode, t as DetailListElement } from "./detail-list-C1xzr1z7.js";
4
+ import { n as CustomCheckboxOptions, t as AddItemOptions } from "./vertical-list-lj_19DCx.js";
5
+ import { a as DetailSortComparator, i as DetailGroupBy, n as DetailListElementEventMap, o as DetailSortItem, r as DetailFormatter, s as DetailSortMode, t as DetailListElement } from "./detail-list-dX7jLO6b.js";
6
6
  export { type AddItemOptions, type CustomCheckboxOptions, type DetailFormatter, type DetailGroupBy, DetailListElement, DetailListElementEventMap, type DetailSortComparator, type DetailSortItem, type DetailSortMode, type ListDragEntry, type ListDragPreview, type ListDragPreviewContext, type ListDragPreviewRenderer, type ListDragSource, type ListGroupBy, type ListGroupChangeDetail, type ListGroupChangeEvent, type ListGroupInfo, type ListGroupLabel, type ListGroupToggleDetail, type ListGroupToggleEvent, type ListNativeDragStartDetail, type ListNativeDragStartEvent, type ListViewportChangeDetail, type ListViewportChangeEvent };