@duskmoon-dev/core 1.19.3 → 1.19.5

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 (121) 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/alert.css +81 -3
  5. package/dist/components/autocomplete.css +67 -13
  6. package/dist/components/avatar.css +39 -15
  7. package/dist/components/badge.css +15 -3
  8. package/dist/components/card.css +12 -0
  9. package/dist/components/carousel.css +28 -0
  10. package/dist/components/chat.css +15 -11
  11. package/dist/components/checkbox.css +83 -13
  12. package/dist/components/collapse.css +67 -16
  13. package/dist/components/countdown.css +22 -0
  14. package/dist/components/datepicker.css +76 -0
  15. package/dist/components/diff.css +33 -0
  16. package/dist/components/file-input.css +107 -0
  17. package/dist/components/filter-group.css +452 -0
  18. package/dist/components/form-group.css +95 -204
  19. package/dist/components/form.css +1551 -421
  20. package/dist/components/index.css +6248 -5799
  21. package/dist/components/input.css +114 -31
  22. package/dist/components/kbd.css +28 -0
  23. package/dist/components/list.css +22 -3
  24. package/dist/components/loading.css +105 -0
  25. package/dist/components/modal.css +62 -1
  26. package/dist/components/otp-input.css +124 -6
  27. package/dist/components/progress.css +74 -0
  28. package/dist/components/radial-progress.css +47 -0
  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/skeleton.css +13 -1
  34. package/dist/components/snackbar.css +48 -18
  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/toast.css +188 -34
  41. package/dist/components/toggle-switch.css +165 -0
  42. package/dist/components/toggle.css +198 -32
  43. package/dist/components/tooltip.css +2 -47
  44. package/dist/components/validator.css +66 -0
  45. package/dist/effects/aura.css +22 -0
  46. package/dist/effects/hover-3d.css +8 -0
  47. package/dist/effects/hover-gallery.css +14 -0
  48. package/dist/effects/index.css +65 -0
  49. package/dist/effects/text-rotate.css +16 -0
  50. package/dist/esm/components/accordion.js +33 -9
  51. package/dist/esm/components/alert.js +81 -3
  52. package/dist/esm/components/autocomplete.js +67 -13
  53. package/dist/esm/components/avatar.js +39 -15
  54. package/dist/esm/components/badge.js +15 -3
  55. package/dist/esm/components/card.js +12 -0
  56. package/dist/esm/components/carousel.d.ts +5 -0
  57. package/dist/esm/components/carousel.js +37 -0
  58. package/dist/esm/components/chat.js +15 -11
  59. package/dist/esm/components/checkbox.js +84 -14
  60. package/dist/esm/components/collapse.js +67 -16
  61. package/dist/esm/components/countdown.d.ts +5 -0
  62. package/dist/esm/components/countdown.js +31 -0
  63. package/dist/esm/components/datepicker.js +77 -1
  64. package/dist/esm/components/diff.d.ts +5 -0
  65. package/dist/esm/components/diff.js +42 -0
  66. package/dist/esm/components/file-input.d.ts +5 -0
  67. package/dist/esm/components/file-input.js +116 -0
  68. package/dist/esm/components/filter-group.d.ts +5 -0
  69. package/dist/esm/components/filter-group.js +461 -0
  70. package/dist/esm/components/form-group.js +96 -205
  71. package/dist/esm/components/form.js +1539 -409
  72. package/dist/esm/components/input.js +115 -32
  73. package/dist/esm/components/kbd.d.ts +5 -0
  74. package/dist/esm/components/kbd.js +37 -0
  75. package/dist/esm/components/list.js +22 -3
  76. package/dist/esm/components/loading.d.ts +5 -0
  77. package/dist/esm/components/loading.js +114 -0
  78. package/dist/esm/components/modal.js +62 -1
  79. package/dist/esm/components/otp-input.js +125 -7
  80. package/dist/esm/components/progress.js +74 -0
  81. package/dist/esm/components/radial-progress.d.ts +5 -0
  82. package/dist/esm/components/radial-progress.js +56 -0
  83. package/dist/esm/components/radio.js +71 -1
  84. package/dist/esm/components/range.d.ts +5 -0
  85. package/dist/esm/components/range.js +50 -0
  86. package/dist/esm/components/rating.js +39 -12
  87. package/dist/esm/components/select.js +75 -1
  88. package/dist/esm/components/skeleton.js +13 -1
  89. package/dist/esm/components/snackbar.js +48 -18
  90. package/dist/esm/components/stat.d.ts +5 -0
  91. package/dist/esm/components/stat.js +49 -0
  92. package/dist/esm/components/switch.js +71 -1
  93. package/dist/esm/components/table.js +8 -0
  94. package/dist/esm/components/textarea.js +75 -1
  95. package/dist/esm/components/timeline.js +40 -25
  96. package/dist/esm/components/toast.js +188 -34
  97. package/dist/esm/components/toggle-switch.d.ts +5 -0
  98. package/dist/esm/components/toggle-switch.js +174 -0
  99. package/dist/esm/components/toggle.js +198 -32
  100. package/dist/esm/components/tooltip.js +2 -47
  101. package/dist/esm/components/validator.d.ts +5 -0
  102. package/dist/esm/components/validator.js +75 -0
  103. package/dist/esm/effects/aura.d.ts +5 -0
  104. package/dist/esm/effects/aura.js +31 -0
  105. package/dist/esm/effects/hover-3d.d.ts +5 -0
  106. package/dist/esm/effects/hover-3d.js +17 -0
  107. package/dist/esm/effects/hover-gallery.d.ts +5 -0
  108. package/dist/esm/effects/hover-gallery.js +23 -0
  109. package/dist/esm/effects/index.d.ts +5 -0
  110. package/dist/esm/effects/index.js +74 -0
  111. package/dist/esm/effects/text-rotate.d.ts +5 -0
  112. package/dist/esm/effects/text-rotate.js +25 -0
  113. package/dist/index.css +7652 -7204
  114. package/dist/index.min.css +1 -1
  115. package/dist/standalone/duskmoonui-themes.css +1 -1
  116. package/dist/standalone/duskmoonui.css +7598 -7141
  117. package/dist/standalone/duskmoonui.js +18 -16
  118. package/dist/standalone/duskmoonui.mjs +18 -16
  119. package/dist/types/types/plugin.d.ts +1 -1
  120. package/dist/types/types/plugin.d.ts.map +1 -1
  121. package/package.json +110 -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
  `;