@24vlh/vds 0.1.2 → 0.1.4

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 (37) hide show
  1. package/dist/components/accordion.css +170 -170
  2. package/dist/components/authoring.css +332 -332
  3. package/dist/components/buttons.css +683 -683
  4. package/dist/components/charts.css +502 -502
  5. package/dist/components/command.css +520 -520
  6. package/dist/components/content-blocks.css +944 -944
  7. package/dist/components/doc-block.css +782 -782
  8. package/dist/components/feedback.css +657 -657
  9. package/dist/components/flows.css +1101 -1101
  10. package/dist/components/forms-advanced.css +462 -462
  11. package/dist/components/forms.css +627 -1831
  12. package/dist/components/forms.min.css +1 -1
  13. package/dist/components/header-footer.css +348 -348
  14. package/dist/components/hero.css +498 -498
  15. package/dist/components/icons.css +937 -937
  16. package/dist/components/icons.min.css +1 -1
  17. package/dist/components/inbox.css +1228 -0
  18. package/dist/components/inbox.min.css +1 -0
  19. package/dist/components/navigation.css +900 -900
  20. package/dist/components/overlays.css +498 -498
  21. package/dist/components/sections.css +450 -450
  22. package/dist/components/skeleton.css +385 -385
  23. package/dist/components/tables.css +591 -591
  24. package/dist/components/tabs.css +307 -307
  25. package/dist/components/toasts.css +421 -421
  26. package/dist/components/tooltips-popovers.css +447 -447
  27. package/dist/components/typography.css +250 -250
  28. package/dist/components/utilities.css +3433 -3433
  29. package/dist/core.css +866 -866
  30. package/dist/identity.css +266 -266
  31. package/dist/themes/carbon.css +658 -658
  32. package/dist/themes/graphite.css +658 -658
  33. package/dist/themes/navy.css +657 -657
  34. package/dist/themes/slate.css +659 -659
  35. package/dist/vds.css +19009 -20312
  36. package/dist/vds.min.css +1 -1
  37. package/package.json +3 -2
@@ -1,657 +1,657 @@
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
+ /************************************************************
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
+ }