@ixfx/components 0.4.3 → 0.5.0

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 (239) hide show
  1. package/bundle/index.d.ts +518 -1176
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +4861 -17274
  4. package/bundle/index.js.map +1 -1
  5. package/bundle/style.css +1 -1
  6. package/dist/ac-text.d.ts +12 -7
  7. package/dist/ac-text.d.ts.map +1 -1
  8. package/dist/ac-text.js +2 -3
  9. package/dist/ac-text.js.map +1 -1
  10. package/dist/{button-C3fLMKUv.js → button-DxYee1ZH.js} +2 -2
  11. package/dist/{button-C3fLMKUv.js.map → button-DxYee1ZH.js.map} +1 -1
  12. package/dist/button.d.ts +1 -2
  13. package/dist/button.d.ts.map +1 -1
  14. package/dist/button.js +1 -2
  15. package/dist/checkbox.d.ts +0 -1
  16. package/dist/checkbox.d.ts.map +1 -1
  17. package/dist/checkbox.js +1 -1
  18. package/dist/checkbox.js.map +1 -1
  19. package/dist/{colour-picker-0sgAha1T.js → colour-picker-C3Ag4uh-.js} +15 -17
  20. package/dist/colour-picker-C3Ag4uh-.js.map +1 -0
  21. package/dist/colour-picker.d.ts +1 -1
  22. package/dist/colour-picker.js +1 -1
  23. package/dist/crumbs.d.ts +5 -2
  24. package/dist/crumbs.d.ts.map +1 -1
  25. package/dist/crumbs.js +45 -20
  26. package/dist/crumbs.js.map +1 -1
  27. package/dist/data-display.d.ts +1 -2
  28. package/dist/data-display.d.ts.map +1 -1
  29. package/dist/data-display.js +25 -23
  30. package/dist/data-display.js.map +1 -1
  31. package/dist/{data-provider-DgI909FP.js → data-provider-35TyWclX.js} +2 -2
  32. package/dist/data-provider-35TyWclX.js.map +1 -0
  33. package/dist/{decorate-DdjvVHS-.js → decorate-VRK8rslU.js} +2 -2
  34. package/dist/{decorate-DdjvVHS-.js.map → decorate-VRK8rslU.js.map} +1 -1
  35. package/dist/{defaults-C3b9OWJD.js → defaults-DcE8RQJc.js} +19 -1
  36. package/dist/defaults-DcE8RQJc.js.map +1 -0
  37. package/dist/editable-label.d.ts +1 -2
  38. package/dist/editable-label.d.ts.map +1 -1
  39. package/dist/editable-label.js +1 -1
  40. package/dist/editable-label.js.map +1 -1
  41. package/dist/{hex-editor-WZrjRtvL.js → hex-editor-Bk6rxhfg.js} +9 -11
  42. package/dist/hex-editor-Bk6rxhfg.js.map +1 -0
  43. package/dist/{hex-editor-CMIxtNgT.d.ts → hex-editor-Caq8vNQk.d.ts} +2 -3
  44. package/dist/hex-editor-Caq8vNQk.d.ts.map +1 -0
  45. package/dist/hex.d.ts +1 -1
  46. package/dist/hex.js +1 -1
  47. package/dist/highlight-B-eQrhhb.js.map +1 -1
  48. package/dist/{icon-Ndo40kNO.js → icon-B22XVlCt.js} +6 -4
  49. package/dist/{icon-Ndo40kNO.js.map → icon-B22XVlCt.js.map} +1 -1
  50. package/dist/{icon-Bd5BiU4b.d.ts → icon-DpA9x2Ve.d.ts} +2 -3
  51. package/dist/icon-DpA9x2Ve.d.ts.map +1 -0
  52. package/dist/icons.d.ts +2 -2
  53. package/dist/icons.js +2 -2
  54. package/dist/{incr-search-CeERfijK.js → incr-search-2pz21xtR.js} +9 -6
  55. package/dist/incr-search-2pz21xtR.js.map +1 -0
  56. package/dist/incr-search.d.ts +1 -1
  57. package/dist/incr-search.js +1 -1
  58. package/dist/{index-CowKi2mo.d.ts → index-BeuCXtiO.d.ts} +3 -4
  59. package/dist/index-BeuCXtiO.d.ts.map +1 -0
  60. package/dist/{index-D87kRcEs.d.ts → index-BtGFYfaK.d.ts} +2 -1
  61. package/dist/index-BtGFYfaK.d.ts.map +1 -0
  62. package/dist/{index-s_IhSnwc.d.ts → index-CoqtMSd9.d.ts} +6 -4
  63. package/dist/index-CoqtMSd9.d.ts.map +1 -0
  64. package/dist/{index-9fGVAg1d.d.ts → index-Cxwxtj6g.d.ts} +3 -3
  65. package/dist/index-Cxwxtj6g.d.ts.map +1 -0
  66. package/dist/index-D_ftz_IT.d.ts +184 -0
  67. package/dist/index-D_ftz_IT.d.ts.map +1 -0
  68. package/dist/{index-_RTQSKHi.d.ts → index-DfEkTGvT.d.ts} +11 -11
  69. package/dist/index-DfEkTGvT.d.ts.map +1 -0
  70. package/dist/index.d.ts +167 -29
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +712 -2970
  73. package/dist/index.js.map +1 -1
  74. package/dist/keyboard-B5xD7Fz-.js +36 -0
  75. package/dist/keyboard-B5xD7Fz-.js.map +1 -0
  76. package/dist/{labelled-input-base-ORb1rGq6.d.ts → labelled-input-base-DiTme1JO.d.ts} +1 -2
  77. package/dist/labelled-input-base-DiTme1JO.d.ts.map +1 -0
  78. package/dist/{labelled-input-base-9K_w3oLj.js → labelled-input-base-hoKGwyKT.js} +2 -2
  79. package/dist/{labelled-input-base-9K_w3oLj.js.map → labelled-input-base-hoKGwyKT.js.map} +1 -1
  80. package/dist/labelled-radial-input.d.ts +5 -4
  81. package/dist/labelled-radial-input.d.ts.map +1 -1
  82. package/dist/labelled-radial-input.js +7 -3
  83. package/dist/labelled-radial-input.js.map +1 -1
  84. package/dist/labelled-range-input.d.ts +1 -1
  85. package/dist/labelled-range-input.js +27 -3
  86. package/dist/labelled-range-input.js.map +1 -1
  87. package/dist/led.d.ts +1 -2
  88. package/dist/led.d.ts.map +1 -1
  89. package/dist/led.js +1 -1
  90. package/dist/led.js.map +1 -1
  91. package/dist/{menu-vjoiHZ13.js → menu-g6yd7ddN.js} +8 -9
  92. package/dist/menu-g6yd7ddN.js.map +1 -0
  93. package/dist/{menu-item-COx-Azgj.d.ts → menu-item-DSyf9f_L.d.ts} +4 -4
  94. package/dist/menu-item-DSyf9f_L.d.ts.map +1 -0
  95. package/dist/{menu-item-BrIuORYD.js → menu-item-NUKwJ4s5.js} +3 -4
  96. package/dist/{menu-item-BrIuORYD.js.map → menu-item-NUKwJ4s5.js.map} +1 -1
  97. package/dist/menu.d.ts +2 -2
  98. package/dist/menu.js +2 -2
  99. package/dist/miller.d.ts +8 -5
  100. package/dist/miller.d.ts.map +1 -1
  101. package/dist/miller.js +22 -24
  102. package/dist/miller.js.map +1 -1
  103. package/dist/narrowed-text.d.ts +7 -3
  104. package/dist/narrowed-text.d.ts.map +1 -1
  105. package/dist/narrowed-text.js +73 -47
  106. package/dist/narrowed-text.js.map +1 -1
  107. package/dist/panel.d.ts +1 -1
  108. package/dist/panel.d.ts.map +1 -1
  109. package/dist/panel.js +2 -2
  110. package/dist/panel.js.map +1 -1
  111. package/dist/plots.d.ts +2 -2
  112. package/dist/plots.js +1 -1
  113. package/dist/polar-pad.d.ts +15 -3
  114. package/dist/polar-pad.d.ts.map +1 -1
  115. package/dist/polar-pad.js +64 -11
  116. package/dist/polar-pad.js.map +1 -1
  117. package/dist/{radial-input-CpQPs1Mp.d.ts → radial-input-BhZeyyP-.d.ts} +6 -4
  118. package/dist/radial-input-BhZeyyP-.d.ts.map +1 -0
  119. package/dist/{radial-input-DZ7eQCcM.js → radial-input-DxCrt_NE.js} +41 -19
  120. package/dist/radial-input-DxCrt_NE.js.map +1 -0
  121. package/dist/radial-input.d.ts +1 -1
  122. package/dist/radial-input.js +1 -1
  123. package/dist/range-input.d.ts +15 -4
  124. package/dist/range-input.d.ts.map +1 -1
  125. package/dist/range-input.js +23 -2
  126. package/dist/range-input.js.map +1 -1
  127. package/dist/range.d.ts +15 -4
  128. package/dist/range.d.ts.map +1 -1
  129. package/dist/range.js +23 -2
  130. package/dist/range.js.map +1 -1
  131. package/dist/selecthorizontal.d.ts +1 -2
  132. package/dist/selecthorizontal.d.ts.map +1 -1
  133. package/dist/selecthorizontal.js +1 -1
  134. package/dist/selecthorizontal.js.map +1 -1
  135. package/dist/slider-input-DFpG23bS.js +1592 -0
  136. package/dist/slider-input-DFpG23bS.js.map +1 -0
  137. package/dist/slider-input-TidGhvXt.d.ts +160 -0
  138. package/dist/slider-input-TidGhvXt.d.ts.map +1 -0
  139. package/dist/slider-input.d.ts +2 -0
  140. package/dist/slider-input.js +2 -0
  141. package/dist/snap-container.d.ts +1 -2
  142. package/dist/snap-container.d.ts.map +1 -1
  143. package/dist/snap-container.js +6 -5
  144. package/dist/snap-container.js.map +1 -1
  145. package/dist/split-layout.d.ts +1 -2
  146. package/dist/split-layout.d.ts.map +1 -1
  147. package/dist/split-layout.js +6 -4
  148. package/dist/split-layout.js.map +1 -1
  149. package/dist/style.css +1 -1
  150. package/dist/swipe.d.ts +12 -2
  151. package/dist/swipe.d.ts.map +1 -1
  152. package/dist/swipe.js +22 -3
  153. package/dist/swipe.js.map +1 -1
  154. package/dist/{tab-list-DLzb-m-I.d.ts → tab-list-BohmbvqF.d.ts} +14 -5
  155. package/dist/tab-list-BohmbvqF.d.ts.map +1 -0
  156. package/dist/tab-list-DhkVhRQc.js +597 -0
  157. package/dist/tab-list-DhkVhRQc.js.map +1 -0
  158. package/dist/tabs.d.ts +2 -2
  159. package/dist/tabs.js +1 -208
  160. package/dist/{tickled-controller-BjYCzGrU.d.ts → tickled-controller-BF2Ea0DE.d.ts} +2 -31
  161. package/dist/tickled-controller-BF2Ea0DE.d.ts.map +1 -0
  162. package/dist/tickled-styles-fNDdqf6l.js.map +1 -1
  163. package/dist/{timeline-2OFtN4Ta.js → timeline-B2fgDL4U.js} +37 -1438
  164. package/dist/timeline-B2fgDL4U.js.map +1 -0
  165. package/dist/timeline.d.ts +1 -1
  166. package/dist/timeline.js +1 -1
  167. package/dist/{tooltip-RGVIwHrZ.d.ts → tooltip-BlvBUQxx.d.ts} +3 -3
  168. package/dist/tooltip-BlvBUQxx.d.ts.map +1 -0
  169. package/dist/{tree-D84RUgFC.js → tree-BnvzhsAw.js} +8 -9
  170. package/dist/tree-BnvzhsAw.js.map +1 -0
  171. package/dist/{tree-component-BaCSPWg1.d.ts → tree-component-DCmmKZ4j.d.ts} +8 -124
  172. package/dist/tree-component-DCmmKZ4j.d.ts.map +1 -0
  173. package/dist/tree.d.ts +10 -4
  174. package/dist/tree.d.ts.map +1 -1
  175. package/dist/tree.js +1 -1
  176. package/dist/types-DO3gt5vg.d.ts +130 -0
  177. package/dist/types-DO3gt5vg.d.ts.map +1 -0
  178. package/dist/wheel-nudge-BlSCe_hD.js +86 -0
  179. package/dist/wheel-nudge-BlSCe_hD.js.map +1 -0
  180. package/dist/wheel-nudge-DgMTRYlh.d.ts +29 -0
  181. package/dist/wheel-nudge-DgMTRYlh.d.ts.map +1 -0
  182. package/dist/{xy-axis-BeWRMmbo.d.ts → xy-axis-5KhVTNoX.d.ts} +30 -7
  183. package/dist/xy-axis-5KhVTNoX.d.ts.map +1 -0
  184. package/dist/xy-axis-CxHC8z5E.js +1849 -0
  185. package/dist/xy-axis-CxHC8z5E.js.map +1 -0
  186. package/dist/xy-pad.d.ts +13 -2
  187. package/dist/xy-pad.d.ts.map +1 -1
  188. package/dist/xy-pad.js +47 -6
  189. package/dist/xy-pad.js.map +1 -1
  190. package/docs-user/README.md +2 -0
  191. package/docs-user/button.md +48 -0
  192. package/docs-user/narrowed-text.md +33 -1
  193. package/docs-user/notifier.md +131 -0
  194. package/docs-user/plots.md +61 -1
  195. package/docs-user/radial-input.md +2 -2
  196. package/docs-user/slider-input.md +673 -0
  197. package/docs-user/tabs.md +12 -14
  198. package/docs-user/user-catalog.md +69 -4
  199. package/docs-user/vertical-list.md +75 -7
  200. package/package.json +23 -20
  201. package/dist/colour-C3MQIjFJ-vRCdr8W-.js +0 -3732
  202. package/dist/colour-C3MQIjFJ-vRCdr8W-.js.map +0 -1
  203. package/dist/colour-picker-0sgAha1T.js.map +0 -1
  204. package/dist/data-provider-DgI909FP.js.map +0 -1
  205. package/dist/defaults-C3b9OWJD.js.map +0 -1
  206. package/dist/dist-CA13FvMn.js +0 -980
  207. package/dist/dist-CA13FvMn.js.map +0 -1
  208. package/dist/hex-editor-CMIxtNgT.d.ts.map +0 -1
  209. package/dist/hex-editor-WZrjRtvL.js.map +0 -1
  210. package/dist/icon-Bd5BiU4b.d.ts.map +0 -1
  211. package/dist/incr-search-CeERfijK.js.map +0 -1
  212. package/dist/index-9fGVAg1d.d.ts.map +0 -1
  213. package/dist/index-CowKi2mo.d.ts.map +0 -1
  214. package/dist/index-D87kRcEs.d.ts.map +0 -1
  215. package/dist/index-DgXpCg_G.d.ts +0 -1244
  216. package/dist/index-DgXpCg_G.d.ts.map +0 -1
  217. package/dist/index-_RTQSKHi.d.ts.map +0 -1
  218. package/dist/index-s_IhSnwc.d.ts.map +0 -1
  219. package/dist/keyboard-CimiEskD.js +0 -20
  220. package/dist/keyboard-CimiEskD.js.map +0 -1
  221. package/dist/labelled-input-base-ORb1rGq6.d.ts.map +0 -1
  222. package/dist/menu-item-COx-Azgj.d.ts.map +0 -1
  223. package/dist/menu-vjoiHZ13.js.map +0 -1
  224. package/dist/radial-input-CpQPs1Mp.d.ts.map +0 -1
  225. package/dist/radial-input-DZ7eQCcM.js.map +0 -1
  226. package/dist/tab-list-DLzb-m-I.d.ts.map +0 -1
  227. package/dist/tabs.js.map +0 -1
  228. package/dist/tickled-controller-BjYCzGrU.d.ts.map +0 -1
  229. package/dist/timeline-2OFtN4Ta.js.map +0 -1
  230. package/dist/tooltip-RGVIwHrZ.d.ts.map +0 -1
  231. package/dist/tree-D84RUgFC.js.map +0 -1
  232. package/dist/tree-component-BaCSPWg1.d.ts.map +0 -1
  233. package/dist/types-DSfbtHs3.d.ts +0 -8
  234. package/dist/types-DSfbtHs3.d.ts.map +0 -1
  235. package/dist/xy-axis-BeWRMmbo.d.ts.map +0 -1
  236. package/dist/xy-axis-no0OL_O1.js +0 -7893
  237. package/dist/xy-axis-no0OL_O1.js.map +0 -1
  238. /package/bundle/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
  239. /package/dist/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
