@duskmoon-dev/core 1.19.4 → 1.19.6

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 (42) hide show
  1. package/README.md +1 -1
  2. package/dist/components/alert.css +81 -3
  3. package/dist/components/dialog.css +29 -3
  4. package/dist/components/dropdown.css +91 -0
  5. package/dist/components/fab.css +182 -0
  6. package/dist/components/index.css +1119 -232
  7. package/dist/components/loading.css +105 -0
  8. package/dist/components/modal.css +66 -4
  9. package/dist/components/navigation.css +94 -54
  10. package/dist/components/progress.css +74 -0
  11. package/dist/components/radial-progress.css +47 -0
  12. package/dist/components/skeleton.css +13 -1
  13. package/dist/components/snackbar.css +48 -18
  14. package/dist/components/swap.css +116 -0
  15. package/dist/components/toast.css +188 -34
  16. package/dist/components/tooltip.css +2 -47
  17. package/dist/esm/components/alert.js +81 -3
  18. package/dist/esm/components/dialog.js +29 -3
  19. package/dist/esm/components/dropdown.d.ts +5 -0
  20. package/dist/esm/components/dropdown.js +100 -0
  21. package/dist/esm/components/fab.d.ts +5 -0
  22. package/dist/esm/components/fab.js +191 -0
  23. package/dist/esm/components/loading.d.ts +5 -0
  24. package/dist/esm/components/loading.js +114 -0
  25. package/dist/esm/components/modal.js +66 -4
  26. package/dist/esm/components/navigation.js +94 -54
  27. package/dist/esm/components/progress.js +74 -0
  28. package/dist/esm/components/radial-progress.d.ts +5 -0
  29. package/dist/esm/components/radial-progress.js +56 -0
  30. package/dist/esm/components/skeleton.js +13 -1
  31. package/dist/esm/components/snackbar.js +48 -18
  32. package/dist/esm/components/swap.d.ts +5 -0
  33. package/dist/esm/components/swap.js +125 -0
  34. package/dist/esm/components/toast.js +188 -34
  35. package/dist/esm/components/tooltip.js +2 -47
  36. package/dist/index.css +1119 -232
  37. package/dist/index.min.css +1 -1
  38. package/dist/standalone/duskmoonui-themes.css +1 -1
  39. package/dist/standalone/duskmoonui.css +1120 -233
  40. package/dist/standalone/duskmoonui.js +25 -9
  41. package/dist/standalone/duskmoonui.mjs +25 -9
  42. package/package.json +31 -1
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Loading Component Styles
3
+ * CSS-only activity indicators. State, aria-busy, and disabling remain consumer-owned.
4
+ */
5
+
6
+ @layer components {
7
+ .loading {
8
+ --loading-size: 1.25rem;
9
+ display: inline-flex;
10
+ width: var(--loading-size);
11
+ height: var(--loading-size);
12
+ flex: 0 0 var(--loading-size);
13
+ color: currentColor;
14
+ vertical-align: middle;
15
+ }
16
+
17
+ .loading-spinner {
18
+ border: max(2px, calc(var(--loading-size) / 8)) solid color-mix(in oklch, currentColor 25%, transparent);
19
+ border-top-color: currentColor;
20
+ border-radius: var(--radius-full);
21
+ animation: loading-spin 800ms linear infinite;
22
+ }
23
+
24
+ .loading-dots,
25
+ .loading-bars {
26
+ align-items: center;
27
+ justify-content: center;
28
+ gap: max(2px, calc(var(--loading-size) / 8));
29
+ }
30
+
31
+ .loading-dots::before,
32
+ .loading-dots::after,
33
+ .loading-bars::before,
34
+ .loading-bars::after {
35
+ content: "";
36
+ display: block;
37
+ background: currentColor;
38
+ }
39
+
40
+ .loading-dots::before,
41
+ .loading-dots::after {
42
+ width: 25%;
43
+ height: 25%;
44
+ border-radius: var(--radius-full);
45
+ box-shadow: calc(var(--loading-size) / 3) 0 currentColor;
46
+ animation: loading-dots 900ms ease-in-out infinite;
47
+ }
48
+
49
+ .loading-dots::after {
50
+ display: none;
51
+ }
52
+
53
+ .loading-bars {
54
+ padding-inline: 10%;
55
+ }
56
+
57
+ .loading-bars::before,
58
+ .loading-bars::after {
59
+ width: 18%;
60
+ height: 65%;
61
+ border-radius: var(--radius-xs);
62
+ box-shadow: calc(var(--loading-size) / 3) 0 currentColor, calc(var(--loading-size) * 2 / 3) 0 currentColor;
63
+ animation: loading-bars 900ms ease-in-out infinite;
64
+ }
65
+
66
+ .loading-bars::after {
67
+ display: none;
68
+ }
69
+
70
+ .loading-xs { --loading-size: 0.75rem; }
71
+ .loading-sm { --loading-size: 1rem; }
72
+ .loading-md { --loading-size: 1.25rem; }
73
+ .loading-lg { --loading-size: 1.75rem; }
74
+ .loading-xl { --loading-size: 2.5rem; }
75
+
76
+ .loading-primary { color: var(--color-primary); }
77
+ .loading-secondary { color: var(--color-secondary); }
78
+ .loading-tertiary { color: var(--color-tertiary); }
79
+ .loading-info { color: var(--color-info); }
80
+ .loading-success { color: var(--color-success); }
81
+ .loading-warning { color: var(--color-warning); }
82
+ .loading-error { color: var(--color-error); }
83
+
84
+ @keyframes loading-spin {
85
+ to { transform: rotate(360deg); }
86
+ }
87
+
88
+ @keyframes loading-dots {
89
+ 0%, 100% { opacity: 0.35; transform: scale(0.75); }
90
+ 50% { opacity: 1; transform: scale(1); }
91
+ }
92
+
93
+ @keyframes loading-bars {
94
+ 0%, 100% { opacity: 0.35; transform: scaleY(0.65); }
95
+ 50% { opacity: 1; transform: scaleY(1); }
96
+ }
97
+
98
+ @media (prefers-reduced-motion: reduce) {
99
+ .loading-spinner,
100
+ .loading-dots::before,
101
+ .loading-bars::before {
102
+ animation: none;
103
+ }
104
+ }
105
+ }
@@ -30,7 +30,7 @@
30
30
  position: relative;
