@tachui/forms 0.7.1-alpha → 0.8.0-alpha

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.
Files changed (90) hide show
  1. package/README.md +87 -272
  2. package/dist/DatePicker-D5nRFTUm.js +475 -0
  3. package/dist/DatePicker-D5nRFTUm.js.map +1 -0
  4. package/dist/Select-yZyKooXk.js +945 -0
  5. package/dist/Select-yZyKooXk.js.map +1 -0
  6. package/dist/Slider-0-oal5YR.js +644 -0
  7. package/dist/Slider-0-oal5YR.js.map +1 -0
  8. package/dist/TextField-hX15dY3U.js +509 -0
  9. package/dist/TextField-hX15dY3U.js.map +1 -0
  10. package/dist/components/advanced/Slider.d.ts +190 -0
  11. package/dist/components/advanced/Slider.d.ts.map +1 -0
  12. package/dist/components/advanced/Stepper.d.ts +161 -0
  13. package/dist/components/advanced/Stepper.d.ts.map +1 -0
  14. package/dist/components/advanced/index.d.ts +15 -0
  15. package/dist/components/advanced/index.d.ts.map +1 -0
  16. package/dist/components/advanced/index.js +6 -0
  17. package/dist/components/advanced/index.js.map +1 -0
  18. package/dist/components/date-picker/DatePicker.d.ts +126 -0
  19. package/dist/components/date-picker/DatePicker.d.ts.map +1 -0
  20. package/dist/components/date-picker/index.d.ts +14 -0
  21. package/dist/components/date-picker/index.d.ts.map +1 -0
  22. package/dist/components/date-picker/index.js +5 -0
  23. package/dist/components/date-picker/index.js.map +1 -0
  24. package/dist/components/form-container/index.d.ts +58 -0
  25. package/dist/components/form-container/index.d.ts.map +1 -0
  26. package/dist/components/selection/Checkbox.d.ts.map +1 -0
  27. package/dist/components/selection/Radio.d.ts.map +1 -0
  28. package/dist/components/selection/Select.d.ts.map +1 -0
  29. package/dist/components/selection/index.d.ts +68 -0
  30. package/dist/components/selection/index.d.ts.map +1 -0
  31. package/dist/components/selection/index.js +12 -0
  32. package/dist/components/selection/index.js.map +1 -0
  33. package/dist/components/text-input/TextField.d.ts.map +1 -0
  34. package/dist/components/text-input/index.d.ts +8 -0
  35. package/dist/components/text-input/index.d.ts.map +1 -0
  36. package/dist/components/text-input/index.js +18 -0
  37. package/dist/components/text-input/index.js.map +1 -0
  38. package/dist/{state/index.js → index-D3WfkqVv.js} +15 -8
  39. package/dist/index-D3WfkqVv.js.map +1 -0
  40. package/dist/index.d.ts +10 -15
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +198 -376
  43. package/dist/index.js.map +1 -0
  44. package/dist/state/index.d.ts.map +1 -1
  45. package/dist/types/index.d.ts.map +1 -1
  46. package/dist/utils/index.d.ts +19 -0
  47. package/dist/utils/index.d.ts.map +1 -0
  48. package/dist/validation/component-validation.d.ts +11 -2
  49. package/dist/validation/component-validation.d.ts.map +1 -1
  50. package/dist/validation/index.d.ts.map +1 -1
  51. package/dist/validation/index.js +282 -191
  52. package/dist/validation/index.js.map +1 -0
  53. package/package.json +53 -39
  54. package/src/components/advanced/Slider.ts +722 -0
  55. package/src/components/advanced/Stepper.ts +715 -0
  56. package/src/components/advanced/index.ts +20 -0
  57. package/src/components/date-picker/DatePicker.ts +925 -0
  58. package/src/components/date-picker/index.ts +20 -0
  59. package/src/components/form-container/index.ts +266 -0
  60. package/src/components/selection/Checkbox.ts +478 -0
  61. package/src/components/selection/Radio.ts +470 -0
  62. package/src/components/selection/Select.ts +620 -0
  63. package/src/components/selection/index.ts +81 -0
  64. package/src/components/text-input/TextField.ts +728 -0
  65. package/src/components/text-input/index.ts +35 -0
  66. package/src/index.ts +48 -0
  67. package/src/state/index.ts +544 -0
  68. package/src/types/index.ts +579 -0
  69. package/src/utils/formatters.ts +184 -0
  70. package/src/utils/index.ts +57 -0
  71. package/src/validation/component-validation.ts +429 -0
  72. package/src/validation/index.ts +641 -0
  73. package/dist/TextField-CGBM3x7K.js +0 -1799
  74. package/dist/components/Form.d.ts +0 -76
  75. package/dist/components/Form.d.ts.map +0 -1
  76. package/dist/components/index.d.ts +0 -9
  77. package/dist/components/index.d.ts.map +0 -1
  78. package/dist/components/index.js +0 -28
  79. package/dist/components/input/Checkbox.d.ts.map +0 -1
  80. package/dist/components/input/Radio.d.ts.map +0 -1
  81. package/dist/components/input/Select.d.ts.map +0 -1
  82. package/dist/components/input/TextField.d.ts.map +0 -1
  83. package/dist/components/input/index.d.ts +0 -11
  84. package/dist/components/input/index.d.ts.map +0 -1
  85. package/dist/utils/validators.d.ts +0 -101
  86. package/dist/utils/validators.d.ts.map +0 -1
  87. /package/dist/components/{input → selection}/Checkbox.d.ts +0 -0
  88. /package/dist/components/{input → selection}/Radio.d.ts +0 -0
  89. /package/dist/components/{input → selection}/Select.d.ts +0 -0
  90. /package/dist/components/{input → text-input}/TextField.d.ts +0 -0