@@ -1,123 +1,4 @@
1
- //#region src/common/data-provider.d.ts
2
- /**
3
- * Shared data-provider contract used by components that render a list of items.
4
- *
5
- * A provider is a simple callable — the consuming component (via DataController)
6
- * manages the request lifecycle, cancellation, and reactive state.
7
- */
8
- /**
9
- * One batch of items within a streaming provider response.
10
- *
11
- * For sync and async one-shot providers, the DataController synthesises a single
12
- * DataBatch internally — you only need this type when writing a streaming provider.
13
- */
14
- type DataBatch<T> = {
15
- /** Items delivered in this batch. */readonly items: readonly T[];
16
- /**
17
- * When true, replace all previously accumulated items with this batch instead
18
- * of appending. Useful for re-ranked or filtered results mid-stream.
19
- * Default: false (append).
20
- */
21
- replace?: boolean;
22
- /**
23
- * Provider's current estimate of the total number of items that will be
24
- * delivered across all batches. Enables progress percentage in the consumer.
25
- * May be refined in subsequent batches as the estimate improves.
26
- * Omit when the total is unknown.
27
- */
28
- total?: number;
29
- };
30
- /**
31
- * The three return modes a provider may use.
32
- * DataController normalises all three — callers can mix modes freely.
33
- *
34
- * - `readonly T[]` — sync, items available immediately
35
- * - `Promise<readonly T[]>` — async one-shot, resolves to the full result
36
- * - `AsyncIterable<DataBatch<T>>` — streaming, batches arrive over time
37
- */
38
- type DataProviderResult<T> = readonly T[] | Promise<readonly T[]> | AsyncIterable<DataBatch<T>>;
39
- /**
40
- * A data provider callable.
41
- *
42
- * @typeParam TQuery - The input that scopes the request (e.g. `string` for
43
- * autocomplete, `{ node, depth }` for a tree branch, `void` for a plain list).
44
- * @typeParam TItem - The item type produced.
45
- *
46
- * The AbortSignal is cancelled when the consumer supersedes the request (e.g.
47
- * a new query arrives before the previous one completes). Streaming providers
48
- * should check `signal.aborted` between yields or pass the signal to their
49
- * underlying fetch calls.
50
- */
51
- type IDataProvider<TQuery, TItem> = (query: TQuery, signal: AbortSignal) => DataProviderResult<TItem>;
52
- /**
53
- * Collects all items from any DataProviderResult into a flat array.
54
- * Useful for components that need a complete list before rendering (e.g. tree branches).
55
- * Respects the AbortSignal — stops accumulating if cancelled mid-stream.
56
- */
57
- declare function collectDataResult<T>(result: DataProviderResult<T>, signal: AbortSignal): Promise<readonly T[]>;
58
- //#endregion
59
- //#region src/common/types.d.ts
60
- type TreeItem = {
61
- /** Unique identifier within the tree. */key: string; /** Visible label text. */
62
- label: string; /** When true the node cannot have children and will not show an expand affordance. */
63
- isLeaf?: boolean; /** Arbitrary application data associated with this node. */
64
- data?: unknown; /** Icon name passed to an icon component, if icons are enabled. */
65
- icon?: string; /** Tooltip text shown on hover. */
66
- tooltip?: string; /** Optional string value, e.g. for use as a command/route. */
67
- value?: string;
68
- };
69
- /** A node in the tree, potentially containing lazily-loaded children. */
70
- type TreeNode = {
71
- item: TreeItem;
72
- /**
73
- * Child nodes.
74
- * - `undefined` = children not yet loaded (component will call loadChildren if set)
75
- * - `[]` = confirmed leaf / empty branch
76
- * - non-empty array = loaded children
77
- */
78
- children?: TreeNode[];
79
- };
80
- /**
81
- * Callback invoked when a node's children need to be loaded.
82
- * The AbortSignal is cancelled if the request is superseded (e.g. node collapsed before load completes).
83
- * May return children synchronously, as a promise, or as a streaming async iterable of batches.
84
- */
85
- type LoadChildrenCallback = IDataProvider<{
86
- node: TreeNode;
87
- depth: number;
88
- }, TreeNode>;
89
- /**
90
- * Predicate used by search/filter controllers to determine whether a node should be visible.
91
- * Receives depth so column-scoped filtering (e.g. in ixfx-miller-list) is possible.
92
- * Tree implementations that do not need depth can simply ignore the parameter.
93
- */
94
- type TreeFilterPredicate = (node: TreeNode, depth: number) => boolean;
95
- /**
96
- * Controls how expanding a node affects its siblings.
97
- * - `'none'` — no constraint; any number of nodes may be expanded simultaneously
98
- * - `'depth'` — only one sibling at the same depth may be expanded at a time (accordion)
99
- * - `'global'` — only one node anywhere in the tree may be expanded at a time
100
- */
101
- type TreeExclusivity = `none` | `depth` | `global`;
102
- /**
103
- * Restricts which kinds of nodes may enter the selection.
104
- * Applied as a guard in all interaction modes.
105
- * - `'none'` — no node can be selected (read-only / display-only)
106
- * - `'leaf'` — only leaf nodes are selectable
107
- * - `'branch'` — only branch nodes (nodes with children) are selectable
108
- * - `'all'` — both leaf and branch nodes are selectable
109
- */
110
- type TreeSelectionFilter = `none` | `leaf` | `branch` | `all`;
111
- /**
112
- * Controls how pointer and keyboard gestures map to selection changes.
113
- * - `'implicit'` — single selection that follows the click; clicking always selects + toggles expand
114
- * - `'standard'` — single click selects+toggles; Ctrl/Cmd+click toggles item; Shift+click range-selects
115
- * - `'manual'` — component never auto-selects; use `select()`/`deselect()`/`clearSelection()` to drive state
116
- * - `'checked'` — checkboxes on every item; checkbox click toggles selection recursively; row click only expands/collapses
117
- * - `'vscode'` — like `standard` for clicks; Shift+arrow uses snapshot-based toggle-range
118
- */
119
- type TreeInteractionMode = `implicit` | `standard` | `manual` | `checked` | `vscode`;
120
- //#endregion
1
+ import { a as TreeItem, n as TreeExclusivity, o as TreeNode, r as TreeFilterPredicate, s as TreeSelectionFilter, t as LoadChildrenCallback } from "./types-DO3gt5vg.js";
121
2
  //#region src/common/tree-data-model.d.ts
