@ixfx/components 0.4.2 → 0.4.4

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 (225) hide show
  1. package/bundle/index.d.ts +435 -1193
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +7765 -20670
  4. package/bundle/index.js.map +1 -1
  5. package/dist/ac-text.d.ts +12 -7
  6. package/dist/ac-text.d.ts.map +1 -1
  7. package/dist/ac-text.js +2 -3
  8. package/dist/ac-text.js.map +1 -1
  9. package/dist/{button-C3fLMKUv.js → button-DxYee1ZH.js} +2 -2
  10. package/dist/{button-C3fLMKUv.js.map → button-DxYee1ZH.js.map} +1 -1
  11. package/dist/button.d.ts +1 -2
  12. package/dist/button.d.ts.map +1 -1
  13. package/dist/button.js +1 -2
  14. package/dist/checkbox.d.ts +0 -1
  15. package/dist/checkbox.d.ts.map +1 -1
  16. package/dist/checkbox.js +1 -1
  17. package/dist/checkbox.js.map +1 -1
  18. package/dist/{colour-picker-0sgAha1T.js → colour-picker-BacNRabo.js} +14 -16
  19. package/dist/colour-picker-BacNRabo.js.map +1 -0
  20. package/dist/colour-picker.d.ts +1 -1
  21. package/dist/colour-picker.js +1 -1
  22. package/dist/crumbs.d.ts +5 -2
  23. package/dist/crumbs.d.ts.map +1 -1
  24. package/dist/crumbs.js +45 -20
  25. package/dist/crumbs.js.map +1 -1
  26. package/dist/data-display.d.ts +1 -2
  27. package/dist/data-display.d.ts.map +1 -1
  28. package/dist/data-display.js +25 -23
  29. package/dist/data-display.js.map +1 -1
  30. package/dist/{data-provider-DgI909FP.js → data-provider-35TyWclX.js} +2 -2
  31. package/dist/data-provider-35TyWclX.js.map +1 -0
  32. package/dist/{decorate-DdjvVHS-.js → decorate-VRK8rslU.js} +2 -2
  33. package/dist/{decorate-DdjvVHS-.js.map → decorate-VRK8rslU.js.map} +1 -1
  34. package/dist/editable-label.d.ts +1 -2
  35. package/dist/editable-label.d.ts.map +1 -1
  36. package/dist/editable-label.js +1 -1
  37. package/dist/editable-label.js.map +1 -1
  38. package/dist/{hex-editor-WZrjRtvL.js → hex-editor-Bk6rxhfg.js} +9 -11
  39. package/dist/hex-editor-Bk6rxhfg.js.map +1 -0
  40. package/dist/{hex-editor-CMIxtNgT.d.ts → hex-editor-Caq8vNQk.d.ts} +2 -3
  41. package/dist/hex-editor-Caq8vNQk.d.ts.map +1 -0
  42. package/dist/hex.d.ts +1 -1
  43. package/dist/hex.js +1 -1
  44. package/dist/highlight-B-eQrhhb.js.map +1 -1
  45. package/dist/{icon-Ndo40kNO.js → icon-B22XVlCt.js} +6 -4
  46. package/dist/{icon-Ndo40kNO.js.map → icon-B22XVlCt.js.map} +1 -1
  47. package/dist/{icon-epZd-JIO.d.ts → icon-DpA9x2Ve.d.ts} +3 -4
  48. package/dist/icon-DpA9x2Ve.d.ts.map +1 -0
  49. package/dist/icons.d.ts +2 -2
  50. package/dist/icons.js +1 -1
  51. package/dist/{incr-search-CeERfijK.js → incr-search-2pz21xtR.js} +9 -6
  52. package/dist/incr-search-2pz21xtR.js.map +1 -0
  53. package/dist/incr-search.d.ts +1 -1
  54. package/dist/incr-search.js +1 -1
  55. package/dist/{index-CowKi2mo.d.ts → index-BeuCXtiO.d.ts} +3 -4
  56. package/dist/index-BeuCXtiO.d.ts.map +1 -0
  57. package/dist/{index-D87kRcEs.d.ts → index-BtGFYfaK.d.ts} +2 -1
  58. package/dist/index-BtGFYfaK.d.ts.map +1 -0
  59. package/dist/{index-JuEVfmr-.d.ts → index-CoqtMSd9.d.ts} +6 -4
  60. package/dist/index-CoqtMSd9.d.ts.map +1 -0
  61. package/dist/{index-9fGVAg1d.d.ts → index-Cxwxtj6g.d.ts} +3 -3
  62. package/dist/index-Cxwxtj6g.d.ts.map +1 -0
  63. package/dist/index-D_ftz_IT.d.ts +184 -0
  64. package/dist/index-D_ftz_IT.d.ts.map +1 -0
  65. package/dist/{index-_RTQSKHi.d.ts → index-DfEkTGvT.d.ts} +11 -11
  66. package/dist/index-DfEkTGvT.d.ts.map +1 -0
  67. package/dist/index.d.ts +45 -30
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +304 -3075
  70. package/dist/index.js.map +1 -1
  71. package/dist/keyboard-B5xD7Fz-.js +36 -0
  72. package/dist/keyboard-B5xD7Fz-.js.map +1 -0
  73. package/dist/{labelled-input-base-Cz6qE6Dk.d.ts → labelled-input-base-DiTme1JO.d.ts} +2 -3
  74. package/dist/labelled-input-base-DiTme1JO.d.ts.map +1 -0
  75. package/dist/{labelled-input-base-9K_w3oLj.js → labelled-input-base-hoKGwyKT.js} +2 -2
  76. package/dist/{labelled-input-base-9K_w3oLj.js.map → labelled-input-base-hoKGwyKT.js.map} +1 -1
  77. package/dist/labelled-radial-input.d.ts +6 -5
  78. package/dist/labelled-radial-input.d.ts.map +1 -1
  79. package/dist/labelled-radial-input.js +7 -3
  80. package/dist/labelled-radial-input.js.map +1 -1
  81. package/dist/labelled-range-input.d.ts +1 -1
  82. package/dist/labelled-range-input.js +27 -3
  83. package/dist/labelled-range-input.js.map +1 -1
  84. package/dist/led.d.ts +1 -2
  85. package/dist/led.d.ts.map +1 -1
  86. package/dist/led.js +1 -1
  87. package/dist/led.js.map +1 -1
  88. package/dist/{menu-vjoiHZ13.js → menu-g6yd7ddN.js} +8 -9
  89. package/dist/menu-g6yd7ddN.js.map +1 -0
  90. package/dist/{menu-item-COx-Azgj.d.ts → menu-item-DSyf9f_L.d.ts} +4 -4
  91. package/dist/menu-item-DSyf9f_L.d.ts.map +1 -0
  92. package/dist/{menu-item-BrIuORYD.js → menu-item-NUKwJ4s5.js} +3 -4
  93. package/dist/{menu-item-BrIuORYD.js.map → menu-item-NUKwJ4s5.js.map} +1 -1
  94. package/dist/menu.d.ts +2 -2
  95. package/dist/menu.js +2 -2
  96. package/dist/miller.d.ts +8 -5
  97. package/dist/miller.d.ts.map +1 -1
  98. package/dist/miller.js +22 -24
  99. package/dist/miller.js.map +1 -1
  100. package/dist/narrowed-text.d.ts +7 -3
  101. package/dist/narrowed-text.d.ts.map +1 -1
  102. package/dist/narrowed-text.js +73 -47
  103. package/dist/narrowed-text.js.map +1 -1
  104. package/dist/panel.d.ts +1 -1
  105. package/dist/panel.d.ts.map +1 -1
  106. package/dist/panel.js +2 -2
  107. package/dist/panel.js.map +1 -1
  108. package/dist/plots.d.ts +2 -2
  109. package/dist/plots.js +1 -1
  110. package/dist/polar-pad.d.ts +15 -3
  111. package/dist/polar-pad.d.ts.map +1 -1
  112. package/dist/polar-pad.js +64 -11
  113. package/dist/polar-pad.js.map +1 -1
  114. package/dist/{radial-input-CpQPs1Mp.d.ts → radial-input-DXMN55Nz.d.ts} +6 -4
  115. package/dist/radial-input-DXMN55Nz.d.ts.map +1 -0
  116. package/dist/{radial-input-DZ7eQCcM.js → radial-input-DxCrt_NE.js} +41 -19
  117. package/dist/radial-input-DxCrt_NE.js.map +1 -0
  118. package/dist/radial-input.d.ts +1 -1
  119. package/dist/radial-input.js +1 -1
  120. package/dist/range-input.d.ts +15 -4
  121. package/dist/range-input.d.ts.map +1 -1
  122. package/dist/range-input.js +23 -2
  123. package/dist/range-input.js.map +1 -1
  124. package/dist/range.d.ts +15 -4
  125. package/dist/range.d.ts.map +1 -1
  126. package/dist/range.js +23 -2
  127. package/dist/range.js.map +1 -1
  128. package/dist/selecthorizontal.d.ts +1 -2
  129. package/dist/selecthorizontal.d.ts.map +1 -1
  130. package/dist/selecthorizontal.js +1 -1
  131. package/dist/selecthorizontal.js.map +1 -1
  132. package/dist/slider-input-DFpG23bS.js +1592 -0
  133. package/dist/slider-input-DFpG23bS.js.map +1 -0
  134. package/dist/slider-input-XppH3vcy.d.ts +160 -0
  135. package/dist/slider-input-XppH3vcy.d.ts.map +1 -0
  136. package/dist/slider-input.d.ts +2 -0
  137. package/dist/slider-input.js +2 -0
  138. package/dist/snap-container.d.ts +1 -2
  139. package/dist/snap-container.d.ts.map +1 -1
  140. package/dist/snap-container.js +6 -5
  141. package/dist/snap-container.js.map +1 -1
  142. package/dist/split-layout.d.ts +1 -2
  143. package/dist/split-layout.d.ts.map +1 -1
  144. package/dist/split-layout.js +6 -4
  145. package/dist/split-layout.js.map +1 -1
  146. package/dist/swipe.d.ts +12 -2
  147. package/dist/swipe.d.ts.map +1 -1
  148. package/dist/swipe.js +22 -3
  149. package/dist/swipe.js.map +1 -1
  150. package/dist/{tab-list-DLzb-m-I.d.ts → tab-list-BohmbvqF.d.ts} +14 -5
  151. package/dist/tab-list-BohmbvqF.d.ts.map +1 -0
  152. package/dist/tab-list-DzknpdSo.js +592 -0
  153. package/dist/tab-list-DzknpdSo.js.map +1 -0
  154. package/dist/tabs.d.ts +2 -2
  155. package/dist/tabs.js +1 -208
  156. package/dist/{tickled-controller-BjYCzGrU.d.ts → tickled-controller-BF2Ea0DE.d.ts} +2 -31
  157. package/dist/tickled-controller-BF2Ea0DE.d.ts.map +1 -0
  158. package/dist/tickled-styles-fNDdqf6l.js.map +1 -1
  159. package/dist/{timeline-2OFtN4Ta.js → timeline-B2fgDL4U.js} +37 -1438
  160. package/dist/timeline-B2fgDL4U.js.map +1 -0
  161. package/dist/timeline.d.ts +1 -1
  162. package/dist/timeline.js +1 -1
  163. package/dist/{tooltip-RGVIwHrZ.d.ts → tooltip-BlvBUQxx.d.ts} +3 -3
  164. package/dist/tooltip-BlvBUQxx.d.ts.map +1 -0
  165. package/dist/{tree-D84RUgFC.js → tree-BnvzhsAw.js} +8 -9
  166. package/dist/tree-BnvzhsAw.js.map +1 -0
  167. package/dist/{tree-component-BaCSPWg1.d.ts → tree-component-DCmmKZ4j.d.ts} +8 -124
  168. package/dist/tree-component-DCmmKZ4j.d.ts.map +1 -0
  169. package/dist/tree.d.ts +10 -4
  170. package/dist/tree.d.ts.map +1 -1
  171. package/dist/tree.js +1 -1
  172. package/dist/types-DO3gt5vg.d.ts +130 -0
  173. package/dist/types-DO3gt5vg.d.ts.map +1 -0
  174. package/dist/wheel-nudge-BlSCe_hD.js +86 -0
  175. package/dist/wheel-nudge-BlSCe_hD.js.map +1 -0
  176. package/dist/wheel-nudge-DGrNzWuE.d.ts +29 -0
  177. package/dist/wheel-nudge-DGrNzWuE.d.ts.map +1 -0
  178. package/dist/{xy-axis-CEI7ojks.d.ts → xy-axis-5KhVTNoX.d.ts} +75 -29
  179. package/dist/xy-axis-5KhVTNoX.d.ts.map +1 -0
  180. package/dist/xy-axis-CxHC8z5E.js +1849 -0
  181. package/dist/xy-axis-CxHC8z5E.js.map +1 -0
  182. package/dist/xy-pad.d.ts +13 -2
  183. package/dist/xy-pad.d.ts.map +1 -1
  184. package/dist/xy-pad.js +47 -6
  185. package/dist/xy-pad.js.map +1 -1
  186. package/docs-user/radial-input.md +2 -2
  187. package/package.json +22 -21
  188. package/dist/colour-C3MQIjFJ-vRCdr8W-.js +0 -3732
  189. package/dist/colour-C3MQIjFJ-vRCdr8W-.js.map +0 -1
  190. package/dist/colour-picker-0sgAha1T.js.map +0 -1
  191. package/dist/data-provider-DgI909FP.js.map +0 -1
  192. package/dist/dist-CA13FvMn.js +0 -980
  193. package/dist/dist-CA13FvMn.js.map +0 -1
  194. package/dist/hex-editor-CMIxtNgT.d.ts.map +0 -1
  195. package/dist/hex-editor-WZrjRtvL.js.map +0 -1
  196. package/dist/icon-epZd-JIO.d.ts.map +0 -1
  197. package/dist/incr-search-CeERfijK.js.map +0 -1
  198. package/dist/index-9fGVAg1d.d.ts.map +0 -1
  199. package/dist/index-CowKi2mo.d.ts.map +0 -1
  200. package/dist/index-D87kRcEs.d.ts.map +0 -1
  201. package/dist/index-DgXpCg_G.d.ts +0 -1244
  202. package/dist/index-DgXpCg_G.d.ts.map +0 -1
  203. package/dist/index-JuEVfmr-.d.ts.map +0 -1
  204. package/dist/index-_RTQSKHi.d.ts.map +0 -1
  205. package/dist/keyboard-CimiEskD.js +0 -20
  206. package/dist/keyboard-CimiEskD.js.map +0 -1
  207. package/dist/labelled-input-base-Cz6qE6Dk.d.ts.map +0 -1
  208. package/dist/menu-item-COx-Azgj.d.ts.map +0 -1
  209. package/dist/menu-vjoiHZ13.js.map +0 -1
  210. package/dist/radial-input-CpQPs1Mp.d.ts.map +0 -1
  211. package/dist/radial-input-DZ7eQCcM.js.map +0 -1
  212. package/dist/tab-list-DLzb-m-I.d.ts.map +0 -1
  213. package/dist/tabs.js.map +0 -1
  214. package/dist/tickled-controller-BjYCzGrU.d.ts.map +0 -1
  215. package/dist/timeline-2OFtN4Ta.js.map +0 -1
  216. package/dist/tooltip-RGVIwHrZ.d.ts.map +0 -1
  217. package/dist/tree-D84RUgFC.js.map +0 -1
  218. package/dist/tree-component-BaCSPWg1.d.ts.map +0 -1
  219. package/dist/types-DSfbtHs3.d.ts +0 -8
  220. package/dist/types-DSfbtHs3.d.ts.map +0 -1
  221. package/dist/xy-axis-CEI7ojks.d.ts.map +0 -1
  222. package/dist/xy-axis-DbPezP6A.js +0 -7849
  223. package/dist/xy-axis-DbPezP6A.js.map +0 -1
  224. /package/bundle/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
  225. /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":";;;;;;cAsCa,eAAA,SAAwB,UAAA,YAAsB,aAAA,EAAe,cAAA;EAAA;EAExE,IAAA,EAAM,QAAA;EAGN,KAAA,EAAO,aAAA;EAOM;EAHb,YAAA,EAAc,oBAAA;EAGd,WAAA,EAAa,eAAA;EAGb,eAAA,EAAiB,mBAAA;EAUO;EANxB,eAAA,EAAiB,mBAAA;EAGjB,YAAA,EAAc,QAAA;EAAA,UAGJ,cAAA,EAAc,GAAA,CAAA,QAAA;EAAA,IAEpB,aAAA,IAAiB,WAAA,CAAY,QAAA;EAKjC,eAAA,EAAiB,mBAAA;EAGjB,yBAAA;EAAA,UAGU,aAAA,EAAa,GAAA;EAAA,UAEb,OAAA,EAAO,iBAAA;EAAA,UAWP,aAAA;EAYD,OAAA,CAAQ,YAAA,EAAc,cAAA;EA4CtB,iBAAA;EAKA,oBAAA;EAMT,SAAA,IAAa,UAAA;EAIb,SAAA,CAAU,MAAA,EAAQ,OAAA,CAAQ,UAAA;EAO1B,MAAA,CAAO,IAAA,EAAM,QAAA;EAWb,QAAA,CAAS,IAAA,EAAM,QAAA;EAYf,cAAA;EAWA,UAAA,CAAW,IAAA;EAoCX,cAAA,CAAe,SAAA,GAAY,IAAA,EAAM,QAAA;EASjC,QAAA,IAAY,aAAA;IAAgB,IAAA,EAAM,QAAA;IAAU,KAAA;EAAA;EAAA,UA6DlC,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,MAAA,WAAiB,cAAA,UAAwB,OAAA;EAAA,UAW3E,gBAAA,CAAiB,IAAA,EAAM,QAAA,EAAU,KAAA,UAAe,KAAA,GAAQ,UAAA;EAAA,UAuJxD,oBAAA,CAAqB,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,MAAA;EAAA,UAsJxD,WAAA,CAAY,IAAA,EAAM,QAAA;EAAA,UAIlB,UAAA,CAAW,IAAA,EAAM,QAAA;EAAA,UAIjB,WAAA,CAAY,IAAA,EAAM,QAAA;EAAA,cAiBd,YAAA,IAAgB,QAAA;EAAA,UAgRpB,sBAAA,IAA0B,cAAA,UAAwB,OAAA;EAAA,UAIzC,MAAA,IAAM,cAAA;EAAA,UAoDf,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,KAAA,WAAgB,cAAA;EAAA,OAiCtC,MAAA,gBAAM,SAAA;AAAA;AAAA,QA4GhB,MAAA;EAAA,UACI,qBAAA;IACR,gBAAA,EAAkB,eAAe;EAAA;AAAA;AAAA,UAIpB,uBAAA,SAAgC,qBAAA;EAC/C,YAAA,EAAc,kBAAA;EACd,QAAA,EAAU,eAAA;EACV,UAAA,EAAY,iBAAA;EACZ,QAAA,EAAU,eAAA;EACV,QAAA,EAAU,eAAA;EACV,UAAA,EAAY,iBAAA;AAAA;AAAA,UAGG,eAAA;EACf,gBAAA,oBAAoC,uBAAA,EAClC,IAAA,EAAM,CAAA,EACN,QAAA,GAAW,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,uBAAA,CAAwB,CAAA,YACjE,OAAA,aAAoB,uBAAA,eAEpB,IAAA,UACA,QAAA,EAAU,kCAAA,EACV,OAAA,aAAoB,uBAAA;EAEtB,mBAAA,oBAAuC,uBAAA,EACrC,IAAA,EAAM,CAAA,EACN,QAAA,GAAW,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,uBAAA,CAAwB,CAAA,YACjE,OAAA,aAAoB,oBAAA,eAEpB,IAAA,UACA,QAAA,EAAU,kCAAA,EACV,OAAA,aAAoB,oBAAA;AAAA;;;cC/lCX,eAAA,SAAwB,eAAA;EAAA;YAGhB,MAAA,IAAM,cAAA;EAAA,UAsBN,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,KAAA,WAAgB,cAAA;EAAA,UAiClD,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,KAAA,WAAgB,cAAA;EAAA,OA0B/C,MAAA,gBAAM,SAAA;AAAA;AAAA,QA0EhB,MAAA;EAAA,UACI,qBAAA;IACR,gBAAA,EAAkB,eAAe;EAAA;AAAA;AAAA,UAIpB,eAAA;EACf,gBAAA,oBAAoC,uBAAA,EAClC,IAAA,EAAM,CAAA,EACN,QAAA,GAAW,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,uBAAA,CAAwB,CAAA,YACjE,OAAA,aAAoB,uBAAA,eAEpB,IAAA,UACA,QAAA,EAAU,kCAAA,EACV,OAAA,aAAoB,uBAAA;AAAA;;;KClMZ,qBAAA;EACV,WAAA,GAAc,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,eAAA,CAAgB,CAAA,MAAO,QAAA;AAAA;AAAA,cAG1C,cAAA;EAAA;cAWT,IAAA,EAAM,eAAA,CAAgB,CAAA,GACtB,OAAA,EAAS,eAAA,EACT,OAAA,EAAS,qBAAA,CAAsB,CAAA;EAOjC,OAAA;EAwBA,UAAA;EAKA,eAAA,CAAgB,SAAA,GAAY,KAAA,EAAO,CAAA;AAAA"}
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-DGrNzWuE.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wheel-nudge-DGrNzWuE.d.ts","names":[],"sources":["../src/mixins/wheel-nudge.ts"],"mappings":";;;;;;KASY;;;;;;;;;;;UAYK;EACf,mBAAmB,WAAW,gBAAgB,OAAO;EACrD;;;;;;KAOU,uBAAuB,SAAS,QAAQ"}