@ixfx/components 0.10.0 → 0.10.2

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 (110) hide show
  1. package/bundle/index.d.ts +233 -21
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +2101 -150
  4. package/bundle/index.js.map +1 -1
  5. package/bundle/style.css +38 -85
  6. package/dist/ac-text.js +1 -1
  7. package/dist/ac-token.js +2 -2
  8. package/dist/{colour-picker-R73i0QTP.js → colour-picker-WDrPuqoO.js} +2 -2
  9. package/dist/{colour-picker-R73i0QTP.js.map → colour-picker-WDrPuqoO.js.map} +1 -1
  10. package/dist/colour-picker.js +1 -1
  11. package/dist/crumbs.d.ts +1 -1
  12. package/dist/crumbs.js +2 -2
  13. package/dist/{data-grid-C5hk_pzK.d.ts → data-grid-pv6eaJCZ.d.ts} +4 -3
  14. package/dist/data-grid-pv6eaJCZ.d.ts.map +1 -0
  15. package/dist/data-grid.d.ts +2 -2
  16. package/dist/data-grid.js +28 -10
  17. package/dist/data-grid.js.map +1 -1
  18. package/dist/defaults-kVl1t2tT.js +59 -0
  19. package/dist/defaults-kVl1t2tT.js.map +1 -0
  20. package/dist/{detail-list-CxPpv89T.d.ts → detail-list-BA3RVVCB.d.ts} +4 -4
  21. package/dist/{detail-list-CxPpv89T.d.ts.map → detail-list-BA3RVVCB.d.ts.map} +1 -1
  22. package/dist/detail-list.d.ts +3 -3
  23. package/dist/detail-list.js +4 -4
  24. package/dist/{grid-list-DSnYOGh7.js → grid-list-CIc4jo-x.js} +34 -7
  25. package/dist/grid-list-CIc4jo-x.js.map +1 -0
  26. package/dist/{grid-list-BGvoWbZz.d.ts → grid-list-DWXJoRnK.d.ts} +4 -4
  27. package/dist/{grid-list-BGvoWbZz.d.ts.map → grid-list-DWXJoRnK.d.ts.map} +1 -1
  28. package/dist/grid-list.d.ts +2 -2
  29. package/dist/grid-list.js +1 -1
  30. package/dist/handle-DAXs7kbJ.js +656 -0
  31. package/dist/handle-DAXs7kbJ.js.map +1 -0
  32. package/dist/{icon-BCJJYEpm.js → icon-1gpwtPx8.js} +10 -1
  33. package/dist/icon-1gpwtPx8.js.map +1 -0
  34. package/dist/icon-CDGprSdE.d.ts.map +1 -1
  35. package/dist/icons.d.ts +1 -1
  36. package/dist/icons.js +2 -2
  37. package/dist/{incr-search-C05WjbZh.js → incr-search-D91M4Ozq.js} +5 -4
  38. package/dist/incr-search-D91M4Ozq.js.map +1 -0
  39. package/dist/incr-search.d.ts +1 -1
  40. package/dist/incr-search.js +1 -1
  41. package/dist/index-9AhaHIT2.d.ts.map +1 -1
  42. package/dist/index-CYndvTWH.d.ts +38 -0
  43. package/dist/index-CYndvTWH.d.ts.map +1 -0
  44. package/dist/{index--5BSdbnL.d.ts → index-CsaQwNkz.d.ts} +3 -2
  45. package/dist/index-CsaQwNkz.d.ts.map +1 -0
  46. package/dist/index.d.ts +207 -11
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +1295 -40
  49. package/dist/index.js.map +1 -1
  50. package/dist/{list-native-drag-controller-D97TYjn1.js → list-native-drag-controller-B9xO0XWn.js} +6 -4
  51. package/dist/list-native-drag-controller-B9xO0XWn.js.map +1 -0
  52. package/dist/{list-native-drag-controller-DWiXQZou.d.ts → list-native-drag-controller-BAuWAtyQ.d.ts} +2 -2
  53. package/dist/{list-native-drag-controller-DWiXQZou.d.ts.map → list-native-drag-controller-BAuWAtyQ.d.ts.map} +1 -1
  54. package/dist/{menu-C8a-84S5.js → menu-B2Qv3Oiz.js} +6 -5
  55. package/dist/menu-B2Qv3Oiz.js.map +1 -0
  56. package/dist/{menu-item-DzizkMH-.js → menu-item-Woc8jJc1.js} +4 -4
  57. package/dist/menu-item-Woc8jJc1.js.map +1 -0
  58. package/dist/menu.js +2 -2
  59. package/dist/miller.d.ts +2 -2
  60. package/dist/miller.js +1 -1
  61. package/dist/narrowed-text.js +1 -1
  62. package/dist/{scroll-fade-CAs1EabA.js → scroll-fade-BrNUIYnm.js} +16 -3
  63. package/dist/scroll-fade-BrNUIYnm.js.map +1 -0
  64. package/dist/select-horiz.js +1 -1
  65. package/dist/{split-layout-3yBOEVZW.js → split-layout-BJEU1W0d.js} +2 -2
  66. package/dist/{split-layout-3yBOEVZW.js.map → split-layout-BJEU1W0d.js.map} +1 -1
  67. package/dist/split-layout.js +1 -1
  68. package/dist/style.css +38 -85
  69. package/dist/tabs.js +1 -1
  70. package/dist/{timeline-CFlBFFGZ.js → timeline-BP1Ux2EV.js} +2 -2
  71. package/dist/{timeline-CFlBFFGZ.js.map → timeline-BP1Ux2EV.js.map} +1 -1
  72. package/dist/timeline.js +1 -1
  73. package/dist/titlebar.js +1 -1
  74. package/dist/{tree-C25xYUa6.js → tree-Bm2TzTfe.js} +234 -15
  75. package/dist/tree-Bm2TzTfe.js.map +1 -0
  76. package/dist/{tree-component-mw8x-n2Y.d.ts → tree-component-DGmKBbpy.d.ts} +14 -1
  77. package/dist/tree-component-DGmKBbpy.d.ts.map +1 -0
  78. package/dist/tree.d.ts +15 -3
  79. package/dist/tree.d.ts.map +1 -1
  80. package/dist/tree.js +1 -1
  81. package/dist/{vertical-list--tFanQwM.d.ts → vertical-list-BWLqy3PJ.d.ts} +3 -3
  82. package/dist/{vertical-list--tFanQwM.d.ts.map → vertical-list-BWLqy3PJ.d.ts.map} +1 -1
  83. package/dist/vertical-list.d.ts +2 -2
  84. package/dist/vertical-list.js +2 -2
  85. package/docs-user/README.md +1 -0
  86. package/docs-user/icons.md +24 -10
  87. package/docs-user/index.json +8 -3
  88. package/docs-user/llms.txt +2 -1
  89. package/docs-user/multicol-list.md +128 -0
  90. package/docs-user/tree.md +12 -0
  91. package/docs-user/vertical-list.md +65 -9
  92. package/llms.txt +2 -1
  93. package/package.json +1 -1
  94. package/dist/data-grid-C5hk_pzK.d.ts.map +0 -1
  95. package/dist/defaults-BJwDsMH4.js +0 -86
  96. package/dist/defaults-BJwDsMH4.js.map +0 -1
  97. package/dist/grid-list-DSnYOGh7.js.map +0 -1
  98. package/dist/handle-BPOxBOKf.js +0 -219
  99. package/dist/handle-BPOxBOKf.js.map +0 -1
  100. package/dist/icon-BCJJYEpm.js.map +0 -1
  101. package/dist/incr-search-C05WjbZh.js.map +0 -1
  102. package/dist/index--5BSdbnL.d.ts.map +0 -1
  103. package/dist/index-CS9yM8L-.d.ts +0 -47
  104. package/dist/index-CS9yM8L-.d.ts.map +0 -1
  105. package/dist/list-native-drag-controller-D97TYjn1.js.map +0 -1
  106. package/dist/menu-C8a-84S5.js.map +0 -1
  107. package/dist/menu-item-DzizkMH-.js.map +0 -1
  108. package/dist/scroll-fade-CAs1EabA.js.map +0 -1
  109. package/dist/tree-C25xYUa6.js.map +0 -1
  110. package/dist/tree-component-mw8x-n2Y.d.ts.map +0 -1