122
3
  type InvalidateEvent = {
123
4
  type: `invalidate`;
@@ -130,7 +11,8 @@ type RootEvent = {
130
11
  type ModelEvent = InvalidateEvent | RootEvent;
131
12
  type ModelSubscriber = (event: ModelEvent) => void;
132
13
  type TreeDataModelOptions = {
133
- /** The initial root node. Required. */root: TreeNode;
14
+ /** The initial root node. Required. */
15
+ root: TreeNode;
134
16
  /**
135
17
  * Optional callback for lazily loading children.
136
18
  * If omitted, nodes with `children === undefined` are treated as empty branches.
@@ -222,7 +104,9 @@ declare class TreeDataModel {
222
104
  * Event name: `select`
223
105
  */
224
106
  type TreeSelectDetail = {
225
- /** The new selection set. */readonly selected: ReadonlySet<TreeNode>; /** The previous selection set (empty set if there was no prior selection). */
107
+ /** The new selection set. */
108
+ readonly selected: ReadonlySet<TreeNode>;
109
+ /** The previous selection set (empty set if there was no prior selection). */
226
110
  readonly previous: ReadonlySet<TreeNode>;
227
111
  };
228
112
  /**
@@ -379,5 +263,5 @@ interface TreeSearchHost extends TreeComponent {
379
263
  readonly updateComplete: Promise<boolean>;
380
264
  }
381
265
  //#endregion
382
- export { TreeNode as C, IDataProvider as D, DataProviderResult as E, collectDataResult as O, TreeItem as S, DataBatch as T, TreeDataModelOptions as _, TreeComponent as a, TreeFilterPredicate as b, TreeExpandEvent as c, TreeSearchHost as d, TreeSelectDetail as f, TreeDataModel as g, TreeTickleEvent as h, TreeCollapseEvent as i, TreeItemClickDetail as l, TreeTickleDetail as m, TreeActivateEvent as n, TreeComponentEventMap as o, TreeSelectEvent as p, TreeCollapseDetail as r, TreeExpandDetail as s, TreeActivateDetail as t, TreeItemClickEvent as u, LoadChildrenCallback as v, TreeSelectionFilter as w, TreeInteractionMode as x, TreeExclusivity as y };
383
- //# sourceMappingURL=tree-component-BaCSPWg1.d.ts.map
266
+ export { TreeDataModelOptions as _, TreeComponent as a, TreeExpandEvent as c, TreeSearchHost as d, TreeSelectDetail as f, TreeDataModel as g, TreeTickleEvent as h, TreeCollapseEvent as i, TreeItemClickDetail as l, TreeTickleDetail as m, TreeActivateEvent as n, TreeComponentEventMap as o, TreeSelectEvent as p, TreeCollapseDetail as r, TreeExpandDetail as s, TreeActivateDetail as t, TreeItemClickEvent as u };
267
+ //# sourceMappingURL=tree-component-DCmmKZ4j.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-component-DCmmKZ4j.d.ts","names":[],"sources":["../src/common/tree-data-model.ts","../src/common/tree-component.ts"],"mappings":";;KAOK;EAAoB;EAAoB;;KACxC;EAAc;EAAc,MAAM;;KAClC,aAAa,kBAAkB;KAE/B,mBAAmB,OAAO;KAmEnB;;EAEV,MAAM;;;;;EAKN,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgCJ;;EAMC,YAAA,SAAS;;MAUjB,QAAQ;;;;;EAQZ,QAAQ,MAAM;;;;;;;;;EAkBR,YAAY,MAAM,UAAU,eAAe,QAAQ,cAAc,QAAQ;;;;;;EAyB/E,WAAW;;;;;EAaX,QAAQ,mBAAmB,MAAM,WAAW;;;;;EAU5C,WAAW,cAAc;;;;;EAWzB,WAAW,aAAa,OAAO,QAAQ,YAAY;;;;;EAanD,SAAS,aAAa,uBAAuB;;;;;;;EAgB7C,WAAW,UAAU;;;;;;;;KC/NX;;WAED,UAAU,YAAY;;WAEtB,UAAU,YAAY;;;;;;;KAQrB;WACD,MAAM;WACN;;;;;;KAOC;WACD,MAAM;WACN;;;;;;KAOC;WACD,MAAM;WACN;;;;;;KAOC;WACD,MAAM;WACN;;;;;;KAOC;WACD,MAAM;WACN;;KAIC,kBAAkB,YAAY;KAC9B,kBAAkB,YAAY;KAC9B,oBAAoB,YAAY;KAChC,qBAAqB,YAAY;KACjC,kBAAkB,YAAY;KAC9B,oBAAoB,YAAY;UAM3B;EACf,UAAU;EACV,UAAU;EACV,YAAY;EACZ,cAAc;EACd,UAAU;EACV,YAAY;;;;;;;;;;;;;;;UAoBG,sBAAsB;;;;;;EAQrC,MAAM;;;;;;;EAQN,OAAO;;;;;;EAOP,cAAc;;;;;EAQd,cAAc;;;;;WAML,eAAe,YAAY;;;;;;EASpC,iBAAiB;;;;;;EASjB,iBAAiB;;;;;;EASjB,aAAa;;EAKb,SAAS,MAAM;;EAEf,WAAW,MAAM;;EAEjB;;;;;EAQA,aAAa;;;;;EAMb,iBAAiB,YAAY,MAAM;;;;;EAQnC,gBAAgB;IAAgB,MAAM;IAAU;;;;;;;;;;;UAejC,uBAAuB;WAC7B,YAAY;WACZ,gBAAgB"}
package/dist/tree.d.ts CHANGED
@@ -1,8 +1,14 @@
1
- import { n as TraversableTree, t as TickledController } from "./tickled-controller-BjYCzGrU.js";
2
- import { C as TreeNode, S as TreeItem, _ as TreeDataModelOptions, a as TreeComponent, b as TreeFilterPredicate, c as TreeExpandEvent, d as TreeSearchHost, f as TreeSelectDetail, g as TreeDataModel, h as TreeTickleEvent, i as TreeCollapseEvent, l as TreeItemClickDetail, m as TreeTickleDetail, n as TreeActivateEvent, o as TreeComponentEventMap, p as TreeSelectEvent, r as TreeCollapseDetail, s as TreeExpandDetail, t as TreeActivateDetail, u as TreeItemClickEvent, v as LoadChildrenCallback, w as TreeSelectionFilter, x as TreeInteractionMode, y as TreeExclusivity } from "./tree-component-BaCSPWg1.js";
3
- import { t as TreeConfig } from "./types-DSfbtHs3.js";
1
+ import { a as TreeItem, i as TreeInteractionMode, n as TreeExclusivity, o as TreeNode, r as TreeFilterPredicate, s as TreeSelectionFilter, t as LoadChildrenCallback } from "./types-DO3gt5vg.js";
2
+ import { _ as TreeDataModelOptions, a as TreeComponent, c as TreeExpandEvent, d as TreeSearchHost, f as TreeSelectDetail, g as TreeDataModel, h as TreeTickleEvent, i as TreeCollapseEvent, l as TreeItemClickDetail, m as TreeTickleDetail, n as TreeActivateEvent, o as TreeComponentEventMap, p as TreeSelectEvent, r as TreeCollapseDetail, s as TreeExpandDetail, t as TreeActivateDetail, u as TreeItemClickEvent } from "./tree-component-DCmmKZ4j.js";
3
+ import { t as TickledController } from "./tickled-controller-BF2Ea0DE.js";
4
4
  import { LitElement, PropertyValues, TemplateResult, nothing } from "lit";
5
-
5
+ import { TraversableTree } from "@ixfx/collections";
6
+ //#region src/tree/types.d.ts
7
+ /** Tree layout/display configuration (tree-specific, not shared). */
8
+ type TreeConfig = {
9
+ indent: number;
10
+ };
11
+ //#endregion
6
12
  //#region src/tree/tree-base.d.ts
7
13
  declare class TreeBaseElement extends LitElement implements TreeComponent, TreeSearchHost {
8
14
  #private;
@@ -1 +1 @@
1
- {"version":3,"file":"tree.d.ts","names":[],"sources":["../src/tree/tree-base.ts","../src/tree/tree-list.ts","../src/tree/tree-controller.ts"],"mappings":"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"}
1
+ {"version":3,"file":"tree.d.ts","names":[],"sources":["../src/tree/types.ts","../src/tree/tree-base.ts","../src/tree/tree-list.ts","../src/tree/tree-controller.ts"],"mappings":";;;;;;;KAqCY;EACV;;;;cCAW,wBAAwB,sBAAsB,eAAe;;EAExE,MAAM;EAGN,OAAO;;EAIP,cAAc;EAGd,aAAa;EAGb,iBAAiB;;EAIjB,iBAAiB;EAGjB,cAAc;YAGJ,gBAAc,IAAA;MAEpB,iBAAiB,YAAY;EAKjC,iBAAiB;EAGjB;YAGU,eAAa;YAEb,SAAO;YAWP;EAYD,QAAQ,cAAc;EA4CtB;EAKA;EAMT,aAAa;EAIb,UAAU,QAAQ,QAAQ;EAO1B,OAAO,MAAM;EAWb,SAAS,MAAM;EAYf;EAWA,WAAW;EAoCX,eAAe,YAAY,MAAM;EASjC,YAAY;IAAgB,MAAM;IAAU;;YA6DlC,kBAAkB,MAAM,UAAU,iBAAiB,wBAAwB;YAW3E,iBAAiB,MAAM,UAAU,eAAe,QAAQ;YAuJxD,qBAAqB,OAAO,YAAY,MAAM,UAAU;YAsJxD,YAAY,MAAM;YAIlB,WAAW,MAAM;YAIjB,YAAY,MAAM;gBAiBd,gBAAgB;YAgRpB,0BAA0B,wBAAwB;YAIzC,UAAM;YAoDf,YAAY,MAAM,UAAU,gBAAgB;SAiCtC,sBAAM;;QA4GhB;YACI;IACR,kBAAkB;;;UAIL,gCAAgC;EAC/C,cAAc;EACd,UAAU;EACV,YAAY;EACZ,UAAU;EACV,UAAU;EACV,YAAY;;UAGG;EACf,oBAAoB,gBAAgB,yBAClC,MAAM,GACN,WAAW,MAAM,iBAAiB,OAAO,wBAAwB,aACjE,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB;EAEtB,uBAAuB,gBAAgB,yBACrC,MAAM,GACN,WAAW,MAAM,iBAAiB,OAAO,wBAAwB,aACjE,oBAAoB,mCAEpB,cACA,UAAU,oCACV,oBAAoB;;;;cC/lCX,wBAAwB;;YAGhB,UAAM;YAsBN,kBAAkB,MAAM,UAAU,gBAAgB;YAiClD,YAAY,MAAM,UAAU,gBAAgB;SA0B/C,sBAAM;;QA0EhB;YACI;IACR,kBAAkB;;;UAIL;EACf,oBAAoB,gBAAgB,yBAClC,MAAM,GACN,WAAW,MAAM,iBAAiB,OAAO,wBAAwB,aACjE,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB;;;;KClMZ,sBAAsB;EAChC,cAAc,OAAO,GAAG,MAAM,gBAAgB,OAAO;;cAG1C,eAAe;;EAWxB,YAAA,MAAM,gBAAgB,IACtB,SAAS,iBACT,SAAS,sBAAsB;EAOjC;EAwBA;EAKA,gBAAgB,YAAY,OAAO"}
package/dist/tree.js CHANGED
@@ -1,2 +1,2 @@
1
- import { i as TreeDataModel, n as TreeListElement, r as TreeBaseElement, t as TreeController } from "./tree-D84RUgFC.js";
1
+ import { i as TreeDataModel, n as TreeListElement, r as TreeBaseElement, t as TreeController } from "./tree-BnvzhsAw.js";
2
2
  export { TreeBaseElement, TreeController, TreeDataModel, TreeListElement };
@@ -0,0 +1,130 @@
1
+ //#region src/common/data-provider.d.ts
2
+ /**
3
+ * Shared data-provider contract used by components that render a list of items.
4
+ *
5
+ * A provider is a simple callable — the consuming component (via DataController)
6
+ * manages the request lifecycle, cancellation, and reactive state.
7
+ */
8
+ /**
9
+ * One batch of items within a streaming provider response.
10
+ *
11
+ * For sync and async one-shot providers, the DataController synthesises a single
12
+ * DataBatch internally — you only need this type when writing a streaming provider.
13
+ */
14
+ type DataBatch<T> = {
15
+ /** Items delivered in this batch. */
16
+ readonly items: readonly T[];
17
+ /**
18
+ * When true, replace all previously accumulated items with this batch instead
19
+ * of appending. Useful for re-ranked or filtered results mid-stream.
20
+ * Default: false (append).
21
+ */
22
+ replace?: boolean;
23
+ /**
24
+ * Provider's current estimate of the total number of items that will be
25
+ * delivered across all batches. Enables progress percentage in the consumer.
26
+ * May be refined in subsequent batches as the estimate improves.
27
+ * Omit when the total is unknown.
28
+ */
29
+ total?: number;
30
+ };
31
+ /**
32
+ * The three return modes a provider may use.
33
+ * DataController normalises all three — callers can mix modes freely.
34
+ *
35
+ * - `readonly T[]` — sync, items available immediately
36
+ * - `Promise<readonly T[]>` — async one-shot, resolves to the full result
37
+ * - `AsyncIterable<DataBatch<T>>` — streaming, batches arrive over time
38
+ */
39
+ type DataProviderResult<T> = readonly T[] | Promise<readonly T[]> | AsyncIterable<DataBatch<T>>;
40
+ /**
41
+ * A data provider callable.
42
+ *
43
+ * @typeParam TQuery - The input that scopes the request (e.g. `string` for
44
+ * autocomplete, `{ node, depth }` for a tree branch, `void` for a plain list).
45
+ * @typeParam TItem - The item type produced.
46
+ *
47
+ * The AbortSignal is cancelled when the consumer supersedes the request (e.g.
48
+ * a new query arrives before the previous one completes). Streaming providers
49
+ * should check `signal.aborted` between yields or pass the signal to their
50
+ * underlying fetch calls.
51
+ */
52
+ type IDataProvider<TQuery, TItem> = (query: TQuery, signal: AbortSignal) => DataProviderResult<TItem>;
53
+ /**
54
+ * Collects all items from any DataProviderResult into a flat array.
55
+ * Useful for components that need a complete list before rendering (e.g. tree branches).
56
+ * Respects the AbortSignal — stops accumulating if cancelled mid-stream.
57
+ */
58
+ declare function collectDataResult<T>(result: DataProviderResult<T>, signal: AbortSignal): Promise<readonly T[]>;
59
+ //#endregion
60
+ //#region src/common/types.d.ts
61
+ type TreeItem = {
62
+ /** Unique identifier within the tree. */
63
+ key: string;
64
+ /** Visible label text. */
65
+ label: string;
66
+ /** When true the node cannot have children and will not show an expand affordance. */
67
+ isLeaf?: boolean;
68
+ /** Arbitrary application data associated with this node. */
69
+ data?: unknown;
70
+ /** Icon name passed to an icon component, if icons are enabled. */
71
+ icon?: string;
72
+ /** Tooltip text shown on hover. */
73
+ tooltip?: string;
74
+ /** Optional string value, e.g. for use as a command/route. */
75
+ value?: string;
76
+ };
77
+ /** A node in the tree, potentially containing lazily-loaded children. */
78
+ type TreeNode = {
79
+ item: TreeItem;
80
+ /**
81
+ * Child nodes.
82
+ * - `undefined` = children not yet loaded (component will call loadChildren if set)
83
+ * - `[]` = confirmed leaf / empty branch
84
+ * - non-empty array = loaded children
85
+ */
86
+ children?: TreeNode[];
87
+ };
88
+ /**
89
+ * Callback invoked when a node's children need to be loaded.
90
+ * The AbortSignal is cancelled if the request is superseded (e.g. node collapsed before load completes).
91
+ * May return children synchronously, as a promise, or as a streaming async iterable of batches.
92
+ */
93
+ type LoadChildrenCallback = IDataProvider<{
94
+ node: TreeNode;
95
+ depth: number;
96
+ }, TreeNode>;
97
+ /**
98
+ * Predicate used by search/filter controllers to determine whether a node should be visible.
99
+ * Receives depth so column-scoped filtering (e.g. in ixfx-miller-list) is possible.
100
+ * Tree implementations that do not need depth can simply ignore the parameter.
101
+ */
102
+ type TreeFilterPredicate = (node: TreeNode, depth: number) => boolean;
103
+ /**
104
+ * Controls how expanding a node affects its siblings.
105
+ * - `'none'` — no constraint; any number of nodes may be expanded simultaneously
106
+ * - `'depth'` — only one sibling at the same depth may be expanded at a time (accordion)
107
+ * - `'global'` — only one node anywhere in the tree may be expanded at a time
108
+ */
109
+ type TreeExclusivity = `none` | `depth` | `global`;
110
+ /**
111
+ * Restricts which kinds of nodes may enter the selection.
112
+ * Applied as a guard in all interaction modes.
113
+ * - `'none'` — no node can be selected (read-only / display-only)
114
+ * - `'leaf'` — only leaf nodes are selectable
115
+ * - `'branch'` — only branch nodes (nodes with children) are selectable
116
+ * - `'all'` — both leaf and branch nodes are selectable
117
+ */
118
+ type TreeSelectionFilter = `none` | `leaf` | `branch` | `all`;
119
+ /**
120
+ * Controls how pointer and keyboard gestures map to selection changes.
121
+ * - `'implicit'` — single selection that follows the click; clicking always selects + toggles expand
122
+ * - `'standard'` — single click selects+toggles; Ctrl/Cmd+click toggles item; Shift+click range-selects
123
+ * - `'manual'` — component never auto-selects; use `select()`/`deselect()`/`clearSelection()` to drive state
124
+ * - `'checked'` — checkboxes on every item; checkbox click toggles selection recursively; row click only expands/collapses
125
+ * - `'vscode'` — like `standard` for clicks; Shift+arrow uses snapshot-based toggle-range
126
+ */
127
+ type TreeInteractionMode = `implicit` | `standard` | `manual` | `checked` | `vscode`;
128
+ //#endregion
129
+ export { TreeItem as a, DataBatch as c, collectDataResult as d, TreeInteractionMode as i, DataProviderResult as l, TreeExclusivity as n, TreeNode as o, TreeFilterPredicate as r, TreeSelectionFilter as s, LoadChildrenCallback as t, IDataProvider as u };
130
+ //# sourceMappingURL=types-DO3gt5vg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DO3gt5vg.d.ts","names":[],"sources":["../src/common/data-provider.ts","../src/common/types.ts"],"mappings":";;;;;;;;;;;;;KAaY,UAAU;;WAEX,gBAAgB;;;;;;EAMzB;;;;;;;EAOA;;;;;;;;;;KAWU,mBAAmB,cAChB,MACT,iBAAiB,OACjB,cAAc,UAAU;;;;;;;;;;;;;KAclB,cAAc,QAAQ,UAChC,OAAO,QACP,QAAQ,gBACL,mBAAmB;;;;;;iBAOF,kBAAkB,GACtC,QAAQ,mBAAmB,IAC3B,QAAQ,cACP,iBAAiB;;;KC7DR;;EAEV;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;KAIU;EACV,MAAM;;;;;;;EAON,WAAW;;;;;;;KAQD,uBAAuB;EAAgB,MAAM;EAAU;GAAiB;;;;;;KAOxE,uBAAuB,MAAM,UAAU;;;;;;;KAQvC;;;;;;;;;KAUA;;;;;;;;;KAUA"}
@@ -0,0 +1,86 @@
1
+ import { t as __decorate } from "./decorate-VRK8rslU.js";
2
+ import { property } from "lit/decorators.js";
3
+ //#region src/mixins/wheel-nudge.ts
4
+ /**
5
+ * Mixin that adds mousewheel support with an optional `lighttouch` hover mode.
6
+ *
7
+ * Activation rule:
8
+ * - If the host's `disabled` property is truthy → ignore.
9
+ * - Otherwise, handle if EITHER:
10
+ * • `lighttouch` is true AND the pointer is currently over the host, OR
11
+ * • the host (or anything in its shadow tree) currently has focus.
12
+ *
13
+ * Direction convention: `deltaY < 0` (wheel up/away) → +1 step; `deltaY > 0` → -1 step.
14
+ *
15
+ * Consumers must implement `_applyWheelDelta(direction, event)` (see
16
+ * {@link WheelNudgeConsumer}). The mixin calls `event.preventDefault()` only when
17
+ * the activation rule accepts the event, so page scroll is suppressed during
18
+ * interaction without blocking wheel events over empty space.
19
+ *
20
+ * Usage:
21
+ *
22
+ * ```ts
23
+ * class MyInput extends WheelNudgeMixin(LitElement) {
24
+ * protected _applyWheelDelta(direction, event) {
25
+ * const step = resolveAxisStep(this.range, this.stops, this.step, event.shiftKey);
26
+ * this._stepByDelta(direction, step);
27
+ * }
28
+ * }
29
+ * ```
30
+ */
31
+ function WheelNudgeMixin(superClass) {
32
+ class WheelNudgeMixinClass extends superClass {
33
+ constructor(..._args) {
34
+ super(..._args);
35
+ this.lighttouch = false;
36
+ this._isHovering = false;
37
+ this._onPointerEnter = () => {
38
+ this._isHovering = true;
39
+ };
40
+ this._onPointerLeave = () => {
41
+ this._isHovering = false;
42
+ };
43
+ this._onWheel = (event) => {
44
+ if (!this._shouldHandleWheel()) return;
45
+ event.preventDefault();
46
+ const direction = (event.deltaY !== 0 ? event.deltaY : event.deltaX) < 0 ? 1 : -1;
47
+ this._applyWheelDelta(direction, event);
48
+ };
49
+ }
50
+ connectedCallback() {
51
+ super.connectedCallback();
52
+ this.addEventListener(`pointerenter`, this._onPointerEnter);
53
+ this.addEventListener(`pointerleave`, this._onPointerLeave);
54
+ this.addEventListener(`wheel`, this._onWheel, { passive: false });
55
+ }
56
+ disconnectedCallback() {
57
+ super.disconnectedCallback();
58
+ this.removeEventListener(`pointerenter`, this._onPointerEnter);
59
+ this.removeEventListener(`pointerleave`, this._onPointerLeave);
60
+ this.removeEventListener(`wheel`, this._onWheel);
61
+ this._isHovering = false;
62
+ }
63
+ /**
64
+ * Override to restrict when wheel is handled (e.g. editable-number rejects
65
+ * while the user is typing). Default: respect `disabled`, then apply the
66
+ * focus-or-lighttouch rule described on the mixin.
67
+ */
68
+ _shouldHandleWheel() {
69
+ if (this.disabled) return false;
70
+ if (this.lighttouch && this._isHovering) return true;
71
+ if (this.matches?.(`:focus, :focus-within`)) return true;
72
+ const root = this.renderRoot;
73
+ if (root && root.activeElement !== null) return true;
74
+ return false;
75
+ }
76
+ }
77
+ __decorate([property({
78
+ type: Boolean,
79
+ reflect: true
80
+ })], WheelNudgeMixinClass.prototype, "lighttouch", void 0);
81
+ return WheelNudgeMixinClass;
82
+ }
83
+ //#endregion
84
+ export { WheelNudgeMixin as t };
85
+
86
+ //# sourceMappingURL=wheel-nudge-BlSCe_hD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wheel-nudge-BlSCe_hD.js","names":[],"sources":["../src/mixins/wheel-nudge.ts"],"sourcesContent":["import type { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\n\ntype Constructor<T = object> = new (...args: any[]) => T;\n\n/**\n * Direction of a wheel tick. `+1` for `deltaY < 0` (wheel up/away), `-1` for\n * `deltaY > 0` (wheel down/toward).\n */\nexport type WheelDirection = 1 | -1;\n\n/**\n * Abstract surface a consumer of {@link WheelNudgeMixin} must implement.\n *\n * `_applyWheelDelta` is called once per handled wheel tick. The consumer is\n * expected to reuse its existing arrow-key step math (typically a shared\n * `_stepByDelta(direction, effectiveStep)` private method) and call it here.\n *\n * `_shouldHandleWheel` may be overridden to restrict when the wheel acts\n * (e.g. editable-number rejects while the user is typing).\n */\nexport interface WheelNudgeConsumer {\n _applyWheelDelta(direction: WheelDirection, event: WheelEvent): void;\n _shouldHandleWheel(): boolean;\n}\n\n/**\n * Internal: the surface a {@link WheelNudgeMixin}-decorated class exposes to\n * TypeScript — its own members plus the consumer contract.\n */\nexport type WheelNudgeConsumerType<TBase> = TBase & WheelNudgeConsumer;\ntype WheelNudgeMixinBase<T> = T extends Constructor<infer U> ? U : never;\ntype WheelNudgeMixinResult<T extends Constructor<LitElement>>\n = Constructor<WheelNudgeConsumerType<WheelNudgeMixinBase<T>>> & T;\n\n/**\n * Mixin that adds mousewheel support with an optional `lighttouch` hover mode.\n *\n * Activation rule:\n * - If the host's `disabled` property is truthy → ignore.\n * - Otherwise, handle if EITHER:\n * • `lighttouch` is true AND the pointer is currently over the host, OR\n * • the host (or anything in its shadow tree) currently has focus.\n *\n * Direction convention: `deltaY < 0` (wheel up/away) → +1 step; `deltaY > 0` → -1 step.\n *\n * Consumers must implement `_applyWheelDelta(direction, event)` (see\n * {@link WheelNudgeConsumer}). The mixin calls `event.preventDefault()` only when\n * the activation rule accepts the event, so page scroll is suppressed during\n * interaction without blocking wheel events over empty space.\n *\n * Usage:\n *\n * ```ts\n * class MyInput extends WheelNudgeMixin(LitElement) {\n * protected _applyWheelDelta(direction, event) {\n * const step = resolveAxisStep(this.range, this.stops, this.step, event.shiftKey);\n * this._stepByDelta(direction, step);\n * }\n * }\n * ```\n */\nexport function WheelNudgeMixin<T extends Constructor<LitElement>>(superClass: T): WheelNudgeMixinResult<T> {\n class WheelNudgeMixinClass extends superClass {\n /**\n * When true, the wheel adjusts the value simply when the pointer is hovering\n * over the host (no focus required). When false (default), the host must\n * have focus for the wheel to act.\n */\n @property({ type: Boolean, reflect: true })\n lighttouch = false;\n\n /**\n * Imperative hover flag — not Lit-reactive (avoids update churn for what\n * is purely an interaction-time predicate).\n */\n _isHovering = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`pointerenter`, this._onPointerEnter);\n this.addEventListener(`pointerleave`, this._onPointerLeave);\n this.addEventListener(`wheel`, this._onWheel, { passive: false });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointerenter`, this._onPointerEnter);\n this.removeEventListener(`pointerleave`, this._onPointerLeave);\n this.removeEventListener(`wheel`, this._onWheel);\n this._isHovering = false;\n }\n\n _onPointerEnter = (): void => {\n this._isHovering = true;\n };\n\n _onPointerLeave = (): void => {\n this._isHovering = false;\n };\n\n /**\n * Override to restrict when wheel is handled (e.g. editable-number rejects\n * while the user is typing). Default: respect `disabled`, then apply the\n * focus-or-lighttouch rule described on the mixin.\n */\n _shouldHandleWheel(): boolean {\n const anyThis = this as unknown as { disabled?: boolean };\n if (anyThis.disabled)\n return false;\n if (this.lighttouch && this._isHovering)\n return true;\n if (this.matches?.(`:focus, :focus-within`))\n return true;\n const root = this.renderRoot;\n if (root && (root as ShadowRoot).activeElement !== null)\n return true;\n return false;\n }\n\n _onWheel = (event: WheelEvent): void => {\n if (!this._shouldHandleWheel())\n return;\n event.preventDefault();\n // Some browsers (notably when the user holds Shift) send `deltaY=0`\n // and route the scroll into `deltaX` instead. Use whichever axis\n // actually moved so the direction sign matches the user's intent.\n const delta = event.deltaY !== 0 ? event.deltaY : event.deltaX;\n const direction: WheelDirection = delta < 0 ? 1 : -1;\n (this as unknown as WheelNudgeConsumer)._applyWheelDelta(direction, event);\n };\n }\n return WheelNudgeMixinClass as unknown as WheelNudgeMixinResult<T>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DA,SAAgB,gBAAmD,YAAyC;CAC1G,MAAM,6BAA6B,WAAW;;;GAO/B,KAAA,aAAA;GAMC,KAAA,cAAA;GAiBgB,KAAA,wBAAA;IAC5B,KAAK,cAAc;GACrB;GAE8B,KAAA,wBAAA;IAC5B,KAAK,cAAc;GACrB;GAqBY,KAAA,YAAA,UAA4B;IACtC,IAAI,CAAC,KAAK,mBAAmB,GAC3B;IACF,MAAM,eAAe;IAKrB,MAAM,aADQ,MAAM,WAAW,IAAI,MAAM,SAAS,MAAM,UACd,IAAI,IAAI;IAClD,KAAwC,iBAAiB,WAAW,KAAK;GAC3E;;EApDA,oBAAmC;GACjC,MAAM,kBAAkB;GACxB,KAAK,iBAAiB,gBAAgB,KAAK,eAAe;GAC1D,KAAK,iBAAiB,gBAAgB,KAAK,eAAe;GAC1D,KAAK,iBAAiB,SAAS,KAAK,UAAU,EAAE,SAAS,MAAM,CAAC;EAClE;EAEA,uBAAsC;GACpC,MAAM,qBAAqB;GAC3B,KAAK,oBAAoB,gBAAgB,KAAK,eAAe;GAC7D,KAAK,oBAAoB,gBAAgB,KAAK,eAAe;GAC7D,KAAK,oBAAoB,SAAS,KAAK,QAAQ;GAC/C,KAAK,cAAc;EACrB;;;;;;EAeA,qBAA8B;GAE5B,IAAI,KAAQ,UACV,OAAO;GACT,IAAI,KAAK,cAAc,KAAK,aAC1B,OAAO;GACT,IAAI,KAAK,UAAU,uBAAuB,GACxC,OAAO;GACT,MAAM,OAAO,KAAK;GAClB,IAAI,QAAS,KAAoB,kBAAkB,MACjD,OAAO;GACT,OAAO;EACT;CAaF;CA9DG,WAAA,CAAA,SAAS;EAAE,MAAM;EAAS,SAAS;CAAK,CAAC,CAAA,GAAA,qBAAA,WAAA,cAAA,KAAA,CAAA;CA+D5C,OAAO;AACT"}
@@ -0,0 +1,29 @@
1
+ import { LitElement } from "lit";
2
+ //#region src/mixins/wheel-nudge.d.ts
3
+ /**
4
+ * Direction of a wheel tick. `+1` for `deltaY < 0` (wheel up/away), `-1` for
5
+ * `deltaY > 0` (wheel down/toward).
6
+ */
7
+ type WheelDirection = 1 | -1;
8
+ /**
9
+ * Abstract surface a consumer of {@link WheelNudgeMixin} must implement.
10
+ *
11
+ * `_applyWheelDelta` is called once per handled wheel tick. The consumer is
12
+ * expected to reuse its existing arrow-key step math (typically a shared
13
+ * `_stepByDelta(direction, effectiveStep)` private method) and call it here.
14
+ *
15
+ * `_shouldHandleWheel` may be overridden to restrict when the wheel acts
16
+ * (e.g. editable-number rejects while the user is typing).
17
+ */
18
+ interface WheelNudgeConsumer {
19
+ _applyWheelDelta(direction: WheelDirection, event: WheelEvent): void;
20
+ _shouldHandleWheel(): boolean;
21
+ }
22
+ /**
23
+ * Internal: the surface a {@link WheelNudgeMixin}-decorated class exposes to
24
+ * TypeScript — its own members plus the consumer contract.
25
+ */
26
+ type WheelNudgeConsumerType<TBase> = TBase & WheelNudgeConsumer;
27
+ //#endregion
28
+ export { WheelNudgeConsumerType as n, WheelDirection as t };
29
+ //# sourceMappingURL=wheel-nudge-DgMTRYlh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wheel-nudge-DgMTRYlh.d.ts","names":[],"sources":["../src/mixins/wheel-nudge.ts"],"mappings":";;;;;;KASY;;;;;;;;;;;UAYK;EACf,iBAAiB,WAAW,gBAAgB,OAAO;EACnD;;;;;;KAOU,uBAAuB,SAAS,QAAQ"}
@@ -1,11 +1,13 @@
1
1
  import { LitElement, PropertyValues } from "lit";
2
-
3
2
  //#region src/plots/colour-map.d.ts
4
3
  type ColourMode = `fixed` | `opacity` | `hue` | `saturation` | `lightness` | `scale`;
5
4
  type ColourMapConfig = {
6
- mode: ColourMode; /** Parsed colours for 'scale' mode. Must have ≥ 2 entries. */
7
- palette: string[]; /** ixfx easing name applied before the colour mode mapping. Takes precedence over valueMap. */
8
- easingName: string; /** Custom value mapping fn (0..1 → 0..1). Used when easingName is empty. */
5
+ mode: ColourMode;
6
+ /** Parsed colours for 'scale' mode. Must have 2 entries. */
7
+ palette: string[];
8
+ /** ixfx easing name — applied before the colour mode mapping. Takes precedence over valueMap. */
9
+ easingName: string;
10
+ /** Custom value mapping fn (0..1 → 0..1). Used when easingName is empty. */
9
11
  valueMap: ((v: number) => number) | null;
10
12
  };
11
13
  type ColourResult = {
@@ -283,6 +285,12 @@ interface PlotMultiAxis {
283
285
  //#endregion
284
286
  //#region src/plots/plot-histogram.d.ts
285
287
  type PlotHistogramOrientation = `horizontal` | `vertical`;
288
+ /**
289
+ * - `hover`: floating `ixfx-tooltip` bubble, shown/hidden with a debounce delay.
290
+ * - `inline`: the title overlay-text switches to the hovered bucket's value, instantly.
291
+ * - `none`: no hover feedback.
292
+ */
293
+ type PlotHistogramValueTooltips = `hover` | `inline` | `none`;
286
294
  type PlotHistogramBucketClickDetail = {
287
295
  readonly bucketIndex: number;
288
296
  readonly valueMin: number;
@@ -300,15 +308,30 @@ declare class PlotHistogram extends LitElement {
300
308
  min?: number;
301
309
  max?: number;
302
310
  capacity: number;
311
+ /**
312
+ * Fallback overlay-text, shown when nothing is hovered.
313
+ * Not reflected to the native `title` attribute, so the browser's own hover tooltip doesn't show.
314
+ */
303
315
  title: string;
304
316
  paused: boolean;
317
+ /** How hovering a bucket is communicated: a floating tooltip, the inline overlay-text, or nothing. */
318
+ valueTooltips: PlotHistogramValueTooltips;
319
+ /** Delay (ms) before the `hover` tooltip appears/disappears. Switching directly between buckets is instant. */
320
+ tooltipDelay: number;
321
+ /** Max rate (ms) at which an already-shown value display refreshes to match live-changing bucket data. */
322
+ valueUpdateInterval: number;
323
+ /** Override to customize the value/frequency label used by the tooltip and overlay text. */
324
+ valueFormat: (valueMin: number, valueMax: number, frequency: number) => string;
305
325
  private _width;
306
326
  private _height;
327
+ private _hoveredIndex;
328
+ private _inlineOverlayText;
307
329
  add(v: number): void;
308
330
  set(values: number[]): void;
309
331
  clear(): void;
310
332
  protected firstUpdated(_changed: PropertyValues): void;
311
333
  protected updated(changed: PropertyValues): void;
334
+ disconnectedCallback(): void;
312
335
  render(): import("lit").TemplateResult<1>;
313
336
  static styles: import("lit").CSSResult;
314
337
  }
@@ -359,7 +382,7 @@ declare global {
359
382
  interface HTMLElementTagNameMap {
360
383
  'ixfx-plot-xy-axis': PlotXyAxis;
361
384
  }
362
- } //# sourceMappingURL=xy-axis.d.ts.map
385
+ }
363
386
  //#endregion
364
- export { ColourMode as C, parseColourScaleAttr as D, computeColour as E, readBaseColour as O, ColourMapConfig as S, applyAgeModification as T, PlotSingleAxisPointerMoveEvent as _, PlotHistogramBucketClickDetail as a, PlotDataSeries as b, PlotHistogramOrientation as c, PlotMultiAxisDataPointClickEvent as d, PlotMultiAxisElementEventMap as f, PlotSingleAxisPointerMoveDetail as g, PlotSingleAxisElementEventMap as h, PlotHistogram as i, PlotMultiAxis as l, PlotSingleAxis as m, XyAgeStyle as n, PlotHistogramBucketClickEvent as o, PlotMultiAxisLayout as p, XyDrawStyle as r, PlotHistogramElementEventMap as s, PlotXyAxis as t, PlotMultiAxisDataPointClickDetail as u, SingleAxisAgeStyle as v, ColourResult as w, PlotDataSeriesOptions as x, SingleAxisDrawStyle as y };
365
- //# sourceMappingURL=xy-axis-BeWRMmbo.d.ts.map
387
+ export { ColourMapConfig as C, computeColour as D, applyAgeModification as E, parseColourScaleAttr as O, PlotDataSeriesOptions as S, ColourResult as T, PlotSingleAxisPointerMoveDetail as _, PlotHistogramBucketClickDetail as a, SingleAxisDrawStyle as b, PlotHistogramOrientation as c, PlotMultiAxisDataPointClickDetail as d, PlotMultiAxisDataPointClickEvent as f, PlotSingleAxisElementEventMap as g, PlotSingleAxis as h, PlotHistogram as i, readBaseColour as k, PlotHistogramValueTooltips as l, PlotMultiAxisLayout as m, XyAgeStyle as n, PlotHistogramBucketClickEvent as o, PlotMultiAxisElementEventMap as p, XyDrawStyle as r, PlotHistogramElementEventMap as s, PlotXyAxis as t, PlotMultiAxis as u, PlotSingleAxisPointerMoveEvent as v, ColourMode as w, PlotDataSeries as x, SingleAxisAgeStyle as y };
388
+ //# sourceMappingURL=xy-axis-5KhVTNoX.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xy-axis-5KhVTNoX.d.ts","names":[],"sources":["../src/plots/colour-map.ts","../src/plots/data.ts","../src/plots/single-axis.ts","../src/plots/multi-axis.ts","../src/plots/plot-histogram.ts","../src/plots/xy-axis.ts"],"mappings":"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"}