@popovandrii/ui-elements 0.0.28 → 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,537 +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, o = 0, s = 0) => {
19
- e == o || e < o ? (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 o = t.querySelectorAll(
34
- `.${this.selectors.btn}`
35
- ), s = t.querySelector(
36
- `.${this.selectors.input}`
37
- );
38
- this.dbug && (o || console.log(`Buttons (${this.selectors.btn}) not found in container`), s || console.log(`Input (${this.selectors.input}) not found in container`));
39
- const i = o[0], n = o[1], a = this.getValidDataNumber(t, "step"), l = 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) <= l && (s.value = l.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), l && t.setAttribute("aria-valuemin", l.toFixed(a)), this.state(Number(s.value), i, n, l, 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), i, n, l, 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 < l && (d = l), s.value = d.toFixed(a), this.state(Number(s.value), i, n, l, 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
- n.addEventListener(
58
- "mousedown",
59
- (u) => {
60
- const d = u.shiftKey ? 3 : 1;
61
- m(() => v(d));
62
- },
63
- { signal: e }
64
- ), n.addEventListener("touchstart", () => m(v), {
65
- signal: e
66
- }), ["mouseup", "mouseleave", "mouseout", "touchend", "touchcancel"].forEach(
67
- (u) => {
68
- n.addEventListener(u, E, { signal: e });
69
- }
70
- ), n.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
- ), i.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
- ), i.addEventListener(
85
- "mousedown",
86
- (u) => {
87
- const d = u.shiftKey ? 3 : 1;
88
- m(() => f(d), 100);
89
- },
90
- { signal: e }
91
- ), i.addEventListener("touchstart", () => m(f, 100), {
92
- signal: e
93
- }), ["mouseup", "mouseleave", "mouseout", "touchend", "touchcancel"].forEach(
94
- (u) => {
95
- i.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 p = d === "," ? "." : d, w = /^[0-9]$/.test(p), C = p === ".", k = s.value.includes(".");
121
- (a === 0 && !w || a > 0 && !(w || 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) < l && (s.value = l.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), i, n, l, 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}`), o = t.querySelector("input");
170
- r && r.id && t.setAttribute("aria-labelledby", r.id), o && (o.checked ? t.setAttribute("aria-checked", "true") : t.setAttribute("aria-checked", "false"), t.addEventListener(
171
- "click",
172
- (s) => {
173
- if (s.target.tagName === "INPUT") return;
174
- s.target.closest("label") || (o.checked = !o.checked);
175
- const n = t.querySelector("input");
176
- this.costomEvent(n, String(n?.checked)), t.setAttribute("aria-checked", String(o.checked));
177
- },
178
- { signal: e }
179
- ), t.addEventListener(
180
- "keydown",
181
- (s) => {
182
- const i = t.querySelector("input");
183
- s.key === "ArrowRight" ? (o.checked = !0, t.setAttribute("aria-checked", String(o.checked)), s.preventDefault(), this.costomEvent(i, String(!0))) : s.key === "ArrowLeft" && (o.checked = !1, t.setAttribute("aria-checked", String(o.checked)), s.preventDefault(), this.costomEvent(i, String(!1)));
184
- },
185
- { signal: e }
186
- ));
187
- });
188
- }
189
- costomEvent(e, t) {
190
- const r = {
191
- detail: { id: e.id, value: t },
192
- bubbles: !0
193
- };
194
- this.dbug && console.log("CostomEvent:", r.detail), e.dispatchEvent(new CustomEvent("ui-switch-change", r));
195
- }
196
- }
197
- class A {
198
- selectors;
199
- main = null;
200
- itemArrowInitialized = /* @__PURE__ */ new WeakSet();
201
- abortController = new AbortController();
202
- dbug;
203
- constructor(e = {}, t = !1) {
204
- this.dbug = t;
205
- const r = {
206
- idPrefix: "UI-option-",
207
- main: "UIselect",
208
- selected: "UIselect-selected",
209
- arrow: "UIselect-arrow",
210
- optionsList: "UIselect-options",
211
- search: "UIselect-options__search",
212
- items: "UIselect-options__items",
213
- excludedItems: ["divider", "test"]
214
- // class=""
215
- };
216
- this.selectors = { ...r, ...e }, this.main = document.querySelectorAll(
217
- `.${this.selectors.main}`
218
- ), this.event(), this.initGlobalListener(this.selectors);
219
- }
220
- filterExcluded(e, t) {
221
- return Array.from(e).filter((r) => !t.some((o) => typeof o == "string" ? r.classList.contains(o) || r.id === o : r === o));
222
- }
223
- filterSearch(e, t) {
224
- const r = t.trim().toLowerCase();
225
- return e.filter((o) => {
226
- const s = o.dataset.value?.toLowerCase() || "", i = o.textContent?.toLowerCase() || "";
227
- return s.includes(r) || i.includes(r);
228
- });
229
- }
230
- destroy() {
231
- A.closeAll(this.selectors), this.abortController && this.abortController.abort(), this.main = null;
232
- }
233
- event() {
234
- this.abortController = new AbortController();
235
- const e = this.abortController.signal;
236
- this.main?.forEach(
237
- (t) => {
238
- const r = t.querySelector(
239
- `.${this.selectors.main} input[type='hidden']`
240
- );
241
- try {
242
- if (!r)
243
- throw new Error('<input type="hidden" name="YouUniqueId">');
244
- } catch (b) {
245
- return console.warn("Not found:", b.message);
246
- }
247
- const o = t.querySelector(
248
- `.${this.selectors.selected}`
249
- ), s = t.querySelector(
250
- `.${this.selectors.arrow}`
251
- ), i = t.querySelector(
252
- `.${this.selectors.optionsList}`
253
- ), n = t.querySelector(
254
- `.${this.selectors.search} input`
255
- );
256
- s && s.addEventListener(
257
- "click",
258
- () => {
259
- this.toggle(t, i);
260
- },
261
- { signal: e }
262
- ), o.addEventListener(
263
- "click",
264
- () => {
265
- this.toggle(t, i);
266
- },
267
- { signal: e }
268
- ), t.addEventListener(
269
- "click",
270
- () => {
271
- this.itemsPosition(i);
272
- },
273
- { signal: e }
274
- );
275
- const a = i.querySelectorAll(
276
- `.${this.selectors.items} ul li`
277
- ), l = this.filterExcluded(
278
- a,
279
- this.selectors.excludedItems
280
- ), h = t.querySelector(
281
- "[aria-selected='true']"
282
- );
283
- h && this.defaultSelect(t, h, o, r);
284
- var c = [];
285
- n && n.addEventListener(
286
- "input",
287
- (b) => {
288
- const f = b.target.value.trim();
289
- o && (c = this.filterSearch(l, f), f ? (a.forEach((m) => m.remove()), c.forEach((m) => {
290
- i.querySelector(`.${this.selectors.optionsList} ul`)?.appendChild(m);
291
- })) : a.forEach((m) => {
292
- i.querySelector(`.${this.selectors.optionsList} ul`)?.appendChild(m);
293
- }), this.itemArrow(t, i, o, r, e));
294
- },
295
- { signal: e }
296
- ), this.itemArrow(t, i, o, r, e), this.items(t, i, l, o, r, e);
297
- },
298
- { signal: e }
299
- );
300
- }
301
- itemArrow(e, t, r, o, s) {
302
- if (this.itemArrowInitialized.has(e)) return;
303
- this.itemArrowInitialized.add(e);
304
- let i = -1;
305
- const n = r.textContent ? r.textContent : "", a = e.querySelector(
306
- `.${this.selectors.search} input`
307
- );
308
- e.addEventListener(
309
- "keydown",
310
- (l) => {
311
- a && a.focus();
312
- const h = Array.from(
313
- t.querySelectorAll(`.${this.selectors.optionsList} ul li`)
314
- ), c = this.filterExcluded(
315
- h,
316
- this.selectors.excludedItems
317
- ), b = c.length;
318
- if (b !== 0)
319
- if (l.key === "ArrowDown") {
320
- l.preventDefault(), e.getAttribute("aria-expanded") === "false" && this.toggle(e, t), i = (i + 1) % b, r.textContent = c[i].textContent, c.forEach((f) => f.removeAttribute("aria-selected")), c[i].setAttribute("aria-selected", "true");
321
- const v = c[i].id || `${this.selectors.idPrefix}${i}`;
322
- e.setAttribute("aria-activedescendant", v), c[i].scrollIntoView({ block: "nearest" });
323
- } else if (l.key === "ArrowUp") {
324
- l.preventDefault(), i = (i - 1 + b) % b, r.textContent = c[i].textContent, c.forEach((f) => f.removeAttribute("aria-selected")), c[i].setAttribute("aria-selected", "true");
325
- const v = c[i].id || `${this.selectors.idPrefix}${i}`;
326
- e.setAttribute("aria-activedescendant", v), c[i].scrollIntoView({ block: "nearest" });
327
- } else if (l.key === "Enter")
328
- if (l.preventDefault(), i >= 0) {
329
- r.textContent = c[i].textContent, c.forEach((f) => f.removeAttribute("aria-selected")), c[i].setAttribute("aria-selected", "true");
330
- const v = c[i].id || `${this.selectors.idPrefix}${i}`;
331
- e.setAttribute("aria-activedescendant", v), o.value = String(c[i].dataset.value), this.costomEvent(e, o.value), this.close(e, t);
332
- } else
333
- this.toggle(e, t);
334
- else l.key === "Escape" && (e.getAttribute("aria-activedescendant") || (r.textContent = n), this.close(e, t));
335
- },
336
- { signal: s }
337
- );
338
- }
339
- itemsPosition(e) {
340
- const t = e.querySelector(
341
- '[aria-selected="true"]'
342
- );
343
- t && t.scrollIntoView({ block: "nearest" });
344
- }
345
- items(e, t, r, o, s, i) {
346
- r.forEach((n, a) => {
347
- n.addEventListener(
348
- "click",
349
- () => {
350
- const l = r[a];
351
- if (l) {
352
- o.textContent = l.textContent, r.forEach((c) => c.removeAttribute("aria-selected")), l.setAttribute("aria-selected", "true");
353
- const h = l.id || `${this.selectors.idPrefix}${a}`;
354
- 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);
355
- }
356
- },
357
- { signal: i }
358
- );
359
- });
360
- }
361
- defaultSelect(e, t, r, o) {
362
- t && (o.setAttribute("value", t.dataset.value ?? ""), r.textContent = t.textContent ?? "", e.setAttribute("aria-activedescendant", t.id || ""));
363
- }
364
- costomEvent(e, t) {
365
- this.dbug && console.log(`CostomEvent: { detail: ${t}, bubbles: true }`), e.dispatchEvent(
366
- new CustomEvent("ui-select-change", {
367
- detail: { val: t },
368
- bubbles: !0
369
- })
370
- );
371
- }
372
- toggle(e, t) {
373
- A.closeAll(this.selectors), t.hidden ? (t.hidden = !1, e.setAttribute("aria-expanded", "true")) : this.close(e, t);
374
- }
375
- close(e, t) {
376
- t.hidden = !0, e.setAttribute("aria-expanded", "false");
377
- }
378
- static closeAll(e) {
379
- document.querySelectorAll(`.${e.main}`).forEach((t) => {
380
- const r = t.querySelector(`.${e.optionsList}`);
381
- r.hidden = !0, t.setAttribute("aria-expanded", "false");
382
- });
383
- }
384
- initGlobalListener(e) {
385
- document.addEventListener(
386
- "click",
387
- (t) => {
388
- const r = t.target;
389
- [...document.querySelectorAll(`.${e.main}`)].some(
390
- (s) => s.contains(r)
391
- ) || A.closeAll(e);
392
- },
393
- { signal: this.abortController.signal }
394
- );
395
- }
396
- }
397
- class L {
398
- selectors;
399
- main = null;
400
- abortController = new AbortController();
401
- dbug;
402
- constructor(e = {}, t = !1) {
403
- this.dbug = t;
404
- const r = {
405
- main: "UIbg",
406
- btn: "UIbg-btn",
407
- input: "UIbg-input"
408
- };
409
- this.selectors = { ...r, ...e }, this.main = document.querySelectorAll(
410
- `.${this.selectors.main}`
411
- ), this.#t();
412
- }
413
- destroy() {
414
- this.abortController && this.abortController.abort(), this.main = null;
415
- }
416
- #t() {
417
- this.abortController = new AbortController();
418
- const e = this.abortController.signal;
419
- this.main?.forEach((t) => {
420
- const r = t.querySelector(
421
- `.${this.selectors.input}:checked`
422
- );
423
- r && this.costomEvent(r);
424
- const o = t.querySelectorAll(
425
- `.${this.selectors.btn}`
426
- );
427
- o.forEach((n) => {
428
- n.addEventListener(
429
- "click",
430
- () => {
431
- o.forEach((a) => {
432
- a.setAttribute("aria-checked", "false"), a.setAttribute("tabindex", "-1");
433
- }), n.setAttribute("aria-checked", "true"), n.setAttribute("tabindex", "0"), n.focus();
434
- },
435
- { signal: e }
436
- ), n.addEventListener(
437
- "keydown",
438
- (a) => {
439
- let l = Array.from(o).indexOf(n);
440
- if (a.key === "ArrowRight" && l++, a.key === "ArrowLeft" && l--, l < 0 && (l = o.length - 1), l >= o.length && (l = 0), a.key === "Enter") {
441
- const c = s[l];
442
- c && !c.disabled && (s.forEach((b) => {
443
- b.checked = !1, b.removeAttribute("checked");
444
- }), c.checked = !0, c.setAttribute("checked", ""), this.costomEvent(c)), a.preventDefault();
445
- return;
446
- }
447
- const h = o[l];
448
- h && (o.forEach((c) => c.setAttribute("tabindex", "-1")), h.setAttribute("tabindex", "0"), h.focus());
449
- },
450
- { signal: e }
451
- );
452
- });
453
- const s = t.querySelectorAll(
454
- `.${this.selectors.input}`
455
- );
456
- s.forEach((n, a) => {
457
- this.dbug && (n.id || console.error(`Input #${a} in group has no ID!`), (!n.value || n.value === "on") && console.warn(
458
- `Input #${n.id} does not have a value specified (currently "${n.value}")`
459
- ));
460
- const l = o[a];
461
- l && (n.tabIndex = -1, l.setAttribute("role", "radio"), l.setAttribute("aria-checked", String(n.checked)), l.setAttribute("tabindex", n.checked ? "0" : "-1"), n.disabled ? l.setAttribute("aria-disabled", "true") : l.removeAttribute("aria-disabled"), n.addEventListener(
462
- "click",
463
- () => {
464
- s.forEach((h) => {
465
- h.checked = !1, h.removeAttribute("checked");
466
- }), s[a].checked = !0, s[a].setAttribute("checked", ""), this.costomEvent(n);
467
- },
468
- { signal: e }
469
- ));
470
- });
471
- const i = Array.from(s).find((n) => n.checked && !n.disabled) || Array.from(s).find((n) => !n.disabled);
472
- if (i) {
473
- const n = t.querySelector(
474
- `label[for="${i.id}"]`
475
- );
476
- n && n.setAttribute("tabindex", "0");
477
- }
478
- });
479
- }
480
- costomEvent(e) {
481
- const t = {
482
- detail: { id: e.id, value: e.value },
483
- bubbles: !0
484
- };
485
- this.dbug && console.log("CostomEvent:", t.detail), e.dispatchEvent(new CustomEvent("ui-button-group-change", t));
486
- }
487
- }
488
- class I {
489
- selectors;
490
- buttons = null;
491
- abortController = new AbortController();
492
- dbug;
493
- constructor(e = {}, t = !1) {
494
- this.dbug = t;
495
- const r = {
496
- main: "UIb"
497
- };
498
- this.selectors = { ...r, ...e }, this.buttons = document.querySelectorAll(
499
- `.${this.selectors.main}`
500
- ), this.#t();
501
- }
502
- destroy() {
503
- this.abortController && this.abortController.abort(), this.buttons = null;
504
- }
505
- #t() {
506
- this.abortController = new AbortController();
507
- const e = this.abortController.signal;
508
- this.buttons?.forEach((t) => {
509
- t.addEventListener(
510
- "click",
511
- () => {
512
- this.costomEvent(t, String(t.dataset.value));
513
- },
514
- { signal: e }
515
- );
516
- });
517
- }
518
- costomEvent(e, t) {
519
- if (!t || t === "undefined" || t.trim() === "") {
520
- console.log('Button data-value="" Not set!');
521
- return;
522
- }
523
- this.dbug && console.log(`CostomEvent: { detail: ${t}, bubbles: true }`), e.dispatchEvent(
524
- new CustomEvent("ui-button-change", {
525
- detail: { val: t },
526
- bubbles: !0
527
- })
528
- );
529
- }
530
- }
531
- export {
532
- I as Button,
533
- L as ButtonGroup,
534
- A as Select,
535
- S as SpinBox,
536
- $ 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
+ }
537
445
  };
446
+ //#endregion
447
+ export { i as Button, r as ButtonGroup, n as Select, e as SpinBox, t as Switch };