@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,782 @@
1
+ /************************************************************
2
+ * VLAH DESIGN SYSTEM (VDS) - Documentation Blocks
3
+ *
4
+ * Responsibilities:
5
+ * - Provide the full structural and stylistic engine of VDS documentation:
6
+ * block shells, headers, bodies, sections, previews, and split layouts
7
+ * - Define all code-block behaviours: inline code, long-form code, numbered
8
+ * lines, soft-numbered lines, toolbar, actions, copy states, and diffs
9
+ * - Support high-level documentation semantics: concept, pattern, api,
10
+ * example, highlight, do/dont, steps, columns, stacks, pills, and metadata
11
+ * - Enable compact, surface, elevated, and contrast variants with fully
12
+ * tokenised padding, radii, borders, shadows, and background treatment
13
+ *
14
+ * System Notes:
15
+ * - Fully namespaced under `.doc-block*` to avoid collisions with content
16
+ * components and layout primitives
17
+ * - Pure CSS - no JS required for structure, interaction, or state styling
18
+ * - Code theming is token-driven: inline, block, syntax, and diff tokens
19
+ * come from primitives + theme
20
+ ************************************************************/
21
+
22
+ /* ---------------------------------------------------------
23
+ 1. DOC BLOCK TOKEN DEFINITIONS
24
+ --------------------------------------------------------- */
25
+
26
+ [data-vds-dock-block],
27
+ .vds-dock-block {
28
+ --doc-block-border: var(--color-border-subtle);
29
+
30
+ --doc-block-highlight-border-width: var(--border-width-strong);
31
+ --doc-block-highlight-pad: var(--space-6);
32
+ }
33
+
34
+ /* ---------------------------------------------------------
35
+ 2. ROOT BLOCK
36
+ --------------------------------------------------------- */
37
+
38
+ .doc-block {
39
+ display: flex;
40
+ flex-direction: column;
41
+ gap: var(--space-12);
42
+ padding-top: var(--space-14);
43
+ padding-bottom: var(--space-14);
44
+ border-bottom: 1px solid var(--color-border-subtle);
45
+ }
46
+
47
+ .doc-block:last-child {
48
+ border-bottom: none;
49
+ }
50
+
51
+ .doc-block--surface {
52
+ background-color: var(--color-surface-subtle);
53
+ padding: var(--space-12);
54
+ border-radius: var(--radius-lg);
55
+ border: 1px solid var(--color-border-subtle);
56
+ }
57
+
58
+ .doc-block--elevated {
59
+ background-color: var(--color-surface);
60
+ padding: var(--space-12);
61
+ border-radius: var(--radius-lg);
62
+ border: 1px solid var(--color-border-subtle);
63
+ box-shadow: var(--shadow-1);
64
+ }
65
+
66
+ .doc-block--contrast {
67
+ background-color: var(--color-bg-soft);
68
+ padding: var(--space-14);
69
+ border-radius: var(--radius-lg);
70
+ border-left: var(--border-width-strong) solid var(--color-accent);
71
+ }
72
+
73
+ /* ---------------------------------------------------------
74
+ 3. HEADER
75
+ --------------------------------------------------------- */
76
+
77
+ .doc-block__header {
78
+ display: flex;
79
+ flex-direction: column;
80
+ gap: var(--space-3);
81
+ }
82
+
83
+ .doc-block__title {
84
+ font-size: var(--text-xl);
85
+ font-weight: var(--font-weight-semibold);
86
+ margin: 0;
87
+ color: var(--color-text);
88
+ }
89
+
90
+ .doc-block__subtitle {
91
+ font-size: var(--text-md);
92
+ font-weight: var(--font-weight-semibold);
93
+ margin: 0;
94
+ color: var(--color-text);
95
+ }
96
+
97
+ .doc-block__summary {
98
+ font-size: var(--text-sm);
99
+ color: var(--color-text-muted);
100
+ line-height: var(--line-height-normal);
101
+ }
102
+
103
+ .doc-block__section {
104
+ display: flex;
105
+ flex-direction: column;
106
+ gap: var(--space-3);
107
+ margin-top: var(--space-4);
108
+ margin-bottom: var(--space-4);
109
+ }
110
+
111
+ .doc-block__subsection {
112
+ display: flex;
113
+ flex-direction: column;
114
+ gap: var(--space-2);
115
+ margin-top: var(--space-2);
116
+ margin-bottom: var(--space-2);
117
+ }
118
+
119
+ .doc-block__subsection--compact {
120
+ gap: var(--space-1);
121
+ margin-top: var(--space-1_5);
122
+ margin-bottom: var(--space-1_5);
123
+ }
124
+
125
+ .doc-block__description {
126
+ font-size: var(--text-sm);
127
+ color: var(--color-text-muted);
128
+ line-height: var(--line-height-normal);
129
+ margin: 0;
130
+ }
131
+
132
+ /* ---------------------------------------------------------
133
+ 4. BODY
134
+ --------------------------------------------------------- */
135
+
136
+ .doc-block__body {
137
+ display: flex;
138
+ flex-direction: column;
139
+ gap: var(--space-6);
140
+ }
141
+
142
+ .doc-block__body--tight {
143
+ gap: var(--space-3);
144
+ }
145
+
146
+ .doc-block__body--compact {
147
+ gap: var(--space-2);
148
+ }
149
+
150
+ /* ---------------------------------------------------------
151
+ 5. PREVIEW AREA
152
+ --------------------------------------------------------- */
153
+
154
+ .doc-block__preview {
155
+ position: relative;
156
+ padding: var(--space-8);
157
+ border-radius: var(--radius-lg);
158
+ border: 1px solid var(--color-border-subtle);
159
+ background-color: var(--color-surface);
160
+ }
161
+
162
+ .doc-block__preview .card__body {
163
+ display: flex;
164
+ flex-direction: row;
165
+ flex-wrap: wrap;
166
+ align-items: flex-start;
167
+ gap: var(--space-3);
168
+ }
169
+
170
+ .doc-block__preview--transparent {
171
+ background-color: transparent;
172
+ }
173
+
174
+ .doc-block__preview--inline {
175
+ display: inline-flex;
176
+ align-items: center;
177
+ gap: var(--space-4);
178
+ padding: var(--space-4);
179
+ }
180
+
181
+ .doc-block__preview code:not(pre code) {
182
+ background: var(--code-inline-bg);
183
+ border: 1px solid var(--code-inline-border);
184
+ color: var(--color-text);
185
+ padding: 0.04em 0.3em;
186
+ border-radius: var(--radius-sm);
187
+ font-weight: 500;
188
+ font-size: var(--text-sm);
189
+ }
190
+
191
+ /* ---------------------------------------------------------
192
+ 6. SPLIT LAYOUTS
193
+ --------------------------------------------------------- */
194
+
195
+ .doc-block--split {
196
+ display: grid;
197
+ grid-template-columns: 1fr 1fr;
198
+ grid-gap: var(--space-12);
199
+ gap: var(--space-12);
200
+ }
201
+
202
+ .doc-block--split-left {
203
+ display: grid;
204
+ grid-template-columns: 2fr 1fr;
205
+ grid-gap: var(--space-12);
206
+ gap: var(--space-12);
207
+ }
208
+
209
+ .doc-block--split-right {
210
+ display: grid;
211
+ grid-template-columns: 1fr 2fr;
212
+ grid-gap: var(--space-12);
213
+ gap: var(--space-12);
214
+ }
215
+
216
+ @media (max-width: 1024px) {
217
+ .doc-block--split,
218
+ .doc-block--split-left,
219
+ .doc-block--split-right {
220
+ grid-template-columns: 1fr;
221
+ }
222
+ }
223
+
224
+ /* ---------------------------------------------------------
225
+ 7. CODE BLOCK (core)
226
+ --------------------------------------------------------- */
227
+
228
+ .doc-block__code {
229
+ position: relative;
230
+
231
+ background: var(--code-block-bg);
232
+ border: 1px solid var(--doc-block-border);
233
+ border-radius: var(--radius-lg);
234
+
235
+ padding: var(--space-8);
236
+ padding-top: calc(var(--space-12) + var(--space-4));
237
+
238
+ overflow-x: auto;
239
+ overflow-y: visible;
240
+
241
+ font-family: var(--font-family-mono), monospace;
242
+ font-size: var(--text-sm);
243
+ color: var(--color-text);
244
+ line-height: var(--line-height-relaxed);
245
+
246
+ -webkit-overflow-scrolling: touch;
247
+ }
248
+
249
+ .doc-block__code code,
250
+ .doc-block__code pre {
251
+ background: none;
252
+ border: none;
253
+ padding: 0;
254
+ }
255
+
256
+ /* ---------------------------------------------------------
257
+ 8. CODE TOOLBAR
258
+ --------------------------------------------------------- */
259
+
260
+ .doc-block__toolbar {
261
+ position: absolute;
262
+ top: var(--space-2);
263
+ left: 0;
264
+ right: 0;
265
+
266
+ display: flex;
267
+ justify-content: space-between;
268
+ align-items: center;
269
+ pointer-events: none;
270
+ padding-left: var(--space-4);
271
+ padding-right: var(--space-4);
272
+ }
273
+
274
+ .doc-block__lang {
275
+ pointer-events: auto;
276
+ padding: var(--space-1) var(--space-3);
277
+ font-size: var(--text-xxs);
278
+ font-weight: 600;
279
+ letter-spacing: 0.04em;
280
+ text-transform: uppercase;
281
+
282
+ background-color: var(--color-surface-subtle);
283
+ border: 1px solid var(--color-border-subtle);
284
+ border-radius: var(--radius-sm);
285
+ color: var(--color-text-muted);
286
+ }
287
+
288
+ .doc-block__actions {
289
+ pointer-events: auto;
290
+ display: flex;
291
+ gap: var(--space-2);
292
+ }
293
+
294
+ .doc-block__action {
295
+ padding: var(--space-1) var(--space-3);
296
+ font-size: var(--text-xxs);
297
+ font-weight: 600;
298
+ background-color: var(--color-surface-subtle);
299
+ border: 1px solid var(--color-border-subtle);
300
+ border-radius: var(--radius-sm);
301
+ cursor: pointer;
302
+ -webkit-user-select: none;
303
+ -moz-user-select: none;
304
+ user-select: none;
305
+ transition: background-color var(--transition-fast);
306
+ line-height: 1;
307
+ }
308
+
309
+ .doc-block__action:hover {
310
+ background-color: var(--doc-block-action-hover-bg);
311
+ border-color: var(--doc-block-action-hover-border);
312
+ color: var(--doc-block-action-hover-text);
313
+ }
314
+
315
+ .doc-block__action--active {
316
+ background-color: var(--color-accent-soft);
317
+ border-color: var(--color-accent);
318
+ }
319
+
320
+ /* ---------------------------------------------------------
321
+ 9. COLLAPSIBLE VARIANT
322
+ --------------------------------------------------------- */
323
+
324
+ .doc-block--collapsed .doc-block__code {
325
+ max-height: 12rem;
326
+ overflow: hidden;
327
+ }
328
+
329
+ .doc-block--collapsed .doc-block__code::after {
330
+ content: "";
331
+ position: absolute;
332
+ top: 0;
333
+ right: 0;
334
+ bottom: 0;
335
+ left: 0;
336
+ background: linear-gradient(
337
+ to bottom,
338
+ rgba(0, 0, 0, 0) 0%,
339
+ rgba(0, 0, 0, 0) 60%,
340
+ var(--code-block-bg) 100%
341
+ );
342
+ pointer-events: none;
343
+ }
344
+
345
+ /* ---------------------------------------------------------
346
+ 10. META
347
+ --------------------------------------------------------- */
348
+
349
+ .doc-block__meta {
350
+ font-size: var(--text-xs);
351
+ color: var(--color-text-muted);
352
+ margin-top: var(--space-3);
353
+ }
354
+
355
+ .doc-block__note--danger {
356
+ color: var(--color-danger-strong);
357
+ }
358
+
359
+ .doc-block__note--warning {
360
+ color: var(--color-warning-strong);
361
+ }
362
+
363
+ .doc-block__note--info {
364
+ color: var(--color-info-strong);
365
+ }
366
+
367
+ /* ---------------------------------------------------------
368
+ 11. RESPONSIVE TUNING
369
+ --------------------------------------------------------- */
370
+
371
+ @media (max-width: 768px) {
372
+
373
+ .doc-block {
374
+ gap: var(--space-10);
375
+ padding-top: var(--space-12);
376
+ padding-bottom: var(--space-12);
377
+ }
378
+
379
+ .doc-block__title {
380
+ font-size: var(--text-lg);
381
+ }
382
+
383
+ .doc-block__preview {
384
+ padding: var(--space-6);
385
+ }
386
+
387
+ .doc-block__code {
388
+ padding: var(--space-6);
389
+ padding-top: calc(var(--space-10) + var(--space-2));
390
+ }
391
+ }
392
+
393
+ /* ---------------------------------------------------------
394
+ 12. Syntax Highlighting
395
+ --------------------------------------------------------- */
396
+
397
+ .doc-block__code .token.keyword {
398
+ color: var(--code-syntax-keyword);
399
+ }
400
+
401
+ .doc-block__code .token.string {
402
+ color: var(--code-syntax-string);
403
+ }
404
+
405
+ .doc-block__code .token.number {
406
+ color: var(--code-syntax-number);
407
+ }
408
+
409
+ .doc-block__code .token.operator {
410
+ color: var(--code-syntax-operator);
411
+ }
412
+
413
+ .doc-block__code .token.comment {
414
+ color: var(--code-syntax-comment);
415
+ font-style: italic;
416
+ }
417
+
418
+ .doc-block__code .token.constant {
419
+ color: var(--code-syntax-constant);
420
+ }
421
+
422
+ .doc-block__code .token.func {
423
+ color: var(--code-syntax-function);
424
+ }
425
+
426
+ .doc-block__code .token.var {
427
+ color: var(--code-syntax-variable);
428
+ }
429
+
430
+ /* ---------------------------------------------------------
431
+ 13. Line Numbered
432
+ --------------------------------------------------------- */
433
+
434
+ .doc-block__code--numbered {
435
+ position: relative;
436
+ }
437
+
438
+ .doc-block__code--numbered code {
439
+ counter-reset: line;
440
+ padding-left: calc(var(--space-2) + 2ch);
441
+ }
442
+
443
+ .doc-block__code--numbered code > * {
444
+ counter-increment: line;
445
+ position: relative;
446
+ padding-left: var(--space-2);
447
+ }
448
+
449
+ .doc-block__code--numbered code > *::before {
450
+ content: counter(line);
451
+ position: absolute;
452
+ left: calc(-1 * (var(--space-6) + 2ch));
453
+ width: calc(var(--space-6) + 2ch);
454
+ text-align: right;
455
+ padding-right: var(--space-2);
456
+ color: var(--color-text-soft, var(--color-text-muted));
457
+ font-size: var(--text-xxs, var(--text-xs));
458
+ -webkit-user-select: none;
459
+ -moz-user-select: none;
460
+ user-select: none;
461
+ }
462
+
463
+ /* ---------------------------------------------------------
464
+ 14. Compact Variant
465
+ --------------------------------------------------------- */
466
+
467
+ .doc-block--compact {
468
+ gap: var(--space-6);
469
+ padding-top: var(--space-8);
470
+ padding-bottom: var(--space-8);
471
+ }
472
+
473
+ .doc-block--compact .doc-block__title {
474
+ font-size: var(--text-lg);
475
+ }
476
+
477
+ .doc-block--compact .doc-block__summary {
478
+ font-size: var(--text-xs);
479
+ }
480
+
481
+ .doc-block--compact .doc-block__code {
482
+ padding: var(--space-5);
483
+ padding-top: calc(var(--space-8) + var(--space-2));
484
+ font-size: var(--text-xs);
485
+ line-height: var(--line-height-snug);
486
+ }
487
+
488
+ /* ---------------------------------------------------------
489
+ 15. Side-by-Side Diff Blocks
490
+ <div class="doc-block doc-block--diff">
491
+ <div class="doc-block__code">…old code…</div>
492
+ <div class="doc-block__code">…new code…</div>
493
+ </div>
494
+ --------------------------------------------------------- */
495
+
496
+ .doc-block--diff {
497
+ display: grid;
498
+ grid-template-columns: 1fr 1fr;
499
+ grid-gap: var(--space-12);
500
+ gap: var(--space-12);
501
+ }
502
+
503
+ .doc-block--diff-added {
504
+ background-color: var(--semantic-success-bg);
505
+ }
506
+
507
+ .doc-block--diff-removed {
508
+ background-color: var(--semantic-danger-bg);
509
+ }
510
+
511
+ .doc-block--diff .doc-block__code {
512
+ padding: var(--space-6);
513
+ border-radius: var(--radius-lg);
514
+ }
515
+
516
+ .doc-block--diff-line-add {
517
+ background-color: var(--semantic-success-bg);
518
+ border-left: 3px solid var(--semantic-success-border);
519
+ }
520
+
521
+ .doc-block--diff-line-remove {
522
+ background-color: var(--semantic-danger-bg);
523
+ border-left: 3px solid var(--semantic-danger-border);
524
+ }
525
+
526
+ @media (max-width: 1024px) {
527
+ .doc-block--diff {
528
+ grid-template-columns: 1fr;
529
+ }
530
+ }
531
+
532
+ /* ---------------------------------------------------------
533
+ 16. Copy on Select State
534
+ --------------------------------------------------------- */
535
+
536
+ .doc-block__code.is-copied {
537
+ outline: 2px solid var(--color-accent);
538
+ outline-offset: 2px;
539
+ transition: outline var(--transition-fast);
540
+ }
541
+
542
+ /* ---------------------------------------------------------
543
+ 17. HEADER EXTENSIONS (eyebrow, pills, subtitle)
544
+ --------------------------------------------------------- */
545
+
546
+ .doc-block__eyebrow {
547
+ font-size: var(--text-xxs);
548
+ font-weight: var(--font-weight-semibold);
549
+ text-transform: uppercase;
550
+ letter-spacing: 0.05em;
551
+ color: var(--color-text-soft);
552
+ margin-bottom: var(--space-2);
553
+ }
554
+
555
+ .doc-block__pills {
556
+ display: flex;
557
+ gap: var(--space-2);
558
+ margin-top: var(--space-2);
559
+ }
560
+
561
+ .doc-block__pill {
562
+ font-size: var(--text-xxs);
563
+ font-weight: var(--font-weight-semibold);
564
+ padding: 0 var(--space-2);
565
+ line-height: var(--space-4);
566
+ border-radius: var(--radius-pill);
567
+ background: var(--color-surface-subtle);
568
+ border: 1px solid var(--color-border-subtle);
569
+ color: var(--color-text-muted);
570
+ }
571
+
572
+ /* ---------------------------------------------------------
573
+ 18. AUTHORING HELPERS (stack, columns, grid)
574
+ --------------------------------------------------------- */
575
+
576
+ .doc-block__stack-sm {
577
+ display: flex;
578
+ flex-direction: column;
579
+ gap: var(--space-3);
580
+ }
581
+
582
+ .doc-block__stack-md {
583
+ display: flex;
584
+ flex-direction: column;
585
+ gap: var(--space-6);
586
+ }
587
+
588
+ .doc-block__stack-lg {
589
+ display: flex;
590
+ flex-direction: column;
591
+ gap: var(--space-10);
592
+ }
593
+
594
+ .doc-block__columns-2 {
595
+ display: grid;
596
+ grid-template-columns: repeat(2, 1fr);
597
+ grid-gap: var(--space-6);
598
+ gap: var(--space-6);
599
+ }
600
+
601
+ .doc-block__columns-3 {
602
+ display: grid;
603
+ grid-template-columns: repeat(3, 1fr);
604
+ grid-gap: var(--space-6);
605
+ gap: var(--space-6);
606
+ }
607
+
608
+ @media (max-width: 1024px) {
609
+ .doc-block__columns-2,
610
+ .doc-block__columns-3 {
611
+ grid-template-columns: 1fr;
612
+ }
613
+ }
614
+
615
+ /* ---------------------------------------------------------
616
+ 19. STEPS SYSTEM (tutorial / procedural)
617
+ --------------------------------------------------------- */
618
+
619
+ .doc-block__steps {
620
+ counter-reset: step-counter;
621
+ display: flex;
622
+ flex-direction: column;
623
+ gap: var(--space-6);
624
+ }
625
+
626
+ .doc-block__steps > li {
627
+ list-style: none;
628
+ counter-increment: step-counter;
629
+ position: relative;
630
+ padding-left: var(--space-8);
631
+ }
632
+
633
+ .doc-block__steps > li::before {
634
+ content: counter(step-counter);
635
+ position: absolute;
636
+ left: 0;
637
+ top: 0.1em;
638
+ width: var(--space-6);
639
+ height: var(--space-6);
640
+ border-radius: var(--radius-full);
641
+ background: var(--color-accent-soft);
642
+ color: var(--color-on-accent);
643
+ display: flex;
644
+ align-items: center;
645
+ justify-content: center;
646
+ font-size: var(--text-xs);
647
+ font-weight: var(--font-weight-semibold);
648
+ }
649
+
650
+ /* ---------------------------------------------------------
651
+ 20. CALLOUTS (highlight / do-dont)
652
+ --------------------------------------------------------- */
653
+
654
+ .doc-block__highlight {
655
+ border-left: var(--doc-block-highlight-border-width) solid var(--color-accent);
656
+ padding: var(--doc-block-highlight-pad);
657
+ background: var(--color-surface-subtle);
658
+ border-radius: var(--radius-md);
659
+ color: var(--color-text);
660
+ margin-top: var(--space-3);
661
+ margin-bottom: var(--space-3);
662
+ }
663
+
664
+ .doc-block__do-dont {
665
+ display: grid;
666
+ grid-template-columns: 1fr 1fr;
667
+ grid-gap: var(--space-6);
668
+ gap: var(--space-6);
669
+ }
670
+
671
+ .doc-block__do,
672
+ .doc-block__dont {
673
+ border-radius: var(--radius-lg);
674
+ padding: var(--space-6);
675
+ border: 1px solid var(--color-border-subtle);
676
+ }
677
+
678
+ .doc-block__do {
679
+ background: var(--semantic-success-bg);
680
+ border-color: var(--semantic-success-border);
681
+ color: var(--semantic-success-text);
682
+ }
683
+
684
+ .doc-block__dont {
685
+ background: var(--semantic-danger-bg);
686
+ border-color: var(--semantic-danger-border);
687
+ color: var(--semantic-danger-text);
688
+ }
689
+
690
+ @media (max-width: 1024px) {
691
+ .doc-block__do-dont {
692
+ grid-template-columns: 1fr;
693
+ }
694
+ }
695
+
696
+ /* ---------------------------------------------------------
697
+ 21. SEMANTIC PRESETS (concept / pattern / api / example)
698
+ - Visual density & emphasis only. Non-destructive.
699
+ --------------------------------------------------------- */
700
+
701
+ .doc-block--concept .doc-block__body {
702
+ gap: var(--space-10);
703
+ }
704
+
705
+ .doc-block--pattern .doc-block__preview {
706
+ border-left: var(--border-width-strong) solid var(--color-accent);
707
+ }
708
+
709
+ .doc-block--api .doc-block__body {
710
+ gap: var(--space-8);
711
+ }
712
+
713
+ .doc-block--example {
714
+ display: grid;
715
+ grid-template-columns: 1fr 1fr;
716
+ grid-gap: var(--space-12);
717
+ gap: var(--space-12);
718
+ }
719
+
720
+ @media (max-width: 1024px) {
721
+ .doc-block--example {
722
+ grid-template-columns: 1fr;
723
+ }
724
+ }
725
+
726
+ /* ---------------------------------------------------------
727
+ 22. LINE NUMBERING - SOFT VARIANT
728
+ --------------------------------------------------------- */
729
+
730
+ .doc-block__code--numbered-soft code {
731
+ counter-reset: line;
732
+ padding-left: calc(var(--space-2) + 1.5ch);
733
+ }
734
+
735
+ .doc-block__code--numbered-soft code > * {
736
+ counter-increment: line;
737
+ position: relative;
738
+ padding-left: var(--space-2);
739
+ }
740
+
741
+ .doc-block__code--numbered-soft code > *::before {
742
+ content: counter(line);
743
+ position: absolute;
744
+ left: calc(-1 * (var(--space-5) + 1.5ch));
745
+ width: calc(var(--space-5) + 1.5ch);
746
+ text-align: right;
747
+ padding-right: var(--space-2);
748
+ color: var(--color-text-soft);
749
+ font-size: var(--text-xxs);
750
+ -webkit-user-select: none;
751
+ -moz-user-select: none;
752
+ user-select: none;
753
+ }
754
+
755
+ /* ---------------------------------------------------------
756
+ 23. COLLAPSE / EXPAND HOOKS (additive)
757
+ --------------------------------------------------------- */
758
+
759
+ .doc-block--expanded .doc-block__code {
760
+ max-height: none;
761
+ }
762
+
763
+ .doc-block--expanded .doc-block__code::after {
764
+ display: none;
765
+ }
766
+
767
+ .doc-block__code-toggle {
768
+ font-size: var(--text-xs);
769
+ color: var(--color-text-muted);
770
+ cursor: pointer;
771
+ }
772
+
773
+ /* ---------------------------------------------------------
774
+ 24. REDUCED MOTION (doc-block scoped)
775
+ --------------------------------------------------------- */
776
+
777
+ @media (prefers-reduced-motion: reduce) {
778
+ .doc-block__action,
779
+ .doc-block__code.is-copied {
780
+ transition: none !important;
781
+ }
782
+ }