@ixfx/components 0.5.19 → 0.6.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 +462 -210
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +8027 -6493
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.js +3 -3
- package/dist/ac-token-DVbmHmky.d.ts +107 -0
- package/dist/ac-token-DVbmHmky.d.ts.map +1 -0
- package/dist/ac-token.d.ts +2 -0
- package/dist/ac-token.js +646 -0
- package/dist/ac-token.js.map +1 -0
- package/dist/{button-CphdEaZd.js → button-Bn0BuLpO.js} +2 -3
- package/dist/{button-CphdEaZd.js.map → button-Bn0BuLpO.js.map} +1 -1
- package/dist/button.d.ts +1 -1
- package/dist/button.d.ts.map +1 -1
- package/dist/button.js +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{colour-picker-37NyVenk.js → colour-picker-0stHB90J.js} +18 -8
- package/dist/colour-picker-0stHB90J.js.map +1 -0
- package/dist/colour-picker.d.ts +1 -1
- package/dist/colour-picker.js +1 -1
- package/dist/crumbs.d.ts +2 -2
- package/dist/crumbs.js +1152 -1
- package/dist/crumbs.js.map +1 -0
- package/dist/data-controller-DOlmqNKb.js +171 -0
- package/dist/data-controller-DOlmqNKb.js.map +1 -0
- package/dist/data-display.js +1 -1
- package/dist/data-grid-BeAkORz2.d.ts +215 -0
- package/dist/data-grid-BeAkORz2.d.ts.map +1 -0
- package/dist/data-grid.d.ts +2 -0
- package/dist/data-grid.js +1225 -0
- package/dist/data-grid.js.map +1 -0
- package/dist/data-provider-BAn_-oR1.d.ts +61 -0
- package/dist/data-provider-BAn_-oR1.d.ts.map +1 -0
- package/dist/{defaults-BkWCPJFL.js → defaults-BCiDhZbF.js} +20 -3
- package/dist/defaults-BCiDhZbF.js.map +1 -0
- package/dist/drag-ghost-DtSDvjri.js +85 -0
- package/dist/drag-ghost-DtSDvjri.js.map +1 -0
- package/dist/editable-label.js +1 -1
- package/dist/{incr-search-2pz21xtR.js → element-search-Y8SRfPGM.js} +2 -133
- package/dist/element-search-Y8SRfPGM.js.map +1 -0
- package/dist/fallbacks-DEE1nCTt.js +406 -0
- package/dist/fallbacks-DEE1nCTt.js.map +1 -0
- package/dist/form-CsXJX15p.js +64 -0
- package/dist/form-CsXJX15p.js.map +1 -0
- package/dist/form.d.ts +15 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +2 -0
- package/dist/grouped-item-lister-CNLMgdIr.d.ts +121 -0
- package/dist/grouped-item-lister-CNLMgdIr.d.ts.map +1 -0
- package/dist/grouped-item-lister.d.ts +2 -0
- package/dist/grouped-item-lister.js +177 -0
- package/dist/grouped-item-lister.js.map +1 -0
- package/dist/{icon-DG9Lm3LT.js → icons-Bm2ByQ3s.js} +6 -3
- package/dist/icons-Bm2ByQ3s.js.map +1 -0
- package/dist/icons.js +2 -8
- package/dist/incr-search-vCzuao-2.js +137 -0
- package/dist/incr-search-vCzuao-2.js.map +1 -0
- package/dist/incr-search.d.ts +1 -1
- package/dist/incr-search.js +2 -1
- package/dist/{index-BKAlRgbq.d.ts → index-BOUaDIW-.d.ts} +4 -1
- package/dist/index-BOUaDIW-.d.ts.map +1 -0
- package/dist/{index-D9u_Q7-b.d.ts → index-Cu5i8zZY.d.ts} +3 -3
- package/dist/{index-D9u_Q7-b.d.ts.map → index-Cu5i8zZY.d.ts.map} +1 -1
- package/dist/{index-DkhBGHgF.d.ts → index-ovq_GTdl.d.ts} +2 -2
- package/dist/{index-DkhBGHgF.d.ts.map → index-ovq_GTdl.d.ts.map} +1 -1
- package/dist/index.d.ts +54 -572
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1898 -4253
- package/dist/index.js.map +1 -1
- package/dist/labelled-radial-input.d.ts +1 -1
- package/dist/labelled-radial-input.js +1 -2
- package/dist/labelled-radial-input.js.map +1 -1
- package/dist/led.d.ts +0 -1
- package/dist/led.d.ts.map +1 -1
- package/dist/led.js +2 -4
- package/dist/led.js.map +1 -1
- package/dist/menu-DIfU70AA.js +1609 -0
- package/dist/menu-DIfU70AA.js.map +1 -0
- package/dist/menu-item-BG5w7fi4.d.ts.map +1 -1
- package/dist/menu.d.ts +1 -1
- package/dist/menu.js +1 -2
- package/dist/miller.d.ts +3 -3
- package/dist/miller.js +3 -3
- package/dist/narrowed-text.d.ts.map +1 -1
- package/dist/narrowed-text.js +4 -4
- package/dist/narrowed-text.js.map +1 -1
- package/dist/notification-pill-DyZydXoZ.d.ts +68 -0
- package/dist/notification-pill-DyZydXoZ.d.ts.map +1 -0
- package/dist/notifier.d.ts +2 -0
- package/dist/notifier.js +146 -0
- package/dist/notifier.js.map +1 -0
- package/dist/panel.js +1 -2
- package/dist/panel.js.map +1 -1
- package/dist/plots.js +1 -1
- package/dist/polar-pad.d.ts +1 -1
- package/dist/polar-pad.js +1 -1
- package/dist/{radial-input-BhZeyyP-.d.ts → radial-input-DXMN55Nz.d.ts} +2 -2
- package/dist/{radial-input-BhZeyyP-.d.ts.map → radial-input-DXMN55Nz.d.ts.map} +1 -1
- package/dist/{radial-input-CVxGH-Cp.js → radial-input-Dk8Wydp5.js} +4 -4
- package/dist/radial-input-Dk8Wydp5.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.js +1 -1
- package/dist/range.d.ts +1 -1
- package/dist/range.js +1 -1
- package/dist/scroll-fade-CAs1EabA.js +70 -0
- package/dist/scroll-fade-CAs1EabA.js.map +1 -0
- package/dist/select-horiz.d.ts +50 -0
- package/dist/select-horiz.d.ts.map +1 -0
- package/dist/select-horiz.js +263 -0
- package/dist/select-horiz.js.map +1 -0
- package/dist/{slider-input-CzmSVgm7.js → slider-input-CT4gcF-o.js} +2 -2
- package/dist/{slider-input-CzmSVgm7.js.map → slider-input-CT4gcF-o.js.map} +1 -1
- package/dist/{slider-input-TidGhvXt.d.ts → slider-input-XppH3vcy.d.ts} +2 -2
- package/dist/{slider-input-TidGhvXt.d.ts.map → slider-input-XppH3vcy.d.ts.map} +1 -1
- package/dist/slider-input.d.ts +1 -1
- package/dist/slider-input.js +1 -1
- package/dist/snackbar.d.ts +58 -0
- package/dist/snackbar.d.ts.map +1 -0
- package/dist/snackbar.js +265 -0
- package/dist/snackbar.js.map +1 -0
- package/dist/split-layout.js +1 -1
- package/dist/swipe.d.ts +1 -1
- package/dist/swipe.js +1 -1
- package/dist/tabs.js +533 -1
- package/dist/tabs.js.map +1 -0
- package/dist/{tickled-controller-BF2Ea0DE.d.ts → tickled-controller-BtevrRLV.d.ts} +8 -6
- package/dist/tickled-controller-BtevrRLV.d.ts.map +1 -0
- package/dist/{tickled-styles-fNDdqf6l.js → tickled-controller-DkAU-0qL.js} +19 -105
- package/dist/tickled-controller-DkAU-0qL.js.map +1 -0
- package/dist/tickled-styles-BrAHEj1q.js +89 -0
- package/dist/tickled-styles-BrAHEj1q.js.map +1 -0
- package/dist/transitory-label.d.ts +30 -0
- package/dist/transitory-label.d.ts.map +1 -0
- package/dist/transitory-label.js +249 -0
- package/dist/transitory-label.js.map +1 -0
- package/dist/{tree-BtiiDX1a.js → tree-BO6BXI2b.js} +4 -4
- package/dist/{tree-BtiiDX1a.js.map → tree-BO6BXI2b.js.map} +1 -1
- package/dist/{tree-component-DQ9vzdy5.d.ts → tree-component-BvV4muxx.d.ts} +2 -2
- package/dist/{tree-component-DQ9vzdy5.d.ts.map → tree-component-BvV4muxx.d.ts.map} +1 -1
- package/dist/tree.d.ts +3 -3
- package/dist/tree.js +1 -1
- package/dist/{types-DO3gt5vg.d.ts → types-Bc23SI94.d.ts} +3 -61
- package/dist/types-Bc23SI94.d.ts.map +1 -0
- package/dist/types-DlVNJez_.d.ts +41 -0
- package/dist/types-DlVNJez_.d.ts.map +1 -0
- package/dist/vertical-list.d.ts +122 -0
- package/dist/vertical-list.d.ts.map +1 -0
- package/dist/vertical-list.js +737 -0
- package/dist/vertical-list.js.map +1 -0
- package/dist/wheel-nudge-BlSCe_hD.js.map +1 -1
- package/dist/{wheel-nudge-DgMTRYlh.d.ts → wheel-nudge-DGrNzWuE.d.ts} +3 -3
- package/dist/wheel-nudge-DGrNzWuE.d.ts.map +1 -0
- package/dist/{xy-axis-CxHC8z5E.js → xy-axis-B6yMjckW.js} +3 -109
- package/dist/xy-axis-B6yMjckW.js.map +1 -0
- package/dist/xy-pad.d.ts +1 -1
- package/dist/xy-pad.js +1 -1
- package/docs-user/README.md +3 -2
- package/docs-user/ac-token.md +7 -1
- package/docs-user/colour-picker.md +8 -4
- package/docs-user/data-grid.md +248 -0
- package/docs-user/index.json +217 -0
- package/docs-user/llms.txt +57 -0
- package/docs-user/menu.md +11 -8
- package/docs-user/rating.md +102 -0
- package/llms.txt +57 -0
- package/package.json +21 -11
- package/dist/colour-picker-37NyVenk.js.map +0 -1
- package/dist/crumb-navigation-BrB0r14u.js +0 -1220
- package/dist/crumb-navigation-BrB0r14u.js.map +0 -1
- package/dist/defaults-BkWCPJFL.js.map +0 -1
- package/dist/fallbacks-DPgPEqo8.js +0 -218
- package/dist/fallbacks-DPgPEqo8.js.map +0 -1
- package/dist/icon-DG9Lm3LT.js.map +0 -1
- package/dist/icons.js.map +0 -1
- package/dist/incr-search-2pz21xtR.js.map +0 -1
- package/dist/index-BKAlRgbq.d.ts.map +0 -1
- package/dist/interaction-D6efrBLo.js +0 -1
- package/dist/menu-CdwSe_XN.js +0 -825
- package/dist/menu-CdwSe_XN.js.map +0 -1
- package/dist/menu-item-CrmUwIoJ.js +0 -782
- package/dist/menu-item-CrmUwIoJ.js.map +0 -1
- package/dist/radial-input-CVxGH-Cp.js.map +0 -1
- package/dist/registry-CkW7q09Q.js +0 -21
- package/dist/registry-CkW7q09Q.js.map +0 -1
- package/dist/selecthorizontal.d.ts +0 -15
- package/dist/selecthorizontal.d.ts.map +0 -1
- package/dist/selecthorizontal.js +0 -43
- package/dist/selecthorizontal.js.map +0 -1
- package/dist/tab-list-mAoD6L0e.js +0 -615
- package/dist/tab-list-mAoD6L0e.js.map +0 -1
- package/dist/tickled-controller-BF2Ea0DE.d.ts.map +0 -1
- package/dist/tickled-styles-fNDdqf6l.js.map +0 -1
- package/dist/types-DO3gt5vg.d.ts.map +0 -1
- package/dist/wheel-nudge-DgMTRYlh.d.ts.map +0 -1
- package/dist/xy-axis-CxHC8z5E.js.map +0 -1
- package/docs-user/selecthorizontal.md +0 -32
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { t as TickledController } from "./tickled-controller-DkAU-0qL.js";
|
|
2
|
+
import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrAHEj1q.js";
|
|
3
|
+
import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
|
|
4
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
5
|
+
import { t as scrollFadeStyles } from "./scroll-fade-CAs1EabA.js";
|
|
6
|
+
import { t as WheelNudgeMixin } from "./wheel-nudge-BlSCe_hD.js";
|
|
7
|
+
import { LitElement, css, html } from "lit";
|
|
8
|
+
import { property, state } from "lit/decorators.js";
|
|
9
|
+
//#region src/select-horiz/select-horiz.ts
|
|
10
|
+
let SelectHorizElement = class SelectHorizElement extends WheelNudgeMixin(LitElement) {
|
|
11
|
+
constructor(..._args) {
|
|
12
|
+
super(..._args);
|
|
13
|
+
this._selectedIndex = -1;
|
|
14
|
+
this._slottedItems = [];
|
|
15
|
+
this.tickled = new TickledController(this, {
|
|
16
|
+
getItems: () => this._slottedItems.map((_, i) => ({
|
|
17
|
+
id: i,
|
|
18
|
+
enabled: true
|
|
19
|
+
})),
|
|
20
|
+
onStateChange: () => this._syncTickled()
|
|
21
|
+
});
|
|
22
|
+
this._onSlotChange = () => {
|
|
23
|
+
this._slottedItems = Array.from(this.shadowRoot?.querySelector(`slot`)?.assignedElements() ?? []);
|
|
24
|
+
const declaredIndex = this._slottedItems.findIndex((item) => item.hasAttribute(`selected`));
|
|
25
|
+
let resolvedIndex = declaredIndex >= 0 ? declaredIndex : this._selectedIndex;
|
|
26
|
+
if (resolvedIndex >= this._slottedItems.length) resolvedIndex = this._slottedItems.length - 1;
|
|
27
|
+
if (resolvedIndex < 0 && this._slottedItems.length > 0) resolvedIndex = 0;
|
|
28
|
+
this.selectedIndex = resolvedIndex;
|
|
29
|
+
};
|
|
30
|
+
this._syncTickled = () => {
|
|
31
|
+
this._slottedItems.forEach((item, i) => {
|
|
32
|
+
const isTickled = this.tickled.isTickled(i);
|
|
33
|
+
item.classList.toggle(`tickled`, isTickled);
|
|
34
|
+
item.tabIndex = isTickled && this.tickled.inputMode === `keyboard` ? 0 : -1;
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
this._findSlottedItem = (target) => {
|
|
38
|
+
let el = target instanceof Element ? target : null;
|
|
39
|
+
while (el) {
|
|
40
|
+
if (this._slottedItems.includes(el)) return el;
|
|
41
|
+
el = el.parentElement;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
this._handlePointerOver = (e) => {
|
|
45
|
+
const item = this._findSlottedItem(e.target);
|
|
46
|
+
if (item) this.tickled.handlePointerEnter(this._slottedItems.indexOf(item));
|
|
47
|
+
};
|
|
48
|
+
this._handleKeyDown = (e) => {
|
|
49
|
+
if (e.key === `ArrowLeft`) {
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
this.tickled.handleKeyboardNavigation(`previous`);
|
|
52
|
+
this._applyTickledSelection();
|
|
53
|
+
} else if (e.key === `ArrowRight`) {
|
|
54
|
+
e.preventDefault();
|
|
55
|
+
this.tickled.handleKeyboardNavigation(`next`);
|
|
56
|
+
this._applyTickledSelection();
|
|
57
|
+
} else if (e.key === `Home`) {
|
|
58
|
+
e.preventDefault();
|
|
59
|
+
this.tickled.handleKeyboardNavigation(`first`);
|
|
60
|
+
this._applyTickledSelection();
|
|
61
|
+
} else if (e.key === `End`) {
|
|
62
|
+
e.preventDefault();
|
|
63
|
+
this.tickled.handleKeyboardNavigation(`last`);
|
|
64
|
+
this._applyTickledSelection();
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
this._applyTickledSelection = () => {
|
|
68
|
+
const id = this.tickled.tickledId;
|
|
69
|
+
if (id !== void 0 && id !== this._selectedIndex) this.selectedIndex = id;
|
|
70
|
+
};
|
|
71
|
+
this._wheelCooldown = false;
|
|
72
|
+
this._handleClick = (e) => {
|
|
73
|
+
e.currentTarget.focus();
|
|
74
|
+
const item = this._findSlottedItem(e.target);
|
|
75
|
+
const index = item ? this._slottedItems.indexOf(item) : -1;
|
|
76
|
+
if (index >= 0 && index !== this._selectedIndex) this.selectedIndex = index;
|
|
77
|
+
};
|
|
78
|
+
this._updateSelectedAttribute = () => {
|
|
79
|
+
this._slottedItems.forEach((item, i) => {
|
|
80
|
+
if (i === this._selectedIndex) item.setAttribute(`selected`, ``);
|
|
81
|
+
else item.removeAttribute(`selected`);
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
this._scrollSelectedIntoView = () => {
|
|
85
|
+
const item = this._slottedItems[this._selectedIndex];
|
|
86
|
+
if (item) item.scrollIntoView({
|
|
87
|
+
inline: `center`,
|
|
88
|
+
behavior: `smooth`
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
this._emitChange = () => {
|
|
92
|
+
this.dispatchEvent(new CustomEvent(`change`, {
|
|
93
|
+
detail: {
|
|
94
|
+
selectedIndex: this._selectedIndex,
|
|
95
|
+
selectedItem: this.selectedItem,
|
|
96
|
+
selectedValue: this.selectedValue
|
|
97
|
+
},
|
|
98
|
+
bubbles: true,
|
|
99
|
+
composed: true
|
|
100
|
+
}));
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
static {
|
|
104
|
+
this.styles = [
|
|
105
|
+
themeFallbacks,
|
|
106
|
+
tickledStyles,
|
|
107
|
+
tickledItemStyles,
|
|
108
|
+
scrollFadeStyles(`x`),
|
|
109
|
+
css`
|
|
110
|
+
:host {
|
|
111
|
+
--select-horiz-item-width: 80%;
|
|
112
|
+
--select-horiz-gap: var(--space-s);
|
|
113
|
+
--select-horiz-bg: var(--surface-3);
|
|
114
|
+
--select-horiz-border: var(--border);
|
|
115
|
+
--select-horiz-radius: var(--radius-l);
|
|
116
|
+
display: flex;
|
|
117
|
+
width: 100%;
|
|
118
|
+
background: var(--select-horiz-bg);
|
|
119
|
+
border: var(--select-horiz-border);
|
|
120
|
+
border-radius: var(--select-horiz-radius);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* Edge fade (the scroll-fade-x class, see ../styles/scroll-fade.ts) must sit on
|
|
124
|
+
* the element that actually scrolls - its mask is sized to this element's own
|
|
125
|
+
* box, and content overflowing a *different*, non-scrolling ancestor gets the
|
|
126
|
+
* mask tiled across it instead of fading correctly. */
|
|
127
|
+
.items {
|
|
128
|
+
display: flex;
|
|
129
|
+
align-items: center;
|
|
130
|
+
gap: var(--select-horiz-gap);
|
|
131
|
+
padding: var(--space-xs) var(--scroll-fade-width, 30px);
|
|
132
|
+
width: 100%;
|
|
133
|
+
min-height: 48px;
|
|
134
|
+
overflow-x: scroll;
|
|
135
|
+
overflow-y: hidden;
|
|
136
|
+
scrollbar-width: none;
|
|
137
|
+
scroll-snap-type: x mandatory;
|
|
138
|
+
-webkit-overflow-scrolling: touch;
|
|
139
|
+
cursor: grab;
|
|
140
|
+
|
|
141
|
+
box-sizing: border-box;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.items:focus-within {
|
|
145
|
+
cursor: default;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.spacer {
|
|
149
|
+
flex: 0 0 var(--select-horiz-spacer-width, 10%);
|
|
150
|
+
pointer-events: none;
|
|
151
|
+
user-select: none;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
::slotted(*) {
|
|
155
|
+
flex: 0 0 var(--select-horiz-item-width);
|
|
156
|
+
scroll-snap-align: center;
|
|
157
|
+
user-select: none;
|
|
158
|
+
min-height: 100%;
|
|
159
|
+
box-sizing: border-box;
|
|
160
|
+
transition: opacity var(--transition), background var(--transition), border-color var(--transition), color var(--transition);
|
|
161
|
+
background: var(--item-bg);
|
|
162
|
+
border: var(--item-border);
|
|
163
|
+
border-radius: var(--item-border-radius);
|
|
164
|
+
padding: var(--item-padding);
|
|
165
|
+
display: grid;
|
|
166
|
+
align-content: center;
|
|
167
|
+
justify-content: center;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
::slotted(.tickled) {
|
|
171
|
+
background: var(--item-bg-tickled);
|
|
172
|
+
border: var(--item-border-tickled);
|
|
173
|
+
color: var(--item-text-tickled);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
::slotted([selected]) {
|
|
177
|
+
background: var(--item-bg-selected);
|
|
178
|
+
border: var(--item-border-selected);
|
|
179
|
+
color: var(--item-text-selected);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
::slotted([selected].tickled) {
|
|
183
|
+
background: var(--item-bg-selected-tickled);
|
|
184
|
+
outline: 2px dashed var(--surface-3);
|
|
185
|
+
outline-offset: -2px;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
::-webkit-scrollbar {
|
|
189
|
+
display: none;
|
|
190
|
+
}
|
|
191
|
+
`
|
|
192
|
+
];
|
|
193
|
+
}
|
|
194
|
+
get selectedIndex() {
|
|
195
|
+
return this._selectedIndex;
|
|
196
|
+
}
|
|
197
|
+
set selectedIndex(value) {
|
|
198
|
+
const oldValue = this._selectedIndex;
|
|
199
|
+
if (value < -1 || this._slottedItems.length > 0 && value >= this._slottedItems.length) return;
|
|
200
|
+
this._selectedIndex = value;
|
|
201
|
+
this._updateSelectedAttribute();
|
|
202
|
+
this._scrollSelectedIntoView();
|
|
203
|
+
this.tickled.setTickled(value === -1 ? void 0 : value);
|
|
204
|
+
if (oldValue !== value) this._emitChange();
|
|
205
|
+
}
|
|
206
|
+
get selectedValue() {
|
|
207
|
+
return this._slottedItems[this._selectedIndex]?.getAttribute(`value`) ?? null;
|
|
208
|
+
}
|
|
209
|
+
set selectedValue(value) {
|
|
210
|
+
if (value === null) return;
|
|
211
|
+
const index = this._slottedItems.findIndex((item) => item.getAttribute(`value`) === value);
|
|
212
|
+
if (index >= 0) this.selectedIndex = index;
|
|
213
|
+
}
|
|
214
|
+
get selectedItem() {
|
|
215
|
+
return this._slottedItems[this._selectedIndex] ?? null;
|
|
216
|
+
}
|
|
217
|
+
get items() {
|
|
218
|
+
return this._slottedItems;
|
|
219
|
+
}
|
|
220
|
+
render() {
|
|
221
|
+
return html`
|
|
222
|
+
<div
|
|
223
|
+
class="items scroll-fade-x"
|
|
224
|
+
tabindex="0"
|
|
225
|
+
data-input-mode=${this.tickled.inputMode}
|
|
226
|
+
@pointerover=${this._handlePointerOver}
|
|
227
|
+
@pointerleave=${(e) => this.tickled.handlePointerLeave(e)}
|
|
228
|
+
@keydown=${this._handleKeyDown}
|
|
229
|
+
@click=${this._handleClick}
|
|
230
|
+
>
|
|
231
|
+
<div class="spacer"></div>
|
|
232
|
+
<slot @slotchange=${this._onSlotChange}></slot>
|
|
233
|
+
<div class="spacer"></div>
|
|
234
|
+
</div>
|
|
235
|
+
`;
|
|
236
|
+
}
|
|
237
|
+
willUpdate(changed) {
|
|
238
|
+
super.willUpdate(changed);
|
|
239
|
+
this.setAttribute(`data-input-mode`, this.tickled.inputMode);
|
|
240
|
+
}
|
|
241
|
+
_applyWheelDelta(direction, _event) {
|
|
242
|
+
if (this._wheelCooldown) return;
|
|
243
|
+
this._wheelCooldown = true;
|
|
244
|
+
this.tickled.handleKeyboardNavigation(direction === 1 ? `next` : `previous`);
|
|
245
|
+
this._applyTickledSelection();
|
|
246
|
+
setTimeout(() => {
|
|
247
|
+
this._wheelCooldown = false;
|
|
248
|
+
}, 250);
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
__decorate([state()], SelectHorizElement.prototype, "_selectedIndex", void 0);
|
|
252
|
+
__decorate([state()], SelectHorizElement.prototype, "_slottedItems", void 0);
|
|
253
|
+
__decorate([property({
|
|
254
|
+
type: Number,
|
|
255
|
+
reflect: true,
|
|
256
|
+
attribute: `selected-index`
|
|
257
|
+
})], SelectHorizElement.prototype, "selectedIndex", null);
|
|
258
|
+
__decorate([property({ type: String })], SelectHorizElement.prototype, "selectedValue", null);
|
|
259
|
+
SelectHorizElement = __decorate([safeCustomElement(`ixfx-select-horiz`)], SelectHorizElement);
|
|
260
|
+
//#endregion
|
|
261
|
+
export { SelectHorizElement };
|
|
262
|
+
|
|
263
|
+
//# sourceMappingURL=select-horiz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-horiz.js","names":["customElement"],"sources":["../src/select-horiz/select-horiz.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { WheelDirection } from '../mixins/wheel-nudge.js';\nimport { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { TickledController, tickledItemStyles, tickledStyles } from '../interaction/index.js';\nimport { WheelNudgeMixin } from '../mixins/wheel-nudge.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { scrollFadeStyles } from '../styles/scroll-fade.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type SelectHorizChangeDetail = {\n readonly selectedIndex: number;\n readonly selectedItem: HTMLElement | null;\n readonly selectedValue: string | null;\n};\n\nexport type SelectHorizChangeEvent = CustomEvent<SelectHorizChangeDetail>;\n\nexport interface SelectHorizEventMap {\n change: SelectHorizChangeEvent;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-select-horiz': SelectHorizElement;\n }\n}\n\nexport interface SelectHorizElement {\n addEventListener: (<K extends keyof SelectHorizEventMap>(\n type: K,\n listener: (this: SelectHorizElement, event: SelectHorizEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n\n@customElement(`ixfx-select-horiz`)\nexport class SelectHorizElement extends WheelNudgeMixin(LitElement) {\n static override styles = [\n themeFallbacks,\n tickledStyles,\n tickledItemStyles,\n scrollFadeStyles(`x`),\n css`\n :host {\n --select-horiz-item-width: 80%;\n --select-horiz-gap: var(--space-s);\n --select-horiz-bg: var(--surface-3);\n --select-horiz-border: var(--border);\n --select-horiz-radius: var(--radius-l);\n display: flex;\n width: 100%;\n background: var(--select-horiz-bg);\n border: var(--select-horiz-border);\n border-radius: var(--select-horiz-radius);\n }\n\n /* Edge fade (the scroll-fade-x class, see ../styles/scroll-fade.ts) must sit on\n * the element that actually scrolls - its mask is sized to this element's own\n * box, and content overflowing a *different*, non-scrolling ancestor gets the\n * mask tiled across it instead of fading correctly. */\n .items {\n display: flex;\n align-items: center;\n gap: var(--select-horiz-gap);\n padding: var(--space-xs) var(--scroll-fade-width, 30px);\n width: 100%;\n min-height: 48px;\n overflow-x: scroll;\n overflow-y: hidden;\n scrollbar-width: none;\n scroll-snap-type: x mandatory;\n -webkit-overflow-scrolling: touch;\n cursor: grab;\n \n box-sizing: border-box;\n }\n\n .items:focus-within {\n cursor: default;\n }\n\n .spacer {\n flex: 0 0 var(--select-horiz-spacer-width, 10%);\n pointer-events: none;\n user-select: none;\n }\n\n ::slotted(*) {\n flex: 0 0 var(--select-horiz-item-width);\n scroll-snap-align: center;\n user-select: none;\n min-height: 100%;\n box-sizing: border-box;\n transition: opacity var(--transition), background var(--transition), border-color var(--transition), color var(--transition);\n background: var(--item-bg);\n border: var(--item-border);\n border-radius: var(--item-border-radius);\n padding: var(--item-padding);\n display: grid;\n align-content: center;\n justify-content: center;\n }\n\n ::slotted(.tickled) {\n background: var(--item-bg-tickled);\n border: var(--item-border-tickled);\n color: var(--item-text-tickled);\n }\n\n ::slotted([selected]) {\n background: var(--item-bg-selected);\n border: var(--item-border-selected);\n color: var(--item-text-selected);\n }\n\n ::slotted([selected].tickled) {\n background: var(--item-bg-selected-tickled);\n outline: 2px dashed var(--surface-3);\n outline-offset: -2px;\n }\n\n ::-webkit-scrollbar {\n display: none;\n }\n `,\n ];\n\n @state()\n private _selectedIndex = -1;\n\n @state()\n private _slottedItems: HTMLElement[] = [];\n\n private tickled = new TickledController<number>(this, {\n getItems: () =>\n this._slottedItems.map((_, i) => ({\n id: i,\n enabled: true,\n })),\n onStateChange: () => this._syncTickled(),\n });\n\n @property({ type: Number, reflect: true, attribute: `selected-index` })\n get selectedIndex(): number {\n return this._selectedIndex;\n }\n\n set selectedIndex(value: number) {\n const oldValue = this._selectedIndex;\n // Upper bound is only enforced once items are known - this lets a\n // declarative `selected-index` attribute be accepted before slotchange\n // has had a chance to populate `_slottedItems`.\n if (value < -1 || (this._slottedItems.length > 0 && value >= this._slottedItems.length))\n return;\n this._selectedIndex = value;\n this._updateSelectedAttribute();\n this._scrollSelectedIntoView();\n // Keep the keyboard-navigation cursor anchored to the current selection,\n // so left/right always steps from here - not from wherever it was last\n // left by a stale hover or an earlier keyboard session.\n this.tickled.setTickled(value === -1 ? undefined : value);\n if (oldValue !== value) {\n this._emitChange();\n }\n }\n\n @property({ type: String })\n get selectedValue(): string | null {\n const item = this._slottedItems[this._selectedIndex];\n return item?.getAttribute(`value`) ?? null;\n }\n\n set selectedValue(value: string | null) {\n if (value === null)\n return;\n const index = this._slottedItems.findIndex(item => item.getAttribute(`value`) === value);\n if (index >= 0) {\n this.selectedIndex = index;\n }\n }\n\n get selectedItem(): HTMLElement | null {\n return this._slottedItems[this._selectedIndex] ?? null;\n }\n\n get items(): HTMLCollection {\n return this._slottedItems as unknown as HTMLCollection;\n }\n\n protected override render() {\n return html`\n <div\n class=\"items scroll-fade-x\"\n tabindex=\"0\"\n data-input-mode=${this.tickled.inputMode}\n @pointerover=${this._handlePointerOver}\n @pointerleave=${(e: PointerEvent) => this.tickled.handlePointerLeave(e)}\n @keydown=${this._handleKeyDown}\n @click=${this._handleClick}\n >\n <div class=\"spacer\"></div>\n <slot @slotchange=${this._onSlotChange}></slot>\n <div class=\"spacer\"></div>\n </div>\n `;\n }\n\n override willUpdate(changed: Map<PropertyKey, unknown>): void {\n super.willUpdate(changed);\n this.setAttribute(`data-input-mode`, this.tickled.inputMode);\n }\n\n private _onSlotChange = (): void => {\n this._slottedItems = Array.from(\n this.shadowRoot?.querySelector(`slot`)?.assignedElements() ?? [],\n ) as HTMLElement[];\n\n // A child's own `selected` attribute (declared in markup) takes priority\n // over whatever `selected-index` resolved to.\n const declaredIndex = this._slottedItems.findIndex(item => item.hasAttribute(`selected`));\n let resolvedIndex = declaredIndex >= 0 ? declaredIndex : this._selectedIndex;\n\n if (resolvedIndex >= this._slottedItems.length) {\n resolvedIndex = this._slottedItems.length - 1;\n }\n if (resolvedIndex < 0 && this._slottedItems.length > 0) {\n resolvedIndex = 0;\n }\n\n this.selectedIndex = resolvedIndex;\n };\n\n private _syncTickled = (): void => {\n this._slottedItems.forEach((item, i) => {\n const isTickled = this.tickled.isTickled(i);\n item.classList.toggle(`tickled`, isTickled);\n // Roving tabindex only follows keyboard navigation - a mouse hover\n // shouldn't relocate where Tab lands next.\n item.tabIndex = (isTickled && this.tickled.inputMode === `keyboard`) ? 0 : -1;\n });\n };\n\n // Slotted items may contain nested markup (icons, labels, ...), so a\n // pointer/click target isn't necessarily the item element itself - walk up\n // to the nearest ancestor that is one of our direct slotted children.\n private _findSlottedItem = (target: EventTarget | null): HTMLElement | undefined => {\n let el = target instanceof Element ? target : null;\n while (el) {\n if (this._slottedItems.includes(el as HTMLElement))\n return el as HTMLElement;\n el = el.parentElement;\n }\n return undefined;\n };\n\n private _handlePointerOver = (e: PointerEvent): void => {\n const item = this._findSlottedItem(e.target);\n if (item) {\n this.tickled.handlePointerEnter(this._slottedItems.indexOf(item));\n }\n };\n\n private _handleKeyDown = (e: KeyboardEvent): void => {\n if (e.key === `ArrowLeft`) {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`previous`);\n this._applyTickledSelection();\n } else if (e.key === `ArrowRight`) {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`next`);\n this._applyTickledSelection();\n } else if (e.key === `Home`) {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`first`);\n this._applyTickledSelection();\n } else if (e.key === `End`) {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`last`);\n this._applyTickledSelection();\n }\n };\n\n private _applyTickledSelection = (): void => {\n const id = this.tickled.tickledId;\n if (id !== undefined && id !== this._selectedIndex) {\n this.selectedIndex = id;\n }\n };\n\n private _wheelCooldown = false;\n\n // WheelNudgeMixin contract: direction follows the codebase-wide \"up =\n // increase\" convention (wheel up/away = +1), which here maps naturally to\n // \"next\" since selectedIndex increases moving forward through the list -\n // same direction as every other consumer of this mixin except the\n // deliberately-inverted rotary-dial case in radial-input.\n _applyWheelDelta(direction: WheelDirection, _event: WheelEvent): void {\n if (this._wheelCooldown)\n return;\n\n // Trackpads fire many wheel ticks per gesture; a short cooldown collapses\n // that into one step, matching a single arrow-key press.\n this._wheelCooldown = true;\n this.tickled.handleKeyboardNavigation(direction === 1 ? `next` : `previous`);\n this._applyTickledSelection();\n setTimeout(() => {\n this._wheelCooldown = false;\n }, 250);\n }\n\n private _handleClick = (e: MouseEvent): void => {\n // Focusing this (shadow-internal) element also focuses the host from the\n // outside - document.activeElement retargets to the host across an open\n // shadow boundary - so a single click lets arrow keys take over right away.\n (e.currentTarget as HTMLElement).focus();\n const item = this._findSlottedItem(e.target);\n const index = item ? this._slottedItems.indexOf(item) : -1;\n if (index >= 0 && index !== this._selectedIndex) {\n this.selectedIndex = index;\n }\n };\n\n private _updateSelectedAttribute = (): void => {\n this._slottedItems.forEach((item, i) => {\n if (i === this._selectedIndex) {\n item.setAttribute(`selected`, ``);\n } else {\n item.removeAttribute(`selected`);\n }\n });\n };\n\n private _scrollSelectedIntoView = (): void => {\n const item = this._slottedItems[this._selectedIndex];\n if (item) {\n item.scrollIntoView({ inline: `center`, behavior: `smooth` });\n }\n };\n\n private _emitChange = (): void => {\n this.dispatchEvent(\n new CustomEvent<SelectHorizChangeDetail>(`change`, {\n detail: {\n selectedIndex: this._selectedIndex,\n selectedItem: this.selectedItem,\n selectedValue: this.selectedValue,\n },\n bubbles: true,\n composed: true,\n }),\n );\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as themeFallbacks } from "./fallbacks-
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
|
|
2
2
|
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
3
3
|
import { t as prominenceStyles } from "./prominence-DlFShic3.js";
|
|
4
4
|
import { t as resolveAxisStep } from "./keyboard-B5xD7Fz-.js";
|
|
@@ -1589,4 +1589,4 @@ SliderInputElement = __decorate([safeCustomElement(`ixfx-slider-input`)], Slider
|
|
|
1589
1589
|
//#endregion
|
|
1590
1590
|
export { SliderInputElement as t };
|
|
1591
1591
|
|
|
1592
|
-
//# sourceMappingURL=slider-input-
|
|
1592
|
+
//# sourceMappingURL=slider-input-CT4gcF-o.js.map
|