@@ -1,4 +1,4 @@
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-mw8x-n2Y.js";
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-DGmKBbpy.js";
2
2
  import { a as ListItemClickDetail, c as ListSelectEvent, d as ListTickleEvent, i as ListInteractionMode, l as ListSelectionMode, n as ListActivateEvent, o as ListItemClickEvent, r as ListElementEventMap, s as ListSelectDetail, t as ListActivateDetail, u as ListTickleDetail } from "./list-selection-types-B5ioL-dG.js";
3
- import { i as VerticalListElementEventMap, n as CustomCheckboxOptions, r as VerticalListElement, t as AddItemOptions } from "./vertical-list--tFanQwM.js";
3
+ import { i as VerticalListElementEventMap, n as CustomCheckboxOptions, r as VerticalListElement, t as AddItemOptions } from "./vertical-list-BWLqy3PJ.js";
4
4
  export { AddItemOptions, CustomCheckboxOptions, type ListActivateDetail, type ListActivateEvent, type ListDragEntry, type ListDragPreview, type ListDragPreviewContext, type ListDragPreviewRenderer, type ListDragSource, type ListElementEventMap, type ListInteractionMode, type ListItemClickDetail, type ListItemClickEvent, type ListNativeDragStartDetail, type ListNativeDragStartEvent, type ListSelectDetail, type ListSelectEvent, type ListSelectionMode, type ListTickleDetail, type ListTickleEvent, VerticalListElement, VerticalListElementEventMap };
@@ -1,8 +1,8 @@
1
1
  import { t as TickledController } from "./tickled-controller-Dh1Uh_vG.js";
2
2
  import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
3
3
  import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
4
- import { c as createElementListSearchAdapter, i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, u as keyForElement } from "./incr-search-C05WjbZh.js";
5
- import { t as ListNativeDragController } from "./list-native-drag-controller-D97TYjn1.js";
4
+ import { c as createElementListSearchAdapter, i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, u as keyForElement } from "./incr-search-D91M4Ozq.js";
5
+ import { t as ListNativeDragController } from "./list-native-drag-controller-B9xO0XWn.js";
6
6
  import { r as ListDragSelectController, t as ListSelectionController } from "./list-selection-controller-SA4piSBi.js";
7
7
  import { n as animateListItemIn, r as animateListItemOut } from "./list-item-animation-BUoEKi5s.js";
8
8
  import { LitElement, css, html, render } from "lit";
@@ -28,6 +28,7 @@ This directory contains documentation for each component and some architectural
28
28
  - [led](./led.md)
29
29
  - [menu](./menu.md)
30
30
  - [miller](./miller.md)
31
+ - [multicol-list](./multicol-list.md)
31
32
  - [narrowed-text](./narrowed-text.md)
32
33
  - [notifier](./notifier.md)
33
34
  - [pan-text](./pan-text.md)
@@ -4,15 +4,27 @@ A centralized SVG icon system for `@ixfx/components`. Icons are stored by name,
4
4
 
5
5
  ## Built-in icons
6
6
 
