@ixfx/components 0.2.3 → 0.2.5
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/LICENSE +1 -1
- package/bundle/chunk-pbuEa-1d.js +13 -0
- package/bundle/index.d.ts +4702 -569
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +34929 -2800
- package/bundle/index.js.map +1 -1
- package/bundle/style.css +133 -0
- package/dist/ac-text.d.ts +97 -0
- package/dist/ac-text.d.ts.map +1 -0
- package/dist/ac-text.js +484 -0
- package/dist/ac-text.js.map +1 -0
- package/dist/button-DgKUzE5o.js +121 -0
- package/dist/button-DgKUzE5o.js.map +1 -0
- package/dist/button.d.ts +21 -0
- package/dist/button.d.ts.map +1 -0
- package/dist/button.js +3 -0
- package/dist/checkbox.d.ts +34 -0
- package/dist/checkbox.d.ts.map +1 -0
- package/dist/checkbox.js +251 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chunk-pbuEa-1d.js +13 -0
- package/dist/colour-C3MQIjFJ-BJV-QC-3.js +4138 -0
- package/dist/colour-C3MQIjFJ-BJV-QC-3.js.map +1 -0
- package/dist/colour-picker-Bw-AZoWx.js +922 -0
- package/dist/colour-picker-Bw-AZoWx.js.map +1 -0
- package/dist/colour-picker.d.ts +2 -0
- package/dist/colour-picker.js +2 -0
- package/dist/crumbs.d.ts +92 -0
- package/dist/crumbs.d.ts.map +1 -0
- package/dist/crumbs.js +789 -0
- package/dist/crumbs.js.map +1 -0
- package/dist/data-display.d.ts +24 -12
- package/dist/data-display.d.ts.map +1 -1
- package/dist/data-display.js +96 -105
- package/dist/data-display.js.map +1 -1
- package/dist/decorate-BZbkqIhA.js +9 -0
- package/dist/defaults-FEZaGiYZ.js +38 -0
- package/dist/defaults-FEZaGiYZ.js.map +1 -0
- package/dist/dist-By5URG0Y.js +1290 -0
- package/dist/dist-By5URG0Y.js.map +1 -0
- package/dist/dist-D7kJgnSE.js +1039 -0
- package/dist/dist-D7kJgnSE.js.map +1 -0
- package/dist/editable-label.d.ts +71 -0
- package/dist/editable-label.d.ts.map +1 -0
- package/dist/editable-label.js +279 -0
- package/dist/editable-label.js.map +1 -0
- package/dist/hex-editor-Gib1Grg2.d.ts +131 -0
- package/dist/hex-editor-Gib1Grg2.d.ts.map +1 -0
- package/dist/hex-editor-Wd6ZtZA2.js +1147 -0
- package/dist/hex-editor-Wd6ZtZA2.js.map +1 -0
- package/dist/hex.d.ts +2 -0
- package/dist/hex.js +2 -0
- package/dist/highlight-CAjwQ4GE.js +50 -0
- package/dist/highlight-CAjwQ4GE.js.map +1 -0
- package/dist/icon-BR5aTIiP.js +100 -0
- package/dist/icon-BR5aTIiP.js.map +1 -0
- package/dist/icon-DQKdfR7U.d.ts +36 -0
- package/dist/icon-DQKdfR7U.d.ts.map +1 -0
- package/dist/icons.d.ts +3 -0
- package/dist/icons.js +9 -0
- package/dist/icons.js.map +1 -0
- package/dist/incr-search-BjCNClnC.js +311 -0
- package/dist/incr-search-BjCNClnC.js.map +1 -0
- package/dist/incr-search.d.ts +2 -0
- package/dist/incr-search.js +3 -0
- package/dist/index-B1hNR7Z9.d.ts +36 -0
- package/dist/index-B1hNR7Z9.d.ts.map +1 -0
- package/dist/index-C5dK8RZa.d.ts +23 -0
- package/dist/index-C5dK8RZa.d.ts.map +1 -0
- package/dist/index-C9iBN908.d.ts +160 -0
- package/dist/index-C9iBN908.d.ts.map +1 -0
- package/dist/index-CPVcTTXo.d.ts +396 -0
- package/dist/index-CPVcTTXo.d.ts.map +1 -0
- package/dist/index-CQxanqXF.d.ts +183 -0
- package/dist/index-CQxanqXF.d.ts.map +1 -0
- package/dist/index-CpbBI3n7.d.ts +1239 -0
- package/dist/index-CpbBI3n7.d.ts.map +1 -0
- package/dist/index.d.ts +422 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5729 -14
- package/dist/index.js.map +1 -1
- package/dist/interaction-CQDQJf2Q.js +1 -0
- package/dist/keyboard-De_vOHLg.js +20 -0
- package/dist/keyboard-De_vOHLg.js.map +1 -0
- package/dist/labelled-input-base-DS6-6C0r.js +155 -0
- package/dist/labelled-input-base-DS6-6C0r.js.map +1 -0
- package/dist/labelled-input-base-DnRh4reU.d.ts +43 -0
- package/dist/labelled-input-base-DnRh4reU.d.ts.map +1 -0
- package/dist/labelled-radial-input.d.ts +34 -0
- package/dist/labelled-radial-input.d.ts.map +1 -0
- package/dist/labelled-radial-input.js +188 -0
- package/dist/labelled-radial-input.js.map +1 -0
- package/dist/labelled-range-input.d.ts +2 -0
- package/dist/labelled-range-input.js +132 -0
- package/dist/labelled-range-input.js.map +1 -0
- package/dist/led.d.ts +25 -0
- package/dist/led.d.ts.map +1 -0
- package/dist/led.js +92 -0
- package/dist/led.js.map +1 -0
- package/dist/menu-BV6UFx_z.js +813 -0
- package/dist/menu-BV6UFx_z.js.map +1 -0
- package/dist/menu-item-Cikacp4F.d.ts +128 -0
- package/dist/menu-item-Cikacp4F.d.ts.map +1 -0
- package/dist/menu-item-DEzL_Yjk.js +766 -0
- package/dist/menu-item-DEzL_Yjk.js.map +1 -0
- package/dist/menu.d.ts +3 -0
- package/dist/menu.js +3 -0
- package/dist/miller.d.ts +324 -0
- package/dist/miller.d.ts.map +1 -0
- package/dist/miller.js +1343 -0
- package/dist/miller.js.map +1 -0
- package/dist/narrowed-text.d.ts +72 -0
- package/dist/narrowed-text.d.ts.map +1 -0
- package/dist/narrowed-text.js +571 -0
- package/dist/narrowed-text.js.map +1 -0
- package/dist/panel.d.ts +43 -0
- package/dist/panel.d.ts.map +1 -0
- package/dist/panel.js +408 -0
- package/dist/panel.js.map +1 -0
- package/dist/plots.d.ts +2 -0
- package/dist/plots.js +2 -0
- package/dist/polar-pad.d.ts +67 -0
- package/dist/polar-pad.d.ts.map +1 -0
- package/dist/polar-pad.js +537 -0
- package/dist/polar-pad.js.map +1 -0
- package/dist/popup-Ddx9LCzY.js +24 -0
- package/dist/popup-Ddx9LCzY.js.map +1 -0
- package/dist/prominence-CreDBdCs.js +98 -0
- package/dist/prominence-CreDBdCs.js.map +1 -0
- package/dist/radial-input-CNJ8asY2.js +849 -0
- package/dist/radial-input-CNJ8asY2.js.map +1 -0
- package/dist/radial-input-xSTd4kEz.d.ts +70 -0
- package/dist/radial-input-xSTd4kEz.d.ts.map +1 -0
- package/dist/radial-input.d.ts +2 -0
- package/dist/radial-input.js +2 -0
- package/dist/range-input.d.ts +43 -0
- package/dist/range-input.d.ts.map +1 -0
- package/dist/range-input.js +459 -0
- package/dist/range-input.js.map +1 -0
- package/dist/range.d.ts +28 -0
- package/dist/range.d.ts.map +1 -0
- package/dist/range.js +136 -0
- package/dist/range.js.map +1 -0
- package/dist/registry-CZEB1YI9.js +21 -0
- package/dist/registry-CZEB1YI9.js.map +1 -0
- package/dist/selecthorizontal.d.ts +13 -8
- package/dist/selecthorizontal.d.ts.map +1 -1
- package/dist/selecthorizontal.js +21 -25
- package/dist/selecthorizontal.js.map +1 -1
- package/dist/snap-container.d.ts +50 -0
- package/dist/snap-container.d.ts.map +1 -0
- package/dist/snap-container.js +297 -0
- package/dist/snap-container.js.map +1 -0
- package/dist/split-layout.d.ts +56 -0
- package/dist/split-layout.d.ts.map +1 -0
- package/dist/split-layout.js +545 -0
- package/dist/split-layout.js.map +1 -0
- package/dist/style.css +133 -0
- package/dist/swipe.d.ts +48 -0
- package/dist/swipe.d.ts.map +1 -0
- package/dist/swipe.js +204 -0
- package/dist/swipe.js.map +1 -0
- package/dist/tab-list-CFF7uSYH.d.ts +66 -0
- package/dist/tab-list-CFF7uSYH.d.ts.map +1 -0
- package/dist/tabs.d.ts +2 -0
- package/dist/tabs.js +203 -0
- package/dist/tabs.js.map +1 -0
- package/dist/tickled-controller-Cq1Va0rR.d.ts +218 -0
- package/dist/tickled-controller-Cq1Va0rR.d.ts.map +1 -0
- package/dist/tickled-styles-Bg3QbcrD.js +327 -0
- package/dist/tickled-styles-Bg3QbcrD.js.map +1 -0
- package/dist/timeline-DBWJsSjd.js +1748 -0
- package/dist/timeline-DBWJsSjd.js.map +1 -0
- package/dist/timeline.d.ts +2 -0
- package/dist/timeline.js +2 -0
- package/dist/tooltip-DMxmBNky.js +104 -0
- package/dist/tooltip-DMxmBNky.js.map +1 -0
- package/dist/tooltip-kfUBWYVB.d.ts +26 -0
- package/dist/tooltip-kfUBWYVB.d.ts.map +1 -0
- package/dist/tree-component-CQpoPo4s.d.ts +326 -0
- package/dist/tree-component-CQpoPo4s.d.ts.map +1 -0
- package/dist/tree-data-model-DGvRVOFY.js +190 -0
- package/dist/tree-data-model-DGvRVOFY.js.map +1 -0
- package/dist/tree.d.ts +100 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +1144 -0
- package/dist/tree.js.map +1 -0
- package/dist/types-BKaqnpwx.d.ts +8 -0
- package/dist/types-BKaqnpwx.d.ts.map +1 -0
- package/dist/xy-axis-BANbgrI5.js +6243 -0
- package/dist/xy-axis-BANbgrI5.js.map +1 -0
- package/dist/xy-axis-CIFok7MF.d.ts +141 -0
- package/dist/xy-axis-CIFok7MF.d.ts.map +1 -0
- package/dist/xy-pad.d.ts +81 -0
- package/dist/xy-pad.d.ts.map +1 -0
- package/dist/xy-pad.js +435 -0
- package/dist/xy-pad.js.map +1 -0
- package/package.json +48 -39
- package/README.md +0 -14
- package/dist/charts/frequency-histogram-plot.d.ts +0 -33
- package/dist/charts/frequency-histogram-plot.d.ts.map +0 -1
- package/dist/charts/frequency-histogram-plot.js +0 -54
- package/dist/charts/frequency-histogram-plot.js.map +0 -1
- package/dist/charts/histogram-vis.d.ts +0 -57
- package/dist/charts/histogram-vis.d.ts.map +0 -1
- package/dist/charts/histogram-vis.js +0 -222
- package/dist/charts/histogram-vis.js.map +0 -1
- package/dist/charts/plot.d.ts +0 -199
- package/dist/charts/plot.d.ts.map +0 -1
- package/dist/charts/plot.js +0 -914
- package/dist/charts/plot.js.map +0 -1
- package/dist/crumb-nav.d.ts +0 -41
- package/dist/crumb-nav.d.ts.map +0 -1
- package/dist/crumb-nav.js +0 -198
- package/dist/crumb-nav.js.map +0 -1
- package/dist/crumb-navigation.d.ts +0 -30
- package/dist/crumb-navigation.d.ts.map +0 -1
- package/dist/crumb-navigation.js +0 -307
- package/dist/crumb-navigation.js.map +0 -1
- package/dist/dial.d.ts +0 -89
- package/dist/dial.d.ts.map +0 -1
- package/dist/dial.js +0 -506
- package/dist/dial.js.map +0 -1
- package/dist/my-element.d.ts +0 -14
- package/dist/my-element.d.ts.map +0 -1
- package/dist/my-element.js +0 -44
- package/dist/my-element.js.map +0 -1
- package/dist/split-layout/split-layout.d.ts +0 -35
- package/dist/split-layout/split-layout.d.ts.map +0 -1
- package/dist/split-layout/split-layout.js +0 -220
- package/dist/split-layout/split-layout.js.map +0 -1
- package/dist/svg-edit-label.d.ts +0 -2
- package/dist/svg-edit-label.d.ts.map +0 -1
- package/dist/svg-edit-label.js +0 -110
- package/dist/svg-edit-label.js.map +0 -1
- package/dist/tabs/tab-layout-item.d.ts +0 -10
- package/dist/tabs/tab-layout-item.d.ts.map +0 -1
- package/dist/tabs/tab-layout-item.js +0 -20
- package/dist/tabs/tab-layout-item.js.map +0 -1
- package/dist/tabs/tab-layout.d.ts +0 -10
- package/dist/tabs/tab-layout.d.ts.map +0 -1
- package/dist/tabs/tab-layout.js +0 -25
- package/dist/tabs/tab-layout.js.map +0 -1
- package/dist/tabs/tab-list-item.d.ts +0 -18
- package/dist/tabs/tab-list-item.d.ts.map +0 -1
- package/dist/tabs/tab-list-item.js +0 -63
- package/dist/tabs/tab-list-item.js.map +0 -1
- package/dist/tabs/tab-list.d.ts +0 -21
- package/dist/tabs/tab-list.d.ts.map +0 -1
- package/dist/tabs/tab-list.js +0 -148
- package/dist/tabs/tab-list.js.map +0 -1
- package/dist/tabs/tab-panel.d.ts +0 -11
- package/dist/tabs/tab-panel.d.ts.map +0 -1
- package/dist/tabs/tab-panel.js +0 -30
- package/dist/tabs/tab-panel.js.map +0 -1
- package/dist/tabs/tab-panels.d.ts +0 -30
- package/dist/tabs/tab-panels.d.ts.map +0 -1
- package/dist/tabs/tab-panels.js +0 -80
- package/dist/tabs/tab-panels.js.map +0 -1
- package/dist/util/circle-arc.d.ts +0 -34
- package/dist/util/circle-arc.d.ts.map +0 -1
- package/dist/util/circle-arc.js +0 -77
- package/dist/util/circle-arc.js.map +0 -1
- package/dist/util/compare.d.ts +0 -53
- package/dist/util/compare.d.ts.map +0 -1
- package/dist/util/compare.js +0 -91
- package/dist/util/compare.js.map +0 -1
- package/dist/util/content-editable.d.ts +0 -2
- package/dist/util/content-editable.d.ts.map +0 -1
- package/dist/util/content-editable.js +0 -13
- package/dist/util/content-editable.js.map +0 -1
- package/dist/util/drag-controller.d.ts +0 -13
- package/dist/util/drag-controller.d.ts.map +0 -1
- package/dist/util/drag-controller.js +0 -21
- package/dist/util/drag-controller.js.map +0 -1
- package/dist/util/key-value.d.ts +0 -5
- package/dist/util/key-value.d.ts.map +0 -1
- package/dist/util/key-value.js +0 -30
- package/dist/util/key-value.js.map +0 -1
- package/dist/util/primitive-types.d.ts +0 -6
- package/dist/util/primitive-types.d.ts.map +0 -1
- package/dist/util/primitive-types.js +0 -2
- package/dist/util/primitive-types.js.map +0 -1
- package/dist/util/svg-editable-text.d.ts +0 -22
- package/dist/util/svg-editable-text.d.ts.map +0 -1
- package/dist/util/svg-editable-text.js +0 -121
- package/dist/util/svg-editable-text.js.map +0 -1
- package/dist/util/time.d.ts +0 -2
- package/dist/util/time.d.ts.map +0 -1
- package/dist/util/time.js +0 -2
- package/dist/util/time.js.map +0 -1
package/dist/tabs.js
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { t as __decorate } from "./decorate-BZbkqIhA.js";
|
|
2
|
+
import { LitElement, css, html } from "lit";
|
|
3
|
+
import { customElement, property } from "lit/decorators.js";
|
|
4
|
+
//#region src/tabs/tab-list.ts
|
|
5
|
+
let TabListElement = class TabListElement extends LitElement {
|
|
6
|
+
constructor(..._args) {
|
|
7
|
+
super(..._args);
|
|
8
|
+
this.orientation = `horizontal`;
|
|
9
|
+
this.flip = false;
|
|
10
|
+
this.scrollable = false;
|
|
11
|
+
this.#items = [];
|
|
12
|
+
this.#onSlotChange = () => {
|
|
13
|
+
this.updateComplete.then(() => {
|
|
14
|
+
this.#items = (this.shadowRoot?.querySelector(`slot`))?.assignedElements({ flatten: true }) ?? [];
|
|
15
|
+
this.#syncIndicatorColors();
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
this.#onKeyUp = (event) => {
|
|
19
|
+
const key = event.key;
|
|
20
|
+
if (this.#isVertical) {
|
|
21
|
+
if (key === `ArrowUp`) this.#selectPrevious();
|
|
22
|
+
else if (key === `ArrowDown`) this.#selectNext();
|
|
23
|
+
} else if (key === `ArrowRight`) this.#selectNext();
|
|
24
|
+
else if (key === `ArrowLeft`) this.#selectPrevious();
|
|
25
|
+
};
|
|
26
|
+
this.#onSlotClick = (event) => {
|
|
27
|
+
this.focus();
|
|
28
|
+
const t = event.target.closest(`ixfx-tab-list-item`);
|
|
29
|
+
if (!t) return;
|
|
30
|
+
const previous = this.getSelectedElement();
|
|
31
|
+
this.selectElement(t);
|
|
32
|
+
const forId = t.getAttribute(`for`);
|
|
33
|
+
const previousId = previous?.id;
|
|
34
|
+
this.dispatchEvent(new CustomEvent(`change`, {
|
|
35
|
+
bubbles: true,
|
|
36
|
+
detail: {
|
|
37
|
+
previous: previousId,
|
|
38
|
+
selected: t.id,
|
|
39
|
+
for: forId ?? ``
|
|
40
|
+
}
|
|
41
|
+
}));
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
#items;
|
|
45
|
+
get #isVertical() {
|
|
46
|
+
return this.orientation === `vertical-stack` || this.orientation === `vertical-side`;
|
|
47
|
+
}
|
|
48
|
+
get #containerClass() {
|
|
49
|
+
return this.scrollable ? `${this.orientation} scrollable` : this.orientation;
|
|
50
|
+
}
|
|
51
|
+
render() {
|
|
52
|
+
return html`
|
|
53
|
+
<div
|
|
54
|
+
tabindex=0
|
|
55
|
+
@keyup=${this.#onKeyUp}
|
|
56
|
+
@click=${this.#onSlotClick}
|
|
57
|
+
id="container"
|
|
58
|
+
class=${this.#containerClass}
|
|
59
|
+
>
|
|
60
|
+
<slot @slotchange=${this.#onSlotChange}></slot>
|
|
61
|
+
</div>`;
|
|
62
|
+
}
|
|
63
|
+
#onSlotChange;
|
|
64
|
+
firstUpdated() {
|
|
65
|
+
this.updateComplete.then(() => {
|
|
66
|
+
if (this.#items.length > 0) this.#syncIndicatorColors();
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
updated(changedProperties) {
|
|
70
|
+
super.updated(changedProperties);
|
|
71
|
+
this.classList.toggle("scrollable", this.scrollable);
|
|
72
|
+
}
|
|
73
|
+
#syncIndicatorColors() {
|
|
74
|
+
for (const item of this.#items) {
|
|
75
|
+
item.style.setProperty(`--indicator-color-bottom`, `transparent`);
|
|
76
|
+
item.style.setProperty(`--indicator-color-top`, `transparent`);
|
|
77
|
+
item.style.setProperty(`--indicator-color-left`, `transparent`);
|
|
78
|
+
item.style.setProperty(`--indicator-color-right`, `transparent`);
|
|
79
|
+
if (item.hasAttribute(`selected`)) {
|
|
80
|
+
if (this.orientation === `horizontal` && !this.flip) item.style.setProperty(`--indicator-color-bottom`, `var(--accent)`);
|
|
81
|
+
else if (this.orientation === `horizontal` && this.flip) item.style.setProperty(`--indicator-color-top`, `var(--accent)`);
|
|
82
|
+
else if (this.#isVertical && !this.flip) item.style.setProperty(`--indicator-color-right`, `var(--accent)`);
|
|
83
|
+
else if (this.#isVertical && this.flip) item.style.setProperty(`--indicator-color-left`, `var(--accent)`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
#onKeyUp;
|
|
88
|
+
getSelectedElement() {
|
|
89
|
+
for (const el of this.#items) if (this.#isSelected(el)) return el;
|
|
90
|
+
}
|
|
91
|
+
#isSelected(el) {
|
|
92
|
+
if (el.getAttribute(`selected`) === null) return false;
|
|
93
|
+
return el.hasAttribute(`selected`);
|
|
94
|
+
}
|
|
95
|
+
selectElement(el) {
|
|
96
|
+
const existing = this.getSelectedElement();
|
|
97
|
+
if (existing) {
|
|
98
|
+
existing.removeAttribute(`selected`);
|
|
99
|
+
existing.style.setProperty(`--indicator-color-bottom`, `transparent`);
|
|
100
|
+
existing.style.setProperty(`--indicator-color-top`, `transparent`);
|
|
101
|
+
existing.style.setProperty(`--indicator-color-left`, `transparent`);
|
|
102
|
+
existing.style.setProperty(`--indicator-color-right`, `transparent`);
|
|
103
|
+
}
|
|
104
|
+
el.setAttribute(`selected`, ``);
|
|
105
|
+
if (this.orientation === `horizontal` && !this.flip) el.style.setProperty(`--indicator-color-bottom`, `var(--accent)`);
|
|
106
|
+
else if (this.orientation === `horizontal` && this.flip) el.style.setProperty(`--indicator-color-top`, `var(--accent)`);
|
|
107
|
+
else if (this.#isVertical && !this.flip) el.style.setProperty(`--indicator-color-right`, `var(--accent)`);
|
|
108
|
+
else if (this.#isVertical && this.flip) el.style.setProperty(`--indicator-color-left`, `var(--accent)`);
|
|
109
|
+
}
|
|
110
|
+
#selectNext() {
|
|
111
|
+
let found = false;
|
|
112
|
+
for (const el of this.#items) if (this.#isSelected(el) && !found) found = true;
|
|
113
|
+
else if (found) {
|
|
114
|
+
this.selectElement(el);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
#selectPrevious() {
|
|
119
|
+
let prev;
|
|
120
|
+
for (const el of this.#items) if (this.#isSelected(el) && prev) this.selectElement(prev);
|
|
121
|
+
else prev = el;
|
|
122
|
+
}
|
|
123
|
+
#onSlotClick;
|
|
124
|
+
static {
|
|
125
|
+
this.styles = css`
|
|
126
|
+
:host {
|
|
127
|
+
display: inline-block;
|
|
128
|
+
--activated-colour: var(--accent);
|
|
129
|
+
--colour: var(--surface-4);
|
|
130
|
+
--scroll-max-height: 200px;
|
|
131
|
+
--allow-overflow: hidden;
|
|
132
|
+
}
|
|
133
|
+
:host(.scrollable) {
|
|
134
|
+
max-height: var(--scroll-max-height);
|
|
135
|
+
}
|
|
136
|
+
text {
|
|
137
|
+
user-select:none;
|
|
138
|
+
}
|
|
139
|
+
#container {
|
|
140
|
+
display:flex;
|
|
141
|
+
}
|
|
142
|
+
#container.horizontal {
|
|
143
|
+
flex-direction: row;
|
|
144
|
+
overflow: hidden;
|
|
145
|
+
}
|
|
146
|
+
#container.horizontal.scrollable {
|
|
147
|
+
overflow-x: auto;
|
|
148
|
+
--allow-overflow: visible;
|
|
149
|
+
}
|
|
150
|
+
#container.horizontal.scrollable ::slotted(ixfx-tab-list-item) {
|
|
151
|
+
flex-shrink: 0;
|
|
152
|
+
}
|
|
153
|
+
#container.vertical-stack {
|
|
154
|
+
flex-direction: column;
|
|
155
|
+
}
|
|
156
|
+
#container.vertical-stack.flip {
|
|
157
|
+
flex-direction: column-reverse;
|
|
158
|
+
}
|
|
159
|
+
#container.vertical-stack.scrollable {
|
|
160
|
+
overflow-y: auto;
|
|
161
|
+
max-height: var(--scroll-max-height);
|
|
162
|
+
--allow-overflow: visible;
|
|
163
|
+
}
|
|
164
|
+
#container.vertical-side {
|
|
165
|
+
flex-direction: column;
|
|
166
|
+
}
|
|
167
|
+
#container.vertical-side.flip {
|
|
168
|
+
flex-direction: column-reverse;
|
|
169
|
+
}
|
|
170
|
+
#container.vertical-side.scrollable {
|
|
171
|
+
overflow-y: auto;
|
|
172
|
+
max-height: var(--scroll-max-height);
|
|
173
|
+
--allow-overflow: visible;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
::slotted(ixfx-tab-list-item) {
|
|
177
|
+
flex: 1 1 auto;
|
|
178
|
+
min-width: 0;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
#container.vertical-side ::slotted(ixfx-tab-list-item) {
|
|
182
|
+
writing-mode: vertical-lr;
|
|
183
|
+
text-orientation: mixed;
|
|
184
|
+
}
|
|
185
|
+
#container.vertical-side.flip ::slotted(ixfx-tab-list-item) {
|
|
186
|
+
writing-mode: vertical-rl;
|
|
187
|
+
text-orientation: mixed;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
::slotted(.activated) {
|
|
191
|
+
--colour: var(--activated-colour);
|
|
192
|
+
}
|
|
193
|
+
`;
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
__decorate([property({ type: String })], TabListElement.prototype, "orientation", void 0);
|
|
197
|
+
__decorate([property({ type: Boolean })], TabListElement.prototype, "flip", void 0);
|
|
198
|
+
__decorate([property({ type: Boolean })], TabListElement.prototype, "scrollable", void 0);
|
|
199
|
+
TabListElement = __decorate([customElement(`ixfx-tab-list`)], TabListElement);
|
|
200
|
+
//#endregion
|
|
201
|
+
export { TabListElement };
|
|
202
|
+
|
|
203
|
+
//# sourceMappingURL=tabs.js.map
|
package/dist/tabs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.js","names":["#items","#syncIndicatorColors","#isVertical","#selectPrevious","#selectNext","#containerClass","#onKeyUp","#onSlotClick","#onSlotChange","#isSelected"],"sources":["../src/tabs/tab-list.ts"],"sourcesContent":["import type { TabListItemElement } from \"./tab-list-item.js\";\nimport type { PropertyValues } from \"lit\";\nimport { css, html, LitElement } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n/**\n * Events\n * 'change' - new tab selected { previous:string, selected:string, for:string }\n */\nexport type TabListChangeDetail = {\n readonly previous: string | undefined;\n readonly selected: string;\n readonly for: string;\n};\n\nexport type TabListChangeEvent = CustomEvent<TabListChangeDetail>;\n\n@customElement(`ixfx-tab-list`)\nexport class TabListElement extends LitElement {\n @property({ type: String })\n orientation: `horizontal` | `vertical-stack` | `vertical-side` = `horizontal`;\n\n @property({ type: Boolean })\n flip = false;\n\n @property({ type: Boolean })\n scrollable = false;\n\n #items: TabListItemElement[] = [];\n\n get #isVertical(): boolean {\n return this.orientation === `vertical-stack` || this.orientation === `vertical-side`;\n }\n\n get #containerClass(): string {\n return this.scrollable ? `${this.orientation} scrollable` : this.orientation;\n }\n\n override render() {\n return html`\n <div \n tabindex=0 \n @keyup=${this.#onKeyUp} \n @click=${this.#onSlotClick} \n id=\"container\" \n class=${this.#containerClass}\n >\n <slot @slotchange=${this.#onSlotChange}></slot>\n </div>`;\n }\n\n #onSlotChange = () => {\n this.updateComplete.then(() => {\n this.#items = (this.shadowRoot?.querySelector(`slot`) as HTMLSlotElement)\n ?.assignedElements({ flatten: true }) as TabListItemElement[] ?? [];\n this.#syncIndicatorColors();\n });\n };\n\n override firstUpdated() {\n this.updateComplete.then(() => {\n if (this.#items.length > 0) {\n this.#syncIndicatorColors();\n }\n });\n }\n\n override updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n this.classList.toggle('scrollable', this.scrollable);\n }\n\n #syncIndicatorColors() {\n for (const item of this.#items) {\n item.style.setProperty(`--indicator-color-bottom`, `transparent`);\n item.style.setProperty(`--indicator-color-top`, `transparent`);\n item.style.setProperty(`--indicator-color-left`, `transparent`);\n item.style.setProperty(`--indicator-color-right`, `transparent`);\n\n if (item.hasAttribute(`selected`)) {\n if (this.orientation === `horizontal` && !this.flip) {\n item.style.setProperty(`--indicator-color-bottom`, `var(--accent)`);\n } else if (this.orientation === `horizontal` && this.flip) {\n item.style.setProperty(`--indicator-color-top`, `var(--accent)`);\n } else if (this.#isVertical && !this.flip) {\n item.style.setProperty(`--indicator-color-right`, `var(--accent)`);\n } else if (this.#isVertical && this.flip) {\n item.style.setProperty(`--indicator-color-left`, `var(--accent)`);\n }\n }\n }\n }\n\n #onKeyUp = (event: KeyboardEvent) => {\n const key = event.key;\n if (this.#isVertical) {\n if (key === `ArrowUp`) {\n this.#selectPrevious();\n } else if (key === `ArrowDown`) {\n this.#selectNext();\n }\n } else {\n if (key === `ArrowRight`) {\n this.#selectNext();\n } else if (key === `ArrowLeft`) {\n this.#selectPrevious();\n }\n }\n };\n\n getSelectedElement() {\n for (const el of this.#items) {\n if (this.#isSelected(el))\n return el;\n }\n }\n\n #isSelected(el: HTMLElement) {\n const v = el.getAttribute(`selected`);\n if (v === null)\n return false;\n return (el.hasAttribute(`selected`));\n }\n\n selectElement(el: HTMLElement) {\n const existing = this.getSelectedElement();\n if (existing) {\n existing.removeAttribute(`selected`);\n existing.style.setProperty(`--indicator-color-bottom`, `transparent`);\n existing.style.setProperty(`--indicator-color-top`, `transparent`);\n existing.style.setProperty(`--indicator-color-left`, `transparent`);\n existing.style.setProperty(`--indicator-color-right`, `transparent`);\n }\n\n el.setAttribute(`selected`, ``);\n\n if (this.orientation === `horizontal` && !this.flip) {\n el.style.setProperty(`--indicator-color-bottom`, `var(--accent)`);\n } else if (this.orientation === `horizontal` && this.flip) {\n el.style.setProperty(`--indicator-color-top`, `var(--accent)`);\n } else if (this.#isVertical && !this.flip) {\n el.style.setProperty(`--indicator-color-right`, `var(--accent)`);\n } else if (this.#isVertical && this.flip) {\n el.style.setProperty(`--indicator-color-left`, `var(--accent)`);\n }\n }\n\n #selectNext() {\n let found = false;\n for (const el of this.#items) {\n if (this.#isSelected(el) && !found) {\n found = true;\n } else if (found) {\n this.selectElement(el);\n break;\n }\n }\n }\n\n #selectPrevious() {\n let prev: HTMLElement | undefined;\n for (const el of this.#items) {\n if (this.#isSelected(el) && prev) {\n this.selectElement(prev);\n } else {\n prev = el;\n }\n }\n }\n\n #onSlotClick = (event: MouseEvent) => {\n this.focus();\n const t = (event.target as HTMLElement).closest(`ixfx-tab-list-item`);\n if (!t)\n return;\n const previous = this.getSelectedElement();\n this.selectElement(t);\n\n const forId = t.getAttribute(`for`);\n const previousId = previous?.id;\n this.dispatchEvent(new CustomEvent<TabListChangeDetail>(`change`, {\n bubbles: true,\n detail: {\n previous: previousId,\n selected: t.id,\n for: forId ?? ``,\n },\n }));\n };\n\n static styles = css`\n :host {\n display: inline-block;\n --activated-colour: var(--accent);\n --colour: var(--surface-4);\n --scroll-max-height: 200px;\n --allow-overflow: hidden;\n }\n :host(.scrollable) {\n max-height: var(--scroll-max-height);\n }\n text {\n user-select:none;\n }\n #container {\n display:flex;\n }\n #container.horizontal {\n flex-direction: row;\n overflow: hidden;\n }\n #container.horizontal.scrollable {\n overflow-x: auto;\n --allow-overflow: visible;\n }\n #container.horizontal.scrollable ::slotted(ixfx-tab-list-item) {\n flex-shrink: 0;\n }\n #container.vertical-stack {\n flex-direction: column;\n }\n #container.vertical-stack.flip {\n flex-direction: column-reverse;\n }\n #container.vertical-stack.scrollable {\n overflow-y: auto;\n max-height: var(--scroll-max-height);\n --allow-overflow: visible;\n }\n #container.vertical-side {\n flex-direction: column;\n }\n #container.vertical-side.flip {\n flex-direction: column-reverse;\n }\n #container.vertical-side.scrollable {\n overflow-y: auto;\n max-height: var(--scroll-max-height);\n --allow-overflow: visible;\n }\n\n ::slotted(ixfx-tab-list-item) {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n #container.vertical-side ::slotted(ixfx-tab-list-item) {\n writing-mode: vertical-lr;\n text-orientation: mixed;\n }\n #container.vertical-side.flip ::slotted(ixfx-tab-list-item) {\n writing-mode: vertical-rl;\n text-orientation: mixed;\n }\n\n ::slotted(.activated) {\n --colour: var(--activated-colour);\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-tab-list\": TabListElement;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { ReactiveController, ReactiveControllerHost } from "lit";
|
|
2
|
+
|
|
3
|
+
//#region node_modules/.pnpm/@ixfx+collections@0.56.12/node_modules/@ixfx/collections/dist/index-rrpZOWbs.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Traversable Tree.
|
|
6
|
+
*
|
|
7
|
+
* Creatable from:
|
|
8
|
+
* {@link Trees.FromObject.asDynamicTraversable}: Create based on dynamic reading of an object
|
|
9
|
+
* {@link Trees.TraversableTree}: Create based on an {@link Trees.TreeNode}, a {@link Trees.TraversableTree} or an object (same as calling asDynamicTraversable).
|
|
10
|
+
* Use {@link Trees.isTraversable} to check if an object is this type.
|
|
11
|
+
*/
|
|
12
|
+
type TraversableTree<TValue> = {
|
|
13
|
+
/**
|
|
14
|
+
* Direct children of node
|
|
15
|
+
*/
|
|
16
|
+
children: () => IterableIterator<TraversableTree<TValue>>;
|
|
17
|
+
/**
|
|
18
|
+
* Direct parent of node
|
|
19
|
+
*/
|
|
20
|
+
getParent: () => TraversableTree<TValue> | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Value of node
|
|
23
|
+
*/
|
|
24
|
+
getValue: () => TValue;
|
|
25
|
+
/**
|
|
26
|
+
* Object reference that acts as the identity of the node
|
|
27
|
+
*/
|
|
28
|
+
getIdentity: () => any;
|
|
29
|
+
};
|
|
30
|
+
//#endregion
|
|
31
|
+
//#region src/interaction/tickled-controller.d.ts
|
|
32
|
+
/**
|
|
33
|
+
* Represents an item that can be tickled (highlighted via hover or keyboard navigation)
|
|
34
|
+
*/
|
|
35
|
+
type TickledItem<T = unknown> = {
|
|
36
|
+
/**
|
|
37
|
+
* Unique identifier for the item (e.g., index, id, path)
|
|
38
|
+
*/
|
|
39
|
+
readonly id: T;
|
|
40
|
+
/**
|
|
41
|
+
* Whether the item is currently enabled/interactive
|
|
42
|
+
*/
|
|
43
|
+
readonly enabled?: boolean;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Input mode determines which mechanism controls the tickled state
|
|
47
|
+
*/
|
|
48
|
+
type InputMode = `keyboard` | `mouse`;
|
|
49
|
+
/**
|
|
50
|
+
* Configuration for TickledController
|
|
51
|
+
*/
|
|
52
|
+
type TickledControllerConfig<T> = {
|
|
53
|
+
/**
|
|
54
|
+
* Function to retrieve all items that can be tickled
|
|
55
|
+
*/
|
|
56
|
+
getItems: () => ReadonlyArray<TickledItem<T>>;
|
|
57
|
+
/**
|
|
58
|
+
* Optional callback when an item becomes tickled
|
|
59
|
+
* Use this for side effects like opening submenus
|
|
60
|
+
* @param id - The id of the newly tickled item, or undefined if nothing is tickled
|
|
61
|
+
*/
|
|
62
|
+
onTickle?: (id: T | undefined) => void;
|
|
63
|
+
/**
|
|
64
|
+
* Optional callback fired after any state change (tickled id or input mode)
|
|
65
|
+
* Use this to sync DOM attributes for slotted content that can't use reactive rendering
|
|
66
|
+
*
|
|
67
|
+
* For components that render items directly, this is usually not needed as
|
|
68
|
+
* Lit's reactive rendering will handle updates automatically via requestUpdate()
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* onStateChange: () => {
|
|
73
|
+
* // Sync data-tickled attributes for slotted items
|
|
74
|
+
* const items = this.getItems();
|
|
75
|
+
* items.forEach((item, i) => {
|
|
76
|
+
* if (this.tickled.isTickled(i)) {
|
|
77
|
+
* item.setAttribute('data-tickled', '');
|
|
78
|
+
* } else {
|
|
79
|
+
* item.removeAttribute('data-tickled');
|
|
80
|
+
* }
|
|
81
|
+
* });
|
|
82
|
+
* }
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
onStateChange?: () => void;
|
|
86
|
+
/**
|
|
87
|
+
* Optional initial input mode (defaults to 'mouse')
|
|
88
|
+
*/
|
|
89
|
+
initialInputMode?: InputMode;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* ReactiveController that manages "tickled" state for interactive lists.
|
|
93
|
+
*
|
|
94
|
+
* A "tickled" item is one that is under active attention via hover (mouse mode)
|
|
95
|
+
* or keyboard focus (keyboard mode). Only one item can be tickled at a time.
|
|
96
|
+
*
|
|
97
|
+
* The input mode determines which mechanism controls tickled state:
|
|
98
|
+
* - Mouse mode: hover controls tickled, keyboard navigation ignored
|
|
99
|
+
* - Keyboard mode: keyboard navigation controls tickled, hover ignored
|
|
100
|
+
*
|
|
101
|
+
* Last interaction wins - any mouse hover switches to mouse mode, any keyboard
|
|
102
|
+
* navigation switches to keyboard mode.
|
|
103
|
+
*
|
|
104
|
+
* ## Global Mouse Tracking
|
|
105
|
+
*
|
|
106
|
+
* This controller uses a singleton global `pointermove` listener to track actual
|
|
107
|
+
* mouse movement. This prevents `pointerenter` events caused by content scrolling
|
|
108
|
+
* from incorrectly switching to mouse mode when the user is actually using keyboard
|
|
109
|
+
* navigation.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```ts
|
|
113
|
+
* class MyList extends LitElement {
|
|
114
|
+
* private tickled = new TickledController(this, {
|
|
115
|
+
* getItems: () => this.items.map((item, i) => ({ id: i, enabled: !item.disabled })),
|
|
116
|
+
* onTickle: (id) => {
|
|
117
|
+
* // Optional: perform side effect when item is tickled
|
|
118
|
+
* console.log('Tickled item:', id);
|
|
119
|
+
* }
|
|
120
|
+
* });
|
|
121
|
+
*
|
|
122
|
+
* render() {
|
|
123
|
+
* return html`
|
|
124
|
+
* <ul @pointerleave=${(e) => this.tickled.handlePointerLeave(e)}>
|
|
125
|
+
* ${this.items.map((item, i) => html`
|
|
126
|
+
* <li
|
|
127
|
+
* class="item ${this.tickled.isTickled(i) ? 'tickled' : ''}"
|
|
128
|
+
* @pointerenter=${() => this.tickled.handlePointerEnter(i)}
|
|
129
|
+
* >${item.label}</li>
|
|
130
|
+
* `)}
|
|
131
|
+
* </ul>
|
|
132
|
+
* `;
|
|
133
|
+
* }
|
|
134
|
+
*
|
|
135
|
+
* private handleKeyDown(e: KeyboardEvent) {
|
|
136
|
+
* if (e.key === 'ArrowDown') {
|
|
137
|
+
* this.tickled.handleKeyboardNavigation('next');
|
|
138
|
+
* } else if (e.key === 'ArrowUp') {
|
|
139
|
+
* this.tickled.handleKeyboardNavigation('previous');
|
|
140
|
+
* }
|
|
141
|
+
* }
|
|
142
|
+
* }
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
declare class TickledController<T = number> implements ReactiveController {
|
|
146
|
+
private host;
|
|
147
|
+
private config;
|
|
148
|
+
private _tickledId;
|
|
149
|
+
private _inputMode;
|
|
150
|
+
private static _lastMouseClientX;
|
|
151
|
+
private static _lastMouseClientY;
|
|
152
|
+
private static _mouseMovedSinceKeyboard;
|
|
153
|
+
private static _globalListenerAttached;
|
|
154
|
+
constructor(host: ReactiveControllerHost, config: TickledControllerConfig<T>);
|
|
155
|
+
hostConnected(): void;
|
|
156
|
+
hostDisconnected(): void;
|
|
157
|
+
/**
|
|
158
|
+
* Get the current input mode
|
|
159
|
+
*/
|
|
160
|
+
get inputMode(): InputMode;
|
|
161
|
+
/**
|
|
162
|
+
* Get the currently tickled item id
|
|
163
|
+
*/
|
|
164
|
+
get tickledId(): T | undefined;
|
|
165
|
+
/**
|
|
166
|
+
* Check if a specific item is tickled
|
|
167
|
+
*/
|
|
168
|
+
isTickled(id: T): boolean;
|
|
169
|
+
/**
|
|
170
|
+
* Handle global pointer move event.
|
|
171
|
+
* Called automatically by the global listener.
|
|
172
|
+
* Tracks mouse movement to distinguish real hover from content scrolling.
|
|
173
|
+
*/
|
|
174
|
+
private static handleGlobalPointerMove;
|
|
175
|
+
/**
|
|
176
|
+
* Check if actual mouse movement has occurred since last keyboard interaction.
|
|
177
|
+
* Used to distinguish real hover/leave from content-scrolling-induced events.
|
|
178
|
+
*/
|
|
179
|
+
static get hasMouseMovedSinceKeyboard(): boolean;
|
|
180
|
+
/**
|
|
181
|
+
* Handle pointer enter event on an item (mouse hover).
|
|
182
|
+
* Only processes if actual mouse movement is detected (not content scrolling).
|
|
183
|
+
* Switches to mouse mode and tickles the item.
|
|
184
|
+
*/
|
|
185
|
+
handlePointerEnter(id: T): void;
|
|
186
|
+
/**
|
|
187
|
+
* Handle pointer leave event on an item.
|
|
188
|
+
* Only clears tickled state if actual mouse movement is detected.
|
|
189
|
+
* @param _e The pointer event (not used, but kept for API compatibility)
|
|
190
|
+
*/
|
|
191
|
+
handlePointerLeave(_e: PointerEvent): void;
|
|
192
|
+
/**
|
|
193
|
+
* Handle keyboard navigation.
|
|
194
|
+
* Switches to keyboard mode and moves tickled state.
|
|
195
|
+
*
|
|
196
|
+
* @param direction - 'next', 'previous', 'first', 'last', or specific id
|
|
197
|
+
*/
|
|
198
|
+
handleKeyboardNavigation(direction: `next` | `previous` | `first` | `last` | T): void;
|
|
199
|
+
/**
|
|
200
|
+
* Manually set the tickled item (useful for programmatic control).
|
|
201
|
+
* Does NOT change input mode.
|
|
202
|
+
*/
|
|
203
|
+
setTickled(id: T | undefined): void;
|
|
204
|
+
/**
|
|
205
|
+
* Clear the tickled state (e.g., on pointer leave).
|
|
206
|
+
* Note: For pointer leave events, prefer using handlePointerLeave() which
|
|
207
|
+
* checks for actual mouse movement.
|
|
208
|
+
*/
|
|
209
|
+
clearTickled(): void;
|
|
210
|
+
/**
|
|
211
|
+
* Manually set the input mode.
|
|
212
|
+
* When switching to keyboard mode, resets the mouse movement tracking.
|
|
213
|
+
*/
|
|
214
|
+
setInputMode(mode: InputMode): void;
|
|
215
|
+
}
|
|
216
|
+
//#endregion
|
|
217
|
+
export { TraversableTree as n, TickledController as t };
|
|
218
|
+
//# sourceMappingURL=tickled-controller-Cq1Va0rR.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickled-controller-Cq1Va0rR.d.ts","names":["Comparer","IsEqual","Result","LabelledValue","TValue","LabelledSingleValue","LabelledValues","label","value","values","TreeNode","ReadonlyArray","parent","childrenStore","SimplifiedNode","LabelledNode","TraversableTree","IterableIterator","children","getParent","getValue","getIdentity","TraverseObjectEntry","Readonly","name","sourceValue","leafValue","_kind","TraverseObjectEntryWithAncestors","ancestors","TraverseObjectEntryStatic","TraverseObjectPathOpts","separator","WrappedNode","T","wraps","remove","add","child","addValue","hasChild","queryValue","queryParentsValue","eq","findParentsValue","parentsValues","hasAnyChild","hasParent","hasAnyParent","DiffAnnotation","a","b","valueChanged","childChanged","added","removed","DiffNode","toString","compare$1","tree_mutable_d_exports","asDynamicTraversable$1","breadthFirst$2","children$2","childrenLength$1","childrenValues","compare","computeMaxDepth","createNode$1","depthFirst$3","findAnyChildByValue$2","findChildByValue$1","followValue$1","fromPlainObject","getRoot","hasAnyChild$1","hasAnyParent$1","hasChild$1","hasParent$1","nodeDepth","parents$1","queryByValue","remove$1","removeValuelessNodesFromChild","root$2","rootWrapped$1","setChildren","siblings$2","stripParentage","throwTreeTest","toStringDeep$4","treeTest","wrap$1","asDynamicTraversable","breadthFirst","childrenLength","createNode","depthFirst","findAnyChildByValue","findChildByValue","followValue","parents","root","rootWrapped","siblings","toStringDeep","wrap","node","n","Array","seen","ok","msg","prospectiveChild","prospectiveParent","Generator","Record","indent","nodeValue","depth","continuePredicate","pathed_d_exports","PathOpts","Pathed","addValueByPath","children$1","childrenLengthByPath","clearValuesByPath","findAnyChildByValue$1","hasValue","parentValues","removeValueByPath","siblings$1","siblingsValues","toStringDeep$3","valueByPath","valuesByPath","startsWithSeparator","duplicates","Partial","private","constructor","pathOpts","path","validate","prettyPrint","hasPath","getNode","getPath","includeNode","getValues","clearValues","searchStart","start","maxDepth","traverse_object_d_exports","ChildrenOptions","CreateOptions","create$1","createSimplified","createWrapped","depthFirst$2","getByPath","prettyPrintEntries","toStringDeep$2","traceByPath","create","entries","options","filter","Iterable","valuesAtLeaves","traversable_tree_d_exports","breadthFirst$1","couldAddChild","depthFirst$1","find$2","findAnyParentByValue","findByValue","findParentByValue","hasAnyChildValue","hasAnyParentValue","hasChildValue","hasParentValue","toStringDeep$1","find","tree","TV","possibleParent","possibleParentValue","possibleChild","possibleChildValue","possibleValue","predicate","order","nodes","binary_tree_d_exports","BinaryChildSide","WrappedBinaryNode","addLeft","addRight","balanceFactor","find$1","fromArray$1","getLeft","getRight","grandparent","hasLeft","hasRight","height","inOrder$1","isLeaf","isParentLeftChild","isParentRightChild","leftSubtreeHeightFn","parentChildSide","postOrder$1","preOrder$1","removeNode","rightSubtreeHeightFn","root$1","setLeft","setRight","sibling","toArray","uncle","fromArray","inOrder","postOrder","preOrder","left","right","leftSubtreeHeight","rightSubtreeHeight","has","array","binary_search_tree_d_exports","Bst","BstNode","insert","max","min","valuesInOrder","comparer","toArrayInOrder","isSingleValue","v","isMultiValue","index_d_exports","isTraversable","isTreeNode","toTraversable","BinarySearchTree","BinaryTree","FromObject","Mutable","Traverse","C","D","E","S","_","c","d","f","g","h","i","l","m","o","p","r","s","t","u","w","x","y"],"sources":["../node_modules/.pnpm/@ixfx+collections@0.56.12/node_modules/@ixfx/collections/dist/index-rrpZOWbs.d.ts","../src/interaction/tickled-controller.ts"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;;KAgFKgB,eAAAA;ECyQgB;;;EDrQnBE,QAAAA,QAAgBD,gBAAAA,CAAiBD,eAAAA,CAAgBZ,MAAAA;ECsCpB;;;EDlC7Be,SAAAA,QAAiBH,eAAAA,CAAgBZ,MAAAA;ECqCzB;;;EDjCRgB,QAAAA,QAAgBhB,MAAAA;ECsCD;;;EDlCfiB,WAAAA;AAAAA;;;;;AAzBuD;KClE7C,WAAA;ED2EQjB;;;EAAAA,SCvET,EAAA,EAAI,CAAA;ED+EoBA;;;EAAAA,SC1ExB,OAAA;AAAA;;;;KAMC,SAAA;;;;KAKA,uBAAA;EDmEVgB;;;EC/DA,QAAA,QAAgB,aAAA,CAAc,WAAA,CAAY,CAAA;EDmE/B;;;;AC3Fb;EA+BE,QAAA,IAAY,EAAA,EAAI,CAAA;EA/BK;;;;;;;;AAevB;;;;;AAKA;;;;;;;;;EAmCE,aAAA;EAnCkC;;;EAwClC,gBAAA,GAAmB,SAAA;AAAA;;;;;;;;;AAyDrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,iBAAA,wBAAyC,kBAAA;EAAA,QAC5C,IAAA;EAAA,QACA,MAAA;EAAA,QACA,UAAA;EAAA,QACA,UAAA;EAAA,eAEO,iBAAA;EAAA,eACA,iBAAA;EAAA,eACA,wBAAA;EAAA,eACA,uBAAA;cAEH,IAAA,EAAM,sBAAA,EAAwB,MAAA,EAAQ,uBAAA,CAAwB,CAAA;EAO1E,aAAA,CAAA;EASA,gBAAA,CAAA;EAoMmB;;;EAAA,IA7Lf,SAAA,CAAA,GAAa,SAAA;;;;MAOb,SAAA,CAAA,GAAa,CAAA;;;;EAOjB,SAAA,CAAU,EAAA,EAAI,CAAA;;;;;;iBASC,uBAAA;;;;;aAiBJ,0BAAA,CAAA;;;;;;EASX,kBAAA,CAAmB,EAAA,EAAI,CAAA;;;;;;EAiCvB,kBAAA,CAAmB,EAAA,EAAI,YAAA;;;;;;;EAYvB,wBAAA,CAAyB,SAAA,2CAAoD,CAAA;;;;;EAyD7E,UAAA,CAAW,EAAA,EAAI,CAAA;;;;;;EAmBf,YAAA,CAAA;;;;;EAmBA,YAAA,CAAa,IAAA,EAAM,SAAA;AAAA"}
|