@@ -0,0 +1,945 @@
1
+ import { createSignal as M, createEffect as N, h as n, text as s, useLifecycle as te, setupOutsideClickDetection as re } from "@tachui/core";
2
+ import { a as T } from "./index-D3WfkqVv.js";
3
+ const Q = (p) => {
4
+ const {
5
+ name: e,
6
+ label: f,
7
+ disabled: o = !1,
8
+ required: u = !1,
9
+ checked: v,
10
+ defaultChecked: m = !1,
11
+ indeterminate: w = !1,
12
+ validation: q,
13
+ onChange: V,
14
+ onBlur: I,
15
+ onFocus: D,
16
+ error: B,
17
+ helperText: C,
18
+ ...b
19
+ } = p, h = p._formContext, t = T(
20
+ e,
21
+ v ?? m,
22
+ q
23
+ );
24
+ h && h.register(e, q);
25
+ const [c, k] = M(!1);
26
+ v !== void 0 && N(() => {
27
+ t.value() !== v && t.setValue(v);
28
+ });
29
+ const S = (x) => {
30
+ const $ = x.target.checked;
31
+ t.setValue($), h && h.setValue(e, $), V && V(e, $, t);
32
+ }, r = (x) => {
33
+ k(!0), t.onFocus(), D && D(e, t.value());
34
+ }, g = (x) => {
35
+ k(!1), t.onBlur(), I && I(e, t.value());
36
+ }, l = B || t.error() || h?.getError(e), i = (x) => {
37
+ if (x.key === " " || x.key === "Enter") {
38
+ x.preventDefault();
39
+ const E = x.target;
40
+ E.checked = !E.checked, S(x);
41
+ }
42
+ };
43
+ return {
44
+ type: "component",
45
+ id: b.id || `checkbox-${e}`,
46
+ render: () => n(
47
+ "div",
48
+ {
49
+ ...b,
50
+ class: `tachui-checkbox ${b.class || ""}`.trim(),
51
+ "data-tachui-checkbox-container": !0,
52
+ "data-field-state": l ? "error" : t.validating() ? "validating" : "valid",
53
+ "data-checked": t.value(),
54
+ "data-indeterminate": w,
55
+ "data-disabled": o
56
+ },
57
+ // Checkbox input and label wrapper
58
+ n(
59
+ "label",
60
+ {
61
+ "data-tachui-checkbox-label": !0,
62
+ "data-focused": c(),
63
+ "data-disabled": o
64
+ },
65
+ // Hidden native checkbox for accessibility
66
+ n("input", {
67
+ type: "checkbox",
68
+ id: b.id || e,
69
+ name: e,
70
+ checked: t.value(),
71
+ disabled: o,
72
+ required: u,
73
+ onchange: S,
74
+ onfocus: r,
75
+ onblur: g,
76
+ onkeydown: i,
77
+ "aria-invalid": !!l,
78
+ "aria-describedby": [
79
+ l ? `${e}-error` : null,
80
+ C ? `${e}-helper` : null
81
+ ].filter(Boolean).join(" ") || void 0,
82
+ "data-tachui-checkbox-input": !0,
83
+ style: {
84
+ position: "absolute",
85
+ opacity: "0",
86
+ width: "1px",
87
+ height: "1px",
88
+ margin: "-1px",
89
+ padding: "0",
90
+ border: "0",
91
+ clip: "rect(0,0,0,0)"
92
+ }
93
+ }),
94
+ // Custom checkbox visual
95
+ n(
96
+ "div",
97
+ {
98
+ "data-tachui-checkbox-visual": !0,
99
+ "data-checked": t.value(),
100
+ "data-indeterminate": w,
101
+ "data-focused": c(),
102
+ "data-disabled": o,
103
+ "data-error": !!l,
104
+ "aria-hidden": "true",
105
+ role: "presentation"
106
+ },
107
+ ...t.value() || w ? [
108
+ n(
109
+ "div",
110
+ {
111
+ "data-tachui-checkbox-indicator": !0,
112
+ "data-type": w ? "indeterminate" : "checked"
113
+ },
114
+ s(w ? "−" : "✓")
115
+ )
116
+ ] : []
117
+ ),
118
+ ...f ? [
119
+ n(
120
+ "span",
121
+ {
122
+ "data-tachui-checkbox-text": !0,
123
+ "data-disabled": o
124
+ },
125
+ s(f),
126
+ ...u ? [
127
+ n(
128
+ "span",
129
+ {
130
+ "aria-label": "required",
131
+ "data-required-indicator": !0
132
+ },
133
+ s(" *")
134
+ )
135
+ ] : []
136
+ )
137
+ ] : []
138
+ ),
139
+ ...l ? [
140
+ n(
141
+ "div",
142
+ {
143
+ id: `${e}-error`,
144
+ role: "alert",
145
+ "aria-live": "polite",
146
+ "data-tachui-error": !0
147
+ },
148
+ s(l)
149
+ )
150
+ ] : [],
151
+ ...C && !l ? [
152
+ n(
153
+ "div",
154
+ {
155
+ id: `${e}-helper`,
156
+ "data-tachui-helper": !0
157
+ },
158
+ s(C)
159
+ )
160
+ ] : [],
161
+ ...t.validating() ? [
162
+ n(
163
+ "div",
164
+ {
165
+ "data-tachui-validation-spinner": !0,
166
+ "aria-label": "Validating..."
167
+ },
168
+ s("⏳")
169
+ )
170
+ ] : []
171
+ ),
172
+ props: p,
173
+ cleanup: [
174
+ () => {
175
+ h && h.unregister(e);
176
+ }
177
+ ]
178
+ };
179
+ }, de = (p) => {
180
+ const { size: e = "medium", ...f } = p, o = {
181
+ ...f,
182
+ class: `tachui-switch tachui-switch-${e} ${f.class || ""}`.trim()
183
+ }, u = Q(o);
184
+ return {
185
+ ...u,
186
+ render: () => {
187
+ const v = u.render();
188
+ return Array.isArray(v) ? v.map((m) => ({
189
+ ...m,
190
+ props: {
191
+ ...m.props,
192
+ "data-tachui-switch": !0,
193
+ "data-switch-size": e
194
+ }
195
+ })) : {
196
+ ...v,
197
+ props: {
198
+ ...v.props,
199
+ "data-tachui-switch": !0,
200
+ "data-switch-size": e
201
+ }
202
+ };
203
+ }
204
+ };
205
+ }, oe = (p) => {
206
+ const {
207
+ name: e,
208
+ label: f,
209
+ options: o,
210
+ value: u,
211
+ defaultValue: v = [],
212
+ onChange: m,
213
+ validation: w,
214
+ error: q,
215
+ helperText: V,
216
+ disabled: I = !1,
217
+ required: D = !1,
218
+ direction: B = "vertical",
219
+ ...C
220
+ } = p, b = T(e, u ?? v, w), h = (c, k) => {
221
+ const S = b.value() || [];
222
+ let r;
223
+ k ? r = [...S, c] : r = S.filter((g) => g !== c), b.setValue(r), m && m(e, r, c);
224
+ };
225
+ return {
226
+ type: "component",
227
+ id: C.id || `checkbox-group-${e}`,
228
+ render: () => n(
229
+ "fieldset",
230
+ {
231
+ ...C,
232
+ "data-tachui-checkbox-group": !0,
233
+ "data-direction": B,
234
+ "data-disabled": I
235
+ },
236
+ ...f ? [
237
+ n(
238
+ "legend",
239
+ {
240
+ "data-tachui-group-label": !0
241
+ },
242
+ s(f),
243
+ ...D ? [
244
+ n(
245
+ "span",
246
+ {
247
+ "aria-label": "required",
248
+ "data-required-indicator": !0
249
+ },
250
+ s(" *")
251
+ )
252
+ ] : []
253
+ )
254
+ ] : [],
255
+ // Checkbox options
256
+ n(
257
+ "div",
258
+ {
259
+ "data-tachui-checkbox-options": !0,
260
+ "data-direction": B
261
+ },
262
+ ...o.flatMap((c, k) => {
263
+ const r = Q({
264
+ name: `${e}-${k}`,
265
+ label: c.label,
266
+ checked: (b.value() || []).includes(c.value),
267
+ disabled: I || c.disabled,
268
+ onChange: (g, l) => h(c.value, l)
269
+ }).render();
270
+ return Array.isArray(r) ? r : [r];
271
+ })
272
+ ),
273
+ ...q ? [
274
+ n(
275
+ "div",
276
+ {
277
+ id: `${e}-error`,
278
+ role: "alert",
279
+ "aria-live": "polite",
280
+ "data-tachui-error": !0
281
+ },
282
+ s(q)
283
+ )
284
+ ] : [],
285
+ ...V && !q ? [
286
+ n(
287
+ "div",
288
+ {
289
+ id: `${e}-helper`,
290
+ "data-tachui-helper": !0
291
+ },
292
+ s(V)
293
+ )
294
+ ] : []
295
+ ),
296
+ props: p
297
+ };
298
+ }, le = (p) => {
299
+ const {
300
+ name: e,
301
+ value: f,
302
+ label: o,
303
+ checked: u,
304
+ groupName: v,
305
+ disabled: m = !1,
306
+ required: w = !1,
307
+ validation: q,
308
+ onChange: V,
309
+ onBlur: I,
310
+ onFocus: D,
311
+ error: B,
312
+ helperText: C,
313
+ ...b
314
+ } = p, h = p._formContext, t = v || e, c = T(
315
+ t,
316
+ u ? f : void 0,
317
+ q
318
+ );
319
+ h && h.register(t, q);
320
+ const [k, S] = M(!1), r = () => c.value() === f, g = ($) => {
321
+ $.target.checked && (c.setValue(f), h && h.setValue(t, f), V && V(t, f, c));
322
+ }, l = ($) => {
323
+ S(!0), c.onFocus(), D && D(t, c.value());
324
+ }, i = ($) => {
325
+ S(!1), c.onBlur(), I && I(t, c.value());
326
+ }, y = B || c.error() || h?.getError(t), x = ($) => {
327
+ ($.key === " " || $.key === "Enter") && ($.preventDefault(), g($));
328
+ };
329
+ return {
330
+ type: "component",
331
+ id: b.id || `radio-${t}-${f}`,
332
+ render: () => n(
333
+ "div",
334
+ {
335
+ ...b,
336
+ class: `tachui-radio ${b.class || ""}`.trim(),
337
+ "data-tachui-radio-container": !0,
338
+ "data-field-state": y ? "error" : c.validating() ? "validating" : "valid",
339
+ "data-checked": r(),
340
+ "data-disabled": m
341
+ },
342
+ // Radio input and label wrapper
343
+ n(
344
+ "label",
345
+ {
346
+ "data-tachui-radio-label": !0,
347
+ "data-focused": k(),
348
+ "data-disabled": m
349
+ },
350
+ // Hidden native radio for accessibility
351
+ n("input", {
352
+ type: "radio",
353
+ id: b.id || `${t}-${f}`,
354
+ name: t,
355
+ value: f,
356
+ checked: r(),
357
+ disabled: m,
358
+ required: w,
359
+ onchange: g,
360
+ onfocus: l,
361
+ onblur: i,
362
+ onkeydown: x,
363
+ "aria-invalid": !!y,
364
+ "aria-describedby": [
365
+ y ? `${t}-error` : null,
366
+ C ? `${t}-helper` : null
367
+ ].filter(Boolean).join(" ") || void 0,
368
+ "data-tachui-radio-input": !0,
369
+ style: {
370
+ position: "absolute",
371
+ opacity: "0",
372
+ width: "1px",
373
+ height: "1px",
374
+ margin: "-1px",
375
+ padding: "0",
376
+ border: "0",
377
+ clip: "rect(0,0,0,0)"
378
+ }
379
+ }),
380
+ // Custom radio visual
381
+ n(
382
+ "div",
383
+ {
384
+ "data-tachui-radio-visual": !0,
385
+ "data-checked": r(),
386
+ "data-focused": k(),
387
+ "data-disabled": m,
388
+ "data-error": !!y,
389
+ "aria-hidden": "true",
390
+ role: "presentation"
391
+ },
392
+ ...r() ? [
393
+ n("div", {
394
+ "data-tachui-radio-dot": !0
395
+ })
396
+ ] : []
397
+ ),
398
+ ...o ? [
399
+ n(
400
+ "span",
401
+ {
402
+ "data-tachui-radio-text": !0,
403
+ "data-disabled": m
404
+ },
405
+ s(o),
406
+ ...w ? [
407
+ n(
408
+ "span",
409
+ {
410
+ "aria-label": "required",
411
+ "data-required-indicator": !0
412
+ },
413
+ s(" *")
414
+ )
415
+ ] : []
416
+ )
417
+ ] : []
418
+ )
419
+ ),
420
+ props: p,
421
+ cleanup: [
422
+ () => {
423
+ }
424
+ ]
425
+ };
426
+ }, ce = (p) => {
427
+ const {
428
+ name: e,
429
+ label: f,
430
+ options: o,
431
+ value: u,
432
+ defaultValue: v,
433
+ onChange: m,
434
+ validation: w,
435
+ error: q,
436
+ helperText: V,
437
+ disabled: I = !1,
438
+ required: D = !1,
439
+ direction: B = "vertical",
440
+ ...C
441
+ } = p, b = p._formContext, h = T(e, u ?? v, w);
442
+ b && b.register(e, w), u !== void 0 && N(() => {
443
+ h.value() !== u && h.setValue(u);
444
+ });
445
+ const t = (r) => {
446
+ h.setValue(r), b && b.setValue(e, r), m && m(e, r);
447
+ }, c = (r) => {
448
+ const g = o.findIndex((i) => i.value === h.value());
449
+ let l = g;
450
+ switch (r.key) {
451
+ case "ArrowDown":
452
+ case "ArrowRight":
453
+ r.preventDefault(), l = (g + 1) % o.length;
454
+ break;
455
+ case "ArrowUp":
456
+ case "ArrowLeft":
457
+ r.preventDefault(), l = g === 0 ? o.length - 1 : g - 1;
458
+ break;
459
+ case "Home":
460
+ r.preventDefault(), l = 0;
461
+ break;
462
+ case "End":
463
+ r.preventDefault(), l = o.length - 1;
464
+ break;
465
+ default:
466
+ return;
467
+ }
468
+ for (; o[l]?.disabled && (r.key === "ArrowDown" || r.key === "ArrowRight" ? l = (l + 1) % o.length : l = l === 0 ? o.length - 1 : l - 1, l !== g); )
469
+ ;
470
+ o[l]?.disabled || (t(o[l].value), setTimeout(() => {
471
+ const i = document.querySelector(
472
+ `input[name="${e}"][value="${o[l].value}"]`
473
+ );
474
+ i && i.focus();
475
+ }, 0));
476
+ }, k = q || h.error();
477
+ return {
478
+ type: "component",
479
+ id: C.id || `radio-group-${e}`,
480
+ render: () => n(
481
+ "fieldset",
482
+ {
483
+ ...C,
484
+ "data-tachui-radio-group": !0,
485
+ "data-direction": B,
486
+ "data-disabled": I,
487
+ role: "radiogroup",
488
+ "aria-invalid": !!k,
489
+ "aria-describedby": [
490
+ k ? `${e}-error` : null,
491
+ V ? `${e}-helper` : null
492
+ ].filter(Boolean).join(" ") || void 0,
493
+ onkeydown: c
494
+ },
495
+ ...f ? [
496
+ n(
497
+ "legend",
498
+ {
499
+ "data-tachui-group-label": !0
500
+ },
501
+ s(f),
502
+ ...D ? [
503
+ n(
504
+ "span",
505
+ {
506
+ "aria-label": "required",
507
+ "data-required-indicator": !0
508
+ },
509
+ s(" *")
510
+ )
511
+ ] : []
512
+ )
513
+ ] : [],
514
+ // Radio options
515
+ n(
516
+ "div",
517
+ {
518
+ "data-tachui-radio-options": !0,
519
+ "data-direction": B
520
+ },
521
+ ...o.flatMap((r, g) => {
522
+ const i = le({
523
+ name: `${e}-${g}`,
524
+ groupName: e,
525
+ value: r.value,
526
+ label: r.label,
527
+ checked: h.value() === r.value,
528
+ disabled: I || r.disabled,
529
+ required: D,
530
+ onChange: () => t(r.value),
531
+ _formContext: b
532
+ }).render();
533
+ return Array.isArray(i) ? i : [i];
534
+ })
535
+ ),
536
+ ...k ? [
537
+ n(
538
+ "div",
539
+ {
540
+ id: `${e}-error`,
541
+ role: "alert",
542
+ "aria-live": "polite",
543
+ "data-tachui-error": !0
544
+ },
545
+ s(k)
546
+ )
547
+ ] : [],
548
+ ...V && !k ? [
549
+ n(
550
+ "div",
551
+ {
552
+ id: `${e}-helper`,
553
+ "data-tachui-helper": !0
554
+ },
555
+ s(V)
556
+ )
557
+ ] : []
558
+ ),
559
+ props: p,
560
+ cleanup: [
561
+ () => {
562
+ b && b.unregister(e);
563
+ }
564
+ ]
565
+ };
566
+ }, U = (p) => {
567
+ const {
568
+ name: e,
569
+ label: f,
570
+ options: o,
571
+ multiple: u = !1,
572
+ searchable: v = !1,
573
+ clearable: m = !1,
574
+ placeholder: w = u ? "Select options..." : "Select an option...",
575
+ noOptionsMessage: q = "No options available",
576
+ loadingMessage: V = "Loading...",
577
+ maxMenuHeight: I = 200,
578
+ disabled: D = !1,
579
+ required: B = !1,
580
+ value: C,
581
+ defaultValue: b,
582
+ validation: h,
583
+ onChange: t,
584
+ onBlur: c,
585
+ onFocus: k,
586
+ error: S,
587
+ helperText: r,
588
+ ...g
589
+ } = p, l = p._formContext, i = T(e, C ?? b, h);
590
+ l && l.register(e, h);
591
+ const [y, x] = M(!1), [E, $] = M(!1), [R, L] = M(""), [O, _] = M(-1), [J] = M(!1);
592
+ C !== void 0 && N(() => {
593
+ i.value() !== C && i.setValue(C);
594
+ });
595
+ const K = () => {
596
+ if (!v || !R())
597
+ return o;
598
+ const a = R().toLowerCase();
599
+ return o.filter(
600
+ (d) => d.label.toLowerCase().includes(a) || String(d.value).toLowerCase().includes(a)
601
+ );
602
+ }, W = () => {
603
+ const a = i.value();
604
+ if (u)
605
+ return !a || !Array.isArray(a) || a.length === 0 ? w : o.filter((A) => a.includes(A.value)).map((A) => A.label).join(", ");
606
+ {
607
+ if (a == null || a === "")
608
+ return w;
609
+ const d = o.find((A) => A.value === a);
610
+ return d ? d.label : String(a);
611
+ }
612
+ }, z = (a) => {
613
+ if (a.disabled) return;
614
+ let d;
615
+ if (u) {
616
+ const A = i.value() || [];
617
+ A.includes(a.value) ? d = A.filter((ae) => ae !== a.value) : d = [...A, a.value];
618
+ } else
619
+ d = a.value, x(!1), L("");
620
+ i.setValue(d), l && l.setValue(e, d), t && t(e, d, i);
621
+ }, j = () => {
622
+ if (D) return;
623
+ const a = !y();
624
+ x(a), a && (_(-1), v && L(""));
625
+ }, X = (a) => {
626
+ const d = a.target;
627
+ L(d.value), _(-1);
628
+ }, Y = (a) => {
629
+ const d = K();
630
+ switch (a.key) {
631
+ case "Enter":
632
+ a.preventDefault(), y() ? O() >= 0 && d[O()] && z(d[O()]) : j();
633
+ break;
634
+ case " ":
635
+ (!v || !y()) && (a.preventDefault(), j());
636
+ break;
637
+ case "Escape":
638
+ a.preventDefault(), x(!1), L("");
639
+ break;
640
+ case "ArrowDown":
641
+ if (a.preventDefault(), !y())
642
+ j();
643
+ else {
644
+ const A = Math.min(
645
+ O() + 1,
646
+ d.length - 1
647
+ );
648
+ _(A);
649
+ }
650
+ break;
651
+ case "ArrowUp":
652
+ if (a.preventDefault(), y()) {
653
+ const A = Math.max(O() - 1, -1);
654
+ _(A);
655
+ }
656
+ break;
657
+ case "Home":
658
+ y() && (a.preventDefault(), _(0));
659
+ break;
660
+ case "End":
661
+ y() && (a.preventDefault(), _(d.length - 1));
662
+ break;
663
+ case "Backspace":
664
+ m && !v && i.value() !== null && (a.preventDefault(), G());
665
+ break;
666
+ }
667
+ }, Z = () => {
668
+ $(!0), i.onFocus(), k && k(e, i.value());
669
+ }, ee = (a) => {
670
+ requestAnimationFrame(() => {
671
+ const d = a.relatedTarget;
672
+ a.target.closest(
673
+ "[data-tachui-select-container]"
674
+ )?.contains(d) || ($(!1), x(!1), i.onBlur(), c && c(e, i.value()));
675
+ });
676
+ }, G = () => {
677
+ const a = u ? [] : null;
678
+ i.setValue(a), l && l.setValue(e, a), t && t(e, a, i);
679
+ }, H = (a) => {
680
+ const d = i.value();
681
+ return u ? Array.isArray(d) && d.includes(a.value) : d === a.value;
682
+ }, F = S || i.error() || l?.getError(e), P = {
683
+ type: "component",
684
+ id: g.id || `select-${e}`,
685
+ cleanup: [],
686
+ render: () => ({
687
+ type: "element",
688
+ tag: "div",
689
+ props: {
690
+ ...g,
691
+ class: `tachui-select ${g.class || ""}`.trim(),
692
+ "data-tachui-select-container": !0,
693
+ "data-field-state": F ? "error" : i.validating() ? "validating" : "valid",
694
+ "data-open": y(),
695
+ "data-disabled": D,
696
+ "data-multiple": u,
697
+ "data-searchable": v
698
+ },
699
+ children: [
700
+ // Label
701
+ ...f ? [
702
+ n(
703
+ "label",
704
+ {
705
+ for: g.id || e,
706
+ "data-tachui-label": !0,
707
+ "data-required": B
708
+ },
709
+ s(f),
710
+ ...B ? [
711
+ n(
712
+ "span",
713
+ {
714
+ "aria-label": "required",
715
+ "data-required-indicator": !0
716
+ },
717
+ s(" *")
718
+ )
719
+ ] : []
720
+ )
721
+ ] : [],
722
+ // Select trigger
723
+ {
724
+ type: "element",
725
+ tag: "div",
726
+ props: {
727
+ id: g.id || e,
728
+ tabindex: D ? -1 : 0,
729
+ role: "combobox",
730
+ "aria-expanded": y(),
731
+ "aria-haspopup": "listbox",
732
+ "aria-invalid": !!F,
733
+ "aria-describedby": [
734
+ F ? `${e}-error` : null,
735
+ r ? `${e}-helper` : null
736
+ ].filter(Boolean).join(" ") || void 0,
737
+ onclick: j,
738
+ onkeydown: Y,
739
+ onfocus: Z,
740
+ onblur: ee,
741
+ "data-tachui-select-trigger": !0,
742
+ "data-focused": E(),
743
+ "data-disabled": D,
744
+ "data-error": !!F
745
+ },
746
+ children: [
747
+ // Display value
748
+ {
749
+ type: "element",
750
+ tag: "div",
751
+ props: {
752
+ "data-tachui-select-value": !0,
753
+ "data-placeholder": !i.value() || u && (!i.value() || i.value().length === 0)
754
+ },
755
+ children: [s(W())]
756
+ },
757
+ // Actions (clear, dropdown arrow)
758
+ {
759
+ type: "element",
760
+ tag: "div",
761
+ props: {
762
+ "data-tachui-select-actions": !0
763
+ },
764
+ children: [
765
+ // Clear button
766
+ ...m && i.value() && (!u || Array.isArray(i.value()) && i.value().length > 0) ? [
767
+ {
768
+ type: "element",
769
+ tag: "button",
770
+ props: {
771
+ type: "button",
772
+ onclick: (a) => {
773
+ a.stopPropagation(), G();
774
+ },
775
+ "aria-label": "Clear selection",
776
+ "data-tachui-select-clear": !0
777
+ },
778
+ children: [s("×")]
779
+ }
780
+ ] : [],
781
+ // Dropdown arrow
782
+ {
783
+ type: "element",
784
+ tag: "div",
785
+ props: {
786
+ "data-tachui-select-arrow": !0,
787
+ "data-open": y()
788
+ },
789
+ children: [s("▼")]
790
+ }
791
+ ]
792
+ }
793
+ ]
794
+ },
795
+ // Dropdown menu
796
+ ...y() ? [
797
+ {
798
+ type: "element",
799
+ tag: "div",
800
+ props: {
801
+ "data-tachui-select-dropdown": !0,
802
+ style: {
803
+ maxHeight: `${I}px`
804
+ }
805
+ },
806
+ children: [
807
+ // Search input
808
+ ...v ? [
809
+ {
810
+ type: "element",
811
+ tag: "div",
812
+ props: {
813
+ "data-tachui-select-search": !0
814
+ },
815
+ children: [
816
+ {
817
+ type: "element",
818
+ tag: "input",
819
+ props: {
820
+ type: "text",
821
+ placeholder: "Search...",
822
+ value: R(),
823
+ oninput: X,
824
+ "data-tachui-select-search-input": !0
825
+ }
826
+ }
827
+ ]
828
+ }
829
+ ] : [],
830
+ // Options list
831
+ {
832
+ type: "element",
833
+ tag: "div",
834
+ props: {
835
+ role: "listbox",
836
+ "aria-multiselectable": u,
837
+ "data-tachui-select-options": !0
838
+ },
839
+ children: K().length > 0 ? K().map((a, d) => ({
840
+ type: "element",
841
+ tag: "div",
842
+ props: {
843
+ role: "option",
844
+ "aria-selected": H(a),
845
+ "aria-disabled": a.disabled,
846
+ onclick: () => z(a),
847
+ "data-tachui-select-option": !0,
848
+ "data-selected": H(a),
849
+ "data-highlighted": O() === d,
850
+ "data-disabled": a.disabled,
851
+ "data-group": a.group
852
+ },
853
+ children: [
854
+ // Selection indicator for multiple
855
+ ...u ? [
856
+ {
857
+ type: "element",
858
+ tag: "div",
859
+ props: {
860
+ "data-tachui-select-checkbox": !0,
861
+ "data-checked": H(a)
862
+ },
863
+ children: [
864
+ s(
865
+ H(a) ? "✓" : ""
866
+ )
867
+ ]
868
+ }
869
+ ] : [],
870
+ // Option label
871
+ s(a.label)
872
+ ]
873
+ })) : [
874
+ {
875
+ type: "element",
876
+ tag: "div",
877
+ props: {
878
+ "data-tachui-select-no-options": !0
879
+ },
880
+ children: [
881
+ s(
882
+ J() ? V : q
883
+ )
884
+ ]
885
+ }
886
+ ]
887
+ }
888
+ ]
889
+ }
890
+ ] : [],
891
+ // Error message
892
+ ...F ? [
893
+ {
894
+ type: "element",
895
+ tag: "div",
896
+ props: {
897
+ id: `${e}-error`,
898
+ role: "alert",
899
+ "aria-live": "polite",
900
+ "data-tachui-error": !0
901
+ },
902
+ children: [s(F)]
903
+ }
904
+ ] : [],
905
+ // Helper text
906
+ ...r && !F ? [
907
+ {
908
+ type: "element",
909
+ tag: "div",
910
+ props: {
911
+ id: `${e}-helper`,
912
+ "data-tachui-helper": !0
913
+ },
914
+ children: [s(r)]
915
+ }
916
+ ] : []
917
+ ]
918
+ }),
919
+ props: p
920
+ };
921
+ return P.cleanup || (P.cleanup = []), P.cleanup.push(() => {
922
+ l && l.unregister(e);
923
+ }), te(P, {
924
+ onDOMReady: (a, d) => {
925
+ d && re(
926
+ P,
927
+ () => {
928
+ y() && (x(!1), $(!1), i.onBlur(), c && c(e, i.value()));
929
+ },
930
+ "[data-tachui-select-container]"
931
+ );
932
+ }
933
+ }), P;
934
+ }, se = (p) => U({ ...p, multiple: !0 }), ue = (p) => U({ ...p, searchable: !0 });
935
+ export {
936
+ Q as C,
937
+ se as M,
938
+ le as R,
939
+ de as S,
940
+ oe as a,
941
+ ce as b,
942
+ ue as c,
943
+ U as d
944
+ };
945
+ //# sourceMappingURL=Select-yZyKooXk.js.map