@duskmoon-dev/core 1.19.3 → 1.19.4

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 (101) hide show
  1. package/README.md +1 -1
  2. package/dist/base.css +484 -0
  3. package/dist/components/accordion.css +33 -9
  4. package/dist/components/autocomplete.css +67 -13
  5. package/dist/components/avatar.css +39 -15
  6. package/dist/components/badge.css +15 -3
  7. package/dist/components/card.css +12 -0
  8. package/dist/components/carousel.css +28 -0
  9. package/dist/components/chat.css +15 -11
  10. package/dist/components/checkbox.css +83 -13
  11. package/dist/components/collapse.css +67 -16
  12. package/dist/components/countdown.css +22 -0
  13. package/dist/components/datepicker.css +76 -0
  14. package/dist/components/diff.css +33 -0
  15. package/dist/components/file-input.css +107 -0
  16. package/dist/components/filter-group.css +452 -0
  17. package/dist/components/form-group.css +95 -204
  18. package/dist/components/form.css +1551 -421
  19. package/dist/components/index.css +5991 -6060
  20. package/dist/components/input.css +114 -31
  21. package/dist/components/kbd.css +28 -0
  22. package/dist/components/list.css +22 -3
  23. package/dist/components/otp-input.css +124 -6
  24. package/dist/components/radio.css +70 -0
  25. package/dist/components/range.css +41 -0
  26. package/dist/components/rating.css +39 -12
  27. package/dist/components/select.css +74 -0
  28. package/dist/components/stat.css +40 -0
  29. package/dist/components/switch.css +70 -0
  30. package/dist/components/table.css +8 -0
  31. package/dist/components/textarea.css +74 -0
  32. package/dist/components/timeline.css +40 -25
  33. package/dist/components/toggle-switch.css +165 -0
  34. package/dist/components/toggle.css +198 -32
  35. package/dist/components/validator.css +66 -0
  36. package/dist/effects/aura.css +22 -0
  37. package/dist/effects/hover-3d.css +8 -0
  38. package/dist/effects/hover-gallery.css +14 -0
  39. package/dist/effects/index.css +65 -0
  40. package/dist/effects/text-rotate.css +16 -0
  41. package/dist/esm/components/accordion.js +33 -9
  42. package/dist/esm/components/autocomplete.js +67 -13
  43. package/dist/esm/components/avatar.js +39 -15
  44. package/dist/esm/components/badge.js +15 -3
  45. package/dist/esm/components/card.js +12 -0
  46. package/dist/esm/components/carousel.d.ts +5 -0
  47. package/dist/esm/components/carousel.js +37 -0
  48. package/dist/esm/components/chat.js +15 -11
  49. package/dist/esm/components/checkbox.js +84 -14
  50. package/dist/esm/components/collapse.js +67 -16
  51. package/dist/esm/components/countdown.d.ts +5 -0
  52. package/dist/esm/components/countdown.js +31 -0
  53. package/dist/esm/components/datepicker.js +77 -1
  54. package/dist/esm/components/diff.d.ts +5 -0
  55. package/dist/esm/components/diff.js +42 -0
  56. package/dist/esm/components/file-input.d.ts +5 -0
  57. package/dist/esm/components/file-input.js +116 -0
  58. package/dist/esm/components/filter-group.d.ts +5 -0
  59. package/dist/esm/components/filter-group.js +461 -0
  60. package/dist/esm/components/form-group.js +96 -205
  61. package/dist/esm/components/form.js +1539 -409
  62. package/dist/esm/components/input.js +115 -32
  63. package/dist/esm/components/kbd.d.ts +5 -0
  64. package/dist/esm/components/kbd.js +37 -0
  65. package/dist/esm/components/list.js +22 -3
  66. package/dist/esm/components/otp-input.js +125 -7
  67. package/dist/esm/components/radio.js +71 -1
  68. package/dist/esm/components/range.d.ts +5 -0
  69. package/dist/esm/components/range.js +50 -0
  70. package/dist/esm/components/rating.js +39 -12
  71. package/dist/esm/components/select.js +75 -1
  72. package/dist/esm/components/stat.d.ts +5 -0
  73. package/dist/esm/components/stat.js +49 -0
  74. package/dist/esm/components/switch.js +71 -1
  75. package/dist/esm/components/table.js +8 -0
  76. package/dist/esm/components/textarea.js +75 -1
  77. package/dist/esm/components/timeline.js +40 -25
  78. package/dist/esm/components/toggle-switch.d.ts +5 -0
  79. package/dist/esm/components/toggle-switch.js +174 -0
  80. package/dist/esm/components/toggle.js +198 -32
  81. package/dist/esm/components/validator.d.ts +5 -0
  82. package/dist/esm/components/validator.js +75 -0
  83. package/dist/esm/effects/aura.d.ts +5 -0
  84. package/dist/esm/effects/aura.js +31 -0
  85. package/dist/esm/effects/hover-3d.d.ts +5 -0
  86. package/dist/esm/effects/hover-3d.js +17 -0
  87. package/dist/esm/effects/hover-gallery.d.ts +5 -0
  88. package/dist/esm/effects/hover-gallery.js +23 -0
  89. package/dist/esm/effects/index.d.ts +5 -0
  90. package/dist/esm/effects/index.js +74 -0
  91. package/dist/esm/effects/text-rotate.d.ts +5 -0
  92. package/dist/esm/effects/text-rotate.js +25 -0
  93. package/dist/index.css +5977 -6047
  94. package/dist/index.min.css +1 -1
  95. package/dist/standalone/duskmoonui-themes.css +1 -1
  96. package/dist/standalone/duskmoonui.css +6967 -7028
  97. package/dist/standalone/duskmoonui.js +11 -12
  98. package/dist/standalone/duskmoonui.mjs +11 -12
  99. package/dist/types/types/plugin.d.ts +1 -1
  100. package/dist/types/types/plugin.d.ts.map +1 -1
  101. package/package.json +98 -1
