@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
@@ -15,6 +15,36 @@ export const css = `/**
15
15
  overflow: hidden;
16
16
  }
17
17
 
18
+ /* Native progress keeps the platform's accessible value/max contract. */
19
+ progress.progress {
20
+ appearance: none;
21
+ border: 0;
22
+ display: block;
23
+ }
24
+
25
+ progress.progress::-webkit-progress-bar {
26
+ background: var(--color-surface-container-highest);
27
+ border-radius: var(--radius-full);
28
+ }
29
+
30
+ progress.progress::-webkit-progress-value {
31
+ background: var(--color-primary);
32
+ border-radius: var(--radius-full);
33
+ transition: width 300ms ease-in-out;
34
+ }
35
+
36
+ progress.progress::-moz-progress-bar {
37
+ background: var(--color-primary);
38
+ border-radius: var(--radius-full);
39
+ transition: width 300ms ease-in-out;
40
+ }
41
+
42
+ progress.progress:indeterminate::-webkit-progress-value,
43
+ progress.progress:indeterminate::-moz-progress-bar {
44
+ width: 30%;
45
+ animation: progress-indeterminate 1.5s infinite ease-in-out;
46
+ }
47
+
18
48
  /* Progress Bar */
19
49
  .progress-bar {
20
50
  position: absolute;
@@ -67,6 +97,21 @@ export const css = `/**
67
97
  background-color: var(--color-base-content);
68
98
  }
69
99
 
100
+ progress.progress-primary::-webkit-progress-value,
101
+ progress.progress-primary::-moz-progress-bar { background: var(--color-primary); }
102
+ progress.progress-secondary::-webkit-progress-value,
103
+ progress.progress-secondary::-moz-progress-bar { background: var(--color-secondary); }
104
+ progress.progress-tertiary::-webkit-progress-value,
105
+ progress.progress-tertiary::-moz-progress-bar { background: var(--color-tertiary); }
106
+ progress.progress-info::-webkit-progress-value,
107
+ progress.progress-info::-moz-progress-bar { background: var(--color-info); }
108
+ progress.progress-success::-webkit-progress-value,
109
+ progress.progress-success::-moz-progress-bar { background: var(--color-success); }
110
+ progress.progress-warning::-webkit-progress-value,
111
+ progress.progress-warning::-moz-progress-bar { background: var(--color-warning); }
112
+ progress.progress-error::-webkit-progress-value,
113
+ progress.progress-error::-moz-progress-bar { background: var(--color-error); }
114
+
70
115
  /* Size Variants */
