@24vlh/vds 0.1.2 → 0.1.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 (35) 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/navigation.css +900 -900
  18. package/dist/components/overlays.css +498 -498
  19. package/dist/components/sections.css +450 -450
  20. package/dist/components/skeleton.css +385 -385
  21. package/dist/components/tables.css +591 -591
  22. package/dist/components/tabs.css +307 -307
  23. package/dist/components/toasts.css +421 -421
  24. package/dist/components/tooltips-popovers.css +447 -447
  25. package/dist/components/typography.css +250 -250
  26. package/dist/components/utilities.css +3433 -3433
  27. package/dist/core.css +866 -866
  28. package/dist/identity.css +266 -266
  29. package/dist/themes/carbon.css +658 -658
  30. package/dist/themes/graphite.css +658 -658
  31. package/dist/themes/navy.css +657 -657
  32. package/dist/themes/slate.css +659 -659
  33. package/dist/vds.css +19009 -20312
  34. package/dist/vds.min.css +1 -1
  35. package/package.json +3 -2
@@ -1,944 +1,944 @@
1
- /************************************************************
2
- * VLAH DESIGN SYSTEM (VDS) - Content Blocks
3
- *
4
- * Responsibilities:
5
- * - Define the structural building blocks of the UI: cards, media blocks,
6
- * list groups, callouts, empty states, stats, metric titles, tags/chips/badges,
7
- * avatars, features, processes, highlights, fact blocks, and content blocks
8
- * - Provide consistent, token-driven spacing, radii, borders, shadows, and
9
- * interaction patterns across all content surfaces
10
- * - Expose semantic and interactive variants for blocks, tags, callouts, and
11
- * process steps
12
- * - Enable layout-neutral composition while supporting grid, stack, inline,
13
- * horizontal, and compact patterns
14
- *
15
- * System Notes:
16
- * - Pure CSS; no behavioural assumptions or JavaScript dependencies
17
- * - Fully theme-driven: all tokens derive from primitives + active theme
18
- * - All interactive states use shared VDS focus, hover, and selected patterns
19
- ************************************************************/
20
-
21
- /* ---------------------------------------------------------
22
- 1. CONTENT BLOCK TOKEN DEFINITIONS
23
- --------------------------------------------------------- */
24
-
25
- [data-vds-content-block],
26
- .vds-content-block {
27
- --content-block-tag-size-sm: var(--space-4);
28
- --content-block-tag-size-md: var(--space-5);
29
- --content-block-tag-size-lg: var(--space-6);
30
- --content-block-component-disabled--opacity: 0.3;
31
-
32
-
33
- --content-block-component-pad-sm: var(--space-3);
34
- --content-block-component-pad-md: var(--space-6);
35
- --content-block-component-pad-lg: var(--space-8);
36
-
37
- --content-block-component-border-sm: var(--border-width);
38
-
39
- --content-block-card-min-width: 16.25rem;
40
-
41
- --content-block-card-gap: var(--space-4);
42
- --content-block-card-pad: var(--space-8);
43
- --content-block-card-pad-mobile: var(--space-6);
44
-
45
- --content-block-fact-pad: var(--space-10);
46
-
47
- --content-block-process-gap: var(--space-10);
48
- --content-block-process-step-min-width: 15rem;
49
-
50
- --content-block-media-gap: var(--space-6);
51
-
52
- --content-block-empty-pad-vertical: var(--space-14);
53
- --content-block-empty-pad-horizontal: var(--space-6);
54
-
55
- --content-block-empty-gap: var(--space-4);
56
-
57
- --content-block-highlight-border-width: var(--border-width-strong);
58
- --content-block-highlight-pad: var(--space-6);
59
- }
60
-
61
- /* ---------------------------------------------------------
62
- 2. GENERIC INTERACTIVE / DISABLED
63
- --------------------------------------------------------- */
64
-
65
- .interactive {
66
- cursor: pointer;
67
- transition: background-color var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal), color var(--transition-normal);
68
- }
69
-
70
- .interactive:hover {
71
- background-color: var(--color-surface-hover);
72
- border-color: var(--color-border-strong);
73
- }
74
-
75
- .interactive:active {
76
- background-color: var(--color-surface-subtle);
77
- }
78
-
79
- .interactive:focus-visible {
80
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
81
- outline-offset: var(--focus-ring-offset);
82
- }
83
-
84
- .is-disabled {
85
- opacity: 0.5;
86
- opacity: var(--content-block-component-disabled--opacity, 0.5);
87
- cursor: not-allowed;
88
- pointer-events: none;
89
- }
90
-
91
- /* ---------------------------------------------------------
92
- 3. CARD
93
- --------------------------------------------------------- */
94
-
95
- .card {
96
- background-color: var(--color-surface);
97
- border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
98
- border-radius: var(--radius-md);
99
- padding: var(--content-block-card-pad);
100
- display: flex;
101
- flex-direction: column;
102
- gap: var(--content-block-card-gap);
103
- box-shadow: var(--shadow-1);
104
- transition: background-color var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal);
105
- }
106
-
107
- .card--soft {
108
- background-color: var(--color-surface-subtle);
109
- }
110
-
111
- .card--muted {
112
- background-color: var(--color-muted-bg);
113
- }
114
-
115
- .card--tone-accent {
116
- background-color: var(--color-accent-soft);
117
- }
118
-
119
- @media (max-width: 640px) {
120
- .card {
121
- padding: var(--content-block-card-pad-mobile);
122
- }
123
- }
124
-
125
- .card--flat {
126
- box-shadow: none;
127
- }
128
-
129
- .card--raised {
130
- box-shadow: var(--shadow-2);
131
- }
132
-
133
- .card--interactive {
134
- cursor: pointer;
135
- }
136
-
137
- .card--interactive:hover {
138
- background-color: var(--color-surface-hover);
139
- border-color: var(--color-border-strong);
140
- box-shadow: var(--shadow-2);
141
- }
142
-
143
- .card--interactive:active {
144
- background-color: var(--color-surface-subtle);
145
- }
146
-
147
- .card--interactive:focus-visible {
148
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
149
- outline-offset: var(--focus-ring-offset);
150
- }
151
-
152
- .card--selected {
153
- border-color: var(--color-accent);
154
- box-shadow: var(--shadow-2);
155
- }
156
-
157
- .card--disabled {
158
- opacity: 0.5;
159
- opacity: var(--content-block-component-disabled--opacity, 0.5);
160
- cursor: not-allowed;
161
- pointer-events: none;
162
- }
163
-
164
- .card__header,
165
- .card__body {
166
- width: 100%;
167
- }
168
-
169
- .card__footer {
170
- margin-top: var(--component-gap-lg);
171
- display: flex;
172
- gap: var(--component-gap-md);
173
- justify-content: flex-end;
174
- }
175
-
176
- .card__section-stack,
177
- .card__body-stack,
178
- .card__header-stack {
179
- display: flex;
180
- flex-direction: column;
181
- gap: var(--component-gap-md);
182
- }
183
-
184
- .card__section-inline,
185
- .card__body-inline,
186
- .card__footer-inline {
187
- display: flex;
188
- flex-wrap: wrap;
189
- gap: var(--component-gap-md);
190
- align-items: flex-start;
191
- }
192
-
193
- /* ---------------------------------------------------------
194
- 4. CARD GRID
195
- --------------------------------------------------------- */
196
-
197
- .card-grid {
198
- display: grid;
199
- grid-template-columns: repeat(auto-fit, minmax(var(--content-block-card-min-width), 1fr));
200
- grid-gap: var(--component-gap-lg);
201
- gap: var(--component-gap-lg);
202
- }
203
-
204
- .card-grid--compact {
205
- gap: var(--component-gap-md);
206
- }
207
-
208
- .card-grid--tight {
209
- gap: var(--component-gap-xs);
210
- }
211
-
212
- .card-grid--wide {
213
- gap: var(--component-gap-xl);
214
- }
215
-
216
- /* ---------------------------------------------------------
217
- 5. MEDIA BLOCK
218
- --------------------------------------------------------- */
219
-
220
- .media {
221
- display: flex;
222
- align-items: center;
223
- gap: var(--content-block-media-gap);
224
- }
225
-
226
- .media--stack {
227
- flex-direction: column;
228
- align-items: flex-start;
229
- }
230
-
231
- .media--horizontal {
232
- flex-direction: row;
233
- align-items: center;
234
- }
235
-
236
- .media--interactive {
237
- cursor: pointer;
238
- transition: background-color var(--transition-normal);
239
- }
240
-
241
- .media--interactive:hover {
242
- background-color: var(--color-surface-hover);
243
- }
244
-
245
- @media (max-width: 768px) {
246
- .media {
247
- flex-direction: column;
248
- align-items: flex-start;
249
- }
250
- }
251
-
252
- .media__img,
253
- .media__icon {
254
- width: var(--icon-container-lg);
255
- height: var(--icon-container-lg);
256
- flex-shrink: 0;
257
-
258
- display: flex;
259
- align-items: center;
260
- justify-content: center;
261
- }
262
-
263
- .media__img img,
264
- .media__icon svg {
265
- width: 100%;
266
- height: 100%;
267
- -o-object-fit: contain;
268
- object-fit: contain;
269
- border-radius: var(--radius-sm);
270
- }
271
-
272
- .media__icon .icon {
273
- width: 100%;
274
- height: 100%;
275
- display: block;
276
- }
277
-
278
- .media__body {
279
- display: flex;
280
- flex-direction: column;
281
- gap: var(--component-gap-xs);
282
- }
283
-
284
- .media__meta {
285
- font-size: var(--text-xs);
286
- color: var(--color-text-muted);
287
- }
288
-
289
- /* ---------------------------------------------------------
290
- 6. LIST GROUP
291
- --------------------------------------------------------- */
292
-
293
- .list-group {
294
- display: flex;
295
- flex-direction: column;
296
- gap: var(--component-gap-xs);
297
- }
298
-
299
- .list-group__item {
300
- display: flex;
301
- gap: var(--component-gap-md);
302
- padding: var(--component-gap-md) 0;
303
- border-bottom: var(--content-block-component-border-sm) solid var(--color-border-subtle);
304
- }
305
-
306
- .list-group__item:last-child {
307
- border-bottom: none;
308
- }
309
-
310
- .list-group--borderless .list-group__item {
311
- border-bottom: none;
312
- }
313
-
314
- .list-group--tight .list-group__item {
315
- padding: var(--component-gap-xs) 0;
316
- }
317
-
318
- .list-group__item--interactive {
319
- cursor: pointer;
320
- transition: background-color var(--transition-normal);
321
- }
322
-
323
- .list-group__item--interactive:hover {
324
- background-color: var(--color-surface-hover);
325
- }
326
-
327
- .list-group__item--interactive:focus-visible {
328
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
329
- outline-offset: var(--focus-ring-offset);
330
- }
331
-
332
- .list-group__item--selected {
333
- background-color: var(--accent-soft-surface, var(--color-accent-soft));
334
- border-left-color: var(--accent-soft-border, var(--color-accent));
335
- box-shadow: 0 0 0 1px transparent;
336
- box-shadow: 0 0 0 1px var(--accent-soft-shadow, transparent);
337
- color: var(--accent-soft-on, var(--color-on-accent));
338
- }
339
-
340
- .list-group__item--disabled {
341
- opacity: var(--content-block-component-disabled--opacity);
342
- cursor: not-allowed;
343
- pointer-events: none;
344
- }
345
-
346
- /* ---------------------------------------------------------
347
- 7. CALLOUTS (Semantic Variants)
348
- --------------------------------------------------------- */
349
-
350
- .callout {
351
- border-radius: var(--radius-md);
352
- padding: var(--content-block-component-pad-md);
353
- border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
354
- background-color: var(--color-muted-bg);
355
- }
356
-
357
- .callout--compact {
358
- padding: var(--content-block-component-pad-sm);
359
- }
360
-
361
- .callout--outline {
362
- background-color: var(--color-surface);
363
- border-color: var(--color-border-strong);
364
- }
365
-
366
- .callout--minimal {
367
- background-color: transparent;
368
- border-color: transparent;
369
- }
370
-
371
- .callout__title {
372
- font-size: var(--text-sm);
373
- font-weight: 600;
374
- }
375
-
376
- .callout__body {
377
- margin-top: var(--component-gap-xs);
378
- }
379
-
380
- .callout__icon {
381
- margin-bottom: var(--component-gap-xs);
382
- }
383
-
384
- .callout--interactive {
385
- cursor: pointer;
386
- transition: background-color var(--transition-normal), border-color var(--transition-normal);
387
- }
388
-
389
- .callout--interactive:hover {
390
- background: color-mix(in srgb, currentColor 10%, transparent);
391
- }
392
-
393
- .callout--interactive:focus-visible {
394
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
395
- outline-offset: var(--focus-ring-offset);
396
- }
397
-
398
- .semantic-info {
399
- background-color: var(--semantic-info-bg);
400
- border-color: var(--semantic-info-border);
401
- color: var(--semantic-info-text);
402
- }
403
-
404
- .semantic-success {
405
- background-color: var(--semantic-success-bg);
406
- border-color: var(--semantic-success-border);
407
- color: var(--semantic-success-text);
408
- }
409
-
410
- .semantic-warning {
411
- background-color: var(--semantic-warning-bg);
412
- border-color: var(--semantic-warning-border);
413
- color: var(--semantic-warning-text);
414
- }
415
-
416
- .semantic-danger {
417
- background-color: var(--semantic-danger-bg);
418
- border-color: var(--semantic-danger-border);
419
- color: var(--semantic-danger-text);
420
- }
421
-
422
- /* ---------------------------------------------------------
423
- 8. EMPTY STATE
424
- --------------------------------------------------------- */
425
-
426
- .empty {
427
- text-align: center;
428
- background-color: var(--color-surface);
429
- border-radius: var(--radius-md);
430
- border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
431
- padding: var(--content-block-empty-pad-vertical) var(--content-block-empty-pad-horizontal);
432
- }
433
-
434
- .empty--compact {
435
- padding: var(--content-block-component-pad-md);
436
- }
437
-
438
- .empty--inline {
439
- display: inline-flex;
440
- align-items: center;
441
- text-align: left;
442
- }
443
-
444
- .empty__icon {
445
- width: var(--space-16);
446
- height: var(--space-16);
447
- margin: 0 auto var(--content-block-empty-gap);
448
- stroke: var(--color-text-muted);
449
-
450
- display: flex;
451
- align-items: center;
452
- justify-content: center;
453
- }
454
-
455
- .empty--inline .empty__icon {
456
- margin: 0 var(--component-gap-md) 0 0;
457
- }
458
-
459
- .empty__icon .icon {
460
- width: 100%;
461
- height: 100%;
462
- display: block;
463
- }
464
-
465
- .empty__actions {
466
- margin-top: var(--component-gap-lg);
467
- display: flex;
468
- justify-content: center;
469
- gap: var(--component-gap-md);
470
- }
471
-
472
- /* ---------------------------------------------------------
473
- 9. STATS BLOCK
474
- --------------------------------------------------------- */
475
-
476
- .stats {
477
- display: flex;
478
- flex-wrap: wrap;
479
- gap: var(--component-gap-xl);
480
- }
481
-
482
- @media (max-width: 768px) {
483
- .stats {
484
- gap: var(--component-gap-lg);
485
- }
486
- }
487
-
488
- .stats__item {
489
- display: flex;
490
- flex-direction: column;
491
- gap: var(--component-gap-xs);
492
- }
493
-
494
- .stats--center .stats__item {
495
- align-items: center;
496
- }
497
-
498
- .stats__value {
499
- font-size: var(--text-lg);
500
- font-weight: 600;
501
- color: var(--color-text);
502
- }
503
-
504
- .stats__label {
505
- font-size: var(--text-xs);
506
- color: var(--color-text-muted);
507
- }
508
-
509
- /* ---------------------------------------------------------
510
- 10. METRIC TITLE
511
- --------------------------------------------------------- */
512
-
513
- .metric-title {
514
- font-size: var(--text-xs);
515
- letter-spacing: 0.04em;
516
- text-transform: uppercase;
517
- font-weight: 600;
518
- color: var(--color-text-muted);
519
- }
520
-
521
- /* ---------------------------------------------------------
522
- 11. TAGS / CHIPS / BADGES + INTERACTIVE
523
- --------------------------------------------------------- */
524
-
525
- .tag,
526
- .chip,
527
- .badge {
528
- display: inline-flex;
529
- align-items: center;
530
- gap: var(--component-gap-xs);
531
- padding: var(--component-gap-sm) var(--component-gap-md);
532
- height: var(--content-block-tag-size-md);
533
- font-size: var(--text-xs);
534
- border-radius: 9999px;
535
- border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
536
- background-color: var(--color-surface);
537
- color: var(--color-text);
538
- }
539
-
540
- .tag--sm,
541
- .chip--sm,
542
- .badge--sm {
543
- height: var(--content-block-tag-size-sm);
544
- }
545
-
546
- .tag--lg,
547
- .chip--lg,
548
- .badge--lg {
549
- height: var(--content-block-tag-size-lg);
550
- }
551
-
552
- .tag--soft,
553
- .chip--soft,
554
- .badge--soft {
555
- background-color: var(--color-surface-subtle);
556
- }
557
-
558
- .tag--outline,
559
- .chip--outline,
560
- .badge--outline {
561
- background-color: transparent;
562
- border-color: var(--color-border-strong);
563
- }
564
-
565
- .tag--interactive,
566
- .chip--interactive,
567
- .badge--interactive {
568
- cursor: pointer;
569
- transition: background-color var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast);
570
- }
571
-
572
- .tag--interactive:hover,
573
- .chip--interactive:hover,
574
- .badge--interactive:hover {
575
- background-color: var(--color-surface-hover);
576
- border-color: var(--color-border-strong);
577
- }
578
-
579
- .tag--interactive:focus-visible,
580
- .chip--interactive:focus-visible,
581
- .badge--interactive:focus-visible {
582
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
583
- outline-offset: var(--focus-ring-offset);
584
- }
585
-
586
- .tag--disabled,
587
- .chip--disabled,
588
- .badge--disabled {
589
- opacity: 0.5;
590
- opacity: var(--content-block-component-disabled--opacity, 0.5);
591
- cursor: not-allowed;
592
- pointer-events: none;
593
- }
594
-
595
- .tag.semantic-info,
596
- .chip.semantic-info,
597
- .badge.semantic-info {
598
- background-color: var(--semantic-info-bg);
599
- color: var(--semantic-info-text);
600
- }
601
-
602
- .tag.semantic-warning,
603
- .chip.semantic-warning,
604
- .badge.semantic-warning {
605
- background-color: var(--semantic-warning-bg);
606
- color: var(--semantic-warning-text);
607
- }
608
-
609
- .tag.semantic-success,
610
- .chip.semantic-success,
611
- .badge.semantic-success {
612
- background-color: var(--semantic-success-bg);
613
- color: var(--semantic-success-text);
614
- }
615
-
616
- .tag.semantic-danger,
617
- .chip.semantic-danger,
618
- .badge.semantic-danger {
619
- background-color: var(--semantic-danger-bg);
620
- color: var(--semantic-danger-text);
621
- }
622
-
623
- /* ---------------------------------------------------------
624
- 12. AVATAR + STATUS
625
- --------------------------------------------------------- */
626
-
627
- .avatar {
628
- position: relative;
629
- width: var(--avatar-size-md);
630
- height: var(--avatar-size-md);
631
- border-radius: 50%;
632
- overflow: hidden;
633
- display: inline-flex;
634
- align-items: center;
635
- justify-content: center;
636
- background-color: var(--color-muted-bg);
637
- }
638
-
639
- .avatar--sm {
640
- width: var(--avatar-size-sm);
641
- height: var(--avatar-size-sm);
642
- }
643
-
644
- .avatar--lg {
645
- width: var(--avatar-size-lg);
646
- height: var(--avatar-size-lg);
647
- }
648
-
649
- .avatar--status::after {
650
- content: "";
651
- position: absolute;
652
- width: var(--avatar-status-size);
653
- height: var(--avatar-status-size);
654
- border-radius: 50%;
655
- background-color: var(--color-success);
656
- border: var(--border-width) solid var(--color-surface);
657
- bottom: 0;
658
- right: 0;
659
- }
660
-
661
- /* ---------------------------------------------------------
662
- 13. FEATURE BLOCK
663
- --------------------------------------------------------- */
664
-
665
- .feature {
666
- display: flex;
667
- flex-direction: column;
668
- gap: var(--component-gap-xs);
669
- }
670
-
671
- .feature--horizontal {
672
- flex-direction: row;
673
- align-items: center;
674
- }
675
-
676
- .feature__icon {
677
- width: var(--icon-container-lg);
678
- height: var(--icon-container-lg);
679
- flex-shrink: 0;
680
-
681
- display: flex;
682
- align-items: center;
683
- justify-content: center;
684
- }
685
-
686
- .feature__icon .icon {
687
- width: 100%;
688
- height: 100%;
689
- display: block;
690
- }
691
-
692
- .feature--interactive {
693
- cursor: pointer;
694
- transition: background-color var(--transition-normal);
695
- }
696
-
697
- .feature--interactive:hover {
698
- background-color: var(--color-surface-hover);
699
- }
700
-
701
- .feature--interactive:focus-visible {
702
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
703
- outline-offset: var(--focus-ring-offset);
704
- }
705
-
706
- @media (max-width: 640px) {
707
- .feature--horizontal {
708
- flex-direction: column;
709
- align-items: flex-start;
710
- }
711
- }
712
-
713
- /* ---------------------------------------------------------
714
- 14. PROCESS BLOCK
715
- --------------------------------------------------------- */
716
-
717
- .process {
718
- display: grid;
719
- grid-template-columns: repeat(auto-fit, minmax(var(--content-block-process-step-min-width), 1fr));
720
- grid-gap: var(--content-block-process-gap);
721
- gap: var(--content-block-process-gap);
722
- }
723
-
724
- @media (max-width: 768px) {
725
- .process {
726
- gap: var(--component-gap-lg);
727
- }
728
- }
729
-
730
- .process__step {
731
- display: flex;
732
- flex-direction: column;
733
- gap: var(--component-gap-md);
734
- padding: var(--content-block-component-pad-md);
735
- border-radius: var(--radius-md);
736
- background-color: var(--color-surface);
737
- border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
738
- color: var(--color-text);
739
- }
740
-
741
- .process__step--active {
742
- background-color: var(--accent-soft-surface);
743
- border-color: var(--accent-soft-border);
744
- color: var(--accent-soft-on);
745
- }
746
-
747
- .process__step--complete {
748
- background-color: var(--success-soft-surface);
749
- border-color: var(--success-soft-border);
750
- color: var(--success-soft-on);
751
- }
752
-
753
- .process__step--disabled {
754
- opacity: var(--content-block-component-disabled--opacity);
755
- cursor: not-allowed;
756
- pointer-events: none;
757
- }
758
-
759
- /* ---------------------------------------------------------
760
- 15. HIGHLIGHT BLOCK
761
- --------------------------------------------------------- */
762
-
763
- .highlight {
764
- background-color: var(--color-surface-subtle);
765
- border-left: var(--content-block-highlight-border-width) solid var(--color-accent);
766
- padding: var(--content-block-highlight-pad);
767
- border-radius: var(--radius-sm);
768
- }
769
-
770
- .highlight--compact {
771
- padding: var(--content-block-component-pad-sm);
772
- }
773
-
774
- .highlight--info {
775
- border-color: var(--semantic-info-border);
776
- background-color: var(--semantic-info-bg);
777
- }
778
-
779
- .highlight--success {
780
- border-color: var(--semantic-success-border);
781
- background-color: var(--semantic-success-bg);
782
- }
783
-
784
- .highlight--warning {
785
- border-color: var(--semantic-warning-border);
786
- background-color: var(--semantic-warning-bg);
787
- }
788
-
789
- .highlight--danger {
790
- border-color: var(--semantic-danger-border);
791
- background-color: var(--semantic-danger-bg);
792
- }
793
-
794
- /* ---------------------------------------------------------
795
- 16. FACT BLOCK
796
- --------------------------------------------------------- */
797
-
798
- .fact {
799
- text-align: center;
800
- background-color: var(--color-surface);
801
- border-radius: var(--radius-md);
802
- border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
803
- padding: var(--content-block-fact-pad);
804
- }
805
-
806
- .fact--horizontal {
807
- text-align: left;
808
- display: flex;
809
- align-items: center;
810
- justify-content: center;
811
- gap: var(--component-gap-lg);
812
- }
813
-
814
- .fact--compact {
815
- padding: var(--content-block-component-pad-md);
816
- }
817
-
818
- .fact--interactive {
819
- cursor: pointer;
820
- transition: background-color var(--transition-normal), border-color var(--transition-normal);
821
- }
822
-
823
- .fact--interactive:hover {
824
- background-color: var(--color-surface-hover);
825
- border-color: var(--color-border-strong);
826
- }
827
-
828
- .fact--interactive:focus-visible {
829
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
830
- outline-offset: var(--focus-ring-offset);
831
- }
832
-
833
- .fact--disabled {
834
- opacity: 0.5;
835
- opacity: var(--content-block-component-disabled--opacity, 0.5);
836
- cursor: not-allowed;
837
- pointer-events: none;
838
- }
839
-
840
- /* ---------------------------------------------------------
841
- 17. CONTENT BLOCK (NEW STRUCTURAL BLOCK)
842
- --------------------------------------------------------- */
843
-
844
- .content-block {
845
- display: flex;
846
- flex-direction: column;
847
- gap: var(--component-gap-md);
848
- width: 100%;
849
- }
850
-
851
- .content-block--surface {
852
- background-color: var(--color-surface);
853
- border-radius: var(--radius-md);
854
- border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
855
- padding: var(--content-block-component-pad-lg);
856
- box-shadow: var(--shadow-1);
857
- }
858
-
859
- .content-block--inset {
860
- background-color: var(--color-surface-subtle);
861
- border-radius: var(--radius-md);
862
- padding: var(--content-block-component-pad-md);
863
- }
864
-
865
- .content-block--compact {
866
- gap: var(--component-gap-xs);
867
- }
868
-
869
- .content-block--surface.content-block--compact {
870
- padding: var(--content-block-component-pad-md);
871
- }
872
-
873
- .content-block--inset.content-block--compact {
874
- padding: var(--content-block-component-pad-sm);
875
- }
876
-
877
- .content-block--bordered {
878
- border: var(--content-block-component-border-sm) solid var(--color-border-strong);
879
- }
880
-
881
- /* ---------------------------------------------------------
882
- 17.1 CONTENT BLOCK - REGIONS
883
- --------------------------------------------------------- */
884
-
885
- .content-block__header {
886
- display: flex;
887
- flex-direction: column;
888
- gap: var(--component-gap-xs);
889
- }
890
-
891
- .content-block__body {
892
- display: flex;
893
- flex-direction: column;
894
- gap: var(--component-gap-md);
895
- }
896
-
897
- .content-block__media {
898
- width: 100%;
899
- display: flex;
900
- align-items: center;
901
- justify-content: center;
902
- }
903
-
904
- .content-block__media img,
905
- .content-block__media svg,
906
- .content-block__media picture {
907
- max-width: 100%;
908
- height: auto;
909
- border-radius: var(--radius-sm);
910
- }
911
-
912
- .content-block__footer {
913
- display: flex;
914
- justify-content: flex-end;
915
- gap: var(--component-gap-md);
916
- margin-top: var(--component-gap-lg);
917
- }
918
-
919
- /* ---------------------------------------------------------
920
- 17.2 INTERACTIVE STATE (optional)
921
- --------------------------------------------------------- */
922
-
923
- .content-block--interactive {
924
- cursor: pointer;
925
- transition: background-color var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal);
926
- }
927
-
928
- .content-block--interactive:hover {
929
- background-color: var(--color-surface-hover);
930
- border-color: var(--color-border-strong);
931
- box-shadow: var(--shadow-2);
932
- }
933
-
934
- .content-block--interactive:focus-visible {
935
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
936
- outline-offset: var(--focus-ring-offset);
937
- }
938
-
939
- .content-block--disabled {
940
- opacity: 0.5;
941
- opacity: var(--content-block-component-disabled--opacity, 0.5);
942
- pointer-events: none;
943
- cursor: not-allowed;
944
- }
1
+ /************************************************************
2
+ * VLAH DESIGN SYSTEM (VDS) - Content Blocks
3
+ *
4
+ * Responsibilities:
5
+ * - Define the structural building blocks of the UI: cards, media blocks,
6
+ * list groups, callouts, empty states, stats, metric titles, tags/chips/badges,
7
+ * avatars, features, processes, highlights, fact blocks, and content blocks
8
+ * - Provide consistent, token-driven spacing, radii, borders, shadows, and
9
+ * interaction patterns across all content surfaces
10
+ * - Expose semantic and interactive variants for blocks, tags, callouts, and
11
+ * process steps
12
+ * - Enable layout-neutral composition while supporting grid, stack, inline,
13
+ * horizontal, and compact patterns
14
+ *
15
+ * System Notes:
16
+ * - Pure CSS; no behavioural assumptions or JavaScript dependencies
17
+ * - Fully theme-driven: all tokens derive from primitives + active theme
18
+ * - All interactive states use shared VDS focus, hover, and selected patterns
19
+ ************************************************************/
20
+
21
+ /* ---------------------------------------------------------
22
+ 1. CONTENT BLOCK TOKEN DEFINITIONS
23
+ --------------------------------------------------------- */
24
+
25
+ [data-vds-content-block],
26
+ .vds-content-block {
27
+ --content-block-tag-size-sm: var(--space-4);
28
+ --content-block-tag-size-md: var(--space-5);
29
+ --content-block-tag-size-lg: var(--space-6);
30
+ --content-block-component-disabled--opacity: 0.3;
31
+
32
+
33
+ --content-block-component-pad-sm: var(--space-3);
34
+ --content-block-component-pad-md: var(--space-6);
35
+ --content-block-component-pad-lg: var(--space-8);
36
+
37
+ --content-block-component-border-sm: var(--border-width);
38
+
39
+ --content-block-card-min-width: 16.25rem;
40
+
41
+ --content-block-card-gap: var(--space-4);
42
+ --content-block-card-pad: var(--space-8);
43
+ --content-block-card-pad-mobile: var(--space-6);
44
+
45
+ --content-block-fact-pad: var(--space-10);
46
+
47
+ --content-block-process-gap: var(--space-10);
48
+ --content-block-process-step-min-width: 15rem;
49
+
50
+ --content-block-media-gap: var(--space-6);
51
+
52
+ --content-block-empty-pad-vertical: var(--space-14);
53
+ --content-block-empty-pad-horizontal: var(--space-6);
54
+
55
+ --content-block-empty-gap: var(--space-4);
56
+
57
+ --content-block-highlight-border-width: var(--border-width-strong);
58
+ --content-block-highlight-pad: var(--space-6);
59
+ }
60
+
61
+ /* ---------------------------------------------------------
62
+ 2. GENERIC INTERACTIVE / DISABLED
63
+ --------------------------------------------------------- */
64
+
65
+ .interactive {
66
+ cursor: pointer;
67
+ transition: background-color var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal), color var(--transition-normal);
68
+ }
69
+
70
+ .interactive:hover {
71
+ background-color: var(--color-surface-hover);
72
+ border-color: var(--color-border-strong);
73
+ }
74
+
75
+ .interactive:active {
76
+ background-color: var(--color-surface-subtle);
77
+ }
78
+
79
+ .interactive:focus-visible {
80
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
81
+ outline-offset: var(--focus-ring-offset);
82
+ }
83
+
84
+ .is-disabled {
85
+ opacity: 0.5;
86
+ opacity: var(--content-block-component-disabled--opacity, 0.5);
87
+ cursor: not-allowed;
88
+ pointer-events: none;
89
+ }
90
+
91
+ /* ---------------------------------------------------------
92
+ 3. CARD
93
+ --------------------------------------------------------- */
94
+
95
+ .card {
96
+ background-color: var(--color-surface);
97
+ border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
98
+ border-radius: var(--radius-md);
99
+ padding: var(--content-block-card-pad);
100
+ display: flex;
101
+ flex-direction: column;
102
+ gap: var(--content-block-card-gap);
103
+ box-shadow: var(--shadow-1);
104
+ transition: background-color var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal);
105
+ }
106
+
107
+ .card--soft {
108
+ background-color: var(--color-surface-subtle);
109
+ }
110
+
111
+ .card--muted {
112
+ background-color: var(--color-muted-bg);
113
+ }
114
+
115
+ .card--tone-accent {
116
+ background-color: var(--color-accent-soft);
117
+ }
118
+
119
+ @media (max-width: 640px) {
120
+ .card {
121
+ padding: var(--content-block-card-pad-mobile);
122
+ }
123
+ }
124
+
125
+ .card--flat {
126
+ box-shadow: none;
127
+ }
128
+
129
+ .card--raised {
130
+ box-shadow: var(--shadow-2);
131
+ }
132
+
133
+ .card--interactive {
134
+ cursor: pointer;
135
+ }
136
+
137
+ .card--interactive:hover {
138
+ background-color: var(--color-surface-hover);
139
+ border-color: var(--color-border-strong);
140
+ box-shadow: var(--shadow-2);
141
+ }
142
+
143
+ .card--interactive:active {
144
+ background-color: var(--color-surface-subtle);
145
+ }
146
+
147
+ .card--interactive:focus-visible {
148
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
149
+ outline-offset: var(--focus-ring-offset);
150
+ }
151
+
152
+ .card--selected {
153
+ border-color: var(--color-accent);
154
+ box-shadow: var(--shadow-2);
155
+ }
156
+
157
+ .card--disabled {
158
+ opacity: 0.5;
159
+ opacity: var(--content-block-component-disabled--opacity, 0.5);
160
+ cursor: not-allowed;
161
+ pointer-events: none;
162
+ }
163
+
164
+ .card__header,
165
+ .card__body {
166
+ width: 100%;
167
+ }
168
+
169
+ .card__footer {
170
+ margin-top: var(--component-gap-lg);
171
+ display: flex;
172
+ gap: var(--component-gap-md);
173
+ justify-content: flex-end;
174
+ }
175
+
176
+ .card__section-stack,
177
+ .card__body-stack,
178
+ .card__header-stack {
179
+ display: flex;
180
+ flex-direction: column;
181
+ gap: var(--component-gap-md);
182
+ }
183
+
184
+ .card__section-inline,
185
+ .card__body-inline,
186
+ .card__footer-inline {
187
+ display: flex;
188
+ flex-wrap: wrap;
189
+ gap: var(--component-gap-md);
190
+ align-items: flex-start;
191
+ }
192
+
193
+ /* ---------------------------------------------------------
194
+ 4. CARD GRID
195
+ --------------------------------------------------------- */
196
+
197
+ .card-grid {
198
+ display: grid;
199
+ grid-template-columns: repeat(auto-fit, minmax(var(--content-block-card-min-width), 1fr));
200
+ grid-gap: var(--component-gap-lg);
201
+ gap: var(--component-gap-lg);
202
+ }
203
+
204
+ .card-grid--compact {
205
+ gap: var(--component-gap-md);
206
+ }
207
+
208
+ .card-grid--tight {
209
+ gap: var(--component-gap-xs);
210
+ }
211
+
212
+ .card-grid--wide {
213
+ gap: var(--component-gap-xl);
214
+ }
215
+
216
+ /* ---------------------------------------------------------
217
+ 5. MEDIA BLOCK
218
+ --------------------------------------------------------- */
219
+
220
+ .media {
221
+ display: flex;
222
+ align-items: center;
223
+ gap: var(--content-block-media-gap);
224
+ }
225
+
226
+ .media--stack {
227
+ flex-direction: column;
228
+ align-items: flex-start;
229
+ }
230
+
231
+ .media--horizontal {
232
+ flex-direction: row;
233
+ align-items: center;
234
+ }
235
+
236
+ .media--interactive {
237
+ cursor: pointer;
238
+ transition: background-color var(--transition-normal);
239
+ }
240
+
241
+ .media--interactive:hover {
242
+ background-color: var(--color-surface-hover);
243
+ }
244
+
245
+ @media (max-width: 768px) {
246
+ .media {
247
+ flex-direction: column;
248
+ align-items: flex-start;
249
+ }
250
+ }
251
+
252
+ .media__img,
253
+ .media__icon {
254
+ width: var(--icon-container-lg);
255
+ height: var(--icon-container-lg);
256
+ flex-shrink: 0;
257
+
258
+ display: flex;
259
+ align-items: center;
260
+ justify-content: center;
261
+ }
262
+
263
+ .media__img img,
264
+ .media__icon svg {
265
+ width: 100%;
266
+ height: 100%;
267
+ -o-object-fit: contain;
268
+ object-fit: contain;
269
+ border-radius: var(--radius-sm);
270
+ }
271
+
272
+ .media__icon .icon {
273
+ width: 100%;
274
+ height: 100%;
275
+ display: block;
276
+ }
277
+
278
+ .media__body {
279
+ display: flex;
280
+ flex-direction: column;
281
+ gap: var(--component-gap-xs);
282
+ }
283
+
284
+ .media__meta {
285
+ font-size: var(--text-xs);
286
+ color: var(--color-text-muted);
287
+ }
288
+
289
+ /* ---------------------------------------------------------
290
+ 6. LIST GROUP
291
+ --------------------------------------------------------- */
292
+
293
+ .list-group {
294
+ display: flex;
295
+ flex-direction: column;
296
+ gap: var(--component-gap-xs);
297
+ }
298
+
299
+ .list-group__item {
300
+ display: flex;
301
+ gap: var(--component-gap-md);
302
+ padding: var(--component-gap-md) 0;
303
+ border-bottom: var(--content-block-component-border-sm) solid var(--color-border-subtle);
304
+ }
305
+
306
+ .list-group__item:last-child {
307
+ border-bottom: none;
308
+ }
309
+
310
+ .list-group--borderless .list-group__item {
311
+ border-bottom: none;
312
+ }
313
+
314
+ .list-group--tight .list-group__item {
315
+ padding: var(--component-gap-xs) 0;
316
+ }
317
+
318
+ .list-group__item--interactive {
319
+ cursor: pointer;
320
+ transition: background-color var(--transition-normal);
321
+ }
322
+
323
+ .list-group__item--interactive:hover {
324
+ background-color: var(--color-surface-hover);
325
+ }
326
+
327
+ .list-group__item--interactive:focus-visible {
328
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
329
+ outline-offset: var(--focus-ring-offset);
330
+ }
331
+
332
+ .list-group__item--selected {
333
+ background-color: var(--accent-soft-surface, var(--color-accent-soft));
334
+ border-left-color: var(--accent-soft-border, var(--color-accent));
335
+ box-shadow: 0 0 0 1px transparent;
336
+ box-shadow: 0 0 0 1px var(--accent-soft-shadow, transparent);
337
+ color: var(--accent-soft-on, var(--color-on-accent));
338
+ }
339
+
340
+ .list-group__item--disabled {
341
+ opacity: var(--content-block-component-disabled--opacity);
342
+ cursor: not-allowed;
343
+ pointer-events: none;
344
+ }
345
+
346
+ /* ---------------------------------------------------------
347
+ 7. CALLOUTS (Semantic Variants)
348
+ --------------------------------------------------------- */
349
+
350
+ .callout {
351
+ border-radius: var(--radius-md);
352
+ padding: var(--content-block-component-pad-md);
353
+ border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
354
+ background-color: var(--color-muted-bg);
355
+ }
356
+
357
+ .callout--compact {
358
+ padding: var(--content-block-component-pad-sm);
359
+ }
360
+
361
+ .callout--outline {
362
+ background-color: var(--color-surface);
363
+ border-color: var(--color-border-strong);
364
+ }
365
+
366
+ .callout--minimal {
367
+ background-color: transparent;
368
+ border-color: transparent;
369
+ }
370
+
371
+ .callout__title {
372
+ font-size: var(--text-sm);
373
+ font-weight: 600;
374
+ }
375
+
376
+ .callout__body {
377
+ margin-top: var(--component-gap-xs);
378
+ }
379
+
380
+ .callout__icon {
381
+ margin-bottom: var(--component-gap-xs);
382
+ }
383
+
384
+ .callout--interactive {
385
+ cursor: pointer;
386
+ transition: background-color var(--transition-normal), border-color var(--transition-normal);
387
+ }
388
+
389
+ .callout--interactive:hover {
390
+ background: color-mix(in srgb, currentColor 10%, transparent);
391
+ }
392
+
393
+ .callout--interactive:focus-visible {
394
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
395
+ outline-offset: var(--focus-ring-offset);
396
+ }
397
+
398
+ .semantic-info {
399
+ background-color: var(--semantic-info-bg);
400
+ border-color: var(--semantic-info-border);
401
+ color: var(--semantic-info-text);
402
+ }
403
+
404
+ .semantic-success {
405
+ background-color: var(--semantic-success-bg);
406
+ border-color: var(--semantic-success-border);
407
+ color: var(--semantic-success-text);
408
+ }
409
+
410
+ .semantic-warning {
411
+ background-color: var(--semantic-warning-bg);
412
+ border-color: var(--semantic-warning-border);
413
+ color: var(--semantic-warning-text);
414
+ }
415
+
416
+ .semantic-danger {
417
+ background-color: var(--semantic-danger-bg);
418
+ border-color: var(--semantic-danger-border);
419
+ color: var(--semantic-danger-text);
420
+ }
421
+
422
+ /* ---------------------------------------------------------
423
+ 8. EMPTY STATE
424
+ --------------------------------------------------------- */
425
+
426
+ .empty {
427
+ text-align: center;
428
+ background-color: var(--color-surface);
429
+ border-radius: var(--radius-md);
430
+ border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
431
+ padding: var(--content-block-empty-pad-vertical) var(--content-block-empty-pad-horizontal);
432
+ }
433
+
434
+ .empty--compact {
435
+ padding: var(--content-block-component-pad-md);
436
+ }
437
+
438
+ .empty--inline {
439
+ display: inline-flex;
440
+ align-items: center;
441
+ text-align: left;
442
+ }
443
+
444
+ .empty__icon {
445
+ width: var(--space-16);
446
+ height: var(--space-16);
447
+ margin: 0 auto var(--content-block-empty-gap);
448
+ stroke: var(--color-text-muted);
449
+
450
+ display: flex;
451
+ align-items: center;
452
+ justify-content: center;
453
+ }
454
+
455
+ .empty--inline .empty__icon {
456
+ margin: 0 var(--component-gap-md) 0 0;
457
+ }
458
+
459
+ .empty__icon .icon {
460
+ width: 100%;
461
+ height: 100%;
462
+ display: block;
463
+ }
464
+
465
+ .empty__actions {
466
+ margin-top: var(--component-gap-lg);
467
+ display: flex;
468
+ justify-content: center;
469
+ gap: var(--component-gap-md);
470
+ }
471
+
472
+ /* ---------------------------------------------------------
473
+ 9. STATS BLOCK
474
+ --------------------------------------------------------- */
475
+
476
+ .stats {
477
+ display: flex;
478
+ flex-wrap: wrap;
479
+ gap: var(--component-gap-xl);
480
+ }
481
+
482
+ @media (max-width: 768px) {
483
+ .stats {
484
+ gap: var(--component-gap-lg);
485
+ }
486
+ }
487
+
488
+ .stats__item {
489
+ display: flex;
490
+ flex-direction: column;
491
+ gap: var(--component-gap-xs);
492
+ }
493
+
494
+ .stats--center .stats__item {
495
+ align-items: center;
496
+ }
497
+
498
+ .stats__value {
499
+ font-size: var(--text-lg);
500
+ font-weight: 600;
501
+ color: var(--color-text);
502
+ }
503
+
504
+ .stats__label {
505
+ font-size: var(--text-xs);
506
+ color: var(--color-text-muted);
507
+ }
508
+
509
+ /* ---------------------------------------------------------
510
+ 10. METRIC TITLE
511
+ --------------------------------------------------------- */
512
+
513
+ .metric-title {
514
+ font-size: var(--text-xs);
515
+ letter-spacing: 0.04em;
516
+ text-transform: uppercase;
517
+ font-weight: 600;
518
+ color: var(--color-text-muted);
519
+ }
520
+
521
+ /* ---------------------------------------------------------
522
+ 11. TAGS / CHIPS / BADGES + INTERACTIVE
523
+ --------------------------------------------------------- */
524
+
525
+ .tag,
526
+ .chip,
527
+ .badge {
528
+ display: inline-flex;
529
+ align-items: center;
530
+ gap: var(--component-gap-xs);
531
+ padding: var(--component-gap-sm) var(--component-gap-md);
532
+ height: var(--content-block-tag-size-md);
533
+ font-size: var(--text-xs);
534
+ border-radius: 9999px;
535
+ border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
536
+ background-color: var(--color-surface);
537
+ color: var(--color-text);
538
+ }
539
+
540
+ .tag--sm,
541
+ .chip--sm,
542
+ .badge--sm {
543
+ height: var(--content-block-tag-size-sm);
544
+ }
545
+
546
+ .tag--lg,
547
+ .chip--lg,
548
+ .badge--lg {
549
+ height: var(--content-block-tag-size-lg);
550
+ }
551
+
552
+ .tag--soft,
553
+ .chip--soft,
554
+ .badge--soft {
555
+ background-color: var(--color-surface-subtle);
556
+ }
557
+
558
+ .tag--outline,
559
+ .chip--outline,
560
+ .badge--outline {
561
+ background-color: transparent;
562
+ border-color: var(--color-border-strong);
563
+ }
564
+
565
+ .tag--interactive,
566
+ .chip--interactive,
567
+ .badge--interactive {
568
+ cursor: pointer;
569
+ transition: background-color var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast);
570
+ }
571
+
572
+ .tag--interactive:hover,
573
+ .chip--interactive:hover,
574
+ .badge--interactive:hover {
575
+ background-color: var(--color-surface-hover);
576
+ border-color: var(--color-border-strong);
577
+ }
578
+
579
+ .tag--interactive:focus-visible,
580
+ .chip--interactive:focus-visible,
581
+ .badge--interactive:focus-visible {
582
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
583
+ outline-offset: var(--focus-ring-offset);
584
+ }
585
+
586
+ .tag--disabled,
587
+ .chip--disabled,
588
+ .badge--disabled {
589
+ opacity: 0.5;
590
+ opacity: var(--content-block-component-disabled--opacity, 0.5);
591
+ cursor: not-allowed;
592
+ pointer-events: none;
593
+ }
594
+
595
+ .tag.semantic-info,
596
+ .chip.semantic-info,
597
+ .badge.semantic-info {
598
+ background-color: var(--semantic-info-bg);
599
+ color: var(--semantic-info-text);
600
+ }
601
+
602
+ .tag.semantic-warning,
603
+ .chip.semantic-warning,
604
+ .badge.semantic-warning {
605
+ background-color: var(--semantic-warning-bg);
606
+ color: var(--semantic-warning-text);
607
+ }
608
+
609
+ .tag.semantic-success,
610
+ .chip.semantic-success,
611
+ .badge.semantic-success {
612
+ background-color: var(--semantic-success-bg);
613
+ color: var(--semantic-success-text);
614
+ }
615
+
616
+ .tag.semantic-danger,
617
+ .chip.semantic-danger,
618
+ .badge.semantic-danger {
619
+ background-color: var(--semantic-danger-bg);
620
+ color: var(--semantic-danger-text);
621
+ }
622
+
623
+ /* ---------------------------------------------------------
624
+ 12. AVATAR + STATUS
625
+ --------------------------------------------------------- */
626
+
627
+ .avatar {
628
+ position: relative;
629
+ width: var(--avatar-size-md);
630
+ height: var(--avatar-size-md);
631
+ border-radius: 50%;
632
+ overflow: hidden;
633
+ display: inline-flex;
634
+ align-items: center;
635
+ justify-content: center;
636
+ background-color: var(--color-muted-bg);
637
+ }
638
+
639
+ .avatar--sm {
640
+ width: var(--avatar-size-sm);
641
+ height: var(--avatar-size-sm);
642
+ }
643
+
644
+ .avatar--lg {
645
+ width: var(--avatar-size-lg);
646
+ height: var(--avatar-size-lg);
647
+ }
648
+
649
+ .avatar--status::after {
650
+ content: "";
651
+ position: absolute;
652
+ width: var(--avatar-status-size);
653
+ height: var(--avatar-status-size);
654
+ border-radius: 50%;
655
+ background-color: var(--color-success);
656
+ border: var(--border-width) solid var(--color-surface);
657
+ bottom: 0;
658
+ right: 0;
659
+ }
660
+
661
+ /* ---------------------------------------------------------
662
+ 13. FEATURE BLOCK
663
+ --------------------------------------------------------- */
664
+
665
+ .feature {
666
+ display: flex;
667
+ flex-direction: column;
668
+ gap: var(--component-gap-xs);
669
+ }
670
+
671
+ .feature--horizontal {
672
+ flex-direction: row;
673
+ align-items: center;
674
+ }
675
+
676
+ .feature__icon {
677
+ width: var(--icon-container-lg);
678
+ height: var(--icon-container-lg);
679
+ flex-shrink: 0;
680
+
681
+ display: flex;
682
+ align-items: center;
683
+ justify-content: center;
684
+ }
685
+
686
+ .feature__icon .icon {
687
+ width: 100%;
688
+ height: 100%;
689
+ display: block;
690
+ }
691
+
692
+ .feature--interactive {
693
+ cursor: pointer;
694
+ transition: background-color var(--transition-normal);
695
+ }
696
+
697
+ .feature--interactive:hover {
698
+ background-color: var(--color-surface-hover);
699
+ }
700
+
701
+ .feature--interactive:focus-visible {
702
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
703
+ outline-offset: var(--focus-ring-offset);
704
+ }
705
+
706
+ @media (max-width: 640px) {
707
+ .feature--horizontal {
708
+ flex-direction: column;
709
+ align-items: flex-start;
710
+ }
711
+ }
712
+
713
+ /* ---------------------------------------------------------
714
+ 14. PROCESS BLOCK
715
+ --------------------------------------------------------- */
716
+
717
+ .process {
718
+ display: grid;
719
+ grid-template-columns: repeat(auto-fit, minmax(var(--content-block-process-step-min-width), 1fr));
720
+ grid-gap: var(--content-block-process-gap);
721
+ gap: var(--content-block-process-gap);
722
+ }
723
+
724
+ @media (max-width: 768px) {
725
+ .process {
726
+ gap: var(--component-gap-lg);
727
+ }
728
+ }
729
+
730
+ .process__step {
731
+ display: flex;
732
+ flex-direction: column;
733
+ gap: var(--component-gap-md);
734
+ padding: var(--content-block-component-pad-md);
735
+ border-radius: var(--radius-md);
736
+ background-color: var(--color-surface);
737
+ border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
738
+ color: var(--color-text);
739
+ }
740
+
741
+ .process__step--active {
742
+ background-color: var(--accent-soft-surface);
743
+ border-color: var(--accent-soft-border);
744
+ color: var(--accent-soft-on);
745
+ }
746
+
747
+ .process__step--complete {
748
+ background-color: var(--success-soft-surface);
749
+ border-color: var(--success-soft-border);
750
+ color: var(--success-soft-on);
751
+ }
752
+
753
+ .process__step--disabled {
754
+ opacity: var(--content-block-component-disabled--opacity);
755
+ cursor: not-allowed;
756
+ pointer-events: none;
757
+ }
758
+
759
+ /* ---------------------------------------------------------
760
+ 15. HIGHLIGHT BLOCK
761
+ --------------------------------------------------------- */
762
+
763
+ .highlight {
764
+ background-color: var(--color-surface-subtle);
765
+ border-left: var(--content-block-highlight-border-width) solid var(--color-accent);
766
+ padding: var(--content-block-highlight-pad);
767
+ border-radius: var(--radius-sm);
768
+ }
769
+
770
+ .highlight--compact {
771
+ padding: var(--content-block-component-pad-sm);
772
+ }
773
+
774
+ .highlight--info {
775
+ border-color: var(--semantic-info-border);
776
+ background-color: var(--semantic-info-bg);
777
+ }
778
+
779
+ .highlight--success {
780
+ border-color: var(--semantic-success-border);
781
+ background-color: var(--semantic-success-bg);
782
+ }
783
+
784
+ .highlight--warning {
785
+ border-color: var(--semantic-warning-border);
786
+ background-color: var(--semantic-warning-bg);
787
+ }
788
+
789
+ .highlight--danger {
790
+ border-color: var(--semantic-danger-border);
791
+ background-color: var(--semantic-danger-bg);
792
+ }
793
+
794
+ /* ---------------------------------------------------------
795
+ 16. FACT BLOCK
796
+ --------------------------------------------------------- */
797
+
798
+ .fact {
799
+ text-align: center;
800
+ background-color: var(--color-surface);
801
+ border-radius: var(--radius-md);
802
+ border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
803
+ padding: var(--content-block-fact-pad);
804
+ }
805
+
806
+ .fact--horizontal {
807
+ text-align: left;
808
+ display: flex;
809
+ align-items: center;
810
+ justify-content: center;
811
+ gap: var(--component-gap-lg);
812
+ }
813
+
814
+ .fact--compact {
815
+ padding: var(--content-block-component-pad-md);
816
+ }
817
+
818
+ .fact--interactive {
819
+ cursor: pointer;
820
+ transition: background-color var(--transition-normal), border-color var(--transition-normal);
821
+ }
822
+
823
+ .fact--interactive:hover {
824
+ background-color: var(--color-surface-hover);
825
+ border-color: var(--color-border-strong);
826
+ }
827
+
828
+ .fact--interactive:focus-visible {
829
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
830
+ outline-offset: var(--focus-ring-offset);
831
+ }
832
+
833
+ .fact--disabled {
834
+ opacity: 0.5;
835
+ opacity: var(--content-block-component-disabled--opacity, 0.5);
836
+ cursor: not-allowed;
837
+ pointer-events: none;
838
+ }
839
+
840
+ /* ---------------------------------------------------------
841
+ 17. CONTENT BLOCK (NEW STRUCTURAL BLOCK)
842
+ --------------------------------------------------------- */
843
+
844
+ .content-block {
845
+ display: flex;
846
+ flex-direction: column;
847
+ gap: var(--component-gap-md);
848
+ width: 100%;
849
+ }
850
+
851
+ .content-block--surface {
852
+ background-color: var(--color-surface);
853
+ border-radius: var(--radius-md);
854
+ border: var(--content-block-component-border-sm) solid var(--color-border-subtle);
855
+ padding: var(--content-block-component-pad-lg);
856
+ box-shadow: var(--shadow-1);
857
+ }
858
+
859
+ .content-block--inset {
860
+ background-color: var(--color-surface-subtle);
861
+ border-radius: var(--radius-md);
862
+ padding: var(--content-block-component-pad-md);
863
+ }
864
+
865
+ .content-block--compact {
866
+ gap: var(--component-gap-xs);
867
+ }
868
+
869
+ .content-block--surface.content-block--compact {
870
+ padding: var(--content-block-component-pad-md);
871
+ }
872
+
873
+ .content-block--inset.content-block--compact {
874
+ padding: var(--content-block-component-pad-sm);
875
+ }
876
+
877
+ .content-block--bordered {
878
+ border: var(--content-block-component-border-sm) solid var(--color-border-strong);
879
+ }
880
+
881
+ /* ---------------------------------------------------------
882
+ 17.1 CONTENT BLOCK - REGIONS
883
+ --------------------------------------------------------- */
884
+
885
+ .content-block__header {
886
+ display: flex;
887
+ flex-direction: column;
888
+ gap: var(--component-gap-xs);
889
+ }
890
+
891
+ .content-block__body {
892
+ display: flex;
893
+ flex-direction: column;
894
+ gap: var(--component-gap-md);
895
+ }
896
+
897
+ .content-block__media {
898
+ width: 100%;
899
+ display: flex;
900
+ align-items: center;
901
+ justify-content: center;
902
+ }
903
+
904
+ .content-block__media img,
905
+ .content-block__media svg,
906
+ .content-block__media picture {
907
+ max-width: 100%;
908
+ height: auto;
909
+ border-radius: var(--radius-sm);
910
+ }
911
+
912
+ .content-block__footer {
913
+ display: flex;
914
+ justify-content: flex-end;
915
+ gap: var(--component-gap-md);
916
+ margin-top: var(--component-gap-lg);
917
+ }
918
+
919
+ /* ---------------------------------------------------------
920
+ 17.2 INTERACTIVE STATE (optional)
921
+ --------------------------------------------------------- */
922
+
923
+ .content-block--interactive {
924
+ cursor: pointer;
925
+ transition: background-color var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal);
926
+ }
927
+
928
+ .content-block--interactive:hover {
929
+ background-color: var(--color-surface-hover);
930
+ border-color: var(--color-border-strong);
931
+ box-shadow: var(--shadow-2);
932
+ }
933
+
934
+ .content-block--interactive:focus-visible {
935
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
936
+ outline-offset: var(--focus-ring-offset);
937
+ }
938
+
939
+ .content-block--disabled {
940
+ opacity: 0.5;
941
+ opacity: var(--content-block-component-disabled--opacity, 0.5);
942
+ pointer-events: none;
943
+ cursor: not-allowed;
944
+ }