31
31
  z-index: 1;
32
32
  max-width: 32rem;
33
- max-height: calc(100vh - 5rem);
33
+ max-height: calc(100dvh - 5rem);
34
34
  padding: 1.5rem;
35
35
  background-color: var(--color-surface);
36
36
  color: var(--color-on-surface);
@@ -62,8 +62,10 @@
62
62
  }
63
63
 
64
64
  /* Modal Action */
65
- .modal-action {
65
+ .modal-action,
66
+ .modal-footer {
66
67
  display: flex;
68
+ flex-wrap: wrap;
67
69
  justify-content: flex-end;
68
70
  gap: 0.5rem;
69
71
  margin-top: 1.5rem;
@@ -93,10 +95,18 @@
93
95
  max-width: 20rem;
94
96
  }
95
97
 
98
+ .modal-md .modal-box {
99
+ max-width: 32rem;
100
+ }
101
+
96
102
  .modal-lg .modal-box {
97
103
  max-width: 48rem;
98
104
  }
99
105
 
106
+ .modal-xl .modal-box {
107
+ max-width: 64rem;
108
+ }
109
+
100
110
  .modal-full .modal-box {
101
111
  max-width: calc(100vw - 2rem);
102
112
  max-height: calc(100vh - 2rem);
@@ -119,6 +129,38 @@
119
129
  align-items: center;
120
130
  }
121
131
 
132
+ /* Animation Variants */
133
+ .modal-slide-up .modal-box {
134
+ transform: translateY(6rem) scale(0.95);
135
+ }
136
+
137
+ .modal-slide-down .modal-box {
138
+ transform: translateY(-6rem) scale(0.95);
139
+ }
140
+
141
+ .modal-zoom .modal-box {
142
+ transform: scale(0.75);
143
+ }
144
+
145
+ :is(.modal-slide-up, .modal-slide-down, .modal-zoom).modal-open .modal-box,
146
+ :is(.modal-slide-up, .modal-slide-down, .modal-zoom):target .modal-box {
147
+ transform: translateY(0) scale(1);
148
+ }
149
+
150
+ /* Backdrop Variants */
151
+ .modal-backdrop-light {
152
+ background-color: color-mix(in srgb, white 80%, transparent);
153
+ }
154
+
155
+ .modal-backdrop-blur {
156
+ background-color: color-mix(in srgb, var(--color-scrim) 30%, transparent);
157
+ backdrop-filter: blur(8px);
158
+ }
159
+
160
+ .modal-no-backdrop {
161
+ background-color: transparent;
162
+ }
163
+
122
164
  /* Modal Close Button */
123
165
  .modal-close {
124
166
  position: absolute;
@@ -167,6 +209,22 @@
167
209
  line-height: 1.5;
168
210
  }
169
211
 
212
+ .modal-scrollable .modal-body {
213
+ max-height: 60vh;
214
+ overflow-y: auto;
215
+ }
216
+
217
+ .modal-no-padding .modal-body {
218
+ padding: 0;
219
+ }
220
+
221
+ .modal-centered .modal-body {
222
+ display: flex;
223
+ align-items: center;
224
+ justify-content: center;
225
+ text-align: center;
226
+ }
227
+
170
228
  /* Responsive Modal */
171
229
  @media (max-width: 640px) {
172
230
  .modal-box {
@@ -181,7 +239,7 @@
181
239
 
182
240
  .modal-responsive .modal-box {
183
241
  max-width: 100%;
184
- max-height: 90vh;
242
+ max-height: 90dvh;
185
243
  margin: 0;
186
244
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
187
245
  }
@@ -196,7 +254,7 @@
196
254
 
197
255
  .drawer-modal .modal-box {
198
256
  max-width: 20rem;
199
- max-height: 100vh;
257
+ max-height: 100dvh;
200
258
  height: 100%;
201
259
  margin: 0;
202
260
  border-radius: 0;
@@ -288,4 +346,8 @@
288
346
  white-space: nowrap;
289
347
  border: 0;
290
348
  }
349
+
350
+ body.modal-open {
351
+ overflow: hidden;
352
+ }
291
353
  }
@@ -3,6 +3,100 @@
3
3
  * DuskMoonUI - Material Design 3 inspired navigation system
4
4
  */
5
5
 
6
+ /* Preserve the Navigation entrypoint's published Dropdown coverage. */
7
+ /**
8
+ * Dropdown Component Styles
9
+ * Native Popover disclosure with logical CSS anchor positioning.
10
+ */
11
+
12
+ @layer components {
13
+ .dropdown {
14
+ position: relative;
15
+ display: inline-block;
16
+ }
17
+
18
+ .dropdown > .dropdown-content[popover] {
19
+ display: none;
20
+ position: fixed;
21
+ inset-block-start: auto;
22
+ inset-block-end: max(0.5rem, env(safe-area-inset-bottom, 0px));
23
+ inset-inline-start: auto;
24
+ inset-inline-end: max(
25
+ 0.5rem,
26
+ env(safe-area-inset-left, 0px),
27
+ env(safe-area-inset-right, 0px)
28
+ );
29
+ z-index: 50;
30
+ min-inline-size: 12rem;
31
+ max-inline-size: min(24rem, calc(100dvw - 1rem));
32
+ max-block-size: calc(100dvh - 1rem);
33
+ margin: 0;
34
+ padding: 0.5rem;
35
+ overflow: auto;
36
+ color: var(--color-on-surface);
37
+ background-color: var(--color-surface);
38
+ border: 1px solid var(--color-outline);
39
+ border-radius: var(--radius-sm);
40
+ box-shadow: var(--shadow-lg);
41
+ opacity: 0;
42
+ visibility: hidden;
43
+ pointer-events: none;
44
+ transform: translateY(-0.5rem);
45
+ transition:
46
+ opacity 150ms ease-out,
47
+ transform 150ms ease-out,
48
+ overlay 150ms ease-out allow-discrete,
49
+ display 150ms ease-out allow-discrete;
50
+ }
51
+
52
+ .dropdown > .dropdown-content[popover]:popover-open {
53
+ display: block;
54
+ opacity: 1;
55
+ visibility: visible;
56
+ pointer-events: auto;
57
+ transform: translateY(0);
58
+ }
59
+
60
+ @starting-style {
61
+ .dropdown > .dropdown-content[popover]:popover-open {
62
+ opacity: 0;
63
+ transform: translateY(-0.5rem);
64
+ }
65
+ }
66
+
67
+ @supports (position-area: block-end) {
68
+ .dropdown > .dropdown-content[popover] {
69
+ inset: auto;
70
+ margin: 0.25rem;
71
+ position-area: block-end span-inline-end;
72
+ position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
73
+ }
74
+
75
+ .dropdown.dropdown-block-start > .dropdown-content[popover] {
76
+ position-area: block-start span-inline-end;
77
+ }
78
+
79
+ .dropdown.dropdown-block-end > .dropdown-content[popover] {
80
+ position-area: block-end span-inline-end;
81
+ }
82
+
83
+ .dropdown.dropdown-inline-start > .dropdown-content[popover] {
84
+ position-area: inline-start span-block-end;
85
+ }
86
+
87
+ .dropdown.dropdown-inline-end > .dropdown-content[popover] {
88
+ position-area: inline-end span-block-end;
89
+ }
90
+ }
91
+
92
+ @media (prefers-reduced-motion: reduce) {
93
+ .dropdown > .dropdown-content[popover] {
94
+ transition: none;
95
+ }
96
+ }
97
+ }
98
+
99
+
6
100
  @layer components {
7
101
  /* Navbar Base */
8
102
  .navbar {
@@ -589,60 +683,6 @@
589
683
  font-size: 1rem;
590
684
  }
591
685
 
592
- /* Dropdown */
593
- .dropdown {
594
- position: relative;
595
- display: inline-block;
596
- }
597
-
598
- .dropdown-content {
599
- position: absolute;
600
- z-index: 50;
601
- min-width: 12rem;
602
- padding: 0.5rem;
603
- background-color: var(--color-surface);
604
- border: 1px solid var(--color-outline);
605
- border-radius: var(--radius-sm);
606
- box-shadow: var(--shadow-lg);
607
- opacity: 0;
608
- visibility: hidden;
609
- transform: translateY(-0.5rem);
610
- transition: all 150ms ease-in-out;
611
- }
612
-
613
- .dropdown:hover .dropdown-content,
614
- .dropdown:focus-within .dropdown-content,
615
- .dropdown.dropdown-open .dropdown-content {
616
- opacity: 1;
617
- visibility: visible;
618
- transform: translateY(0);
619
- }
620
-
621
- /* Dropdown Positions */
622
- .dropdown-end .dropdown-content {
623
- right: 0;
624
- }
625
-
626
- .dropdown-top .dropdown-content {
627
- bottom: 100%;
628
- top: auto;
629
- margin-bottom: 0.25rem;
630
- }
631
-
632
- .dropdown-left .dropdown-content {
633
- right: 100%;
634
- left: auto;
635
- top: 0;
636
- margin-right: 0.25rem;
637
- }
638
-
639
- .dropdown-right .dropdown-content {
640
- left: 100%;
641
- right: auto;
642
- top: 0;
643
- margin-left: 0.25rem;
644
- }
645
-
646
686
  /* Pagination */
647
687
  .pagination {
648
688
  display: flex;
@@ -14,6 +14,36 @@
14
14
  overflow: hidden;
15
15
  }
16
16
 
17
+ /* Native progress keeps the platform's accessible value/max contract. */
18
+ progress.progress {
19
+ appearance: none;
20
+ border: 0;
21
+ display: block;
22
+ }
23
+
24
+ progress.progress::-webkit-progress-bar {
25
+ background: var(--color-surface-container-highest);
26
+ border-radius: var(--radius-full);
27
+ }
28
+
29
+ progress.progress::-webkit-progress-value {
30
+ background: var(--color-primary);
31
+ border-radius: var(--radius-full);
32
+ transition: width 300ms ease-in-out;
33
+ }
34
+
35
+ progress.progress::-moz-progress-bar {
36
+ background: var(--color-primary);
37
+ border-radius: var(--radius-full);
38
+ transition: width 300ms ease-in-out;
39
+ }
40
+
41
+ progress.progress:indeterminate::-webkit-progress-value,
42
+ progress.progress:indeterminate::-moz-progress-bar {
43
+ width: 30%;
44
+ animation: progress-indeterminate 1.5s infinite ease-in-out;
45
+ }
46
+
17
47
  /* Progress Bar */
18
48
  .progress-bar {
19
49
  position: absolute;
@@ -66,6 +96,21 @@
66
96
  background-color: var(--color-base-content);
67
97
  }
68
98
 
99
+ progress.progress-primary::-webkit-progress-value,
100
+ progress.progress-primary::-moz-progress-bar { background: var(--color-primary); }
101
+ progress.progress-secondary::-webkit-progress-value,
102
+ progress.progress-secondary::-moz-progress-bar { background: var(--color-secondary); }
103
+ progress.progress-tertiary::-webkit-progress-value,
104
+ progress.progress-tertiary::-moz-progress-bar { background: var(--color-tertiary); }
105
+ progress.progress-info::-webkit-progress-value,
106
+ progress.progress-info::-moz-progress-bar { background: var(--color-info); }
107
+ progress.progress-success::-webkit-progress-value,
108
+ progress.progress-success::-moz-progress-bar { background: var(--color-success); }
109
+ progress.progress-warning::-webkit-progress-value,
110
+ progress.progress-warning::-moz-progress-bar { background: var(--color-warning); }
111
+ progress.progress-error::-webkit-progress-value,
112
+ progress.progress-error::-moz-progress-bar { background: var(--color-error); }
113
+
69
114
  /* Size Variants */
70
115
  .progress-xs {
71
116
  height: 0.25rem;
@@ -141,6 +186,25 @@
141
186
  }
142
187
  }
143
188
 
189
+ /* Buffer tracks belong to custom markup, not native <progress>. */
190
+ .progress-buffer {
191
+ position: relative;
192
+ }
193
+
194
+ .progress-buffer-bar {
195
+ position: absolute;
196
+ inset-block: 0;
197
+ inset-inline-start: 0;
198
+ width: 0;
199
+ background: color-mix(in oklch, var(--color-primary) 30%, transparent);
200
+ border-radius: var(--radius-full);
201
+ transition: width 300ms ease-in-out;
202
+ }
203
+
204
+ .progress-buffer .progress-bar {
205
+ z-index: 1;
206
+ }
207
+
144
208
  /* Circular Progress */
145
209
  .progress-circular {
146
210
  position: relative;
@@ -240,7 +304,17 @@
240
304
 
241
305
  /* Reduce Motion */
242
306
  @media (prefers-reduced-motion: reduce) {
307
+ .progress-bar,
308
+ progress.progress::-webkit-progress-value,
309
+ progress.progress::-moz-progress-bar,
310
+ .progress-circular-bar,
311
+ .progress-buffer-bar {
312
+ transition: none;
313
+ }
314
+
243
315
  .progress-indeterminate .progress-bar,
316
+ progress.progress:indeterminate::-webkit-progress-value,
317
+ progress.progress:indeterminate::-moz-progress-bar,
244
318
  .progress-striped.progress-animated .progress-bar,
245
319
  .progress-circular-indeterminate svg,
246
320
  .progress-circular-indeterminate .progress-circular-bar {
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Radial Progress Component Styles
3
+ * Determinate percentage progress without circumference arithmetic.
4
+ */
5
+
6
+ @layer components {
7
+ .radial-progress {
8
+ --radial-progress-value: 0;
9
+ --radial-progress-size: 3rem;
10
+ --radial-progress-thickness: 0.375rem;
11
+ --radial-progress-track: var(--color-surface-container-highest);
12
+ position: relative;
13
+ display: inline-grid;
14
+ width: var(--radial-progress-size);
15
+ height: var(--radial-progress-size);
16
+ place-items: center;
17
+ color: var(--color-primary);
18
+ border-radius: var(--radius-full);
19
+ background: conic-gradient(currentColor calc(clamp(0, var(--radial-progress-value), 100) * 1%), var(--radial-progress-track) 0);
20
+ isolation: isolate;
21
+ }
22
+
23
+ .radial-progress::before {
24
+ content: "";
25
+ position: absolute;
26
+ inset: var(--radial-progress-thickness);
27
+ z-index: 0;
28
+ border-radius: inherit;
29
+ background: var(--color-surface);
30
+ }
31
+
32
+ .radial-progress-primary { color: var(--color-primary); }
33
+ .radial-progress-secondary { color: var(--color-secondary); }
34
+ .radial-progress-tertiary { color: var(--color-tertiary); }
35
+ .radial-progress-info { color: var(--color-info); }
36
+ .radial-progress-success { color: var(--color-success); }
37
+ .radial-progress-warning { color: var(--color-warning); }
38
+ .radial-progress-error { color: var(--color-error); }
39
+
40
+ .radial-progress-sm { --radial-progress-size: 2rem; --radial-progress-thickness: 0.25rem; }
41
+ .radial-progress-lg { --radial-progress-size: 4rem; --radial-progress-thickness: 0.5rem; }
42
+ .radial-progress-xl { --radial-progress-size: 6rem; --radial-progress-thickness: 0.625rem; }
43
+
44
+ @media (prefers-reduced-motion: reduce) {
45
+ .radial-progress { transition: none; }
46
+ }
47
+ }
@@ -31,6 +31,10 @@
31
31
  border-radius: var(--radius-sm);
32
32
  }
33
33
 
34
+ .skeleton-static {
35
+ animation: none;
36
+ }
37
+
34
38
  /* Size Variants */
35
39
  .skeleton-xs {
36
40
  height: 0.5rem;
@@ -133,7 +137,7 @@
133
137
  background: linear-gradient(
134
138
  90deg,
135
139
  transparent,
136
- rgba(255, 255, 255, 0.3),
140
+ color-mix(in oklch, var(--color-surface-bright) 35%, transparent),
137
141
  transparent
138
142
  );
139
143
  animation: skeleton-wave 1.5s infinite;
@@ -211,6 +215,14 @@
211
215
 
212
216
  .skeleton-wave::after {
213
217
  animation: none;
218
+ transform: translateX(0);
219
+ opacity: 0.35;
220
+ }
221
+
222
+ .skeleton-static::after {
223
+ animation: none;
224
+ transform: translateX(0);
225
+ opacity: 0.35;
214
226
  }
215
227
  }
216
228
  }
@@ -210,49 +210,49 @@
210
210
 
211
211
  /* Color Variants */
212
212
  .snackbar-info {
213
- background-color: var(--color-info-container);
214
- color: var(--color-on-info-container);
213
+ background-color: var(--color-info);
214
+ color: var(--color-info-content);
215
215
  }
216
216
 
217
217
  .snackbar-success {
218
- background-color: var(--color-success-container);
219
- color: var(--color-on-success-container);
218
+ background-color: var(--color-success);
219
+ color: var(--color-success-content);
220
220
  }
221
221
 
222
222
  .snackbar-warning {
223
- background-color: var(--color-warning-container);
224
- color: var(--color-on-warning-container);
223
+ background-color: var(--color-warning);
224
+ color: var(--color-warning-content);
225
225
  }
226
226
 
227
227
  .snackbar-error {
228
- background-color: var(--color-error-container);
229
- color: var(--color-on-error-container);
228
+ background-color: var(--color-error);
229
+ color: var(--color-error-content);
230
230
  }
231
231
 
232
232
  /* Brand Color Variants */
233
233
  .snackbar-primary {
234
- background-color: var(--color-primary-container);
235
- color: var(--color-on-primary-container);
234
+ background-color: var(--color-primary);
235
+ color: var(--color-primary-content);
236
236
  }
237
237
 
238
238
  .snackbar-secondary {
239
- background-color: var(--color-secondary-container);
240
- color: var(--color-on-secondary-container);
239
+ background-color: var(--color-secondary);
240
+ color: var(--color-secondary-content);
241
241
  }
242
242
 
243
243
  .snackbar-tertiary {
244
- background-color: var(--color-tertiary-container);
245
- color: var(--color-on-tertiary-container);
244
+ background-color: var(--color-tertiary);
245
+ color: var(--color-tertiary-content);
246
246
  }
247
247
 
248
248
  .snackbar-accent {
249
- background-color: color-mix(in oklch, var(--color-accent) 15%, var(--color-surface));
250
- color: var(--color-on-surface);
249
+ background-color: var(--color-accent);
250
+ color: var(--color-accent-content);
251
251
  }
252
252
 
253
253
  .snackbar-neutral {
254
- background-color: color-mix(in oklch, var(--color-neutral) 15%, var(--color-surface));
255
- color: var(--color-on-surface);
254
+ background-color: var(--color-neutral);
255
+ color: var(--color-neutral-content);
256
256
  }
257
257
 
258
258
  .snackbar-base {
@@ -260,6 +260,36 @@
260
260
  color: var(--color-base-content);
261
261
  }
262
262
 
263
+ :is(
264
+ .snackbar-info,
265
+ .snackbar-success,
266
+ .snackbar-warning,
267
+ .snackbar-error,
268
+ .snackbar-primary,
269
+ .snackbar-secondary,
270
+ .snackbar-tertiary,
271
+ .snackbar-accent,
272
+ .snackbar-neutral,
273
+ .snackbar-base
274
+ ) :is(.snackbar-action, .snackbar-close) {
275
+ color: inherit;
276
+ }
277
+
278
+ :is(
279
+ .snackbar-info,
280
+ .snackbar-success,
281
+ .snackbar-warning,
282
+ .snackbar-error,
283
+ .snackbar-primary,
284
+ .snackbar-secondary,
285
+ .snackbar-tertiary,
286
+ .snackbar-accent,
287
+ .snackbar-neutral,
288
+ .snackbar-base
289
+ ) :is(.snackbar-action, .snackbar-close):hover {
290
+ background-color: color-mix(in oklch, currentColor 12%, transparent);
291
+ }
292
+
263
293
  /* Dark Snackbar (default MD3 style) */
264
294
  .snackbar-dark {
265
295
  background-color: var(--color-on-surface);