@popovandrii/ui-elements 0.0.27 → 0.0.30

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/index.es.js CHANGED
@@ -1,536 +1,447 @@
1
- class S {
2
- selectors;
3
- spinBoxes;
4
- abortController = new AbortController();
5
- dbug;
6
- constructor(e = {}, t = !1) {
7
- this.dbug = t;
8
- const r = {
9
- main: "UIsp",
10
- btn: "UIsp__btn",
11
- input: "UIsp__input",
12
- disabledBtn: "disabled"
13
- };
14
- this.selectors = { ...r, ...e }, this.spinBoxes = document.querySelectorAll(
15
- `.${this.selectors.main}`
16
- ), this.event();
17
- }
18
- state = (e, t, r, i = 0, s = 0) => {
19
- e == i || e < i ? (t.classList.add(this.selectors.disabledBtn), t.disabled = !0) : (t.classList.remove(this.selectors.disabledBtn), t.disabled = !1), s !== 0 && (e == s || e > s ? (r.classList.add(this.selectors.disabledBtn), r.disabled = !0) : (r.classList.remove(this.selectors.disabledBtn), r.disabled = !1));
20
- };
21
- destroy() {
22
- this.abortController && this.abortController.abort(), this.spinBoxes = null;
23
- }
24
- getValidDataNumber = (e, t) => {
25
- const r = e.getAttribute(`data-${t}`);
26
- return r === null || r.trim() === "" || isNaN(Number(r)) ? 0 : Number(r);
27
- };
28
- event() {
29
- this.abortController = new AbortController();
30
- const e = this.abortController.signal;
31
- this.spinBoxes?.forEach((t) => {
32
- let r;
33
- const i = t.querySelectorAll(
34
- `.${this.selectors.btn}`
35
- ), s = t.querySelector(
36
- `.${this.selectors.input}`
37
- );
38
- this.dbug && (i || console.log(`Buttons (${this.selectors.btn}) not found in container`), s || console.log(`Input (${this.selectors.input}) not found in container`));
39
- const o = i[0], l = i[1], a = this.getValidDataNumber(t, "step"), n = this.getValidDataNumber(t, "min"), h = this.getValidDataNumber(t, "max"), c = (u) => {
40
- t.setAttribute("aria-valuenow", String(u)), t.setAttribute("aria-valuetext", `${u} items`);
41
- };
42
- Number(s.value) <= n && (s.value = n.toFixed(a)), h !== 0 ? (Number(s.value) >= h && (s.value = h.toFixed(a)), h && t.setAttribute("aria-valuemax", h.toFixed(a))) : s.value = Number(s.value).toFixed(a), n && t.setAttribute("aria-valuemin", n.toFixed(a)), this.state(Number(s.value), o, l, n, h), c(s.value);
43
- let b = null;
44
- const v = (u = 1) => {
45
- s.value = String(Math.abs(Number(s.value)));
46
- let d = parseFloat(s.value) || 0;
47
- return d = d + 1 * u / Math.pow(10, a), d > h && h !== 0 && (d = h), s.value = d.toFixed(a), this.state(Number(s.value), o, l, n, h), c(s.value), s.value;
48
- }, f = (u = 1) => {
49
- s.value = String(Math.abs(Number(s.value)));
50
- let d = parseFloat(s.value) || 0;
51
- return d = d - 1 * u / Math.pow(10, a), d < n && (d = n), s.value = d.toFixed(a), this.state(Number(s.value), o, l, n, h), c(s.value), s.value;
52
- }, m = (u, d = 150) => {
53
- b === null && (b = window.setInterval(u, d));
54
- }, E = () => {
55
- b !== null && (clearInterval(b), b = null);
56
- };
57
- l.addEventListener(
58
- "mousedown",
59
- (u) => {
60
- const d = u.shiftKey ? 3 : 1;
61
- m(() => v(d));
62
- },
63
- { signal: e }
64
- ), l.addEventListener("touchstart", () => m(v), {
65
- signal: e
66
- }), ["mouseup", "mouseleave", "mouseout", "touchend", "touchcancel"].forEach(
67
- (u) => {
68
- l.addEventListener(u, E, { signal: e });
69
- }
70
- ), l.addEventListener(
71
- "click",
72
- (u) => {
73
- const d = u.shiftKey ? 3 : 1;
74
- b === null && (r = v(d), this.costomEvent(s, r));
75
- },
76
- { signal: e }
77
- ), o.addEventListener(
78
- "click",
79
- (u) => {
80
- const d = u.shiftKey ? 3 : 1;
81
- b === null && (r = f(d), this.costomEvent(s, r));
82
- },
83
- { signal: e }
84
- ), o.addEventListener(
85
- "mousedown",
86
- (u) => {
87
- const d = u.shiftKey ? 3 : 1;
88
- m(() => f(d), 100);
89
- },
90
- { signal: e }
91
- ), o.addEventListener("touchstart", () => m(f, 100), {
92
- signal: e
93
- }), ["mouseup", "mouseleave", "mouseout", "touchend", "touchcancel"].forEach(
94
- (u) => {
95
- o.addEventListener(u, E, { signal: e });
96
- }
97
- ), s.addEventListener(
98
- "keydown",
99
- (u) => {
100
- const d = u.key, y = u.shiftKey ? 5 : 1;
101
- if ([
102
- "Backspace",
103
- "Delete",
104
- "ArrowLeft",
105
- "ArrowRight",
106
- "Tab",
107
- "Enter",
108
- "Home",
109
- "End"
110
- ].includes(d) || (u.ctrlKey || u.metaKey) && ["a", "c", "v", "x"].includes(d.toLowerCase()))
111
- return;
112
- if (["e", "+", "-"].includes(d)) {
113
- u.preventDefault();
114
- return;
115
- }
116
- if (d === "ArrowUp" || d === "ArrowDown") {
117
- u.preventDefault(), d === "ArrowUp" ? v(y) : f(y);
118
- return;
119
- }
120
- const w = d === "," ? "." : d, p = /^[0-9]$/.test(w), C = w === ".", k = s.value.includes(".");
121
- (a === 0 && !p || a > 0 && !(p || C) || C && k) && u.preventDefault();
122
- },
123
- { signal: e }
124
- ), s.addEventListener(
125
- "keyup",
126
- (u) => {
127
- (u.key === "ArrowUp" || u.key === "ArrowDown") && this.costomEvent(s, s.value);
128
- },
129
- { signal: e }
130
- ), s.addEventListener(
131
- "change",
132
- () => {
133
- Number(s.value) < n && (s.value = n.toFixed(a)), Number(s.value) > h && h !== 0 ? s.value = h.toFixed(a) : s.value = Number(s.value).toFixed(a), this.state(Number(s.value), o, l, n, h), this.costomEvent(s, s.value);
134
- },
135
- { signal: e }
136
- );
137
- });
138
- }
139
- costomEvent(e, t) {
140
- const r = {
141
- detail: { id: e.id, value: t },
142
- bubbles: !0
143
- };
144
- this.dbug && console.log("CostomEvent: data.detail ", r.detail), e.dispatchEvent(new CustomEvent("ui-spinbox-change", r));
145
- }
146
- }
147
- class $ {
148
- selectors;
149
- main = null;
150
- abortController = new AbortController();
151
- dbug;
152
- constructor(e = {}, t = !1) {
153
- this.dbug = t;
154
- const r = {
155
- main: "UIsw",
156
- label: "UIsw-label"
157
- };
158
- this.selectors = { ...r, ...e }, this.main = document.querySelectorAll(
159
- `.${this.selectors.main}`
160
- ), this.event();
161
- }
162
- destroy() {
163
- this.abortController && this.abortController.abort(), this.main = null;
164
- }
165
- event() {
166
- this.abortController = new AbortController();
167
- const e = this.abortController.signal;
168
- this.main?.forEach((t) => {
169
- const r = t.querySelector(`.${this.selectors.label}`), i = t.querySelector("input");
170
- r && r.id && t.setAttribute("aria-labelledby", r.id), i && (i.checked ? t.setAttribute("aria-checked", "true") : t.setAttribute("aria-checked", "false"), t.addEventListener(
171
- "click",
172
- () => {
173
- i.checked = !i.checked;
174
- const s = t.querySelector("input");
175
- this.costomEvent(t, String(s?.checked)), t.setAttribute("aria-checked", String(i.checked));
176
- },
177
- { signal: e }
178
- ), t.addEventListener(
179
- "keydown",
180
- (s) => {
181
- s.key === "ArrowRight" ? (i.checked = !0, t.setAttribute("aria-checked", String(i.checked)), s.preventDefault(), this.costomEvent(t, String(!0))) : s.key === "ArrowLeft" && (i.checked = !1, t.setAttribute("aria-checked", String(i.checked)), s.preventDefault(), this.costomEvent(t, String(!1)));
182
- },
183
- { signal: e }
184
- ));
185
- });
186
- }
187
- costomEvent(e, t) {
188
- this.dbug && console.log(`CostomEvent: { detail: ${t}, bubbles: true }`), e.dispatchEvent(
189
- new CustomEvent("ui-switch-change", {
190
- detail: { val: t },
191
- bubbles: !0
192
- })
193
- );
194
- }
195
- }
196
- class A {
197
- selectors;
198
- main = null;
199
- itemArrowInitialized = /* @__PURE__ */ new WeakSet();
200
- abortController = new AbortController();
201
- dbug;
202
- constructor(e = {}, t = !1) {
203
- this.dbug = t;
204
- const r = {
205
- idPrefix: "UI-option-",
206
- main: "UIselect",
207
- selected: "UIselect-selected",
208
- arrow: "UIselect-arrow",
209
- optionsList: "UIselect-options",
210
- search: "UIselect-options__search",
211
- items: "UIselect-options__items",
212
- excludedItems: ["divider", "test"]
213
- // class=""
214
- };
215
- this.selectors = { ...r, ...e }, this.main = document.querySelectorAll(
216
- `.${this.selectors.main}`
217
- ), this.event(), this.initGlobalListener(this.selectors);
218
- }
219
- filterExcluded(e, t) {
220
- return Array.from(e).filter((r) => !t.some((i) => typeof i == "string" ? r.classList.contains(i) || r.id === i : r === i));
221
- }
222
- filterSearch(e, t) {
223
- const r = t.trim().toLowerCase();
224
- return e.filter((i) => {
225
- const s = i.dataset.value?.toLowerCase() || "", o = i.textContent?.toLowerCase() || "";
226
- return s.includes(r) || o.includes(r);
227
- });
228
- }
229
- destroy() {
230
- A.closeAll(this.selectors), this.abortController && this.abortController.abort(), this.main = null;
231
- }
232
- event() {
233
- this.abortController = new AbortController();
234
- const e = this.abortController.signal;
235
- this.main?.forEach(
236
- (t) => {
237
- const r = t.querySelector(
238
- `.${this.selectors.main} input[type='hidden']`
239
- );
240
- try {
241
- if (!r)
242
- throw new Error('<input type="hidden" name="YouUniqueId">');
243
- } catch (b) {
244
- return console.warn("Not found:", b.message);
245
- }
246
- const i = t.querySelector(
247
- `.${this.selectors.selected}`
248
- ), s = t.querySelector(
249
- `.${this.selectors.arrow}`
250
- ), o = t.querySelector(
251
- `.${this.selectors.optionsList}`
252
- ), l = t.querySelector(
253
- `.${this.selectors.search} input`
254
- );
255
- s && s.addEventListener(
256
- "click",
257
- () => {
258
- this.toggle(t, o);
259
- },
260
- { signal: e }
261
- ), i.addEventListener(
262
- "click",
263
- () => {
264
- this.toggle(t, o);
265
- },
266
- { signal: e }
267
- ), t.addEventListener(
268
- "click",
269
- () => {
270
- this.itemsPosition(o);
271
- },
272
- { signal: e }
273
- );
274
- const a = o.querySelectorAll(
275
- `.${this.selectors.items} ul li`
276
- ), n = this.filterExcluded(
277
- a,
278
- this.selectors.excludedItems
279
- ), h = t.querySelector(
280
- "[aria-selected='true']"
281
- );
282
- h && this.defaultSelect(t, h, i, r);
283
- var c = [];
284
- l && l.addEventListener(
285
- "input",
286
- (b) => {
287
- const f = b.target.value.trim();
288
- i && (c = this.filterSearch(n, f), f ? (a.forEach((m) => m.remove()), c.forEach((m) => {
289
- o.querySelector(`.${this.selectors.optionsList} ul`)?.appendChild(m);
290
- })) : a.forEach((m) => {
291
- o.querySelector(`.${this.selectors.optionsList} ul`)?.appendChild(m);
292
- }), this.itemArrow(t, o, i, r, e));
293
- },
294
- { signal: e }
295
- ), this.itemArrow(t, o, i, r, e), this.items(t, o, n, i, r, e);
296
- },
297
- { signal: e }
298
- );
299
- }
300
- itemArrow(e, t, r, i, s) {
301
- if (this.itemArrowInitialized.has(e)) return;
302
- this.itemArrowInitialized.add(e);
303
- let o = -1;
304
- const l = r.textContent ? r.textContent : "", a = e.querySelector(
305
- `.${this.selectors.search} input`
306
- );
307
- e.addEventListener(
308
- "keydown",
309
- (n) => {
310
- a && a.focus();
311
- const h = Array.from(
312
- t.querySelectorAll(`.${this.selectors.optionsList} ul li`)
313
- ), c = this.filterExcluded(
314
- h,
315
- this.selectors.excludedItems
316
- ), b = c.length;
317
- if (b !== 0)
318
- if (n.key === "ArrowDown") {
319
- n.preventDefault(), e.getAttribute("aria-expanded") === "false" && this.toggle(e, t), o = (o + 1) % b, r.textContent = c[o].textContent, c.forEach((f) => f.removeAttribute("aria-selected")), c[o].setAttribute("aria-selected", "true");
320
- const v = c[o].id || `${this.selectors.idPrefix}${o}`;
321
- e.setAttribute("aria-activedescendant", v), c[o].scrollIntoView({ block: "nearest" });
322
- } else if (n.key === "ArrowUp") {
323
- n.preventDefault(), o = (o - 1 + b) % b, r.textContent = c[o].textContent, c.forEach((f) => f.removeAttribute("aria-selected")), c[o].setAttribute("aria-selected", "true");
324
- const v = c[o].id || `${this.selectors.idPrefix}${o}`;
325
- e.setAttribute("aria-activedescendant", v), c[o].scrollIntoView({ block: "nearest" });
326
- } else if (n.key === "Enter")
327
- if (n.preventDefault(), o >= 0) {
328
- r.textContent = c[o].textContent, c.forEach((f) => f.removeAttribute("aria-selected")), c[o].setAttribute("aria-selected", "true");
329
- const v = c[o].id || `${this.selectors.idPrefix}${o}`;
330
- e.setAttribute("aria-activedescendant", v), i.value = String(c[o].dataset.value), this.costomEvent(e, i.value), this.close(e, t);
331
- } else
332
- this.toggle(e, t);
333
- else n.key === "Escape" && (e.getAttribute("aria-activedescendant") || (r.textContent = l), this.close(e, t));
334
- },
335
- { signal: s }
336
- );
337
- }
338
- itemsPosition(e) {
339
- const t = e.querySelector(
340
- '[aria-selected="true"]'
341
- );
342
- t && t.scrollIntoView({ block: "nearest" });
343
- }
344
- items(e, t, r, i, s, o) {
345
- r.forEach((l, a) => {
346
- l.addEventListener(
347
- "click",
348
- () => {
349
- const n = r[a];
350
- if (n) {
351
- i.textContent = n.textContent, r.forEach((c) => c.removeAttribute("aria-selected")), n.setAttribute("aria-selected", "true");
352
- const h = n.id || `${this.selectors.idPrefix}${a}`;
353
- e.setAttribute("aria-expanded", "false"), e.setAttribute("aria-activedescendant", h), s.value = String(r[a].dataset.value), this.costomEvent(e, s.value), this.close(e, t);
354
- }
355
- },
356
- { signal: o }
357
- );
358
- });
359
- }
360
- defaultSelect(e, t, r, i) {
361
- t && (i.setAttribute("value", t.dataset.value ?? ""), r.textContent = t.textContent ?? "", e.setAttribute("aria-activedescendant", t.id || ""));
362
- }
363
- costomEvent(e, t) {
364
- this.dbug && console.log(`CostomEvent: { detail: ${t}, bubbles: true }`), e.dispatchEvent(
365
- new CustomEvent("ui-select-change", {
366
- detail: { val: t },
367
- bubbles: !0
368
- })
369
- );
370
- }
371
- toggle(e, t) {
372
- A.closeAll(this.selectors), t.hidden ? (t.hidden = !1, e.setAttribute("aria-expanded", "true")) : this.close(e, t);
373
- }
374
- close(e, t) {
375
- t.hidden = !0, e.setAttribute("aria-expanded", "false");
376
- }
377
- static closeAll(e) {
378
- document.querySelectorAll(`.${e.main}`).forEach((t) => {
379
- const r = t.querySelector(`.${e.optionsList}`);
380
- r.hidden = !0, t.setAttribute("aria-expanded", "false");
381
- });
382
- }
383
- initGlobalListener(e) {
384
- document.addEventListener(
385
- "click",
386
- (t) => {
387
- const r = t.target;
388
- [...document.querySelectorAll(`.${e.main}`)].some(
389
- (s) => s.contains(r)
390
- ) || A.closeAll(e);
391
- },
392
- { signal: this.abortController.signal }
393
- );
394
- }
395
- }
396
- class I {
397
- selectors;
398
- main = null;
399
- abortController = new AbortController();
400
- dbug;
401
- constructor(e = {}, t = !0) {
402
- this.dbug = t;
403
- const r = {
404
- main: "UIbg",
405
- btn: "UIbg-btn",
406
- input: "UIbg-input"
407
- };
408
- this.selectors = { ...r, ...e }, this.main = document.querySelectorAll(
409
- `.${this.selectors.main}`
410
- ), this.#t();
411
- }
412
- destroy() {
413
- this.abortController && this.abortController.abort(), this.main = null;
414
- }
415
- #t() {
416
- this.abortController = new AbortController();
417
- const e = this.abortController.signal;
418
- this.main?.forEach((t) => {
419
- const r = t.querySelector(
420
- `.${this.selectors.input}:checked`
421
- );
422
- r && this.costomEvent(r);
423
- const i = t.querySelectorAll(
424
- `.${this.selectors.btn}`
425
- );
426
- i.forEach((l) => {
427
- l.addEventListener(
428
- "click",
429
- () => {
430
- i.forEach((a) => {
431
- a.setAttribute("aria-checked", "false"), a.setAttribute("tabindex", "-1");
432
- }), l.setAttribute("aria-checked", "true"), l.setAttribute("tabindex", "0"), l.focus();
433
- },
434
- { signal: e }
435
- ), l.addEventListener(
436
- "keydown",
437
- (a) => {
438
- let n = Array.from(i).indexOf(l);
439
- if (a.key === "ArrowRight" && n++, a.key === "ArrowLeft" && n--, n < 0 && (n = i.length - 1), n >= i.length && (n = 0), a.key === "Enter") {
440
- const c = s[n];
441
- c && !c.disabled && (s.forEach((b) => {
442
- b.checked = !1, b.removeAttribute("checked");
443
- }), c.checked = !0, c.setAttribute("checked", ""), this.costomEvent(c)), a.preventDefault();
444
- return;
445
- }
446
- const h = i[n];
447
- h && (i.forEach((c) => c.setAttribute("tabindex", "-1")), h.setAttribute("tabindex", "0"), h.focus());
448
- },
449
- { signal: e }
450
- );
451
- });
452
- const s = t.querySelectorAll(
453
- `.${this.selectors.input}`
454
- );
455
- s.forEach((l, a) => {
456
- this.dbug && (l.id || console.error(`Input #${a} in group has no ID!`), (!l.value || l.value === "on") && console.warn(
457
- `Input #${l.id} does not have a value specified (currently "${l.value}")`
458
- ));
459
- const n = i[a];
460
- n && (l.tabIndex = -1, n.setAttribute("role", "radio"), n.setAttribute("aria-checked", String(l.checked)), n.setAttribute("tabindex", l.checked ? "0" : "-1"), l.disabled ? n.setAttribute("aria-disabled", "true") : n.removeAttribute("aria-disabled"), l.addEventListener(
461
- "click",
462
- () => {
463
- s.forEach((h) => {
464
- h.checked = !1, h.removeAttribute("checked");
465
- }), s[a].checked = !0, s[a].setAttribute("checked", ""), this.costomEvent(l);
466
- },
467
- { signal: e }
468
- ));
469
- });
470
- const o = Array.from(s).find((l) => l.checked && !l.disabled) || Array.from(s).find((l) => !l.disabled);
471
- if (o) {
472
- const l = t.querySelector(
473
- `label[for="${o.id}"]`
474
- );
475
- l && l.setAttribute("tabindex", "0");
476
- }
477
- });
478
- }
479
- costomEvent(e) {
480
- const t = {
481
- detail: { id: e.id, value: e.value },
482
- bubbles: !0
483
- };
484
- this.dbug && console.log("CostomEvent:", t.detail), e.dispatchEvent(new CustomEvent("ui-button-group-change", t));
485
- }
486
- }
487
- class L {
488
- selectors;
489
- buttons = null;
490
- abortController = new AbortController();
491
- dbug;
492
- constructor(e = {}, t = !1) {
493
- this.dbug = t;
494
- const r = {
495
- main: "UIb"
496
- };
497
- this.selectors = { ...r, ...e }, this.buttons = document.querySelectorAll(
498
- `.${this.selectors.main}`
499
- ), this.#t();
500
- }
501
- destroy() {
502
- this.abortController && this.abortController.abort(), this.buttons = null;
503
- }
504
- #t() {
505
- this.abortController = new AbortController();
506
- const e = this.abortController.signal;
507
- this.buttons?.forEach((t) => {
508
- t.addEventListener(
509
- "click",
510
- () => {
511
- this.costomEvent(t, String(t.dataset.value));
512
- },
513
- { signal: e }
514
- );
515
- });
516
- }
517
- costomEvent(e, t) {
518
- if (!t || t === "undefined" || t.trim() === "") {
519
- console.log('Button data-value="" Not set!');
520
- return;
521
- }
522
- this.dbug && console.log(`CostomEvent: { detail: ${t}, bubbles: true }`), e.dispatchEvent(
523
- new CustomEvent("ui-button-change", {
524
- detail: { val: t },
525
- bubbles: !0
526
- })
527
- );
528
- }
529
- }
530
- export {
531
- L as Button,
532
- I as ButtonGroup,
533
- A as Select,
534
- S as SpinBox,
535
- $ as Switch
1
+ //#region src/SpinBox.ts
2
+ var e = class {
3
+ selectors;
4
+ spinBoxes;
5
+ abortController = new AbortController();
6
+ dbug;
7
+ constructor(e = {}, t = !1) {
8
+ this.dbug = t;
9
+ let n = {
10
+ main: "UIsp",
11
+ btn: "UIsp__btn",
12
+ input: "UIsp__input",
13
+ disabledBtn: "disabled"
14
+ };
15
+ this.selectors = {
16
+ ...n,
17
+ ...e
18
+ }, this.spinBoxes = document.querySelectorAll(`.${this.selectors.main}`), this.event();
19
+ }
20
+ state = (e, t, n, r = 0, i = 0) => {
21
+ e == r || e < r ? (t.classList.add(this.selectors.disabledBtn), t.disabled = !0) : (t.classList.remove(this.selectors.disabledBtn), t.disabled = !1), i !== 0 && (e == i || e > i ? (n.classList.add(this.selectors.disabledBtn), n.disabled = !0) : (n.classList.remove(this.selectors.disabledBtn), n.disabled = !1));
22
+ };
23
+ destroy() {
24
+ this.abortController && this.abortController.abort(), this.spinBoxes = null;
25
+ }
26
+ getValidDataNumber = (e, t) => {
27
+ let n = e.getAttribute(`data-${t}`);
28
+ return n === null || n.trim() === "" || isNaN(Number(n)) ? 0 : Number(n);
29
+ };
30
+ event() {
31
+ this.abortController = new AbortController();
32
+ let e = this.abortController.signal;
33
+ this.spinBoxes?.forEach((t) => {
34
+ let n, r = t.querySelectorAll(`.${this.selectors.btn}`), i = t.querySelector(`.${this.selectors.input}`);
35
+ this.dbug && (r || console.log(`Buttons (${this.selectors.btn}) not found in container`), i || console.log(`Input (${this.selectors.input}) not found in container`));
36
+ let a = r[0], o = r[1], s = this.getValidDataNumber(t, "step"), c = this.getValidDataNumber(t, "min"), l = this.getValidDataNumber(t, "max"), u = (e) => {
37
+ t.setAttribute("aria-valuenow", String(e)), t.setAttribute("aria-valuetext", `${e} items`);
38
+ };
39
+ Number(i.value) <= c && (i.value = c.toFixed(s)), l === 0 ? i.value = Number(i.value).toFixed(s) : (Number(i.value) >= l && (i.value = l.toFixed(s)), l && t.setAttribute("aria-valuemax", l.toFixed(s))), c && t.setAttribute("aria-valuemin", c.toFixed(s)), this.state(Number(i.value), a, o, c, l), u(i.value);
40
+ let d = null, f = (e = 1) => {
41
+ i.value = String(Math.abs(Number(i.value)));
42
+ let t = parseFloat(i.value) || 0;
43
+ return t += 1 * e / 10 ** s, t > l && l !== 0 && (t = l), i.value = t.toFixed(s), this.state(Number(i.value), a, o, c, l), u(i.value), i.value;
44
+ }, p = (e = 1) => {
45
+ i.value = String(Math.abs(Number(i.value)));
46
+ let t = parseFloat(i.value) || 0;
47
+ return t -= 1 * e / 10 ** s, t < c && (t = c), i.value = t.toFixed(s), this.state(Number(i.value), a, o, c, l), u(i.value), i.value;
48
+ }, m = (e, t = 150) => {
49
+ d === null && (d = window.setInterval(e, t));
50
+ }, h = () => {
51
+ d !== null && (clearInterval(d), d = null);
52
+ };
53
+ o.addEventListener("mousedown", (e) => {
54
+ let t = e.shiftKey ? 3 : 1;
55
+ m(() => f(t));
56
+ }, { signal: e }), o.addEventListener("touchstart", () => m(f), { signal: e }), [
57
+ "mouseup",
58
+ "mouseleave",
59
+ "mouseout",
60
+ "touchend",
61
+ "touchcancel"
62
+ ].forEach((t) => {
63
+ o.addEventListener(t, h, { signal: e });
64
+ }), o.addEventListener("click", (e) => {
65
+ let t = e.shiftKey ? 3 : 1;
66
+ d === null && (n = f(t), this.costomEvent(i, n));
67
+ }, { signal: e }), a.addEventListener("click", (e) => {
68
+ let t = e.shiftKey ? 3 : 1;
69
+ d === null && (n = p(t), this.costomEvent(i, n));
70
+ }, { signal: e }), a.addEventListener("mousedown", (e) => {
71
+ let t = e.shiftKey ? 3 : 1;
72
+ m(() => p(t), 100);
73
+ }, { signal: e }), a.addEventListener("touchstart", () => m(p, 100), { signal: e }), [
74
+ "mouseup",
75
+ "mouseleave",
76
+ "mouseout",
77
+ "touchend",
78
+ "touchcancel"
79
+ ].forEach((t) => {
80
+ a.addEventListener(t, h, { signal: e });
81
+ }), i.addEventListener("keydown", (e) => {
82
+ let t = e.key, n = e.shiftKey ? 5 : 1;
83
+ if ([
84
+ "Backspace",
85
+ "Delete",
86
+ "ArrowLeft",
87
+ "ArrowRight",
88
+ "Tab",
89
+ "Enter",
90
+ "Home",
91
+ "End"
92
+ ].includes(t) || (e.ctrlKey || e.metaKey) && [
93
+ "a",
94
+ "c",
95
+ "v",
96
+ "x"
97
+ ].includes(t.toLowerCase())) return;
98
+ if ([
99
+ "e",
100
+ "+",
101
+ "-"
102
+ ].includes(t)) {
103
+ e.preventDefault();
104
+ return;
105
+ }
106
+ if (t === "ArrowUp" || t === "ArrowDown") {
107
+ e.preventDefault(), t === "ArrowUp" ? f(n) : p(n);
108
+ return;
109
+ }
110
+ let r = t === "," ? "." : t, a = /^[0-9]$/.test(r), o = r === ".", c = i.value.includes(".");
111
+ (s === 0 && !a || s > 0 && !(a || o) || o && c) && e.preventDefault();
112
+ }, { signal: e }), i.addEventListener("keyup", (e) => {
113
+ (e.key === "ArrowUp" || e.key === "ArrowDown") && this.costomEvent(i, i.value);
114
+ }, { signal: e }), i.addEventListener("change", () => {
115
+ Number(i.value) < c && (i.value = c.toFixed(s)), Number(i.value) > l && l !== 0 ? i.value = l.toFixed(s) : i.value = Number(i.value).toFixed(s), this.state(Number(i.value), a, o, c, l), this.costomEvent(i, i.value);
116
+ }, { signal: e });
117
+ });
118
+ }
119
+ costomEvent(e, t) {
120
+ let n = {
121
+ detail: {
122
+ id: e.id,
123
+ value: t
124
+ },
125
+ bubbles: !0
126
+ };
127
+ this.dbug && console.log("CostomEvent: data.detail ", n.detail), e.dispatchEvent(new CustomEvent("ui-spinbox-change", n));
128
+ }
129
+ }, t = class {
130
+ selectors;
131
+ main = null;
132
+ abortController = new AbortController();
133
+ dbug;
134
+ constructor(e = {}, t = !1) {
135
+ this.dbug = t;
136
+ let n = {
137
+ main: "UIsw",
138
+ label: "UIsw-label"
139
+ };
140
+ this.selectors = {
141
+ ...n,
142
+ ...e
143
+ }, this.main = document.querySelectorAll(`.${this.selectors.main}`), this.event();
144
+ }
145
+ destroy() {
146
+ this.abortController && this.abortController.abort(), this.main = null;
147
+ }
148
+ event() {
149
+ this.abortController = new AbortController();
150
+ let e = this.abortController.signal;
151
+ this.main?.forEach((t) => {
152
+ let n = t.querySelector(`.${this.selectors.label}`), r = t.querySelector("input");
153
+ n && n.id && t.setAttribute("aria-labelledby", n.id), r && (r.checked ? t.setAttribute("aria-checked", "true") : t.setAttribute("aria-checked", "false"), r.addEventListener("change", () => {
154
+ t.setAttribute("aria-checked", String(r.checked)), this.customEvent(r, String(r.checked));
155
+ }, { signal: e }), t.addEventListener("click", (e) => {
156
+ if (e.target.tagName === "INPUT") return;
157
+ let t = e.target.closest("label");
158
+ t || (r.checked = !r.checked), t || r.dispatchEvent(new Event("change"));
159
+ }, { signal: e }), t.addEventListener("keydown", (e) => {
160
+ let n = t.querySelector("input");
161
+ e.key === "ArrowRight" ? (r.checked = !0, t.setAttribute("aria-checked", String(r.checked)), e.preventDefault(), this.customEvent(n, "true")) : e.key === "ArrowLeft" && (r.checked = !1, t.setAttribute("aria-checked", String(r.checked)), e.preventDefault(), this.customEvent(n, "false"));
162
+ }, { signal: e }));
163
+ });
164
+ }
165
+ setValue(e, t) {
166
+ this.main?.forEach((n) => {
167
+ let r = n.querySelector(`input#${e}`);
168
+ r && (r.checked = t, this.dbug && console.log("SetValue:", r.checked), n.setAttribute("aria-checked", String(t)), this.customEvent(r, String(t)));
169
+ });
170
+ }
171
+ customEvent(e, t) {
172
+ let n = {
173
+ detail: {
174
+ id: e.id,
175
+ value: t
176
+ },
177
+ bubbles: !0
178
+ };
179
+ this.dbug && console.log("CustomEvent:", n.detail), e.dispatchEvent(new CustomEvent("ui-switch-change", n));
180
+ }
181
+ }, n = class e {
182
+ selectors;
183
+ main = null;
184
+ itemArrowInitialized = /* @__PURE__ */ new WeakSet();
185
+ abortController = new AbortController();
186
+ dbug;
187
+ selectMap = /* @__PURE__ */ new Map();
188
+ constructor(e = {}, t = !1) {
189
+ this.dbug = t;
190
+ let n = {
191
+ idPrefix: "UI-option-",
192
+ main: "UIselect",
193
+ selected: "UIselect-selected",
194
+ arrow: "UIselect-arrow",
195
+ optionsList: "UIselect-options",
196
+ search: "UIselect-options__search",
197
+ items: "UIselect-options__items",
198
+ flash: "UIFlash",
199
+ excludedItems: ["divider", "test"]
200
+ };
201
+ this.selectors = {
202
+ ...n,
203
+ ...e
204
+ }, this.main = document.querySelectorAll(`.${this.selectors.main}`), this.event(), this.initGlobalListener(this.selectors);
205
+ }
206
+ filterExcluded(e, t) {
207
+ return Array.from(e).filter((e) => !t.some((t) => typeof t == "string" ? e.classList.contains(t) || e.id === t : e === t));
208
+ }
209
+ filterSearch(e, t) {
210
+ let n = t.trim().toLowerCase();
211
+ return e.filter((e) => {
212
+ let t = e.dataset.value?.toLowerCase() || "", r = e.textContent?.toLowerCase() || "";
213
+ return t.includes(n) || r.includes(n);
214
+ });
215
+ }
216
+ destroy() {
217
+ e.closeAll(this.selectors), this.abortController && (this.abortController.abort(), this.selectMap.clear()), this.main = null;
218
+ }
219
+ setValue(e, t) {
220
+ let n = this.selectMap.get(e);
221
+ if (!n) {
222
+ this.dbug && console.warn("UISelect: element not registered");
223
+ return;
224
+ }
225
+ let { input: r, selected: i } = n, a = e.querySelector(`.${this.selectors.optionsList}`);
226
+ if (!a) return;
227
+ let o = Array.from(a.querySelectorAll(`.${this.selectors.items} ul li`)), s = this.filterExcluded(o, this.selectors.excludedItems), c = s.find((e) => String(e.dataset.value) === String(t));
228
+ if (!c) {
229
+ this.dbug && console.warn(`UISelect: value "${t}" not found`);
230
+ return;
231
+ }
232
+ s.forEach((e) => e.removeAttribute("aria-selected")), c.setAttribute("aria-selected", "true"), i.textContent = c.textContent ?? "", r.value = String(t), r.setAttribute("value", String(t)), e.setAttribute("aria-activedescendant", c.id || `${this.selectors.idPrefix}${s.indexOf(c)}`), this.customEvent(e, String(t)), e.classList.remove(this.selectors.flash), e.offsetWidth, e.classList.add(this.selectors.flash), e.addEventListener("animationend", () => e.classList.remove(this.selectors.flash), { once: !0 });
233
+ }
234
+ event() {
235
+ this.abortController = new AbortController();
236
+ let e = this.abortController.signal;
237
+ this.main?.forEach((t) => {
238
+ let n = t.querySelector(`.${this.selectors.main} input[type='hidden']`);
239
+ try {
240
+ if (!n) throw Error("<input type=\"hidden\" name=\"YouUniqueId\">");
241
+ } catch (e) {
242
+ return console.warn("Not found:", e.message);
243
+ }
244
+ let r = t.querySelector(`.${this.selectors.selected}`), i = t.querySelector(`.${this.selectors.arrow}`), a = t.querySelector(`.${this.selectors.optionsList}`), o = t.querySelector(`.${this.selectors.search} input`);
245
+ this.selectMap.set(t, {
246
+ input: n,
247
+ selected: r
248
+ }), i && i.addEventListener("click", () => {
249
+ this.toggle(t, a);
250
+ }, { signal: e }), r.addEventListener("click", () => {
251
+ this.toggle(t, a);
252
+ }, { signal: e }), t.addEventListener("click", () => {
253
+ this.itemsPosition(a);
254
+ }, { signal: e });
255
+ let s = a.querySelectorAll(`.${this.selectors.items} ul li`), c = this.filterExcluded(s, this.selectors.excludedItems), l = t.querySelector("[aria-selected='true']");
256
+ l && this.defaultSelect(t, l, r, n);
257
+ var u = [];
258
+ o && o.addEventListener("input", (i) => {
259
+ let o = i.target.value.trim();
260
+ r && (u = this.filterSearch(c, o), o ? (s.forEach((e) => e.remove()), u.forEach((e) => {
261
+ a.querySelector(`.${this.selectors.optionsList} ul`)?.appendChild(e);
262
+ })) : s.forEach((e) => {
263
+ a.querySelector(`.${this.selectors.optionsList} ul`)?.appendChild(e);
264
+ }), this.itemArrow(t, a, r, n, e));
265
+ }, { signal: e }), this.itemArrow(t, a, r, n, e), this.items(t, a, c, r, n, e);
266
+ }, { signal: e });
267
+ }
268
+ itemArrow(e, t, n, r, i) {
269
+ if (this.itemArrowInitialized.has(e)) return;
270
+ this.itemArrowInitialized.add(e);
271
+ let a = -1, o = n.textContent ? n.textContent : "", s = e.querySelector(`.${this.selectors.search} input`);
272
+ e.addEventListener("keydown", (i) => {
273
+ s && s.focus();
274
+ let c = Array.from(t.querySelectorAll(`.${this.selectors.optionsList} ul li`)), l = this.filterExcluded(c, this.selectors.excludedItems), u = l.length;
275
+ if (u !== 0) if (i.key === "ArrowDown") {
276
+ i.preventDefault(), e.getAttribute("aria-expanded") === "false" && this.toggle(e, t), a = (a + 1) % u, n.textContent = l[a].textContent, l.forEach((e) => e.removeAttribute("aria-selected")), l[a].setAttribute("aria-selected", "true");
277
+ let r = l[a].id || `${this.selectors.idPrefix}${a}`;
278
+ e.setAttribute("aria-activedescendant", r), l[a].scrollIntoView({ block: "nearest" });
279
+ } else if (i.key === "ArrowUp") {
280
+ i.preventDefault(), a = (a - 1 + u) % u, n.textContent = l[a].textContent, l.forEach((e) => e.removeAttribute("aria-selected")), l[a].setAttribute("aria-selected", "true");
281
+ let t = l[a].id || `${this.selectors.idPrefix}${a}`;
282
+ e.setAttribute("aria-activedescendant", t), l[a].scrollIntoView({ block: "nearest" });
283
+ } else if (i.key === "Enter") if (i.preventDefault(), a >= 0) {
284
+ n.textContent = l[a].textContent, l.forEach((e) => e.removeAttribute("aria-selected")), l[a].setAttribute("aria-selected", "true");
285
+ let i = l[a].id || `${this.selectors.idPrefix}${a}`;
286
+ e.setAttribute("aria-activedescendant", i), r.value = String(l[a].dataset.value), this.customEvent(e, r.value), this.close(e, t);
287
+ } else this.toggle(e, t);
288
+ else i.key === "Escape" && (e.getAttribute("aria-activedescendant") || (n.textContent = o), this.close(e, t));
289
+ }, { signal: i });
290
+ }
291
+ itemsPosition(e) {
292
+ let t = e.querySelector("[aria-selected=\"true\"]");
293
+ t && t.scrollIntoView({ block: "nearest" });
294
+ }
295
+ items(e, t, n, r, i, a) {
296
+ n.forEach((o, s) => {
297
+ o.addEventListener("click", () => {
298
+ let a = n[s];
299
+ if (a) {
300
+ r.textContent = a.textContent, n.forEach((e) => e.removeAttribute("aria-selected")), a.setAttribute("aria-selected", "true");
301
+ let o = a.id || `${this.selectors.idPrefix}${s}`;
302
+ e.setAttribute("aria-expanded", "false"), e.setAttribute("aria-activedescendant", o), i.value = String(n[s].dataset.value), this.customEvent(e, i.value), this.close(e, t);
303
+ }
304
+ }, { signal: a });
305
+ });
306
+ }
307
+ defaultSelect(e, t, n, r) {
308
+ t && (r.setAttribute("value", t.dataset.value ?? ""), n.textContent = t.textContent ?? "", e.setAttribute("aria-activedescendant", t.id || ""));
309
+ }
310
+ customEvent(e, t) {
311
+ let n = {
312
+ detail: {
313
+ id: e.id,
314
+ value: t
315
+ },
316
+ bubbles: !0
317
+ };
318
+ this.dbug && console.log("CustomEvent:", n.detail), e.dispatchEvent(new CustomEvent("ui-select-change", n));
319
+ }
320
+ toggle(t, n) {
321
+ e.closeAll(this.selectors), n.hidden ? (n.hidden = !1, t.setAttribute("aria-expanded", "true")) : this.close(t, n);
322
+ }
323
+ close(e, t) {
324
+ t.hidden = !0, e.setAttribute("aria-expanded", "false");
325
+ }
326
+ static closeAll(e) {
327
+ document.querySelectorAll(`.${e.main}`).forEach((t) => {
328
+ let n = t.querySelector(`.${e.optionsList}`);
329
+ n.hidden = !0, t.setAttribute("aria-expanded", "false");
330
+ });
331
+ }
332
+ initGlobalListener(t) {
333
+ document.addEventListener("click", (n) => {
334
+ let r = n.target;
335
+ [...document.querySelectorAll(`.${t.main}`)].some((e) => e.contains(r)) || e.closeAll(t);
336
+ }, { signal: this.abortController.signal });
337
+ }
338
+ }, r = class {
339
+ selectors;
340
+ main = null;
341
+ abortController = new AbortController();
342
+ dbug;
343
+ constructor(e = {}, t = !1) {
344
+ this.dbug = t;
345
+ let n = {
346
+ main: "UIbg",
347
+ btn: "UIbg-btn",
348
+ input: "UIbg-input"
349
+ };
350
+ this.selectors = {
351
+ ...n,
352
+ ...e
353
+ }, this.main = document.querySelectorAll(`.${this.selectors.main}`), this.#e();
354
+ }
355
+ destroy() {
356
+ this.abortController && this.abortController.abort(), this.main = null;
357
+ }
358
+ #e() {
359
+ this.abortController = new AbortController();
360
+ let e = this.abortController.signal;
361
+ this.main?.forEach((t) => {
362
+ let n = t.querySelector(`.${this.selectors.input}:checked`);
363
+ n && this.costomEvent(n);
364
+ let r = t.querySelectorAll(`.${this.selectors.btn}`);
365
+ r.forEach((t) => {
366
+ t.addEventListener("click", () => {
367
+ r.forEach((e) => {
368
+ e.setAttribute("aria-checked", "false"), e.setAttribute("tabindex", "-1");
369
+ }), t.setAttribute("aria-checked", "true"), t.setAttribute("tabindex", "0"), t.focus();
370
+ }, { signal: e }), t.addEventListener("keydown", (e) => {
371
+ let n = Array.from(r).indexOf(t);
372
+ if (e.key === "ArrowRight" && n++, e.key === "ArrowLeft" && n--, n < 0 && (n = r.length - 1), n >= r.length && (n = 0), e.key === "Enter") {
373
+ let t = i[n];
374
+ t && !t.disabled && (i.forEach((e) => {
375
+ e.checked = !1, e.removeAttribute("checked");
376
+ }), t.checked = !0, t.setAttribute("checked", ""), this.costomEvent(t)), e.preventDefault();
377
+ return;
378
+ }
379
+ let a = r[n];
380
+ a && (r.forEach((e) => e.setAttribute("tabindex", "-1")), a.setAttribute("tabindex", "0"), a.focus());
381
+ }, { signal: e });
382
+ });
383
+ let i = t.querySelectorAll(`.${this.selectors.input}`);
384
+ i.forEach((t, n) => {
385
+ this.dbug && (t.id || console.error(`Input #${n} in group has no ID!`), (!t.value || t.value === "on") && console.warn(`Input #${t.id} does not have a value specified (currently "${t.value}")`));
386
+ let a = r[n];
387
+ a && (t.tabIndex = -1, a.setAttribute("role", "radio"), a.setAttribute("aria-checked", String(t.checked)), a.setAttribute("tabindex", t.checked ? "0" : "-1"), t.disabled ? a.setAttribute("aria-disabled", "true") : a.removeAttribute("aria-disabled"), t.addEventListener("click", () => {
388
+ i.forEach((e) => {
389
+ e.checked = !1, e.removeAttribute("checked");
390
+ }), i[n].checked = !0, i[n].setAttribute("checked", ""), this.costomEvent(t);
391
+ }, { signal: e }));
392
+ });
393
+ let a = Array.from(i).find((e) => e.checked && !e.disabled) || Array.from(i).find((e) => !e.disabled);
394
+ if (a) {
395
+ let e = t.querySelector(`label[for="${a.id}"]`);
396
+ e && e.setAttribute("tabindex", "0");
397
+ }
398
+ });
399
+ }
400
+ costomEvent(e) {
401
+ let t = {
402
+ detail: {
403
+ id: e.id,
404
+ value: e.value
405
+ },
406
+ bubbles: !0
407
+ };
408
+ this.dbug && console.log("CostomEvent:", t.detail), e.dispatchEvent(new CustomEvent("ui-button-group-change", t));
409
+ }
410
+ }, i = class {
411
+ selectors;
412
+ buttons = null;
413
+ abortController = new AbortController();
414
+ dbug;
415
+ constructor(e = {}, t = !1) {
416
+ this.dbug = t;
417
+ let n = { main: "UIb" };
418
+ this.selectors = {
419
+ ...n,
420
+ ...e
421
+ }, this.buttons = document.querySelectorAll(`.${this.selectors.main}`), this.#e();
422
+ }
423
+ destroy() {
424
+ this.abortController && this.abortController.abort(), this.buttons = null;
425
+ }
426
+ #e() {
427
+ this.abortController = new AbortController();
428
+ let e = this.abortController.signal;
429
+ this.buttons?.forEach((t) => {
430
+ t.addEventListener("click", () => {
431
+ this.costomEvent(t, String(t.dataset.value));
432
+ }, { signal: e });
433
+ });
434
+ }
435
+ costomEvent(e, t) {
436
+ if (!t || t === "undefined" || t.trim() === "") {
437
+ console.log("Button data-value=\"\" Not set!");
438
+ return;
439
+ }
440
+ this.dbug && console.log(`CostomEvent: { detail: ${t}, bubbles: true }`), e.dispatchEvent(new CustomEvent("ui-button-change", {
441
+ detail: { val: t },
442
+ bubbles: !0
443
+ }));
444
+ }
536
445
  };
446
+ //#endregion
447
+ export { i as Button, r as ButtonGroup, n as Select, e as SpinBox, t as Switch };