@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,782 +1 @@
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
- }
1
+ .vds-dock-block,[data-vds-dock-block]{--doc-block-border:var(--color-border-subtle);--doc-block-highlight-border-width:var(--border-width-strong);--doc-block-highlight-pad:var(--space-6)}.doc-block{border-bottom:1px solid var(--color-border-subtle);display:flex;flex-direction:column;gap:var(--space-12);padding-bottom:var(--space-14);padding-top:var(--space-14)}.doc-block:last-child{border-bottom:none}.doc-block--surface{background-color:var(--color-surface-subtle)}.doc-block--elevated,.doc-block--surface{border:1px solid var(--color-border-subtle);border-radius:var(--radius-lg);padding:var(--space-12)}.doc-block--elevated{background-color:var(--color-surface);box-shadow:var(--shadow-1)}.doc-block--contrast{background-color:var(--color-bg-soft);border-left:var(--border-width-strong) solid var(--color-accent);border-radius:var(--radius-lg);padding:var(--space-14)}.doc-block__header{display:flex;flex-direction:column;gap:var(--space-3)}.doc-block__title{font-size:var(--text-xl)}.doc-block__subtitle,.doc-block__title{color:var(--color-text);font-weight:var(--font-weight-semibold);margin:0}.doc-block__subtitle{font-size:var(--text-md)}.doc-block__summary{color:var(--color-text-muted);font-size:var(--text-sm);line-height:var(--line-height-normal)}.doc-block__section{display:flex;flex-direction:column;gap:var(--space-3);margin-bottom:var(--space-4);margin-top:var(--space-4)}.doc-block__subsection{display:flex;flex-direction:column;gap:var(--space-2);margin-bottom:var(--space-2);margin-top:var(--space-2)}.doc-block__subsection--compact{gap:var(--space-1);margin-bottom:var(--space-1_5);margin-top:var(--space-1_5)}.doc-block__description{color:var(--color-text-muted);font-size:var(--text-sm);line-height:var(--line-height-normal);margin:0}.doc-block__body{display:flex;flex-direction:column;gap:var(--space-6)}.doc-block__body--tight{gap:var(--space-3)}.doc-block__body--compact{gap:var(--space-2)}.doc-block__preview{background-color:var(--color-surface);border:1px solid var(--color-border-subtle);border-radius:var(--radius-lg);padding:var(--space-8);position:relative}.doc-block__preview .card__body{align-items:flex-start;display:flex;flex-direction:row;flex-wrap:wrap;gap:var(--space-3)}.doc-block__preview--transparent{background-color:transparent}.doc-block__preview--inline{align-items:center;display:inline-flex;gap:var(--space-4);padding:var(--space-4)}.doc-block__preview code:not(pre code){background:var(--code-inline-bg);border:1px solid var(--code-inline-border);border-radius:var(--radius-sm);color:var(--color-text);font-size:var(--text-sm);font-weight:500;padding:.04em .3em}.doc-block--split{grid-gap:var(--space-12);display:grid;gap:var(--space-12);grid-template-columns:1fr 1fr}.doc-block--split-left{grid-gap:var(--space-12);display:grid;gap:var(--space-12);grid-template-columns:2fr 1fr}.doc-block--split-right{grid-gap:var(--space-12);display:grid;gap:var(--space-12);grid-template-columns:1fr 2fr}@media (max-width:1024px){.doc-block--split,.doc-block--split-left,.doc-block--split-right{grid-template-columns:1fr}}.doc-block__code{-webkit-overflow-scrolling:touch;background:var(--code-block-bg);border:1px solid var(--doc-block-border);border-radius:var(--radius-lg);color:var(--color-text);font-family:var(--font-family-mono),monospace;font-size:var(--text-sm);line-height:var(--line-height-relaxed);overflow-x:auto;overflow-y:visible;padding:var(--space-8);padding-top:calc(var(--space-12) + var(--space-4));position:relative}.doc-block__code code,.doc-block__code pre{background:none;border:none;padding:0}.doc-block__toolbar{align-items:center;display:flex;justify-content:space-between;left:0;padding-left:var(--space-4);padding-right:var(--space-4);pointer-events:none;position:absolute;right:0;top:var(--space-2)}.doc-block__lang{background-color:var(--color-surface-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);color:var(--color-text-muted);font-size:var(--text-xxs);font-weight:600;letter-spacing:.04em;padding:var(--space-1) var(--space-3);pointer-events:auto;text-transform:uppercase}.doc-block__actions{display:flex;gap:var(--space-2);pointer-events:auto}.doc-block__action{background-color:var(--color-surface-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);cursor:pointer;font-size:var(--text-xxs);font-weight:600;line-height:1;padding:var(--space-1) var(--space-3);transition:background-color var(--transition-fast);-webkit-user-select:none;-moz-user-select:none;user-select:none}.doc-block__action:hover{background-color:var(--doc-block-action-hover-bg);border-color:var(--doc-block-action-hover-border);color:var(--doc-block-action-hover-text)}.doc-block__action--active{background-color:var(--color-accent-soft);border-color:var(--color-accent)}.doc-block--collapsed .doc-block__code{max-height:12rem;overflow:hidden}.doc-block--collapsed .doc-block__code:after{background:linear-gradient(to bottom,transparent 0,transparent 60%,var(--code-block-bg) 100%);bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}.doc-block__meta{color:var(--color-text-muted);font-size:var(--text-xs);margin-top:var(--space-3)}.doc-block__note--danger{color:var(--color-danger-strong)}.doc-block__note--warning{color:var(--color-warning-strong)}.doc-block__note--info{color:var(--color-info-strong)}@media (max-width:768px){.doc-block{gap:var(--space-10);padding-bottom:var(--space-12);padding-top:var(--space-12)}.doc-block__title{font-size:var(--text-lg)}.doc-block__code,.doc-block__preview{padding:var(--space-6)}.doc-block__code{padding-top:calc(var(--space-10) + var(--space-2))}}.doc-block__code .token.keyword{color:var(--code-syntax-keyword)}.doc-block__code .token.string{color:var(--code-syntax-string)}.doc-block__code .token.number{color:var(--code-syntax-number)}.doc-block__code .token.operator{color:var(--code-syntax-operator)}.doc-block__code .token.comment{color:var(--code-syntax-comment);font-style:italic}.doc-block__code .token.constant{color:var(--code-syntax-constant)}.doc-block__code .token.func{color:var(--code-syntax-function)}.doc-block__code .token.var{color:var(--code-syntax-variable)}.doc-block__code--numbered{position:relative}.doc-block__code--numbered code{counter-reset:line;padding-left:calc(var(--space-2) + 2ch)}.doc-block__code--numbered code>*{counter-increment:line;padding-left:var(--space-2);position:relative}.doc-block__code--numbered code>:before{color:var(--color-text-soft,var(--color-text-muted));content:counter(line);font-size:var(--text-xxs,var(--text-xs));left:calc((var(--space-6) + 2ch)*-1);padding-right:var(--space-2);position:absolute;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:calc(var(--space-6) + 2ch)}.doc-block--compact{gap:var(--space-6);padding-bottom:var(--space-8);padding-top:var(--space-8)}.doc-block--compact .doc-block__title{font-size:var(--text-lg)}.doc-block--compact .doc-block__summary{font-size:var(--text-xs)}.doc-block--compact .doc-block__code{font-size:var(--text-xs);line-height:var(--line-height-snug);padding:var(--space-5);padding-top:calc(var(--space-8) + var(--space-2))}.doc-block--diff{grid-gap:var(--space-12);display:grid;gap:var(--space-12);grid-template-columns:1fr 1fr}.doc-block--diff-added{background-color:var(--semantic-success-bg)}.doc-block--diff-removed{background-color:var(--semantic-danger-bg)}.doc-block--diff .doc-block__code{border-radius:var(--radius-lg);padding:var(--space-6)}.doc-block--diff-line-add{background-color:var(--semantic-success-bg);border-left:3px solid var(--semantic-success-border)}.doc-block--diff-line-remove{background-color:var(--semantic-danger-bg);border-left:3px solid var(--semantic-danger-border)}@media (max-width:1024px){.doc-block--diff{grid-template-columns:1fr}}.doc-block__code.is-copied{outline:2px solid var(--color-accent);outline-offset:2px;transition:outline var(--transition-fast)}.doc-block__eyebrow{color:var(--color-text-soft);font-size:var(--text-xxs);font-weight:var(--font-weight-semibold);letter-spacing:.05em;margin-bottom:var(--space-2);text-transform:uppercase}.doc-block__pills{display:flex;gap:var(--space-2);margin-top:var(--space-2)}.doc-block__pill{background:var(--color-surface-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-pill);color:var(--color-text-muted);font-size:var(--text-xxs);font-weight:var(--font-weight-semibold);line-height:var(--space-4);padding:0 var(--space-2)}.doc-block__stack-sm{display:flex;flex-direction:column;gap:var(--space-3)}.doc-block__stack-md{display:flex;flex-direction:column;gap:var(--space-6)}.doc-block__stack-lg{display:flex;flex-direction:column;gap:var(--space-10)}.doc-block__columns-2{grid-gap:var(--space-6);display:grid;gap:var(--space-6);grid-template-columns:repeat(2,1fr)}.doc-block__columns-3{grid-gap:var(--space-6);display:grid;gap:var(--space-6);grid-template-columns:repeat(3,1fr)}@media (max-width:1024px){.doc-block__columns-2,.doc-block__columns-3{grid-template-columns:1fr}}.doc-block__steps{counter-reset:step-counter;display:flex;flex-direction:column;gap:var(--space-6)}.doc-block__steps>li{counter-increment:step-counter;list-style:none;padding-left:var(--space-8);position:relative}.doc-block__steps>li:before{align-items:center;background:var(--color-accent-soft);border-radius:var(--radius-full);color:var(--color-on-accent);content:counter(step-counter);display:flex;font-size:var(--text-xs);font-weight:var(--font-weight-semibold);height:var(--space-6);justify-content:center;left:0;position:absolute;top:.1em;width:var(--space-6)}.doc-block__highlight{background:var(--color-surface-subtle);border-left:var(--doc-block-highlight-border-width) solid var(--color-accent);border-radius:var(--radius-md);color:var(--color-text);margin-bottom:var(--space-3);margin-top:var(--space-3);padding:var(--doc-block-highlight-pad)}.doc-block__do-dont{grid-gap:var(--space-6);display:grid;gap:var(--space-6);grid-template-columns:1fr 1fr}.doc-block__do,.doc-block__dont{border:1px solid var(--color-border-subtle);border-radius:var(--radius-lg);padding:var(--space-6)}.doc-block__do{background:var(--semantic-success-bg);border-color:var(--semantic-success-border);color:var(--semantic-success-text)}.doc-block__dont{background:var(--semantic-danger-bg);border-color:var(--semantic-danger-border);color:var(--semantic-danger-text)}@media (max-width:1024px){.doc-block__do-dont{grid-template-columns:1fr}}.doc-block--concept .doc-block__body{gap:var(--space-10)}.doc-block--pattern .doc-block__preview{border-left:var(--border-width-strong) solid var(--color-accent)}.doc-block--api .doc-block__body{gap:var(--space-8)}.doc-block--example{grid-gap:var(--space-12);display:grid;gap:var(--space-12);grid-template-columns:1fr 1fr}@media (max-width:1024px){.doc-block--example{grid-template-columns:1fr}}.doc-block__code--numbered-soft code{counter-reset:line;padding-left:calc(var(--space-2) + 1.5ch)}.doc-block__code--numbered-soft code>*{counter-increment:line;padding-left:var(--space-2);position:relative}.doc-block__code--numbered-soft code>:before{color:var(--color-text-soft);content:counter(line);font-size:var(--text-xxs);left:calc((var(--space-5) + 1.5ch)*-1);padding-right:var(--space-2);position:absolute;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:calc(var(--space-5) + 1.5ch)}.doc-block--expanded .doc-block__code{max-height:none}.doc-block--expanded .doc-block__code:after{display:none}.doc-block__code-toggle{color:var(--color-text-muted);cursor:pointer;font-size:var(--text-xs)}@media (prefers-reduced-motion:reduce){.doc-block__action,.doc-block__code.is-copied{transition:none!important}}