@@ -1,5 +1,73 @@
1
1
  // Auto-generated from form-group.css
2
- export const css = `/**
2
+ export const css = `/** Opt-in native presentation. Applications own errors, messages and announcements. */
3
+ @layer components {
4
+ /* Compatibility wrapper states are intentionally immediate. */
5
+ :is(.form-group-info, .form-control.info) { --dm-validation-color: var(--color-info); }
6
+ :is(.form-group-warning, .form-control.warning) { --dm-validation-color: var(--color-warning); }
7
+ :is(.form-group-success, .form-control.success) { --dm-validation-color: var(--color-success); }
8
+
9
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :valid, .validate:valid, .validator.validator-success:user-valid):not([aria-invalid="true"]):not(:where(.form-group-error *, .form-control.error *)):not(:disabled) {
10
+ --dm-validation-color: var(--color-success);
11
+ --dm-validation-content: var(--color-success-content);
12
+ }
13
+
14
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :invalid, .validate:invalid, .validator:user-invalid):not(:disabled) {
15
+ --dm-validation-color: var(--color-error);
16
+ --dm-validation-content: var(--color-error-content);
17
+ }
18
+
19
+ :is(.form-group-error, .form-control.error) {
20
+ --dm-validation-color: var(--color-error);
21
+ --dm-validation-content: var(--color-error-content);
22
+ }
23
+
24
+ /* Higher specificity than native states, including server-invalid + user-valid. */
25
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .form-group-error *, .form-control.error *):not(:disabled):is(:focus, :not(:focus)) {
26
+ --dm-validation-color: var(--color-error);
27
+ --dm-validation-content: var(--color-error-content);
28
+ }
29
+
30
+ /* This shared selector wins over filled/ghost focus and semantic modifiers. */
31
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled) {
32
+ color: var(--dm-validation-color);
33
+ border-color: var(--dm-validation-color);
34
+ --checkbox-color: var(--dm-validation-color);
35
+ --radio-color: var(--dm-validation-color);
36
+ --switch-color: var(--dm-validation-color);
37
+ --switch-content-color: var(--dm-validation-content, var(--color-primary-content));
38
+ --toggle-color: var(--dm-validation-color);
39
+ }
40
+
41
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled):focus {
42
+ border-color: var(--dm-validation-color);
43
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--dm-validation-color) 20%, transparent);
44
+ }
45
+
46
+ :is(.form-group-error, .form-control.error) :is(.form-label, .label-text) { color: var(--color-error); }
47
+ :is(.form-group-success, .form-control.success) :is(.form-label, .label-text) { color: var(--color-success); }
48
+ :is(.form-group-warning, .form-control.warning) :is(.form-label, .label-text) { color: var(--color-warning); }
49
+ :is(.form-group-info, .form-control.info) :is(.form-label, .label-text) { color: var(--color-info); }
50
+
51
+ .validator-hint { font-size: 0.75rem; color: var(--color-on-surface-variant); }
52
+ .validator-error { display: none; font-size: 0.75rem; color: var(--color-error); }
53
+ /* Keep OTP actions stationary when blur reveals an error during a click. */
54
+ .otp-code ~ .validator-error { display: block; visibility: hidden; }
55
+ :is(.form-group, .form-control):has(:is([aria-invalid="true"], .validator:user-invalid, .validate :invalid, .validate:invalid):not(:disabled)) > .validator-error,
56
+ :is(.form-group-error, .form-control.error) > .validator-error { display: block; visibility: visible; }
57
+
58
+ @media (forced-colors: active) {
59
+ :is(input, select, textarea):is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):focus-visible {
60
+ outline: 2px solid Highlight;
61
+ outline-offset: 2px;
62
+ }
63
+ input:is(.checkbox, .radio, .switch, .toggle) { appearance: auto; }
64
+ input:is(.checkbox, .radio, .switch, .toggle)::before,
65
+ input:is(.checkbox, .radio, .switch, .toggle)::after { content: none; }
66
+ }
67
+ }
68
+
69
+
70
+ /**
3
71
  * Form Group Component Styles
4
72
  * DuskMoonUI - Form layout utilities including label, helper text, fieldset
5
73
  */
