@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,44 @@
1
+ # `ixfx-swipe`
2
+
3
+ A touch-friendly swipe/nudge component. User taps and drags to generate a value in range [-1, 1]. Value is emitted only on pointer release.
4
+
5
+ ```html
6
+ <ixfx-swipe></ixfx-swipe>
7
+ ```
8
+
9
+ ```js
10
+ const swipe = document.querySelector('ixfx-swipe');
11
+ swipe.addEventListener('input', e => {
12
+ console.log(e.detail.value); // -1 to 1
13
+ });
14
+ ```
15
+
16
+ ### Properties / attributes
17
+
18
+ | Attribute / Property | Type | Default | Description |
19
+ |-----------------------|----------|---------|--------------------------------------------|
20
+ | `barSpacing` | `number` | `20` | Center-to-center pixel distance between bars |
21
+ | `barWidth` | `number` | `14` | Pixel width of each bar |
22
+ | `debounceMs` | `number` | `200` | Pause after release before retraction begins |
23
+ | `retractDurationMs` | `number` | `400` | Spring-back animation duration in ms |
24
+
25
+ ### Events
26
+
27
+ | Event | Detail | Description |
28
+ |---------|----------------------|---------------------------------------------|
29
+ | `input` | `{ value: number }` | Fired on pointer release with drag value (-1 to 1) |
30
+
31
+ ### CSS custom properties
32
+
33
+ | Property | Default | Description |
34
+ |---------------------|----------------------|----------------------------------|
35
+ | `--swipe-color-a` | `var(--surface-4)` | Fill color for even-indexed bars |
36
+ | `--swipe-color-b` | `var(--surface-5)` | Fill color for odd-indexed bars |
37
+ | `--swipe-border-color` | `var(--border)` | Border color |
38
+
39
+ ### Usage notes
40
+
41
+ - A full drag across the component width equals ±1
42
+ - Value is emitted as `input` only on `pointerup` (not during drag)
43
+ - Spring-back animation uses cubic ease-out: `1 - (1 - t)³`
44
+ - Touch-action is set to `none` for reliable touch handling
@@ -0,0 +1,217 @@
1
+ # Tab layout components
2
+
3
+ A complete tabbed interface system using several coordinated components:
4
+
5
+ - **`ixfx-tab-layout`** — Layout wrapper (minimal)
6
+ - **`ixfx-tab-layout-item`** — Individual tab item within layout
7
+ - **`ixfx-tab-list`** — Tab header bar with tab buttons
8
+ - **`ixfx-tab-list-item`** — Individual tab button
9
+ - **`ixfx-tab-panel`** — Content panel for a single tab
10
+ - **`ixfx-tab-panels`** — Container managing multiple panels
11
+
12
+ ## Basic usage
13
+
14
+ ```html
15
+ <ixfx-tab-layout>
16
+ <ixfx-tab-list>
17
+ <ixfx-tab-list-item id="tab-home" for="panel-home">Home</ixfx-tab-list-item>
18
+ <ixfx-tab-list-item id="tab-profile" for="panel-profile">Profile</ixfx-tab-list-item>
19
+ </ixfx-tab-list>
20
+
21
+ <ixfx-tab-panels>
22
+ <ixfx-tab-panel id="panel-home">Home content</ixfx-tab-panel>
23
+ <ixfx-tab-panel id="panel-profile">Profile content</ixfx-tab-panel>
24
+ </ixfx-tab-panels>
25
+ </ixfx-tab-layout>
26
+ ```
27
+
28
+ Wire them together:
29
+
30
+ ```js
31
+ const tabList = document.querySelector('ixfx-tab-list');
32
+ const tabPanels = document.querySelector('ixfx-tab-panels');
33
+ tabList.addEventListener('change', e => {
34
+ tabPanels.selectPanel(e.detail.selected);
35
+ });
36
+ ```
37
+
38
+ ---
39
+
40
+ ## `ixfx-tab-list`
41
+
42
+ Manages tab selection and keyboard navigation.
43
+
44
+ ### Properties / attributes
45
+
46
+ | Attribute / Property | Type | Default | Description |
47
+ |---------------------|-----------------------------------|----------------|----------------------------------|
48
+ | `orientation` | `'horizontal' \| 'vertical-stack' \| 'vertical-side'` | `'horizontal'` | Layout direction |
49
+ | `flip` | `boolean` | `false` | Flip indicator to opposite side |
50
+ | `scrollable` | `boolean` | `false` | Enable scroll overflow |
51
+
52
+ ### Events
53
+
54
+ | Event | Detail | Description |
55
+ |----------|------------------------------------------------------|---------------------------|
56
+ | `change` | `{ previous, selected, for }` | Tab selection changed |
57
+
58
+ ### Methods
59
+
60
+ | Method | Argument | Returns | Description |
61
+ |--------------------|----------|---------|------------------------|
62
+ | `getSelectedElement()` | — | `TabListItemElement \| undefined` | Get currently selected tab |
63
+ | `selectElement(el)` | `HTMLElement` | `void` | Programmatically select a tab |
64
+
65
+ ### CSS custom properties
66
+
67
+ | Property | Default | Description |
68
+ |--------------------|------------------|---------------------------|
69
+ | `--activated-colour` | `var(--accent)` | Active tab color |
70
+ | `--colour` | `var(--surface-4)` | Inactive tab background |
71
+ | `--scroll-max-height` | `200px` | Max height when scrollable |
72
+
73
+ ---
74
+
75
+ ## `ixfx-tab-list-item`
76
+
77
+ Individual tab button within the tab list.
78
+
79
+ ### Properties / attributes
80
+
81
+ | Attribute / Property | Type | Default | Description |
82
+ |-----------------------|----------|---------|--------------------------------|
83
+ | `closeable` | `boolean`| `false` | Show close button |
84
+ | `iconName` | `string \| undefined` | `undefined` | Icon to display |
85
+ | `description` | `string \| undefined` | `undefined` | Tooltip description |
86
+ | `commandActive` | `string \| undefined` | `undefined` | Command ID that triggers click |
87
+ | `registry` | `CommandRegistry \| undefined` | `undefined` | Command registry for `commandActive` |
88
+
89
+ ### Slots
90
+
91
+ | Slot | Description |
92
+ |-------------|-----------------------------------------------------------------------------|
93
+ | *(default)* | Tab label text |
94
+ | `toolbar` | Buttons or controls shown right-aligned when the tab is **selected**, before the close button. Multiple elements may use `slot="toolbar"`. |
95
+
96
+ Toolbar buttons should use a plain icon-button style so they blend with the tab chrome. Clicks on toolbar content do not stop propagation — because the toolbar is only visible when the tab is already selected, this has no side-effect on tab switching.
97
+
98
+ ```html
99
+ <!-- Single icon button in toolbar -->
100
+ <ixfx-tab-list-item selected for="panel-home" closeable>
101
+ Home
102
+ <button slot="toolbar" type="button" class="tab-toolbar-btn" aria-label="Refresh">
103
+ <ixfx-icon name="refresh"></ixfx-icon>
104
+ </button>
105
+ </ixfx-tab-list-item>
106
+ ```
107
+
108
+ Multiple elements can occupy the toolbar slot:
109
+
110
+ ```html
111
+ <ixfx-tab-list-item for="panel-sources" closeable>
112
+ Sources
113
+ <button slot="toolbar" type="button" class="tab-toolbar-btn" aria-label="Refresh">
114
+ <ixfx-icon name="refresh"></ixfx-icon>
115
+ </button>
116
+ <button slot="toolbar" type="button" class="tab-toolbar-btn" aria-label="Filter">
117
+ <ixfx-icon name="filter"></ixfx-icon>
118
+ </button>
119
+ <button slot="toolbar" type="button" class="tab-toolbar-btn" aria-label="Settings">
120
+ <ixfx-icon name="settings"></ixfx-icon>
121
+ </button>
122
+ </ixfx-tab-list-item>
123
+ ```
124
+
125
+ Use `ixfx-menu-trigger` with `slot="trigger"` to add a popup menu to the toolbar:
126
+
127
+ ```html
128
+ <ixfx-tab-list-item for="panel-console" closeable>
129
+ Console
130
+ <ixfx-menu-trigger slot="toolbar" placement="bottom-start">
131
+ <button slot="trigger" type="button" class="tab-toolbar-btn" aria-label="Console options">
132
+ <ixfx-icon name="filter"></ixfx-icon>
133
+ </button>
134
+ <ixfx-menu-container slot="menu">
135
+ <ixfx-menu-item command="console-clear" label="Clear console"></ixfx-menu-item>
136
+ <ixfx-menu-separator></ixfx-menu-separator>
137
+ <ixfx-menu-item command="console-filter-errors" label="Errors only"></ixfx-menu-item>
138
+ <ixfx-menu-item command="console-filter-all" label="Show all"></ixfx-menu-item>
139
+ </ixfx-menu-container>
140
+ </ixfx-menu-trigger>
141
+ </ixfx-tab-list-item>
142
+ ```
143
+
144
+ A recommended `.tab-toolbar-btn` style for the page stylesheet:
145
+
146
+ ```css
147
+ .tab-toolbar-btn {
148
+ display: inline-flex;
149
+ align-items: center;
150
+ justify-content: center;
151
+ background: none;
152
+ border: none;
153
+ cursor: pointer;
154
+ padding: var(--space-xs);
155
+ color: inherit;
156
+ border-radius: var(--radius-s);
157
+ opacity: var(--prominence-idle-opacity);
158
+ transition: opacity var(--transition, 0.15s), background var(--transition, 0.15s);
159
+ }
160
+ .tab-toolbar-btn:hover {
161
+ background: var(--surface-5);
162
+ opacity: var(--prominence-tickled-opacity);
163
+ }
164
+ ```
165
+
166
+ ### Events
167
+
168
+ | Event | Detail | Description |
169
+ |----------|--------|----------------------------|
170
+ | `close` | — | Fired when close button clicked; item removes itself from DOM |
171
+
172
+ ### CSS custom properties
173
+
174
+ | Property | Default | Description |
175
+ |-------------------------|------------------|------------------------------|
176
+ | `--selected-colour` | `var(--accent)` | Text color when selected |
177
+ | `--selected-border-width` | `1px` | Border width when selected |
178
+ | `--padding` | `var(--space-m)` | Tab padding |
179
+
180
+ ### CSS parts
181
+
182
+ | Part | Description |
183
+ |------------|--------------------------|
184
+ | `item` | The tab item container |
185
+ | `label` | Label text span |
186
+
187
+ ---
188
+
189
+ ## `ixfx-tab-panel`
190
+
191
+ Single content panel. Hidden unless it has the `selected` attribute.
192
+
193
+ ### CSS
194
+
195
+ When `selected`, displays as `display: block` with `background: var(--surface-3)`. Otherwise uses `display: none`.
196
+
197
+ ---
198
+
199
+ ## `ixfx-tab-panels`
200
+
201
+ Manages multiple `ixfx-tab-panel` children, selecting one at a time.
202
+
203
+ ### Properties / attributes
204
+
205
+ | Property | Type | Description |
206
+ |-----------------------|-----------------------------|------------------------------------|
207
+ | `onUnselectedPanel` | `(id, el) => void` | Callback when panel is de-selected |
208
+ | `onSelectingPanel` | `(id, el) => void` | Callback before panel is selected |
209
+ | `onSelectedPanel` | `(id, el) => void` | Callback after panel is selected |
210
+
211
+ ### Methods
212
+
213
+ | Method | Argument | Returns | Description |
214
+ |---------------------|----------|---------|----------------------------------|
215
+ | `getSelectedElement()` | — | `TabPanelElement \| undefined` | Get currently selected panel |
216
+ | `selectPanel(id)` | `string` | `boolean` | Select panel by ID; returns true if found |
217
+ | `syncWithList(el)` | `TabListElement` | `void` | Sync panel selection to tab list |
@@ -0,0 +1,116 @@
1
+ # `ixfx-timeline`
2
+
3
+ A canvas-based timeline component with tracks, events, zoom/pan, and vertical track resizing. Suitable for visualizing time-series data, event logs, or scheduling.
4
+
5
+ ```html
6
+ <ixfx-timeline id="timeline"></ixfx-timeline>
7
+ ```
8
+
9
+ ```js
10
+ const tl = document.querySelector('#timeline');
11
+
12
+ tl.tracks = [
13
+ { key: 'track-1', label: 'Schedule A', height: 60 },
14
+ { key: 'track-2', label: 'Schedule B', height: 48 },
15
+ ];
16
+
17
+ tl.events = [
18
+ { id: 'e1', trackKey: 'track-1', start: 100, end: 200 },
19
+ { id: 'e2', trackKey: 'track-2', start: 150, end: 250 },
20
+ { id: 'e3', trackKey: 'track-1', start: 300, end: 400 },
21
+ ];
22
+
23
+ tl.min = 0;
24
+ tl.max = 1000;
25
+
26
+ tl.formatLabel = (v) => `${v}ms`;
27
+ ```
28
+
29
+ ### Properties / attributes
30
+
31
+ | Attribute / Property | Type | Default | Description |
32
+ |---------------------------|------------------------|----------------|----------------------------------------------|
33
+ | `tracks` | `TimelineTrack[]` | `[]` | Array of track definitions |
34
+ | `events` | `TimelineEvent[]` | `[]` | Array of event definitions |
35
+ | `min` | `number` | `0` | Minimum time value |
36
+ | `max` | `number` | `1000` | Maximum time value |
37
+ | `trackHeight` | `TrackHeightMode` | `'fixed'` | `'fixed'`, `'free'`, or `'none'` |
38
+ | `userScale` | `UserScale` | `'normal'` | Grid scaling mode: `'normal'` or `'time'` |
39
+ | `reorderable` | `boolean` | `false` | Allow drag-to-reorder tracks (future) |
40
+ | `meta` | `boolean` | `false` | Show metadata/resizer area |
41
+ | `altMajorBg` | `boolean` | `false` | Alternate major grid row backgrounds |
42
+ | `defaultTrackHeight` | `number` | `48` | Default track height in pixels |
43
+ | `gridMode` | `GridMode` | `'adaptive'` | Grid resolution mode |
44
+ | `minorStep` | `number` | `10` | Minor grid step size |
45
+ | `onDragging` | `DragSnappingFn \| null` | `null` | Callback during event drag |
46
+
47
+ ### Events
48
+
49
+ | Event | Detail | Description |
50
+ |--------------------|-----------------------------------------------------|----------------------------------|
51
+ | `selection-change` | `{ selectedIds: string[] }` | Selection set changed |
52
+ | `tickle-change` | `{ event: TimelineEvent \| null }` | Hovered (tickled) event changed |
53
+ | `track-select` | `{ trackKey: string, shiftKey: boolean }` | Track tab was clicked |
54
+ | `track-resize` | `{ trackKey: string, height: number }` | Track height was changed |
55
+ | `dragging` | `{ eventId, start, end, trackKey, rawLogicalX, rawY, originTrackKey }` | Ongoing drag update |
56
+
57
+ ### Methods
58
+
59
+ | Method | Returns | Description |
60
+ |-------------------------|---------|------------------------------------------------|
61
+ | `setPpu(ppu)` | `void` | Set pixels-per-unit zoom level |
62
+ | `setViewRange(range)` | `void` | Set horizontal view range `{ min, max }` |
63
+ | `setZoomPan(viewMin, ppu)` | `void` | Set zoom and pan atomically |
64
+ | `setVerticalZoomPan(vMin, vMax)` | `void` | Set vertical zoom/pan |
65
+ | `selectAll()` | `void` | Select all events |
66
+ | `deselectAll()` | `void` | Clear selection |
67
+ | `getTrackEvents(trackKey)` | `TimelineEvent[]` | Get events for a track |
68
+ | `resetTrackHeights()` | `void` | Reset all track heights to default |
69
+ | `getVCanvas()` | `VCanvasElement \| null` | Get underlying virtual canvas element |
70
+ | `get tickledEvent` | `TimelineEvent \| null` | Currently hovered event (getter) |
71
+ | `get selectedIds()` | `readonly string[]` | Currently selected event IDs (getter/setter) |
72
+
73
+ ### Static helpers
74
+
75
+ | Method | Description |
76
+ |------------------------|---------------------------------------|
77
+ | `defaultDragSnapping` | No-op snapping (passthrough) |
78
+ | `gridSnapping` | Snap to nearest minor gridline |
79
+
80
+ ### CSS custom properties
81
+
82
+ | Property | Default | Description |
83
+ |-----------------------------|---------|------------------------------------|
84
+ | `--timeline-tab-width` | `120` | Track tab column width |
85
+ | `--timeline-tab-bg` | `#2a2a2a` | Default tab background |
86
+ | `--timeline-tab-text` | `#ccc` | Default tab text color |
87
+ | `--timeline-tab-selected-bg`| `#3498db` | Selected tab background |
88
+ | `--timeline-grid-major-color`| `rgba(255,255,255,0.12)` | Major grid line color |
89
+
90
+ ### TypeScript types
91
+
92
+ Import from `src/timeline/types.js`:
93
+ - `TimelineTrack`, `TimelineEvent`, `TimelineTrackResizeDetail`, `GridMode`, `GridResolution`, `ViewRange`, `TrackHeightMode`, `UserScale`
94
+
95
+ ---
96
+
97
+ ## `ixfx-timeline-track-tab`
98
+
99
+ Individual track tab in the timeline's left margin. Handles display, selection, and resize.
100
+
101
+ ### Properties / attributes
102
+
103
+ | Attribute / Property | Type | Default | Description |
104
+ |------------------------|-----------|---------|------------------------------------|
105
+ | `label` | `string` | `''` | Track label text |
106
+ | `trackKey` | `string` | `''` | Associated track key |
107
+ | `selected` | `boolean` | `false` | Whether track is selected |
108
+ | `reorderable` | `boolean` | `false` | Show drag handle |
109
+ | `resizable` | `boolean` | `false` | Enable bottom-edge resize |
110
+
111
+ ### Events
112
+
113
+ | Event | Detail | Description |
114
+ |-------------------|-------------------------------------|--------------------------------|
115
+ | `track-resize-move` | `{ trackKey, height }` | Live preview during resize drag |
116
+ | `track-resize` | `{ trackKey, height }` | Final height on pointer release |
@@ -0,0 +1,120 @@
1
+ # ixfx-transitory-label
2
+
3
+ An inline text label that animates between values instead of changing instantly. Displays as `inline-block` and inherits text styling from its parent.
4
+
5
+ ```html
6
+ <ixfx-transitory-label text="Ready" effect="fade"></ixfx-transitory-label>
7
+ ```
8
+
9
+ ---
10
+
11
+ ## Properties
12
+
13
+ | Property | Type | Default | Description |
14
+ |------------|----------|----------|-------------|
15
+ | `text` | `string` | `""` | The displayed text. Changing this triggers the default `effect`. |
16
+ | `effect` | `Effect` | `"fade"` | Transition effect used when `text` changes directly. |
17
+ | `duration` | `number` | `300` | Animation duration in milliseconds. |
18
+ | `easing` | `string` | `"ease"` | Any valid CSS `<easing-function>` value. |
19
+
20
+ ### `setText(msg, effect)`
21
+
22
+ Set text with a specific effect for this change only, ignoring the component's default `effect` property.
23
+
24
+ ```ts
25
+ label.setText('Error!', 'slide-up');
26
+ ```
27
+
28
+ If a transition is already running, the new text is queued and plays immediately after.
29
+
30
+ ---
31
+
32
+ ## Effects
33
+
34
+ | Value | Description |
35
+ |------------------|-------------|
36
+ | `fade` | Old text fades out as new text fades in simultaneously. |
37
+ | `slide-right` | Old text exits right, new text enters from the left. |
38
+ | `slide-left` | Old text exits left, new text enters from the right. |
39
+ | `slide-up` | Old text exits upward, new text enters from below. |
40
+ | `slide-down` | Old text exits downward, new text enters from above. |
41
+ | `character-swap` | Characters swap one by one left-to-right with a staggered scale/fade. |
42
+
43
+ ```html
44
+ <ixfx-transitory-label text="OK" effect="slide-up"></ixfx-transitory-label>
45
+ ```
46
+
47
+ ---
48
+
49
+ ## Easing
50
+
51
+ The `easing` property accepts any CSS timing function. The same value applies to both the outgoing and incoming animations.
52
+
53
+ | Value | Result |
54
+ |-------|--------|
55
+ | `ease` | Default — gradual start and end |
56
+ | `ease-in` | Slow start, fast end |
57
+ | `ease-out` | Fast start, slow end |
58
+ | `ease-in-out` | Slow at both ends |
59
+ | `linear` | Constant speed |
60
+ | `cubic-bezier(0.34, 1.56, 0.64, 1)` | Spring — overshoots slightly before settling |
61
+ | `cubic-bezier(0.7, 0, 0.3, 1)` | Sharp — fast in the middle, crisp stop |
62
+
63
+ ```html
64
+ <ixfx-transitory-label
65
+ text="Ready"
66
+ effect="slide-right"
67
+ duration="400"
68
+ easing="cubic-bezier(0.34, 1.56, 0.64, 1)"
69
+ ></ixfx-transitory-label>
70
+ ```
71
+
72
+ Easing can also be set via the CSS variable `--transitory-label-easing` without using the property:
73
+
74
+ ```css
75
+ ixfx-transitory-label {
76
+ --transitory-label-easing: ease-out;
77
+ }
78
+ ```
79
+
80
+ ---
81
+
82
+ ## Styling
83
+
84
+ Text font, size, weight, and colour are fully inherited from the parent — no scoped styles are applied to the text content. Size the label by styling its parent or the element directly:
85
+
86
+ ```css
87
+ ixfx-transitory-label {
88
+ font-size: 1.4em;
89
+ font-weight: bold;
90
+ }
91
+ ```
92
+
93
+ ---
94
+
95
+ ## Usage examples
96
+
97
+ ### Auto-cycling status label
98
+
99
+ ```ts
100
+ const label = document.querySelector('ixfx-transitory-label');
101
+ const states = ['Idle', 'Loading', 'Done'];
102
+ let i = 0;
103
+
104
+ setInterval(() => {
105
+ label.text = states[++i % states.length];
106
+ }, 2000);
107
+ ```
108
+
109
+ ### Per-update effect
110
+
111
+ ```ts
112
+ label.setText('Connected', 'slide-up');
113
+ label.setText('Disconnected', 'fade');
114
+ ```
115
+
116
+ ### Attribute-only usage
117
+
118
+ ```html
119
+ <p>Status: <ixfx-transitory-label text="Waiting" effect="fade" duration="500"></ixfx-transitory-label></p>
120
+ ```