@popovandrii/ui-elements 0.0.28 → 0.0.31

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,456 @@
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?.disabled && (t.setAttribute("tabindex", "-1"), t.setAttribute("aria-disabled", "true"), t.addEventListener("click", (e) => {
154
+ e.preventDefault(), e.stopImmediatePropagation();
155
+ }, {
156
+ capture: !0,
157
+ signal: e
158
+ })), r && (r.checked ? t.setAttribute("aria-checked", "true") : t.setAttribute("aria-checked", "false"), r.addEventListener("change", () => {
159
+ t.setAttribute("aria-checked", String(r.checked)), this.customEvent(r, String(r.checked));
160
+ }, { signal: e }), t.addEventListener("click", (e) => {
161
+ if (e.target.tagName === "INPUT") return;
162
+ let t = e.target.closest("label");
163
+ t || (r.checked = !r.checked), t || r.dispatchEvent(new Event("change"));
164
+ }, { signal: e }), t.addEventListener("keydown", (e) => {
165
+ let n = t.querySelector("input");
166
+ 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"));
167
+ }, { signal: e }));
168
+ });
169
+ }
170
+ setValue(e, t) {
171
+ this.main?.forEach((n) => {
172
+ let r = n.querySelector(`input#${e}`);
173
+ r && (r.checked = t, this.dbug && console.log("SetValue:", r.checked), n.setAttribute("aria-checked", String(t)), this.customEvent(r, String(t)));
174
+ });
175
+ }
176
+ customEvent(e, t) {
177
+ let n = {
178
+ detail: {
179
+ id: e.id,
180
+ value: t
181
+ },
182
+ bubbles: !0
183
+ };
184
+ this.dbug && console.log("CustomEvent:", n.detail), e.dispatchEvent(new CustomEvent("ui-switch-change", n));
185
+ }
186
+ }, n = class e {
187
+ selectors;
188
+ main = null;
189
+ itemArrowInitialized = /* @__PURE__ */ new WeakSet();
190
+ abortController = new AbortController();
191
+ dbug;
192
+ selectMap = /* @__PURE__ */ new Map();
193
+ constructor(e = {}, t = !1) {
194
+ this.dbug = t;
195
+ let n = {
196
+ idPrefix: "UI-option-",
197
+ main: "UIselect",
198
+ selected: "UIselect-selected",
199
+ arrow: "UIselect-arrow",
200
+ optionsList: "UIselect-options",
201
+ search: "UIselect-options__search",
202
+ items: "UIselect-options__items",
203
+ flash: "UIFlash",
204
+ excludedItems: ["divider", "test"]
205
+ };
206
+ this.selectors = {
207
+ ...n,
208
+ ...e
209
+ }, this.main = document.querySelectorAll(`.${this.selectors.main}`), this.event(), this.initGlobalListener(this.selectors);
210
+ }
211
+ filterExcluded(e, t) {
212
+ return Array.from(e).filter((e) => !t.some((t) => typeof t == "string" ? e.classList.contains(t) || e.id === t : e === t));
213
+ }
214
+ filterSearch(e, t) {
215
+ let n = t.trim().toLowerCase();
216
+ return e.filter((e) => {
217
+ let t = e.dataset.value?.toLowerCase() || "", r = e.textContent?.toLowerCase() || "";
218
+ return t.includes(n) || r.includes(n);
219
+ });
220
+ }
221
+ destroy() {
222
+ e.closeAll(this.selectors), this.abortController && (this.abortController.abort(), this.selectMap.clear()), this.main = null;
223
+ }
224
+ setValue(e, t) {
225
+ let n = this.selectMap.get(e);
226
+ if (!n) {
227
+ this.dbug && console.warn("UISelect: element not registered");
228
+ return;
229
+ }
230
+ let { input: r, selected: i } = n, a = e.querySelector(`.${this.selectors.optionsList}`);
231
+ if (!a) return;
232
+ 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));
233
+ if (!c) {
234
+ this.dbug && console.warn(`UISelect: value "${t}" not found`);
235
+ return;
236
+ }
237
+ 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 });
238
+ }
239
+ event() {
240
+ this.abortController = new AbortController();
241
+ let e = this.abortController.signal;
242
+ this.main?.forEach((t) => {
243
+ let n = t.querySelector(`.${this.selectors.main} input[type='hidden']`);
244
+ try {
245
+ if (!n) throw Error("<input type=\"hidden\" name=\"YouUniqueId\">");
246
+ } catch (e) {
247
+ return console.warn("Not found:", e.message);
248
+ }
249
+ 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`);
250
+ this.selectMap.set(t, {
251
+ input: n,
252
+ selected: r
253
+ }), i && i.addEventListener("click", () => {
254
+ this.toggle(t, a);
255
+ }, { signal: e }), r.addEventListener("click", () => {
256
+ this.toggle(t, a);
257
+ }, { signal: e }), t.addEventListener("click", () => {
258
+ this.itemsPosition(a);
259
+ }, { signal: e });
260
+ let s = a.querySelectorAll(`.${this.selectors.items} ul li`), c = this.filterExcluded(s, this.selectors.excludedItems), l = t.querySelector("[aria-selected='true']");
261
+ l && this.defaultSelect(t, l, r, n);
262
+ var u = [];
263
+ o && o.addEventListener("input", (i) => {
264
+ let o = i.target.value.trim();
265
+ r && (u = this.filterSearch(c, o), o ? (s.forEach((e) => e.remove()), u.forEach((e) => {
266
+ a.querySelector(`.${this.selectors.optionsList} ul`)?.appendChild(e);
267
+ })) : s.forEach((e) => {
268
+ a.querySelector(`.${this.selectors.optionsList} ul`)?.appendChild(e);
269
+ }), this.itemArrow(t, a, r, n, e));
270
+ }, { signal: e }), this.itemArrow(t, a, r, n, e), this.items(t, a, c, r, n, e);
271
+ }, { signal: e });
272
+ }
273
+ itemArrow(e, t, n, r, i) {
274
+ if (this.itemArrowInitialized.has(e)) return;
275
+ this.itemArrowInitialized.add(e);
276
+ let a = -1, o = n.textContent ? n.textContent : "", s = e.querySelector(`.${this.selectors.search} input`);
277
+ e.addEventListener("keydown", (i) => {
278
+ s && s.focus();
279
+ let c = Array.from(t.querySelectorAll(`.${this.selectors.optionsList} ul li`)), l = this.filterExcluded(c, this.selectors.excludedItems), u = l.length;
280
+ if (u !== 0) if (i.key === "ArrowDown") {
281
+ 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");
282
+ let r = l[a].id || `${this.selectors.idPrefix}${a}`;
283
+ e.setAttribute("aria-activedescendant", r), l[a].scrollIntoView({ block: "nearest" });
284
+ } else if (i.key === "ArrowUp") {
285
+ 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");
286
+ let t = l[a].id || `${this.selectors.idPrefix}${a}`;
287
+ e.setAttribute("aria-activedescendant", t), l[a].scrollIntoView({ block: "nearest" });
288
+ } else if (i.key === "Enter") if (i.preventDefault(), a >= 0) {
289
+ n.textContent = l[a].textContent, l.forEach((e) => e.removeAttribute("aria-selected")), l[a].setAttribute("aria-selected", "true");
290
+ let i = l[a].id || `${this.selectors.idPrefix}${a}`;
291
+ e.setAttribute("aria-activedescendant", i), r.value = String(l[a].dataset.value), this.customEvent(e, r.value), this.close(e, t);
292
+ } else this.toggle(e, t);
293
+ else i.key === "Escape" && (e.getAttribute("aria-activedescendant") || (n.textContent = o), this.close(e, t));
294
+ }, { signal: i });
295
+ }
296
+ itemsPosition(e) {
297
+ let t = e.querySelector("[aria-selected=\"true\"]");
298
+ t && t.scrollIntoView({ block: "nearest" });
299
+ }
300
+ items(e, t, n, r, i, a) {
301
+ n.forEach((o, s) => {
302
+ o.addEventListener("click", () => {
303
+ let a = n[s];
304
+ if (a) {
305
+ r.textContent = a.textContent, n.forEach((e) => e.removeAttribute("aria-selected")), a.setAttribute("aria-selected", "true");
306
+ let o = a.id || `${this.selectors.idPrefix}${s}`;
307
+ 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);
308
+ }
309
+ }, { signal: a });
310
+ });
311
+ }
312
+ defaultSelect(e, t, n, r) {
313
+ t && (r.setAttribute("value", t.dataset.value ?? ""), n.textContent = t.textContent ?? "", e.setAttribute("aria-activedescendant", t.id || ""));
314
+ }
315
+ customEvent(e, t) {
316
+ let n = {
317
+ detail: {
318
+ id: e.id,
319
+ value: t
320
+ },
321
+ bubbles: !0
322
+ };
323
+ this.dbug && console.log("CustomEvent:", n.detail), e.dispatchEvent(new CustomEvent("ui-select-change", n));
324
+ }
325
+ toggle(t, n) {
326
+ e.closeAll(this.selectors), n.hidden ? (n.hidden = !1, t.setAttribute("aria-expanded", "true")) : this.close(t, n);
327
+ }
328
+ close(e, t) {
329
+ t.hidden = !0, e.setAttribute("aria-expanded", "false");
330
+ }
331
+ static closeAll(e) {
332
+ document.querySelectorAll(`.${e.main}`).forEach((t) => {
333
+ let n = t.querySelector(`.${e.optionsList}`);
334
+ n.hidden = !0, t.setAttribute("aria-expanded", "false");
335
+ });
336
+ }
337
+ initGlobalListener(t) {
338
+ document.addEventListener("click", (n) => {
339
+ let r = n.target;
340
+ [...document.querySelectorAll(`.${t.main}`)].some((e) => e.contains(r)) || e.closeAll(t);
341
+ }, { signal: this.abortController.signal });
342
+ }
343
+ }, r = class {
344
+ selectors;
345
+ main = null;
346
+ abortController = new AbortController();
347
+ dbug;
348
+ constructor(e = {}, t = !1) {
349
+ this.dbug = t;
350
+ let n = {
351
+ main: "UIbg",
352
+ btn: "UIbg-btn",
353
+ input: "UIbg-input"
354
+ };
355
+ this.selectors = {
356
+ ...n,
357
+ ...e
358
+ }, this.main = document.querySelectorAll(`.${this.selectors.main}`), this.#e();
359
+ }
360
+ destroy() {
361
+ this.abortController && this.abortController.abort(), this.main = null;
362
+ }
363
+ #e() {
364
+ this.abortController = new AbortController();
365
+ let e = this.abortController.signal;
366
+ this.main?.forEach((t) => {
367
+ let n = t.querySelector(`.${this.selectors.input}:checked`);
368
+ n && this.costomEvent(n);
369
+ let r = t.querySelectorAll(`.${this.selectors.btn}`);
370
+ r.forEach((t) => {
371
+ t.addEventListener("click", () => {
372
+ r.forEach((e) => {
373
+ e.setAttribute("aria-checked", "false"), e.setAttribute("tabindex", "-1");
374
+ }), t.setAttribute("aria-checked", "true"), t.setAttribute("tabindex", "0"), t.focus();
375
+ }, { signal: e }), t.addEventListener("keydown", (e) => {
376
+ let n = Array.from(r).indexOf(t);
377
+ if (e.key === "ArrowRight" && n++, e.key === "ArrowLeft" && n--, n < 0 && (n = r.length - 1), n >= r.length && (n = 0), e.key === "Enter") {
378
+ let t = i[n];
379
+ t && !t.disabled && (i.forEach((e) => {
380
+ e.checked = !1, e.removeAttribute("checked");
381
+ }), t.checked = !0, t.setAttribute("checked", ""), this.costomEvent(t)), e.preventDefault();
382
+ return;
383
+ }
384
+ let a = r[n];
385
+ a && (r.forEach((e) => e.setAttribute("tabindex", "-1")), a.setAttribute("tabindex", "0"), a.focus());
386
+ }, { signal: e });
387
+ });
388
+ let i = t.querySelectorAll(`.${this.selectors.input}`);
389
+ i.forEach((t, n) => {
390
+ 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}")`));
391
+ let a = r[n];
392
+ 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", () => {
393
+ i.forEach((e) => {
394
+ e.checked = !1, e.removeAttribute("checked");
395
+ }), i[n].checked = !0, i[n].setAttribute("checked", ""), this.costomEvent(t);
396
+ }, { signal: e }));
397
+ });
398
+ let a = Array.from(i).find((e) => e.checked && !e.disabled) || Array.from(i).find((e) => !e.disabled);
399
+ if (a) {
400
+ let e = t.querySelector(`label[for="${a.id}"]`);
401
+ e && e.setAttribute("tabindex", "0");
402
+ }
403
+ });
404
+ }
405
+ costomEvent(e) {
406
+ let t = {
407
+ detail: {
408
+ id: e.id,
409
+ value: e.value
410
+ },
411
+ bubbles: !0
412
+ };
413
+ this.dbug && console.log("CostomEvent:", t.detail), e.dispatchEvent(new CustomEvent("ui-button-group-change", t));
414
+ }
415
+ }, i = class {
416
+ selectors;
417
+ buttons = null;
418
+ abortController = new AbortController();
419
+ dbug;
420
+ constructor(e = {}, t = !0) {
421
+ this.dbug = t;
422
+ let n = { main: "UIb" };
423
+ this.selectors = {
424
+ ...n,
425
+ ...e
426
+ }, this.buttons = document.querySelectorAll(`.${this.selectors.main}`), this.#e();
427
+ }
428
+ destroy() {
429
+ this.abortController && this.abortController.abort(), this.buttons = null;
430
+ }
431
+ #e() {
432
+ this.abortController = new AbortController();
433
+ let e = this.abortController.signal;
434
+ this.buttons?.forEach((t) => {
435
+ t.addEventListener("click", () => {
436
+ this.customEvent(t, String(t.dataset.value));
437
+ }, { signal: e });
438
+ });
439
+ }
440
+ customEvent(e, t) {
441
+ if (!t || t === "undefined" || t.trim() === "") {
442
+ console.warn("Button data-value=\"\" Not set!");
443
+ return;
444
+ }
445
+ let n = {
446
+ detail: {
447
+ id: e.id,
448
+ value: t
449
+ },
450
+ bubbles: !0
451
+ };
452
+ this.dbug && console.info("Button CustomEvent:", n.detail), e.dispatchEvent(new CustomEvent("ui-button-change", n));
453
+ }
537
454
  };
455
+ //#endregion
456
+ export { i as Button, r as ButtonGroup, n as Select, e as SpinBox, t as Switch };