@ixfx/components 0.3.2 → 0.4.1

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 (255) hide show
  1. package/bundle/index.d.ts +1086 -603
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +16153 -15296
  4. package/bundle/index.js.map +1 -1
  5. package/bundle/style.css +14 -4
  6. package/dist/ac-text.d.ts.map +1 -1
  7. package/dist/ac-text.js +11 -6
  8. package/dist/ac-text.js.map +1 -1
  9. package/dist/{button-DMt5XWUK.js → button-C3fLMKUv.js} +4 -4
  10. package/dist/{button-DMt5XWUK.js.map → button-C3fLMKUv.js.map} +1 -1
  11. package/dist/button.d.ts.map +1 -1
  12. package/dist/button.js +1 -1
  13. package/dist/checkbox.d.ts +2 -2
  14. package/dist/checkbox.d.ts.map +1 -1
  15. package/dist/checkbox.js +14 -8
  16. package/dist/checkbox.js.map +1 -1
  17. package/dist/{colour-C3MQIjFJ-BLXg8W3U.js → colour-C3MQIjFJ-vRCdr8W-.js} +146 -552
  18. package/dist/colour-C3MQIjFJ-vRCdr8W-.js.map +1 -0
  19. package/dist/{colour-picker-K6zu82lm.js → colour-picker-0sgAha1T.js} +14 -9
  20. package/dist/colour-picker-0sgAha1T.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 +1 -1
  24. package/dist/crumbs.d.ts.map +1 -1
  25. package/dist/crumbs.js +11 -6
  26. package/dist/crumbs.js.map +1 -1
  27. package/dist/data-display.d.ts +9 -4
  28. package/dist/data-display.d.ts.map +1 -1
  29. package/dist/data-display.js +270 -43
  30. package/dist/data-display.js.map +1 -1
  31. package/dist/data-provider-DgI909FP.js +23 -0
  32. package/dist/data-provider-DgI909FP.js.map +1 -0
  33. package/dist/{decorate-D7rC1gLP.js → decorate-DdjvVHS-.js} +2 -2
  34. package/dist/{decorate-D7rC1gLP.js.map → decorate-DdjvVHS-.js.map} +1 -1
  35. package/dist/{defaults-C7elhuyJ.js → defaults-C3b9OWJD.js} +2 -2
  36. package/dist/{defaults-C7elhuyJ.js.map → defaults-C3b9OWJD.js.map} +1 -1
  37. package/dist/{dist-TAGYwaju.js → dist-CA13FvMn.js} +7 -66
  38. package/dist/dist-CA13FvMn.js.map +1 -0
  39. package/dist/editable-label.d.ts.map +1 -1
  40. package/dist/editable-label.js +3 -2
  41. package/dist/editable-label.js.map +1 -1
  42. package/dist/fallbacks-pNMOMx38.js +168 -0
  43. package/dist/fallbacks-pNMOMx38.js.map +1 -0
  44. package/dist/{hex-editor-DlfoA65y.d.ts → hex-editor-CMIxtNgT.d.ts} +1 -1
  45. package/dist/hex-editor-CMIxtNgT.d.ts.map +1 -0
  46. package/dist/{hex-editor-CsN_ySkH.js → hex-editor-WZrjRtvL.js} +3 -3
  47. package/dist/{hex-editor-CsN_ySkH.js.map → hex-editor-WZrjRtvL.js.map} +1 -1
  48. package/dist/hex.d.ts +1 -1
  49. package/dist/hex.js +1 -1
  50. package/dist/{highlight-TPbSHruI.js → highlight-B-eQrhhb.js} +1 -1
  51. package/dist/{highlight-TPbSHruI.js.map → highlight-B-eQrhhb.js.map} +1 -1
  52. package/dist/{icon-9NWTXtE1.js → icon-Ndo40kNO.js} +6 -5
  53. package/dist/icon-Ndo40kNO.js.map +1 -0
  54. package/dist/{icon-Dm_DHDz6.d.ts → icon-epZd-JIO.d.ts} +2 -2
  55. package/dist/icon-epZd-JIO.d.ts.map +1 -0
  56. package/dist/icons.d.ts +2 -2
  57. package/dist/icons.js +3 -3
  58. package/dist/{incr-search-DSKKsk6w.js → incr-search-CeERfijK.js} +2 -2
  59. package/dist/{incr-search-DSKKsk6w.js.map → incr-search-CeERfijK.js.map} +1 -1
  60. package/dist/incr-search.d.ts +1 -1
  61. package/dist/incr-search.js +2 -2
  62. package/dist/{index-hXFn14tM.d.ts → index-BMjri2-S.d.ts} +2 -2
  63. package/dist/{index-hXFn14tM.d.ts.map → index-BMjri2-S.d.ts.map} +1 -1
  64. package/dist/{index-DSlPeWLK.d.ts → index-CWpNcQKE.d.ts} +5 -5
  65. package/dist/index-CWpNcQKE.d.ts.map +1 -0
  66. package/dist/{index-DLkSKL4T.d.ts → index-CowKi2mo.d.ts} +1 -1
  67. package/dist/index-CowKi2mo.d.ts.map +1 -0
  68. package/dist/{index-B1hNR7Z9.d.ts → index-D87kRcEs.d.ts} +1 -1
  69. package/dist/{index-B1hNR7Z9.d.ts.map → index-D87kRcEs.d.ts.map} +1 -1
  70. package/dist/{index-CnL9krsH.d.ts → index-DgXpCg_G.d.ts} +32 -26
  71. package/dist/index-DgXpCg_G.d.ts.map +1 -0
  72. package/dist/{index-iZLld8Ca.d.ts → index-JuEVfmr-.d.ts} +2 -2
  73. package/dist/index-JuEVfmr-.d.ts.map +1 -0
  74. package/dist/index.d.ts +432 -121
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +2369 -1706
  77. package/dist/index.js.map +1 -1
  78. package/dist/interaction-D6efrBLo.js +1 -0
  79. package/dist/{keyboard-De_vOHLg.js → keyboard-CimiEskD.js} +1 -1
  80. package/dist/{keyboard-De_vOHLg.js.map → keyboard-CimiEskD.js.map} +1 -1
  81. package/dist/{labelled-input-base-CqPL5rKm.js → labelled-input-base-9K_w3oLj.js} +2 -2
  82. package/dist/{labelled-input-base-CqPL5rKm.js.map → labelled-input-base-9K_w3oLj.js.map} +1 -1
  83. package/dist/{labelled-input-base-BVvNeb5R.d.ts → labelled-input-base-Cz6qE6Dk.d.ts} +1 -1
  84. package/dist/labelled-input-base-Cz6qE6Dk.d.ts.map +1 -0
  85. package/dist/labelled-radial-input.d.ts +2 -2
  86. package/dist/labelled-radial-input.d.ts.map +1 -1
  87. package/dist/labelled-radial-input.js +7 -6
  88. package/dist/labelled-radial-input.js.map +1 -1
  89. package/dist/labelled-range-input.d.ts +1 -1
  90. package/dist/labelled-range-input.js +2 -2
  91. package/dist/led.d.ts +1 -1
  92. package/dist/led.d.ts.map +1 -1
  93. package/dist/led.js +2 -2
  94. package/dist/led.js.map +1 -1
  95. package/dist/{menu-item-CKRfP0pN.js → menu-item-BrIuORYD.js} +20 -10
  96. package/dist/menu-item-BrIuORYD.js.map +1 -0
  97. package/dist/{menu-item-ClQF2DKN.d.ts → menu-item-COx-Azgj.d.ts} +1 -1
  98. package/dist/menu-item-COx-Azgj.d.ts.map +1 -0
  99. package/dist/{menu-DJJuCm-5.js → menu-vjoiHZ13.js} +30 -17
  100. package/dist/menu-vjoiHZ13.js.map +1 -0
  101. package/dist/menu.d.ts +2 -2
  102. package/dist/menu.js +2 -2
  103. package/dist/miller.d.ts +2 -2
  104. package/dist/miller.d.ts.map +1 -1
  105. package/dist/miller.js +18 -11
  106. package/dist/miller.js.map +1 -1
  107. package/dist/narrowed-text.d.ts.map +1 -1
  108. package/dist/narrowed-text.js +7 -5
  109. package/dist/narrowed-text.js.map +1 -1
  110. package/dist/panel.d.ts +1 -1
  111. package/dist/panel.d.ts.map +1 -1
  112. package/dist/panel.js +5 -4
  113. package/dist/panel.js.map +1 -1
  114. package/dist/plots.d.ts +2 -2
  115. package/dist/plots.js +2 -2
  116. package/dist/polar-pad.d.ts +1 -1
  117. package/dist/polar-pad.d.ts.map +1 -1
  118. package/dist/polar-pad.js +10 -4
  119. package/dist/polar-pad.js.map +1 -1
  120. package/dist/{popup-ImtS9KnS.js → popup-DiWMxsWj.js} +1 -1
  121. package/dist/{popup-ImtS9KnS.js.map → popup-DiWMxsWj.js.map} +1 -1
  122. package/dist/prominence-DlFShic3.js +104 -0
  123. package/dist/prominence-DlFShic3.js.map +1 -0
  124. package/dist/{radial-input-LUSBEycd.d.ts → radial-input-CpQPs1Mp.d.ts} +1 -1
  125. package/dist/radial-input-CpQPs1Mp.d.ts.map +1 -0
  126. package/dist/{radial-input-DZA6WaFu.js → radial-input-DZ7eQCcM.js} +11 -6
  127. package/dist/radial-input-DZ7eQCcM.js.map +1 -0
  128. package/dist/radial-input.d.ts +1 -1
  129. package/dist/radial-input.js +1 -1
  130. package/dist/range-input.d.ts +1 -1
  131. package/dist/range-input.d.ts.map +1 -1
  132. package/dist/range-input.js +9 -4
  133. package/dist/range-input.js.map +1 -1
  134. package/dist/range.d.ts +1 -1
  135. package/dist/range.d.ts.map +1 -1
  136. package/dist/range.js +5 -3
  137. package/dist/range.js.map +1 -1
  138. package/dist/{registry-Q2gYQCHM.js → registry-CkW7q09Q.js} +1 -1
  139. package/dist/{registry-Q2gYQCHM.js.map → registry-CkW7q09Q.js.map} +1 -1
  140. package/dist/selecthorizontal.d.ts +1 -1
  141. package/dist/selecthorizontal.d.ts.map +1 -1
  142. package/dist/selecthorizontal.js +4 -3
  143. package/dist/selecthorizontal.js.map +1 -1
  144. package/dist/snap-container.d.ts.map +1 -1
  145. package/dist/snap-container.js +1 -1
  146. package/dist/split-layout.d.ts +1 -1
  147. package/dist/split-layout.d.ts.map +1 -1
  148. package/dist/split-layout.js +6 -5
  149. package/dist/split-layout.js.map +1 -1
  150. package/dist/style.css +14 -4
  151. package/dist/swipe.d.ts.map +1 -1
  152. package/dist/swipe.js +9 -4
  153. package/dist/swipe.js.map +1 -1
  154. package/dist/{tab-list-BnqISNvO.d.ts → tab-list-DLzb-m-I.d.ts} +2 -2
  155. package/dist/tab-list-DLzb-m-I.d.ts.map +1 -0
  156. package/dist/tabs.d.ts +1 -1
  157. package/dist/tabs.js +10 -4
  158. package/dist/tabs.js.map +1 -1
  159. package/dist/{tickled-controller-Cq1Va0rR.d.ts → tickled-controller-BjYCzGrU.d.ts} +2 -2
  160. package/dist/tickled-controller-BjYCzGrU.d.ts.map +1 -0
  161. package/dist/{tickled-styles-Bg3QbcrD.js → tickled-styles-fNDdqf6l.js} +1 -17
  162. package/dist/{tickled-styles-Bg3QbcrD.js.map → tickled-styles-fNDdqf6l.js.map} +1 -1
  163. package/dist/{timeline-Bh0PhlKW.js → timeline-2OFtN4Ta.js} +2 -2
  164. package/dist/{timeline-Bh0PhlKW.js.map → timeline-2OFtN4Ta.js.map} +1 -1
  165. package/dist/timeline.d.ts +1 -1
  166. package/dist/timeline.js +1 -1
  167. package/dist/{tooltip-DMxmBNky.js → tooltip-CJt3WLmN.js} +1 -1
  168. package/dist/{tooltip-DMxmBNky.js.map → tooltip-CJt3WLmN.js.map} +1 -1
  169. package/dist/{tooltip-CwGfb4lp.d.ts → tooltip-RGVIwHrZ.d.ts} +1 -1
  170. package/dist/{tooltip-CwGfb4lp.d.ts.map → tooltip-RGVIwHrZ.d.ts.map} +1 -1
  171. package/dist/{tree-CvvKbO-f.js → tree-CJWpMUvD.js} +113 -103
  172. package/dist/tree-CJWpMUvD.js.map +1 -0
  173. package/dist/{tree-component-D8Bg48tt.d.ts → tree-component-BcO26Xvt.d.ts} +65 -3
  174. package/dist/tree-component-BcO26Xvt.d.ts.map +1 -0
  175. package/dist/tree.d.ts +15 -15
  176. package/dist/tree.d.ts.map +1 -1
  177. package/dist/tree.js +1 -1
  178. package/dist/{types-BKaqnpwx.d.ts → types-DSfbtHs3.d.ts} +1 -1
  179. package/dist/types-DSfbtHs3.d.ts.map +1 -0
  180. package/dist/{xy-axis-DL0tfJDr.js → xy-axis-CK64haaK.js} +1831 -359
  181. package/dist/xy-axis-CK64haaK.js.map +1 -0
  182. package/dist/{xy-axis-D9uwpGTT.d.ts → xy-axis-McdUpcYr.d.ts} +102 -3
  183. package/dist/xy-axis-McdUpcYr.d.ts.map +1 -0
  184. package/dist/xy-pad.d.ts +1 -1
  185. package/dist/xy-pad.d.ts.map +1 -1
  186. package/dist/xy-pad.js +11 -6
  187. package/dist/xy-pad.js.map +1 -1
  188. package/docs-user/README.md +45 -0
  189. package/docs-user/ac-text.md +67 -0
  190. package/docs-user/ac-token.md +187 -0
  191. package/docs-user/button.md +355 -0
  192. package/docs-user/checkbox.md +62 -0
  193. package/docs-user/colour-picker.md +237 -0
  194. package/docs-user/crumbs.md +66 -0
  195. package/docs-user/data-display.md +98 -0
  196. package/docs-user/editable-label.md +244 -0
  197. package/docs-user/grouped-item-lister.md +424 -0
  198. package/docs-user/icons.md +191 -0
  199. package/docs-user/incr-search.md +94 -0
  200. package/docs-user/labelled-radial-input.md +204 -0
  201. package/docs-user/labelled-range-input.md +194 -0
  202. package/docs-user/led.md +40 -0
  203. package/docs-user/menu.md +319 -0
  204. package/docs-user/miller.md +453 -0
  205. package/docs-user/narrowed-text.md +72 -0
  206. package/docs-user/panel.md +250 -0
  207. package/docs-user/plots.md +361 -0
  208. package/docs-user/polar-pad.md +228 -0
  209. package/docs-user/radial-input.md +559 -0
  210. package/docs-user/range-input.md +264 -0
  211. package/docs-user/range.md +12 -0
  212. package/docs-user/selecthorizontal.md +32 -0
  213. package/docs-user/snap-container.md +132 -0
  214. package/docs-user/split-layout.md +232 -0
  215. package/docs-user/swipe.md +44 -0
  216. package/docs-user/tabs.md +217 -0
  217. package/docs-user/timeline.md +116 -0
  218. package/docs-user/transitory-label.md +120 -0
  219. package/docs-user/tree.md +592 -0
  220. package/docs-user/user-catalog.md +165 -0
  221. package/docs-user/user-theming.md +379 -0
  222. package/docs-user/util.md +122 -0
  223. package/docs-user/vertical-list.md +351 -0
  224. package/docs-user/xy-pad.md +94 -0
  225. package/package.json +19 -18
  226. package/dist/colour-C3MQIjFJ-BLXg8W3U.js.map +0 -1
  227. package/dist/colour-picker-K6zu82lm.js.map +0 -1
  228. package/dist/dist-BX0OVIm7.js +0 -1290
  229. package/dist/dist-BX0OVIm7.js.map +0 -1
  230. package/dist/dist-TAGYwaju.js.map +0 -1
  231. package/dist/hex-editor-DlfoA65y.d.ts.map +0 -1
  232. package/dist/icon-9NWTXtE1.js.map +0 -1
  233. package/dist/icon-Dm_DHDz6.d.ts.map +0 -1
  234. package/dist/index-CnL9krsH.d.ts.map +0 -1
  235. package/dist/index-DLkSKL4T.d.ts.map +0 -1
  236. package/dist/index-DSlPeWLK.d.ts.map +0 -1
  237. package/dist/index-iZLld8Ca.d.ts.map +0 -1
  238. package/dist/interaction-DG7X1rhI.js +0 -1
  239. package/dist/labelled-input-base-BVvNeb5R.d.ts.map +0 -1
  240. package/dist/menu-DJJuCm-5.js.map +0 -1
  241. package/dist/menu-item-CKRfP0pN.js.map +0 -1
  242. package/dist/menu-item-ClQF2DKN.d.ts.map +0 -1
  243. package/dist/prominence--ic9uWBl.js +0 -98
  244. package/dist/prominence--ic9uWBl.js.map +0 -1
  245. package/dist/radial-input-DZA6WaFu.js.map +0 -1
  246. package/dist/radial-input-LUSBEycd.d.ts.map +0 -1
  247. package/dist/tab-list-BnqISNvO.d.ts.map +0 -1
  248. package/dist/tickled-controller-Cq1Va0rR.d.ts.map +0 -1
  249. package/dist/tree-CvvKbO-f.js.map +0 -1
  250. package/dist/tree-component-D8Bg48tt.d.ts.map +0 -1
  251. package/dist/types-BKaqnpwx.d.ts.map +0 -1
  252. package/dist/xy-axis-D9uwpGTT.d.ts.map +0 -1
  253. package/dist/xy-axis-DL0tfJDr.js.map +0 -1
  254. /package/bundle/{chunk-pbuEa-1d.js → chunk-D7D4PA-g.js} +0 -0
  255. /package/dist/{chunk-pbuEa-1d.js → chunk-D7D4PA-g.js} +0 -0