@@ -279,225 +347,48 @@ export const css = `/**
279
347
  color: var(--color-error);
280
348
  }
281
349
 
282
- /* Error State on Form Group */
283
- .form-group-error .form-label {
284
- color: var(--color-error);
285
- }
286
-
287
- .form-group-error .input,
288
- .form-group-error .select,
289
- .form-group-error .textarea {
290
- border-color: var(--color-error);
291
- }
292
-
293
- .form-group-error .input:focus-visible,
294
- .form-group-error .select:focus-visible,
295
- .form-group-error .textarea:focus-visible {
296
- border-color: var(--color-error);
297
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
298
- }
299
-
300
- /* Success State on Form Group */
301
- .form-group-success .form-label {
302
- color: var(--color-success);
303
- }
304
-
305
- .form-group-success .input,
306
- .form-group-success .select,
307
- .form-group-success .textarea {
308
- border-color: var(--color-success);
309
- }
310
-
311
- .form-group-success .input:focus-visible,
312
- .form-group-success .select:focus-visible,
313
- .form-group-success .textarea:focus-visible {
314
- border-color: var(--color-success);
315
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
316
- }
317
-
318
- /* Warning State on Form Group */
319
- .form-group-warning .form-label {
320
- color: var(--color-warning);
321
- }
322
-
323
- .form-group-warning .input,
324
- .form-group-warning .select,
325
- .form-group-warning .textarea {
326
- border-color: var(--color-warning);
327
- }
328
-
329
- .form-group-warning .input:focus-visible,
330
- .form-group-warning .select:focus-visible,
331
- .form-group-warning .textarea:focus-visible {
332
- border-color: var(--color-warning);
333
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 10%, transparent);
334
- }
335
-
336
- /* Info State on Form Group */
337
- .form-group-info .form-label {
338
- color: var(--color-info);
339
- }
340
-
341
- .form-group-info .input,
342
- .form-group-info .select,
343
- .form-group-info .textarea {
344
- border-color: var(--color-info);
345
- }
346
-
347
- .form-group-info .input:focus-visible,
348
- .form-group-info .select:focus-visible,
349
- .form-group-info .textarea:focus-visible {
350
- border-color: var(--color-info);
351
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-info) 10%, transparent);
352
- }
353
-
354
- /* Disabled Form Group */
355
- .form-group-disabled {
356
- opacity: 0.5;
357
- pointer-events: none;
358
- }
359
-
360
- /* ARIA-based validation states — mirrors class-based states for native form validation */
361
- .input[aria-invalid="true"],
362
- .select[aria-invalid="true"],
363
- .textarea[aria-invalid="true"] {
364
- border-color: var(--color-error);
365
- color: var(--color-error);
366
- }
367
-
368
- .input[aria-invalid="true"]:focus-visible,
369
- .select[aria-invalid="true"]:focus-visible,
370
- .textarea[aria-invalid="true"]:focus-visible {
371
- border-color: var(--color-error);
372
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
373
- }
374
-
375
- /* ARIA-based validation for checkbox, radio, switch, file-input
376
- (frameworks like React Hook Form / Angular set aria-invalid programmatically) */
377
- .checkbox[aria-invalid="true"],
378
- .radio[aria-invalid="true"],
379
- .file-input[aria-invalid="true"] {
380
- border-color: var(--color-error);
350
+ /* Legacy label and helper APIs share the composition implementation. */
351
+ /* Label */
352
+ .label {
353
+ display: flex;
354
+ justify-content: space-between;
355
+ align-items: center;
356
+ padding: 0.25rem 0;
381
357
  }
382
358
 
383
- .checkbox[aria-invalid="true"]:focus-visible,
384
- .radio[aria-invalid="true"]:focus-visible,
385
- .file-input[aria-invalid="true"]:focus-visible {
386
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
359
+ .label-text {
360
+ font-size: 0.875rem;
361
+ font-weight: 500;
362
+ color: var(--color-on-surface);
363
+ padding-bottom: 0.25rem;
387
364
  }
388
365
 
389
- .switch[aria-invalid="true"] {
390
- border-color: var(--color-error);
366
+ .label-text-alt {
367
+ font-size: 0.75rem;
368
+ color: var(--color-on-surface-variant);
391
369
  }
392
370
 
393
- .switch[aria-invalid="true"]:focus-visible {
394
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
395
- }
396
371
 
397
- /* ARIA required indicator for labels */
372
+ .label-text.required::after,
398
373
  .form-label[aria-required="true"]::after,
399
374
  label[aria-required="true"]::after {
400
375
  content: ' *';
401
376
  color: var(--color-error);
402
377
  }
403
378
 
404
- /* Native :invalid pseudo-class (opt-in with .validate class to avoid red on page load) */
405
- .validate .input:invalid,
406
- .validate .select:invalid,
407
- .validate .textarea:invalid {
408
- border-color: var(--color-error);
409
- }
410
-
411
- .validate .input:valid,
412
- .validate .select:valid,
413
- .validate .textarea:valid {
414
- border-color: var(--color-success);
415
- }
416
-
417
- /* :user-invalid — fires only after user interaction (no .validate wrapper needed) */
418
- .input:user-invalid,
419
- .select:user-invalid,
420
- .textarea:user-invalid {
421
- border-color: var(--color-error);
422
- }
423
-
424
- .input:user-invalid:focus-visible,
425
- .select:user-invalid:focus-visible,
426
- .textarea:user-invalid:focus-visible {
427
- border-color: var(--color-error);
428
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
429
- }
379
+ .helper-text.error { color: var(--color-error); }
380
+ .helper-text.success { color: var(--color-success); }
381
+ .helper-text.warning { color: var(--color-warning); }
382
+ .helper-text.info { color: var(--color-info); }
430
383
 
431
- .input:user-valid,
432
- .select:user-valid,
433
- .textarea:user-valid {
434
- border-color: var(--color-success);
435
- }
384
+ .form-group-disabled { opacity: 0.5; pointer-events: none; }
385
+ .fieldset { min-inline-size: 0; }
386
+ .form-group, .form-control { min-inline-size: 0; }
387
+ .form-control { width: 100%; margin-bottom: 1rem; color: var(--color-on-surface); }
436
388
 
437
- .input:user-valid:focus-visible,
438
- .select:user-valid:focus-visible,
439
- .textarea:user-valid:focus-visible {
440
- border-color: var(--color-success);
441
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
442
- }
443
-
444
- /* Checkbox & Radio — validation pseudo-classes */
445
- .checkbox:user-invalid,
446
- .radio:user-invalid {
447
- border-color: var(--color-error);
448
- }
449
-
450
- .checkbox:user-invalid:focus-visible,
451
- .radio:user-invalid:focus-visible {
452
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
453
- }
454
-
455
- .checkbox:user-valid:checked,
456
- .radio:user-valid:checked {
457
- border-color: var(--color-success);
458
- background-color: var(--color-success);
459
- }
460
-
461
- /* Switch — validation pseudo-classes (required but unchecked) */
462
- .switch:user-invalid {
463
- border-color: var(--color-error);
464
- }
465
-
466
- .switch:user-invalid:focus-visible {
467
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
468
- }
469
-
470
- .switch:user-valid:checked {
471
- background-color: var(--color-success);
472
- border-color: var(--color-success);
473
- }
474
-
475
- /* File Input — validation pseudo-classes */
476
- .file-input:user-invalid {
477
- border-color: var(--color-error);
478
- }
479
-
480
- .file-input:user-invalid:focus-visible {
481
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
482
- }
483
-
484
- /* Filled Input — validation with bottom border */
485
- .input-filled:user-invalid {
486
- border-bottom-color: var(--color-error);
487
- }
488
-
489
- .input-filled:user-invalid:focus-visible {
490
- border-bottom-color: var(--color-error);
491
- box-shadow: none;
492
- }
493
-
494
- .input-filled:user-valid {
495
- border-bottom-color: var(--color-success);
496
- }
497
-
498
- .input-filled:user-valid:focus-visible {
499
- border-bottom-color: var(--color-success);
500
- box-shadow: none;
389
+ @media (max-width: 640px) {
390
+ .form-group-horizontal { flex-direction: column; }
391
+ .form-row > .form-group { min-width: 0; flex-basis: 100%; }
501
392
  }
502
393
  }
503
394
  `;