@ixfx/components 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/index.d.ts +1086 -603
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +16527 -14258
- package/bundle/index.js.map +1 -1
- package/bundle/style.css +14 -4
- package/dist/ac-text.d.ts.map +1 -1
- package/dist/ac-text.js +11 -6
- package/dist/ac-text.js.map +1 -1
- package/dist/{button-DMt5XWUK.js → button-C3fLMKUv.js} +4 -4
- package/dist/{button-DMt5XWUK.js.map → button-C3fLMKUv.js.map} +1 -1
- package/dist/button.d.ts.map +1 -1
- package/dist/button.js +1 -1
- package/dist/checkbox.d.ts +2 -2
- package/dist/checkbox.d.ts.map +1 -1
- package/dist/checkbox.js +14 -8
- package/dist/checkbox.js.map +1 -1
- package/dist/{colour-C3MQIjFJ-BLXg8W3U.js → colour-C3MQIjFJ-vRCdr8W-.js} +146 -552
- package/dist/colour-C3MQIjFJ-vRCdr8W-.js.map +1 -0
- package/dist/{colour-picker-K6zu82lm.js → colour-picker-0sgAha1T.js} +14 -9
- package/dist/colour-picker-0sgAha1T.js.map +1 -0
- package/dist/colour-picker.d.ts +1 -1
- package/dist/colour-picker.js +1 -1
- package/dist/crumbs.d.ts +1 -1
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +11 -6
- package/dist/crumbs.js.map +1 -1
- package/dist/data-display.d.ts +9 -4
- package/dist/data-display.d.ts.map +1 -1
- package/dist/data-display.js +270 -43
- package/dist/data-display.js.map +1 -1
- package/dist/data-provider-DgI909FP.js +23 -0
- package/dist/data-provider-DgI909FP.js.map +1 -0
- package/dist/{decorate-D7rC1gLP.js → decorate-DdjvVHS-.js} +2 -2
- package/dist/{decorate-D7rC1gLP.js.map → decorate-DdjvVHS-.js.map} +1 -1
- package/dist/{defaults-C7elhuyJ.js → defaults-C3b9OWJD.js} +2 -2
- package/dist/{defaults-C7elhuyJ.js.map → defaults-C3b9OWJD.js.map} +1 -1
- package/dist/{dist-TAGYwaju.js → dist-CA13FvMn.js} +7 -66
- package/dist/dist-CA13FvMn.js.map +1 -0
- package/dist/editable-label.d.ts.map +1 -1
- package/dist/editable-label.js +3 -2
- package/dist/editable-label.js.map +1 -1
- package/dist/fallbacks-pNMOMx38.js +168 -0
- package/dist/fallbacks-pNMOMx38.js.map +1 -0
- package/dist/{hex-editor-DlfoA65y.d.ts → hex-editor-CMIxtNgT.d.ts} +1 -1
- package/dist/hex-editor-CMIxtNgT.d.ts.map +1 -0
- package/dist/{hex-editor-CsN_ySkH.js → hex-editor-WZrjRtvL.js} +3 -3
- package/dist/{hex-editor-CsN_ySkH.js.map → hex-editor-WZrjRtvL.js.map} +1 -1
- package/dist/hex.d.ts +1 -1
- package/dist/hex.js +1 -1
- package/dist/{highlight-TPbSHruI.js → highlight-B-eQrhhb.js} +1 -1
- package/dist/{highlight-TPbSHruI.js.map → highlight-B-eQrhhb.js.map} +1 -1
- package/dist/{icon-CeTDJhC7.d.ts → icon-Bd5BiU4b.d.ts} +2 -2
- package/dist/icon-Bd5BiU4b.d.ts.map +1 -0
- package/dist/{icon-9NWTXtE1.js → icon-Ndo40kNO.js} +6 -5
- package/dist/icon-Ndo40kNO.js.map +1 -0
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +3 -3
- package/dist/{incr-search-DSKKsk6w.js → incr-search-CeERfijK.js} +2 -2
- package/dist/{incr-search-DSKKsk6w.js.map → incr-search-CeERfijK.js.map} +1 -1
- package/dist/incr-search.d.ts +1 -1
- package/dist/incr-search.js +2 -2
- package/dist/{index-hXFn14tM.d.ts → index-BMjri2-S.d.ts} +2 -2
- package/dist/{index-hXFn14tM.d.ts.map → index-BMjri2-S.d.ts.map} +1 -1
- package/dist/{index-DSlPeWLK.d.ts → index-CWpNcQKE.d.ts} +5 -5
- package/dist/index-CWpNcQKE.d.ts.map +1 -0
- package/dist/{index--hrxPBkQ.d.ts → index-CowKi2mo.d.ts} +2 -1
- package/dist/index-CowKi2mo.d.ts.map +1 -0
- package/dist/{index-B1hNR7Z9.d.ts → index-D87kRcEs.d.ts} +1 -1
- package/dist/{index-B1hNR7Z9.d.ts.map → index-D87kRcEs.d.ts.map} +1 -1
- package/dist/{index-CnL9krsH.d.ts → index-DgXpCg_G.d.ts} +32 -26
- package/dist/index-DgXpCg_G.d.ts.map +1 -0
- package/dist/{index-DrQjA8Gs.d.ts → index-s_IhSnwc.d.ts} +2 -2
- package/dist/index-s_IhSnwc.d.ts.map +1 -0
- package/dist/index.d.ts +432 -121
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2370 -1707
- package/dist/index.js.map +1 -1
- package/dist/interaction-D6efrBLo.js +1 -0
- package/dist/{keyboard-De_vOHLg.js → keyboard-CimiEskD.js} +1 -1
- package/dist/{keyboard-De_vOHLg.js.map → keyboard-CimiEskD.js.map} +1 -1
- package/dist/{labelled-input-base-CqPL5rKm.js → labelled-input-base-9K_w3oLj.js} +2 -2
- package/dist/{labelled-input-base-CqPL5rKm.js.map → labelled-input-base-9K_w3oLj.js.map} +1 -1
- package/dist/{labelled-input-base-D-Y7agky.d.ts → labelled-input-base-ORb1rGq6.d.ts} +1 -1
- package/dist/labelled-input-base-ORb1rGq6.d.ts.map +1 -0
- package/dist/labelled-radial-input.d.ts +2 -2
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-radial-input.js +7 -6
- package/dist/labelled-radial-input.js.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-range-input.js +2 -2
- package/dist/led.d.ts +1 -1
- package/dist/led.d.ts.map +1 -1
- package/dist/led.js +2 -2
- package/dist/led.js.map +1 -1
- package/dist/{menu-item-CKRfP0pN.js → menu-item-BrIuORYD.js} +20 -10
- package/dist/menu-item-BrIuORYD.js.map +1 -0
- package/dist/{menu-item-ClQF2DKN.d.ts → menu-item-COx-Azgj.d.ts} +1 -1
- package/dist/menu-item-COx-Azgj.d.ts.map +1 -0
- package/dist/{menu-DJJuCm-5.js → menu-vjoiHZ13.js} +30 -17
- package/dist/menu-vjoiHZ13.js.map +1 -0
- package/dist/menu.d.ts +2 -2
- package/dist/menu.js +2 -2
- package/dist/miller.d.ts +2 -2
- package/dist/miller.d.ts.map +1 -1
- package/dist/miller.js +18 -11
- package/dist/miller.js.map +1 -1
- package/dist/narrowed-text.d.ts.map +1 -1
- package/dist/narrowed-text.js +7 -5
- package/dist/narrowed-text.js.map +1 -1
- package/dist/panel.d.ts +1 -1
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +5 -4
- package/dist/panel.js.map +1 -1
- package/dist/plots.d.ts +2 -2
- package/dist/plots.js +2 -2
- package/dist/polar-pad.d.ts +1 -1
- package/dist/polar-pad.d.ts.map +1 -1
- package/dist/polar-pad.js +10 -4
- package/dist/polar-pad.js.map +1 -1
- package/dist/{popup-ImtS9KnS.js → popup-DiWMxsWj.js} +1 -1
- package/dist/{popup-ImtS9KnS.js.map → popup-DiWMxsWj.js.map} +1 -1
- package/dist/prominence-DlFShic3.js +104 -0
- package/dist/prominence-DlFShic3.js.map +1 -0
- package/dist/{radial-input-LUSBEycd.d.ts → radial-input-CpQPs1Mp.d.ts} +1 -1
- package/dist/radial-input-CpQPs1Mp.d.ts.map +1 -0
- package/dist/{radial-input-DZA6WaFu.js → radial-input-DZ7eQCcM.js} +11 -6
- package/dist/radial-input-DZ7eQCcM.js.map +1 -0
- package/dist/radial-input.d.ts +1 -1
- package/dist/radial-input.js +1 -1
- package/dist/range-input.d.ts +1 -1
- package/dist/range-input.d.ts.map +1 -1
- package/dist/range-input.js +9 -4
- package/dist/range-input.js.map +1 -1
- package/dist/range.d.ts +1 -1
- package/dist/range.d.ts.map +1 -1
- package/dist/range.js +5 -3
- package/dist/range.js.map +1 -1
- package/dist/{registry-Q2gYQCHM.js → registry-CkW7q09Q.js} +1 -1
- package/dist/{registry-Q2gYQCHM.js.map → registry-CkW7q09Q.js.map} +1 -1
- package/dist/selecthorizontal.d.ts +1 -1
- package/dist/selecthorizontal.d.ts.map +1 -1
- package/dist/selecthorizontal.js +4 -3
- package/dist/selecthorizontal.js.map +1 -1
- package/dist/snap-container.d.ts.map +1 -1
- package/dist/snap-container.js +1 -1
- package/dist/split-layout.d.ts +1 -1
- package/dist/split-layout.d.ts.map +1 -1
- package/dist/split-layout.js +6 -5
- package/dist/split-layout.js.map +1 -1
- package/dist/style.css +14 -4
- package/dist/swipe.d.ts.map +1 -1
- package/dist/swipe.js +9 -4
- package/dist/swipe.js.map +1 -1
- package/dist/{tab-list-BnqISNvO.d.ts → tab-list-DLzb-m-I.d.ts} +2 -2
- package/dist/tab-list-DLzb-m-I.d.ts.map +1 -0
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +10 -4
- package/dist/tabs.js.map +1 -1
- package/dist/{tickled-controller-Cq1Va0rR.d.ts → tickled-controller-BjYCzGrU.d.ts} +2 -2
- package/dist/tickled-controller-BjYCzGrU.d.ts.map +1 -0
- package/dist/{tickled-styles-Bg3QbcrD.js → tickled-styles-fNDdqf6l.js} +1 -17
- package/dist/{tickled-styles-Bg3QbcrD.js.map → tickled-styles-fNDdqf6l.js.map} +1 -1
- package/dist/{timeline-Cv75Th2U.js → timeline-2OFtN4Ta.js} +1437 -36
- package/dist/timeline-2OFtN4Ta.js.map +1 -0
- package/dist/timeline.d.ts +1 -1
- package/dist/timeline.js +1 -1
- package/dist/{tooltip-DMxmBNky.js → tooltip-CJt3WLmN.js} +1 -1
- package/dist/{tooltip-DMxmBNky.js.map → tooltip-CJt3WLmN.js.map} +1 -1
- package/dist/{tooltip-CwGfb4lp.d.ts → tooltip-RGVIwHrZ.d.ts} +1 -1
- package/dist/{tooltip-CwGfb4lp.d.ts.map → tooltip-RGVIwHrZ.d.ts.map} +1 -1
- package/dist/{tree-CvvKbO-f.js → tree-CJWpMUvD.js} +113 -103
- package/dist/tree-CJWpMUvD.js.map +1 -0
- package/dist/{tree-component-D8Bg48tt.d.ts → tree-component-BcO26Xvt.d.ts} +65 -3
- package/dist/tree-component-BcO26Xvt.d.ts.map +1 -0
- package/dist/tree.d.ts +15 -15
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -1
- package/dist/{types-BKaqnpwx.d.ts → types-DSfbtHs3.d.ts} +1 -1
- package/dist/types-DSfbtHs3.d.ts.map +1 -0
- package/dist/{xy-axis-DL0tfJDr.js → xy-axis-CK64haaK.js} +1831 -359
- package/dist/xy-axis-CK64haaK.js.map +1 -0
- package/dist/{xy-axis-D9uwpGTT.d.ts → xy-axis-McdUpcYr.d.ts} +102 -3
- package/dist/xy-axis-McdUpcYr.d.ts.map +1 -0
- package/dist/xy-pad.d.ts +1 -1
- package/dist/xy-pad.d.ts.map +1 -1
- package/dist/xy-pad.js +11 -6
- package/dist/xy-pad.js.map +1 -1
- package/docs-user/README.md +45 -0
- package/docs-user/ac-text.md +67 -0
- package/docs-user/ac-token.md +187 -0
- package/docs-user/button.md +355 -0
- package/docs-user/checkbox.md +62 -0
- package/docs-user/colour-picker.md +237 -0
- package/docs-user/crumbs.md +66 -0
- package/docs-user/data-display.md +98 -0
- package/docs-user/editable-label.md +244 -0
- package/docs-user/grouped-item-lister.md +424 -0
- package/docs-user/icons.md +191 -0
- package/docs-user/incr-search.md +94 -0
- package/docs-user/labelled-radial-input.md +204 -0
- package/docs-user/labelled-range-input.md +194 -0
- package/docs-user/led.md +40 -0
- package/docs-user/menu.md +319 -0
- package/docs-user/miller.md +453 -0
- package/docs-user/narrowed-text.md +72 -0
- package/docs-user/panel.md +250 -0
- package/docs-user/plots.md +361 -0
- package/docs-user/polar-pad.md +228 -0
- package/docs-user/radial-input.md +559 -0
- package/docs-user/range-input.md +264 -0
- package/docs-user/range.md +12 -0
- package/docs-user/selecthorizontal.md +32 -0
- package/docs-user/snap-container.md +132 -0
- package/docs-user/split-layout.md +232 -0
- package/docs-user/swipe.md +44 -0
- package/docs-user/tabs.md +217 -0
- package/docs-user/timeline.md +116 -0
- package/docs-user/transitory-label.md +120 -0
- package/docs-user/tree.md +592 -0
- package/docs-user/user-catalog.md +165 -0
- package/docs-user/user-theming.md +379 -0
- package/docs-user/util.md +122 -0
- package/docs-user/vertical-list.md +351 -0
- package/docs-user/xy-pad.md +94 -0
- package/package.json +19 -18
- package/dist/colour-C3MQIjFJ-BLXg8W3U.js.map +0 -1
- package/dist/colour-picker-K6zu82lm.js.map +0 -1
- package/dist/dist-BX0OVIm7.js +0 -1290
- package/dist/dist-BX0OVIm7.js.map +0 -1
- package/dist/dist-TAGYwaju.js.map +0 -1
- package/dist/hex-editor-DlfoA65y.d.ts.map +0 -1
- package/dist/icon-9NWTXtE1.js.map +0 -1
- package/dist/icon-CeTDJhC7.d.ts.map +0 -1
- package/dist/index--hrxPBkQ.d.ts.map +0 -1
- package/dist/index-CnL9krsH.d.ts.map +0 -1
- package/dist/index-DSlPeWLK.d.ts.map +0 -1
- package/dist/index-DrQjA8Gs.d.ts.map +0 -1
- package/dist/interaction-DG7X1rhI.js +0 -1
- package/dist/labelled-input-base-D-Y7agky.d.ts.map +0 -1
- package/dist/menu-DJJuCm-5.js.map +0 -1
- package/dist/menu-item-CKRfP0pN.js.map +0 -1
- package/dist/menu-item-ClQF2DKN.d.ts.map +0 -1
- package/dist/prominence--ic9uWBl.js +0 -98
- package/dist/prominence--ic9uWBl.js.map +0 -1
- package/dist/radial-input-DZA6WaFu.js.map +0 -1
- package/dist/radial-input-LUSBEycd.d.ts.map +0 -1
- package/dist/tab-list-BnqISNvO.d.ts.map +0 -1
- package/dist/tickled-controller-Cq1Va0rR.d.ts.map +0 -1
- package/dist/timeline-Cv75Th2U.js.map +0 -1
- package/dist/tree-CvvKbO-f.js.map +0 -1
- package/dist/tree-component-D8Bg48tt.d.ts.map +0 -1
- package/dist/types-BKaqnpwx.d.ts.map +0 -1
- package/dist/xy-axis-D9uwpGTT.d.ts.map +0 -1
- package/dist/xy-axis-DL0tfJDr.js.map +0 -1
- /package/bundle/{chunk-pbuEa-1d.js → chunk-D7D4PA-g.js} +0 -0
- /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
|
+
```
|