@@ -0,0 +1,66 @@
1
+ # `ixfx-crumb-navigation`
2
+
3
+ Breadcrumb navigation with lazy-loading child support. Uses the same `TreeNode` / `TreeItem` data model as `ixfx-tree-list`, allowing easy swapping between the two components.
4
+
5
+ ```html
6
+ <ixfx-crumb-navigation></ixfx-crumb-navigation>
7
+ ```
8
+
9
+ ```js
10
+ const nav = document.querySelector('ixfx-crumb-navigation');
11
+ nav.model = {
12
+ root: {
13
+ item: { key: 'root', label: 'Home' },
14
+ children: [
15
+ { item: { key: 'docs', label: 'Documentation' }, children: [...] },
16
+ { item: { key: 'api', label: 'API' } }
17
+ ]
18
+ },
19
+ selectedNode: { item: { key: 'docs', label: 'Documentation' } }
20
+ };
21
+ ```
22
+
23
+ ### Properties / attributes
24
+
25
+ | Attribute / Property | Type | Default | Description |
26
+ |-----------------------|---------------------------------|-------------|--------------------------------------------------|
27
+ | `root` | `TreeNode \| undefined` | `undefined` | Root node of the tree |
28
+ | `model` | `TreeDataModel \| undefined` | `undefined` | Optional reactive tree data model |
29
+ | `selectedNode` | `TreeNode \| undefined` | `undefined` | Currently selected node |
30
+ | `loadChildren` | `LoadChildrenCallback \| undefined` | `undefined` | Callback for lazy-loading children |
31
+ | `filterPredicate` | `TreeFilterPredicate \| undefined` | `undefined` | Filter function for nodes |
32
+ | `exclusivity` | `TreeExclusivity` | `'none'` | Selection exclusivity mode |
33
+ | `selectionFilter` | `TreeSelectionFilter` | `'leaf'` | Which nodes can be selected |
34
+
35
+ ### Events
36
+
37
+ | Event | Detail | Description |
38
+ |---------------|-----------------------------------------------------|--------------------------------------|
39
+ | `select` | `{ selected: Set<TreeNode>, previous: Set<TreeNode> \| undefined }` | Fired when selection changes |
40
+ | `item-click` | `{ node: TreeNode, depth: number }` | Fired when a breadcrumb label is clicked |
41
+ | `expand` | `{ node: TreeNode, depth: number }` | Fired when a caret is clicked for a node with unloaded children |
42
+ | `tickle` | `{ node: TreeNode, depth: number }` | Fired when mouse enters a crumb |
43
+ | `activate` | `TreeActivateEvent` | Fired when a node is activated |
44
+
45
+ ### Methods
46
+
47
+ | Method | Returns | Description |
48
+ |-------------------------|---------|------------------------------------------------|
49
+ | `navigateTo(keys)` | `boolean` | Navigate to a node by key path. Returns false if not found. |
50
+ | `navigateToNode(predicate)` | `boolean` | Navigate to the first node matching a predicate. |
51
+
52
+ ### CSS custom properties
53
+
54
+ | Property | Default | Description |
55
+ |------------------|-------------------------|------------------------------|
56
+ | `--text-highlight` | `var(--accent)` | Highlight color on hover |
57
+ | `--separator` | `var(--surface-muted-text)` | Separator character color |
58
+ | `--padding-s` | `var(--space-xs)` | Padding between items |
59
+
60
+ ### CSS parts
61
+
62
+ | Part | Description |
63
+ |-----------|--------------------------|
64
+ | `crumb-segment` | Individual crumb segment |
65
+ | `caret` | The dropdown caret button |
66
+ | `label` | Clickable label text |
@@ -0,0 +1,98 @@
1
+ # `ixfx-data-display`
2
+
3
+ A debug data display component that renders key-value pairs from a plain object. Supports 7 inline render modes (`led`, `plot`, `plot-xy`, `plot-heat`, `plot-histogram`, `time-elapsed`, `hide`) via `configure()`, automatic mode assignment via `automap`, and recursive nested objects.
4
+
5
+ ```html
6
+ <ixfx-data-display></ixfx-data-display>
7
+ ```
8
+
9
+ ```js
10
+ const display = document.querySelector('ixfx-data-display');
11
+ display.updateData({
12
+ temperature: 23.45,
13
+ humidity: 0.62,
14
+ status: 'active',
15
+ });
16
+ ```
17
+
18
+ ### Usage modes
19
+
20
+ **Text-only** (default, no config): renders all values as text. Nested objects create child `<ixfx-data-display>` elements.
21
+
22
+ **`automap` attribute**: boolean values → LED, numbers → plot, objects → recursive child display, everything else → text.
23
+
24
+ **`configure(config)`**: explicit render style per dot-path. Replaces any previous config and re-renders.
25
+
26
+ ```js
27
+ display.configure([
28
+ ['flag', 'led'],
29
+ ['position', 'plot-xy'],
30
+ ['timestamp', 'time-elapsed'],
31
+ ['sensor.gyro', 'plot'],
32
+ ['sensor.accel', 'hide'],
33
+ ]);
34
+ ```
35
+
36
+ ### Methods
37
+
38
+ | Method | Arguments | Description |
39
+ |--------|-----------|-------------|
40
+ | `updateData(value)` | `Record<string, unknown> \| unknown[]` | Store full data and update all renderers; plot values accumulate only on change |
41
+ | `displayData(o)` | `Record<string, unknown> \| unknown[]` | Update data without change tracking |
42
+ | `formatValue(v, options?)` | `unknown, FormattingOptions?` | Format a single value to string |
43
+ | `configure(config)` | `[path: string, style: RendererStyle, options?: Record<string, unknown>][]` | Set render styles per path |
44
+
45
+ ### Properties / attributes
46
+
47
+ | Attribute / Property | Type | Default | Description |
48
+ |----------------------|------|---------|-------------|
49
+ | `automap` | `boolean` | `false` | Auto-assign render styles: boolean→led, number→plot |
50
+ | `configure()` | method | — | Explicit render style config |
51
+
52
+ ### Render styles
53
+
54
+ | Style | Tag | Value types | Behaviour |
55
+ |-------|-----|-------------|-----------|
56
+ | `led` | `ixfx-led` | `boolean`, `number` | Toggle or proportional brightness (number mapped 0..1) |
57
+ | `plot` | `ixfx-plot-single-axis` / `ixfx-plot-multi-axis` | `number`, `number[]`, `Record<string, number>` | Accumulated time-series |
58
+ | `plot-xy` | `ixfx-plot-xy-axis` | `[x, y]`, `{ x, y }`, object with 2 numeric properties | XY scatter |
59
+ | `plot-heat` | `ixfx-plot-histogram` | `number` | Heatmap (full-height bars, density via opacity) |
60
+ | `plot-histogram` | `ixfx-plot-histogram` | `number` | Histogram (variable bar lengths) |
61
+ | `time-elapsed` | `span` | `Date`, `number` (ms/ISO) | Relative time from value to now |
62
+ | `hide` | — | any | Row not rendered |
63
+
64
+ ### Options (third element of configure tuple)
65
+
66
+ | Option | Type | Applies to | Description |
67
+ |--------|------|------------|-------------|
68
+ | `capacity` | `number` | all plots | Max data points (default: varies by plot) |
69
+ | `resolution` | `number` | `plot-heat`, `plot-histogram` | Bucket size (default: `0.1`) |
70
+ | `drawStyle` | `string` | `plot` (single-axis), `plot-xy` | Render style (`line-sharp`, `line-round`, `dots`, `circles`, etc.) |
71
+ | `orientation` | `string` | `plot-heat`, `plot-histogram` | `horizontal` or `vertical` |
72
+ | `layout` | `string` | `plot` (multi-axis) | `overlap`, `horizontal`, `vertical`, `grid` |
73
+
74
+ ### Formatting options
75
+
76
+ Passed to `formatValue()`:
77
+
78
+ | Option | Type | Description |
79
+ |--------|------|-------------|
80
+ | `precision` | `number` | Fixed decimal places |
81
+ | `roundNumbers` | `number` | Round to N significant figures |
82
+
83
+ ### CSS custom properties
84
+
85
+ Renders rows in a CSS grid (`auto auto` columns). Uses standard surface variables:
86
+
87
+ - `--surface-3` — component background
88
+ - `--surface-2-text` — label text colour
89
+ - `--border` — row separator
90
+ - `--space-m`, `--space-s` — spacing
91
+ - `--font-mono` — monospace font for values
92
+ - `--size` — LED size (via ixfx-led default of `1ex`)
93
+
94
+ ### TypeScript types
95
+
96
+ ```ts
97
+ import type { RendererStyle, FormattingOptions } from 'ixfxfun-components';
98
+ ```
@@ -0,0 +1,244 @@
1
+ # `ixfx-editable-label` & `ixfx-editable-number`
2
+
3
+ Inline editable text components. `ixfx-editable-number` extends `ixfx-editable-label` with drag-to-adjust and fill-bar visualization.
4
+
5
+ ---
6
+
7
+ ## `ixfx-editable-label`
8
+
9
+ An inline text label that can be edited in place.
10
+
11
+ ### Modes
12
+
13
+ | `mode` attribute | Behaviour |
14
+ |---|---|
15
+ | `label` (default) | Renders as plain text; click to enter edit mode |
16
+ | `editor` | Always renders as a box; click or focus activates editing |
17
+
18
+ ### Attributes
19
+
20
+ | Attribute | Type | Default | Description |
21
+ |---|---|---|---|
22
+ | `mode` | `label \| editor` | `label` | Display mode |
23
+ | `entry-mode` | `free \| text \| number \| percent` | `free` | Character filter during input |
24
+ | `value` | string | `""` | Current value |
25
+ | `disabled` | boolean | — | Disables interaction |
26
+ | `placeholder` | string | `""` | Shown when value is empty |
27
+
28
+ **Entry modes:**
29
+ - `free` — no restrictions
30
+ - `text` — letters and spaces only
31
+ - `number` — digits, `.`, `-`
32
+ - `percent` — digits, `.`, `%` (strips `%` on commit; appends `%` on display)
33
+
34
+ ### JavaScript Properties
35
+
36
+ These are set on the element object, not as HTML attributes.
37
+
38
+ ```js
39
+ const el = document.querySelector('ixfx-editable-label');
40
+
41
+ // Custom commit validator — return false to reject and revert
42
+ el.validator = (value) => value.trim().length >= 3;
43
+
44
+ // Transform committed value for display only (stored value unchanged)
45
+ el.formatter = (value) => value.toUpperCase();
46
+
47
+ // Override displayed text entirely (editing shows raw value)
48
+ el.displayText = '★ Hidden ★';
49
+ el.displayText = undefined; // clear override
50
+ ```
51
+
52
+ ### Events
53
+
54
+ | Event | Detail | When |
55
+ |---|---|---|
56
+ | `change` | `{ value: string }` | On commit (Enter or blur); not fired if value unchanged |
57
+
58
+ ```js
59
+ el.addEventListener('change', (e) => {
60
+ console.log(e.detail.value);
61
+ });
62
+ ```
63
+
64
+ The event bubbles and is composed (crosses shadow DOM boundaries).
65
+
66
+ ### CSS Variables
67
+
68
+ | Variable | Default | Description |
69
+ |---|---|---|
70
+ | `--label-font-size` | `var(--text-m, 12px)` | Font size |
71
+ | `--label-font-family` | `var(--font-family, system-ui)` | Font family |
72
+ | `--label-color` | `var(--surface-text)` | Text colour |
73
+ | `--label-muted-color` | `var(--surface-muted-text)` | Placeholder colour |
74
+ | `--label-padding` | `var(--space-xs, 3px) var(--space-s, 4px)` | Inner padding |
75
+ | `--label-radius` | `var(--radius-s, 3px)` | Border radius |
76
+ | `--label-align` | `center` | Text alignment: `left`, `center`, or `right` |
77
+
78
+ ### Keyboard
79
+
80
+ | Key | Action |
81
+ |---|---|
82
+ | `Enter` | Commit value |
83
+ | `Escape` | Cancel and revert |
84
+
85
+ ### Usage Examples
86
+
87
+ **Basic label (click to edit):**
88
+ ```html
89
+ <ixfx-editable-label value="Hello"></ixfx-editable-label>
90
+ ```
91
+
92
+ **Always-visible editor box:**
93
+ ```html
94
+ <ixfx-editable-label mode="editor" value="Edit me"></ixfx-editable-label>
95
+ ```
96
+
97
+ **Numbers only with placeholder:**
98
+ ```html
99
+ <ixfx-editable-label
100
+ mode="editor"
101
+ entry-mode="number"
102
+ placeholder="0"
103
+ value="42"
104
+ ></ixfx-editable-label>
105
+ ```
106
+
107
+ **Custom validator and formatter:**
108
+ ```html
109
+ <ixfx-editable-label id="name" value="Ada"></ixfx-editable-label>
110
+ <script>
111
+ const el = document.querySelector('#name');
112
+ el.validator = (v) => v.trim().length > 0;
113
+ el.formatter = (v) => v.trim();
114
+ </script>
115
+ ```
116
+
117
+ **Currency display:**
118
+ ```html
119
+ <ixfx-editable-label id="price" entry-mode="number" value="9.99"></ixfx-editable-label>
120
+ <script>
121
+ document.querySelector('#price').formatter =
122
+ (v) => isNaN(parseFloat(v)) ? v : `$${parseFloat(v).toFixed(2)}`;
123
+ </script>
124
+ ```
125
+
126
+ ---
127
+
128
+ ## `ixfx-editable-number`
129
+
130
+ Extends `ixfx-editable-label` with Ableton-style drag interaction and an optional fill-bar visualization. See above for all shared attributes, events, CSS variables, and JavaScript properties — only the differences are documented here.
131
+
132
+ ### Interaction Model
133
+
134
+ | Action | Effect |
135
+ |---|---|
136
+ | Click | Focuses the control |
137
+ | Drag up | Increases value |
138
+ | Drag down | Decreases value |
139
+ | Printable key while focused | Enters text-edit mode |
140
+ | Enter / blur | Commits typed value |
141
+ | Escape | Cancels typed edit and restores previous value |
142
+
143
+ ### Additional Attributes
144
+
145
+ | Attribute | Type | Default | Description |
146
+ |---|---|---|---|
147
+ | `min` | number | — | Minimum value (no clamping if unset) |
148
+ | `max` | number | — | Maximum value (no clamping if unset) |
149
+ | `step` | number | — | Snap increment; also informs decimal-place display |
150
+ | `drag-sensitivity` | number | `1` | Steps changed per pixel of drag |
151
+ | `precision` | number | `0` | Decimal places used when rounding drag-produced values |
152
+ | `fill-style` | `linear` \| `circular` | — | Fill-bar style; omit to disable fill bar |
153
+ | `linear-style` | `range` \| `bipolar` \| `unipolar` | `range` | How value maps to fill (linear mode only) |
154
+ | `circular-style` | `grow` \| `offset` \| `dot` | `grow` | How value maps to fill (circular mode only) |
155
+ | `no-drag` | boolean | — | Disables drag interaction; text editing still works |
156
+
157
+ **`drag-sensitivity`** scales relative to `step`. With `step=0.01` and `drag-sensitivity=1`, each pixel of drag moves the value by 0.01 — sweeping `min=0` to `max=1` takes 100 px. Increase for faster/coarser control, decrease for finer.
158
+
159
+ **`precision`** only affects drag-produced values. Typed values are never precision-rounded — the user can always enter more decimal places than `precision` allows.
160
+
161
+ ### CSS Variables (fill bar)
162
+
163
+ | Variable | Default | Description |
164
+ |---|---|---|
165
+ | `--fill-color` | `var(--accent)` | Fill bar colour |
166
+ | `--fill-opacity` | `0.25` | Fill bar opacity (0–1) |
167
+ | `--fill-image` | — | Override the entire `background-image`; use `var(--value)` for position |
168
+
169
+ The `--value` custom property (0–1) is set dynamically on the host element and is available in CSS expressions.
170
+
171
+ ### Usage Examples
172
+
173
+ **Integer 0–100 with fill bar:**
174
+ ```html
175
+ <ixfx-editable-number
176
+ min="0" max="100" step="1"
177
+ value="50"
178
+ fill-style="linear"
179
+ ></ixfx-editable-number>
180
+ ```
181
+
182
+ **Fine-grained float (step=0.01, full range ~100px of drag):**
183
+ ```html
184
+ <ixfx-editable-number
185
+ min="0" max="1" step="0.01"
186
+ value="0.5"
187
+ fill-style="linear"
188
+ ></ixfx-editable-number>
189
+ ```
190
+
191
+ **No step — drag rounds to 1 decimal place, typed values unrestricted:**
192
+ ```html
193
+ <ixfx-editable-number
194
+ min="0" max="10"
195
+ precision="1"
196
+ value="3.5"
197
+ ></ixfx-editable-number>
198
+ ```
199
+
200
+ **Custom accent colour:**
201
+ ```html
202
+ <ixfx-editable-number
203
+ min="0" max="100" value="60"
204
+ fill-style="linear"
205
+ style="--fill-color: oklch(60% 0.2 30); --fill-opacity: 0.35;"
206
+ ></ixfx-editable-number>
207
+ ```
208
+
209
+ **Green–yellow–red gradient that reveals with value:**
210
+ ```html
211
+ <ixfx-editable-number
212
+ min="0" max="100" value="50"
213
+ fill-style="linear"
214
+ style="
215
+ --fill-image: linear-gradient(
216
+ to right,
217
+ oklch(55% 0.18 140),
218
+ oklch(78% 0.2 100),
219
+ oklch(60% 0.22 25) calc(var(--value) * 100%),
220
+ var(--surface-ll, oklch(22% 0.02 240)) calc(var(--value) * 100%)
221
+ );
222
+ "
223
+ ></ixfx-editable-number>
224
+ ```
225
+
226
+ **Saturation tied to value:**
227
+ ```html
228
+ <ixfx-editable-number
229
+ min="0" max="100" value="50"
230
+ fill-style="linear"
231
+ style="
232
+ --fill-color: oklch(65% calc(var(--value) * 0.3) 250);
233
+ --fill-opacity: 1;
234
+ "
235
+ ></ixfx-editable-number>
236
+ ```
237
+
238
+ **Formatter (display as percentage):**
239
+ ```html
240
+ <ixfx-editable-number id="vol" min="0" max="1" step="0.01" value="0.75"></ixfx-editable-number>
241
+ <script>
242
+ document.querySelector('#vol').formatter = (v) => `${Math.round(parseFloat(v) * 100)}%`;
243
+ </script>
244
+ ```