71
116
  .progress-xs {
72
117
  height: 0.25rem;
@@ -142,6 +187,25 @@ export const css = `/**
142
187
  }
143
188
  }
144
189
 
190
+ /* Buffer tracks belong to custom markup, not native <progress>. */
191
+ .progress-buffer {
192
+ position: relative;
193
+ }
194
+
195
+ .progress-buffer-bar {
196
+ position: absolute;
197
+ inset-block: 0;
198
+ inset-inline-start: 0;
199
+ width: 0;
200
+ background: color-mix(in oklch, var(--color-primary) 30%, transparent);
201
+ border-radius: var(--radius-full);
202
+ transition: width 300ms ease-in-out;
203
+ }
204
+
205
+ .progress-buffer .progress-bar {
206
+ z-index: 1;
207
+ }
208
+
145
209
  /* Circular Progress */
146
210
  .progress-circular {
147
211
  position: relative;
@@ -241,7 +305,17 @@ export const css = `/**
241
305
 
242
306
  /* Reduce Motion */
243
307
  @media (prefers-reduced-motion: reduce) {
308
+ .progress-bar,
309
+ progress.progress::-webkit-progress-value,
310
+ progress.progress::-moz-progress-bar,
311
+ .progress-circular-bar,
312
+ .progress-buffer-bar {
313
+ transition: none;
314
+ }
315
+
244
316
  .progress-indeterminate .progress-bar,
317
+ progress.progress:indeterminate::-webkit-progress-value,
318
+ progress.progress:indeterminate::-moz-progress-bar,
245
319
  .progress-striped.progress-animated .progress-bar,
246
320
  .progress-circular-indeterminate svg,
247
321
  .progress-circular-indeterminate .progress-circular-bar {
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for radial-progress
2
+ export declare const css: string;
3
+ export declare const styles: CSSStyleSheet | null;
4
+ declare const sheet: CSSStyleSheet | null;
5
+ export default sheet;
@@ -0,0 +1,56 @@
1
+ // Auto-generated from radial-progress.css
2
+ export const css = `/**
3
+ * Radial Progress Component Styles
4
+ * Determinate percentage progress without circumference arithmetic.
5
+ */
6
+
7
+ @layer components {
8
+ .radial-progress {
9
+ --radial-progress-value: 0;
10
+ --radial-progress-size: 3rem;
11
+ --radial-progress-thickness: 0.375rem;
12
+ --radial-progress-track: var(--color-surface-container-highest);
13
+ position: relative;
14
+ display: inline-grid;
15
+ width: var(--radial-progress-size);
16
+ height: var(--radial-progress-size);
17
+ place-items: center;
18
+ color: var(--color-primary);
19
+ border-radius: var(--radius-full);
20
+ background: conic-gradient(currentColor calc(clamp(0, var(--radial-progress-value), 100) * 1%), var(--radial-progress-track) 0);
21
+ isolation: isolate;
22
+ }
23
+
24
+ .radial-progress::before {
25
+ content: "";
26
+ position: absolute;
27
+ inset: var(--radial-progress-thickness);
28
+ z-index: 0;
29
+ border-radius: inherit;
30
+ background: var(--color-surface);
31
+ }
32
+
33
+ .radial-progress-primary { color: var(--color-primary); }
34
+ .radial-progress-secondary { color: var(--color-secondary); }
35
+ .radial-progress-tertiary { color: var(--color-tertiary); }
36
+ .radial-progress-info { color: var(--color-info); }
37
+ .radial-progress-success { color: var(--color-success); }
38
+ .radial-progress-warning { color: var(--color-warning); }
39
+ .radial-progress-error { color: var(--color-error); }
40
+
41
+ .radial-progress-sm { --radial-progress-size: 2rem; --radial-progress-thickness: 0.25rem; }
42
+ .radial-progress-lg { --radial-progress-size: 4rem; --radial-progress-thickness: 0.5rem; }
43
+ .radial-progress-xl { --radial-progress-size: 6rem; --radial-progress-thickness: 0.625rem; }
44
+
45
+ @media (prefers-reduced-motion: reduce) {
46
+ .radial-progress { transition: none; }
47
+ }
48
+ }
49
+ `;
50
+
51
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
52
+ if (sheet) {
53
+ sheet.replaceSync(css);
54
+ }
55
+ export const styles = sheet;
56
+ export default sheet;
@@ -1,5 +1,73 @@
1
1
  // Auto-generated from radio.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
  * Radio Component Styles
4
72
  * DuskMoonUI - Material Design 3 inspired radio button
5
73
  *
@@ -8,6 +76,8 @@ export const css = `/**
8
76
  */
9
77
 
10
78
  @layer components {
79
+ :where(.radio) { box-sizing: border-box; }
80
+
11
81
  /* Base Radio - applied directly to input[type="radio"] */
12
82
  .radio {
13
83
  --radio-size: 1.25rem;
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for range
2
+ export declare const css: string;
3
+ export declare const styles: CSSStyleSheet | null;
4
+ declare const sheet: CSSStyleSheet | null;
5
+ export default sheet;
@@ -0,0 +1,50 @@
1
+ // Auto-generated from range.css
2
+ export const css = `@layer components {
3
+ .range {
4
+ --range-thumb-size: 1.25rem;
5
+ appearance: none;
6
+ display: block;
7
+ box-sizing: border-box;
8
+ width: 100%;
9
+ min-width: 0;
10
+ height: var(--range-thumb-size);
11
+ margin: 0;
12
+ color: var(--color-on-surface);
13
+ accent-color: currentColor;
14
+ background: transparent;
15
+ cursor: pointer;
16
+ }
17
+ .range::-webkit-slider-runnable-track { height: 0.5rem; background: var(--color-surface-container-highest); border-radius: var(--radius-xs); }
18
+ .range::-moz-range-track { height: 0.5rem; background: var(--color-surface-container-highest); border-radius: var(--radius-xs); }
19
+ .range::-webkit-slider-thumb {
20
+ appearance: none;
21
+ width: var(--range-thumb-size);
22
+ height: var(--range-thumb-size);
23
+ margin-top: calc((0.5rem - var(--range-thumb-size)) / 2);
24
+ background: currentColor;
25
+ border: 1px solid currentColor;
26
+ border-radius: var(--radius-full);
27
+ }
28
+ .range::-moz-range-thumb { width: var(--range-thumb-size); height: var(--range-thumb-size); background: currentColor; border: 1px solid currentColor; border-radius: var(--radius-full); }
29
+ .range:focus-visible { outline: 2px solid currentColor; outline-offset: 3px; }
30
+ .range:disabled { opacity: 0.5; cursor: not-allowed; }
31
+ .range-xs { --range-thumb-size: 0.875rem; }
32
+ .range-sm { --range-thumb-size: 1rem; }
33
+ .range-lg { --range-thumb-size: 1.5rem; }
34
+ .range-primary { color: var(--color-primary); }
35
+ .range-secondary { color: var(--color-secondary); }
36
+ .range-tertiary { color: var(--color-tertiary); }
37
+ .range-info { color: var(--color-info); }
38
+ .range-success { color: var(--color-success); }
39
+ .range-warning { color: var(--color-warning); }
40
+ .range-error { color: var(--color-error); }
41
+ @media (forced-colors: active) { .range { appearance: auto; } .range:focus-visible { outline-color: Highlight; } }
42
+ }
43
+ `;
44
+
45
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
46
+ if (sheet) {
47
+ sheet.replaceSync(css);
48
+ }
49
+ export const styles = sheet;
50
+ export default sheet;
@@ -176,23 +176,23 @@ export const css = `/**
176
176
  }
177
177
 
178
178
  /* Hover Preview */
179
- .rating:not(.rating-readonly) .rating-item:hover ~ .rating-item {
179
+ .rating:not(.rating-readonly):not(.rating-native) .rating-item:hover ~ .rating-item {
180
180
  color: var(--color-outline);
181
181
  }
182
182
 
183
- .rating:not(.rating-readonly):hover .rating-item {
183
+ .rating:not(.rating-readonly):not(.rating-native):hover .rating-item {
184
184
  color: var(--color-warning);
185
185
  }
186
186
 
187
- .rating-primary:not(.rating-readonly):hover .rating-item { color: var(--color-primary); }
188
- .rating-secondary:not(.rating-readonly):hover .rating-item { color: var(--color-secondary); }
189
- .rating-tertiary:not(.rating-readonly):hover .rating-item { color: var(--color-tertiary); }
190
- .rating-info:not(.rating-readonly):hover .rating-item { color: var(--color-info); }
191
- .rating-success:not(.rating-readonly):hover .rating-item { color: var(--color-success); }
192
- .rating-error:not(.rating-readonly):hover .rating-item { color: var(--color-error); }
193
- .rating-accent:not(.rating-readonly):hover .rating-item { color: var(--color-accent); }
194
- .rating-neutral:not(.rating-readonly):hover .rating-item { color: var(--color-neutral); }
195
- .rating-base:not(.rating-readonly):hover .rating-item { color: var(--color-base-content); }
187
+ .rating-primary:not(.rating-readonly):not(.rating-native):hover .rating-item { color: var(--color-primary); }
188
+ .rating-secondary:not(.rating-readonly):not(.rating-native):hover .rating-item { color: var(--color-secondary); }
189
+ .rating-tertiary:not(.rating-readonly):not(.rating-native):hover .rating-item { color: var(--color-tertiary); }
190
+ .rating-info:not(.rating-readonly):not(.rating-native):hover .rating-item { color: var(--color-info); }
191
+ .rating-success:not(.rating-readonly):not(.rating-native):hover .rating-item { color: var(--color-success); }
192
+ .rating-error:not(.rating-readonly):not(.rating-native):hover .rating-item { color: var(--color-error); }
193
+ .rating-accent:not(.rating-readonly):not(.rating-native):hover .rating-item { color: var(--color-accent); }
194
+ .rating-neutral:not(.rating-readonly):not(.rating-native):hover .rating-item { color: var(--color-neutral); }
195
+ .rating-base:not(.rating-readonly):not(.rating-native):hover .rating-item { color: var(--color-base-content); }
196
196
 
197
197
  /* Focus Visible — use warning (the default fill color) for the base ring;
198
198
  per-variant overrides below match the active fill color for each variant. */
@@ -267,7 +267,34 @@ export const css = `/**
267
267
  }
268
268
  }
269
269
 
270
- /* Reduce Motion */
270
+ /* Native radio pattern: selection is authoritative, not .filled/.active. */
271
+ .rating-native { --rating-color: var(--color-warning); flex-wrap: wrap; max-inline-size: 100%; }
272
+ .rating-native.rating-primary { --rating-color: var(--color-primary); }
273
+ .rating-native.rating-secondary { --rating-color: var(--color-secondary); }
274
+ .rating-native.rating-tertiary { --rating-color: var(--color-tertiary); }
275
+ .rating-native.rating-info { --rating-color: var(--color-info); }
276
+ .rating-native.rating-success { --rating-color: var(--color-success); }
277
+ .rating-native.rating-warning { --rating-color: var(--color-warning); }
278
+ .rating-native.rating-error { --rating-color: var(--color-error); }
279
+ .rating-native .rating-item { position: relative; padding: 0.25rem; }
280
+ .rating-native .rating-input {
281
+ inset: 0;
282
+ width: 100%;
283
+ height: 100%;
284
+ margin: 0;
285
+ cursor: inherit;
286
+ }
287
+ .rating-native .rating-item:is(.filled, .active, :hover),
288
+ .rating-native .rating-item { color: var(--color-outline); transform: none; }
289
+ .rating-native .rating-item:has(.rating-input:checked),
290
+ .rating-native .rating-item:not(.rating-none):has(~ .rating-item .rating-input:checked) { color: var(--rating-color); }
291
+ .rating-native .rating-item:has(.rating-input:focus-visible) { outline: 2px solid currentColor; outline-offset: 2px; border-radius: var(--radius-xs); }
292
+ .rating-native .rating-item:has(.rating-input:disabled) { opacity: 0.38; cursor: not-allowed; }
293
+ .rating-native .rating-none { color: var(--color-on-surface); font-size: 0.875rem; }
294
+ @media (forced-colors: active) {
295
+ .rating-native .rating-item:has(.rating-input:checked) { outline: 2px solid Highlight; }
296
+ }
297
+
271
298
  @media (prefers-reduced-motion: reduce) {
272
299
  .rating-item,
273
300
  .rating-animated .rating-item {
@@ -1,10 +1,80 @@
1
1
  // Auto-generated from select.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
  * Select Component Styles
4
72
  * DuskMoonUI - Material Design 3 inspired select/dropdown system
5
73
  */
6
74
 
7
75
  @layer components {
76
+ :where(.select) { box-sizing: border-box; }
77
+
8
78
  /* Base Select */
9
79
  .select {
10
80
  display: block;
@@ -95,6 +165,10 @@ export const css = `/**
95
165
  .select-neutral { color: var(--color-neutral); }
96
166
  .select-base { color: var(--color-base-content); }
97
167
 
168
+ .select-bordered { border-color: var(--color-outline); }
169
+ .select-md { font-size: 1rem; }
170
+ .select:dir(rtl) { padding-inline: 1rem 2.5rem; background-position: left 0.75rem center; }
171
+
98
172
  /* Size Variants */
99
173
  .select-xs {
100
174
  padding: 0.375rem 2rem 0.375rem 0.625rem;
@@ -32,6 +32,10 @@ export const css = `/**
32
32
  border-radius: var(--radius-sm);
33
33
  }
34
34
 
35
+ .skeleton-static {
36
+ animation: none;
37
+ }
38
+
35
39
  /* Size Variants */
36
40
  .skeleton-xs {
37
41
  height: 0.5rem;
@@ -134,7 +138,7 @@ export const css = `/**
134
138
  background: linear-gradient(
135
139
  90deg,
136
140
  transparent,
137
- rgba(255, 255, 255, 0.3),
141
+ color-mix(in oklch, var(--color-surface-bright) 35%, transparent),
138
142
  transparent
139
143
  );
140
144
  animation: skeleton-wave 1.5s infinite;
@@ -212,6 +216,14 @@ export const css = `/**
212
216
 
213
217
  .skeleton-wave::after {
214
218
  animation: none;
219
+ transform: translateX(0);
220
+ opacity: 0.35;
221
+ }
222
+
223
+ .skeleton-static::after {
224
+ animation: none;
225
+ transform: translateX(0);
226
+ opacity: 0.35;
215
227
  }
216
228
  }
217
229
  }
@@ -211,49 +211,49 @@ export const css = `/**
211
211
 
212
212
  /* Color Variants */
213
213
  .snackbar-info {
214
- background-color: var(--color-info-container);
215
- color: var(--color-on-info-container);
214
+ background-color: var(--color-info);
215
+ color: var(--color-info-content);
216
216
  }
217
217
 
218
218
  .snackbar-success {
219
- background-color: var(--color-success-container);
220
- color: var(--color-on-success-container);
219
+ background-color: var(--color-success);
220
+ color: var(--color-success-content);
221
221
  }
222
222
 
223
223
  .snackbar-warning {
224
- background-color: var(--color-warning-container);
225
- color: var(--color-on-warning-container);
224
+ background-color: var(--color-warning);
225
+ color: var(--color-warning-content);
226
226
  }
227
227
 
228
228
  .snackbar-error {
229
- background-color: var(--color-error-container);
230
- color: var(--color-on-error-container);
229
+ background-color: var(--color-error);
230
+ color: var(--color-error-content);
231
231
  }
232
232
 
233
233
  /* Brand Color Variants */
234
234
  .snackbar-primary {
235
- background-color: var(--color-primary-container);
236
- color: var(--color-on-primary-container);
235
+ background-color: var(--color-primary);
236
+ color: var(--color-primary-content);
237
237
  }
238
238
 
239
239
  .snackbar-secondary {
240
- background-color: var(--color-secondary-container);
241
- color: var(--color-on-secondary-container);
240
+ background-color: var(--color-secondary);
241
+ color: var(--color-secondary-content);
242
242
  }
243
243
 
244
244
  .snackbar-tertiary {
245
- background-color: var(--color-tertiary-container);
246
- color: var(--color-on-tertiary-container);
245
+ background-color: var(--color-tertiary);
246
+ color: var(--color-tertiary-content);
247
247
  }
248
248
 
249
249
  .snackbar-accent {
250
- background-color: color-mix(in oklch, var(--color-accent) 15%, var(--color-surface));
251
- color: var(--color-on-surface);
250
+ background-color: var(--color-accent);
251
+ color: var(--color-accent-content);
252
252
  }
253
253
 
254
254
  .snackbar-neutral {
255
- background-color: color-mix(in oklch, var(--color-neutral) 15%, var(--color-surface));
256
- color: var(--color-on-surface);
255
+ background-color: var(--color-neutral);
256
+ color: var(--color-neutral-content);
257
257
  }
258
258
 
259
259
  .snackbar-base {
@@ -261,6 +261,36 @@ export const css = `/**
261
261
  color: var(--color-base-content);
262
262
  }
263
263
 
264
+ :is(
265
+ .snackbar-info,
266
+ .snackbar-success,
267
+ .snackbar-warning,
268
+ .snackbar-error,
269
+ .snackbar-primary,
270
+ .snackbar-secondary,
271
+ .snackbar-tertiary,
272
+ .snackbar-accent,
273
+ .snackbar-neutral,
274
+ .snackbar-base
275
+ ) :is(.snackbar-action, .snackbar-close) {
276
+ color: inherit;
277
+ }
278
+
279
+ :is(
280
+ .snackbar-info,
281
+ .snackbar-success,
282
+ .snackbar-warning,
283
+ .snackbar-error,
284
+ .snackbar-primary,
285
+ .snackbar-secondary,
286
+ .snackbar-tertiary,
287
+ .snackbar-accent,
288
+ .snackbar-neutral,
289
+ .snackbar-base
290
+ ) :is(.snackbar-action, .snackbar-close):hover {
291
+ background-color: color-mix(in oklch, currentColor 12%, transparent);
292
+ }
293
+
264
294
  /* Dark Snackbar (default MD3 style) */
265
295
  .snackbar-dark {
266
296
  background-color: var(--color-on-surface);
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for stat
2
+ export declare const css: string;
3
+ export declare const styles: CSSStyleSheet | null;
4
+ declare const sheet: CSSStyleSheet | null;
5
+ export default sheet;
@@ -0,0 +1,49 @@
1
+ // Auto-generated from stat.css
2
+ export const css = `@layer components {
3
+ .stats {
4
+ display: grid;
5
+ grid-auto-flow: column;
6
+ grid-auto-columns: minmax(0, 1fr);
7
+ max-inline-size: 100%;
8
+ color: var(--color-on-surface);
9
+ background: var(--color-surface-container-low);
10
+ border-radius: var(--radius-md);
11
+ }
12
+ .stat {
13
+ display: grid;
14
+ grid-template-columns: minmax(0, 1fr) auto;
15
+ gap: 0.25rem 1rem;
16
+ min-inline-size: 0;
17
+ padding: 1rem;
18
+ color: var(--color-on-surface);
19
+ overflow-wrap: anywhere;
20
+ }
21
+ .stats > .stat + .stat { border-inline-start: 1px solid var(--color-outline-variant); }
22
+ .stat-title, .stat-desc { grid-column: 1; color: var(--color-on-surface-variant); font-size: 0.875rem; }
23
+ .stat-value { grid-column: 1; font-size: 2rem; font-weight: 700; line-height: 1.2; font-variant-numeric: tabular-nums; }
24
+ .stat-figure { grid-column: 2; grid-row: 1 / 4; align-self: center; }
25
+ .stat-actions { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 0.5rem; margin-block-start: 0.5rem; }
26
+ .stats-vertical { grid-auto-flow: row; }
27
+ .stats-horizontal { grid-auto-flow: column; }
28
+ .stats-vertical > .stat + .stat { border-inline-start: 0; border-block-start: 1px solid var(--color-outline-variant); }
29
+ .stats-responsive { container-type: inline-size; container-name: stats; }
30
+ @container stats (max-width: 32rem) {
31
+ .stats-responsive > .stat { grid-column: 1; }
32
+ .stats-responsive > .stat + .stat { border-inline-start: 0; border-block-start: 1px solid var(--color-outline-variant); }
33
+ }
34
+ .stat-primary .stat-value { color: var(--color-primary); }
35
+ .stat-secondary .stat-value { color: var(--color-secondary); }
36
+ .stat-tertiary .stat-value { color: var(--color-tertiary); }
37
+ .stat-info .stat-value { color: var(--color-info); }
38
+ .stat-success .stat-value { color: var(--color-success); }
39
+ .stat-warning .stat-value { color: var(--color-warning); }
40
+ .stat-error .stat-value { color: var(--color-error); }
41
+ }
42
+ `;
43
+
44
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
45
+ if (sheet) {
46
+ sheet.replaceSync(css);
47
+ }
48
+ export const styles = sheet;
49
+ export default sheet;