@weasel-js/ui 0.5.1 → 0.7.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/dist/chunks/ActionBar-CiKvEvXi.js +63 -0
- package/dist/chunks/ActionBar-CiKvEvXi.js.map +1 -0
- package/dist/chunks/ActionsBar-CzU6Of3B.js +94 -0
- package/dist/chunks/ActionsBar-CzU6Of3B.js.map +1 -0
- package/dist/chunks/Badge-DU8ihE7Z.js +2942 -0
- package/dist/chunks/Badge-DU8ihE7Z.js.map +1 -0
- package/dist/chunks/Button-9QNIYugK.js +87 -0
- package/dist/chunks/Button-9QNIYugK.js.map +1 -0
- package/dist/chunks/Callout-Dt0kBIls.js +114 -0
- package/dist/chunks/Callout-Dt0kBIls.js.map +1 -0
- package/dist/chunks/Checkbox-CtK8H_OQ.js +47 -0
- package/dist/chunks/Checkbox-CtK8H_OQ.js.map +1 -0
- package/dist/chunks/ColorField-sGLnThpB.js +60 -0
- package/dist/chunks/ColorField-sGLnThpB.js.map +1 -0
- package/dist/chunks/ComboBox-pH8aDEL2.js +88 -0
- package/dist/chunks/ComboBox-pH8aDEL2.js.map +1 -0
- package/dist/chunks/CurveEditor-DrORWShU.js +786 -0
- package/dist/chunks/CurveEditor-DrORWShU.js.map +1 -0
- package/dist/chunks/DataGrid-mUq38k0Q.js +186 -0
- package/dist/chunks/DataGrid-mUq38k0Q.js.map +1 -0
- package/dist/chunks/Dialog-CQymDCAl.js +58 -0
- package/dist/chunks/Dialog-CQymDCAl.js.map +1 -0
- package/dist/chunks/Field-BHSu2F3E.js +31 -0
- package/dist/chunks/Field-BHSu2F3E.js.map +1 -0
- package/dist/chunks/Input-D_Xzgr2b.js +55 -0
- package/dist/chunks/Input-D_Xzgr2b.js.map +1 -0
- package/dist/chunks/Keycaps-B9dJMYx_.js +397 -0
- package/dist/chunks/Keycaps-B9dJMYx_.js.map +1 -0
- package/dist/chunks/NumberField-BQmELz32.js +59 -0
- package/dist/chunks/NumberField-BQmELz32.js.map +1 -0
- package/dist/chunks/OptionsBar-CHOP_CiW.js +98 -0
- package/dist/chunks/OptionsBar-CHOP_CiW.js.map +1 -0
- package/dist/chunks/Plot2D-CEnhzodm.js +168 -0
- package/dist/chunks/Plot2D-CEnhzodm.js.map +1 -0
- package/dist/chunks/PointPlotter-D528sBdT.js +16 -0
- package/dist/chunks/PointPlotter-D528sBdT.js.map +1 -0
- package/dist/chunks/Powerline-C8rddbbK.js +36 -0
- package/dist/chunks/Powerline-C8rddbbK.js.map +1 -0
- package/dist/chunks/Prefs-snBejOzK.js +238 -0
- package/dist/chunks/Prefs-snBejOzK.js.map +1 -0
- package/dist/chunks/RadioGroup-Ci-I9NEx.js +49 -0
- package/dist/chunks/RadioGroup-Ci-I9NEx.js.map +1 -0
- package/dist/chunks/RangeSlider-CW-edtNx.js +52 -0
- package/dist/chunks/RangeSlider-CW-edtNx.js.map +1 -0
- package/dist/chunks/Select-l7pAkVEG.js +97 -0
- package/dist/chunks/Select-l7pAkVEG.js.map +1 -0
- package/dist/chunks/SelectionPanel-CMglTgEf.js +303 -0
- package/dist/chunks/SelectionPanel-CMglTgEf.js.map +1 -0
- package/dist/chunks/Sidebar-BFcBx8QV.js +26 -0
- package/dist/chunks/Sidebar-BFcBx8QV.js.map +1 -0
- package/dist/chunks/SidebarPanel-CRnSlvee.js +59 -0
- package/dist/chunks/SidebarPanel-CRnSlvee.js.map +1 -0
- package/dist/chunks/Slider-sUJGgmKR.js +221 -0
- package/dist/chunks/Slider-sUJGgmKR.js.map +1 -0
- package/dist/chunks/Switch-DxJLMYki.js +27 -0
- package/dist/chunks/Switch-DxJLMYki.js.map +1 -0
- package/dist/chunks/Tabs-DelDecks.js +41 -0
- package/dist/chunks/Tabs-DelDecks.js.map +1 -0
- package/dist/chunks/Toast-Bw3XQxmV.js +128 -0
- package/dist/chunks/Toast-Bw3XQxmV.js.map +1 -0
- package/dist/chunks/ToggleBar-Defj6Asn.js +129 -0
- package/dist/chunks/ToggleBar-Defj6Asn.js.map +1 -0
- package/dist/chunks/ToolButton-Dk_uJf7N.js +53 -0
- package/dist/chunks/ToolButton-Dk_uJf7N.js.map +1 -0
- package/dist/chunks/ToolGroup-D8-qdtuw.js +25 -0
- package/dist/chunks/ToolGroup-D8-qdtuw.js.map +1 -0
- package/dist/chunks/ToolOptionsBar-ChiL-HVA.js +27 -0
- package/dist/chunks/ToolOptionsBar-ChiL-HVA.js.map +1 -0
- package/dist/chunks/ToolPalette-xKHzPKYf.js +117 -0
- package/dist/chunks/ToolPalette-xKHzPKYf.js.map +1 -0
- package/dist/chunks/Tooltip-Clgn4trm.js +39 -0
- package/dist/chunks/Tooltip-Clgn4trm.js.map +1 -0
- package/dist/chunks/keyGlyph-BDH5fqkO.js +22 -0
- package/dist/chunks/keyGlyph-BDH5fqkO.js.map +1 -0
- package/dist/components/ActionBar/index.js +2 -0
- package/dist/components/ActionsBar/index.js +2 -0
- package/dist/components/Badge/index.js +2 -0
- package/dist/components/Button/index.js +2 -0
- package/dist/components/Callout/index.js +2 -0
- package/dist/components/Checkbox/index.js +2 -0
- package/dist/components/ColorField/index.js +2 -0
- package/dist/components/ComboBox/index.js +2 -0
- package/dist/components/CurveEditor/index.js +2 -0
- package/dist/components/DataGrid/index.js +2 -0
- package/dist/components/Dialog/index.js +2 -0
- package/dist/components/Field/index.js +2 -0
- package/dist/components/Input/index.js +2 -0
- package/dist/components/Keycaps/index.js +3 -0
- package/dist/components/NumberField/index.js +2 -0
- package/dist/components/OptionsBar/index.js +2 -0
- package/dist/components/Plot2D/index.js +2 -0
- package/dist/components/PointPlotter/index.js +2 -0
- package/dist/components/Powerline/index.js +3 -0
- package/dist/components/Prefs/index.js +2 -0
- package/dist/components/RadioGroup/index.js +2 -0
- package/dist/components/RangeSlider/index.js +2 -0
- package/dist/components/Select/index.js +2 -0
- package/dist/components/SelectionPanel/SelectionPanel.d.ts.map +1 -1
- package/dist/components/SelectionPanel/index.d.ts +1 -1
- package/dist/components/SelectionPanel/index.d.ts.map +1 -1
- package/dist/components/SelectionPanel/index.js +2 -0
- package/dist/components/SelectionPanel/model.d.ts +13 -11
- package/dist/components/SelectionPanel/model.d.ts.map +1 -1
- package/dist/components/Sidebar/index.js +2 -0
- package/dist/components/SidebarPanel/index.js +2 -0
- package/dist/components/Slider/index.js +2 -0
- package/dist/components/Switch/index.js +2 -0
- package/dist/components/Tabs/index.js +2 -0
- package/dist/components/Toast/index.js +2 -0
- package/dist/components/ToggleBar/ToggleBar.d.ts +17 -0
- package/dist/components/ToggleBar/ToggleBar.d.ts.map +1 -1
- package/dist/components/ToggleBar/index.js +2 -0
- package/dist/components/ToolButton/index.js +2 -0
- package/dist/components/ToolGroup/index.js +2 -0
- package/dist/components/ToolOptionsBar/ToolOptionsBar.d.ts +44 -0
- package/dist/components/ToolOptionsBar/ToolOptionsBar.d.ts.map +1 -0
- package/dist/components/ToolOptionsBar/index.d.ts +3 -0
- package/dist/components/ToolOptionsBar/index.d.ts.map +1 -0
- package/dist/components/ToolOptionsBar/index.js +2 -0
- package/dist/components/ToolPalette/index.js +2 -0
- package/dist/components/Tooltip/index.js +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -6749
- package/dist/index.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +8 -4
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { useCallback as e, useRef as t } from "react";
|
|
2
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
3
|
+
var i = {
|
|
4
|
+
root: "_root_1jhg3_1",
|
|
5
|
+
row: "_row_1jhg3_8",
|
|
6
|
+
track: "_track_1jhg3_14",
|
|
7
|
+
trackInner: "_trackInner_1jhg3_25",
|
|
8
|
+
thumb: "_thumb_1jhg3_35",
|
|
9
|
+
thumbActive: "_thumbActive_1jhg3_74",
|
|
10
|
+
readoutsBelow: "_readoutsBelow_1jhg3_79",
|
|
11
|
+
readoutBelow: "_readoutBelow_1jhg3_85",
|
|
12
|
+
readoutInline: "_readoutInline_1jhg3_93",
|
|
13
|
+
notched: "_notched_1jhg3_101"
|
|
14
|
+
}, a = "−";
|
|
15
|
+
function o(e, t) {
|
|
16
|
+
return (Number.isFinite(e) ? e.toLocaleString(void 0, t) : String(e)).replace(/^-/, "−");
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region src/components/Slider/Slider.tsx
|
|
20
|
+
function s(e, t, n) {
|
|
21
|
+
return t === void 0 || t <= 0 ? e : Math.round((e - n) / t) * t + n;
|
|
22
|
+
}
|
|
23
|
+
function c(e, t, n) {
|
|
24
|
+
return Math.max(t, Math.min(n, e));
|
|
25
|
+
}
|
|
26
|
+
function l(e, t, n) {
|
|
27
|
+
return e !== void 0 && e > 0 ? e : (n - t) / 100;
|
|
28
|
+
}
|
|
29
|
+
function u(e, t, n, r) {
|
|
30
|
+
if (!e.bounds) return [n, r];
|
|
31
|
+
let i = typeof e.bounds == "function" ? e.bounds(t) : e.bounds;
|
|
32
|
+
return [i[0], i[1]];
|
|
33
|
+
}
|
|
34
|
+
function d(e) {
|
|
35
|
+
return o(e.value, {
|
|
36
|
+
minimumFractionDigits: 3,
|
|
37
|
+
maximumFractionDigits: 3
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function f(a) {
|
|
41
|
+
let { thumbs: o, onChange: f, onCommit: p, min: m, max: h, step: g, constraint: _, trackHeight: v, ariaLabel: y, className: b } = a, x = t(null), S = t(null), C = e((e) => h === m ? 0 : c((e - m) / (h - m), 0, 1), [m, h]), w = e((e) => m + c(e, 0, 1) * (h - m), [m, h]), T = e((e) => {
|
|
42
|
+
S.current = o.map((e) => ({ ...e }));
|
|
43
|
+
let t = !1, n = (n) => {
|
|
44
|
+
let r = x.current, i = S.current;
|
|
45
|
+
if (!r || !i) return;
|
|
46
|
+
let o = r.getBoundingClientRect(), l = w(c((n.clientX - o.left) / o.width, 0, 1));
|
|
47
|
+
l = s(l, g, m), l = c(l, m, h);
|
|
48
|
+
let [d, p] = u(i[e], {
|
|
49
|
+
thumbs: i,
|
|
50
|
+
index: e
|
|
51
|
+
}, m, h);
|
|
52
|
+
if (l = c(l, d, p), _ === "ordered") {
|
|
53
|
+
let t = g !== void 0 && g > 0 ? g : (h - m) / 1e3, n = e > 0 ? i[e - 1].value + t : m, r = e < i.length - 1 ? i[e + 1].value - t : h;
|
|
54
|
+
l = c(l, n, r);
|
|
55
|
+
}
|
|
56
|
+
let v = o.height;
|
|
57
|
+
a.onRemoveThumb && (t = n.clientY < o.top - v || n.clientY > o.bottom + v), i[e] = {
|
|
58
|
+
...i[e],
|
|
59
|
+
value: l
|
|
60
|
+
}, f(i.map((e) => ({ ...e })));
|
|
61
|
+
}, r = () => {
|
|
62
|
+
document.removeEventListener("pointermove", n), document.removeEventListener("pointerup", r);
|
|
63
|
+
let i = S.current;
|
|
64
|
+
if (S.current = null, i) {
|
|
65
|
+
if (t && a.onRemoveThumb && a.onRemoveThumb(e)) {
|
|
66
|
+
let t = i.filter((t, n) => n !== e).map((e) => ({ ...e }));
|
|
67
|
+
f(t), p?.(t);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
p && p(i.map((e) => ({ ...e })));
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
document.addEventListener("pointermove", n), document.addEventListener("pointerup", r);
|
|
74
|
+
}, [
|
|
75
|
+
o,
|
|
76
|
+
f,
|
|
77
|
+
p,
|
|
78
|
+
w,
|
|
79
|
+
m,
|
|
80
|
+
h,
|
|
81
|
+
g,
|
|
82
|
+
_,
|
|
83
|
+
a
|
|
84
|
+
]), E = e((e) => {
|
|
85
|
+
let t = o.map((e) => ({ ...e })), n = t.map((e) => e.value);
|
|
86
|
+
S.current = t;
|
|
87
|
+
let r = (t) => {
|
|
88
|
+
let r = x.current, i = S.current;
|
|
89
|
+
if (!r || !i) return;
|
|
90
|
+
let a = r.getBoundingClientRect(), o = (t.clientX - e) / a.width * (h - m);
|
|
91
|
+
o = s(o, g, 0);
|
|
92
|
+
let l = -Infinity, u = Infinity;
|
|
93
|
+
for (let e = 0; e < n.length; e++) l = Math.max(l, m - n[e]), u = Math.min(u, h - n[e]);
|
|
94
|
+
o = c(o, l, u);
|
|
95
|
+
for (let e = 0; e < i.length; e++) i[e] = {
|
|
96
|
+
...i[e],
|
|
97
|
+
value: c(n[e] + o, m, h)
|
|
98
|
+
};
|
|
99
|
+
f(i.map((e) => ({ ...e })));
|
|
100
|
+
}, i = () => {
|
|
101
|
+
document.removeEventListener("pointermove", r), document.removeEventListener("pointerup", i);
|
|
102
|
+
let e = S.current;
|
|
103
|
+
S.current = null, e && p && p(e.map((e) => ({ ...e })));
|
|
104
|
+
};
|
|
105
|
+
document.addEventListener("pointermove", r), document.addEventListener("pointerup", i);
|
|
106
|
+
}, [
|
|
107
|
+
o,
|
|
108
|
+
f,
|
|
109
|
+
p,
|
|
110
|
+
m,
|
|
111
|
+
h,
|
|
112
|
+
g
|
|
113
|
+
]), D = (e) => (t) => {
|
|
114
|
+
typeof t.button == "number" && t.button > 0 || (t.preventDefault(), t.stopPropagation(), t.shiftKey && a.allowShiftAll ? E(t.clientX) : T(e));
|
|
115
|
+
}, O = (e) => (t) => {
|
|
116
|
+
if (!a.onRemoveThumb || (t.preventDefault(), !a.onRemoveThumb(e))) return;
|
|
117
|
+
let n = o.filter((t, n) => n !== e).map((e) => ({ ...e }));
|
|
118
|
+
f(n), p?.(n);
|
|
119
|
+
}, k = (e) => {
|
|
120
|
+
if (typeof e.button == "number" && e.button > 0 || !a.onAddThumb || e.target.closest(`.${i.thumb}`)) return;
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
let t = x.current;
|
|
123
|
+
if (!t) return;
|
|
124
|
+
let n = t.getBoundingClientRect(), r = w(c((e.clientX - n.left) / n.width, 0, 1));
|
|
125
|
+
r = s(r, g, m), r = c(r, m, h);
|
|
126
|
+
let l = a.onAddThumb(r);
|
|
127
|
+
if (!l) return;
|
|
128
|
+
let u = [...o.map((e) => ({ ...e })), l];
|
|
129
|
+
f(u), p?.(u);
|
|
130
|
+
}, A = (e) => (t) => {
|
|
131
|
+
let n = l(g, m, h), r = 0, i = null;
|
|
132
|
+
switch (t.key) {
|
|
133
|
+
case "ArrowRight":
|
|
134
|
+
case "ArrowUp":
|
|
135
|
+
r = t.shiftKey ? n * 10 : n;
|
|
136
|
+
break;
|
|
137
|
+
case "ArrowLeft":
|
|
138
|
+
case "ArrowDown":
|
|
139
|
+
r = t.shiftKey ? -n * 10 : -n;
|
|
140
|
+
break;
|
|
141
|
+
case "PageUp":
|
|
142
|
+
r = n * 10;
|
|
143
|
+
break;
|
|
144
|
+
case "PageDown":
|
|
145
|
+
r = -n * 10;
|
|
146
|
+
break;
|
|
147
|
+
case "Home":
|
|
148
|
+
i = "home";
|
|
149
|
+
break;
|
|
150
|
+
case "End":
|
|
151
|
+
i = "end";
|
|
152
|
+
break;
|
|
153
|
+
default: return;
|
|
154
|
+
}
|
|
155
|
+
t.preventDefault();
|
|
156
|
+
let a = o.map((e) => ({ ...e })), [d, _] = u(a[e], {
|
|
157
|
+
thumbs: a,
|
|
158
|
+
index: e
|
|
159
|
+
}, m, h), v = Math.max(m, d), y = Math.min(h, _), b;
|
|
160
|
+
b = i === "home" ? v : i === "end" ? y : a[e].value + r, b = s(b, g, m), b = c(b, v, y), a[e] = {
|
|
161
|
+
...a[e],
|
|
162
|
+
value: b
|
|
163
|
+
}, f(a), p?.(a);
|
|
164
|
+
}, j = a.readoutPlacement ?? "none", M = a.renderReadout;
|
|
165
|
+
return /* @__PURE__ */ r("div", {
|
|
166
|
+
className: b ? `${i.root} ${b}` : i.root,
|
|
167
|
+
style: v === void 0 ? void 0 : { "--rp-track-height": `${v}px` },
|
|
168
|
+
children: [/* @__PURE__ */ r("div", {
|
|
169
|
+
className: i.row,
|
|
170
|
+
children: [/* @__PURE__ */ r("div", {
|
|
171
|
+
className: i.track,
|
|
172
|
+
ref: x,
|
|
173
|
+
onPointerDown: k,
|
|
174
|
+
children: [a.renderTrack && /* @__PURE__ */ n("div", {
|
|
175
|
+
className: i.trackInner,
|
|
176
|
+
children: a.renderTrack({
|
|
177
|
+
trackWidth: x.current?.getBoundingClientRect().width ?? 0,
|
|
178
|
+
valueToFraction: C
|
|
179
|
+
})
|
|
180
|
+
}), o.map((e, t) => {
|
|
181
|
+
let r = e.shape === "notched", a = typeof e.shape == "object" && e.shape !== null ? e.shape.render : null, o = `${i.thumb}${r ? ` ${i.notched}` : ""}`;
|
|
182
|
+
return /* @__PURE__ */ n("div", {
|
|
183
|
+
role: "slider",
|
|
184
|
+
tabIndex: 0,
|
|
185
|
+
"aria-orientation": "horizontal",
|
|
186
|
+
"aria-valuemin": m,
|
|
187
|
+
"aria-valuemax": h,
|
|
188
|
+
"aria-valuenow": e.value,
|
|
189
|
+
"aria-label": [y, e.label].filter(Boolean).join(" ") || void 0,
|
|
190
|
+
className: o,
|
|
191
|
+
style: { left: `${C(e.value) * 100}%` },
|
|
192
|
+
onPointerDown: D(t),
|
|
193
|
+
onKeyDown: A(t),
|
|
194
|
+
onContextMenu: O(t),
|
|
195
|
+
children: a ? a({
|
|
196
|
+
width: 14,
|
|
197
|
+
height: 24,
|
|
198
|
+
isActive: !1
|
|
199
|
+
}) : e.label ?? ""
|
|
200
|
+
}, t);
|
|
201
|
+
})]
|
|
202
|
+
}), j === "inline-after" && /* @__PURE__ */ n("span", {
|
|
203
|
+
"data-readout": "inline",
|
|
204
|
+
className: i.readoutInline,
|
|
205
|
+
children: o.map((e, t) => /* @__PURE__ */ r("span", { children: [t > 0 ? " / " : "", M ? M(e, t) : d(e)] }, t))
|
|
206
|
+
})]
|
|
207
|
+
}), j === "below-thumb" && /* @__PURE__ */ n("div", {
|
|
208
|
+
className: i.readoutsBelow,
|
|
209
|
+
children: o.map((e, t) => /* @__PURE__ */ n("span", {
|
|
210
|
+
"data-readout": "below",
|
|
211
|
+
className: i.readoutBelow,
|
|
212
|
+
style: { left: `${C(e.value) * 100}%` },
|
|
213
|
+
children: M ? M(e, t) : d(e)
|
|
214
|
+
}, t))
|
|
215
|
+
})]
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
//#endregion
|
|
219
|
+
export { a as n, o as r, f as t };
|
|
220
|
+
|
|
221
|
+
//# sourceMappingURL=Slider-sUJGgmKR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider-sUJGgmKR.js","names":[],"sources":["../../src/components/Slider/Slider.module.css","../../src/format/number.ts","../../src/components/Slider/Slider.tsx"],"sourcesContent":[".root {\n position: relative;\n user-select: none;\n -webkit-user-select: none;\n touch-action: none;\n}\n\n.row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.track {\n position: relative;\n flex: 1;\n min-width: 0;\n height: var(--rp-track-height, 24px);\n background: var(--wzl-track-bg);\n border: 1px solid var(--wzl-track-border);\n border-radius: 3px;\n cursor: crosshair;\n /* No `overflow: hidden` here — thumbs at extreme values would get\n * clipped at the track edges. The gradient/track-paint clip is\n * applied to `.trackInner` instead, which lets thumbs spill freely. */\n}\n\n.trackInner {\n position: absolute;\n inset: 0;\n border-radius: 3px;\n overflow: hidden;\n}\n\n.thumb {\n position: absolute;\n /* Thumb extends 2px above + below the track for grabbability + visual\n * weight. Track itself stays its natural height; the thumb just spills. */\n top: -2px;\n bottom: -2px;\n width: 14px;\n margin-left: -7px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--wzl-thumb-fill) 70%, transparent);\n border: 1px solid var(--wzl-thumb-border);\n border-radius: 3px;\n cursor: ew-resize;\n /* Frosted-glass over the (often colorful) track. Cheap on modern GPUs;\n * gracefully degrades to just the partial-alpha background on engines\n * without backdrop-filter support. */\n backdrop-filter: blur(3px);\n -webkit-backdrop-filter: blur(3px);\n /* Subtle raise — sells the \"thumb is on top of the track\" hierarchy. */\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n font: 500 0.65rem/1 ui-sans-serif, system-ui, sans-serif;\n font-variant-numeric: tabular-nums;\n /* Thumb text reads against `--wzl-thumb-fill`, which can differ from the\n * surrounding panel text color. Default = dark; consumers re-skin via\n * `--wzl-thumb-text` if they pick a dark thumb fill. */\n color: var(--wzl-thumb-text);\n /* White halo so labels stay legible over wildly varying gradient\n * backgrounds (e.g. labels 'T' / 'P' / 'B' over teal, hue 200° over\n * yellow-green, etc.). */\n text-shadow: 0 0 2px rgba(255, 255, 255, 0.7);\n}\n\n.thumb:focus-visible {\n outline: 2px solid var(--wzl-accent);\n outline-offset: 1px;\n}\n\n.thumbActive {\n /* Visual marker for the dragging/focused thumb; subclass-overridable. */\n z-index: 1;\n}\n\n.readoutsBelow {\n position: relative;\n height: 14px;\n margin-top: 4px;\n}\n\n.readoutBelow {\n position: absolute;\n transform: translateX(-50%);\n font: 500 0.65rem/1 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n color: var(--wzl-text-muted);\n white-space: nowrap;\n}\n\n.readoutInline {\n display: inline-block;\n margin-left: 8px;\n font: 500 0.7rem/1 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n color: var(--wzl-text-muted);\n vertical-align: middle;\n}\n\n.notched {\n background: var(--thumb-svg, none);\n background-size: 100% 100%;\n background-repeat: no-repeat;\n background-color: transparent;\n border: none;\n /* Notched thumbs need to disable the .thumb defaults that paint to\n * the bounding box: backdrop-filter and box-shadow both ignore the\n * SVG's polygon/notch and would render through the notch cutout.\n * Use filter: drop-shadow instead — it traces the actual rendered\n * alpha (i.e. the polygon shape including the cut). */\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n box-shadow: none;\n filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.25));\n /* Default notched SVG (down-pointing pentagon, matches the perceptual-color experiment). */\n --thumb-svg: url(\"data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30' preserveAspectRatio='none'%3E%3Cpolygon points='0,0 2.52,0 7,10.3 11.48,0 14,0 14,30 0,30' fill='rgba(255,255,255,0.62)' stroke='rgba(0,0,0,0.55)' stroke-width='0.75' stroke-linejoin='miter'/%3E%3C/svg%3E\");\n}\n","/**\n * Display-formatter for numbers. Use this anywhere a number is shown to\n * a user. The whole point: negative values get prefixed with the real\n * MINUS SIGN (U+2212) instead of the ASCII HYPHEN-MINUS (U+002D) that\n * `toLocaleString` and template literals produce by default.\n *\n * U+2212 is the same visual width as `+` and reads as a sign rather\n * than a hyphen — columns of signed numbers align cleanly and the\n * glyph doesn't get confused with a bullet or list dash.\n */\nexport const MINUS_SIGN = '−';\n\nexport function formatNumber(value: number, options?: Intl.NumberFormatOptions): string {\n const formatted = Number.isFinite(value)\n ? value.toLocaleString(undefined, options)\n : String(value);\n return formatted.replace(/^-/, MINUS_SIGN);\n}\n","import { useCallback, useRef, type CSSProperties, type KeyboardEvent as ReactKeyboardEvent, type MouseEvent as ReactMouseEvent, type PointerEvent as ReactPointerEvent, type ReactElement, type ReactNode } from 'react';\nimport s from './Slider.module.css';\nimport { formatNumber } from '../../format/number';\n\nexport type ThumbRenderCtx = {\n width: number;\n height: number;\n isActive: boolean;\n};\n\nexport type ThumbShape =\n | 'round'\n | 'notched'\n | { render: (ctx: ThumbRenderCtx) => ReactNode };\n\nexport type Thumb = {\n value: number;\n label?: string;\n shape?: ThumbShape;\n bounds?: [number, number] | ((ctx: BoundsCtx) => [number, number]);\n};\n\nexport type BoundsCtx = {\n thumbs: readonly Thumb[];\n index: number;\n};\n\nexport type TrackCtx = {\n trackWidth: number;\n valueToFraction: (v: number) => number;\n};\n\nexport type SliderProps<T extends Thumb = Thumb> = {\n thumbs: readonly T[];\n onChange: (next: T[]) => void;\n onCommit?: (next: T[]) => void;\n min: number;\n max: number;\n step?: number;\n constraint?: 'free' | 'ordered';\n onAddThumb?: (atValue: number) => T | null;\n onRemoveThumb?: (index: number) => boolean;\n allowShiftAll?: boolean;\n renderTrack?: (ctx: TrackCtx) => ReactNode;\n trackHeight?: number;\n renderReadout?: (thumb: T, index: number) => ReactNode;\n readoutPlacement?: 'none' | 'inline-after' | 'below-thumb';\n ariaLabel?: string;\n className?: string;\n};\n\nfunction snap(v: number, step: number | undefined, min: number): number {\n if (step === undefined || step <= 0) return v;\n return Math.round((v - min) / step) * step + min;\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v));\n}\n\nfunction defaultStep(step: number | undefined, min: number, max: number): number {\n if (step !== undefined && step > 0) return step;\n return (max - min) / 100;\n}\n\nfunction resolveBounds(thumb: Thumb, ctx: BoundsCtx, fallbackMin: number, fallbackMax: number): [number, number] {\n if (!thumb.bounds) return [fallbackMin, fallbackMax];\n const tuple = typeof thumb.bounds === 'function' ? thumb.bounds(ctx) : thumb.bounds;\n return [tuple[0], tuple[1]];\n}\n\nfunction defaultReadout(thumb: Thumb): string {\n return formatNumber(thumb.value, { minimumFractionDigits: 3, maximumFractionDigits: 3 });\n}\n\nexport function Slider<T extends Thumb = Thumb>(props: SliderProps<T>): ReactElement {\n const { thumbs, onChange, onCommit, min, max, step, constraint, trackHeight, ariaLabel, className } = props;\n\n const trackRef = useRef<HTMLDivElement | null>(null);\n // In-flight thumb buffer during a drag; null when not dragging.\n const dragBufferRef = useRef<T[] | null>(null);\n\n const valueToFraction = useCallback(\n (v: number): number => (max === min ? 0 : clamp((v - min) / (max - min), 0, 1)),\n [min, max],\n );\n\n const fractionToValue = useCallback(\n (f: number): number => min + clamp(f, 0, 1) * (max - min),\n [min, max],\n );\n\n const beginThumbDrag = useCallback(\n (index: number) => {\n const buf: T[] = thumbs.map(t => ({ ...t }));\n dragBufferRef.current = buf;\n let droppedOff = false;\n\n const onMove = (ev: PointerEvent) => {\n const track = trackRef.current;\n const buffer = dragBufferRef.current;\n if (!track || !buffer) return;\n const rect = track.getBoundingClientRect();\n const f = clamp((ev.clientX - rect.left) / rect.width, 0, 1);\n let v = fractionToValue(f);\n v = snap(v, step, min);\n v = clamp(v, min, max);\n\n const [bLo, bHi] = resolveBounds(buffer[index], { thumbs: buffer, index }, min, max);\n v = clamp(v, bLo, bHi);\n\n if (constraint === 'ordered') {\n const gap = step !== undefined && step > 0 ? step : (max - min) / 1000;\n const lower = index > 0 ? buffer[index - 1].value + gap : min;\n const upper = index < buffer.length - 1 ? buffer[index + 1].value - gap : max;\n v = clamp(v, lower, upper);\n }\n\n // Drop-off detection: pointer exits the track vertically by more than trackHeight.\n const bandHeight = rect.height;\n if (props.onRemoveThumb) {\n if (ev.clientY < rect.top - bandHeight || ev.clientY > rect.bottom + bandHeight) {\n droppedOff = true;\n } else {\n droppedOff = false;\n }\n }\n\n buffer[index] = { ...buffer[index], value: v };\n onChange(buffer.map(t => ({ ...t })));\n };\n\n const onUp = () => {\n document.removeEventListener('pointermove', onMove);\n document.removeEventListener('pointerup', onUp);\n const buffer = dragBufferRef.current;\n dragBufferRef.current = null;\n if (!buffer) return;\n\n if (droppedOff && props.onRemoveThumb) {\n const accepted = props.onRemoveThumb(index);\n if (accepted) {\n const next = buffer.filter((_, i) => i !== index).map(t => ({ ...t })) as T[];\n onChange(next);\n onCommit?.(next);\n return;\n }\n }\n\n if (onCommit) onCommit(buffer.map(t => ({ ...t })));\n };\n\n document.addEventListener('pointermove', onMove);\n document.addEventListener('pointerup', onUp);\n },\n [thumbs, onChange, onCommit, fractionToValue, min, max, step, constraint, props],\n );\n\n const beginShiftAllDrag = useCallback(\n (anchorX: number) => {\n const buf: T[] = thumbs.map(t => ({ ...t }));\n const startValues = buf.map(t => t.value);\n dragBufferRef.current = buf;\n\n const onMove = (ev: PointerEvent) => {\n const track = trackRef.current;\n const buffer = dragBufferRef.current;\n if (!track || !buffer) return;\n const rect = track.getBoundingClientRect();\n const dxFraction = (ev.clientX - anchorX) / rect.width;\n let dValue = dxFraction * (max - min);\n dValue = snap(dValue, step, 0);\n\n // Clamp delta so no thumb leaves [min, max] (per-thumb bounds intentionally\n // not enforced — matches the experiment's hue-band shift-translate semantics).\n let allowedNeg = -Infinity;\n let allowedPos = Infinity;\n for (let i = 0; i < startValues.length; i++) {\n allowedNeg = Math.max(allowedNeg, min - startValues[i]);\n allowedPos = Math.min(allowedPos, max - startValues[i]);\n }\n dValue = clamp(dValue, allowedNeg, allowedPos);\n\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = { ...buffer[i], value: clamp(startValues[i] + dValue, min, max) };\n }\n onChange(buffer.map(t => ({ ...t })));\n };\n\n const onUp = () => {\n document.removeEventListener('pointermove', onMove);\n document.removeEventListener('pointerup', onUp);\n const buffer = dragBufferRef.current;\n dragBufferRef.current = null;\n if (buffer && onCommit) onCommit(buffer.map(t => ({ ...t })));\n };\n\n document.addEventListener('pointermove', onMove);\n document.addEventListener('pointerup', onUp);\n },\n [thumbs, onChange, onCommit, min, max, step],\n );\n\n const onThumbPointerDown = (index: number) => (e: ReactPointerEvent) => {\n // Only bail on explicit non-primary buttons (button > 0). jsdom's PointerEvent\n // leaves `button` undefined; treat that as primary so tests can drive drags.\n if (typeof e.button === 'number' && e.button > 0) return;\n e.preventDefault();\n e.stopPropagation();\n if (e.shiftKey && props.allowShiftAll) {\n beginShiftAllDrag(e.clientX);\n } else {\n beginThumbDrag(index);\n }\n };\n\n const onThumbContextMenu = (index: number) => (e: ReactMouseEvent) => {\n if (!props.onRemoveThumb) return;\n e.preventDefault();\n const accepted = props.onRemoveThumb(index);\n if (!accepted) return;\n const next = thumbs.filter((_, i) => i !== index).map(t => ({ ...t })) as T[];\n onChange(next);\n onCommit?.(next);\n };\n\n const onTrackPointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (typeof e.button === 'number' && e.button > 0) return;\n if (!props.onAddThumb) return;\n // If the event originated on a thumb, the thumb's own handler ran first; this is a track click.\n if ((e.target as HTMLElement).closest(`.${s.thumb}`)) return;\n e.preventDefault();\n const track = trackRef.current;\n if (!track) return;\n const rect = track.getBoundingClientRect();\n const f = clamp((e.clientX - rect.left) / rect.width, 0, 1);\n let v = fractionToValue(f);\n v = snap(v, step, min);\n v = clamp(v, min, max);\n const created = props.onAddThumb(v);\n if (!created) return;\n const next = [...thumbs.map(t => ({ ...t })), created] as T[];\n onChange(next);\n onCommit?.(next);\n };\n\n const onThumbKeyDown = (index: number) => (e: ReactKeyboardEvent) => {\n const stepSize = defaultStep(step, min, max);\n let delta = 0;\n let snapTo: 'home' | 'end' | null = null;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n delta = e.shiftKey ? stepSize * 10 : stepSize;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n delta = e.shiftKey ? -stepSize * 10 : -stepSize;\n break;\n case 'PageUp':\n delta = stepSize * 10;\n break;\n case 'PageDown':\n delta = -stepSize * 10;\n break;\n case 'Home':\n snapTo = 'home';\n break;\n case 'End':\n snapTo = 'end';\n break;\n default:\n return;\n }\n\n e.preventDefault();\n const next = thumbs.map(t => ({ ...t }));\n const [bLo, bHi] = resolveBounds(next[index], { thumbs: next, index }, min, max);\n const lo = Math.max(min, bLo);\n const hi = Math.min(max, bHi);\n let v: number;\n if (snapTo === 'home') v = lo;\n else if (snapTo === 'end') v = hi;\n else v = next[index].value + delta;\n v = snap(v, step, min);\n v = clamp(v, lo, hi);\n next[index] = { ...next[index], value: v };\n onChange(next);\n onCommit?.(next);\n };\n\n const placement = props.readoutPlacement ?? 'none';\n const renderReadout = props.renderReadout;\n\n return (\n <div\n className={className ? `${s.root} ${className}` : s.root}\n style={trackHeight !== undefined ? ({ ['--rp-track-height' as string]: `${trackHeight}px` } as CSSProperties) : undefined}\n >\n <div className={s.row}>\n <div className={s.track} ref={trackRef} onPointerDown={onTrackPointerDown}>\n {props.renderTrack && (\n <div className={s.trackInner}>\n {props.renderTrack({\n trackWidth: trackRef.current?.getBoundingClientRect().width ?? 0,\n valueToFraction,\n })}\n </div>\n )}\n {thumbs.map((thumb, i) => {\n const isNotched = thumb.shape === 'notched';\n const customRender = typeof thumb.shape === 'object' && thumb.shape !== null ? thumb.shape.render : null;\n const cls = `${s.thumb}${isNotched ? ` ${s.notched}` : ''}`;\n return (\n <div\n key={i}\n role=\"slider\"\n tabIndex={0}\n aria-orientation=\"horizontal\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={thumb.value}\n aria-label={[ariaLabel, thumb.label].filter(Boolean).join(' ') || undefined}\n className={cls}\n style={{ left: `${valueToFraction(thumb.value) * 100}%` }}\n onPointerDown={onThumbPointerDown(i)}\n onKeyDown={onThumbKeyDown(i)}\n onContextMenu={onThumbContextMenu(i)}\n >\n {customRender ? customRender({ width: 14, height: 24, isActive: false }) : (thumb.label ?? '')}\n </div>\n );\n })}\n </div>\n {placement === 'inline-after' && (\n <span data-readout=\"inline\" className={s.readoutInline}>\n {thumbs.map((t, i) => (\n <span key={i}>{i > 0 ? ' / ' : ''}{renderReadout ? renderReadout(t, i) : defaultReadout(t)}</span>\n ))}\n </span>\n )}\n </div>\n {placement === 'below-thumb' && (\n <div className={s.readoutsBelow}>\n {thumbs.map((t, i) => (\n <span\n key={i}\n data-readout=\"below\"\n className={s.readoutBelow}\n style={{ left: `${valueToFraction(t.value) * 100}%` }}\n >\n {renderReadout ? renderReadout(t, i) : defaultReadout(t)}\n </span>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { forwardRef as e } from "react";
|
|
2
|
+
import { Switch as t } from "react-aria-components";
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
var i = {
|
|
5
|
+
switch: "_switch_1yfo6_1",
|
|
6
|
+
track: "_track_1yfo6_18",
|
|
7
|
+
thumb: "_thumb_1yfo6_38",
|
|
8
|
+
label: "_label_1yfo6_54"
|
|
9
|
+
}, a = e(function(e, a) {
|
|
10
|
+
let { children: o, className: s, ...c } = e;
|
|
11
|
+
return /* @__PURE__ */ r(t, {
|
|
12
|
+
...c,
|
|
13
|
+
ref: a,
|
|
14
|
+
className: [i.switch, s].filter(Boolean).join(" "),
|
|
15
|
+
children: [/* @__PURE__ */ n("span", {
|
|
16
|
+
className: i.track,
|
|
17
|
+
children: /* @__PURE__ */ n("span", { className: i.thumb })
|
|
18
|
+
}), o !== void 0 && /* @__PURE__ */ n("span", {
|
|
19
|
+
className: i.label,
|
|
20
|
+
children: o
|
|
21
|
+
})]
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
//#endregion
|
|
25
|
+
export { a as t };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=Switch-DxJLMYki.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch-DxJLMYki.js","names":[],"sources":["../../src/components/Switch/Switch.module.css","../../src/components/Switch/Switch.tsx"],"sourcesContent":[".switch {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-family: var(--wzl-font-ui);\n font-size: 13px;\n color: var(--wzl-fg);\n user-select: none;\n -webkit-user-select: none;\n}\n\n.switch[data-disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.track {\n position: relative;\n flex: 0 0 auto;\n width: 28px;\n height: 16px;\n background: var(--wzl-input-bg);\n border: 1px solid var(--wzl-border-strong);\n border-radius: 8px;\n transition: background-color var(--wzl-motion-fast), border-color var(--wzl-motion-fast), box-shadow var(--wzl-motion-fast);\n}\n\n.switch[data-focus-visible] .track {\n box-shadow: 0 0 0 2px var(--wzl-focus-ring);\n}\n\n.switch[data-selected] .track {\n background: var(--wzl-accent-strong);\n border-color: var(--wzl-accent-strong);\n}\n\n.thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 12px;\n height: 12px;\n background: var(--wzl-fg);\n border-radius: 50%;\n transition: transform var(--wzl-motion-fast);\n}\n\n.switch[data-selected] .thumb {\n transform: translateX(12px);\n background: var(--wzl-fg-on-accent);\n}\n\n.label {\n line-height: 1.2;\n}\n","import { forwardRef, type ReactNode, type Ref } from 'react';\nimport {\n Switch as RACSwitch,\n type SwitchProps as RACSwitchProps,\n} from 'react-aria-components';\nimport s from './Switch.module.css';\n\nexport type SwitchProps = Omit<RACSwitchProps, 'children' | 'className'> & {\n children?: ReactNode;\n className?: string;\n};\n\nexport const Switch = forwardRef(function Switch(\n props: SwitchProps,\n ref: Ref<HTMLLabelElement>,\n) {\n const { children, className, ...rest } = props;\n return (\n <RACSwitch\n {...rest}\n ref={ref}\n className={[s.switch, className].filter(Boolean).join(' ')}\n >\n <span className={s.track}>\n <span className={s.thumb} />\n </span>\n {children !== undefined && <span className={s.label}>{children}</span>}\n </RACSwitch>\n );\n});\n"],"mappings":";;;;;;;;GCYa,IAAS,EAAW,SAC/B,GACA,GACA;CACA,IAAM,EAAE,aAAU,cAAW,GAAG,MAAS;CACzC,OACE,kBAAC,GAAD;EACE,GAAI;EACC;EACL,WAAW,CAAC,EAAE,QAAQ,EAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;YAH5D,CAKE,kBAAC,QAAD;GAAM,WAAW,EAAE;aACjB,kBAAC,QAAD,EAAM,WAAW,EAAE,OAAS,CAAA;GACvB,CAAA,EACN,MAAa,KAAA,KAAa,kBAAC,QAAD;GAAM,WAAW,EAAE;GAAQ;GAAgB,CAAA,CAC5D;;EAEd"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Tab as e, TabList as t, TabPanel as n, Tabs as r } from "react-aria-components";
|
|
2
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
3
|
+
var a = {
|
|
4
|
+
tabs: "_tabs_ce73l_1",
|
|
5
|
+
list: "_list_ce73l_18",
|
|
6
|
+
tab: "_tab_ce73l_1",
|
|
7
|
+
panel: "_panel_ce73l_81"
|
|
8
|
+
};
|
|
9
|
+
//#endregion
|
|
10
|
+
//#region src/components/Tabs/Tabs.tsx
|
|
11
|
+
function o({ children: e, className: t, ...n }) {
|
|
12
|
+
return /* @__PURE__ */ i(r, {
|
|
13
|
+
...n,
|
|
14
|
+
className: [a.tabs, t].filter(Boolean).join(" "),
|
|
15
|
+
children: e
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function s({ className: e, ...n }) {
|
|
19
|
+
return /* @__PURE__ */ i(t, {
|
|
20
|
+
...n,
|
|
21
|
+
className: [a.list, e].filter(Boolean).join(" ")
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function c({ children: t, className: n, ...r }) {
|
|
25
|
+
return /* @__PURE__ */ i(e, {
|
|
26
|
+
...r,
|
|
27
|
+
className: [a.tab, n].filter(Boolean).join(" "),
|
|
28
|
+
children: t
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function l({ children: e, className: t, ...r }) {
|
|
32
|
+
return /* @__PURE__ */ i(n, {
|
|
33
|
+
...r,
|
|
34
|
+
className: [a.panel, t].filter(Boolean).join(" "),
|
|
35
|
+
children: e
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { o as i, s as n, l as r, c as t };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=Tabs-DelDecks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs-DelDecks.js","names":[],"sources":["../../src/components/Tabs/Tabs.module.css","../../src/components/Tabs/Tabs.tsx"],"sourcesContent":[".tabs {\n display: flex;\n flex-direction: column;\n gap: 0;\n font-family: var(--wzl-font-ui);\n color: var(--wzl-fg);\n}\n\n.tabs[data-orientation=\"horizontal\"] {\n flex-direction: column;\n}\n\n.tabs[data-orientation=\"vertical\"] {\n flex-direction: row;\n gap: 12px;\n}\n\n.list {\n display: flex;\n gap: 2px;\n border-bottom: 1px solid var(--wzl-border);\n}\n\n.tabs[data-orientation=\"vertical\"] .list {\n flex-direction: column;\n border-bottom: none;\n border-right: 1px solid var(--wzl-border);\n padding-right: 8px;\n}\n\n.tab {\n position: relative;\n padding: 6px 10px;\n background: transparent;\n border: none;\n color: var(--wzl-fg-muted);\n font: inherit;\n font-size: 12px;\n cursor: pointer;\n outline: none;\n transition: color var(--wzl-motion-fast);\n}\n\n.tab[data-hovered]:not([data-disabled]) {\n color: var(--wzl-fg);\n}\n\n.tab[data-selected] {\n color: var(--wzl-fg);\n}\n\n.tab[data-selected]::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: -1px;\n height: 2px;\n background: var(--wzl-accent-strong);\n}\n\n.tabs[data-orientation=\"vertical\"] .tab[data-selected]::after {\n left: auto;\n right: -9px;\n top: 0;\n bottom: 0;\n width: 2px;\n height: auto;\n}\n\n.tab[data-focus-visible] {\n box-shadow: inset 0 0 0 2px var(--wzl-focus-ring);\n border-radius: var(--wzl-radius-sm);\n}\n\n.tab[data-disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.panel {\n padding: 12px 0;\n outline: none;\n}\n\n.panel[data-focus-visible] {\n box-shadow: inset 0 0 0 2px var(--wzl-focus-ring);\n border-radius: var(--wzl-radius-sm);\n}\n","import type { ReactNode } from 'react';\nimport {\n Tabs as RACTabs,\n TabList as RACTabList,\n Tab as RACTab,\n TabPanel as RACTabPanel,\n type TabsProps as RACTabsProps,\n type TabListProps as RACTabListProps,\n type TabProps as RACTabProps,\n type TabPanelProps as RACTabPanelProps,\n} from 'react-aria-components';\nimport s from './Tabs.module.css';\n\nexport type TabsProps = Omit<RACTabsProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\nexport function Tabs({ children, className, ...rest }: TabsProps) {\n return (\n <RACTabs {...rest} className={[s.tabs, className].filter(Boolean).join(' ')}>\n {children}\n </RACTabs>\n );\n}\n\nexport type TabListProps<T extends object> = Omit<RACTabListProps<T>, 'className'> & {\n className?: string;\n};\n\nexport function TabList<T extends object>({ className, ...rest }: TabListProps<T>) {\n return <RACTabList<T> {...rest} className={[s.list, className].filter(Boolean).join(' ')} />;\n}\n\nexport type TabProps = Omit<RACTabProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\nexport function Tab({ children, className, ...rest }: TabProps) {\n return (\n <RACTab {...rest} className={[s.tab, className].filter(Boolean).join(' ')}>\n {children}\n </RACTab>\n );\n}\n\nexport type TabPanelProps = Omit<RACTabPanelProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\nexport function TabPanel({ children, className, ...rest }: TabPanelProps) {\n return (\n <RACTabPanel {...rest} className={[s.panel, className].filter(Boolean).join(' ')}>\n {children}\n </RACTabPanel>\n );\n}\n"],"mappings":";;;;;;;;;;ACkBA,SAAgB,EAAK,EAAE,aAAU,cAAW,GAAG,KAAmB;CAChE,OACE,kBAAC,GAAD;EAAS,GAAI;EAAM,WAAW,CAAC,EAAE,MAAM,EAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;EACxE;EACO,CAAA;;AAQd,SAAgB,EAA0B,EAAE,cAAW,GAAG,KAAyB;CACjF,OAAO,kBAAC,GAAD;EAAe,GAAI;EAAM,WAAW,CAAC,EAAE,MAAM,EAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;EAAI,CAAA;;AAQ9F,SAAgB,EAAI,EAAE,aAAU,cAAW,GAAG,KAAkB;CAC9D,OACE,kBAAC,GAAD;EAAQ,GAAI;EAAM,WAAW,CAAC,EAAE,KAAK,EAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;EACtE;EACM,CAAA;;AASb,SAAgB,EAAS,EAAE,aAAU,cAAW,GAAG,KAAuB;CACxE,OACE,kBAAC,GAAD;EAAa,GAAI;EAAM,WAAW,CAAC,EAAE,OAAO,EAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;EAC7E;EACW,CAAA"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Button as e, Text as t, UNSTABLE_Toast as n, UNSTABLE_ToastContent as r, UNSTABLE_ToastQueue as i, UNSTABLE_ToastRegion as a } from "react-aria-components";
|
|
2
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
3
|
+
import { flushSync as c } from "react-dom";
|
|
4
|
+
//#region src/components/Toast/queue.ts
|
|
5
|
+
var l = 8e3, u = 0;
|
|
6
|
+
function d(e) {
|
|
7
|
+
let t = typeof matchMedia == "function" && matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
8
|
+
if (typeof document > "u" || !("startViewTransition" in document) || t) {
|
|
9
|
+
e();
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
let n = document.documentElement;
|
|
13
|
+
u++, n.classList.add("wzl-toast-vt");
|
|
14
|
+
let r = document.startViewTransition(() => c(e));
|
|
15
|
+
r.ready.catch(() => {}), r.finished.finally(() => {
|
|
16
|
+
--u === 0 && n.classList.remove("wzl-toast-vt");
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
var f = /* @__PURE__ */ new WeakMap(), p = class {
|
|
20
|
+
keysById = /* @__PURE__ */ new Map();
|
|
21
|
+
constructor() {
|
|
22
|
+
f.set(this, new i({
|
|
23
|
+
maxVisibleToasts: 5,
|
|
24
|
+
wrapUpdate: d
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
add(e, t, n = {}) {
|
|
28
|
+
let { description: r, ttlMs: i = l, id: a } = n, o = f.get(this);
|
|
29
|
+
if (a !== void 0) {
|
|
30
|
+
let e = this.keysById.get(a);
|
|
31
|
+
e !== void 0 && o.close(e);
|
|
32
|
+
}
|
|
33
|
+
let s, c = i === null ? {} : { timeout: i };
|
|
34
|
+
a !== void 0 && (c.onClose = () => {
|
|
35
|
+
this.keysById.get(a) === s && this.keysById.delete(a);
|
|
36
|
+
}), s = o.add({
|
|
37
|
+
title: t,
|
|
38
|
+
description: r,
|
|
39
|
+
tone: e
|
|
40
|
+
}, c), a !== void 0 && this.keysById.set(a, s);
|
|
41
|
+
}
|
|
42
|
+
dismiss(e) {
|
|
43
|
+
let t = this.keysById.get(e);
|
|
44
|
+
t !== void 0 && f.get(this).close(t);
|
|
45
|
+
}
|
|
46
|
+
clear() {
|
|
47
|
+
f.get(this).clear(), this.keysById.clear();
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
function m() {
|
|
51
|
+
return new p();
|
|
52
|
+
}
|
|
53
|
+
function h(e) {
|
|
54
|
+
return f.get(e);
|
|
55
|
+
}
|
|
56
|
+
var g = m();
|
|
57
|
+
function _(e) {
|
|
58
|
+
return (t, n) => g.add(e, t, n);
|
|
59
|
+
}
|
|
60
|
+
var v = Object.assign(_("info"), {
|
|
61
|
+
info: _("info"),
|
|
62
|
+
success: _("success"),
|
|
63
|
+
warning: _("warning"),
|
|
64
|
+
error: _("error")
|
|
65
|
+
}), y = {
|
|
66
|
+
region: "_region_18i9b_1",
|
|
67
|
+
bottomRight: "_bottomRight_18i9b_17",
|
|
68
|
+
bottomLeft: "_bottomLeft_18i9b_18",
|
|
69
|
+
topRight: "_topRight_18i9b_19",
|
|
70
|
+
topLeft: "_topLeft_18i9b_20",
|
|
71
|
+
toast: "_toast_18i9b_22",
|
|
72
|
+
toneInfo: "_toneInfo_18i9b_48",
|
|
73
|
+
toneSuccess: "_toneSuccess_18i9b_49",
|
|
74
|
+
toneWarning: "_toneWarning_18i9b_50",
|
|
75
|
+
toneError: "_toneError_18i9b_51",
|
|
76
|
+
content: "_content_18i9b_53",
|
|
77
|
+
title: "_title_18i9b_58",
|
|
78
|
+
description: "_description_18i9b_64",
|
|
79
|
+
close: "_close_18i9b_71"
|
|
80
|
+
}, b = {
|
|
81
|
+
"bottom-right": y.bottomRight,
|
|
82
|
+
"bottom-left": y.bottomLeft,
|
|
83
|
+
"top-right": y.topRight,
|
|
84
|
+
"top-left": y.topLeft
|
|
85
|
+
}, x = {
|
|
86
|
+
info: y.toneInfo,
|
|
87
|
+
success: y.toneSuccess,
|
|
88
|
+
warning: y.toneWarning,
|
|
89
|
+
error: y.toneError
|
|
90
|
+
};
|
|
91
|
+
function S(i) {
|
|
92
|
+
let { queue: c = g, placement: l = "bottom-right", className: u } = i;
|
|
93
|
+
return /* @__PURE__ */ o(a, {
|
|
94
|
+
queue: h(c),
|
|
95
|
+
"aria-label": "Notifications",
|
|
96
|
+
className: [
|
|
97
|
+
y.region,
|
|
98
|
+
b[l],
|
|
99
|
+
u
|
|
100
|
+
].filter(Boolean).join(" "),
|
|
101
|
+
children: ({ toast: i }) => /* @__PURE__ */ s(n, {
|
|
102
|
+
toast: i,
|
|
103
|
+
className: [y.toast, x[i.content.tone]].filter(Boolean).join(" "),
|
|
104
|
+
style: { viewTransitionName: `wzl-toast-${i.key.replace(/[^a-zA-Z0-9_-]/g, "_")}` },
|
|
105
|
+
children: [/* @__PURE__ */ s(r, {
|
|
106
|
+
className: y.content,
|
|
107
|
+
children: [/* @__PURE__ */ o(t, {
|
|
108
|
+
slot: "title",
|
|
109
|
+
className: y.title,
|
|
110
|
+
children: i.content.title
|
|
111
|
+
}), i.content.description !== void 0 && /* @__PURE__ */ o(t, {
|
|
112
|
+
slot: "description",
|
|
113
|
+
className: y.description,
|
|
114
|
+
children: i.content.description
|
|
115
|
+
})]
|
|
116
|
+
}), /* @__PURE__ */ o(e, {
|
|
117
|
+
slot: "close",
|
|
118
|
+
className: y.close,
|
|
119
|
+
"aria-label": "Dismiss notification",
|
|
120
|
+
children: "×"
|
|
121
|
+
})]
|
|
122
|
+
})
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
//#endregion
|
|
126
|
+
export { v as a, g as i, p as n, m as r, S as t };
|
|
127
|
+
|
|
128
|
+
//# sourceMappingURL=Toast-Bw3XQxmV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast-Bw3XQxmV.js","names":[],"sources":["../../src/components/Toast/queue.ts","../../src/components/Toast/Toast.module.css","../../src/components/Toast/Toast.tsx"],"sourcesContent":["import { UNSTABLE_ToastQueue } from 'react-aria-components';\nimport { flushSync } from 'react-dom';\n\nexport type ToastTone = 'info' | 'success' | 'warning' | 'error';\n\n/** Kit-owned payload rendered inside each toast. */\nexport interface ToastContent {\n title: string;\n description?: string;\n tone: ToastTone;\n}\n\nexport interface ToastOptions {\n description?: string;\n /**\n * Auto-dismiss delay in ms. Default 8000. `null` — sticky until dismissed.\n * Must be > 0; RAC treats 0 as no timer (sticky).\n */\n ttlMs?: number | null;\n /** Stable identity: re-adding with the same id replaces the earlier toast. */\n id?: string;\n}\n\nconst DEFAULT_TTL_MS = 8000;\n\n// Tracks overlapping toast-triggered view transitions so the `:root`\n// marker class survives until the *last* one settles.\nlet activeToastTransitions = 0;\n\n/**\n * RAC's sanctioned toast-animation hook: wrap every queue mutation in a\n * view transition so entry, exit, and the surviving stack's reflow all\n * animate (choreography lives in `toastViewTransitions.css`). Falls back\n * to a plain synchronous update when the browser lacks the API or the\n * user prefers reduced motion — i.e. exactly the pre-animation behavior.\n * The jsdom test environment always takes the fallback path.\n */\nfunction viewTransitionWrapUpdate(fn: () => void): void {\n const reduceMotion =\n typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (typeof document === 'undefined' || !('startViewTransition' in document) || reduceMotion) {\n fn();\n return;\n }\n // The marker class scopes the CSS that un-names `:root` (keeps the rest\n // of the page live and interactive during the transition) to\n // toast-owned transitions only.\n const root = document.documentElement;\n activeToastTransitions++;\n root.classList.add('wzl-toast-vt');\n // flushSync: the DOM must reflect the queue change inside the\n // transition callback, before the browser snapshots the new state.\n const vt = document.startViewTransition(() => flushSync(fn));\n // `ready` rejects when the browser skips the transition — routine under\n // a rapid burst of toasts, where each new transition supersedes the\n // in-flight one. The DOM update has still applied by then, but an\n // untouched `ready` surfaces the rejection as a console error, so\n // consume it.\n vt.ready.catch(() => {});\n void vt.finished.finally(() => {\n if (--activeToastTransitions === 0) root.classList.remove('wzl-toast-vt');\n });\n}\n\n// The wrapped RAC queue lives in a module-scoped WeakMap so the public\n// class surface carries no RAC (UNSTABLE_) types — see the design spec's\n// containment rule. `racQueueOf` below is the folder-internal accessor.\nconst RAC_QUEUES = new WeakMap<ToastQueue, UNSTABLE_ToastQueue<ToastContent>>();\n\n/**\n * Kit-owned toast queue. Create isolated instances with\n * `createToastQueue()` (tests, secondary roots); most apps use the\n * module-level `defaultToastQueue` via `toast()`.\n *\n * At most 5 toasts are visible at once; adding a 6th shows immediately\n * and hides the oldest (it returns when a slot frees, with its ttl\n * restarted).\n */\nexport class ToastQueue {\n private keysById = new Map<string, string>();\n\n constructor() {\n RAC_QUEUES.set(\n this,\n new UNSTABLE_ToastQueue<ToastContent>({\n maxVisibleToasts: 5,\n wrapUpdate: viewTransitionWrapUpdate,\n }),\n );\n }\n\n add(tone: ToastTone, title: string, options: ToastOptions = {}): void {\n const { description, ttlMs = DEFAULT_TTL_MS, id } = options;\n const rac = RAC_QUEUES.get(this)!;\n if (id !== undefined) {\n const existing = this.keysById.get(id);\n if (existing !== undefined) rac.close(existing);\n }\n let key: string;\n const racOptions: { timeout?: number; onClose?: () => void } =\n ttlMs === null ? {} : { timeout: ttlMs };\n if (id !== undefined) {\n racOptions.onClose = () => {\n if (this.keysById.get(id) === key) this.keysById.delete(id);\n };\n }\n key = rac.add({ title, description, tone }, racOptions);\n if (id !== undefined) this.keysById.set(id, key);\n }\n\n /** Dismiss the toast previously added with this `id`. No-op if none is live. */\n dismiss(id: string): void {\n const key = this.keysById.get(id);\n if (key !== undefined) RAC_QUEUES.get(this)!.close(key);\n }\n\n /** Dismiss every queued toast. */\n clear(): void {\n RAC_QUEUES.get(this)!.clear();\n this.keysById.clear();\n }\n}\n\nexport function createToastQueue(): ToastQueue {\n return new ToastQueue();\n}\n\n/**\n * Folder-internal bridge to the wrapped RAC queue for `ToastRegion`.\n * Deliberately NOT exported from the Toast folder's `index.ts` — the\n * RAC toast surface is unstable and must not leak past this folder.\n */\nexport function racQueueOf(queue: ToastQueue): UNSTABLE_ToastQueue<ToastContent> {\n return RAC_QUEUES.get(queue)!;\n}\n\n/** Module-level default queue used by `toast()` and `<ToastRegion>`. */\nexport const defaultToastQueue = createToastQueue();\n\ntype ToastFn = {\n (title: string, options?: ToastOptions): void;\n info(title: string, options?: ToastOptions): void;\n success(title: string, options?: ToastOptions): void;\n warning(title: string, options?: ToastOptions): void;\n error(title: string, options?: ToastOptions): void;\n};\n\nfunction tonedAdd(tone: ToastTone) {\n return (title: string, options?: ToastOptions) => defaultToastQueue.add(tone, title, options);\n}\n\n/** Imperative convenience over `defaultToastQueue`. Bare `toast(...)` is `info`. */\nexport const toast: ToastFn = Object.assign(tonedAdd('info'), {\n info: tonedAdd('info'),\n success: tonedAdd('success'),\n warning: tonedAdd('warning'),\n error: tonedAdd('error'),\n});\n",".region {\n position: fixed;\n z-index: 1100;\n display: flex;\n /* RAC unshifts new toasts to the front of the DOM (newest-first), and the\n * ol/li wrappers are display:contents, so the flex direction alone\n * decides which end of the stack the newest toast lands on. Base\n * (bottom corners): column-reverse puts DOM-first (newest) at the\n * bottom, hugging the corner. Top corners override back to column so\n * DOM-first still hugs the top edge. */\n flex-direction: column-reverse;\n gap: 8px;\n max-width: 360px;\n outline: none;\n}\n\n.bottomRight { bottom: 16px; right: 16px; }\n.bottomLeft { bottom: 16px; left: 16px; }\n.topRight { top: 16px; right: 16px; flex-direction: column; }\n.topLeft { top: 16px; left: 16px; flex-direction: column; }\n\n.toast {\n --toast-accent: var(--wzl-accent-strong);\n /* Groups every toast under one ident so toastViewTransitions.css can\n * target `::view-transition-new/old(.wzl-toast)` without knowing the\n * per-toast view-transition-name (set inline in Toast.tsx). */\n view-transition-class: wzl-toast;\n display: flex;\n align-items: flex-start;\n gap: 8px;\n background: var(--wzl-surface);\n border: 1px solid var(--wzl-border);\n border-left: 3px solid var(--toast-accent);\n border-radius: var(--wzl-radius-md);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);\n color: var(--wzl-fg);\n font-family: var(--wzl-font-ui);\n padding: 10px 12px;\n outline: none;\n}\n\n.region[data-focus-visible],\n.toast[data-focus-visible] {\n outline: 2px solid var(--wzl-focus-ring);\n outline-offset: 1px;\n}\n\n.toneInfo { /* default accent — uses --toast-accent fallback */ }\n.toneSuccess { --toast-accent: var(--wzl-success, #2ec27e); }\n.toneWarning { --toast-accent: var(--wzl-warning, #d99a3f); }\n.toneError { --toast-accent: var(--wzl-danger, #d94a3f); }\n\n.content {\n flex: 1;\n min-width: 0;\n}\n\n.title {\n display: block;\n font-size: 13px;\n font-weight: 600;\n}\n\n.description {\n display: block;\n margin-top: 2px;\n font-size: 12px;\n color: var(--wzl-fg-muted);\n}\n\n.close {\n flex: 0 0 auto;\n background: none;\n border: none;\n color: var(--wzl-fg-muted);\n font-size: 16px;\n line-height: 1;\n padding: 2px 4px;\n cursor: pointer;\n border-radius: var(--wzl-radius-sm);\n}\n\n.close:hover {\n color: var(--wzl-fg);\n}\n","import {\n UNSTABLE_ToastRegion as RACToastRegion,\n UNSTABLE_Toast as RACToast,\n UNSTABLE_ToastContent as RACToastContent,\n Text,\n Button,\n} from 'react-aria-components';\nimport { defaultToastQueue, racQueueOf, type ToastQueue, type ToastTone } from './queue';\nimport s from './Toast.module.css';\nimport './toastViewTransitions.css';\n\nexport type ToastPlacement = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n\nexport interface ToastRegionProps {\n /** Queue to render. Defaults to the module-level `defaultToastQueue`. */\n queue?: ToastQueue;\n /** Screen corner for the stack. Default `bottom-right`. */\n placement?: ToastPlacement;\n className?: string;\n}\n\nconst placementClass: Record<ToastPlacement, string> = {\n 'bottom-right': s.bottomRight,\n 'bottom-left': s.bottomLeft,\n 'top-right': s.topRight,\n 'top-left': s.topLeft,\n};\n\nconst toneClass: Record<ToastTone, string> = {\n info: s.toneInfo,\n success: s.toneSuccess,\n warning: s.toneWarning,\n error: s.toneError,\n};\n\n/**\n * Renders the toast stack for a queue. Mount once, near the app root.\n * From the underlying React Aria region: landmark semantics (keyboard /\n * F6 reachable), screen-reader announcements, and hover pausing the\n * auto-dismiss timers.\n */\nexport function ToastRegion(props: ToastRegionProps) {\n const { queue = defaultToastQueue, placement = 'bottom-right', className } = props;\n return (\n <RACToastRegion\n queue={racQueueOf(queue)}\n aria-label=\"Notifications\"\n className={[s.region, placementClass[placement], className].filter(Boolean).join(' ')}\n >\n {({ toast: t }) => (\n <RACToast\n toast={t}\n className={[s.toast, toneClass[t.content.tone]].filter(Boolean).join(' ')}\n // Inline style is the one sanctioned exception here: each toast\n // needs a *unique* view-transition-name (so enter/exit/reflow\n // track per-toast), and a class can't mint unique idents. The\n // prefix keeps the ident valid (RAC keys can start with digits).\n style={{ viewTransitionName: `wzl-toast-${t.key.replace(/[^a-zA-Z0-9_-]/g, '_')}` }}\n >\n <RACToastContent className={s.content}>\n <Text slot=\"title\" className={s.title}>{t.content.title}</Text>\n {t.content.description !== undefined && (\n <Text slot=\"description\" className={s.description}>{t.content.description}</Text>\n )}\n </RACToastContent>\n <Button slot=\"close\" className={s.close} aria-label=\"Dismiss notification\">\n ×\n </Button>\n </RACToast>\n )}\n </RACToastRegion>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { useRef as e } from "react";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
var n = {
|
|
4
|
+
root: "_root_1pyfg_6",
|
|
5
|
+
segment: "_segment_1pyfg_28",
|
|
6
|
+
segmentSelected: "_segmentSelected_1pyfg_75",
|
|
7
|
+
segmentMixed: "_segmentMixed_1pyfg_134",
|
|
8
|
+
variant_minimal: "_variant_minimal_1pyfg_144",
|
|
9
|
+
size_sm: "_size_sm_1pyfg_153"
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/components/ToggleBar/ToggleBar.tsx
|
|
13
|
+
function r(e) {
|
|
14
|
+
for (let t = 0; t < e.length; t++) if (!e[t].disabled) return t;
|
|
15
|
+
return -1;
|
|
16
|
+
}
|
|
17
|
+
function i(e) {
|
|
18
|
+
for (let t = e.length - 1; t >= 0; t--) if (!e[t].disabled) return t;
|
|
19
|
+
return -1;
|
|
20
|
+
}
|
|
21
|
+
function a(e, t) {
|
|
22
|
+
let n = e.length;
|
|
23
|
+
for (let r = 1; r <= n; r++) {
|
|
24
|
+
let i = (t + r + n) % n;
|
|
25
|
+
if (!e[i].disabled) return i;
|
|
26
|
+
}
|
|
27
|
+
return t;
|
|
28
|
+
}
|
|
29
|
+
function o(e, t) {
|
|
30
|
+
let n = e.length;
|
|
31
|
+
for (let r = 1; r <= n; r++) {
|
|
32
|
+
let i = (t - r + n) % n;
|
|
33
|
+
if (!e[i].disabled) return i;
|
|
34
|
+
}
|
|
35
|
+
return t;
|
|
36
|
+
}
|
|
37
|
+
function s(s) {
|
|
38
|
+
let { items: c, ariaLabel: l, className: u, height: d, size: f, variant: p } = s, m = s.mode ?? "single", h = e(null), g = (e) => m === "multiple" ? s.value.includes(e) : s.value === e, _ = (e) => {
|
|
39
|
+
if (m !== "multiple") return !1;
|
|
40
|
+
let t = s.mixedValues;
|
|
41
|
+
return t !== void 0 && t.includes(e) && !g(e);
|
|
42
|
+
}, v = -1;
|
|
43
|
+
if (m === "single") {
|
|
44
|
+
let e = c.findIndex((e) => e.value === s.value);
|
|
45
|
+
v = e >= 0 && !c[e].disabled ? e : r(c);
|
|
46
|
+
} else v = r(c);
|
|
47
|
+
let y = (e) => () => {
|
|
48
|
+
let t = c[e];
|
|
49
|
+
if (!t.disabled) if (m === "multiple") {
|
|
50
|
+
let e = s.value, n = e.includes(t.value) ? e.filter((e) => e !== t.value) : [...e, t.value];
|
|
51
|
+
s.onChange(n);
|
|
52
|
+
} else {
|
|
53
|
+
if (s.value === t.value) {
|
|
54
|
+
s.allowDeselect && s.onChange(null);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
s.onChange(t.value);
|
|
58
|
+
}
|
|
59
|
+
}, b = (e) => {
|
|
60
|
+
let t = h.current;
|
|
61
|
+
t && t.querySelectorAll(`.${n.segment}`)[e]?.focus();
|
|
62
|
+
}, x = (e) => (t) => {
|
|
63
|
+
let n = -1;
|
|
64
|
+
switch (t.key) {
|
|
65
|
+
case "ArrowLeft":
|
|
66
|
+
case "ArrowUp":
|
|
67
|
+
n = o(c, e);
|
|
68
|
+
break;
|
|
69
|
+
case "ArrowRight":
|
|
70
|
+
case "ArrowDown":
|
|
71
|
+
n = a(c, e);
|
|
72
|
+
break;
|
|
73
|
+
case "Home":
|
|
74
|
+
n = r(c);
|
|
75
|
+
break;
|
|
76
|
+
case "End":
|
|
77
|
+
n = i(c);
|
|
78
|
+
break;
|
|
79
|
+
case " ":
|
|
80
|
+
case "Enter":
|
|
81
|
+
m === "multiple" && (t.preventDefault(), y(e)());
|
|
82
|
+
return;
|
|
83
|
+
default: return;
|
|
84
|
+
}
|
|
85
|
+
if (!(n < 0 || n === e)) {
|
|
86
|
+
if (t.preventDefault(), m === "single") {
|
|
87
|
+
let e = c[n];
|
|
88
|
+
s.onChange(e.value);
|
|
89
|
+
}
|
|
90
|
+
b(n);
|
|
91
|
+
}
|
|
92
|
+
}, S = d === void 0 ? void 0 : { "--wzl-tb-height": `${d}px` };
|
|
93
|
+
return /* @__PURE__ */ t("div", {
|
|
94
|
+
ref: h,
|
|
95
|
+
className: [
|
|
96
|
+
n.root,
|
|
97
|
+
f && n[`size_${f}`],
|
|
98
|
+
p && n[`variant_${p}`],
|
|
99
|
+
u
|
|
100
|
+
].filter(Boolean).join(" "),
|
|
101
|
+
role: m === "multiple" ? "group" : "radiogroup",
|
|
102
|
+
"aria-label": l,
|
|
103
|
+
style: S,
|
|
104
|
+
children: c.map((e, r) => {
|
|
105
|
+
let i = g(e.value), a = _(e.value), o = [
|
|
106
|
+
n.segment,
|
|
107
|
+
i && n.segmentSelected,
|
|
108
|
+
a && n.segmentMixed
|
|
109
|
+
].filter(Boolean).join(" ");
|
|
110
|
+
return /* @__PURE__ */ t("button", {
|
|
111
|
+
type: "button",
|
|
112
|
+
role: m === "multiple" ? void 0 : "radio",
|
|
113
|
+
"aria-checked": m === "multiple" ? void 0 : i,
|
|
114
|
+
"aria-pressed": m === "multiple" ? a ? "mixed" : i : void 0,
|
|
115
|
+
"aria-label": e.ariaLabel,
|
|
116
|
+
disabled: e.disabled,
|
|
117
|
+
tabIndex: r === v ? 0 : -1,
|
|
118
|
+
className: o,
|
|
119
|
+
onClick: y(r),
|
|
120
|
+
onKeyDown: x(r),
|
|
121
|
+
children: e.label
|
|
122
|
+
}, e.value);
|
|
123
|
+
})
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//#endregion
|
|
127
|
+
export { s as t };
|
|
128
|
+
|
|
129
|
+
//# sourceMappingURL=ToggleBar-Defj6Asn.js.map
|