@fluid-theme/core 0.4.3

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 (48) hide show
  1. package/AGENTS.md +32 -0
  2. package/CHANGELOG.md +159 -0
  3. package/CLAUDE.md +104 -0
  4. package/GEMINI.md +48 -0
  5. package/LICENSE +21 -0
  6. package/README.md +253 -0
  7. package/dist/fluid.min.css +2 -0
  8. package/fluid-agent-kit/README.md +57 -0
  9. package/fluid-agent-kit/skills/accessibility.md +41 -0
  10. package/fluid-agent-kit/skills/css-conventions.md +51 -0
  11. package/fluid-agent-kit/skills/image-optimization.md +115 -0
  12. package/fluid-agent-kit/skills/ux-rules.md +43 -0
  13. package/package.json +68 -0
  14. package/src/animations/scroll-reveal.css +224 -0
  15. package/src/components/accordion.css +250 -0
  16. package/src/components/alert.css +453 -0
  17. package/src/components/avatar.css +192 -0
  18. package/src/components/badge.css +182 -0
  19. package/src/components/button.css +387 -0
  20. package/src/components/card.css +650 -0
  21. package/src/components/chip.css +143 -0
  22. package/src/components/dropdown.css +335 -0
  23. package/src/components/empty-state.css +105 -0
  24. package/src/components/form.css +508 -0
  25. package/src/components/hero.css +293 -0
  26. package/src/components/indicator.css +455 -0
  27. package/src/components/loading.css +274 -0
  28. package/src/components/modal.css +364 -0
  29. package/src/components/nav.css +726 -0
  30. package/src/components/scroll-progress.css +104 -0
  31. package/src/components/search-input.css +125 -0
  32. package/src/components/settings-panel.css +603 -0
  33. package/src/components/step-indicator.css +188 -0
  34. package/src/components/table.css +350 -0
  35. package/src/components/themed-images.css +229 -0
  36. package/src/components/tooltip.css +247 -0
  37. package/src/components/version-badge.css +70 -0
  38. package/src/core/base.css +884 -0
  39. package/src/core/reset.css +159 -0
  40. package/src/core/tokens.css +2416 -0
  41. package/src/fluid.css +242 -0
  42. package/src/layouts/positioning.css +626 -0
  43. package/src/sections/cta.css +210 -0
  44. package/src/sections/features.css +356 -0
  45. package/src/sections/footer.css +283 -0
  46. package/src/sections/stats.css +234 -0
  47. package/src/sections/team.css +181 -0
  48. package/src/sections/testimonials.css +251 -0
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Fluid Framework - Accordion/Collapse Component
3
+ * @layer components
4
+ *
5
+ * Accordion for collapsible content sections.
6
+ * Built on native <details>/<summary> for zero-JS operation.
7
+ * CSS transitions for smooth open/close animations.
8
+ *
9
+ * Usage:
10
+ * <div class="accordion">
11
+ * <details class="accordion__item">
12
+ * <summary class="accordion__trigger">Section Title</summary>
13
+ * <div class="accordion__content">
14
+ * <div class="accordion__body">Content here</div>
15
+ * </div>
16
+ * </details>
17
+ * </div>
18
+ *
19
+ * Variants:
20
+ * data-variant="bordered" — card-like bordered items
21
+ * data-variant="separated" — spaced apart with elevation
22
+ * data-variant="flush" — minimal, no borders
23
+ *
24
+ * Single open: Add name="" attribute to details elements
25
+ * (exclusive accordion behavior, native HTML)
26
+ */
27
+
28
+ @layer components {
29
+ /* ========================================
30
+ ACCORDION CONTAINER
31
+ ======================================== */
32
+
33
+ .accordion {
34
+ display: flex;
35
+ flex-direction: column;
36
+ gap: 0;
37
+ }
38
+
39
+ /* Separated variant: gap between items */
40
+ .accordion[data-variant="separated"] {
41
+ gap: var(--space-3);
42
+ }
43
+
44
+
45
+ /* ========================================
46
+ ACCORDION ITEM
47
+ ======================================== */
48
+
49
+ .accordion__item {
50
+ border-block-end: var(--border-width) solid var(--color-border-subtle);
51
+ }
52
+
53
+ .accordion__item:first-of-type {
54
+ border-block-start: var(--border-width) solid var(--color-border-subtle);
55
+ }
56
+
57
+ /* Bordered variant: each item is a card */
58
+ .accordion[data-variant="bordered"] .accordion__item {
59
+ border: var(--border-width) solid var(--color-border-subtle);
60
+ border-radius: var(--radius-lg);
61
+ overflow: hidden;
62
+ }
63
+
64
+ .accordion[data-variant="bordered"] .accordion__item:first-of-type {
65
+ border-block-start: var(--border-width) solid var(--color-border-subtle);
66
+ }
67
+
68
+ /* Separated variant: elevated card items */
69
+ .accordion[data-variant="separated"] .accordion__item {
70
+ border: var(--border-width) solid var(--color-border-subtle);
71
+ border-radius: var(--radius-lg);
72
+ background: var(--color-surface-raised);
73
+ box-shadow: var(--shadow-xs);
74
+ overflow: hidden;
75
+ }
76
+
77
+ /* Flush variant: no borders at all */
78
+ .accordion[data-variant="flush"] .accordion__item {
79
+ border: none;
80
+ }
81
+
82
+ .accordion[data-variant="flush"] .accordion__item:first-of-type {
83
+ border: none;
84
+ }
85
+
86
+
87
+ /* ========================================
88
+ ACCORDION TRIGGER (summary element)
89
+ ======================================== */
90
+
91
+ .accordion__trigger {
92
+ display: flex;
93
+ align-items: center;
94
+ justify-content: space-between;
95
+ gap: var(--space-4);
96
+
97
+ padding: var(--space-4) var(--space-5);
98
+ cursor: pointer;
99
+ font-weight: var(--weight-semibold);
100
+ font-size: var(--font-size-base);
101
+ line-height: var(--leading-snug);
102
+ color: var(--color-text);
103
+ list-style: none; /* Remove default marker */
104
+
105
+ transition:
106
+ color var(--duration-fast) var(--ease-fluid),
107
+ background-color var(--duration-fast) var(--ease-fluid);
108
+ }
109
+
110
+ /* Remove default summary marker across browsers */
111
+ .accordion__trigger::-webkit-details-marker {
112
+ display: none;
113
+ }
114
+
115
+ .accordion__trigger::marker {
116
+ content: "";
117
+ }
118
+
119
+ /* Chevron icon */
120
+ .accordion__trigger::after {
121
+ content: "";
122
+ flex-shrink: 0;
123
+ inline-size: 1.25rem;
124
+ block-size: 1.25rem;
125
+ background-color: var(--color-text-muted);
126
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
127
+ mask-repeat: no-repeat;
128
+ mask-position: center;
129
+ mask-size: contain;
130
+ transition: transform var(--duration-normal) var(--ease-settle);
131
+ }
132
+
133
+ /* Rotate chevron when open */
134
+ .accordion__item[open] > .accordion__trigger::after {
135
+ transform: rotate(180deg);
136
+ }
137
+
138
+ /* Hover */
139
+ .accordion__trigger:hover {
140
+ color: var(--accent);
141
+ background-color: color-mix(in oklch, var(--accent) 5%, transparent);
142
+ }
143
+
144
+ /* Focus */
145
+ .accordion__trigger:focus-visible {
146
+ outline: 2px solid var(--color-focus);
147
+ outline-offset: -2px;
148
+ border-radius: var(--radius-sm);
149
+ }
150
+
151
+
152
+ /* ========================================
153
+ ACCORDION CONTENT
154
+ ======================================== */
155
+
156
+ .accordion__content {
157
+ overflow: hidden;
158
+ }
159
+
160
+ .accordion__body {
161
+ padding: 0 var(--space-5) var(--space-5);
162
+ color: var(--color-text-muted);
163
+ font-size: var(--font-size-base);
164
+ line-height: var(--leading-normal);
165
+ }
166
+
167
+ /* Extra spacing for body content */
168
+ .accordion__body > * + * {
169
+ margin-block-start: var(--space-3);
170
+ }
171
+
172
+
173
+ /* ========================================
174
+ SIZE VARIANTS
175
+ ======================================== */
176
+
177
+ /* Compact */
178
+ .accordion[data-size="sm"] .accordion__trigger {
179
+ padding: var(--space-3) var(--space-4);
180
+ font-size: var(--font-size-sm);
181
+ }
182
+
183
+ .accordion[data-size="sm"] .accordion__body {
184
+ padding: 0 var(--space-4) var(--space-4);
185
+ font-size: var(--font-size-sm);
186
+ }
187
+
188
+ .accordion[data-size="sm"] .accordion__trigger::after {
189
+ inline-size: 1rem;
190
+ block-size: 1rem;
191
+ }
192
+
193
+ /* Large */
194
+ .accordion[data-size="lg"] .accordion__trigger {
195
+ padding: var(--space-5) var(--space-6);
196
+ font-size: var(--font-size-lg);
197
+ }
198
+
199
+ .accordion[data-size="lg"] .accordion__body {
200
+ padding: 0 var(--space-6) var(--space-6);
201
+ }
202
+
203
+
204
+ /* ========================================
205
+ THEME-SPECIFIC STYLES
206
+ ======================================== */
207
+
208
+ /* Still: no animation */
209
+ [data-motion="still"] .accordion__trigger::after {
210
+ transition: none;
211
+ }
212
+
213
+ /* Serene: rounded, soft */
214
+ [data-motion="serene"] .accordion[data-variant="separated"] .accordion__item,
215
+ [data-motion="serene"] .accordion[data-variant="bordered"] .accordion__item {
216
+ border-radius: var(--radius-xl);
217
+ }
218
+
219
+ /* Cascade: bouncy, bubbly */
220
+ [data-motion="cascade"] .accordion[data-variant="separated"] .accordion__item,
221
+ [data-motion="cascade"] .accordion[data-variant="bordered"] .accordion__item {
222
+ border-radius: var(--radius-xl);
223
+ }
224
+
225
+ /* Rapids: hard shadow on separated */
226
+ [data-motion="rapids"] .accordion[data-variant="separated"] .accordion__item {
227
+ box-shadow: var(--shadow-offset);
228
+ }
229
+
230
+ /* Tsunami: asymmetric corners */
231
+ [data-motion="tsunami"] .accordion[data-variant="separated"] .accordion__item,
232
+ [data-motion="tsunami"] .accordion[data-variant="bordered"] .accordion__item {
233
+ border-radius: var(--radius-asymmetric, 0 24px 0 0);
234
+ }
235
+
236
+
237
+ /* ========================================
238
+ REDUCED MOTION
239
+ ======================================== */
240
+
241
+ @media (prefers-reduced-motion: reduce) {
242
+ .accordion__trigger {
243
+ transition: none;
244
+ }
245
+
246
+ .accordion__trigger::after {
247
+ transition: none;
248
+ }
249
+ }
250
+ }
@@ -0,0 +1,453 @@
1
+ /**
2
+ * Fluid Framework - Alert & Toast Component
3
+ * @layer components
4
+ *
5
+ * Alerts for inline feedback messages.
6
+ * Toasts for transient notifications (positioned fixed).
7
+ *
8
+ * Alert Usage:
9
+ * <div class="alert" data-status="info">
10
+ * <p>This is an informational message.</p>
11
+ * </div>
12
+ *
13
+ * <div class="alert" data-status="success" data-dismissible>
14
+ * <div class="alert__content">
15
+ * <strong class="alert__title">Success!</strong>
16
+ * <p>Your changes have been saved.</p>
17
+ * </div>
18
+ * <button class="alert__close" aria-label="Dismiss">&times;</button>
19
+ * </div>
20
+ *
21
+ * Statuses: data-status="info|success|warning|error"
22
+ * Variants: data-variant="filled|outline|subtle" (default: subtle)
23
+ *
24
+ * Toast Usage:
25
+ * <div class="toast-container" data-position="top-right">
26
+ * <div class="toast" data-status="success">
27
+ * <div class="toast__content">
28
+ * <strong>Saved</strong>
29
+ * <p>Your changes are live.</p>
30
+ * </div>
31
+ * </div>
32
+ * </div>
33
+ */
34
+
35
+ @layer components {
36
+ /* ========================================
37
+ ALERT - Inline Messages
38
+ ======================================== */
39
+
40
+ .alert {
41
+ --_alert-color: var(--color-info);
42
+ --_alert-bg: var(--color-info-subtle);
43
+ --_alert-border: var(--color-info);
44
+
45
+ display: flex;
46
+ align-items: flex-start;
47
+ gap: var(--space-3);
48
+ padding: var(--space-4) var(--space-5);
49
+ border-radius: var(--radius-lg);
50
+ border-inline-start: 3px solid var(--_alert-border);
51
+ background: var(--_alert-bg);
52
+ color: var(--color-text);
53
+ font-size: var(--font-size-sm);
54
+ line-height: var(--leading-normal);
55
+
56
+ transition:
57
+ opacity var(--duration-normal) var(--ease-fluid),
58
+ transform var(--duration-normal) var(--ease-settle);
59
+ }
60
+
61
+
62
+ /* ========================================
63
+ STATUS VARIANTS
64
+ ======================================== */
65
+
66
+ .alert[data-status="success"] {
67
+ --_alert-color: var(--color-success);
68
+ --_alert-bg: var(--color-success-subtle);
69
+ --_alert-border: var(--color-success);
70
+ }
71
+
72
+ .alert[data-status="warning"] {
73
+ --_alert-color: var(--color-warning);
74
+ --_alert-bg: var(--color-warning-subtle);
75
+ --_alert-border: var(--color-warning);
76
+ }
77
+
78
+ .alert[data-status="error"] {
79
+ --_alert-color: var(--color-error);
80
+ --_alert-bg: var(--color-error-subtle);
81
+ --_alert-border: var(--color-error);
82
+ }
83
+
84
+ .alert[data-status="info"] {
85
+ --_alert-color: var(--color-info);
86
+ --_alert-bg: var(--color-info-subtle);
87
+ --_alert-border: var(--color-info);
88
+ }
89
+
90
+
91
+ /* ========================================
92
+ VISUAL VARIANTS
93
+ ======================================== */
94
+
95
+ /* Filled: solid background */
96
+ .alert[data-variant="filled"] {
97
+ background: var(--_alert-color);
98
+ color: var(--white);
99
+ border-inline-start: none;
100
+ }
101
+
102
+ .alert[data-variant="filled"] .alert__title {
103
+ color: inherit;
104
+ }
105
+
106
+ /* Outline: border only */
107
+ .alert[data-variant="outline"] {
108
+ background: transparent;
109
+ border: var(--border-width) solid var(--_alert-border);
110
+ border-inline-start-width: 3px;
111
+ }
112
+
113
+
114
+ /* ========================================
115
+ ALERT STRUCTURE
116
+ ======================================== */
117
+
118
+ /* Icon placeholder (before content) */
119
+ .alert__icon {
120
+ flex-shrink: 0;
121
+ inline-size: 1.25rem;
122
+ block-size: 1.25rem;
123
+ color: var(--_alert-color);
124
+ margin-block-start: 1px;
125
+ }
126
+
127
+ .alert__content {
128
+ flex: 1;
129
+ min-inline-size: 0;
130
+ }
131
+
132
+ .alert__title {
133
+ font-weight: var(--weight-semibold);
134
+ color: var(--_alert-color);
135
+ margin-block-end: var(--space-1);
136
+ display: block;
137
+ }
138
+
139
+ .alert__content p {
140
+ margin: 0;
141
+ }
142
+
143
+ .alert__close {
144
+ --_btn-bg: transparent;
145
+ --_btn-shadow: none;
146
+
147
+ position: relative;
148
+ flex-shrink: 0;
149
+ display: inline-flex;
150
+ align-items: center;
151
+ justify-content: center;
152
+ inline-size: 1.5rem;
153
+ block-size: 1.5rem;
154
+ padding: 0;
155
+ border-radius: var(--radius-sm);
156
+ font-size: var(--font-size-lg);
157
+ line-height: 1;
158
+ color: var(--color-text-muted);
159
+ cursor: pointer;
160
+ transition: color var(--duration-fast) var(--ease-fluid);
161
+ }
162
+
163
+ /* Extend touch target to 44px minimum */
164
+ .alert__close::before {
165
+ content: "";
166
+ position: absolute;
167
+ inset: -0.625rem;
168
+ }
169
+
170
+ .alert__close:hover {
171
+ color: var(--color-text);
172
+ }
173
+
174
+ /* Dismissing animation */
175
+ .alert[data-dismissing] {
176
+ opacity: 0;
177
+ transform: translateX(var(--space-4));
178
+ }
179
+
180
+
181
+ /* ========================================
182
+ TOAST CONTAINER
183
+ Fixed position notification area
184
+ ======================================== */
185
+
186
+ .toast-container {
187
+ position: fixed;
188
+ z-index: var(--z-toast);
189
+ display: flex;
190
+ flex-direction: column;
191
+ gap: var(--space-3);
192
+ padding: var(--space-5);
193
+ pointer-events: none;
194
+ max-inline-size: min(100%, 24rem);
195
+ }
196
+
197
+ /* Positions */
198
+ .toast-container[data-position="top-right"],
199
+ .toast-container:not([data-position]) {
200
+ inset-block-start: 0;
201
+ inset-inline-end: 0;
202
+ }
203
+
204
+ .toast-container[data-position="top-left"] {
205
+ inset-block-start: 0;
206
+ inset-inline-start: 0;
207
+ }
208
+
209
+ .toast-container[data-position="bottom-right"] {
210
+ inset-block-end: 0;
211
+ inset-inline-end: 0;
212
+ }
213
+
214
+ .toast-container[data-position="bottom-left"] {
215
+ inset-block-end: 0;
216
+ inset-inline-start: 0;
217
+ }
218
+
219
+ .toast-container[data-position="top-center"] {
220
+ inset-block-start: 0;
221
+ inset-inline-start: 50%;
222
+ translate: -50% 0;
223
+ }
224
+
225
+ .toast-container[data-position="bottom-center"] {
226
+ inset-block-end: 0;
227
+ inset-inline-start: 50%;
228
+ translate: -50% 0;
229
+ }
230
+
231
+
232
+ /* ========================================
233
+ TOAST - Individual Notification
234
+ ======================================== */
235
+
236
+ .toast {
237
+ --_toast-accent: var(--color-info);
238
+
239
+ position: relative;
240
+ overflow: hidden;
241
+ display: flex;
242
+ align-items: flex-start;
243
+ gap: var(--space-3);
244
+ padding: var(--space-4);
245
+ padding-inline-start: calc(var(--space-4) + 3px);
246
+ background: var(--color-surface-raised);
247
+ border: var(--border-width) solid var(--color-border-subtle);
248
+ border-radius: var(--radius-lg);
249
+ box-shadow: var(--shadow-lg);
250
+ pointer-events: auto;
251
+ inline-size: 100%;
252
+
253
+ /* Entry animation */
254
+ animation: toast-in var(--duration-normal) var(--ease-settle) both;
255
+ }
256
+
257
+ .toast[data-status="success"] { --_toast-accent: var(--color-success); }
258
+ .toast[data-status="warning"] { --_toast-accent: var(--color-warning); }
259
+ .toast[data-status="error"] { --_toast-accent: var(--color-error); }
260
+ .toast[data-status="info"] { --_toast-accent: var(--color-info); }
261
+
262
+ /* Accent bar */
263
+ .toast::before {
264
+ content: "";
265
+ position: absolute;
266
+ inset-block-start: 0;
267
+ inset-inline-start: 0;
268
+ inline-size: 3px;
269
+ block-size: 100%;
270
+ background: var(--_toast-accent);
271
+ border-radius: var(--radius-full) 0 0 var(--radius-full);
272
+ }
273
+
274
+ .toast__icon {
275
+ flex-shrink: 0;
276
+ inline-size: 1.25rem;
277
+ block-size: 1.25rem;
278
+ color: var(--_toast-accent);
279
+ margin-block-start: 1px;
280
+ }
281
+
282
+ .toast__content {
283
+ flex: 1;
284
+ min-inline-size: 0;
285
+ }
286
+
287
+ .toast__content strong {
288
+ display: block;
289
+ font-weight: var(--weight-semibold);
290
+ margin-block-end: var(--space-1);
291
+ }
292
+
293
+ .toast__content p {
294
+ margin: 0;
295
+ font-size: var(--font-size-sm);
296
+ color: var(--color-text-muted);
297
+ }
298
+
299
+ .toast__close {
300
+ --_btn-bg: transparent;
301
+ --_btn-shadow: none;
302
+
303
+ position: relative;
304
+ flex-shrink: 0;
305
+ display: inline-flex;
306
+ align-items: center;
307
+ justify-content: center;
308
+ inline-size: 1.5rem;
309
+ block-size: 1.5rem;
310
+ padding: 0;
311
+ border-radius: var(--radius-sm);
312
+ font-size: var(--font-size-base);
313
+ color: var(--color-text-subtle);
314
+ cursor: pointer;
315
+ }
316
+
317
+ /* Extend touch target to 44px minimum */
318
+ .toast__close::before {
319
+ content: "";
320
+ position: absolute;
321
+ inset: -0.625rem;
322
+ }
323
+
324
+ .toast__close:hover {
325
+ color: var(--color-text);
326
+ }
327
+
328
+ /* Toast action (undo link, etc.) */
329
+ .toast__action {
330
+ display: inline-flex;
331
+ align-items: center;
332
+ padding: var(--space-1) var(--space-2);
333
+ margin-block-start: var(--space-2);
334
+ font-size: var(--font-size-sm);
335
+ font-weight: var(--weight-semibold);
336
+ color: var(--_toast-accent);
337
+ background: transparent;
338
+ border: var(--border-width) solid var(--_toast-accent);
339
+ border-radius: var(--radius-sm);
340
+ cursor: pointer;
341
+ text-decoration: none;
342
+ transition: background-color var(--duration-fast) var(--ease-fluid);
343
+ }
344
+
345
+ .toast__action:hover {
346
+ background: var(--_toast-accent);
347
+ color: var(--white);
348
+ }
349
+
350
+ /* Auto-dismiss progress bar */
351
+ .toast[data-auto-dismiss]::after {
352
+ content: "";
353
+ position: absolute;
354
+ inset-block-end: 0;
355
+ inset-inline-start: 0;
356
+ block-size: 2px;
357
+ background: var(--_toast-accent);
358
+ animation: toast-progress var(--_toast-duration, 4s) linear both;
359
+ }
360
+
361
+ @keyframes toast-progress {
362
+ from { inline-size: 100%; }
363
+ to { inline-size: 0%; }
364
+ }
365
+
366
+ /* Exit animation */
367
+ .toast[data-dismissing] {
368
+ animation: toast-out var(--duration-fast) var(--ease-fluid) both;
369
+ }
370
+
371
+
372
+ /* ========================================
373
+ TOAST ANIMATIONS
374
+ ======================================== */
375
+
376
+ @keyframes toast-in {
377
+ from {
378
+ opacity: 0;
379
+ transform: translateY(-8px) scale(0.96);
380
+ }
381
+ to {
382
+ opacity: 1;
383
+ transform: translateY(0) scale(1);
384
+ }
385
+ }
386
+
387
+ @keyframes toast-out {
388
+ to {
389
+ opacity: 0;
390
+ transform: translateX(100%) scale(0.96);
391
+ }
392
+ }
393
+
394
+
395
+ /* ========================================
396
+ THEME-SPECIFIC STYLES
397
+ ======================================== */
398
+
399
+ /* Still: no animations */
400
+ [data-motion="still"] .toast {
401
+ animation: none;
402
+ }
403
+
404
+ /* Rapids: offset shadow */
405
+ [data-motion="rapids"] .toast {
406
+ box-shadow: var(--shadow-offset);
407
+ }
408
+
409
+ [data-motion="rapids"] .alert {
410
+ border-inline-start-width: 4px;
411
+ }
412
+
413
+ /* Tsunami: asymmetric */
414
+ [data-motion="tsunami"] .toast {
415
+ border-radius: var(--radius-asymmetric, 0 24px 0 0);
416
+ }
417
+
418
+ [data-motion="tsunami"] .alert {
419
+ border-radius: var(--radius-asymmetric, 0 24px 0 0);
420
+ }
421
+
422
+
423
+ /* ========================================
424
+ RESPONSIVE
425
+ ======================================== */
426
+
427
+ @media (max-width: 40rem) {
428
+ .toast-container {
429
+ max-inline-size: 100%;
430
+ padding: var(--space-3);
431
+ }
432
+ }
433
+
434
+
435
+ /* ========================================
436
+ REDUCED MOTION
437
+ ======================================== */
438
+
439
+ @media (prefers-reduced-motion: reduce) {
440
+ .alert {
441
+ transition: none;
442
+ }
443
+
444
+ .toast {
445
+ animation: none;
446
+ }
447
+
448
+ .toast[data-dismissing] {
449
+ animation: none;
450
+ opacity: 0;
451
+ }
452
+ }
453
+ }