@devslab/dds-solid 0.3.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/LICENSE +74 -0
- package/README.ko.md +16 -0
- package/README.md +15 -0
- package/dist/controllable.d.ts +9 -0
- package/dist/controllable.d.ts.map +1 -0
- package/dist/controls.d.ts +53 -0
- package/dist/controls.d.ts.map +1 -0
- package/dist/dialog.d.ts +17 -0
- package/dist/dialog.d.ts.map +1 -0
- package/dist/icon.d.ts +10 -0
- package/dist/icon.d.ts.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +524 -0
- package/dist/index.js.map +1 -0
- package/dist/server.js +535 -0
- package/dist/server.js.map +1 -0
- package/dist/tabs.d.ts +21 -0
- package/dist/tabs.d.ts.map +1 -0
- package/dist/toast.d.ts +25 -0
- package/dist/toast.d.ts.map +1 -0
- package/dist/tooltip.d.ts +19 -0
- package/dist/tooltip.d.ts.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/package.json +64 -0
- package/styles.css +2 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
import { For as e, Show as t, createContext as n, createEffect as r, createSignal as i, createUniqueId as a, onCleanup as o, onMount as s, splitProps as c, useContext as l } from "solid-js";
|
|
2
|
+
import { className as u, createComponent as d, delegateEvents as f, effect as p, getNextElement as m, getNextMarker as h, insert as g, memo as _, mergeProps as v, runHydrationEvents as y, setAttribute as b, setProperty as x, spread as S, template as C, use as w } from "solid-js/web";
|
|
3
|
+
import { directionPolicy as T, icons as E } from "@devslab/dds-icons";
|
|
4
|
+
//#region src/controllable.ts
|
|
5
|
+
function D(e) {
|
|
6
|
+
let [t, n] = i(e.defaultValue), r = () => e.value() ?? t(), a = n;
|
|
7
|
+
return [r, (t) => {
|
|
8
|
+
let n = typeof t == "function" ? t(r()) : t;
|
|
9
|
+
return e.value() === void 0 && a(() => n), e.onChange?.(n), n;
|
|
10
|
+
}];
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/utils.ts
|
|
14
|
+
function O(...e) {
|
|
15
|
+
return e.filter(Boolean).join(" ");
|
|
16
|
+
}
|
|
17
|
+
function k(...e) {
|
|
18
|
+
return e.filter(Boolean).join(" ") || void 0;
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/controls.tsx
|
|
22
|
+
var A = /*#__PURE__*/ C("<button><!$><!/><!$><!/>"), j = /*#__PURE__*/ C("<span class=dds-spinner aria-hidden=true>"), M = /*#__PURE__*/ C("<button>"), ee = /*#__PURE__*/ C("<div><label class=dds-field__label><!$><!/><!$><!/></label><!$><!/><!$><!/><!$><!/>"), te = /*#__PURE__*/ C("<span aria-hidden=true> *"), ne = /*#__PURE__*/ C("<div class=dds-field__help>"), re = /*#__PURE__*/ C("<div class=dds-field__error role=alert>"), ie = /*#__PURE__*/ C("<span><select>"), N = /*#__PURE__*/ C("<label><input><span>");
|
|
23
|
+
function P(e) {
|
|
24
|
+
let [t, n] = c(e, [
|
|
25
|
+
"class",
|
|
26
|
+
"tone",
|
|
27
|
+
"size",
|
|
28
|
+
"loading",
|
|
29
|
+
"disabled",
|
|
30
|
+
"type",
|
|
31
|
+
"children"
|
|
32
|
+
]);
|
|
33
|
+
return (() => {
|
|
34
|
+
var e = m(A), r = e.firstChild, [i, a] = h(r.nextSibling), o = i.nextSibling, [s, c] = h(o.nextSibling);
|
|
35
|
+
return S(e, v(n, {
|
|
36
|
+
get type() {
|
|
37
|
+
return t.type ?? "button";
|
|
38
|
+
},
|
|
39
|
+
get class() {
|
|
40
|
+
return O("dds-btn", `dds-btn--${t.tone ?? "primary"}`, t.size !== "md" && t.size ? `dds-btn--${t.size}` : void 0, t.class);
|
|
41
|
+
},
|
|
42
|
+
get disabled() {
|
|
43
|
+
return t.disabled || t.loading;
|
|
44
|
+
},
|
|
45
|
+
get "aria-busy"() {
|
|
46
|
+
return t.loading ? "true" : void 0;
|
|
47
|
+
}
|
|
48
|
+
}), !1, !0), g(e, (() => {
|
|
49
|
+
var e = _(() => !!t.loading);
|
|
50
|
+
return () => e() && m(j);
|
|
51
|
+
})(), i, a), g(e, () => t.children, s, c), y(), e;
|
|
52
|
+
})();
|
|
53
|
+
}
|
|
54
|
+
function F(e) {
|
|
55
|
+
let [t, n] = c(e, [
|
|
56
|
+
"class",
|
|
57
|
+
"tone",
|
|
58
|
+
"size",
|
|
59
|
+
"loading",
|
|
60
|
+
"disabled",
|
|
61
|
+
"type",
|
|
62
|
+
"children"
|
|
63
|
+
]);
|
|
64
|
+
return (() => {
|
|
65
|
+
var e = m(M);
|
|
66
|
+
return S(e, v(n, {
|
|
67
|
+
get type() {
|
|
68
|
+
return t.type ?? "button";
|
|
69
|
+
},
|
|
70
|
+
get class() {
|
|
71
|
+
return O("dds-iconbtn", t.tone && t.tone !== "ghost" ? `dds-iconbtn--${t.tone}` : void 0, t.size !== "md" && t.size ? `dds-iconbtn--${t.size}` : void 0, t.class);
|
|
72
|
+
},
|
|
73
|
+
get disabled() {
|
|
74
|
+
return t.disabled || t.loading;
|
|
75
|
+
},
|
|
76
|
+
get "aria-busy"() {
|
|
77
|
+
return t.loading ? "true" : void 0;
|
|
78
|
+
}
|
|
79
|
+
}), !1, !0), g(e, (() => {
|
|
80
|
+
var e = _(() => !!t.loading);
|
|
81
|
+
return () => e() ? m(j) : t.children;
|
|
82
|
+
})()), y(), e;
|
|
83
|
+
})();
|
|
84
|
+
}
|
|
85
|
+
function I(e) {
|
|
86
|
+
let t = a(), n = () => e.id ?? `dds-field-${t}`, r = () => e.helpText ? `${n()}-help` : void 0, i = () => e.error ? `${n()}-error` : void 0, o = () => ({
|
|
87
|
+
id: n(),
|
|
88
|
+
"aria-describedby": k(r(), i()),
|
|
89
|
+
"aria-invalid": e.error ? "true" : void 0,
|
|
90
|
+
"aria-required": e.required ? "true" : void 0
|
|
91
|
+
});
|
|
92
|
+
return (() => {
|
|
93
|
+
var t = m(ee), a = t.firstChild, s = a.firstChild, [c, l] = h(s.nextSibling), d = c.nextSibling, [f, v] = h(d.nextSibling), y = a.nextSibling, [x, S] = h(y.nextSibling), C = x.nextSibling, [w, T] = h(C.nextSibling), E = w.nextSibling, [D, k] = h(E.nextSibling);
|
|
94
|
+
return g(a, () => e.label, c, l), g(a, (() => {
|
|
95
|
+
var t = _(() => !!e.required);
|
|
96
|
+
return () => t() && m(te);
|
|
97
|
+
})(), f, v), g(t, (() => {
|
|
98
|
+
var t = _(() => typeof e.children == "function");
|
|
99
|
+
return () => t() ? e.children(o()) : e.children;
|
|
100
|
+
})(), x, S), g(t, (() => {
|
|
101
|
+
var t = _(() => !!e.helpText);
|
|
102
|
+
return () => t() && (() => {
|
|
103
|
+
var t = m(ne);
|
|
104
|
+
return g(t, () => e.helpText), p(() => b(t, "id", r())), t;
|
|
105
|
+
})();
|
|
106
|
+
})(), w, T), g(t, (() => {
|
|
107
|
+
var t = _(() => !!e.error);
|
|
108
|
+
return () => t() && (() => {
|
|
109
|
+
var t = m(re);
|
|
110
|
+
return g(t, () => e.error), p(() => b(t, "id", i())), t;
|
|
111
|
+
})();
|
|
112
|
+
})(), D, k), p((r) => {
|
|
113
|
+
var i = O("dds-field", e.error ? "dds-field--error" : void 0, e.class), o = n();
|
|
114
|
+
return i !== r.e && u(t, r.e = i), o !== r.t && b(a, "for", r.t = o), r;
|
|
115
|
+
}, {
|
|
116
|
+
e: void 0,
|
|
117
|
+
t: void 0
|
|
118
|
+
}), t;
|
|
119
|
+
})();
|
|
120
|
+
}
|
|
121
|
+
function L(e) {
|
|
122
|
+
let [t, n] = c(e, [
|
|
123
|
+
"class",
|
|
124
|
+
"invalid",
|
|
125
|
+
"children"
|
|
126
|
+
]);
|
|
127
|
+
return (() => {
|
|
128
|
+
var e = m(ie), r = e.firstChild;
|
|
129
|
+
return S(r, v(n, {
|
|
130
|
+
class: "dds-select__input",
|
|
131
|
+
get "aria-invalid"() {
|
|
132
|
+
return t.invalid ? "true" : void 0;
|
|
133
|
+
}
|
|
134
|
+
}), !1, !0), g(r, () => t.children), p(() => u(e, O("dds-select", t.class))), y(), e;
|
|
135
|
+
})();
|
|
136
|
+
}
|
|
137
|
+
function R(e) {
|
|
138
|
+
let [t, n] = c(e, [
|
|
139
|
+
"checked",
|
|
140
|
+
"defaultChecked",
|
|
141
|
+
"onCheckedChange",
|
|
142
|
+
"label",
|
|
143
|
+
"class",
|
|
144
|
+
"inputClass",
|
|
145
|
+
"type",
|
|
146
|
+
"role"
|
|
147
|
+
]), [r, i] = D({
|
|
148
|
+
value: () => t.checked,
|
|
149
|
+
defaultValue: t.defaultChecked ?? !1,
|
|
150
|
+
onChange: t.onCheckedChange
|
|
151
|
+
});
|
|
152
|
+
return (() => {
|
|
153
|
+
var e = m(N), a = e.firstChild, o = a.nextSibling;
|
|
154
|
+
return S(a, v(n, {
|
|
155
|
+
get type() {
|
|
156
|
+
return t.type;
|
|
157
|
+
},
|
|
158
|
+
get role() {
|
|
159
|
+
return t.role;
|
|
160
|
+
},
|
|
161
|
+
get class() {
|
|
162
|
+
return O(t.role === "switch" ? "dds-switch__input" : "dds-check__input", t.inputClass);
|
|
163
|
+
},
|
|
164
|
+
get checked() {
|
|
165
|
+
return r();
|
|
166
|
+
},
|
|
167
|
+
onChange: (e) => i(e.currentTarget.checked)
|
|
168
|
+
}), !1, !1), g(o, () => t.label), p(() => u(e, O(t.role === "switch" ? "dds-switch" : "dds-check", t.class))), y(), e;
|
|
169
|
+
})();
|
|
170
|
+
}
|
|
171
|
+
var z = (e) => d(R, v(e, { type: "checkbox" })), B = (e) => d(R, v(e, { type: "radio" })), V = (e) => d(R, v(e, {
|
|
172
|
+
type: "checkbox",
|
|
173
|
+
role: "switch"
|
|
174
|
+
})), H = /*#__PURE__*/ C("<div class=dds-dialog-overlay><div role=dialog aria-modal=true tabindex=-1><h2 class=dds-dialog__title></h2><!$><!/><!$><!/><!$><!/>"), U = /*#__PURE__*/ C("<div class=dds-dialog__body>"), W = /*#__PURE__*/ C("<div class=dds-dialog__actions>"), G = [
|
|
175
|
+
"a[href]",
|
|
176
|
+
"button:not([disabled])",
|
|
177
|
+
"input:not([disabled])",
|
|
178
|
+
"select:not([disabled])",
|
|
179
|
+
"textarea:not([disabled])",
|
|
180
|
+
"[tabindex]:not([tabindex='-1'])"
|
|
181
|
+
].join(",");
|
|
182
|
+
function K(e) {
|
|
183
|
+
let n = a(), i = () => e.id ?? `dds-dialog-${n}`, s = () => `${i()}-title`, c = () => e.description ? `${i()}-description` : void 0, [l, f] = D({
|
|
184
|
+
value: () => e.open,
|
|
185
|
+
defaultValue: e.defaultOpen ?? !1,
|
|
186
|
+
onChange: e.onOpenChange
|
|
187
|
+
}), v, x = null;
|
|
188
|
+
return r(() => {
|
|
189
|
+
if (!l()) return;
|
|
190
|
+
x = document.activeElement instanceof HTMLElement ? document.activeElement : null, queueMicrotask(() => {
|
|
191
|
+
(v?.querySelector(G) ?? v)?.focus();
|
|
192
|
+
});
|
|
193
|
+
let t = (t) => {
|
|
194
|
+
if (t.key === "Escape" && e.closeOnEscape !== !1) {
|
|
195
|
+
t.preventDefault(), f(!1);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (t.key !== "Tab" || !v) return;
|
|
199
|
+
let n = [...v.querySelectorAll(G)].filter((e) => !e.hidden && e.getAttribute("aria-hidden") !== "true");
|
|
200
|
+
if (n.length === 0) {
|
|
201
|
+
t.preventDefault(), v.focus();
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
let r = n[0], i = n[n.length - 1];
|
|
205
|
+
t.shiftKey && document.activeElement === r ? (t.preventDefault(), i.focus()) : !t.shiftKey && document.activeElement === i && (t.preventDefault(), r.focus());
|
|
206
|
+
};
|
|
207
|
+
document.addEventListener("keydown", t), o(() => {
|
|
208
|
+
document.removeEventListener("keydown", t), queueMicrotask(() => x?.focus());
|
|
209
|
+
});
|
|
210
|
+
}), d(t, {
|
|
211
|
+
get when() {
|
|
212
|
+
return l();
|
|
213
|
+
},
|
|
214
|
+
get children() {
|
|
215
|
+
var t = m(H), n = t.firstChild, r = n.firstChild, a = r.nextSibling, [o, l] = h(a.nextSibling), d = o.nextSibling, [x, S] = h(d.nextSibling), C = x.nextSibling, [T, E] = h(C.nextSibling);
|
|
216
|
+
t.$$pointerdown = (t) => {
|
|
217
|
+
t.target === t.currentTarget && e.closeOnOutside !== !1 && f(!1);
|
|
218
|
+
};
|
|
219
|
+
var D = v;
|
|
220
|
+
return typeof D == "function" ? w(D, n) : v = n, g(r, () => e.title), g(n, (() => {
|
|
221
|
+
var t = _(() => !!e.description);
|
|
222
|
+
return () => t() && (() => {
|
|
223
|
+
var t = m(U);
|
|
224
|
+
return g(t, () => e.description), p(() => b(t, "id", c())), t;
|
|
225
|
+
})();
|
|
226
|
+
})(), o, l), g(n, () => e.children, x, S), g(n, (() => {
|
|
227
|
+
var t = _(() => !!e.actions);
|
|
228
|
+
return () => t() && (() => {
|
|
229
|
+
var t = m(W);
|
|
230
|
+
return g(t, () => e.actions), t;
|
|
231
|
+
})();
|
|
232
|
+
})(), T, E), p((t) => {
|
|
233
|
+
var a = i(), o = O("dds-dialog", e.class), l = s(), d = k(c()), f = s();
|
|
234
|
+
return a !== t.e && b(n, "id", t.e = a), o !== t.t && u(n, t.t = o), l !== t.a && b(n, "aria-labelledby", t.a = l), d !== t.o && b(n, "aria-describedby", t.o = d), f !== t.i && b(r, "id", t.i = f), t;
|
|
235
|
+
}, {
|
|
236
|
+
e: void 0,
|
|
237
|
+
t: void 0,
|
|
238
|
+
a: void 0,
|
|
239
|
+
o: void 0,
|
|
240
|
+
i: void 0
|
|
241
|
+
}), y(), t;
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
f(["pointerdown"]);
|
|
246
|
+
//#endregion
|
|
247
|
+
//#region src/icon.tsx
|
|
248
|
+
var q = /*#__PURE__*/ C("<svg><!$><!/><g>"), J = /*#__PURE__*/ C("<title>");
|
|
249
|
+
function ae(e) {
|
|
250
|
+
let [t, n] = c(e, [
|
|
251
|
+
"name",
|
|
252
|
+
"label",
|
|
253
|
+
"size",
|
|
254
|
+
"directional",
|
|
255
|
+
"class"
|
|
256
|
+
]), r = () => E[t.name], i = () => t.directional ?? T.mirrorInRtl.includes(t.name);
|
|
257
|
+
return (() => {
|
|
258
|
+
var e = m(q), a = e.firstChild, [o, s] = h(a.nextSibling), c = o.nextSibling;
|
|
259
|
+
return S(e, v(n, {
|
|
260
|
+
get class() {
|
|
261
|
+
return O(i() && T.cssClass, t.class);
|
|
262
|
+
},
|
|
263
|
+
get viewBox() {
|
|
264
|
+
return r().viewBox;
|
|
265
|
+
},
|
|
266
|
+
get width() {
|
|
267
|
+
return t.size ?? 24;
|
|
268
|
+
},
|
|
269
|
+
get height() {
|
|
270
|
+
return t.size ?? 24;
|
|
271
|
+
},
|
|
272
|
+
fill: "none",
|
|
273
|
+
stroke: "currentColor",
|
|
274
|
+
get "stroke-width"() {
|
|
275
|
+
return r().strokeWidth;
|
|
276
|
+
},
|
|
277
|
+
"stroke-linecap": "round",
|
|
278
|
+
"stroke-linejoin": "round",
|
|
279
|
+
get role() {
|
|
280
|
+
return t.label ? "img" : void 0;
|
|
281
|
+
},
|
|
282
|
+
get "aria-label"() {
|
|
283
|
+
return t.label;
|
|
284
|
+
},
|
|
285
|
+
get "aria-hidden"() {
|
|
286
|
+
return t.label ? void 0 : "true";
|
|
287
|
+
}
|
|
288
|
+
}), !0, !0), g(e, (() => {
|
|
289
|
+
var e = _(() => !!t.label);
|
|
290
|
+
return () => e() && (() => {
|
|
291
|
+
var e = m(J);
|
|
292
|
+
return g(e, () => t.label), e;
|
|
293
|
+
})();
|
|
294
|
+
})(), o, s), p(() => x(c, "innerHTML", r().body)), y(), e;
|
|
295
|
+
})();
|
|
296
|
+
}
|
|
297
|
+
//#endregion
|
|
298
|
+
//#region src/tabs.tsx
|
|
299
|
+
var Y = /*#__PURE__*/ C("<div>"), oe = /*#__PURE__*/ C("<button>"), X = n(), Z = () => {
|
|
300
|
+
let e = l(X);
|
|
301
|
+
if (!e) throw Error("Tab components must be rendered inside <Tabs>");
|
|
302
|
+
return e;
|
|
303
|
+
};
|
|
304
|
+
function se(e) {
|
|
305
|
+
let t = a(), n = () => e.id ?? `dds-tabs-${t}`, [r, i] = D({
|
|
306
|
+
value: () => e.value,
|
|
307
|
+
defaultValue: e.defaultValue,
|
|
308
|
+
onChange: e.onValueChange
|
|
309
|
+
}), o = [], s = {
|
|
310
|
+
value: r,
|
|
311
|
+
setValue: i,
|
|
312
|
+
orientation: e.orientation ?? "horizontal",
|
|
313
|
+
register(e) {
|
|
314
|
+
return o.push(e), () => {
|
|
315
|
+
let t = o.indexOf(e);
|
|
316
|
+
t >= 0 && o.splice(t, 1);
|
|
317
|
+
};
|
|
318
|
+
},
|
|
319
|
+
tabs: () => o,
|
|
320
|
+
tabId: (e) => `${n()}-tab-${e}`,
|
|
321
|
+
panelId: (e) => `${n()}-panel-${e}`
|
|
322
|
+
};
|
|
323
|
+
return d(X.Provider, {
|
|
324
|
+
value: s,
|
|
325
|
+
get children() {
|
|
326
|
+
return e.children;
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
function Q(e) {
|
|
331
|
+
let t = Z(), [n, r] = c(e, [
|
|
332
|
+
"class",
|
|
333
|
+
"children",
|
|
334
|
+
"onKeyDown"
|
|
335
|
+
]), i = (e) => {
|
|
336
|
+
if (typeof n.onKeyDown == "function" && n.onKeyDown(e), e.defaultPrevented) return;
|
|
337
|
+
let r = t.tabs().filter((e) => !e.disabled);
|
|
338
|
+
if (!r.length) return;
|
|
339
|
+
let i = r.findIndex((e) => e.element === document.activeElement), a = i, o = document.documentElement.dir === "rtl";
|
|
340
|
+
if (e.key === "Home") a = 0;
|
|
341
|
+
else if (e.key === "End") a = r.length - 1;
|
|
342
|
+
else if (e.key === "ArrowRight" && t.orientation === "horizontal") a = (i + (o ? -1 : 1) + r.length) % r.length;
|
|
343
|
+
else if (e.key === "ArrowLeft" && t.orientation === "horizontal") a = (i + (o ? 1 : -1) + r.length) % r.length;
|
|
344
|
+
else if (e.key === "ArrowDown" && t.orientation === "vertical") a = (i + 1) % r.length;
|
|
345
|
+
else if (e.key === "ArrowUp" && t.orientation === "vertical") a = (i - 1 + r.length) % r.length;
|
|
346
|
+
else return;
|
|
347
|
+
e.preventDefault();
|
|
348
|
+
let s = r[a];
|
|
349
|
+
s && (s.element.focus(), t.setValue(s.value));
|
|
350
|
+
};
|
|
351
|
+
return (() => {
|
|
352
|
+
var e = m(Y);
|
|
353
|
+
return S(e, v(r, {
|
|
354
|
+
get class() {
|
|
355
|
+
return O("dds-tabs", n.class);
|
|
356
|
+
},
|
|
357
|
+
role: "tablist",
|
|
358
|
+
get "aria-orientation"() {
|
|
359
|
+
return t.orientation;
|
|
360
|
+
},
|
|
361
|
+
onKeyDown: i
|
|
362
|
+
}), !1, !0), g(e, () => n.children), y(), e;
|
|
363
|
+
})();
|
|
364
|
+
}
|
|
365
|
+
function ce(e) {
|
|
366
|
+
let t = Z(), [n, r] = c(e, [
|
|
367
|
+
"value",
|
|
368
|
+
"class",
|
|
369
|
+
"children",
|
|
370
|
+
"disabled",
|
|
371
|
+
"onClick"
|
|
372
|
+
]), i;
|
|
373
|
+
return s(() => {
|
|
374
|
+
let e = t.register({
|
|
375
|
+
value: n.value,
|
|
376
|
+
element: i,
|
|
377
|
+
disabled: !!n.disabled
|
|
378
|
+
});
|
|
379
|
+
o(e);
|
|
380
|
+
}), (() => {
|
|
381
|
+
var e = m(oe), a = i;
|
|
382
|
+
return typeof a == "function" ? w(a, e) : i = e, S(e, v(r, {
|
|
383
|
+
get id() {
|
|
384
|
+
return t.tabId(n.value);
|
|
385
|
+
},
|
|
386
|
+
type: "button",
|
|
387
|
+
role: "tab",
|
|
388
|
+
get class() {
|
|
389
|
+
return O("dds-tab", n.class);
|
|
390
|
+
},
|
|
391
|
+
get "aria-selected"() {
|
|
392
|
+
return t.value() === n.value;
|
|
393
|
+
},
|
|
394
|
+
get "aria-controls"() {
|
|
395
|
+
return t.panelId(n.value);
|
|
396
|
+
},
|
|
397
|
+
get tabindex() {
|
|
398
|
+
return t.value() === n.value ? 0 : -1;
|
|
399
|
+
},
|
|
400
|
+
get disabled() {
|
|
401
|
+
return n.disabled;
|
|
402
|
+
},
|
|
403
|
+
onClick: (e) => {
|
|
404
|
+
typeof n.onClick == "function" && n.onClick(e), e.defaultPrevented || t.setValue(n.value);
|
|
405
|
+
}
|
|
406
|
+
}), !1, !0), g(e, () => n.children), y(), e;
|
|
407
|
+
})();
|
|
408
|
+
}
|
|
409
|
+
function le(e) {
|
|
410
|
+
let t = Z(), [n, r] = c(e, [
|
|
411
|
+
"value",
|
|
412
|
+
"class",
|
|
413
|
+
"children"
|
|
414
|
+
]);
|
|
415
|
+
return (() => {
|
|
416
|
+
var e = m(Y);
|
|
417
|
+
return S(e, v(r, {
|
|
418
|
+
get id() {
|
|
419
|
+
return t.panelId(n.value);
|
|
420
|
+
},
|
|
421
|
+
role: "tabpanel",
|
|
422
|
+
get class() {
|
|
423
|
+
return n.class;
|
|
424
|
+
},
|
|
425
|
+
get "aria-labelledby"() {
|
|
426
|
+
return t.tabId(n.value);
|
|
427
|
+
},
|
|
428
|
+
get hidden() {
|
|
429
|
+
return t.value() !== n.value;
|
|
430
|
+
},
|
|
431
|
+
tabindex: "0"
|
|
432
|
+
}), !1, !0), g(e, () => n.children), y(), e;
|
|
433
|
+
})();
|
|
434
|
+
}
|
|
435
|
+
//#endregion
|
|
436
|
+
//#region src/toast.tsx
|
|
437
|
+
var ue = /*#__PURE__*/ C("<div aria-live=polite aria-relevant=\"additions removals\">"), de = /*#__PURE__*/ C("<div><span></span><!$><!/>"), fe = /*#__PURE__*/ C("<button type=button class=\"dds-iconbtn dds-iconbtn--sm\">×"), $ = n();
|
|
438
|
+
function pe(t) {
|
|
439
|
+
let [n, r] = i([]), a = /* @__PURE__ */ new Map(), s = 0, c = (e) => {
|
|
440
|
+
let t = a.get(e);
|
|
441
|
+
t && clearTimeout(t), a.delete(e), r((t) => t.filter((t) => t.id !== e));
|
|
442
|
+
}, l = {
|
|
443
|
+
show(e) {
|
|
444
|
+
let n = `dds-toast-${++s}`;
|
|
445
|
+
r((t) => [...t, {
|
|
446
|
+
...e,
|
|
447
|
+
id: n
|
|
448
|
+
}]);
|
|
449
|
+
let i = e.duration ?? t.defaultDuration ?? 5e3;
|
|
450
|
+
return i > 0 && a.set(n, setTimeout(() => c(n), i)), n;
|
|
451
|
+
},
|
|
452
|
+
dismiss: c,
|
|
453
|
+
clear() {
|
|
454
|
+
for (let e of a.values()) clearTimeout(e);
|
|
455
|
+
a.clear(), r([]);
|
|
456
|
+
}
|
|
457
|
+
};
|
|
458
|
+
return o(l.clear), d($.Provider, {
|
|
459
|
+
value: l,
|
|
460
|
+
get children() {
|
|
461
|
+
return [_(() => t.children), (() => {
|
|
462
|
+
var r = m(ue);
|
|
463
|
+
return g(r, d(e, {
|
|
464
|
+
get each() {
|
|
465
|
+
return n();
|
|
466
|
+
},
|
|
467
|
+
children: (e) => (() => {
|
|
468
|
+
var n = m(de), r = n.firstChild, i = r.nextSibling, [a, o] = h(i.nextSibling);
|
|
469
|
+
return g(r, () => e.message), g(n, (() => {
|
|
470
|
+
var n = _(() => !!t.dismissLabel);
|
|
471
|
+
return () => n() ? (() => {
|
|
472
|
+
var n = m(fe);
|
|
473
|
+
return n.$$click = () => c(e.id), p(() => b(n, "aria-label", typeof t.dismissLabel == "function" ? t.dismissLabel(e) : t.dismissLabel)), y(), n;
|
|
474
|
+
})() : null;
|
|
475
|
+
})(), a, o), p((t) => {
|
|
476
|
+
var r = O("dds-toast", `dds-toast--${e.tone ?? "info"}`), i = e.tone === "danger" ? "alert" : "status";
|
|
477
|
+
return r !== t.e && u(n, t.e = r), i !== t.t && b(n, "role", t.t = i), t;
|
|
478
|
+
}, {
|
|
479
|
+
e: void 0,
|
|
480
|
+
t: void 0
|
|
481
|
+
}), n;
|
|
482
|
+
})()
|
|
483
|
+
})), p(() => u(r, O("dds-toast-region", t.class))), r;
|
|
484
|
+
})()];
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
function me() {
|
|
489
|
+
let e = l($);
|
|
490
|
+
if (!e) throw Error("useToast must be called inside <ToastProvider>");
|
|
491
|
+
return e;
|
|
492
|
+
}
|
|
493
|
+
f(["click"]);
|
|
494
|
+
//#endregion
|
|
495
|
+
//#region src/tooltip.tsx
|
|
496
|
+
var he = /*#__PURE__*/ C("<span><!$><!/><span class=dds-tooltip__bubble role=tooltip>");
|
|
497
|
+
function ge(e) {
|
|
498
|
+
let t = a(), n = () => e.id ?? `dds-tooltip-${t}`, [r, i] = D({
|
|
499
|
+
value: () => e.open,
|
|
500
|
+
defaultValue: e.defaultOpen ?? !1,
|
|
501
|
+
onChange: e.onOpenChange
|
|
502
|
+
}), o = {
|
|
503
|
+
"aria-describedby": n(),
|
|
504
|
+
onFocus: () => i(!0),
|
|
505
|
+
onBlur: () => i(!1),
|
|
506
|
+
onPointerEnter: () => i(!0),
|
|
507
|
+
onPointerLeave: () => i(!1)
|
|
508
|
+
};
|
|
509
|
+
return (() => {
|
|
510
|
+
var t = m(he), i = t.firstChild, [a, s] = h(i.nextSibling), c = a.nextSibling;
|
|
511
|
+
return g(t, () => e.children(o), a, s), g(c, () => e.content), p((i) => {
|
|
512
|
+
var a = O("dds-tooltip", e.class), o = n(), s = !r();
|
|
513
|
+
return a !== i.e && u(t, i.e = a), o !== i.t && b(c, "id", i.t = o), s !== i.a && x(c, "hidden", i.a = s), i;
|
|
514
|
+
}, {
|
|
515
|
+
e: void 0,
|
|
516
|
+
t: void 0,
|
|
517
|
+
a: void 0
|
|
518
|
+
}), t;
|
|
519
|
+
})();
|
|
520
|
+
}
|
|
521
|
+
//#endregion
|
|
522
|
+
export { P as Button, z as Checkbox, K as Dialog, I as Field, ae as Icon, F as IconButton, B as Radio, L as Select, V as Switch, ce as Tab, Q as TabList, le as TabPanel, se as Tabs, pe as ToastProvider, ge as Tooltip, D as createControllableSignal, me as useToast };
|
|
523
|
+
|
|
524
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["createUniqueId","splitProps","JSX","ParentProps","createControllableSignal","classes","describedBy","ButtonTone","ControlSize","ButtonProps","Omit","ButtonHTMLAttributes","HTMLButtonElement","class","tone","size","loading","Button","props","local","rest","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","_co$","_$getNextMarker","nextSibling","_el$4","_el$5","_co$2","_$spread","_$mergeProps","type","undefined","disabled","aria-busy","_$insert","_c$","_$memo","_tmpl$2","children","_$runHydrationEvents","IconButtonProps","Element","IconButton","_el$7","_tmpl$3","_c$2","FieldControlProps","id","FieldProps","label","helpText","error","required","Field","generated","helpId","errorId","control","_el$9","_tmpl$4","_el$0","_el$1","_el$10","_co$3","_el$11","_el$12","_co$4","_el$13","_el$14","_co$5","_el$15","_el$16","_co$6","_el$17","_el$18","_co$7","_c$3","_tmpl$5","_c$4","_c$5","_el$20","_tmpl$6","_$effect","_$setAttribute","_c$6","_el$21","_tmpl$7","_p$","_v$","_v$2","e","_$className","t","SelectProps","SelectHTMLAttributes","HTMLSelectElement","invalid","Select","_el$22","_tmpl$8","_el$23","aria-invalid","CheckableProps","InputHTMLAttributes","HTMLInputElement","checked","defaultChecked","onCheckedChange","inputClass","Checkable","role","setChecked","value","defaultValue","onChange","_el$24","_tmpl$9","_el$25","_el$26","event","currentTarget","CheckboxProps","Checkbox","_$createComponent","RadioProps","Radio","SwitchProps","Switch","Show","createEffect","createUniqueId","onCleanup","JSX","createControllableSignal","classes","describedBy","focusable","join","DialogProps","open","defaultOpen","onOpenChange","title","Element","description","children","actions","closeOnEscape","closeOnOutside","class","id","Dialog","props","generated","titleId","descriptionId","undefined","setOpen","value","defaultValue","onChange","panel","HTMLDivElement","previouslyFocused","HTMLElement","document","activeElement","queueMicrotask","first","querySelector","focus","onKeyDown","event","KeyboardEvent","key","preventDefault","candidates","querySelectorAll","filter","element","hidden","getAttribute","length","last","shiftKey","addEventListener","removeEventListener","_$createComponent","when","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_co$","_$getNextMarker","_el$6","_el$7","_co$2","_el$8","_el$9","_co$3","$$pointerdown","target","currentTarget","_ref$","_$use","_$insert","_c$","_$memo","_el$0","_tmpl$2","_$effect","_$setAttribute","_c$2","_el$1","_tmpl$3","_p$","_v$","_v$2","_v$3","_v$4","_v$5","e","t","_$className","a","o","i","_$runHydrationEvents","_$delegateEvents","directionPolicy","icons","DdsIconName","splitProps","JSX","classes","IconProps","Omit","SvgSVGAttributes","SVGSVGElement","name","label","size","directional","Icon","props","local","rest","icon","mirrorInRtl","includes","_el$","_$getNextElement","_tmpl$","_el$3","firstChild","_el$4","_co$","_$getNextMarker","nextSibling","_el$2","_$spread","_$mergeProps","class","cssClass","viewBox","width","height","stroke-width","strokeWidth","role","undefined","aria-label","aria-hidden","_$insert","_c$","_$memo","_el$5","_tmpl$2","_$effect","_$setProperty","body","_$runHydrationEvents","createContext","createUniqueId","onCleanup","onMount","splitProps","useContext","Accessor","JSX","ParentProps","createControllableSignal","classes","RegisteredTab","value","element","HTMLButtonElement","disabled","TabsContextValue","setValue","orientation","register","tab","tabs","tabId","panelId","TabsContext","useTabs","context","Error","TabsProps","defaultValue","onValueChange","children","Element","id","Tabs","props","generated","onChange","registered","push","index","indexOf","splice","tabValue","_$createComponent","Provider","TabList","HTMLAttributes","HTMLDivElement","local","rest","onKeyDown","EventHandler","KeyboardEvent","event","defaultPrevented","filter","length","current","findIndex","document","activeElement","next","rtl","documentElement","dir","key","preventDefault","target","focus","_el$","_$getNextElement","_tmpl$","_$spread","_$mergeProps","class","aria-orientation","_$insert","_$runHydrationEvents","TabProps","Omit","ButtonHTMLAttributes","Tab","unregister","Boolean","_el$2","_tmpl$2","_ref$","_$use","aria-selected","aria-controls","tabindex","onClick","TabPanelProps","TabPanel","_el$3","aria-labelledby","hidden","For","createContext","createSignal","onCleanup","useContext","JSX","classes","ToastTone","ToastInput","message","Element","tone","duration","ToastRecord","id","ToastApi","show","toast","dismiss","clear","ToastContext","ToastProviderProps","children","defaultDuration","dismissLabel","class","ToastProvider","props","toasts","setToasts","timers","Map","ReturnType","setTimeout","sequence","timer","get","clearTimeout","delete","current","filter","api","input","set","values","_$createComponent","Provider","value","_$memo","_el$","_$getNextElement","_tmpl$","_$insert","each","_el$2","_tmpl$2","_el$3","firstChild","_el$4","nextSibling","_el$5","_co$","_$getNextMarker","_c$","_el$6","_tmpl$3","$$click","_$effect","_$setAttribute","_$runHydrationEvents","_p$","_v$","_v$2","e","_$className","t","undefined","useToast","context","Error","_$delegateEvents","createUniqueId","JSX","createControllableSignal","classes","TooltipTriggerProps","onFocus","onBlur","onPointerEnter","onPointerLeave","TooltipProps","content","Element","children","props","open","defaultOpen","onOpenChange","id","class","Tooltip","generated","setOpen","value","defaultValue","onChange","trigger","_el$","_$getNextElement","_tmpl$","_el$3","firstChild","_el$4","_co$","_$getNextMarker","nextSibling","_el$2","_$insert","_$effect","_p$","_v$","_v$2","_v$3","e","_$className","t","_$setAttribute","a","_$setProperty","undefined"],"sources":["../src/controllable.ts","../src/utils.ts","../src/controls.tsx","../src/dialog.tsx","../src/icon.tsx","../src/tabs.tsx","../src/toast.tsx","../src/tooltip.tsx"],"sourcesContent":["import { createSignal, type Accessor } from \"solid-js\";\n\nexport interface ControllableOptions<T> {\n value: Accessor<T | undefined>;\n defaultValue: T;\n onChange: ((value: T) => void) | undefined;\n}\n\nexport type ControllableSetter<T> = (next: T | ((previous: T) => T)) => T;\n\nexport function createControllableSignal<T>(options: ControllableOptions<T>): [Accessor<T>, ControllableSetter<T>] {\n const [internal, setInternal] = createSignal(options.defaultValue);\n const value: Accessor<T> = () => options.value() ?? internal();\n const setInternalValue = setInternal as unknown as ControllableSetter<T>;\n const setValue: ControllableSetter<T> = (next) => {\n const resolved = typeof next === \"function\"\n ? (next as (previous: T) => T)(value())\n : next;\n if (options.value() === undefined) setInternalValue(() => resolved);\n options.onChange?.(resolved);\n return resolved;\n };\n return [value, setValue];\n}\n","export function classes(...values: Array<string | false | null | undefined>): string {\n return values.filter(Boolean).join(\" \");\n}\n\nexport function describedBy(...ids: Array<string | false | null | undefined>): string | undefined {\n const value = ids.filter(Boolean).join(\" \");\n return value || undefined;\n}\n","import {\n createUniqueId,\n splitProps,\n type JSX,\n type ParentProps,\n} from \"solid-js\";\n\nimport { createControllableSignal } from \"./controllable\";\nimport { classes, describedBy } from \"./utils\";\n\nexport type ButtonTone = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\nexport type ControlSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps extends Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, \"class\"> {\n class?: string;\n tone?: ButtonTone;\n size?: ControlSize;\n loading?: boolean;\n}\n\nexport function Button(props: ParentProps<ButtonProps>) {\n const [local, rest] = splitProps(props, [\"class\", \"tone\", \"size\", \"loading\", \"disabled\", \"type\", \"children\"]);\n return (\n <button\n {...rest}\n type={local.type ?? \"button\"}\n class={classes(\"dds-btn\", `dds-btn--${local.tone ?? \"primary\"}`, local.size !== \"md\" && local.size ? `dds-btn--${local.size}` : undefined, local.class)}\n disabled={local.disabled || local.loading}\n aria-busy={local.loading ? \"true\" : undefined}\n >\n {local.loading && <span class=\"dds-spinner\" aria-hidden=\"true\" />}\n {local.children}\n </button>\n );\n}\n\nexport interface IconButtonProps extends Omit<ButtonProps, \"tone\" | \"children\"> {\n \"aria-label\": string;\n tone?: \"ghost\" | \"secondary\" | \"danger\";\n children: JSX.Element;\n}\n\nexport function IconButton(props: IconButtonProps) {\n const [local, rest] = splitProps(props, [\"class\", \"tone\", \"size\", \"loading\", \"disabled\", \"type\", \"children\"]);\n return (\n <button\n {...rest}\n type={local.type ?? \"button\"}\n class={classes(\"dds-iconbtn\", local.tone && local.tone !== \"ghost\" ? `dds-iconbtn--${local.tone}` : undefined, local.size !== \"md\" && local.size ? `dds-iconbtn--${local.size}` : undefined, local.class)}\n disabled={local.disabled || local.loading}\n aria-busy={local.loading ? \"true\" : undefined}\n >\n {local.loading ? <span class=\"dds-spinner\" aria-hidden=\"true\" /> : local.children}\n </button>\n );\n}\n\nexport interface FieldControlProps {\n id: string;\n \"aria-describedby\": string | undefined;\n \"aria-invalid\": \"true\" | undefined;\n \"aria-required\": \"true\" | undefined;\n}\n\nexport interface FieldProps {\n id?: string;\n label: JSX.Element;\n helpText?: JSX.Element;\n error?: JSX.Element;\n required?: boolean;\n class?: string;\n children: JSX.Element | ((props: FieldControlProps) => JSX.Element);\n}\n\nexport function Field(props: FieldProps) {\n const generated = createUniqueId();\n const id = () => props.id ?? `dds-field-${generated}`;\n const helpId = () => props.helpText ? `${id()}-help` : undefined;\n const errorId = () => props.error ? `${id()}-error` : undefined;\n const control = (): FieldControlProps => ({\n id: id(),\n \"aria-describedby\": describedBy(helpId(), errorId()),\n \"aria-invalid\": props.error ? \"true\" : undefined,\n \"aria-required\": props.required ? \"true\" : undefined,\n });\n return (\n <div class={classes(\"dds-field\", props.error ? \"dds-field--error\" : undefined, props.class)}>\n <label class=\"dds-field__label\" for={id()}>{props.label}{props.required && <span aria-hidden=\"true\"> *</span>}</label>\n {typeof props.children === \"function\" ? props.children(control()) : props.children}\n {props.helpText && <div id={helpId()} class=\"dds-field__help\">{props.helpText}</div>}\n {props.error && <div id={errorId()} class=\"dds-field__error\" role=\"alert\">{props.error}</div>}\n </div>\n );\n}\n\nexport interface SelectProps extends Omit<JSX.SelectHTMLAttributes<HTMLSelectElement>, \"class\"> {\n class?: string;\n invalid?: boolean;\n}\n\nexport function Select(props: ParentProps<SelectProps>) {\n const [local, rest] = splitProps(props, [\"class\", \"invalid\", \"children\"]);\n return (\n <span class={classes(\"dds-select\", local.class)}>\n <select {...rest} class=\"dds-select__input\" aria-invalid={local.invalid ? \"true\" : undefined}>\n {local.children}\n </select>\n </span>\n );\n}\n\ninterface CheckableProps extends Omit<JSX.InputHTMLAttributes<HTMLInputElement>, \"checked\" | \"class\" | \"onChange\" | \"role\" | \"type\"> {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n label: JSX.Element;\n class?: string;\n inputClass?: string;\n}\n\nfunction Checkable(props: CheckableProps & { type: \"checkbox\" | \"radio\"; role?: \"switch\" }) {\n const [local, rest] = splitProps(props, [\"checked\", \"defaultChecked\", \"onCheckedChange\", \"label\", \"class\", \"inputClass\", \"type\", \"role\"]);\n const [checked, setChecked] = createControllableSignal({\n value: () => local.checked,\n defaultValue: local.defaultChecked ?? false,\n onChange: local.onCheckedChange,\n });\n return (\n <label class={classes(local.role === \"switch\" ? \"dds-switch\" : \"dds-check\", local.class)}>\n <input\n {...rest}\n type={local.type}\n role={local.role}\n class={classes(local.role === \"switch\" ? \"dds-switch__input\" : \"dds-check__input\", local.inputClass)}\n checked={checked()}\n onChange={(event) => setChecked(event.currentTarget.checked)}\n />\n <span>{local.label}</span>\n </label>\n );\n}\n\nexport type CheckboxProps = CheckableProps;\nexport const Checkbox = (props: CheckboxProps) => <Checkable {...props} type=\"checkbox\" />;\n\nexport type RadioProps = CheckableProps;\nexport const Radio = (props: RadioProps) => <Checkable {...props} type=\"radio\" />;\n\nexport type SwitchProps = CheckableProps;\nexport const Switch = (props: SwitchProps) => <Checkable {...props} type=\"checkbox\" role=\"switch\" />;\n","import {\n Show,\n createEffect,\n createUniqueId,\n onCleanup,\n type JSX,\n} from \"solid-js\";\n\nimport { createControllableSignal } from \"./controllable\";\nimport { classes, describedBy } from \"./utils\";\n\nexport const focusable = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\nexport interface DialogProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n title: JSX.Element;\n description?: JSX.Element;\n children: JSX.Element;\n actions?: JSX.Element;\n closeOnEscape?: boolean;\n closeOnOutside?: boolean;\n class?: string;\n id?: string;\n}\n\nexport function Dialog(props: DialogProps) {\n const generated = createUniqueId();\n const id = () => props.id ?? `dds-dialog-${generated}`;\n const titleId = () => `${id()}-title`;\n const descriptionId = () => props.description ? `${id()}-description` : undefined;\n const [open, setOpen] = createControllableSignal({\n value: () => props.open,\n defaultValue: props.defaultOpen ?? false,\n onChange: props.onOpenChange,\n });\n let panel: HTMLDivElement | undefined;\n let previouslyFocused: HTMLElement | null = null;\n\n createEffect(() => {\n if (!open()) return;\n previouslyFocused = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n queueMicrotask(() => {\n const first = panel?.querySelector<HTMLElement>(focusable);\n (first ?? panel)?.focus();\n });\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && props.closeOnEscape !== false) {\n event.preventDefault();\n setOpen(false);\n return;\n }\n if (event.key !== \"Tab\" || !panel) return;\n const candidates = [...panel.querySelectorAll<HTMLElement>(focusable)]\n .filter((element) => !element.hidden && element.getAttribute(\"aria-hidden\") !== \"true\");\n if (candidates.length === 0) {\n event.preventDefault();\n panel.focus();\n return;\n }\n const first = candidates[0]!;\n const last = candidates[candidates.length - 1]!;\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n onCleanup(() => {\n document.removeEventListener(\"keydown\", onKeyDown);\n queueMicrotask(() => previouslyFocused?.focus());\n });\n });\n\n return (\n <Show when={open()}>\n <div\n class=\"dds-dialog-overlay\"\n onPointerDown={(event) => {\n if (event.target === event.currentTarget && props.closeOnOutside !== false) setOpen(false);\n }}\n >\n <div\n ref={panel}\n id={id()}\n class={classes(\"dds-dialog\", props.class)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId()}\n aria-describedby={describedBy(descriptionId())}\n tabindex=\"-1\"\n >\n <h2 id={titleId()} class=\"dds-dialog__title\">{props.title}</h2>\n {props.description && <div id={descriptionId()} class=\"dds-dialog__body\">{props.description}</div>}\n {props.children}\n {props.actions && <div class=\"dds-dialog__actions\">{props.actions}</div>}\n </div>\n </div>\n </Show>\n );\n}\n","import { directionPolicy, icons, type DdsIconName } from \"@devslab/dds-icons\";\nimport { splitProps, type JSX } from \"solid-js\";\n\nimport { classes } from \"./utils\";\n\nexport interface IconProps extends Omit<JSX.SvgSVGAttributes<SVGSVGElement>, \"name\" | \"children\"> {\n name: DdsIconName;\n label?: string;\n size?: number | string;\n directional?: boolean;\n}\n\nexport function Icon(props: IconProps) {\n const [local, rest] = splitProps(props, [\"name\", \"label\", \"size\", \"directional\", \"class\"]);\n const icon = () => icons[local.name];\n const directional = () => local.directional ?? directionPolicy.mirrorInRtl.includes(local.name);\n return (\n <svg\n {...rest}\n class={classes(directional() && directionPolicy.cssClass, local.class)}\n viewBox={icon().viewBox}\n width={local.size ?? 24}\n height={local.size ?? 24}\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width={icon().strokeWidth}\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n role={local.label ? \"img\" : undefined}\n aria-label={local.label}\n aria-hidden={local.label ? undefined : \"true\"}\n >\n {local.label && <title>{local.label}</title>}\n <g innerHTML={icon().body} />\n </svg>\n );\n}\n","import {\n createContext,\n createUniqueId,\n onCleanup,\n onMount,\n splitProps,\n useContext,\n type Accessor,\n type JSX,\n type ParentProps,\n} from \"solid-js\";\n\nimport { createControllableSignal } from \"./controllable\";\nimport { classes } from \"./utils\";\n\ninterface RegisteredTab { value: string; element: HTMLButtonElement; disabled: boolean }\ninterface TabsContextValue {\n value: Accessor<string>;\n setValue: (value: string) => void;\n orientation: \"horizontal\" | \"vertical\";\n register: (tab: RegisteredTab) => () => void;\n tabs: () => RegisteredTab[];\n tabId: (value: string) => string;\n panelId: (value: string) => string;\n}\n\nconst TabsContext = createContext<TabsContextValue>();\nconst useTabs = () => {\n const context = useContext(TabsContext);\n if (!context) throw new Error(\"Tab components must be rendered inside <Tabs>\");\n return context;\n};\n\nexport interface TabsProps {\n value?: string;\n defaultValue: string;\n onValueChange?: (value: string) => void;\n orientation?: \"horizontal\" | \"vertical\";\n children: JSX.Element;\n id?: string;\n}\n\nexport function Tabs(props: TabsProps) {\n const generated = createUniqueId();\n const id = () => props.id ?? `dds-tabs-${generated}`;\n const [value, setValue] = createControllableSignal({\n value: () => props.value,\n defaultValue: props.defaultValue,\n onChange: props.onValueChange,\n });\n const registered: RegisteredTab[] = [];\n const context: TabsContextValue = {\n value,\n setValue,\n orientation: props.orientation ?? \"horizontal\",\n register(tab) {\n registered.push(tab);\n return () => {\n const index = registered.indexOf(tab);\n if (index >= 0) registered.splice(index, 1);\n };\n },\n tabs: () => registered,\n tabId: (tabValue) => `${id()}-tab-${tabValue}`,\n panelId: (tabValue) => `${id()}-panel-${tabValue}`,\n };\n return <TabsContext.Provider value={context}>{props.children}</TabsContext.Provider>;\n}\n\nexport function TabList(props: ParentProps<JSX.HTMLAttributes<HTMLDivElement>>) {\n const context = useTabs();\n const [local, rest] = splitProps(props, [\"class\", \"children\", \"onKeyDown\"]);\n const onKeyDown: JSX.EventHandler<HTMLDivElement, KeyboardEvent> = (event) => {\n if (typeof local.onKeyDown === \"function\") local.onKeyDown(event);\n if (event.defaultPrevented) return;\n const tabs = context.tabs().filter((tab) => !tab.disabled);\n if (!tabs.length) return;\n const current = tabs.findIndex((tab) => tab.element === document.activeElement);\n let next = current;\n const rtl = document.documentElement.dir === \"rtl\";\n if (event.key === \"Home\") next = 0;\n else if (event.key === \"End\") next = tabs.length - 1;\n else if (event.key === \"ArrowRight\" && context.orientation === \"horizontal\") next = (current + (rtl ? -1 : 1) + tabs.length) % tabs.length;\n else if (event.key === \"ArrowLeft\" && context.orientation === \"horizontal\") next = (current + (rtl ? 1 : -1) + tabs.length) % tabs.length;\n else if (event.key === \"ArrowDown\" && context.orientation === \"vertical\") next = (current + 1) % tabs.length;\n else if (event.key === \"ArrowUp\" && context.orientation === \"vertical\") next = (current - 1 + tabs.length) % tabs.length;\n else return;\n event.preventDefault();\n const target = tabs[next];\n if (target) {\n target.element.focus();\n context.setValue(target.value);\n }\n };\n return <div {...rest} class={classes(\"dds-tabs\", local.class)} role=\"tablist\" aria-orientation={context.orientation} onKeyDown={onKeyDown}>{local.children}</div>;\n}\n\nexport interface TabProps extends Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, \"value\" | \"class\"> {\n value: string;\n class?: string;\n}\n\nexport function Tab(props: ParentProps<TabProps>) {\n const context = useTabs();\n const [local, rest] = splitProps(props, [\"value\", \"class\", \"children\", \"disabled\", \"onClick\"]);\n let element!: HTMLButtonElement;\n onMount(() => {\n const unregister = context.register({ value: local.value, element, disabled: Boolean(local.disabled) });\n onCleanup(unregister);\n });\n return (\n <button\n {...rest}\n ref={element}\n id={context.tabId(local.value)}\n type=\"button\"\n role=\"tab\"\n class={classes(\"dds-tab\", local.class)}\n aria-selected={context.value() === local.value}\n aria-controls={context.panelId(local.value)}\n tabindex={context.value() === local.value ? 0 : -1}\n disabled={local.disabled}\n onClick={(event) => {\n if (typeof local.onClick === \"function\") local.onClick(event);\n if (!event.defaultPrevented) context.setValue(local.value);\n }}\n >{local.children}</button>\n );\n}\n\nexport interface TabPanelProps extends JSX.HTMLAttributes<HTMLDivElement> { value: string }\n\nexport function TabPanel(props: ParentProps<TabPanelProps>) {\n const context = useTabs();\n const [local, rest] = splitProps(props, [\"value\", \"class\", \"children\"]);\n return (\n <div\n {...rest}\n id={context.panelId(local.value)}\n role=\"tabpanel\"\n class={local.class}\n aria-labelledby={context.tabId(local.value)}\n hidden={context.value() !== local.value}\n tabindex=\"0\"\n >{local.children}</div>\n );\n}\n","import {\n For,\n createContext,\n createSignal,\n onCleanup,\n useContext,\n type JSX,\n} from \"solid-js\";\n\nimport { classes } from \"./utils\";\n\nexport type ToastTone = \"success\" | \"warning\" | \"danger\" | \"info\";\nexport interface ToastInput { message: JSX.Element; tone?: ToastTone; duration?: number }\nexport interface ToastRecord extends ToastInput { id: string }\nexport interface ToastApi {\n show: (toast: ToastInput) => string;\n dismiss: (id: string) => void;\n clear: () => void;\n}\n\nconst ToastContext = createContext<ToastApi>();\n\nexport interface ToastProviderProps {\n children: JSX.Element;\n defaultDuration?: number;\n /** Localized accessible name for the optional manual dismiss control. */\n dismissLabel?: string | ((toast: ToastRecord) => string);\n class?: string;\n}\n\nexport function ToastProvider(props: ToastProviderProps) {\n const [toasts, setToasts] = createSignal<ToastRecord[]>([]);\n const timers = new Map<string, ReturnType<typeof setTimeout>>();\n let sequence = 0;\n const dismiss = (id: string) => {\n const timer = timers.get(id);\n if (timer) clearTimeout(timer);\n timers.delete(id);\n setToasts((current) => current.filter((toast) => toast.id !== id));\n };\n const api: ToastApi = {\n show(input) {\n const id = `dds-toast-${++sequence}`;\n setToasts((current) => [...current, { ...input, id }]);\n const duration = input.duration ?? props.defaultDuration ?? 5000;\n if (duration > 0) timers.set(id, setTimeout(() => dismiss(id), duration));\n return id;\n },\n dismiss,\n clear() {\n for (const timer of timers.values()) clearTimeout(timer);\n timers.clear();\n setToasts([]);\n },\n };\n onCleanup(api.clear);\n return (\n <ToastContext.Provider value={api}>\n {props.children}\n <div class={classes(\"dds-toast-region\", props.class)} aria-live=\"polite\" aria-relevant=\"additions removals\">\n <For each={toasts()}>{(toast) => (\n <div class={classes(\"dds-toast\", `dds-toast--${toast.tone ?? \"info\"}`)} role={toast.tone === \"danger\" ? \"alert\" : \"status\"}>\n <span>{toast.message}</span>\n {props.dismissLabel ? (\n <button\n type=\"button\"\n class=\"dds-iconbtn dds-iconbtn--sm\"\n aria-label={typeof props.dismissLabel === \"function\" ? props.dismissLabel(toast) : props.dismissLabel}\n onClick={() => dismiss(toast.id)}\n >×</button>\n ) : null}\n </div>\n )}</For>\n </div>\n </ToastContext.Provider>\n );\n}\n\nexport function useToast(): ToastApi {\n const context = useContext(ToastContext);\n if (!context) throw new Error(\"useToast must be called inside <ToastProvider>\");\n return context;\n}\n","import { createUniqueId, type JSX } from \"solid-js\";\n\nimport { createControllableSignal } from \"./controllable\";\nimport { classes } from \"./utils\";\n\nexport interface TooltipTriggerProps {\n \"aria-describedby\": string;\n onFocus: () => void;\n onBlur: () => void;\n onPointerEnter: () => void;\n onPointerLeave: () => void;\n}\n\nexport interface TooltipProps {\n content: JSX.Element;\n children: (props: TooltipTriggerProps) => JSX.Element;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n id?: string;\n class?: string;\n}\n\nexport function Tooltip(props: TooltipProps) {\n const generated = createUniqueId();\n const id = () => props.id ?? `dds-tooltip-${generated}`;\n const [open, setOpen] = createControllableSignal({\n value: () => props.open,\n defaultValue: props.defaultOpen ?? false,\n onChange: props.onOpenChange,\n });\n const trigger: TooltipTriggerProps = {\n \"aria-describedby\": id(),\n onFocus: () => setOpen(true),\n onBlur: () => setOpen(false),\n onPointerEnter: () => setOpen(true),\n onPointerLeave: () => setOpen(false),\n };\n return (\n <span class={classes(\"dds-tooltip\", props.class)}>\n {props.children(trigger)}\n <span id={id()} class=\"dds-tooltip__bubble\" role=\"tooltip\" hidden={!open()}>{props.content}</span>\n </span>\n );\n}\n"],"mappings":"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"}
|