@24vlh/vds 0.1.0 → 0.1.1

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.
@@ -1,657 +1 @@
1
- /************************************************************
2
- * VLAH DESIGN SYSTEM (VDS) - Feedback System
3
- *
4
- * Responsibilities:
5
- * - Define the full semantic feedback engine: alerts, banners, toasts,
6
- * inline form states, status labels, info/result blocks, and progress bars
7
- * - Provide variant mapping (info/success/warning/danger/error/neutral/accent)
8
- * via token-driven background, border, and text variables
9
- * - Support density modes, responsiveness, stacking logic, and animation
10
- * - Expose structural primitives and containers for feedback across app surfaces
11
- *
12
- * System Notes:
13
- * - Pure CSS; animations (toast enter, striped progress, sheen) are CSS-based
14
- * - Fully token-driven: colour, spacing, radii, shadows, motion, semantic lanes
15
- * - Namespaced and internally consistent with VDS interaction & focus systems
16
- ************************************************************/
17
-
18
- /* ---------------------------------------------------------
19
- 1. FEEDBACK TOKEN DEFINITIONS
20
- --------------------------------------------------------- */
21
-
22
- [data-vds-feedback],
23
- .vds-feedback {
24
- --feedback-padding-sm: var(--space-3);
25
- --feedback-padding-md: var(--space-4);
26
- --feedback-padding-lg: var(--space-6);
27
-
28
- --feedback-gap: var(--space-3);
29
-
30
- --feedback-info-block-border-width: var(--border-width-strong);
31
- }
32
-
33
- /* ---------------------------------------------------------
34
- 2. SEMANTIC FEEDBACK VARIABLE LAYER
35
- --------------------------------------------------------- */
36
-
37
- .feedback[data-variant="info"],
38
- [data-variant="info"] {
39
- --feedback-bg: var(--semantic-info-bg-strong, var(--color-info-soft));
40
- --feedback-border: var(--semantic-info-border-strong, var(--color-info));
41
- --feedback-text: var(--semantic-info-text-strong, var(--color-info-strong));
42
- }
43
-
44
- .feedback[data-variant="success"],
45
- [data-variant="success"] {
46
- --feedback-bg: var(--semantic-success-bg-strong, var(--color-success-soft));
47
- --feedback-border: var(--semantic-success-border-strong, var(--color-success));
48
- --feedback-text: var(--semantic-success-text-strong, var(--color-success-strong));
49
- }
50
-
51
- .feedback[data-variant="warning"],
52
- [data-variant="warning"] {
53
- --feedback-bg: var(--semantic-warning-bg-strong, var(--color-warning-soft));
54
- --feedback-border: var(--semantic-warning-border-strong, var(--color-warning));
55
- --feedback-text: var(--semantic-warning-text-strong, var(--color-warning-strong));
56
- }
57
-
58
- [data-variant="danger"] {
59
- --feedback-bg: var(--color-danger-soft);
60
- --feedback-border: var(--color-danger);
61
- --feedback-text: var(--color-danger-strong);
62
- }
63
-
64
- .feedback[data-variant="error"],
65
- [data-variant="error"] {
66
- --feedback-bg: var(--semantic-error-bg-strong, var(--color-danger-soft));
67
- --feedback-border: var(--semantic-error-border-strong, var(--color-danger));
68
- --feedback-text: var(--semantic-error-text-strong, var(--color-danger-strong));
69
- }
70
-
71
- [data-variant="neutral"] {
72
- --feedback-bg: var(--color-surface-subtle);
73
- --feedback-border: var(--color-border-subtle);
74
- --feedback-text: var(--color-text);
75
- }
76
-
77
- [data-variant="accent"] {
78
- --feedback-bg: var(--color-accent-soft);
79
- --feedback-border: var(--color-accent);
80
- --feedback-text: var(--color-on-accent);
81
- }
82
-
83
- /* ---------------------------------------------------------
84
- 3. ALERTS
85
- --------------------------------------------------------- */
86
-
87
- .alert {
88
- display: flex;
89
- align-items: flex-start;
90
- gap: var(--feedback-gap);
91
-
92
- padding: var(--feedback-padding-lg);
93
- border: var(--border-width) solid var(--color-border-subtle);
94
- border-radius: var(--radius-md);
95
-
96
- background-color: var(--color-muted-bg);
97
- color: var(--color-text);
98
- font-size: var(--text-sm);
99
- }
100
-
101
- .alert[data-variant] {
102
- background-color: var(--feedback-bg) !important;
103
- border-color: var(--feedback-border) !important;
104
- color: var(--feedback-text) !important;
105
- }
106
-
107
- .alert__icon {
108
- width: var(--space-5);
109
- height: var(--space-5);
110
- flex-shrink: 0;
111
-
112
- display: flex;
113
- align-items: center;
114
- justify-content: center;
115
- }
116
-
117
- .alert__icon > * {
118
- display: block;
119
- width: 100%;
120
- height: 100%;
121
- }
122
-
123
- .alert__content {
124
- display: flex;
125
- flex-direction: column;
126
- gap: var(--space-2);
127
- }
128
-
129
- .alert__title {
130
- font-weight: 600;
131
- font-size: var(--text-sm);
132
- }
133
-
134
- .alert__message {
135
- font-size: var(--text-sm);
136
- opacity: 0.95;
137
- }
138
-
139
- .alert__close {
140
- margin-left: auto;
141
- font-size: var(--text-sm);
142
- cursor: pointer;
143
- opacity: 0.6;
144
- }
145
-
146
- .alert__close:hover {
147
- opacity: 1;
148
- }
149
-
150
- .alert__close:focus-visible {
151
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
152
- outline-offset: var(--focus-ring-offset);
153
- }
154
-
155
- .alert--outline {
156
- background-color: transparent !important;
157
- border-color: var(--feedback-border) !important;
158
- color: var(--feedback-border) !important;
159
- }
160
-
161
- /* ---------------------------------------------------------
162
- 4. BANNERS (SOLID + STICKY + CLOSEABLE)
163
- --------------------------------------------------------- */
164
-
165
- .banner {
166
- width: 100%;
167
- padding: var(--feedback-padding-md) 0;
168
-
169
- border-bottom: var(--border-width) solid var(--color-border-subtle);
170
- background-color: var(--color-surface-subtle);
171
- color: var(--color-text);
172
- }
173
-
174
- .banner[data-variant] {
175
- background-color: var(--feedback-bg) !important;
176
- color: var(--feedback-text) !important;
177
- border-color: var(--feedback-border) !important;
178
- }
179
-
180
- .banner__inner {
181
- max-width: var(--layout-max-width);
182
- margin: 0 auto;
183
- padding: 0 var(--space-6);
184
-
185
- display: flex;
186
- align-items: center;
187
- justify-content: space-between;
188
- gap: var(--feedback-gap);
189
- }
190
-
191
- .banner__text {
192
- font-size: var(--text-sm);
193
- }
194
-
195
- .banner__close {
196
- font-size: var(--text-sm);
197
- cursor: pointer;
198
- opacity: 0.6;
199
- }
200
-
201
- .banner__close:hover {
202
- opacity: 1;
203
- }
204
-
205
- .banner__close:focus-visible {
206
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
207
- outline-offset: var(--focus-ring-offset);
208
- }
209
-
210
- .banner--sticky {
211
- position: sticky;
212
- top: 0;
213
- z-index: var(--z-sticky);
214
- }
215
-
216
- /* ---------------------------------------------------------
217
- 5. TOASTS (ANIMATED + STACK)
218
- --------------------------------------------------------- */
219
-
220
- .feedback-toast {
221
- display: flex;
222
- align-items: center;
223
- gap: var(--feedback-gap);
224
-
225
- padding: var(--feedback-padding-md) var(--feedback-padding-lg);
226
-
227
- border-radius: var(--radius-md);
228
- background-color: var(--color-surface);
229
- border: var(--border-width) solid var(--color-border-subtle);
230
- box-shadow: var(--shadow-2);
231
-
232
- font-size: var(--text-sm);
233
-
234
- opacity: 0;
235
- transform: translateY(6px);
236
- animation: toast-enter var(--transition-normal) forwards;
237
- }
238
-
239
- .feedback-toast[data-variant] {
240
- background-color: var(--feedback-bg) !important;
241
- border-color: var(--feedback-border) !important;
242
- color: var(--feedback-text) !important;
243
- }
244
-
245
- .feedback-toast__icon {
246
- flex-shrink: 0;
247
- width: var(--space-5);
248
- height: var(--space-5);
249
- display: inline-block;
250
- stroke: currentColor;
251
- fill: none;
252
- }
253
-
254
- .feedback-toast__text {
255
- flex: 1 1 auto;
256
- min-width: 0;
257
- }
258
-
259
- .feedback-toast__close {
260
- position: absolute;
261
- top: var(--space-1);
262
- right: var(--space-1);
263
-
264
- width: var(--space-5);
265
- height: var(--space-5);
266
-
267
- cursor: pointer;
268
- opacity: 0.6;
269
- flex-shrink: 0;
270
- }
271
-
272
- .feedback-toast__close:hover {
273
- opacity: 1;
274
- }
275
-
276
- .feedback-toast__close:focus-visible {
277
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
278
- outline-offset: var(--focus-ring-offset);
279
- }
280
-
281
- .feedback-toast__close::before {
282
- content: "×";
283
- position: absolute;
284
- top: 0;
285
- right: 0;
286
- bottom: 0;
287
- left: 0;
288
-
289
- display: flex;
290
- align-items: center;
291
- justify-content: center;
292
-
293
- font-size: var(--text-md);
294
- line-height: 1;
295
- color: currentColor;
296
- }
297
-
298
- .feedback-toast-stack {
299
- position: fixed;
300
- top: var(--space-8);
301
- right: var(--space-8);
302
- display: flex;
303
- flex-direction: column;
304
- gap: var(--space-4);
305
- z-index: var(--z-toast);
306
- }
307
-
308
- .feedback-toast-stack.is-top-right {
309
- top: var(--space-8);
310
- right: var(--space-8);
311
- bottom: auto;
312
- left: auto;
313
- }
314
-
315
- .feedback-toast-stack.is-top-left {
316
- top: var(--space-8);
317
- left: var(--space-8);
318
- bottom: auto;
319
- right: auto;
320
- }
321
-
322
- .feedback-toast-stack.is-bottom-right {
323
- bottom: var(--space-8);
324
- right: var(--space-8);
325
- top: auto;
326
- left: auto;
327
- }
328
-
329
- .feedback-toast-stack.is-bottom-left {
330
- bottom: var(--space-8);
331
- left: var(--space-8);
332
- top: auto;
333
- right: auto;
334
- }
335
-
336
- @keyframes toast-enter {
337
- from {
338
- opacity: 0;
339
- transform: translateY(6px);
340
- }
341
- to {
342
- opacity: 1;
343
- transform: translateY(0);
344
- }
345
- }
346
-
347
- /* ---------------------------------------------------------
348
- 6. INLINE FORM FEEDBACK
349
- --------------------------------------------------------- */
350
-
351
- .form-feedback {
352
- display: flex;
353
- align-items: center;
354
- gap: var(--space-2);
355
-
356
- font-size: var(--text-xs);
357
- color: var(--color-text-muted);
358
- }
359
-
360
- .form-feedback--error {
361
- color: var(--color-error);
362
- }
363
-
364
- .form-feedback--warning {
365
- color: var(--color-warning);
366
- }
367
-
368
- .form-feedback--success {
369
- color: var(--color-success);
370
- }
371
-
372
- .form-feedback--info {
373
- color: var(--color-info);
374
- }
375
-
376
- .input-feedback--error {
377
- border-color: var(--color-error) !important;
378
- }
379
-
380
- .input-feedback--warning {
381
- border-color: var(--color-warning) !important;
382
- }
383
-
384
- .input-feedback--success {
385
- border-color: var(--color-success) !important;
386
- }
387
-
388
- .input-feedback--info {
389
- border-color: var(--color-info) !important;
390
- }
391
-
392
- /* ---------------------------------------------------------
393
- 7. STATUS LABELS (SOLID + OUTLINE + DOT MODE)
394
- --------------------------------------------------------- */
395
-
396
- .status {
397
- display: inline-flex;
398
- align-items: center;
399
- gap: var(--space-1);
400
-
401
- padding: var(--space-1) var(--space-3);
402
- font-size: var(--text-xs);
403
-
404
- border-radius: 999px;
405
- white-space: nowrap;
406
-
407
- background-color: var(--color-muted-bg);
408
- color: var(--color-text);
409
-
410
- align-self: flex-start;
411
- width: -moz-max-content;
412
- width: max-content;
413
- }
414
-
415
- .status[data-variant] {
416
- background-color: var(--feedback-bg) !important;
417
- color: var(--feedback-text) !important;
418
- }
419
-
420
- .status--outline {
421
- background-color: transparent !important;
422
- border: var(--border-width) solid var(--feedback-border) !important;
423
- color: var(--feedback-border) !important;
424
- }
425
-
426
- .status--dot::before {
427
- content: "";
428
- width: var(--space-2);
429
- height: var(--space-2);
430
- border-radius: 999px;
431
- background-color: var(--feedback-border);
432
- }
433
-
434
- /* ---------------------------------------------------------
435
- 8. PROGRESS (SOLID + STRIPED + ANIMATED)
436
- --------------------------------------------------------- */
437
-
438
- .progress {
439
- width: 100%;
440
- height: var(--space-2);
441
- background-color: var(--color-muted-bg);
442
- border-radius: var(--radius-sm);
443
- overflow: hidden;
444
- }
445
-
446
- .progress__bar {
447
- height: 100%;
448
- width: 0;
449
- background-color: var(--color-accent);
450
- transition: width var(--transition-normal);
451
- }
452
-
453
- .progress--striped .progress__bar {
454
- background-image: linear-gradient(
455
- 45deg,
456
- var(--color-accent-soft) 25%,
457
- var(--color-accent) 25%,
458
- var(--color-accent) 50%,
459
- var(--color-accent-soft) 50%,
460
- var(--color-accent-soft) 75%,
461
- var(--color-accent) 75%,
462
- var(--color-accent)
463
- );
464
- background-size: 16px 16px;
465
- }
466
-
467
- .progress--striped.progress--striped__relaxed .progress__bar {
468
- background-size: 24px 24px;
469
- }
470
-
471
- .progress--animated.progress--striped .progress__bar {
472
- animation: progress-stripes 0.3s linear infinite;
473
- will-change: background-position;
474
- }
475
-
476
- .progress--animated.progress--striped__relaxed .progress__bar {
477
- animation: progress-stripes-relaxed 0.3s linear infinite;
478
- will-change: background-position;
479
- }
480
-
481
- @keyframes progress-stripes {
482
- 0% {
483
- background-position: 0 0;
484
- }
485
- 100% {
486
- background-position: 16px 0;
487
- }
488
- }
489
-
490
- @keyframes progress-stripes-relaxed {
491
- 0% {
492
- background-position: 0 0;
493
- }
494
- 100% {
495
- background-position: 24px 0;
496
- }
497
- }
498
-
499
- .progress--animated:not(.progress--striped) .progress__bar {
500
- position: relative;
501
- overflow: hidden;
502
- }
503
-
504
- .progress--animated:not(.progress--striped) .progress__bar::after {
505
- content: "";
506
- position: absolute;
507
- top: 0;
508
- left: -40%;
509
- width: 40%;
510
- height: 100%;
511
- background: linear-gradient(
512
- 90deg,
513
- rgba(255, 255, 255, 0) 0%,
514
- rgba(255, 255, 255, 0.4) 50%,
515
- rgba(255, 255, 255, 0) 100%
516
- );
517
- animation: progress-sheen 1.2s linear infinite;
518
- pointer-events: none;
519
- }
520
-
521
- @keyframes progress-sheen {
522
- from {
523
- transform: translateX(0);
524
- }
525
- to {
526
- transform: translateX(250%);
527
- }
528
- }
529
-
530
- /* ---------------------------------------------------------
531
- 9. INFO BLOCK (SEMANTIC SUPPORT)
532
- --------------------------------------------------------- */
533
-
534
- .info-block {
535
- padding: var(--feedback-padding-md) var(--feedback-padding-lg);
536
- border-left: var(--feedback-info-block-border-width) solid var(--color-accent);
537
- border-radius: var(--radius-sm);
538
- font-size: var(--text-sm);
539
-
540
- background-color: var(--color-surface-subtle);
541
- color: var(--color-text);
542
- }
543
-
544
- .info-block[data-variant] {
545
- background-color: var(--feedback-bg) !important;
546
- border-color: var(--feedback-border) !important;
547
- color: var(--feedback-text) !important;
548
- }
549
-
550
- /* ---------------------------------------------------------
551
- 10. RESULT BLOCK (SEMANTIC SUPPORT)
552
- --------------------------------------------------------- */
553
-
554
- .result {
555
- padding: var(--feedback-padding-lg);
556
- border-radius: var(--radius-md);
557
- border: var(--border-width) solid var(--color-border-subtle);
558
- text-align: center;
559
-
560
- background-color: var(--color-surface);
561
- }
562
-
563
- .result__icon {
564
- width: var(--space-12);
565
- height: var(--space-12);
566
- margin: 0 auto var(--space-4);
567
- stroke: currentColor;
568
- fill: none;
569
- }
570
-
571
- .result__title {
572
- font-size: var(--text-xl);
573
- font-weight: 600;
574
- }
575
-
576
- .result__subtitle {
577
- font-size: var(--text-sm);
578
- color: var(--color-text-muted);
579
- margin-top: var(--space-2);
580
- }
581
-
582
- .result__actions {
583
- margin-top: var(--space-6);
584
- display: flex;
585
- justify-content: center;
586
- gap: var(--space-4);
587
- }
588
-
589
- .result[data-variant] {
590
- border-color: var(--feedback-border) !important;
591
- color: var(--feedback-text) !important;
592
- }
593
-
594
- /* ---------------------------------------------------------
595
- 11. DENSITY MODES
596
- --------------------------------------------------------- */
597
-
598
- [data-density="compact"] .alert,
599
- [data-density="compact"] .feedback-toast,
600
- [data-density="compact"] .banner,
601
- [data-density="compact"] .result,
602
- [data-density="compact"] .info-block {
603
- padding: var(--feedback-padding-md) !important;
604
- }
605
-
606
- [data-density="compact"] .status {
607
- padding: 0 var(--space-2);
608
- }
609
-
610
- [data-density="compact"] .progress {
611
- height: var(--space-1);
612
- }
613
-
614
- [data-density="compact"] .form-feedback {
615
- gap: var(--space-1);
616
- }
617
-
618
- /* ---------------------------------------------------------
619
- 12. RESPONSIVE TIGHTENING
620
- --------------------------------------------------------- */
621
-
622
- @media (max-width: 640px) {
623
- .alert,
624
- .feedback-toast,
625
- .banner,
626
- .result,
627
- .info-block {
628
- padding: var(--feedback-padding-md);
629
- }
630
-
631
- .feedback-toast-stack {
632
- right: var(--space-4);
633
- top: var(--space-4);
634
- }
635
- }
636
-
637
- /* ---------------------------------------------------------
638
- 13. STATIC TOAST (Documentation / In-Flow Demo Only)
639
- Does not float to viewport. Does not autohide.
640
- --------------------------------------------------------- */
641
-
642
- .feedback-toast--static {
643
- position: relative !important;
644
- transform: none !important;
645
- top: auto !important;
646
- right: auto !important;
647
- bottom: auto !important;
648
- left: auto !important;
649
- opacity: 1 !important;
650
- animation: none !important;
651
- }
652
-
653
- .feedback-toast--static {
654
- width: -moz-max-content;
655
- width: max-content;
656
- max-width: 100%;
657
- }
1
+ .vds-feedback,[data-vds-feedback]{--feedback-padding-sm:var(--space-3);--feedback-padding-md:var(--space-4);--feedback-padding-lg:var(--space-6);--feedback-gap:var(--space-3);--feedback-info-block-border-width:var(--border-width-strong)}.feedback[data-variant=info],[data-variant=info]{--feedback-bg:var(--semantic-info-bg-strong,var(--color-info-soft));--feedback-border:var(--semantic-info-border-strong,var(--color-info));--feedback-text:var(--semantic-info-text-strong,var(--color-info-strong))}.feedback[data-variant=success],[data-variant=success]{--feedback-bg:var(--semantic-success-bg-strong,var(--color-success-soft));--feedback-border:var(--semantic-success-border-strong,var(--color-success));--feedback-text:var(--semantic-success-text-strong,var(--color-success-strong))}.feedback[data-variant=warning],[data-variant=warning]{--feedback-bg:var(--semantic-warning-bg-strong,var(--color-warning-soft));--feedback-border:var(--semantic-warning-border-strong,var(--color-warning));--feedback-text:var(--semantic-warning-text-strong,var(--color-warning-strong))}[data-variant=danger]{--feedback-bg:var(--color-danger-soft);--feedback-border:var(--color-danger);--feedback-text:var(--color-danger-strong)}.feedback[data-variant=error],[data-variant=error]{--feedback-bg:var(--semantic-error-bg-strong,var(--color-danger-soft));--feedback-border:var(--semantic-error-border-strong,var(--color-danger));--feedback-text:var(--semantic-error-text-strong,var(--color-danger-strong))}[data-variant=neutral]{--feedback-bg:var(--color-surface-subtle);--feedback-border:var(--color-border-subtle);--feedback-text:var(--color-text)}[data-variant=accent]{--feedback-bg:var(--color-accent-soft);--feedback-border:var(--color-accent);--feedback-text:var(--color-on-accent)}.alert{align-items:flex-start;background-color:var(--color-muted-bg);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);color:var(--color-text);display:flex;font-size:var(--text-sm);gap:var(--feedback-gap);padding:var(--feedback-padding-lg)}.alert[data-variant]{background-color:var(--feedback-bg)!important;border-color:var(--feedback-border)!important;color:var(--feedback-text)!important}.alert__icon{align-items:center;display:flex;flex-shrink:0;height:var(--space-5);justify-content:center;width:var(--space-5)}.alert__icon>*{display:block;height:100%;width:100%}.alert__content{display:flex;flex-direction:column;gap:var(--space-2)}.alert__title{font-size:var(--text-sm);font-weight:600}.alert__message{font-size:var(--text-sm);opacity:.95}.alert__close{cursor:pointer;font-size:var(--text-sm);margin-left:auto;opacity:.6}.alert__close:hover{opacity:1}.alert__close:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.alert--outline{background-color:transparent!important;border-color:var(--feedback-border)!important;color:var(--feedback-border)!important}.banner{background-color:var(--color-surface-subtle);border-bottom:var(--border-width) solid var(--color-border-subtle);color:var(--color-text);padding:var(--feedback-padding-md) 0;width:100%}.banner[data-variant]{background-color:var(--feedback-bg)!important;border-color:var(--feedback-border)!important;color:var(--feedback-text)!important}.banner__inner{align-items:center;display:flex;gap:var(--feedback-gap);justify-content:space-between;margin:0 auto;max-width:var(--layout-max-width);padding:0 var(--space-6)}.banner__close,.banner__text{font-size:var(--text-sm)}.banner__close{cursor:pointer;opacity:.6}.banner__close:hover{opacity:1}.banner__close:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.banner--sticky{position:sticky;top:0;z-index:var(--z-sticky)}.feedback-toast{align-items:center;animation:toast-enter var(--transition-normal) forwards;background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-2);display:flex;font-size:var(--text-sm);gap:var(--feedback-gap);opacity:0;padding:var(--feedback-padding-md) var(--feedback-padding-lg);transform:translateY(6px)}.feedback-toast[data-variant]{background-color:var(--feedback-bg)!important;border-color:var(--feedback-border)!important;color:var(--feedback-text)!important}.feedback-toast__icon{stroke:currentColor;fill:none;display:inline-block;flex-shrink:0;height:var(--space-5);width:var(--space-5)}.feedback-toast__text{flex:1 1 auto;min-width:0}.feedback-toast__close{cursor:pointer;flex-shrink:0;height:var(--space-5);opacity:.6;position:absolute;right:var(--space-1);top:var(--space-1);width:var(--space-5)}.feedback-toast__close:hover{opacity:1}.feedback-toast__close:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.feedback-toast__close:before{align-items:center;bottom:0;color:currentColor;content:"×";display:flex;font-size:var(--text-md);justify-content:center;left:0;line-height:1;position:absolute;right:0;top:0}.feedback-toast-stack{display:flex;flex-direction:column;gap:var(--space-4);position:fixed;right:var(--space-8);top:var(--space-8);z-index:var(--z-toast)}.feedback-toast-stack.is-top-right{bottom:auto;left:auto;right:var(--space-8);top:var(--space-8)}.feedback-toast-stack.is-top-left{bottom:auto;left:var(--space-8);right:auto;top:var(--space-8)}.feedback-toast-stack.is-bottom-right{bottom:var(--space-8);left:auto;right:var(--space-8);top:auto}.feedback-toast-stack.is-bottom-left{bottom:var(--space-8);left:var(--space-8);right:auto;top:auto}@keyframes toast-enter{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.form-feedback{align-items:center;color:var(--color-text-muted);display:flex;font-size:var(--text-xs);gap:var(--space-2)}.form-feedback--error{color:var(--color-error)}.form-feedback--warning{color:var(--color-warning)}.form-feedback--success{color:var(--color-success)}.form-feedback--info{color:var(--color-info)}.input-feedback--error{border-color:var(--color-error)!important}.input-feedback--warning{border-color:var(--color-warning)!important}.input-feedback--success{border-color:var(--color-success)!important}.input-feedback--info{border-color:var(--color-info)!important}.status{align-items:center;align-self:flex-start;background-color:var(--color-muted-bg);border-radius:999px;color:var(--color-text);display:inline-flex;font-size:var(--text-xs);gap:var(--space-1);padding:var(--space-1) var(--space-3);white-space:nowrap;width:-moz-max-content;width:max-content}.status[data-variant]{background-color:var(--feedback-bg)!important;color:var(--feedback-text)!important}.status--outline{background-color:transparent!important;border:var(--border-width) solid var(--feedback-border)!important;color:var(--feedback-border)!important}.status--dot:before{background-color:var(--feedback-border);border-radius:999px;content:"";height:var(--space-2);width:var(--space-2)}.progress{background-color:var(--color-muted-bg);border-radius:var(--radius-sm);height:var(--space-2);overflow:hidden;width:100%}.progress__bar{background-color:var(--color-accent);height:100%;transition:width var(--transition-normal);width:0}.progress--striped .progress__bar{background-image:linear-gradient(45deg,var(--color-accent-soft) 25%,var(--color-accent) 25%,var(--color-accent) 50%,var(--color-accent-soft) 50%,var(--color-accent-soft) 75%,var(--color-accent) 75%,var(--color-accent));background-size:16px 16px}.progress--striped.progress--striped__relaxed .progress__bar{background-size:24px 24px}.progress--animated.progress--striped .progress__bar{animation:progress-stripes .3s linear infinite;will-change:background-position}.progress--animated.progress--striped__relaxed .progress__bar{animation:progress-stripes-relaxed .3s linear infinite;will-change:background-position}@keyframes progress-stripes{0%{background-position:0 0}to{background-position:16px 0}}@keyframes progress-stripes-relaxed{0%{background-position:0 0}to{background-position:24px 0}}.progress--animated:not(.progress--striped) .progress__bar{overflow:hidden;position:relative}.progress--animated:not(.progress--striped) .progress__bar:after{animation:progress-sheen 1.2s linear infinite;background:linear-gradient(90deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.4) 50%,hsla(0,0%,100%,0));content:"";height:100%;left:-40%;pointer-events:none;position:absolute;top:0;width:40%}@keyframes progress-sheen{0%{transform:translateX(0)}to{transform:translateX(250%)}}.info-block{background-color:var(--color-surface-subtle);border-left:var(--feedback-info-block-border-width) solid var(--color-accent);border-radius:var(--radius-sm);color:var(--color-text);font-size:var(--text-sm);padding:var(--feedback-padding-md) var(--feedback-padding-lg)}.info-block[data-variant]{background-color:var(--feedback-bg)!important;border-color:var(--feedback-border)!important;color:var(--feedback-text)!important}.result{background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);padding:var(--feedback-padding-lg);text-align:center}.result__icon{stroke:currentColor;fill:none;height:var(--space-12);margin:0 auto var(--space-4);width:var(--space-12)}.result__title{font-size:var(--text-xl);font-weight:600}.result__subtitle{color:var(--color-text-muted);font-size:var(--text-sm);margin-top:var(--space-2)}.result__actions{display:flex;gap:var(--space-4);justify-content:center;margin-top:var(--space-6)}.result[data-variant]{border-color:var(--feedback-border)!important;color:var(--feedback-text)!important}[data-density=compact] .alert,[data-density=compact] .banner,[data-density=compact] .feedback-toast,[data-density=compact] .info-block,[data-density=compact] .result{padding:var(--feedback-padding-md)!important}[data-density=compact] .status{padding:0 var(--space-2)}[data-density=compact] .progress{height:var(--space-1)}[data-density=compact] .form-feedback{gap:var(--space-1)}@media (max-width:640px){.alert,.banner,.feedback-toast,.info-block,.result{padding:var(--feedback-padding-md)}.feedback-toast-stack{right:var(--space-4);top:var(--space-4)}}.feedback-toast--static{animation:none!important;bottom:auto!important;left:auto!important;max-width:100%;opacity:1!important;position:relative!important;right:auto!important;top:auto!important;transform:none!important;width:-moz-max-content;width:max-content}