@24vlh/vds 0.1.0

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 (65) hide show
  1. package/LICENSE.txt +201 -0
  2. package/README.md +147 -0
  3. package/dist/components/accordion.css +170 -0
  4. package/dist/components/accordion.min.css +1 -0
  5. package/dist/components/authoring.css +332 -0
  6. package/dist/components/authoring.min.css +1 -0
  7. package/dist/components/buttons.css +683 -0
  8. package/dist/components/buttons.min.css +1 -0
  9. package/dist/components/charts.css +502 -0
  10. package/dist/components/charts.min.css +1 -0
  11. package/dist/components/command.css +521 -0
  12. package/dist/components/command.min.css +1 -0
  13. package/dist/components/content-blocks.css +944 -0
  14. package/dist/components/content-blocks.min.css +1 -0
  15. package/dist/components/doc-block.css +782 -0
  16. package/dist/components/doc-block.min.css +1 -0
  17. package/dist/components/feedback.css +657 -0
  18. package/dist/components/feedback.min.css +1 -0
  19. package/dist/components/flows.css +1101 -0
  20. package/dist/components/flows.min.css +1 -0
  21. package/dist/components/forms-advanced.css +462 -0
  22. package/dist/components/forms-advanced.min.css +1 -0
  23. package/dist/components/forms.css +1831 -0
  24. package/dist/components/forms.min.css +1 -0
  25. package/dist/components/header-footer.css +348 -0
  26. package/dist/components/header-footer.min.css +1 -0
  27. package/dist/components/hero.css +498 -0
  28. package/dist/components/hero.min.css +1 -0
  29. package/dist/components/icons.css +937 -0
  30. package/dist/components/icons.min.css +1 -0
  31. package/dist/components/navigation.css +900 -0
  32. package/dist/components/navigation.min.css +1 -0
  33. package/dist/components/overlays.css +498 -0
  34. package/dist/components/overlays.min.css +1 -0
  35. package/dist/components/sections.css +450 -0
  36. package/dist/components/sections.min.css +1 -0
  37. package/dist/components/skeleton.css +385 -0
  38. package/dist/components/skeleton.min.css +1 -0
  39. package/dist/components/tables.css +591 -0
  40. package/dist/components/tables.min.css +1 -0
  41. package/dist/components/tabs.css +307 -0
  42. package/dist/components/tabs.min.css +1 -0
  43. package/dist/components/toasts.css +421 -0
  44. package/dist/components/toasts.min.css +1 -0
  45. package/dist/components/tooltips-popovers.css +447 -0
  46. package/dist/components/tooltips-popovers.min.css +1 -0
  47. package/dist/components/typography.css +250 -0
  48. package/dist/components/typography.min.css +1 -0
  49. package/dist/components/utilities.css +3434 -0
  50. package/dist/components/utilities.min.css +1 -0
  51. package/dist/core.css +866 -0
  52. package/dist/core.min.css +1 -0
  53. package/dist/identity.css +266 -0
  54. package/dist/identity.min.css +1 -0
  55. package/dist/themes/carbon.css +658 -0
  56. package/dist/themes/carbon.min.css +1 -0
  57. package/dist/themes/graphite.css +658 -0
  58. package/dist/themes/graphite.min.css +1 -0
  59. package/dist/themes/navy.css +657 -0
  60. package/dist/themes/navy.min.css +1 -0
  61. package/dist/themes/slate.css +659 -0
  62. package/dist/themes/slate.min.css +1 -0
  63. package/dist/vds.css +20313 -0
  64. package/dist/vds.min.css +1 -0
  65. package/package.json +64 -0
@@ -0,0 +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
+ }