7
- | Name | Used by | Fill |
7
+ All built-ins are [Lucide](https://lucide.dev/icons/) icons (stroke-based, `viewBox 0 0 24 24`, `fill="none"`, colored via `currentColor`), registered in `src/icons/defaults.ts`.
8
+
9
+ | Name | Lucide icon | Used by |
8
10
  |---|---|---|
9
- | `chevron-down` | `<ixfx-split-button>`, `<ixfx-panel>` | `currentColor` |
10
- | `check` | Available for use | `currentColor` |
11
- | `close` | `<ixfx-panel>`, `<ixfx-split-button>` | `currentColor` |
12
- | `add` | Available for use | `currentColor` |
13
- | `file` | Available for use | `currentColor` |
14
- | `folder` | Available for use | `currentColor` |
15
- | `search` | Available for use | `currentColor` |
11
+ | `chevron-down` | [chevron-down](https://lucide.dev/icons/chevron-down) | `<ixfx-split-button>`, `<ixfx-panel>` |
12
+ | `chevron-right` | [chevron-right](https://lucide.dev/icons/chevron-right) | `<ixfx-split-button>` |
13
+ | `chevron-up` | [chevron-up](https://lucide.dev/icons/chevron-up) | `<ixfx-data-grid>` sort indicator |
14
+ | `chevron-left` | [chevron-left](https://lucide.dev/icons/chevron-left) | `<ixfx-incr-search>` prev-match |
15
+ | `caret-right` | [chevron-right](https://lucide.dev/icons/chevron-right) (CSS mask) | tree-basic expand indicator |
16
+ | `check` | [check](https://lucide.dev/icons/check) | `<ixfx-menu-check-item>` |
17
+ | `close` | [x](https://lucide.dev/icons/x) | `<ixfx-panel>`, `<ixfx-split-button>`, `<ixfx-incr-search>` |
18
+ | `add` | [plus](https://lucide.dev/icons/plus) | Available for use |
19
+ | `error` | [circle-alert](https://lucide.dev/icons/circle-alert) | Available for use |
20
+ | `info` | [info](https://lucide.dev/icons/info) | Available for use |
21
+ | `warning` | [triangle-alert](https://lucide.dev/icons/triangle-alert) | Available for use |
22
+ | `file` | [file](https://lucide.dev/icons/file) | Available for use |
23
+ | `folder` | [folder](https://lucide.dev/icons/folder) | Available for use |
24
+ | `folder-up` | [folder-up](https://lucide.dev/icons/folder-up) | Available for use |
25
+ | `search` | [search](https://lucide.dev/icons/search) | Available for use |
26
+ | `menu` | [menu](https://lucide.dev/icons/menu) | `<ixfx-multicol-list>` column options |
27
+ | `ellipsis-vertical` | [ellipsis-vertical](https://lucide.dev/icons/ellipsis-vertical) | `<ixfx-menu-trigger>` default glyph |
16
28
 
17
29
  ## Overriding a built-in icon
18
30
 
@@ -161,10 +173,12 @@ iconBus: EventTarget
161
173
 
162
174
  ## SVG format conventions for custom icons
163
175
 
176
+ Match [Lucide](https://lucide.dev/icons/)'s style so custom icons sit consistently alongside the built-ins:
177
+
164
178
  - `viewBox="0 0 24 24"` — consistent with built-ins
165
179
  - No `width` or `height` attributes on `<svg>` — let CSS control sizing
166
- - `fill="currentColor"` for inline icons — inherits CSS `color`
167
- - `fill="black"` for CSS mask icons — color comes from `background-color`
180
+ - `fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"` for inline icons — inherits CSS `color`
181
+ - `stroke="black"` (same attributes otherwise) for CSS mask icons — color comes from `background-color`
168
182
  - `aria-hidden="true"` on the `<svg>` itself — the `<ixfx-icon>` wrapper handles accessibility
169
183
 
170
184
  ## Subscribing to icon changes
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ixfx/components",
3
- "version": "0.9.8",
4
- "generated": "2026-09-13T18:31:56.491Z",
3
+ "version": "0.10.2",
4
+ "generated": "2026-09-14T20:28:42.876Z",
5
5
  "components": [
6
6
  {
7
7
  "name": "ac-text",
@@ -123,6 +123,11 @@
123
123
  "summary": "A Miller column component displays hierarchical data as multiple vertical columns, like macOS Finder or email clients. Each column shows the children of the selected item in the previous column.",
124
124
  "path": "docs-user/miller.md"
125
125
  },
126
+ {
127
+ "name": "multicol-list",
128
+ "summary": "A faceted-filtering component: each column shows one property (facet) of the *same*",
129
+ "path": "docs-user/multicol-list.md"
130
+ },
126
131
  {
127
132
  "name": "narrowed-text",
128
133
  "summary": "A filtered text selection component with inline search. Shows slotted items filtered by a query string as the user types.",
@@ -250,7 +255,7 @@
250
255
  },
251
256
  {
252
257
  "name": "vertical-list",
253
- "summary": "A scrollable vertical list of items with selection, keyboard navigation, and incremental search. Items can be plain `<li>` elements declared in HTML or rich custom elements added programmatically.",
258
+ "summary": "A scrollable vertical list of items with selection, keyboard navigation, and incremental search. Items can be plain `<li>` elements declared in HTML or rich custom elements added programmatically. Lar",
254
259
  "path": "docs-user/vertical-list.md"
255
260
  },
256
261
  {
@@ -35,6 +35,7 @@ import '@ixfx/components/data-grid';
35
35
  - [led](docs-user/led.md): An LED indicator component with color mixing and brightness, blink, and pulse modes.
36
36
  - [menu](docs-user/menu.md): A custom menu system built on native HTML popovers with keyboard navigation, tickled focus management, and command routing.
37
37
  - [miller](docs-user/miller.md): A Miller column component displays hierarchical data as multiple vertical columns, like macOS Finder or email clients. Each column shows the children of the selected item in the previous column.
38
+ - [multicol-list](docs-user/multicol-list.md): A faceted-filtering component: each column shows one property (facet) of the *same*
38
39
  - [narrowed-text](docs-user/narrowed-text.md): A filtered text selection component with inline search. Shows slotted items filtered by a query string as the user types.
39
40
  - [notifier](docs-user/notifier.md): A "lookless" app-wide notification system. `NotificationManager` is a singleton that owns notification state, queueing, and timing — it doesn't know how to draw anything. A `NotificationRenderer` (the
40
41
  - [pan-text](docs-user/pan-text.md): Pans overflowing text on hover or continuously in a loop. Use when a label is too long for its container and you want to reveal the full text without truncation.
@@ -60,7 +61,7 @@ import '@ixfx/components/data-grid';
60
61
  - [tree](docs-user/tree.md): Three components share a common `TreeComponent` interface: **`ixfx-tree-list`**, **`ixfx-miller-list`**, and **`ixfx-crumb-navigation`**. This document describes the shared API, plus component-specifi
61
62
  - [twosplit-layout](docs-user/twosplit-layout.md): A Lit web component that lays out two elements within a container with a split bar to adjust their proportions.
62
63
  - [util](docs-user/util.md): A tooltip component that renders a value with optional icon and formatted number display. Uses native render root (no shadow DOM).
63
- - [vertical-list](docs-user/vertical-list.md): A scrollable vertical list of items with selection, keyboard navigation, and incremental search. Items can be plain `<li>` elements declared in HTML or rich custom elements added programmatically.
64
+ - [vertical-list](docs-user/vertical-list.md): A scrollable vertical list of items with selection, keyboard navigation, and incremental search. Items can be plain `<li>` elements declared in HTML or rich custom elements added programmatically. Lar
64
65
  - [xy-pad](docs-user/xy-pad.md): A 2D touch-friendly XY pad for controlling two parameters simultaneously. Each axis supports independent linear/logarithmic scaling.
65
66
 
66
67
  ## Overviews
@@ -0,0 +1,128 @@
1
+ # Multicol List
2
+
3
+ A faceted-filtering component: each column shows one property (facet) of the *same*
4
+ dataset, and selections narrow every other column (Lightroom-style cross-filtering).
5
+ Despite the miller-style appearance it is not a hierarchy — see `plans/multicol-list-impl.md`
6
+ for the design rationale.
7
+
8
+ The component does **not** own the data. For each column it hands a query (the column's
9
+ facet plus every *other* column's current choices) to a data provider you supply. The
10
+ provider returns that column's choices; items may carry a `count` for display.
11
+
12
+ ---
13
+
14
+ ## ixfx-multicol-list
15
+
16
+ ### Properties
17
+
18
+ | Property | Type | Default | Description |
19
+ |----------|------|---------|-------------|
20
+ | `categories` | `readonly MulticolCategory[]` | `[]` | Facet definitions (tree, shown in the header picker menu). Each may carry `defaults`: `grouped`, `groupBy`, `allLabel`, `sort`. |
21
+ | `dataProvider` | `IDataProvider<MulticolQuery, MulticolItem>` \| `undefined` | — | Called per column whenever that column's inputs change. Sync arrays, Promises and async-iterables are supported; the `AbortSignal` is honoured. |
22
+ | `selectionMode` | `ListSelectionMode` | `'multiple'` | `'none'`, `'single'` or `'multiple'` selection within a column. |
23
+ | `minColumns` | `number` | `1` | Floor for column removal. |
24
+ | `maxColumns` | `number` | `5` | Ceiling for column addition; `0` = unlimited. |
25
+ | `columns` | `readonly MulticolColumnState[]` (getter) | — | Current per-column config: `id`, `categoryKey`, `sort`, `grouped`, `width`. Persist this to restore a layout. |
26
+
27
+ ### Methods
28
+
29
+ ```typescript
30
+ // Restore a saved layout. Matching ids re-use live columns; unknown categories are skipped.
31
+ // A first assignment suppresses the default auto-seeded column.
32
+ setColumns(states: readonly MulticolColumnState[]): void
33
+
34
+ // Add a column for a category key, optionally at a position.
35
+ addColumn(categoryKey: string, position?: number): void
36
+
37
+ // Remove a column by id (respects minColumns).
38
+ removeColumn(columnId: string): void
39
+
40
+ // One MulticolColumnSelection per column, in display order.
41
+ // `values: []` means the column is at 'All' (contributes no filter).
42
+ getSelection(): readonly MulticolColumnSelection[]
43
+
44
+ // Every column back to 'All'. Fires multicol-select for each column that changed.
45
+ clearSelection(): void
46
+ ```
47
+
48
+ Without `setColumns`, the element auto-seeds one column (the first category) once
49
+ `categories` is assigned.
50
+
51
+ ### Events
52
+
53
+ | Event | Detail | Description |
54
+ |-------|--------|-------------|
55
+ | `multicol-select` | `{ columnId, columns }` | A column's selection changed. `columns` is a full snapshot (see `getSelection`). |
56
+ | `multicol-columns-change` | `{ columns, reason }` | Column layout changed. `reason` is one of `'add' \| 'remove' \| 'reorder' \| 'category' \| 'sort' \| 'grouping' \| 'resize'`. Resize fires **once on pointer-up** with the final width — never during the drag. |
57
+
58
+ ---
59
+
60
+ ## Data flow
61
+
62
+ 1. A selection change in column *i* re-queries **every other** column; column *i*'s list
63
+ is left untouched so the user keeps their place.
64
+ 2. Adding, removing or changing a column's category re-queries all columns (a category
65
+ swap resets that column to 'All' and applies the new category's `defaults`).
66
+ 3. Sort, grouping toggle and reorder are client-side only — no re-query.
67
+ 4. Each column keeps one in-flight request; a newer request aborts the older one and
68
+ late results are dropped.
69
+ 5. Selections that disappear from a column's data are pruned; an empty selection falls
70
+ back to 'All' (a column is never left with nothing).
71
+
72
+ Every column injects an 'All' row (label from the category's `allLabel`, default `'All'`)
73
+ at the top, selected by default. Choosing values clears All; choosing All clears values.
74
+
75
+ ---
76
+
77
+ ## Header interactions
78
+
79
+ - **Category label** — opens a menu of all categories; the current one is disabled.
80
+ - **Burger** (visible on column hover) — remove column, add column (left/right),
81
+ sort ascending/descending, grouping toggle.
82
+ - **Header drag** — reorder columns; a caret marks the drop gap.
83
+ - **Right edge** — drag to resize (80–480 px, default 220).
84
+
85
+ ---
86
+
87
+ ## CSS variables
88
+
89
+ | Variable | Default | Description |
90
+ |----------|---------|-------------|
91
+ | `--multicol-list-bg` | `var(--surface-3)` | Column background |
92
+ | `--multicol-list-header-bg` | `var(--surface-2)` | Header background |
93
+ | `--multicol-list-header-text` | `var(--surface-3-text)` | Header text colour |
94
+ | `--multicol-list-border` | `var(--border)` | Column separator |
95
+ | `--multicol-list-min-column-width` | `80px` | Resize floor |
96
+ | `--multicol-list-max-column-width` | `480px` | Resize ceiling |
97
+
98
+ Inherited from the theme: `--font-family`, `--text-s`/`--text-m`, `--space-*`,
99
+ `--radius-s`, `--accent`, `--transition`.
100
+
101
+ ---
102
+
103
+ ## Example
104
+
105
+ ```typescript
106
+ import type { MulticolItem, MulticolQuery } from '@ixfx/components/multicol-list.js';
107
+
108
+ el.categories = [
109
+ { key: `year`, label: `Year`, defaults: { allLabel: `Any year` } },
110
+ { key: `camera`, label: `Camera`, defaults: {
111
+ grouped: true,
112
+ groupBy: (item: MulticolItem) => (item.data as { brand?: string }).brand ?? `?`,
113
+ } },
114
+ ];
115
+
116
+ el.dataProvider = (query: MulticolQuery, signal) => {
117
+ // query.categoryKey — which facet to enumerate
118
+ // query.otherSelections — Map<columnId, string[]> of every OTHER column's
119
+ // choices ([] = that column is at 'All')
120
+ return computeFacet(query.categoryKey, query.otherSelections);
121
+ };
122
+
123
+ el.addEventListener(`multicol-select`, (event) => {
124
+ saveLayout(event.detail.columns);
125
+ });
126
+ ```
127
+
128
+ See `demo/multicol-list.html` for a full in-memory example with counts.
package/docs-user/tree.md CHANGED
@@ -141,6 +141,7 @@ These properties are present on all three components (`ixfx-tree-list`, `ixfx-mi
141
141
  | `selectionFilter` | `'none' \| 'leaf' \| 'branch'` | `'leaf'` | Which node kinds can be selected (reflected attribute) |
142
142
  | `filterPredicate` | `TreeFilterPredicate \| undefined` | `undefined` | Filter; only nodes returning `true` are shown |
143
143
  | `exclusivity` | `'none' \| 'depth' \| 'global'` | `'none'` | Expansion exclusivity (reflected attribute) |
144
+ | `stickyHeaders` (`sticky-headers`) | `boolean` | `true` | VS Code-style sticky headers; set `sticky-headers="false"` to opt out (`ixfx-tree-list` only) |
144
145
 
145
146
  ### `interactionMode` (`ixfx-tree-list` / `ixfx-miller-list`)
146
147
 
@@ -210,6 +211,14 @@ Controls how expansion of one branch affects others.
210
211
 
211
212
  `exclusivity="depth"` replaces the old `accordion` boolean attribute. To migrate: `accordion` → `exclusivity="depth"`.
212
213
 
214
+ ### Sticky headers (`ixfx-tree-list`)
215
+
216
+ On by default: while scrolling vertically, the ancestors of the top-visible row stick to the top of the list (VS Code-style sticky scroll), showing the full chain. Set `sticky-headers="false"` to opt out.
217
+
218
+ - Clicking a stuck header selects that ancestor and scrolls its real row into view; clicking its caret toggles expansion. Keyboard interaction stays in the real list.
219
+ - An ancestor that is itself still visible is never duplicated in the header.
220
+ - Style via `--tree-sticky-bg`, `--tree-sticky-border`, `--tree-sticky-shadow`, and the `sticky-headers` / `sticky-header` parts.
221
+
213
222
  ---
214
223
 
215
224
  ## Selection
@@ -600,6 +609,9 @@ These are set by the global theme and inherited by all tree components.
600
609
  | `--tree-drop-nub-size` | `5px` | Diameter of the insertion-line nub |
601
610
  | `--tree-drop-into-outline` | `2px solid var(--accent)` | Outline of a row that is a reparent (`inside`) drop target |
602
611
  | `--tree-drop-into-bg` | `color-mix(...)` | Background tint of a reparent drop target |
612
+ | `--tree-sticky-bg` | `var(--tree-bg)` | Sticky header background (opaque so rows slide underneath) |
613
+ | `--tree-sticky-border` | `var(--border, transparent)` | Bottom border of the sticky header stack |
614
+ | `--tree-sticky-shadow` | `0 2px 6px rgba(0,0,0,0.25)` | Shadow under the sticky header stack |
603
615
 
604
616
  `part`s: `drop-target` (the highlighted row), `drop-indicator` (the
605
617
  before/after line).
@@ -1,6 +1,6 @@
1
1
  # `ixfx-vertical-list`
2
2
 
3
- A scrollable vertical list of items with selection, keyboard navigation, and incremental search. Items can be plain `<li>` elements declared in HTML or rich custom elements added programmatically.
3
+ A scrollable vertical list of items with selection, keyboard navigation, and incremental search. Items can be plain `<li>` elements declared in HTML or rich custom elements added programmatically. Large lists can be [virtualized](#virtualisation) so only the visible rows exist in the DOM.
4
4
 
5
5
  ---
6
6
 
@@ -11,13 +11,14 @@ A scrollable vertical list of items with selection, keyboard navigation, and inc
11
11
  3. [Properties](#properties)
12
12
  4. [Sticky mode](#sticky-mode)
13
13
  5. [Custom checkbox](#custom-checkbox)
14
- 5. [Selection](#selection)
15
- 6. [Events](#events)
16
- 7. [Native drag-out](#native-drag-out)
17
- 8. [Keyboard navigation](#keyboard-navigation)
18
- 8. [Incremental search](#incremental-search)
19
- 9. [CSS variables](#css-variables)
20
- 10. [CSS parts](#css-parts)
14
+ 6. [Selection](#selection)
15
+ 7. [Events](#events)
16
+ 8. [Native drag-out](#native-drag-out)
17
+ 9. [Keyboard navigation](#keyboard-navigation)
18
+ 10. [Incremental search](#incremental-search)
19
+ 11. [Virtualisation](#virtualisation)
20
+ 12. [CSS variables](#css-variables)
21
+ 13. [CSS parts](#css-parts)
21
22
 
22
23
  ---
23
24
 
@@ -117,6 +118,8 @@ To reflect selection state inside the custom element's shadow DOM, target the `:
117
118
  |---|---|---|---|
118
119
  | `selectionMode` / `selection-mode` | `'none' \| 'single' \| 'multiple'` | `'single'` | Which items can be selected simultaneously |
119
120
  | `interactionMode` / `interaction-mode` | `ListInteractionMode` | `'standard'` | How gestures map to selection changes (see table below) |
121
+ | `virtualize` / `virtualize` | `boolean` | `false` | Only render the viewport window (+ overscan) into the DOM; pool and recycle the rest. See [Virtualisation](#virtualisation) |
122
+ | `itemHeight` / `item-height` | `number` | `0` | Fixed row height in px. Required for `virtualize` — every row must be exactly this tall |
120
123
  | `filterPredicate` | `((el: Element) => boolean) \| undefined` | `undefined` | External filter; only items returning `true` are shown |
121
124
  | `checkboxRenderer` | `((checked: boolean) => unknown) \| CustomCheckboxOptions \| undefined` | `undefined` | Custom content for the checkbox in `checked` mode. See [Custom checkbox](#custom-checkbox) |
122
125
 
@@ -581,6 +584,59 @@ list.filterPredicate = undefined;
581
584
 
582
585
  ---
583
586
 
587
+ ## Virtualisation
588
+
589
+ Set `virtualize` to window the list: only the rows near the viewport (plus an overscan of 3 rows) ever exist in the DOM. Everything else is pooled off-DOM and recycled **by identity** as you scroll, so a list of tens of thousands of rows keeps a tiny, fast DOM. Works for hand-supplied `<li>` / `data-list-item` elements **and** adapter (`items`) rows.
590
+
591
+ Offscreen space is held by two `data-virtual-spacer` rows bracketing the rendered window. If you query items yourself, exclude them (`li:not([data-virtual-spacer])`) — `querySelectorAll` with the plain `li` selector won't resolve pooled rows because they have no DOM node at all.
592
+
593
+ ### Enabling it
594
+
595
+ ```html
596
+ <ixfx-vertical-list virtualize item-height="30" selection-mode="multiple"
597
+ style="height: 300px; --list-item-height: 30px">
598
+ </ixfx-vertical-list>
599
+ ```
600
+
601
+ - **`item-height` is required.** The window math is pure fixed-stride arithmetic (no DOM measurement), mirroring `ixfx-grid-list`'s `itemSize`. Every row must be exactly that tall — set `--list-item-height` to the same value and keep row content single-line.
602
+ - With `item-height` at `0` the component warns and runs non-virtualized.
603
+ - It can be toggled at runtime: entering snapshots the current DOM order as the row registry; leaving reattaches every row in order and drops the spacers and pool. Selection and cursor survive both directions.
604
+
605
+ ```typescript
606
+ list.virtualize = true;
607
+ list.itemHeight = 30;
608
+ ```
609
+
610
+ ### What works while virtualized
611
+
612
+ - **Selection and cursor survive scrolling.** Rows are detached/reattached, never recreated, and pooled rows hold live element refs — `selectAll()`, `Cmd/Ctrl+A`, and range operations span them too.
613
+ - **`data-key`s** are required for the key APIs (`selectKeys`, `focusKey`, `getItemByKey`, `renderedKeys`); selection by reference (click, `select()`) works regardless.
614
+ - **Mutations reconcile.** `addItem` / `setItems` / direct `appendChild` / `removeItem` / `clearItems` all keep working; appends beyond the window land in the pool.
615
+ - **Adapter mode** (`items` + `formatter`) virtualizes the same way, and `updateItem` writes through to pooled rows.
616
+
617
+ ### Reading the window
618
+
619
+ ```typescript
620
+ // Keys of the rendered window (viewport + overscan) — the priority set for
621
+ // prefetching, mirroring ixfx-grid-list.renderedKeys()
622
+ list.renderedKeys();
623
+
624
+ // Keys strictly intersecting the viewport (rect test) — for
625
+ // viewport-first work like thumbnail fetches
626
+ list.visibleKeys();
627
+
628
+ // Resolves pooled (off-DOM) rows too
629
+ list.getItemByKey('r4321');
630
+ ```
631
+
632
+ ### Limitations while active
633
+
634
+ - **Drag-select is disabled** — the window shifts under a drag, so the marquee band can't be tracked reliably.
635
+ - **Incremental-search `filter` mode is excluded** — it collapses rows via `hidden`, corrupting the fixed-stride geometry. `navigate` and `select` modes still work.
636
+ - **Keyboard navigation stays within the rendered window** — scroll first.
637
+
638
+ ---
639
+
584
640
  ## CSS variables
585
641
 
586
642
  | Variable | Default | Description |
@@ -589,7 +645,7 @@ list.filterPredicate = undefined;
589
645
  | `--list-text` | `var(--surface-3-text)` | Default text colour |
590
646
  | `--list-border` | `var(--border)` | Border colour |
591
647
  | `--list-radius` | `var(--radius-s)` | Border radius |
592
- | `--list-item-height` | `28px` | Minimum row height for `<li>` items |
648
+ | `--list-item-height` | `28px` | Minimum row height for `<li>` items; set it to match `item-height` when virtualizing |
593
649
  | `--list-item-padding` | `4px var(--space-m, 8px)` | Padding for `<li>` items |
594
650
  | `--item-bg-tickled` | `rgba(0,0,0,0.06)` | Row background when cursor is on it |
595
651
  | `--item-bg-selected` | `rgba(25,118,210,1)` | Selected row background |
package/llms.txt CHANGED
@@ -35,6 +35,7 @@ import '@ixfx/components/data-grid';
35
35
  - [led](docs-user/led.md): An LED indicator component with color mixing and brightness, blink, and pulse modes.
36
36
  - [menu](docs-user/menu.md): A custom menu system built on native HTML popovers with keyboard navigation, tickled focus management, and command routing.
37
37
  - [miller](docs-user/miller.md): A Miller column component displays hierarchical data as multiple vertical columns, like macOS Finder or email clients. Each column shows the children of the selected item in the previous column.
38
+ - [multicol-list](docs-user/multicol-list.md): A faceted-filtering component: each column shows one property (facet) of the *same*
38
39
  - [narrowed-text](docs-user/narrowed-text.md): A filtered text selection component with inline search. Shows slotted items filtered by a query string as the user types.
39
40
  - [notifier](docs-user/notifier.md): A "lookless" app-wide notification system. `NotificationManager` is a singleton that owns notification state, queueing, and timing — it doesn't know how to draw anything. A `NotificationRenderer` (the
40
41
  - [pan-text](docs-user/pan-text.md): Pans overflowing text on hover or continuously in a loop. Use when a label is too long for its container and you want to reveal the full text without truncation.
@@ -60,7 +61,7 @@ import '@ixfx/components/data-grid';
60
61
  - [tree](docs-user/tree.md): Three components share a common `TreeComponent` interface: **`ixfx-tree-list`**, **`ixfx-miller-list`**, and **`ixfx-crumb-navigation`**. This document describes the shared API, plus component-specifi
61
62
  - [twosplit-layout](docs-user/twosplit-layout.md): A Lit web component that lays out two elements within a container with a split bar to adjust their proportions.
62
63
  - [util](docs-user/util.md): A tooltip component that renders a value with optional icon and formatted number display. Uses native render root (no shadow DOM).
63
- - [vertical-list](docs-user/vertical-list.md): A scrollable vertical list of items with selection, keyboard navigation, and incremental search. Items can be plain `<li>` elements declared in HTML or rich custom elements added programmatically.
64
+ - [vertical-list](docs-user/vertical-list.md): A scrollable vertical list of items with selection, keyboard navigation, and incremental search. Items can be plain `<li>` elements declared in HTML or rich custom elements added programmatically. Lar
64
65
  - [xy-pad](docs-user/xy-pad.md): A 2D touch-friendly XY pad for controlling two parameters simultaneously. Each axis supports independent linear/logarithmic scaling.
65
66
 
66
67
  ## Overviews
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ixfx/components",
3
3
  "type": "module",
4
- "version": "0.10.0",
4
+ "version": "0.10.2",
5
5
  "packageManager": "pnpm@10.0.0",
6
6
  "description": "Web components for ixfx — Lit-based UI toolkit",
7
7
  "author": "Clint Heyer",
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-grid-C5hk_pzK.d.ts","names":[],"sources":["../src/data-grid/types.ts","../src/data-grid/data-grid.ts"],"mappings":"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"}
@@ -1,86 +0,0 @@
1
- import { s as registerIcon } from "./registry-BEtb8_wB.js";
2
- //#region src/icons/defaults.ts
3
- /**
4
- * Chevron pointing down. Used for split-button dropdown toggle.
5
- * fill="currentColor" so it inherits CSS color.
6
- */
7
- const ICON_CHEVRON_DOWN = `<svg viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"/></svg>`;
8
- /**
9
- * Caret pointing right. Used for tree-basic expand indicator as a CSS mask.
10
- * fill="black" is correct for CSS mask-image use (shape only, color comes from background-color).
11
- */
12
- const ICON_CARET_RIGHT = `<svg viewBox="0 0 24 24" fill="black" xmlns="http://www.w3.org/2000/svg"><path d="M10 7l6 5-6 5V7z"/></svg>`;
13
- /**
14
- * Checkmark. Useful for menu-check-item or confirmation states.
15
- * fill="currentColor" so it inherits CSS color.
16
- */
17
- const ICON_CHECK = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z"/></svg>`;
18
- /**
19
- * Close / X icon. Useful for dialogs, notifications, dismissible elements.
20
- * fill="currentColor" so it inherits CSS color.
21
- */
22
- const ICON_CLOSE = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>`;
23
- /**
24
- * Plus / add icon. Pairs with `close` for add/remove actions.
25
- * fill="currentColor" so it inherits CSS color.
26
- */
27
- const ICON_ADD = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></svg>`;
28
- /**
29
- * Error / warning icon. Useful for error notifications.
30
- * fill="currentColor" so it inherits CSS color.
31
- */
32
- const ICON_ERROR = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/></svg>`;
33
- /**
34
- * Info icon. Useful for info notifications.
35
- * fill="currentColor" so it inherits CSS color.
36
- */
37
- const ICON_INFO = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></svg>`;
38
- /**
39
- * Warning icon. Useful for warning notifications.
40
- * fill="currentColor" so it inherits CSS color.
41
- */
42
- const ICON_WARNING = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/></svg>`;
43
- /**
44
- * Chevron pointing right. Used for split-button switcher toggle.
45
- * fill="currentColor" so it inherits CSS color.
46
- */
47
- const ICON_CHEVRON_RIGHT = `<svg viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"/></svg>`;
48
- /**
49
- * Folder with up arrow. Angled line style for navigating up one level.
50
- * fill="currentColor" so it inherits CSS color.
51
- */
52
- const ICON_FOLDER_UP = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 4L4 12h5v8h6v-8h5L12 4z"/></svg>`;
53
- /**
54
- * Folder. Useful for file explorers and sidebars.
55
- * fill="currentColor" so it inherits CSS color.
56
- */
57
- const ICON_FOLDER = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 1.99-.9 1.99-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/></svg>`;
58
- /**
59
- * Document / file page. Useful for file lists and document tabs.
60
- * fill="currentColor" so it inherits CSS color.
61
- */
62
- const ICON_FILE = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z"/></svg>`;
63
- /**
64
- * Magnifying glass. Useful for search panels and inputs.
65
- * fill="currentColor" so it inherits CSS color.
66
- */
67
- const ICON_SEARCH = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/></svg>`;
68
- function registerDefaults() {
69
- registerIcon(`chevron-down`, ICON_CHEVRON_DOWN);
70
- registerIcon(`chevron-right`, ICON_CHEVRON_RIGHT);
71
- registerIcon(`caret-right`, ICON_CARET_RIGHT);
72
- registerIcon(`check`, ICON_CHECK);
73
- registerIcon(`close`, ICON_CLOSE);
74
- registerIcon(`file`, ICON_FILE);
75
- registerIcon(`folder`, ICON_FOLDER);
76
- registerIcon(`search`, ICON_SEARCH);
77
- registerIcon(`add`, ICON_ADD);
78
- registerIcon(`error`, ICON_ERROR);
79
- registerIcon(`folder-up`, ICON_FOLDER_UP);
80
- registerIcon(`info`, ICON_INFO);
81
- registerIcon(`warning`, ICON_WARNING);
82
- }
83
- //#endregion
84
- export { registerDefaults as a, ICON_CLOSE as i, ICON_CHECK as n, ICON_CHEVRON_DOWN as r, ICON_CARET_RIGHT as t };
85
-
86
- //# sourceMappingURL=defaults-BJwDsMH4.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"defaults-BJwDsMH4.js","names":[],"sources":["../src/icons/defaults.ts"],"sourcesContent":["import { registerIcon } from './registry.js';\n\n/**\n * Chevron pointing down. Used for split-button dropdown toggle.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_CHEVRON_DOWN = `<svg viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"/></svg>`;\n\n/**\n * Caret pointing right. Used for tree-basic expand indicator as a CSS mask.\n * fill=\"black\" is correct for CSS mask-image use (shape only, color comes from background-color).\n */\nexport const ICON_CARET_RIGHT = `<svg viewBox=\"0 0 24 24\" fill=\"black\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 7l6 5-6 5V7z\"/></svg>`;\n\n/**\n * Checkmark. Useful for menu-check-item or confirmation states.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_CHECK = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\"/></svg>`;\n\n/**\n * Close / X icon. Useful for dialogs, notifications, dismissible elements.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_CLOSE = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\"/></svg>`;\n\n/**\n * Plus / add icon. Pairs with `close` for add/remove actions.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_ADD = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/></svg>`;\n\n/**\n * Error / warning icon. Useful for error notifications.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_ERROR = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>`;\n\n/**\n * Info icon. Useful for info notifications.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_INFO = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>`;\n\n/**\n * Warning icon. Useful for warning notifications.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_WARNING = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></svg>`;\n\n/**\n * Chevron pointing right. Used for split-button switcher toggle.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_CHEVRON_RIGHT = `<svg viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"/></svg>`;\n\n/**\n * Folder with up arrow. Angled line style for navigating up one level.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_FOLDER_UP = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12 4L4 12h5v8h6v-8h5L12 4z\"/></svg>`;\n\n/**\n * Folder. Useful for file explorers and sidebars.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_FOLDER = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 1.99-.9 1.99-2V8c0-1.1-.9-2-2-2h-8l-2-2z\"/></svg>`;\n\n/**\n * Document / file page. Useful for file lists and document tabs.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_FILE = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z\"/></svg>`;\n\n/**\n * Magnifying glass. Useful for search panels and inputs.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_SEARCH = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/></svg>`;\n\nexport function registerDefaults(): void {\n registerIcon(`chevron-down`, ICON_CHEVRON_DOWN);\n registerIcon(`chevron-right`, ICON_CHEVRON_RIGHT);\n registerIcon(`caret-right`, ICON_CARET_RIGHT);\n registerIcon(`check`, ICON_CHECK);\n registerIcon(`close`, ICON_CLOSE);\n registerIcon(`file`, ICON_FILE);\n registerIcon(`folder`, ICON_FOLDER);\n registerIcon(`search`, ICON_SEARCH);\n registerIcon(`add`, ICON_ADD);\n registerIcon(`error`, ICON_ERROR);\n registerIcon(`folder-up`, ICON_FOLDER_UP);\n registerIcon(`info`, ICON_INFO);\n registerIcon(`warning`, ICON_WARNING);\n}\n"],"mappings":";;;;;;AAMA,MAAa,oBAAoB;;;;;AAMjC,MAAa,mBAAmB;;;;;AAMhC,MAAa,aAAa;;;;;AAM1B,MAAa,aAAa;;;;;AAM1B,MAAa,WAAW;;;;;AAMxB,MAAa,aAAa;;;;;AAM1B,MAAa,YAAY;;;;;AAMzB,MAAa,eAAe;;;;;AAM5B,MAAa,qBAAqB;;;;;AAMlC,MAAa,iBAAiB;;;;;AAM9B,MAAa,cAAc;;;;;AAM3B,MAAa,YAAY;;;;;AAMzB,MAAa,cAAc;AAE3B,SAAgB,mBAAyB;CACvC,aAAa,gBAAgB,iBAAiB;CAC9C,aAAa,iBAAiB,kBAAkB;CAChD,aAAa,eAAe,gBAAgB;CAC5C,aAAa,SAAS,UAAU;CAChC,aAAa,SAAS,UAAU;CAChC,aAAa,QAAQ,SAAS;CAC9B,aAAa,UAAU,WAAW;CAClC,aAAa,UAAU,WAAW;CAClC,aAAa,OAAO,QAAQ;CAC5B,aAAa,SAAS,UAAU;CAChC,aAAa,aAAa,cAAc;CACxC,aAAa,QAAQ,SAAS;CAC9B,aAAa,WAAW,YAAY;AACtC"}