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