@24vlh/vds 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,944 +1 @@
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
+ .vds-content-block,[data-vds-content-block]{--content-block-tag-size-sm:var(--space-4);--content-block-tag-size-md:var(--space-5);--content-block-tag-size-lg:var(--space-6);--content-block-component-disabled--opacity:0.3;--content-block-component-pad-sm:var(--space-3);--content-block-component-pad-md:var(--space-6);--content-block-component-pad-lg:var(--space-8);--content-block-component-border-sm:var(--border-width);--content-block-card-min-width:16.25rem;--content-block-card-gap:var(--space-4);--content-block-card-pad:var(--space-8);--content-block-card-pad-mobile:var(--space-6);--content-block-fact-pad:var(--space-10);--content-block-process-gap:var(--space-10);--content-block-process-step-min-width:15rem;--content-block-media-gap:var(--space-6);--content-block-empty-pad-vertical:var(--space-14);--content-block-empty-pad-horizontal:var(--space-6);--content-block-empty-gap:var(--space-4);--content-block-highlight-border-width:var(--border-width-strong);--content-block-highlight-pad:var(--space-6)}.interactive{cursor:pointer;transition:background-color var(--transition-normal),border-color var(--transition-normal),box-shadow var(--transition-normal),color var(--transition-normal)}.interactive:hover{background-color:var(--color-surface-hover);border-color:var(--color-border-strong)}.interactive:active{background-color:var(--color-surface-subtle)}.interactive:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.is-disabled{cursor:not-allowed;opacity:.5;opacity:var(--content-block-component-disabled--opacity,.5);pointer-events:none}.card{background-color:var(--color-surface);border:var(--content-block-component-border-sm) solid var(--color-border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-1);display:flex;flex-direction:column;gap:var(--content-block-card-gap);padding:var(--content-block-card-pad);transition:background-color var(--transition-normal),border-color var(--transition-normal),box-shadow var(--transition-normal)}.card--soft{background-color:var(--color-surface-subtle)}.card--muted{background-color:var(--color-muted-bg)}.card--tone-accent{background-color:var(--color-accent-soft)}@media (max-width:640px){.card{padding:var(--content-block-card-pad-mobile)}}.card--flat{box-shadow:none}.card--raised{box-shadow:var(--shadow-2)}.card--interactive{cursor:pointer}.card--interactive:hover{background-color:var(--color-surface-hover);border-color:var(--color-border-strong);box-shadow:var(--shadow-2)}.card--interactive:active{background-color:var(--color-surface-subtle)}.card--interactive:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.card--selected{border-color:var(--color-accent);box-shadow:var(--shadow-2)}.card--disabled{cursor:not-allowed;opacity:.5;opacity:var(--content-block-component-disabled--opacity,.5);pointer-events:none}.card__body,.card__header{width:100%}.card__footer{display:flex;gap:var(--component-gap-md);justify-content:flex-end;margin-top:var(--component-gap-lg)}.card__body-stack,.card__header-stack,.card__section-stack{display:flex;flex-direction:column;gap:var(--component-gap-md)}.card__body-inline,.card__footer-inline,.card__section-inline{align-items:flex-start;display:flex;flex-wrap:wrap;gap:var(--component-gap-md)}.card-grid{grid-gap:var(--component-gap-lg);display:grid;gap:var(--component-gap-lg);grid-template-columns:repeat(auto-fit,minmax(var(--content-block-card-min-width),1fr))}.card-grid--compact{gap:var(--component-gap-md)}.card-grid--tight{gap:var(--component-gap-xs)}.card-grid--wide{gap:var(--component-gap-xl)}.media{align-items:center;display:flex;gap:var(--content-block-media-gap)}.media--stack{align-items:flex-start;flex-direction:column}.media--horizontal{align-items:center;flex-direction:row}.media--interactive{cursor:pointer;transition:background-color var(--transition-normal)}.media--interactive:hover{background-color:var(--color-surface-hover)}@media (max-width:768px){.media{align-items:flex-start;flex-direction:column}}.media__icon,.media__img{align-items:center;display:flex;flex-shrink:0;height:var(--icon-container-lg);justify-content:center;width:var(--icon-container-lg)}.media__icon svg,.media__img img{border-radius:var(--radius-sm);height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media__icon .icon{display:block;height:100%;width:100%}.media__body{display:flex;flex-direction:column;gap:var(--component-gap-xs)}.media__meta{color:var(--color-text-muted);font-size:var(--text-xs)}.list-group{display:flex;flex-direction:column;gap:var(--component-gap-xs)}.list-group__item{border-bottom:var(--content-block-component-border-sm) solid var(--color-border-subtle);display:flex;gap:var(--component-gap-md);padding:var(--component-gap-md) 0}.list-group--borderless .list-group__item,.list-group__item:last-child{border-bottom:none}.list-group--tight .list-group__item{padding:var(--component-gap-xs) 0}.list-group__item--interactive{cursor:pointer;transition:background-color var(--transition-normal)}.list-group__item--interactive:hover{background-color:var(--color-surface-hover)}.list-group__item--interactive:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.list-group__item--selected{background-color:var(--accent-soft-surface,var(--color-accent-soft));border-left-color:var(--accent-soft-border,var(--color-accent));box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px var(--accent-soft-shadow,transparent);color:var(--accent-soft-on,var(--color-on-accent))}.list-group__item--disabled{cursor:not-allowed;opacity:var(--content-block-component-disabled--opacity);pointer-events:none}.callout{background-color:var(--color-muted-bg);border:var(--content-block-component-border-sm) solid var(--color-border-subtle);border-radius:var(--radius-md);padding:var(--content-block-component-pad-md)}.callout--compact{padding:var(--content-block-component-pad-sm)}.callout--outline{background-color:var(--color-surface);border-color:var(--color-border-strong)}.callout--minimal{background-color:transparent;border-color:transparent}.callout__title{font-size:var(--text-sm);font-weight:600}.callout__body{margin-top:var(--component-gap-xs)}.callout__icon{margin-bottom:var(--component-gap-xs)}.callout--interactive{cursor:pointer;transition:background-color var(--transition-normal),border-color var(--transition-normal)}.callout--interactive:hover{background:color-mix(in srgb,currentColor 10%,transparent)}.callout--interactive:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.semantic-info{background-color:var(--semantic-info-bg);border-color:var(--semantic-info-border);color:var(--semantic-info-text)}.semantic-success{background-color:var(--semantic-success-bg);border-color:var(--semantic-success-border);color:var(--semantic-success-text)}.semantic-warning{background-color:var(--semantic-warning-bg);border-color:var(--semantic-warning-border);color:var(--semantic-warning-text)}.semantic-danger{background-color:var(--semantic-danger-bg);border-color:var(--semantic-danger-border);color:var(--semantic-danger-text)}.empty{background-color:var(--color-surface);border:var(--content-block-component-border-sm) solid var(--color-border-subtle);border-radius:var(--radius-md);padding:var(--content-block-empty-pad-vertical) var(--content-block-empty-pad-horizontal);text-align:center}.empty--compact{padding:var(--content-block-component-pad-md)}.empty--inline{align-items:center;display:inline-flex;text-align:left}.empty__icon{stroke:var(--color-text-muted);align-items:center;display:flex;height:var(--space-16);justify-content:center;margin:0 auto var(--content-block-empty-gap);width:var(--space-16)}.empty--inline .empty__icon{margin:0 var(--component-gap-md) 0 0}.empty__icon .icon{display:block;height:100%;width:100%}.empty__actions{display:flex;gap:var(--component-gap-md);justify-content:center;margin-top:var(--component-gap-lg)}.stats{display:flex;flex-wrap:wrap;gap:var(--component-gap-xl)}@media (max-width:768px){.stats{gap:var(--component-gap-lg)}}.stats__item{display:flex;flex-direction:column;gap:var(--component-gap-xs)}.stats--center .stats__item{align-items:center}.stats__value{color:var(--color-text);font-size:var(--text-lg);font-weight:600}.metric-title,.stats__label{color:var(--color-text-muted);font-size:var(--text-xs)}.metric-title{font-weight:600;letter-spacing:.04em;text-transform:uppercase}.badge,.chip,.tag{align-items:center;background-color:var(--color-surface);border:var(--content-block-component-border-sm) solid var(--color-border-subtle);border-radius:9999px;color:var(--color-text);display:inline-flex;font-size:var(--text-xs);gap:var(--component-gap-xs);height:var(--content-block-tag-size-md);padding:var(--component-gap-sm) var(--component-gap-md)}.badge--sm,.chip--sm,.tag--sm{height:var(--content-block-tag-size-sm)}.badge--lg,.chip--lg,.tag--lg{height:var(--content-block-tag-size-lg)}.badge--soft,.chip--soft,.tag--soft{background-color:var(--color-surface-subtle)}.badge--outline,.chip--outline,.tag--outline{background-color:transparent;border-color:var(--color-border-strong)}.badge--interactive,.chip--interactive,.tag--interactive{cursor:pointer;transition:background-color var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast)}.badge--interactive:hover,.chip--interactive:hover,.tag--interactive:hover{background-color:var(--color-surface-hover);border-color:var(--color-border-strong)}.badge--interactive:focus-visible,.chip--interactive:focus-visible,.tag--interactive:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.badge--disabled,.chip--disabled,.tag--disabled{cursor:not-allowed;opacity:.5;opacity:var(--content-block-component-disabled--opacity,.5);pointer-events:none}.badge.semantic-info,.chip.semantic-info,.tag.semantic-info{background-color:var(--semantic-info-bg);color:var(--semantic-info-text)}.badge.semantic-warning,.chip.semantic-warning,.tag.semantic-warning{background-color:var(--semantic-warning-bg);color:var(--semantic-warning-text)}.badge.semantic-success,.chip.semantic-success,.tag.semantic-success{background-color:var(--semantic-success-bg);color:var(--semantic-success-text)}.badge.semantic-danger,.chip.semantic-danger,.tag.semantic-danger{background-color:var(--semantic-danger-bg);color:var(--semantic-danger-text)}.avatar{align-items:center;background-color:var(--color-muted-bg);border-radius:50%;display:inline-flex;height:var(--avatar-size-md);justify-content:center;overflow:hidden;position:relative;width:var(--avatar-size-md)}.avatar--sm{height:var(--avatar-size-sm);width:var(--avatar-size-sm)}.avatar--lg{height:var(--avatar-size-lg);width:var(--avatar-size-lg)}.avatar--status:after{background-color:var(--color-success);border:var(--border-width) solid var(--color-surface);border-radius:50%;bottom:0;content:"";height:var(--avatar-status-size);position:absolute;right:0;width:var(--avatar-status-size)}.feature{display:flex;flex-direction:column;gap:var(--component-gap-xs)}.feature--horizontal{align-items:center;flex-direction:row}.feature__icon{align-items:center;display:flex;flex-shrink:0;height:var(--icon-container-lg);justify-content:center;width:var(--icon-container-lg)}.feature__icon .icon{display:block;height:100%;width:100%}.feature--interactive{cursor:pointer;transition:background-color var(--transition-normal)}.feature--interactive:hover{background-color:var(--color-surface-hover)}.feature--interactive:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}@media (max-width:640px){.feature--horizontal{align-items:flex-start;flex-direction:column}}.process{grid-gap:var(--content-block-process-gap);display:grid;gap:var(--content-block-process-gap);grid-template-columns:repeat(auto-fit,minmax(var(--content-block-process-step-min-width),1fr))}@media (max-width:768px){.process{gap:var(--component-gap-lg)}}.process__step{background-color:var(--color-surface);border:var(--content-block-component-border-sm) solid var(--color-border-subtle);border-radius:var(--radius-md);color:var(--color-text);display:flex;flex-direction:column;gap:var(--component-gap-md);padding:var(--content-block-component-pad-md)}.process__step--active{background-color:var(--accent-soft-surface);border-color:var(--accent-soft-border);color:var(--accent-soft-on)}.process__step--complete{background-color:var(--success-soft-surface);border-color:var(--success-soft-border);color:var(--success-soft-on)}.process__step--disabled{cursor:not-allowed;opacity:var(--content-block-component-disabled--opacity);pointer-events:none}.highlight{background-color:var(--color-surface-subtle);border-left:var(--content-block-highlight-border-width) solid var(--color-accent);border-radius:var(--radius-sm);padding:var(--content-block-highlight-pad)}.highlight--compact{padding:var(--content-block-component-pad-sm)}.highlight--info{background-color:var(--semantic-info-bg);border-color:var(--semantic-info-border)}.highlight--success{background-color:var(--semantic-success-bg);border-color:var(--semantic-success-border)}.highlight--warning{background-color:var(--semantic-warning-bg);border-color:var(--semantic-warning-border)}.highlight--danger{background-color:var(--semantic-danger-bg);border-color:var(--semantic-danger-border)}.fact{background-color:var(--color-surface);border:var(--content-block-component-border-sm) solid var(--color-border-subtle);border-radius:var(--radius-md);padding:var(--content-block-fact-pad);text-align:center}.fact--horizontal{align-items:center;display:flex;gap:var(--component-gap-lg);justify-content:center;text-align:left}.fact--compact{padding:var(--content-block-component-pad-md)}.fact--interactive{cursor:pointer;transition:background-color var(--transition-normal),border-color var(--transition-normal)}.fact--interactive:hover{background-color:var(--color-surface-hover);border-color:var(--color-border-strong)}.fact--interactive:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.fact--disabled{cursor:not-allowed;opacity:.5;opacity:var(--content-block-component-disabled--opacity,.5);pointer-events:none}.content-block{display:flex;flex-direction:column;gap:var(--component-gap-md);width:100%}.content-block--surface{background-color:var(--color-surface);border:var(--content-block-component-border-sm) solid var(--color-border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-1);padding:var(--content-block-component-pad-lg)}.content-block--inset{background-color:var(--color-surface-subtle);border-radius:var(--radius-md);padding:var(--content-block-component-pad-md)}.content-block--compact{gap:var(--component-gap-xs)}.content-block--surface.content-block--compact{padding:var(--content-block-component-pad-md)}.content-block--inset.content-block--compact{padding:var(--content-block-component-pad-sm)}.content-block--bordered{border:var(--content-block-component-border-sm) solid var(--color-border-strong)}.content-block__header{display:flex;flex-direction:column;gap:var(--component-gap-xs)}.content-block__body{display:flex;flex-direction:column;gap:var(--component-gap-md)}.content-block__media{align-items:center;display:flex;justify-content:center;width:100%}.content-block__media img,.content-block__media picture,.content-block__media svg{border-radius:var(--radius-sm);height:auto;max-width:100%}.content-block__footer{display:flex;gap:var(--component-gap-md);justify-content:flex-end;margin-top:var(--component-gap-lg)}.content-block--interactive{cursor:pointer;transition:background-color var(--transition-normal),border-color var(--transition-normal),box-shadow var(--transition-normal)}.content-block--interactive:hover{background-color:var(--color-surface-hover);border-color:var(--color-border-strong);box-shadow:var(--shadow-2)}.content-block--interactive:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.content-block--disabled{cursor:not-allowed;opacity:.5;opacity:var(--content-block-component-disabled--opacity,.5);pointer-events:none}