@lupinum/ginko-docs 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/README.md +130 -73
  2. package/app/app.config.ts +14 -12
  3. package/app/app.vue +2 -2
  4. package/app/assets/css/prose.css +2203 -149
  5. package/app/assets/css/tailwind.css +60 -38
  6. package/app/assets/css/theme-palettes.css +309 -0
  7. package/app/components/content/DocumentPageShell.vue +1 -1
  8. package/app/components/content/Feedback.vue +12 -11
  9. package/app/components/content/ImageZoomDialog.vue +84 -0
  10. package/app/components/content/PageMarkdownCopy.vue +2 -0
  11. package/app/components/content/imageZoom.ts +25 -0
  12. package/app/components/mdc/MdcAccordion.vue +6 -3
  13. package/app/components/mdc/MdcAccordionItem.vue +7 -16
  14. package/app/components/mdc/MdcApi.vue +159 -0
  15. package/app/components/mdc/MdcAside.vue +6 -10
  16. package/app/components/mdc/MdcCallout.vue +9 -10
  17. package/app/components/mdc/MdcCard.vue +36 -47
  18. package/app/components/mdc/MdcCards.vue +30 -0
  19. package/app/components/mdc/MdcCodeGroup.vue +4 -0
  20. package/app/components/mdc/MdcCodeTree.vue +234 -0
  21. package/app/components/mdc/MdcCollapse.vue +61 -0
  22. package/app/components/mdc/MdcError.vue +8 -1
  23. package/app/components/mdc/MdcExcerpt.vue +26 -0
  24. package/app/components/mdc/MdcFigure.vue +54 -20
  25. package/app/components/mdc/MdcFiles.vue +120 -0
  26. package/app/components/mdc/MdcIdea.vue +2 -1
  27. package/app/components/mdc/MdcInfo.vue +2 -1
  28. package/app/components/mdc/MdcInlineToc.vue +51 -0
  29. package/app/components/{ui/dialog/DialogHeader.vue → mdc/MdcKbd.vue} +2 -4
  30. package/app/components/mdc/MdcNote.vue +2 -1
  31. package/app/components/mdc/MdcQuiz.vue +43 -83
  32. package/app/components/mdc/MdcQuizQuestion.vue +104 -109
  33. package/app/components/mdc/MdcReadMore.vue +57 -77
  34. package/app/components/mdc/MdcSteps.vue +45 -11
  35. package/app/components/mdc/MdcSuccess.vue +8 -1
  36. package/app/components/mdc/MdcTabs.vue +44 -26
  37. package/app/components/mdc/MdcTimeline.vue +4 -1
  38. package/app/components/mdc/MdcTimelineItem.vue +18 -27
  39. package/app/components/mdc/MdcWarning.vue +8 -1
  40. package/app/components/mdc/api.utils.ts +132 -0
  41. package/app/components/mdc/code-tree.utils.ts +22 -0
  42. package/app/components/mdc/quiz.utils.ts +38 -0
  43. package/app/components/prose/ProseBlockquote.vue +17 -1
  44. package/app/components/prose/ProseH1.vue +1 -1
  45. package/app/components/prose/ProseH2.vue +7 -2
  46. package/app/components/prose/ProseH3.vue +7 -2
  47. package/app/components/prose/ProseH4.vue +17 -2
  48. package/app/components/{ui/kbd/KbdGroup.vue → prose/ProseH5.vue} +4 -3
  49. package/app/components/{ui/card/CardTitle.vue → prose/ProseH6.vue} +4 -3
  50. package/app/components/prose/ProseImg.vue +19 -112
  51. package/app/components/prose/ProsePre.vue +63 -100
  52. package/app/components/prose/ProseTable.vue +5 -3
  53. package/app/components/site/ModeToggle.vue +12 -3
  54. package/app/components/site/SiteBanner.vue +43 -2
  55. package/app/components/site/SiteFooter.vue +3 -5
  56. package/app/components/site/SiteHeader.vue +255 -132
  57. package/app/components/site/SiteHeroCode.vue +164 -0
  58. package/app/components/site/SiteLocaleSwitcher.vue +22 -4
  59. package/app/components/ui/badge/Badge.vue +1 -1
  60. package/app/components/ui/button/Button.vue +1 -1
  61. package/app/components/ui/collapsible/CollapsibleContent.vue +1 -1
  62. package/app/components/ui/dropdown-menu/DropdownMenuContent.vue +14 -4
  63. package/app/components/ui/dropdown-menu/DropdownMenuItem.vue +1 -1
  64. package/app/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +1 -1
  65. package/app/components/ui/dropdown-menu/DropdownMenuSeparator.vue +1 -1
  66. package/app/components/ui/dropdown-menu/index.ts +0 -9
  67. package/app/components/ui/kbd/Kbd.vue +1 -1
  68. package/app/components/ui/kbd/index.ts +0 -1
  69. package/app/components/ui/scroll-area/ScrollArea.vue +1 -1
  70. package/app/components/ui/scroll-area/ScrollBar.vue +1 -1
  71. package/app/components/ui/separator/Separator.vue +1 -1
  72. package/app/components/ui/sheet/SheetContent.vue +1 -1
  73. package/app/components/ui/sheet/SheetDescription.vue +1 -1
  74. package/app/components/ui/sheet/SheetOverlay.vue +1 -1
  75. package/app/components/ui/sheet/SheetTitle.vue +1 -1
  76. package/app/components/ui/sheet/index.ts +0 -3
  77. package/app/components/ui/tabs/Tabs.vue +1 -1
  78. package/app/components/ui/tabs/TabsList.vue +1 -1
  79. package/app/components/ui/tabs/TabsTrigger.vue +1 -1
  80. package/app/components/ui/tabs/index.ts +0 -1
  81. package/app/composables/site-navigation.utils.ts +29 -11
  82. package/app/composables/useContentRouteAlternates.ts +13 -21
  83. package/app/composables/useLocalizedRouteSwitch.ts +1 -1
  84. package/app/composables/useMetaKey.ts +18 -0
  85. package/app/composables/useProseAppearance.ts +24 -0
  86. package/app/composables/useSiteNavigation.ts +3 -18
  87. package/app/config/site.utils.ts +1 -1
  88. package/app/error.vue +1 -5
  89. package/app/features/docs/components/DocsBreadcrumb.vue +37 -0
  90. package/app/features/docs/components/DocsContributeLinks.vue +28 -18
  91. package/app/features/docs/components/DocsMobileToc.vue +12 -8
  92. package/app/features/docs/components/DocsPageContent.vue +84 -47
  93. package/app/features/docs/components/DocsPageNav.vue +1 -1
  94. package/app/features/docs/components/DocsSidebar.vue +30 -20
  95. package/app/features/docs/components/DocsSidebarItem.vue +53 -100
  96. package/app/features/docs/components/DocsSidebarRow.vue +27 -0
  97. package/app/features/docs/components/DocsSidebarTabs.vue +46 -22
  98. package/app/features/docs/components/DocsToc.vue +80 -34
  99. package/app/features/docs/composables/useDocsNavigation.ts +2 -2
  100. package/app/features/docs/composables/useDocsNavigationData.ts +4 -1
  101. package/app/features/docs/composables/useRevealActive.ts +58 -0
  102. package/app/features/docs/composables/useScrollspy.ts +87 -19
  103. package/app/features/docs/docs-navigation.ts +17 -30
  104. package/app/features/docs/toc-context.ts +6 -0
  105. package/app/features/search/command-center.ts +11 -90
  106. package/app/features/search/components/SiteCommandCenter.vue +58 -38
  107. package/app/features/search/useCommandCenter.ts +46 -46
  108. package/app/layouts/docs.vue +1 -1
  109. package/app/lib/errors.ts +2 -49
  110. package/app/pages/blog/[slug].vue +16 -8
  111. package/app/pages/blog/index.vue +26 -13
  112. package/app/pages/docs/index.vue +10 -14
  113. package/app/pages/index.vue +174 -59
  114. package/app/plugins/ginko-docs-theme.ts +12 -0
  115. package/app/utils/content.ts +11 -0
  116. package/app/utils/file-icons.ts +90 -0
  117. package/app/utils/index.ts +7 -1
  118. package/app/utils/repository.ts +20 -0
  119. package/content.js +23 -26
  120. package/content.ts +30 -28
  121. package/i18n/messages/global/blog.ts +4 -0
  122. package/i18n/messages/global/command.ts +6 -2
  123. package/i18n/messages/global/docs.ts +3 -0
  124. package/i18n/messages/global/nav.ts +6 -2
  125. package/i18n/messages/index.ts +3 -3
  126. package/icon-bundle.ts +5 -0
  127. package/index.d.ts +7 -1
  128. package/nuxt.config.ts +2 -2
  129. package/package.json +9 -6
  130. package/runtime/server/agent-markdown.ts +0 -2
  131. package/shared/theme-palettes.ts +37 -0
  132. package/shared/types/app-config.ts +63 -6
  133. package/tags.ts +47 -59
  134. package/app/components/mdc/MdcAlert.vue +0 -34
  135. package/app/components/mdc/MdcCardGroup.vue +0 -47
  136. package/app/components/mdc/MdcDocImg.vue +0 -25
  137. package/app/components/mdc/MdcField.vue +0 -62
  138. package/app/components/mdc/MdcFieldGroup.vue +0 -18
  139. package/app/components/mdc/MdcPassage.vue +0 -32
  140. package/app/components/mdc/MdcQuizOption.vue +0 -91
  141. package/app/components/mdc/MdcReadMoreGroup.vue +0 -18
  142. package/app/components/mdc/MdcShortcut.vue +0 -46
  143. package/app/components/mdc/MdcStep.vue +0 -42
  144. package/app/components/ui/accordion/Accordion.vue +0 -15
  145. package/app/components/ui/accordion/AccordionContent.vue +0 -23
  146. package/app/components/ui/accordion/AccordionItem.vue +0 -24
  147. package/app/components/ui/accordion/AccordionTrigger.vue +0 -35
  148. package/app/components/ui/accordion/index.ts +0 -4
  149. package/app/components/ui/alert/Alert.vue +0 -21
  150. package/app/components/ui/alert/AlertDescription.vue +0 -22
  151. package/app/components/ui/alert/AlertTitle.vue +0 -22
  152. package/app/components/ui/alert/index.ts +0 -34
  153. package/app/components/ui/card/Card.vue +0 -16
  154. package/app/components/ui/card/CardAction.vue +0 -17
  155. package/app/components/ui/card/CardContent.vue +0 -14
  156. package/app/components/ui/card/CardDescription.vue +0 -14
  157. package/app/components/ui/card/CardFooter.vue +0 -14
  158. package/app/components/ui/card/CardHeader.vue +0 -22
  159. package/app/components/ui/card/card-variants.ts +0 -15
  160. package/app/components/ui/card/index.ts +0 -8
  161. package/app/components/ui/checkbox/Checkbox.vue +0 -35
  162. package/app/components/ui/checkbox/index.ts +0 -1
  163. package/app/components/ui/dialog/Dialog.vue +0 -15
  164. package/app/components/ui/dialog/DialogClose.vue +0 -12
  165. package/app/components/ui/dialog/DialogContent.vue +0 -69
  166. package/app/components/ui/dialog/DialogDescription.vue +0 -21
  167. package/app/components/ui/dialog/DialogFooter.vue +0 -15
  168. package/app/components/ui/dialog/DialogOverlay.vue +0 -26
  169. package/app/components/ui/dialog/DialogPortal.vue +0 -12
  170. package/app/components/ui/dialog/DialogTitle.vue +0 -21
  171. package/app/components/ui/dialog/DialogTrigger.vue +0 -12
  172. package/app/components/ui/dialog/index.ts +0 -10
  173. package/app/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +0 -36
  174. package/app/components/ui/dropdown-menu/DropdownMenuGroup.vue +0 -12
  175. package/app/components/ui/dropdown-menu/DropdownMenuLabel.vue +0 -25
  176. package/app/components/ui/dropdown-menu/DropdownMenuShortcut.vue +0 -17
  177. package/app/components/ui/dropdown-menu/DropdownMenuSub.vue +0 -15
  178. package/app/components/ui/dropdown-menu/DropdownMenuSubContent.vue +0 -29
  179. package/app/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +0 -31
  180. package/app/components/ui/input/Input.vue +0 -23
  181. package/app/components/ui/input/index.ts +0 -1
  182. package/app/components/ui/label/Label.vue +0 -14
  183. package/app/components/ui/label/index.ts +0 -1
  184. package/app/components/ui/sheet/SheetClose.vue +0 -12
  185. package/app/components/ui/sheet/SheetFooter.vue +0 -12
  186. package/app/components/ui/sheet/SheetHeader.vue +0 -12
  187. package/app/components/ui/switch/Switch.vue +0 -39
  188. package/app/components/ui/switch/index.ts +0 -1
  189. package/app/components/ui/tabs/TabsContent.vue +0 -21
  190. package/app/components/ui/textarea/Textarea.vue +0 -31
  191. package/app/components/ui/textarea/index.ts +0 -1
  192. package/app/features/docs/composables/useDocsEntryPath.ts +0 -13
  193. package/app/lib/utils.ts +0 -7
  194. package/i18n/messages/source.ts +0 -5
  195. package/runtime/markdown/inline-code-highlight.ts +0 -155
  196. package/runtime/utils.ts +0 -7
@@ -3,7 +3,9 @@
3
3
  [data-fd-codeblock] {
4
4
  --content-prose-foreground: color-mix(in oklab, var(--foreground) 85%, transparent);
5
5
  --content-prose-heading-foreground: color-mix(in oklab, var(--foreground) 90%, transparent);
6
- --content-prose-inline-code-background: var(--background);
6
+ /* Inline code belongs to its surrounding surface; monospace type carries
7
+ the distinction without adding a nested chip background. */
8
+ --content-prose-inline-code-background: transparent;
7
9
  --content-prose-inline-code-foreground: var(--foreground);
8
10
  --content-prose-code-highlight-border: var(--code-border);
9
11
  /* Kept light enough that Shiki's light-plus tokens stay WCAG AA on top. */
@@ -18,8 +20,8 @@
18
20
  .content-prose,
19
21
  .content-prose.content-prose {
20
22
  color: var(--content-prose-foreground);
21
- font-size: 1rem;
22
- line-height: 1.75;
23
+ font-size: 0.9375rem;
24
+ line-height: 1.65;
23
25
  text-wrap: pretty;
24
26
  }
25
27
 
@@ -34,8 +36,8 @@
34
36
  }
35
37
 
36
38
  .content-prose :where(p) {
37
- margin-top: 1rem;
38
- margin-bottom: 1rem;
39
+ margin-top: 0.95em;
40
+ margin-bottom: 0.95em;
39
41
  }
40
42
 
41
43
  .content-prose p,
@@ -45,39 +47,39 @@
45
47
  }
46
48
 
47
49
  .content-prose :where(h1) {
48
- margin-top: 2.5rem;
49
- margin-bottom: 0.75rem;
50
+ margin-top: 2em;
51
+ margin-bottom: 0.5em;
50
52
  }
51
53
 
52
54
  .content-prose h1 {
53
55
  font-size: 1.25rem;
54
- line-height: 1.75rem;
56
+ line-height: 1.35;
55
57
  font-weight: 600;
56
- letter-spacing: 0;
58
+ letter-spacing: -0.02em;
57
59
  }
58
60
 
59
61
  .content-prose :where(h2) {
60
- margin-top: 2.5rem;
61
- margin-bottom: 0.75rem;
62
+ margin-top: 2em;
63
+ margin-bottom: 0.5em;
62
64
  }
63
65
 
64
66
  .content-prose h2 {
65
67
  font-size: 1.25rem;
66
- line-height: 1.75rem;
68
+ line-height: 1.35;
67
69
  font-weight: 600;
68
- letter-spacing: 0;
70
+ letter-spacing: -0.02em;
69
71
  }
70
72
 
71
73
  .content-prose :where(h3) {
72
- margin-top: 2rem;
73
- margin-bottom: 0.5rem;
74
+ margin-top: 1.6em;
75
+ margin-bottom: 0.4em;
74
76
  }
75
77
 
76
78
  .content-prose h3 {
77
- font-size: 1.125rem;
78
- line-height: 1.625rem;
79
+ font-size: 1.03125rem;
80
+ line-height: 1.5;
79
81
  font-weight: 600;
80
- letter-spacing: 0;
82
+ letter-spacing: -0.01em;
81
83
  }
82
84
 
83
85
  .content-prose :where(h4, h5, h6) {
@@ -170,8 +172,8 @@
170
172
  }
171
173
 
172
174
  .content-prose :where(figure, .not-prose) {
173
- margin-top: 1.5rem;
174
- margin-bottom: 1.5rem;
175
+ margin-top: 1.25rem;
176
+ margin-bottom: 1.25rem;
175
177
  }
176
178
 
177
179
  .content-prose :where(figcaption, .content-caption) {
@@ -191,7 +193,7 @@
191
193
  .content-layout-row-border,
192
194
  .content-layout-row-border-dashed {
193
195
  border: 1px solid var(--border);
194
- border-radius: var(--radius-lg);
196
+ border-radius: var(--radius);
195
197
  padding: 0.5rem;
196
198
  }
197
199
 
@@ -201,7 +203,7 @@
201
203
 
202
204
  .content-layout-row-outline,
203
205
  .content-layout-row-outline-dashed {
204
- border-radius: var(--radius-lg);
206
+ border-radius: var(--radius);
205
207
  padding: 0.5rem;
206
208
  outline: 1px solid var(--border);
207
209
  outline-offset: 2px;
@@ -298,15 +300,15 @@
298
300
  display: inline;
299
301
  position: relative;
300
302
  max-width: 100%;
301
- border: 1px solid color-mix(in oklab, var(--foreground) 15%, transparent);
302
303
  border-radius: max(0.3125rem, calc(var(--radius) - 5px));
303
304
  box-decoration-break: clone;
304
305
  -webkit-box-decoration-break: clone;
305
306
  background-color: var(--content-prose-inline-code-background, var(--muted));
306
307
  color: var(--content-prose-inline-code-foreground, var(--foreground));
307
- padding: 0 0.25rem;
308
+ /* em-based so chips scale with tables, callouts, and body text alike */
309
+ padding: 0.14em 0.38em;
308
310
  font-family: var(--font-mono);
309
- font-size: 0.8rem !important;
311
+ font-size: 0.855em !important;
310
312
  font-weight: 400;
311
313
  line-height: inherit;
312
314
  outline: none;
@@ -316,7 +318,7 @@
316
318
  }
317
319
 
318
320
  .content-prose :where(code):not(:where(pre code, [class~="not-prose"], [class~="not-prose"] *)) {
319
- font-size: 0.8rem !important;
321
+ font-size: 0.855em !important;
320
322
  }
321
323
 
322
324
  .content-code.shiki,
@@ -355,14 +357,22 @@
355
357
  margin: 0;
356
358
  }
357
359
 
360
+ /* Tables share the codeblock chrome: a secondary frame around a background
361
+ panel, so tables, codeblocks, and tabs read as one family. */
358
362
  .content-table {
359
363
  width: 100%;
360
364
  margin-top: 1.25rem;
361
365
  margin-bottom: 1.25rem;
362
- overflow-x: auto;
363
- border: 1px solid var(--border);
364
366
  border-radius: var(--radius);
365
- box-shadow: var(--shadow-xs);
367
+ background-color: var(--secondary);
368
+ padding: 0.25rem;
369
+ }
370
+
371
+ .content-table-scroll {
372
+ overflow-x: auto;
373
+ border: 1px solid var(--code-border);
374
+ border-radius: calc(var(--radius) - 2px);
375
+ background-color: var(--background);
366
376
  }
367
377
 
368
378
  .content-table table {
@@ -372,43 +382,34 @@
372
382
  line-height: 1.5rem;
373
383
  }
374
384
 
375
- .content-table thead {
376
- background-color: color-mix(in oklab, var(--muted) 50%, transparent);
377
- }
378
-
379
385
  .content-table th {
380
- height: 2.25rem;
381
- padding: 0.5rem 0.75rem;
386
+ padding: 0.5rem 0.875rem;
382
387
  text-align: left;
383
388
  vertical-align: middle;
384
- color: var(--foreground);
385
- font-weight: 500;
389
+ /* Matches the codeblock caption tone. */
390
+ color: color-mix(in oklab, var(--foreground) 80%, var(--muted-foreground));
391
+ font-weight: 600;
392
+ border-bottom: 1px solid var(--code-border);
386
393
  }
387
394
 
388
395
  .content-table td {
389
- padding: 0.5rem 0.75rem;
396
+ padding: 0.5625rem 0.875rem;
390
397
  vertical-align: middle;
391
- color: var(--muted-foreground);
392
- }
393
-
394
- .content-table tr {
395
- border-bottom: 1px solid var(--border);
396
- transition: background-color 150ms ease;
398
+ color: color-mix(in oklab, var(--foreground) 88%, transparent);
397
399
  }
398
400
 
399
- .content-table tr:hover {
400
- background-color: color-mix(in oklab, var(--muted) 30%, transparent);
401
- }
402
-
403
- .content-table tbody tr:last-child {
404
- border-bottom: 0;
401
+ .content-table tbody tr + tr td {
402
+ border-top: 1px solid color-mix(in oklab, var(--border) 60%, transparent);
405
403
  }
406
404
 
407
- /* Inside tables the wrapper scrolls horizontally, so inline code chips must
408
- not break mid-token (e.g. "content.confi / g.ts" on narrow viewports). */
405
+ /* Keep short table code chips atomic so their cloned decoration cannot leave
406
+ an empty fragment on the previous line. Oversized tokens can still wrap
407
+ inside the chip instead of forcing unbounded horizontal overflow. */
409
408
  .content-table :where(th, td) :where(code, .content-code) {
410
- white-space: nowrap;
411
- overflow-wrap: normal;
409
+ display: inline-block;
410
+ max-width: min(100%, 48ch);
411
+ overflow-wrap: break-word;
412
+ white-space: normal;
412
413
  }
413
414
 
414
415
  html.dark .shiki span {
@@ -427,14 +428,24 @@ html.dark .shiki span {
427
428
  .content-codeblock {
428
429
  min-width: 0;
429
430
  max-width: 100%;
430
- margin-top: 0.875rem;
431
- margin-bottom: 0.875rem;
431
+ margin-top: 1.25rem;
432
+ margin-bottom: 1.25rem;
432
433
  border-radius: var(--radius);
433
434
  color: var(--foreground);
434
435
  font-size: 0.8125rem;
435
436
  line-height: 1.5;
436
437
  }
437
438
 
439
+ /* Consecutive codeblocks read as one run of examples; tighten the seam.
440
+ Both sides shrink because adjacent margins collapse to the larger value. */
441
+ .content-prose :where(.content-codeblock:has(+ .content-codeblock)) {
442
+ margin-bottom: 0.5rem;
443
+ }
444
+
445
+ .content-prose :where(.content-codeblock + .content-codeblock) {
446
+ margin-top: 0.5rem;
447
+ }
448
+
438
449
  .content-codeblock-plain {
439
450
  padding: 0.25rem;
440
451
  }
@@ -468,13 +479,103 @@ html.dark .shiki span {
468
479
  width: 100%;
469
480
  max-width: 100%;
470
481
  overflow-x: auto;
471
- overflow-y: hidden;
482
+ /* auto, not hidden: blocks taller than the max-height cap must scroll,
483
+ otherwise their tail is unreachable. */
484
+ overflow-y: auto;
472
485
  overscroll-behavior-x: none;
473
486
  border: 1px solid var(--code-border);
474
487
  border-radius: calc(var(--radius) - 2px);
475
488
  background-color: var(--background);
476
489
  }
477
490
 
491
+ .content-codeblock-scroll-wrap {
492
+ position: relative;
493
+ min-width: 0;
494
+ }
495
+
496
+ /* Right-edge fade signals clipped horizontal content; hidden at scroll end. */
497
+ .content-codeblock-overflow-fade {
498
+ position: absolute;
499
+ top: 1px;
500
+ right: 1px;
501
+ bottom: 1px;
502
+ width: 2.5rem;
503
+ border-radius: 0 calc(var(--radius) - 3px) calc(var(--radius) - 3px) 0;
504
+ background: linear-gradient(to right, transparent, var(--background));
505
+ pointer-events: none;
506
+ transition: opacity 150ms ease;
507
+ }
508
+
509
+ .content-codeblock-overflow-fade[data-hidden="true"] {
510
+ opacity: 0;
511
+ }
512
+
513
+ /* The `::collapse` component clips tall authored content until the reader
514
+ expands it; expanding removes the cap so the page owns scrolling. */
515
+ .content-collapse {
516
+ position: relative;
517
+ margin-top: 1.25rem;
518
+ margin-bottom: 1.25rem;
519
+ }
520
+
521
+ .content-collapse-region[data-collapsed] {
522
+ max-height: 480px;
523
+ overflow: hidden;
524
+ }
525
+
526
+ .content-collapse-region > :first-child {
527
+ margin-top: 0 !important;
528
+ }
529
+
530
+ .content-collapse-region > :last-child {
531
+ margin-bottom: 0 !important;
532
+ }
533
+
534
+ /* Inside a collapse region the wrapper owns clipping; a nested codeblock
535
+ scroll cap would create a second scroll area. */
536
+ .content-collapse-region .content-codeblock .fd-scroll-container {
537
+ max-height: none;
538
+ }
539
+
540
+ .content-collapse-fade {
541
+ position: absolute;
542
+ right: 0;
543
+ bottom: 0;
544
+ left: 0;
545
+ display: flex;
546
+ height: 5rem;
547
+ align-items: flex-end;
548
+ justify-content: center;
549
+ padding-bottom: 0.625rem;
550
+ background: linear-gradient(to bottom, transparent, var(--background) 82%);
551
+ }
552
+
553
+ .content-collapse-button {
554
+ appearance: none;
555
+ cursor: pointer;
556
+ border: 1px solid var(--border);
557
+ border-radius: 9999px;
558
+ background-color: var(--secondary);
559
+ padding: 0.2rem 0.75rem;
560
+ color: var(--foreground);
561
+ font-family: var(--font-body);
562
+ font-size: 0.75rem;
563
+ font-weight: 500;
564
+ line-height: 1.25rem;
565
+ white-space: nowrap;
566
+ outline: none;
567
+ transition: border-color 150ms ease;
568
+ }
569
+
570
+ .content-collapse-button:hover {
571
+ border-color: color-mix(in oklab, var(--foreground) 25%, transparent);
572
+ }
573
+
574
+ .content-collapse-button:focus-visible {
575
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, transparent);
576
+ outline-offset: 2px;
577
+ }
578
+
478
579
  .content-codeblock pre {
479
580
  min-width: 100%;
480
581
  padding-top: 0.75rem;
@@ -502,7 +603,7 @@ html.dark .shiki span {
502
603
  border: 0;
503
604
  border-radius: var(--radius);
504
605
  background-color: transparent;
505
- color: color-mix(in oklab, var(--primary) 45%, transparent);
606
+ color: var(--muted-foreground);
506
607
  font-size: 0.875rem;
507
608
  font-weight: 500;
508
609
  white-space: nowrap;
@@ -518,12 +619,12 @@ html.dark .shiki span {
518
619
  .content-codeblock-copy-button:hover,
519
620
  .content-codeblock-copy-button:focus-visible {
520
621
  background-color: var(--muted);
521
- color: color-mix(in oklab, var(--primary) 70%, transparent);
622
+ color: var(--foreground);
522
623
  }
523
624
 
524
625
  .content-codeblock-copy-button:focus-visible {
525
626
  opacity: 1;
526
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--ring) 50%, transparent);
627
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--foreground) 25%, transparent);
527
628
  }
528
629
 
529
630
  .content-codeblock-copy-button:active {
@@ -555,8 +656,8 @@ html.dark .shiki span {
555
656
  .content-codegroup {
556
657
  min-width: 0;
557
658
  max-width: 100%;
558
- margin-top: 0.875rem;
559
- margin-bottom: 0.875rem;
659
+ margin-top: 1.25rem;
660
+ margin-bottom: 1.25rem;
560
661
  border-radius: var(--radius);
561
662
  background-color: var(--secondary);
562
663
  padding: 0.125rem 0.25rem 0.25rem;
@@ -574,8 +675,8 @@ html.dark .shiki span {
574
675
  .content-tabs {
575
676
  min-width: 0;
576
677
  max-width: 100%;
577
- margin-top: 0.875rem;
578
- margin-bottom: 0.875rem;
678
+ margin-top: 1.25rem;
679
+ margin-bottom: 1.25rem;
579
680
  border-radius: var(--radius);
580
681
  background-color: var(--secondary);
581
682
  padding: 0.125rem 0.25rem 0.25rem;
@@ -664,6 +765,19 @@ html.dark .shiki span {
664
765
  margin: 0;
665
766
  }
666
767
 
768
+ .content-tabs[data-padded="true"] .content-tabs-content-area {
769
+ padding: 1rem;
770
+ }
771
+
772
+ .content-tabs[data-padded="false"] .content-tabs-content-area {
773
+ padding: 0;
774
+ }
775
+
776
+ .content-tabs-content-area > .content-media:only-child {
777
+ margin: -1rem;
778
+ border: 0;
779
+ }
780
+
667
781
  .content-codegroup-tabs {
668
782
  display: flex;
669
783
  min-width: 0;
@@ -897,9 +1011,9 @@ html.dark .shiki span {
897
1011
 
898
1012
  .content-callout > .content-callout-icon {
899
1013
  display: inline-flex;
900
- width: 1.25rem !important;
901
- height: 1.25rem !important;
902
- transform: none !important;
1014
+ width: 1.25rem;
1015
+ height: 1.25rem;
1016
+ margin-top: 0.25rem;
903
1017
  align-items: center;
904
1018
  justify-content: center;
905
1019
  flex-shrink: 0;
@@ -910,8 +1024,8 @@ html.dark .shiki span {
910
1024
  }
911
1025
 
912
1026
  .content-callout > .content-callout-icon > :where(svg, span, .iconify) {
913
- width: 1.15rem !important;
914
- height: 1.15rem !important;
1027
+ width: 1.15rem;
1028
+ height: 1.15rem;
915
1029
  }
916
1030
 
917
1031
  .content-callout-body {
@@ -959,46 +1073,32 @@ html.dark .shiki span {
959
1073
  color: var(--muted-foreground);
960
1074
  }
961
1075
 
962
- .content-media[data-bleed="true"],
963
- .content-doc-img[data-bleed="true"] {
1076
+ .content-media[data-bleed="true"] {
964
1077
  margin-right: 0;
965
1078
  margin-left: 0;
966
1079
  }
967
1080
 
968
1081
  @media (min-width: 768px) {
969
- .content-media[data-bleed="true"],
970
- .content-doc-img[data-bleed="true"] {
1082
+ .content-media[data-bleed="true"] {
971
1083
  margin-right: calc(var(--content-media-bleed-md) * -1);
972
1084
  margin-left: calc(var(--content-media-bleed-md) * -1);
973
1085
  }
974
1086
  }
975
1087
 
976
1088
  @media (min-width: 1024px) {
977
- .content-media[data-bleed="true"],
978
- .content-doc-img[data-bleed="true"] {
1089
+ .content-media[data-bleed="true"] {
979
1090
  margin-right: calc(var(--content-media-bleed-lg) * -1);
980
1091
  margin-left: calc(var(--content-media-bleed-lg) * -1);
981
1092
  }
982
1093
  }
983
1094
 
984
1095
  @media (min-width: 1280px) {
985
- .content-media[data-bleed="true"],
986
- .content-doc-img[data-bleed="true"] {
1096
+ .content-media[data-bleed="true"] {
987
1097
  margin-right: calc(var(--content-media-bleed-xl) * -1);
988
1098
  margin-left: calc(var(--content-media-bleed-xl) * -1);
989
1099
  }
990
1100
  }
991
1101
 
992
- .content-card-group > * {
993
- margin-top: 0 !important;
994
- margin-bottom: 0 !important;
995
- height: auto !important;
996
- }
997
-
998
- .content-card-group [data-slot="card"] {
999
- height: auto;
1000
- }
1001
-
1002
1102
  .content-card-icon {
1003
1103
  color: var(--content-card-icon-color, var(--muted-foreground));
1004
1104
  }
@@ -1007,63 +1107,17 @@ html.dark .shiki span {
1007
1107
  margin-top: 1rem;
1008
1108
  }
1009
1109
 
1010
- .content-prose > p:has(> img:only-child) {
1110
+ .content-prose :where(p:has(> img:only-child)) {
1011
1111
  margin: 1.5rem 0;
1012
- overflow: hidden;
1013
- border: 1px solid var(--border);
1014
- border-radius: 0.75rem;
1015
- background-color: var(--card);
1016
- box-shadow: var(--shadow-xs);
1017
- }
1018
-
1019
- .content-prose > p:has(> img[bleed="true"]:only-child) {
1020
- margin-right: 0;
1021
- margin-left: 0;
1022
1112
  }
1023
1113
 
1024
- .content-prose > p > img:only-child {
1114
+ .content-prose-image,
1115
+ .content-prose :where(p > img:only-child) {
1025
1116
  display: block;
1026
- width: 100%;
1117
+ max-width: 100%;
1027
1118
  height: auto;
1028
1119
  margin: 0;
1029
- object-fit: cover;
1030
- }
1031
-
1032
- .content-prose > p > img[aspect="video"]:only-child {
1033
- aspect-ratio: 16 / 9;
1034
- }
1035
-
1036
- .content-prose > p > img[aspect="wide"]:only-child {
1037
- aspect-ratio: 21 / 9;
1038
- }
1039
-
1040
- .content-prose > p > img[aspect="square"]:only-child {
1041
- aspect-ratio: 1 / 1;
1042
- }
1043
-
1044
- .content-prose > p > img[aspect="portrait"]:only-child {
1045
- aspect-ratio: 4 / 5;
1046
- }
1047
-
1048
- @media (min-width: 768px) {
1049
- .content-prose > p:has(> img[bleed="true"]:only-child) {
1050
- margin-right: calc(var(--content-media-bleed-md) * -1);
1051
- margin-left: calc(var(--content-media-bleed-md) * -1);
1052
- }
1053
- }
1054
-
1055
- @media (min-width: 1024px) {
1056
- .content-prose > p:has(> img[bleed="true"]:only-child) {
1057
- margin-right: calc(var(--content-media-bleed-lg) * -1);
1058
- margin-left: calc(var(--content-media-bleed-lg) * -1);
1059
- }
1060
- }
1061
-
1062
- @media (min-width: 1280px) {
1063
- .content-prose > p:has(> img[bleed="true"]:only-child) {
1064
- margin-right: calc(var(--content-media-bleed-xl) * -1);
1065
- margin-left: calc(var(--content-media-bleed-xl) * -1);
1066
- }
1120
+ border-radius: var(--radius);
1067
1121
  }
1068
1122
 
1069
1123
  .content-prose-trim > :first-child {
@@ -1114,15 +1168,10 @@ html.dark .shiki span {
1114
1168
  line-height: 1.25rem;
1115
1169
  }
1116
1170
 
1117
- .content-steps[data-variant="numbered"] .content-step-marker {
1171
+ .content-steps[data-mode="numbered"] .content-step-marker {
1118
1172
  border-radius: 9999px;
1119
1173
  }
1120
1174
 
1121
- .content-steps[data-variant="numbered"] .content-step-marker::before {
1122
- content: counter(step);
1123
- counter-increment: step;
1124
- }
1125
-
1126
1175
  .content-step-body {
1127
1176
  padding-block-start: 0.125rem;
1128
1177
  }
@@ -1130,25 +1179,2030 @@ html.dark .shiki span {
1130
1179
  .content-step-title {
1131
1180
  margin: 0 0 0.375rem !important;
1132
1181
  color: var(--foreground);
1133
- font-size: 1rem;
1182
+ font-size: 0.875rem;
1134
1183
  line-height: 1.5rem;
1135
1184
  font-weight: 600;
1136
1185
  }
1137
1186
 
1138
- .fd-scroll-container::-webkit-scrollbar {
1187
+ .fd-scroll-container::-webkit-scrollbar,
1188
+ .content-table-scroll::-webkit-scrollbar {
1139
1189
  width: 5px;
1140
1190
  height: 5px;
1141
1191
  }
1142
1192
 
1143
- .fd-scroll-container::-webkit-scrollbar-thumb {
1193
+ .fd-scroll-container::-webkit-scrollbar-thumb,
1194
+ .content-table-scroll::-webkit-scrollbar-thumb {
1144
1195
  border-radius: 5px;
1145
1196
  background: var(--border);
1146
1197
  }
1147
1198
 
1148
- .fd-scroll-container::-webkit-scrollbar-track {
1199
+ .fd-scroll-container::-webkit-scrollbar-track,
1200
+ .content-table-scroll::-webkit-scrollbar-track {
1149
1201
  background: transparent;
1150
1202
  }
1151
1203
 
1152
- .fd-scroll-container::-webkit-scrollbar-corner {
1204
+ .fd-scroll-container::-webkit-scrollbar-corner,
1205
+ .content-table-scroll::-webkit-scrollbar-corner {
1153
1206
  display: none;
1154
1207
  }
1208
+
1209
+ /* The inline TOC (`::toc`) reuses the docs TOC component inside prose;
1210
+ neutralize prose list and link styling for its own markup. */
1211
+ .content-inline-toc :where(ul, ol) {
1212
+ margin: 0;
1213
+ padding: 0;
1214
+ list-style: none;
1215
+ }
1216
+
1217
+ .content-inline-toc :where(li) {
1218
+ margin: 0;
1219
+ }
1220
+
1221
+ .content-inline-toc :where(a) {
1222
+ color: var(--muted-foreground);
1223
+ font-weight: 400;
1224
+ text-decoration-line: none;
1225
+ }
1226
+
1227
+ .content-inline-toc :where(a:hover) {
1228
+ color: var(--foreground);
1229
+ }
1230
+
1231
+ /* Code tree (`::code-tree`) embeds full ProsePre blocks in its content pane;
1232
+ strip their standalone chrome so they fill the pane. */
1233
+ .content-code-tree-pane .content-codeblock {
1234
+ margin: 0;
1235
+ border: 0;
1236
+ border-radius: 0;
1237
+ }
1238
+
1239
+ /* ProsePre wraps its scroll container for the overflow fade; the wrapper must
1240
+ pass the pane's flex sizing through to the scroll container. */
1241
+ .content-code-tree-pane .content-codeblock-scroll-wrap {
1242
+ min-width: 0;
1243
+ }
1244
+
1245
+ .content-code-tree-pane .fd-scroll-container {
1246
+ max-height: 28rem;
1247
+ }
1248
+
1249
+ /* The code tree list lives inside prose; neutralize prose list styling and
1250
+ own the structural spacing here (utilities lose to these unlayered rules). */
1251
+ .content-code-tree-list {
1252
+ margin: 0;
1253
+ padding: 0.375rem;
1254
+ list-style: none;
1255
+ }
1256
+
1257
+ .content-code-tree-list :where(ul) {
1258
+ margin: 0;
1259
+ margin-inline-start: 1.0625rem;
1260
+ padding: 0;
1261
+ padding-inline-start: 0.5rem;
1262
+ list-style: none;
1263
+ }
1264
+
1265
+ .content-code-tree-list :where(li) {
1266
+ margin: 0;
1267
+ }
1268
+
1269
+ .content-code-tree {
1270
+ display: grid;
1271
+ min-width: 0;
1272
+ max-width: 100%;
1273
+ margin-block: 1.25rem;
1274
+ overflow: hidden;
1275
+ border-radius: var(--radius);
1276
+ color: var(--card-foreground);
1277
+ font-size: 0.8125rem;
1278
+ }
1279
+
1280
+ .content-code-tree[data-appearance="quiet"] {
1281
+ border: 1px solid var(--border);
1282
+ background-color: var(--card);
1283
+ box-shadow: var(--shadow-xs);
1284
+ }
1285
+
1286
+ .content-code-tree[data-appearance="tint"] {
1287
+ gap: 0.25rem;
1288
+ background-color: var(--secondary);
1289
+ padding: 0.25rem;
1290
+ }
1291
+
1292
+ .content-code-tree-list {
1293
+ max-height: 15rem;
1294
+ overflow-y: auto;
1295
+ border-bottom: 1px solid var(--border);
1296
+ background-color: var(--card);
1297
+ }
1298
+
1299
+ .content-code-tree[data-appearance="tint"] .content-code-tree-list,
1300
+ .content-code-tree[data-appearance="tint"] .content-code-tree-pane {
1301
+ overflow: hidden;
1302
+ border: 1px solid color-mix(in oklab, var(--border) 80%, transparent);
1303
+ border-radius: calc(var(--radius) - 2px);
1304
+ background-color: var(--background);
1305
+ box-shadow: var(--shadow-xs);
1306
+ }
1307
+
1308
+ .content-code-tree-pane,
1309
+ .content-code-tree-panel {
1310
+ min-width: 0;
1311
+ }
1312
+
1313
+ .content-code-tree-pane {
1314
+ overflow: hidden;
1315
+ }
1316
+
1317
+ .content-code-tree-row {
1318
+ display: flex;
1319
+ width: 100%;
1320
+ min-height: 2rem;
1321
+ cursor: pointer;
1322
+ align-items: center;
1323
+ gap: 0.5rem;
1324
+ border: 0;
1325
+ border-radius: calc(var(--radius) - 3px);
1326
+ background: transparent;
1327
+ padding: 0.375rem 0.5rem;
1328
+ color: inherit;
1329
+ text-align: start;
1330
+ transition:
1331
+ color 150ms ease,
1332
+ background-color 150ms ease;
1333
+ }
1334
+
1335
+ .content-code-tree-row:hover {
1336
+ background-color: color-mix(in oklab, var(--secondary) 65%, transparent);
1337
+ }
1338
+
1339
+ .content-code-tree-row:focus-visible {
1340
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, transparent);
1341
+ outline-offset: -2px;
1342
+ }
1343
+
1344
+ .content-code-tree-row-active,
1345
+ .content-code-tree-row-active:hover {
1346
+ background-color: color-mix(in oklab, var(--primary) 10%, transparent);
1347
+ color: var(--primary);
1348
+ }
1349
+
1350
+ .content-code-tree-chevron {
1351
+ width: 0.875rem;
1352
+ height: 0.875rem;
1353
+ flex: none;
1354
+ color: var(--muted-foreground);
1355
+ transition: transform 180ms ease-out;
1356
+ }
1357
+
1358
+ .content-code-tree-chevron[data-open="true"] {
1359
+ transform: rotate(90deg);
1360
+ }
1361
+
1362
+ [dir="rtl"] .content-code-tree-chevron:not([data-open="true"]) {
1363
+ transform: rotate(180deg);
1364
+ }
1365
+
1366
+ .content-code-tree-icon {
1367
+ width: 1rem;
1368
+ height: 1rem;
1369
+ flex: none;
1370
+ color: var(--muted-foreground);
1371
+ }
1372
+
1373
+ .content-code-tree-row-active .content-code-tree-icon {
1374
+ color: color-mix(in oklab, var(--primary) 80%, transparent);
1375
+ }
1376
+
1377
+ .content-code-tree-spacer {
1378
+ width: 0.875rem;
1379
+ height: 0.875rem;
1380
+ flex: none;
1381
+ }
1382
+
1383
+ .content-code-tree-label {
1384
+ min-width: 0;
1385
+ overflow: hidden;
1386
+ text-overflow: ellipsis;
1387
+ white-space: nowrap;
1388
+ }
1389
+
1390
+ .content-code-tree-branch {
1391
+ position: relative;
1392
+ border-inline-start: 1px solid var(--border);
1393
+ }
1394
+
1395
+ @media (min-width: 1024px) {
1396
+ .content-code-tree {
1397
+ grid-template-columns: minmax(12rem, 0.85fr) minmax(0, 2fr);
1398
+ }
1399
+
1400
+ .content-code-tree-list {
1401
+ max-height: 28rem;
1402
+ border-right: 1px solid var(--border);
1403
+ border-bottom: 0;
1404
+ }
1405
+
1406
+ [dir="rtl"] .content-code-tree-list {
1407
+ border-right: 0;
1408
+ border-left: 1px solid var(--border);
1409
+ }
1410
+
1411
+ .content-code-tree[data-appearance="tint"] .content-code-tree-list {
1412
+ border: 1px solid color-mix(in oklab, var(--border) 80%, transparent);
1413
+ }
1414
+ }
1415
+
1416
+ /* Prose appearance system ---------------------------------------------------
1417
+ Two appearances, one grammar (RFC-001).
1418
+
1419
+ quiet — the card family: var(--card) surface, 1px var(--border),
1420
+ var(--radius), var(--shadow-xs). Structured blocks add a muted header
1421
+ strip (the code-caption pattern generalized). Accent lives in icons and
1422
+ text, never in fills or bars.
1423
+
1424
+ tint — the tint & bar family: var(--secondary) surface, no outer border.
1425
+ Voice blocks carry an inset 2px rail; object blocks become a 0.25rem tray
1426
+ holding raised var(--background) panels. Raised = interactive or active.
1427
+
1428
+ Shared primitives (identical in both appearances): eyebrow labels, mono
1429
+ meta, one chip, marker tiles, 55%-muted affordances, content-prose bodies.
1430
+ Families keep their own geometry on purpose — do not genericize. */
1431
+
1432
+ /* --- Shared primitives --- */
1433
+
1434
+ /* The p-based selectors match the specificity of `.content-prose p`
1435
+ (0,1,1) so the eyebrow scale survives inside prose containers. */
1436
+ .content-eyebrow,
1437
+ p.content-aside-label,
1438
+ p.content-excerpt-label,
1439
+ p.content-read-more-title {
1440
+ display: flex;
1441
+ align-items: center;
1442
+ gap: 0.4rem;
1443
+ margin: 0 0 0.35rem;
1444
+ color: var(--muted-foreground);
1445
+ font-size: 0.6875rem;
1446
+ font-weight: 600;
1447
+ letter-spacing: 0.08em;
1448
+ line-height: 1.4;
1449
+ text-transform: uppercase;
1450
+ }
1451
+
1452
+ .content-meta,
1453
+ .content-timeline-date,
1454
+ .content-files-annotation,
1455
+ .content-quiz-progress,
1456
+ .content-excerpt-source {
1457
+ color: var(--muted-foreground);
1458
+ font-family: var(--font-mono);
1459
+ font-size: 0.75rem;
1460
+ font-weight: 400;
1461
+ }
1462
+
1463
+ .content-chip {
1464
+ display: inline-flex;
1465
+ align-items: center;
1466
+ border: 1px solid var(--border);
1467
+ border-radius: 0.375rem;
1468
+ background: color-mix(in oklab, var(--muted) 50%, transparent);
1469
+ padding: 0.05rem 0.5rem;
1470
+ color: var(--muted-foreground);
1471
+ font-size: 0.72rem;
1472
+ font-weight: 500;
1473
+ }
1474
+
1475
+ /* --- Callout (voice) -------------------------------------------------------
1476
+ Both appearances keep the canonical 2px semantic rail. Quiet changes only
1477
+ the surface treatment, so intent remains visible without a tinted fill. */
1478
+
1479
+ .content-callout {
1480
+ margin-block: 1.25rem;
1481
+ }
1482
+
1483
+ .content-callout[data-appearance="quiet"] {
1484
+ border: 1px solid var(--border);
1485
+ background-color: var(--card);
1486
+ box-shadow: var(--shadow-xs);
1487
+ padding: 0.75rem 0.9rem 0.75rem 0.4rem;
1488
+ }
1489
+
1490
+ /* --- Aside + excerpt (voice) --- */
1491
+
1492
+ .content-aside,
1493
+ .content-excerpt {
1494
+ position: relative;
1495
+ margin-block: 1.25rem;
1496
+ border-radius: var(--radius);
1497
+ font-size: 0.875rem;
1498
+ line-height: 1.625;
1499
+ }
1500
+
1501
+ .content-aside[data-appearance="quiet"],
1502
+ .content-excerpt[data-appearance="quiet"] {
1503
+ border: 1px solid var(--border);
1504
+ background-color: var(--card);
1505
+ box-shadow: var(--shadow-xs);
1506
+ padding: 0.75rem 1rem;
1507
+ }
1508
+
1509
+ .content-aside[data-appearance="tint"],
1510
+ .content-excerpt[data-appearance="tint"] {
1511
+ background-color: var(--secondary);
1512
+ padding: 0.75rem 1rem 0.75rem 1.15rem;
1513
+ }
1514
+
1515
+ /* The voice rail: an inset 2px bar, muted for asides, accent for excerpts. */
1516
+ .content-aside[data-appearance="tint"]::before,
1517
+ .content-excerpt[data-appearance="tint"]::before {
1518
+ content: "";
1519
+ position: absolute;
1520
+ inset-block: 0.75rem;
1521
+ inset-inline-start: 0.45rem;
1522
+ width: 2px;
1523
+ border-radius: 999px;
1524
+ background-color: color-mix(in oklab, var(--muted-foreground) 45%, transparent);
1525
+ }
1526
+
1527
+ .content-excerpt[data-appearance="tint"]::before {
1528
+ background-color: color-mix(in oklab, var(--info) 70%, transparent);
1529
+ }
1530
+
1531
+ .content-excerpt .content-excerpt-label {
1532
+ color: var(--info);
1533
+ }
1534
+
1535
+ .content-aside-body,
1536
+ .content-excerpt-body {
1537
+ color: var(--muted-foreground);
1538
+ }
1539
+
1540
+ .content-excerpt-body {
1541
+ margin: 0;
1542
+ border: 0;
1543
+ padding: 0;
1544
+ font-size: 0.875rem;
1545
+ font-style: normal;
1546
+ line-height: 1.625;
1547
+ }
1548
+
1549
+ .content-excerpt-source {
1550
+ display: block;
1551
+ margin: 0.5rem 0 0;
1552
+ }
1553
+
1554
+ .content-excerpt-source::before {
1555
+ content: "— ";
1556
+ }
1557
+
1558
+ /* --- Cards (object) --- */
1559
+
1560
+ .content-cards {
1561
+ display: grid;
1562
+ grid-template-columns: 1fr;
1563
+ gap: 0.75rem;
1564
+ margin-block: 1.25rem;
1565
+ }
1566
+
1567
+ .content-cards > * {
1568
+ margin: 0 !important;
1569
+ }
1570
+
1571
+ .content-cards[data-appearance="tint"] {
1572
+ gap: 0.25rem;
1573
+ border-radius: var(--radius);
1574
+ background-color: var(--secondary);
1575
+ padding: 0.25rem;
1576
+ }
1577
+
1578
+ @media (min-width: 640px) {
1579
+ .content-cards[data-columns="2"],
1580
+ .content-cards[data-columns="3"] {
1581
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1582
+ }
1583
+ }
1584
+
1585
+ @media (min-width: 900px) {
1586
+ .content-cards[data-columns="3"] {
1587
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1588
+ }
1589
+ }
1590
+
1591
+ .content-card {
1592
+ position: relative;
1593
+ display: block;
1594
+ height: auto;
1595
+ border-radius: var(--radius);
1596
+ }
1597
+
1598
+ .content-card-standalone {
1599
+ margin-block: 1.25rem;
1600
+ }
1601
+
1602
+ /* A lone tint card carries its own tray so the raised panel sits on tint. */
1603
+ .content-card-standalone[data-appearance="tint"] {
1604
+ background-color: var(--secondary);
1605
+ padding: 0.25rem;
1606
+ }
1607
+
1608
+ .content-card-surface {
1609
+ position: relative;
1610
+ overflow: hidden;
1611
+ border: 1px solid var(--border);
1612
+ border-radius: var(--radius);
1613
+ background-color: var(--card);
1614
+ box-shadow: var(--shadow-xs);
1615
+ color: var(--foreground);
1616
+ transition:
1617
+ border-color 180ms ease-out,
1618
+ background-color 180ms ease-out;
1619
+ }
1620
+
1621
+ .content-card[data-appearance="tint"] .content-card-surface {
1622
+ border-color: color-mix(in oklab, var(--border) 80%, transparent);
1623
+ border-radius: calc(var(--radius) - 2px);
1624
+ background-color: var(--background);
1625
+ }
1626
+
1627
+ .content-card:is(a, [href]) {
1628
+ cursor: pointer;
1629
+ text-decoration: none;
1630
+ }
1631
+
1632
+ .content-card:is(a, [href]):hover .content-card-surface {
1633
+ border-color: color-mix(in oklab, var(--foreground) 18%, var(--border));
1634
+ background-color: color-mix(in oklab, var(--secondary) 55%, var(--card));
1635
+ }
1636
+
1637
+ .content-card[data-appearance="tint"]:is(a, [href]):hover .content-card-surface {
1638
+ border-color: color-mix(in oklab, var(--foreground) 14%, var(--border));
1639
+ background-color: color-mix(in oklab, var(--secondary) 35%, var(--background));
1640
+ }
1641
+
1642
+ .content-card-media {
1643
+ display: block;
1644
+ width: 100%;
1645
+ border-bottom: 1px solid var(--border);
1646
+ object-fit: cover;
1647
+ }
1648
+
1649
+ .content-card-header {
1650
+ padding: 1rem;
1651
+ }
1652
+
1653
+ .content-card-header[data-trailing="true"] {
1654
+ padding-bottom: 0;
1655
+ }
1656
+
1657
+ .content-card-header[data-horizontal="true"] {
1658
+ display: flex;
1659
+ align-items: flex-start;
1660
+ gap: 0.75rem;
1661
+ }
1662
+
1663
+ .content-card-header[data-reserve-link-icon="true"] {
1664
+ padding-right: 2.5rem;
1665
+ }
1666
+
1667
+ /* Marker tile: same primitive as read-more tiles and step markers. */
1668
+ .content-card-tile {
1669
+ display: flex;
1670
+ width: 2.5rem;
1671
+ height: 2.5rem;
1672
+ flex-shrink: 0;
1673
+ align-items: center;
1674
+ justify-content: center;
1675
+ border: 1px solid var(--border);
1676
+ border-radius: calc(var(--radius) - 2px);
1677
+ background-color: var(--muted);
1678
+ box-shadow: var(--shadow-xs);
1679
+ color: var(--content-card-icon-color, var(--muted-foreground));
1680
+ }
1681
+
1682
+ .content-card-header:not([data-horizontal="true"]) .content-card-tile {
1683
+ margin-bottom: 0.5rem;
1684
+ }
1685
+
1686
+ .content-card-tile :where(svg, .iconify) {
1687
+ width: 1.25rem;
1688
+ height: 1.25rem;
1689
+ }
1690
+
1691
+ .content-card-copy {
1692
+ min-width: 0;
1693
+ flex: 1;
1694
+ }
1695
+
1696
+ .content-card-title {
1697
+ color: var(--foreground);
1698
+ font-size: 0.875rem;
1699
+ font-weight: 600;
1700
+ line-height: 1.5;
1701
+ }
1702
+
1703
+ .content-card-description {
1704
+ margin-top: 0.125rem;
1705
+ color: var(--muted-foreground);
1706
+ font-size: 0.875rem;
1707
+ line-height: 1.4;
1708
+ text-wrap: pretty;
1709
+ }
1710
+
1711
+ .content-card-body {
1712
+ padding: 1rem;
1713
+ color: var(--muted-foreground);
1714
+ }
1715
+
1716
+ .content-card-header + .content-card-body {
1717
+ padding-top: 0.5rem;
1718
+ }
1719
+
1720
+ .content-card-body[data-reserve-link-icon="true"] {
1721
+ padding-right: 2.5rem;
1722
+ }
1723
+
1724
+ .content-card-footer {
1725
+ display: flex;
1726
+ flex-direction: column;
1727
+ align-items: stretch;
1728
+ border-top: 1px solid var(--border);
1729
+ padding: 0.65rem 1rem;
1730
+ color: var(--muted-foreground);
1731
+ font-size: 0.75rem;
1732
+ }
1733
+
1734
+ .content-card-footer :where(p) {
1735
+ margin: 0;
1736
+ line-height: 1.5;
1737
+ }
1738
+
1739
+ .content-card-arrow {
1740
+ position: absolute;
1741
+ top: 1rem;
1742
+ right: 1rem;
1743
+ width: 1rem;
1744
+ height: 1rem;
1745
+ pointer-events: none;
1746
+ color: color-mix(in oklab, var(--muted-foreground) 55%, transparent);
1747
+ transition: color 180ms ease-out;
1748
+ }
1749
+
1750
+ .content-card:is(a, [href]):hover .content-card-arrow {
1751
+ color: var(--foreground);
1752
+ }
1753
+
1754
+ /* Cards stacked flush inside another surface (tabs, code trees). */
1755
+ .content-card-in-stack .content-card-surface {
1756
+ border-right: 0;
1757
+ border-left: 0;
1758
+ border-radius: 0;
1759
+ box-shadow: none;
1760
+ }
1761
+
1762
+ .content-card-in-stack:first-child .content-card-surface {
1763
+ border-top-left-radius: var(--radius);
1764
+ border-top-right-radius: var(--radius);
1765
+ }
1766
+
1767
+ .content-card-in-stack:last-child .content-card-surface {
1768
+ border-bottom-left-radius: var(--radius);
1769
+ border-bottom-right-radius: var(--radius);
1770
+ }
1771
+
1772
+ /* --- Read more (object) --- */
1773
+
1774
+ .content-read-more {
1775
+ margin-block: 1.25rem;
1776
+ }
1777
+
1778
+ .content-read-more-list {
1779
+ border-radius: var(--radius);
1780
+ }
1781
+
1782
+ .content-read-more[data-appearance="quiet"] .content-read-more-list {
1783
+ overflow: hidden;
1784
+ border: 1px solid var(--border);
1785
+ background-color: var(--card);
1786
+ box-shadow: var(--shadow-xs);
1787
+ }
1788
+
1789
+ .content-read-more[data-appearance="tint"] .content-read-more-list {
1790
+ display: flex;
1791
+ flex-direction: column;
1792
+ gap: 0.25rem;
1793
+ background-color: var(--secondary);
1794
+ padding: 0.25rem;
1795
+ }
1796
+
1797
+ .content-read-more-link {
1798
+ display: flex;
1799
+ align-items: center;
1800
+ gap: 0.75rem;
1801
+ padding: 0.65rem 0.9rem;
1802
+ color: var(--foreground);
1803
+ text-decoration: none;
1804
+ transition: background-color 180ms ease-out;
1805
+ }
1806
+
1807
+ .content-read-more[data-appearance="quiet"] .content-read-more-link + .content-read-more-link {
1808
+ border-top: 1px solid var(--border);
1809
+ }
1810
+
1811
+ .content-read-more[data-appearance="quiet"] .content-read-more-link:hover {
1812
+ background-color: color-mix(in oklab, var(--secondary) 50%, transparent);
1813
+ }
1814
+
1815
+ .content-read-more[data-appearance="tint"] .content-read-more-link {
1816
+ border: 1px solid color-mix(in oklab, var(--border) 80%, transparent);
1817
+ border-radius: calc(var(--radius) - 2px);
1818
+ background-color: var(--background);
1819
+ box-shadow: var(--shadow-xs);
1820
+ padding: 0.6rem 0.85rem;
1821
+ }
1822
+
1823
+ .content-read-more[data-appearance="tint"] .content-read-more-link:hover {
1824
+ background-color: color-mix(in oklab, var(--secondary) 35%, var(--background));
1825
+ }
1826
+
1827
+ .content-read-more-link:focus-visible {
1828
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, transparent);
1829
+ outline-offset: -2px;
1830
+ }
1831
+
1832
+ /* quiet: bordered marker tile — tint: bare inline icon on the raised panel */
1833
+ .content-read-more-icon {
1834
+ display: flex;
1835
+ flex: none;
1836
+ align-items: center;
1837
+ justify-content: center;
1838
+ color: var(--muted-foreground);
1839
+ }
1840
+
1841
+ .content-read-more[data-appearance="quiet"] .content-read-more-icon {
1842
+ width: 2rem;
1843
+ height: 2rem;
1844
+ border: 1px solid var(--border);
1845
+ border-radius: calc(var(--radius) - 2px);
1846
+ background-color: var(--muted);
1847
+ box-shadow: var(--shadow-xs);
1848
+ }
1849
+
1850
+ .content-read-more-icon :where(svg, .iconify) {
1851
+ width: 1rem;
1852
+ height: 1rem;
1853
+ }
1854
+
1855
+ .content-read-more-copy {
1856
+ min-width: 0;
1857
+ flex: 1;
1858
+ }
1859
+
1860
+ .content-read-more-label,
1861
+ .content-read-more-description {
1862
+ display: block;
1863
+ }
1864
+
1865
+ .content-read-more-label {
1866
+ font-size: 0.875rem;
1867
+ font-weight: 500;
1868
+ }
1869
+
1870
+ .content-read-more-description {
1871
+ margin-top: 0.125rem;
1872
+ color: var(--muted-foreground);
1873
+ font-size: 0.8125rem;
1874
+ }
1875
+
1876
+ .content-read-more-arrow {
1877
+ width: 1rem;
1878
+ height: 1rem;
1879
+ flex: none;
1880
+ color: color-mix(in oklab, var(--muted-foreground) 55%, transparent);
1881
+ transition: color 150ms ease;
1882
+ }
1883
+
1884
+ .content-read-more-link:hover .content-read-more-arrow {
1885
+ color: var(--foreground);
1886
+ }
1887
+
1888
+ /* --- Accordion (object) --- */
1889
+
1890
+ .content-accordion {
1891
+ width: 100%;
1892
+ margin-block: 1.25rem;
1893
+ border-radius: var(--radius);
1894
+ }
1895
+
1896
+ .content-accordion[data-appearance="quiet"] {
1897
+ overflow: hidden;
1898
+ border: 1px solid var(--border);
1899
+ background-color: var(--card);
1900
+ box-shadow: var(--shadow-xs);
1901
+ }
1902
+
1903
+ .content-accordion[data-appearance="quiet"] .content-accordion-item + .content-accordion-item {
1904
+ border-top: 1px solid var(--border);
1905
+ }
1906
+
1907
+ .content-accordion[data-appearance="tint"] {
1908
+ display: flex;
1909
+ flex-direction: column;
1910
+ gap: 0.25rem;
1911
+ background-color: var(--secondary);
1912
+ padding: 0.25rem;
1913
+ }
1914
+
1915
+ .content-accordion[data-appearance="tint"] .content-accordion-item {
1916
+ overflow: hidden;
1917
+ border: 1px solid color-mix(in oklab, var(--border) 80%, transparent);
1918
+ border-radius: calc(var(--radius) - 2px);
1919
+ background-color: var(--background);
1920
+ box-shadow: var(--shadow-xs);
1921
+ }
1922
+
1923
+ /* The header is an h3 for document structure; prose heading margins and
1924
+ type must not leak into the trigger row (h3-prefixed to outrank
1925
+ `.content-prose h3`). */
1926
+ h3.content-accordion-header,
1927
+ .content-accordion-header {
1928
+ display: flex;
1929
+ margin: 0;
1930
+ font-size: 0.875rem;
1931
+ line-height: 1.5;
1932
+ }
1933
+
1934
+ .content-accordion-trigger {
1935
+ display: flex;
1936
+ flex: 1;
1937
+ align-items: center;
1938
+ justify-content: space-between;
1939
+ gap: 1rem;
1940
+ padding: 0.65rem 0.9rem;
1941
+ color: var(--foreground);
1942
+ font-size: 0.875rem;
1943
+ font-weight: 600;
1944
+ line-height: 1.5;
1945
+ text-align: start;
1946
+ transition: background-color 180ms ease-out;
1947
+ }
1948
+
1949
+ .content-accordion-trigger:hover {
1950
+ background-color: color-mix(in oklab, var(--secondary) 50%, transparent);
1951
+ }
1952
+
1953
+ .content-accordion[data-appearance="tint"] .content-accordion-trigger:hover {
1954
+ background-color: color-mix(in oklab, var(--secondary) 35%, var(--background));
1955
+ }
1956
+
1957
+ .content-accordion-trigger:focus-visible {
1958
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, transparent);
1959
+ outline-offset: -2px;
1960
+ }
1961
+
1962
+ .content-accordion-chevron {
1963
+ width: 1rem;
1964
+ height: 1rem;
1965
+ flex: none;
1966
+ color: color-mix(in oklab, var(--muted-foreground) 55%, transparent);
1967
+ transition: transform 200ms ease;
1968
+ }
1969
+
1970
+ .content-accordion-trigger:hover .content-accordion-chevron,
1971
+ .content-accordion-trigger[data-state="open"] .content-accordion-chevron {
1972
+ color: var(--muted-foreground);
1973
+ }
1974
+
1975
+ .content-accordion-trigger[data-state="open"] .content-accordion-chevron {
1976
+ transform: rotate(180deg);
1977
+ }
1978
+
1979
+ .content-accordion-content {
1980
+ overflow: hidden;
1981
+ font-size: 0.875rem;
1982
+ }
1983
+
1984
+ .content-accordion-copy {
1985
+ padding: 0 0.9rem 0.75rem;
1986
+ color: var(--muted-foreground);
1987
+ }
1988
+
1989
+ /* Source disclosures in the component laboratory are intentionally flatter
1990
+ than authored accordions. Their single code block is tooling, not content. */
1991
+ .content-accordion:has(> .content-accordion-item:only-child .content-codeblock) {
1992
+ border-color: color-mix(in oklab, var(--border) 70%, transparent);
1993
+ background: transparent;
1994
+ box-shadow: none;
1995
+ padding: 0;
1996
+ }
1997
+
1998
+ .content-accordion:has(> .content-accordion-item:only-child .content-codeblock)
1999
+ > .content-accordion-item {
2000
+ border: 0;
2001
+ background: transparent;
2002
+ box-shadow: none;
2003
+ }
2004
+
2005
+ .content-accordion:has(> .content-accordion-item:only-child .content-codeblock)
2006
+ .content-accordion-trigger {
2007
+ min-height: 2.25rem;
2008
+ padding: 0.45rem 0.75rem;
2009
+ color: var(--muted-foreground);
2010
+ font-size: 0.8125rem;
2011
+ font-weight: 500;
2012
+ }
2013
+
2014
+ .content-accordion:has(> .content-accordion-item:only-child .content-codeblock)
2015
+ .content-accordion-copy {
2016
+ padding: 0 0 0.25rem;
2017
+ }
2018
+
2019
+ /* --- Tabs (object; canonical tint anatomy defined above) --- */
2020
+
2021
+ .content-tabs[data-appearance="quiet"]:not(.content-tabs-in-stack) {
2022
+ overflow: hidden;
2023
+ border: 1px solid var(--border);
2024
+ background-color: var(--card);
2025
+ box-shadow: var(--shadow-xs);
2026
+ padding: 0.125rem 0.25rem 0.25rem;
2027
+ }
2028
+
2029
+ .content-tabs[data-appearance="quiet"]:not(.content-tabs-in-stack) > .content-tabs-header {
2030
+ padding: 0.25rem;
2031
+ }
2032
+
2033
+ .content-tabs[data-appearance="quiet"]:not(.content-tabs-in-stack) > .content-tabs-panels {
2034
+ border-color: var(--border);
2035
+ border-radius: calc(var(--radius) - 2px);
2036
+ }
2037
+
2038
+ .content-tabs[data-appearance="quiet"]:not(.content-tabs-in-stack) .content-tabs-tab-active,
2039
+ .content-tabs[data-appearance="quiet"]:not(.content-tabs-in-stack)
2040
+ .content-tabs-tab[aria-selected="true"] {
2041
+ background-color: var(--muted);
2042
+ box-shadow: none;
2043
+ }
2044
+
2045
+ /* layout="line": underline tabs, same anatomy as the code group header. */
2046
+ .content-tabs[data-layout="line"] .content-tabs-tab {
2047
+ height: 1.625rem;
2048
+ border: 0;
2049
+ border-bottom: 1px solid transparent;
2050
+ border-radius: 0;
2051
+ background-color: transparent;
2052
+ box-shadow: none;
2053
+ padding: 0 0.375rem 0.25rem;
2054
+ }
2055
+
2056
+ .content-tabs[data-layout="line"] .content-tabs-tab-active,
2057
+ .content-tabs[data-layout="line"] .content-tabs-tab[aria-selected="true"] {
2058
+ border-bottom-color: var(--primary);
2059
+ color: var(--primary);
2060
+ }
2061
+
2062
+ /* --- Code blocks and code groups (object) --- */
2063
+
2064
+ .content-codeblock[data-appearance="quiet"]:not(.content-codeblock-in-group) {
2065
+ overflow: hidden;
2066
+ border: 1px solid var(--border);
2067
+ background-color: var(--card);
2068
+ box-shadow: var(--shadow-xs);
2069
+ padding: 0;
2070
+ }
2071
+
2072
+ .content-codeblock[data-appearance="quiet"]:not(.content-codeblock-in-group) [data-fd-caption] {
2073
+ height: 2rem;
2074
+ border-bottom: 1px solid var(--border);
2075
+ background-color: color-mix(in oklab, var(--muted) 35%, transparent);
2076
+ padding-right: 0.375rem;
2077
+ padding-left: 0.75rem;
2078
+ }
2079
+
2080
+ .content-codeblock[data-appearance="quiet"]:not(.content-codeblock-in-group) .fd-scroll-container {
2081
+ border: 0;
2082
+ border-radius: 0;
2083
+ background-color: transparent;
2084
+ }
2085
+
2086
+ .content-codeblock[data-appearance="quiet"]:not(.content-codeblock-in-group)
2087
+ .content-codeblock-overflow-fade {
2088
+ top: 0;
2089
+ right: 0;
2090
+ bottom: 0;
2091
+ border-radius: 0;
2092
+ background: linear-gradient(to right, transparent, var(--card));
2093
+ }
2094
+
2095
+ .content-codegroup[data-appearance="quiet"] {
2096
+ overflow: hidden;
2097
+ border: 1px solid var(--border);
2098
+ background-color: var(--card);
2099
+ box-shadow: var(--shadow-xs);
2100
+ padding: 0;
2101
+ }
2102
+
2103
+ .content-codegroup[data-appearance="quiet"] .content-codegroup-header {
2104
+ min-height: 2.25rem;
2105
+ border-bottom: 1px solid var(--border);
2106
+ background-color: color-mix(in oklab, var(--muted) 35%, transparent);
2107
+ padding: 0.25rem 0.375rem 0.25rem 0.75rem;
2108
+ }
2109
+
2110
+ .content-codegroup[data-appearance="quiet"] .content-codegroup-panels {
2111
+ border: 0;
2112
+ border-radius: 0;
2113
+ }
2114
+
2115
+ /* Collapse fades to the local surface of the block it clips. */
2116
+ .content-collapse:has(> .content-collapse-region [data-appearance="quiet"]) .content-collapse-fade {
2117
+ background: linear-gradient(to bottom, transparent, var(--card) 82%);
2118
+ }
2119
+
2120
+ /* --- Files (object) --- */
2121
+
2122
+ .content-files {
2123
+ margin-block: 1.25rem;
2124
+ border-radius: var(--radius);
2125
+ padding: 0.375rem;
2126
+ color: var(--foreground);
2127
+ font-size: 0.8125rem;
2128
+ }
2129
+
2130
+ .content-files[data-appearance="quiet"] {
2131
+ overflow: hidden;
2132
+ border: 1px solid var(--border);
2133
+ background-color: var(--card);
2134
+ box-shadow: var(--shadow-xs);
2135
+ }
2136
+
2137
+ .content-files[data-appearance="tint"] {
2138
+ background-color: var(--secondary);
2139
+ }
2140
+
2141
+ .content-files-list {
2142
+ margin: 0;
2143
+ padding: 0;
2144
+ list-style: none;
2145
+ }
2146
+
2147
+ .content-files-list .content-files-list {
2148
+ margin-inline-start: 1rem;
2149
+ border-inline-start: 1px solid var(--border);
2150
+ padding-inline-start: 0.5rem;
2151
+ }
2152
+
2153
+ .content-files[data-appearance="tint"] .content-files-list .content-files-list {
2154
+ border-inline-start-color: color-mix(in oklab, var(--muted-foreground) 25%, transparent);
2155
+ }
2156
+
2157
+ .content-files-item {
2158
+ margin: 0;
2159
+ }
2160
+
2161
+ .content-files-row {
2162
+ display: flex;
2163
+ min-height: 2rem;
2164
+ align-items: center;
2165
+ gap: 0.5rem;
2166
+ border: 1px solid transparent;
2167
+ border-radius: calc(var(--radius) - 2px);
2168
+ padding: 0.3rem 0.5rem;
2169
+ }
2170
+
2171
+ /* quiet: the active file fills with secondary — tint: it raises as a panel. */
2172
+ .content-files[data-appearance="quiet"] .content-files-row[data-active="true"] {
2173
+ background-color: var(--secondary);
2174
+ font-weight: 500;
2175
+ }
2176
+
2177
+ .content-files[data-appearance="tint"] .content-files-row[data-active="true"] {
2178
+ border-color: color-mix(in oklab, var(--border) 80%, transparent);
2179
+ background-color: var(--background);
2180
+ box-shadow: var(--shadow-xs);
2181
+ font-weight: 500;
2182
+ }
2183
+
2184
+ .content-files-icon {
2185
+ width: 1rem;
2186
+ height: 1rem;
2187
+ flex: none;
2188
+ color: var(--muted-foreground);
2189
+ }
2190
+
2191
+ .content-files-name {
2192
+ min-width: 0;
2193
+ overflow-wrap: anywhere;
2194
+ }
2195
+
2196
+ .content-files-annotation {
2197
+ margin-inline-start: auto;
2198
+ padding-inline-start: 0.75rem;
2199
+ }
2200
+
2201
+ /* --- Figure / media (object; canonical quiet anatomy defined above) --- */
2202
+
2203
+ .content-media figcaption {
2204
+ font-size: 0.8125rem;
2205
+ text-align: start;
2206
+ }
2207
+
2208
+ .content-media[data-appearance="tint"] {
2209
+ border: 0;
2210
+ background-color: var(--secondary);
2211
+ box-shadow: none;
2212
+ padding: 0.25rem;
2213
+ }
2214
+
2215
+ .content-media[data-appearance="tint"] img {
2216
+ border: 1px solid color-mix(in oklab, var(--border) 80%, transparent);
2217
+ border-radius: calc(var(--radius) - 2px);
2218
+ box-shadow: var(--shadow-xs);
2219
+ }
2220
+
2221
+ .content-media[data-appearance="tint"] figcaption {
2222
+ border-top: 0;
2223
+ background-color: transparent;
2224
+ padding: 0.4rem 0.55rem 0.3rem;
2225
+ }
2226
+
2227
+ /* --- API (object) — inherits the tabs shell; owns its compact data grammar. */
2228
+
2229
+ .content-api {
2230
+ container-type: inline-size;
2231
+ }
2232
+
2233
+ .content-api-header {
2234
+ display: grid;
2235
+ grid-template-columns: minmax(0, 1fr) auto;
2236
+ align-items: center;
2237
+ }
2238
+
2239
+ .content-api[data-stacked-header="true"] .content-api-header {
2240
+ grid-template-columns: minmax(0, 1fr);
2241
+ align-items: stretch;
2242
+ }
2243
+
2244
+ .content-api-identity {
2245
+ display: flex;
2246
+ min-width: 0;
2247
+ align-items: center;
2248
+ gap: 0.375rem;
2249
+ padding-inline: 0.25rem;
2250
+ white-space: nowrap;
2251
+ }
2252
+
2253
+ .content-api-method {
2254
+ display: inline-flex;
2255
+ height: 1.25rem;
2256
+ flex: none;
2257
+ align-items: center;
2258
+ border-radius: calc(var(--radius) - 4px);
2259
+ background-color: var(--accent-blue-muted);
2260
+ padding-inline: 0.375rem;
2261
+ color: var(--accent-blue);
2262
+ font-family: var(--font-mono);
2263
+ font-size: 0.6875rem;
2264
+ font-weight: 600;
2265
+ line-height: 1;
2266
+ }
2267
+
2268
+ .content-api-path {
2269
+ min-width: 0;
2270
+ overflow: hidden;
2271
+ color: color-mix(in oklab, var(--foreground) 80%, transparent);
2272
+ font-family: var(--font-mono);
2273
+ font-size: 0.8125rem;
2274
+ text-overflow: ellipsis;
2275
+ white-space: nowrap;
2276
+ }
2277
+
2278
+ .content-api-title {
2279
+ color: color-mix(in oklab, var(--foreground) 80%, transparent);
2280
+ font-size: 0.8125rem;
2281
+ font-weight: 500;
2282
+ }
2283
+
2284
+ .content-api-title-icon {
2285
+ width: 0.875rem;
2286
+ height: 0.875rem;
2287
+ flex: none;
2288
+ }
2289
+
2290
+ .content-api-tabs {
2291
+ max-width: 100%;
2292
+ }
2293
+
2294
+ .content-api[data-stacked-header="true"] .content-api-tabs {
2295
+ width: 100%;
2296
+ padding-top: 0.125rem;
2297
+ }
2298
+
2299
+ .content-api-count {
2300
+ border-radius: 999px;
2301
+ background-color: var(--muted);
2302
+ padding: 1px 0.375rem;
2303
+ color: var(--muted-foreground);
2304
+ font-size: 0.6875rem;
2305
+ }
2306
+
2307
+ .content-api-row {
2308
+ display: grid;
2309
+ grid-template-columns: minmax(0, 1fr) auto;
2310
+ align-items: start;
2311
+ column-gap: 1rem;
2312
+ row-gap: 0.125rem;
2313
+ padding: 0.625rem 0.75rem;
2314
+ }
2315
+
2316
+ .content-api-signature {
2317
+ min-width: 0;
2318
+ overflow-x: auto;
2319
+ font-family: var(--font-mono);
2320
+ font-size: 0.8125rem;
2321
+ line-height: 1.4;
2322
+ white-space: nowrap;
2323
+ }
2324
+
2325
+ .content-api-name {
2326
+ color: var(--accent-blue);
2327
+ font-weight: 500;
2328
+ }
2329
+
2330
+ .content-api-name-deprecated {
2331
+ opacity: 0.7;
2332
+ text-decoration: line-through;
2333
+ text-decoration-color: color-mix(in oklab, var(--foreground) 40%, transparent);
2334
+ }
2335
+
2336
+ .content-api-type {
2337
+ color: var(--muted-foreground);
2338
+ }
2339
+
2340
+ .content-api-badges {
2341
+ display: flex;
2342
+ align-items: center;
2343
+ gap: 0.25rem;
2344
+ }
2345
+
2346
+ .content-api-badge {
2347
+ display: inline-flex;
2348
+ height: 1.125rem;
2349
+ align-items: center;
2350
+ border-radius: 999px;
2351
+ padding-inline: 0.4375rem;
2352
+ font-size: 0.6875rem;
2353
+ font-weight: 600;
2354
+ letter-spacing: 0.015em;
2355
+ line-height: 1;
2356
+ }
2357
+
2358
+ .content-api-badge[data-state="required"] {
2359
+ background-color: var(--accent-coral-muted);
2360
+ color: var(--accent-coral);
2361
+ }
2362
+
2363
+ .content-api-badge[data-state="deprecated"] {
2364
+ background-color: var(--accent-yellow-muted);
2365
+ color: var(--warning);
2366
+ }
2367
+
2368
+ .content-api-badge[data-state="since"] {
2369
+ background-color: var(--accent-mint-muted);
2370
+ color: var(--success);
2371
+ }
2372
+
2373
+ .content-api-description {
2374
+ grid-column: 1 / -1;
2375
+ color: var(--muted-foreground);
2376
+ font-size: 0.8125rem;
2377
+ line-height: 1.4;
2378
+ }
2379
+
2380
+ .content-api-inline-code {
2381
+ border-radius: calc(var(--radius) - 4px);
2382
+ background-color: var(--muted);
2383
+ padding: 1px 0.25rem;
2384
+ color: var(--foreground);
2385
+ font-family: var(--font-mono);
2386
+ font-size: 0.75rem;
2387
+ }
2388
+
2389
+ .content-api .content-tabs-panels [role="tabpanel"] > div + div {
2390
+ border-top: 1px solid color-mix(in oklab, var(--border) 60%, transparent);
2391
+ }
2392
+
2393
+ @container (max-width: 34rem) {
2394
+ .content-api-header {
2395
+ grid-template-columns: minmax(0, 1fr);
2396
+ align-items: stretch;
2397
+ }
2398
+
2399
+ .content-api-tabs {
2400
+ width: 100%;
2401
+ padding-top: 0.125rem;
2402
+ }
2403
+ }
2404
+
2405
+ @container (max-width: 24rem) {
2406
+ .content-api-row {
2407
+ grid-template-columns: minmax(0, 1fr);
2408
+ }
2409
+
2410
+ .content-api-badges {
2411
+ grid-row: 2;
2412
+ }
2413
+ }
2414
+
2415
+ /* --- Quiz (object) --- */
2416
+
2417
+ .content-quiz {
2418
+ margin-block: 1.25rem;
2419
+ border-radius: var(--radius);
2420
+ color: var(--foreground);
2421
+ }
2422
+
2423
+ .content-quiz[data-appearance="quiet"] {
2424
+ overflow: hidden;
2425
+ border: 1px solid var(--border);
2426
+ background-color: var(--card);
2427
+ box-shadow: var(--shadow-xs);
2428
+ }
2429
+
2430
+ .content-quiz[data-appearance="tint"] {
2431
+ display: flex;
2432
+ flex-direction: column;
2433
+ gap: 0.25rem;
2434
+ background-color: var(--secondary);
2435
+ padding: 0.25rem;
2436
+ }
2437
+
2438
+ .content-quiz-header {
2439
+ display: flex;
2440
+ align-items: center;
2441
+ gap: 0.6rem;
2442
+ min-height: 2.25rem;
2443
+ padding: 0.4rem 0.9rem;
2444
+ }
2445
+
2446
+ .content-quiz[data-appearance="quiet"] .content-quiz-header {
2447
+ border-bottom: 1px solid var(--border);
2448
+ background-color: color-mix(in oklab, var(--muted) 35%, transparent);
2449
+ }
2450
+
2451
+ .content-quiz[data-appearance="tint"] .content-quiz-header {
2452
+ padding: 0.3rem 0.65rem 0.15rem;
2453
+ }
2454
+
2455
+ .content-quiz-header-icon {
2456
+ width: 1rem;
2457
+ height: 1rem;
2458
+ flex: none;
2459
+ color: var(--muted-foreground);
2460
+ }
2461
+
2462
+ .content-quiz-heading {
2463
+ min-width: 0;
2464
+ flex: 1;
2465
+ display: flex;
2466
+ flex-wrap: wrap;
2467
+ align-items: baseline;
2468
+ column-gap: 0.6rem;
2469
+ }
2470
+
2471
+ .content-quiz-title {
2472
+ color: var(--foreground);
2473
+ font-size: 0.875rem;
2474
+ font-weight: 600;
2475
+ line-height: 1.5;
2476
+ }
2477
+
2478
+ .content-quiz-description {
2479
+ color: var(--muted-foreground);
2480
+ font-size: 0.8125rem;
2481
+ }
2482
+
2483
+ .content-quiz-body {
2484
+ padding: 0.9rem;
2485
+ }
2486
+
2487
+ .content-quiz[data-appearance="tint"] .content-quiz-body {
2488
+ border: 1px solid color-mix(in oklab, var(--border) 80%, transparent);
2489
+ border-radius: calc(var(--radius) - 2px);
2490
+ background-color: var(--background);
2491
+ box-shadow: var(--shadow-xs);
2492
+ }
2493
+
2494
+ .content-quiz-footer {
2495
+ display: flex;
2496
+ flex-wrap: wrap;
2497
+ align-items: center;
2498
+ justify-content: space-between;
2499
+ gap: 0.6rem;
2500
+ padding: 0.5rem 0.9rem;
2501
+ }
2502
+
2503
+ .content-quiz[data-appearance="quiet"] .content-quiz-footer {
2504
+ border-top: 1px solid var(--border);
2505
+ }
2506
+
2507
+ .content-quiz[data-appearance="tint"] .content-quiz-footer {
2508
+ padding: 0.35rem 0.65rem;
2509
+ }
2510
+
2511
+ .content-quiz-dots {
2512
+ display: flex;
2513
+ align-items: center;
2514
+ gap: 0.375rem;
2515
+ }
2516
+
2517
+ .content-quiz-dot {
2518
+ width: 0.5rem;
2519
+ height: 0.5rem;
2520
+ flex: none;
2521
+ appearance: none;
2522
+ border: 0;
2523
+ border-radius: 999px;
2524
+ background-color: color-mix(in oklab, var(--muted-foreground) 30%, transparent);
2525
+ padding: 0;
2526
+ cursor: pointer;
2527
+ transition:
2528
+ background-color 150ms ease,
2529
+ transform 150ms ease,
2530
+ box-shadow 150ms ease;
2531
+ }
2532
+
2533
+ .content-quiz-dot[data-state="answered"] {
2534
+ background-color: var(--primary);
2535
+ }
2536
+
2537
+ .content-quiz-dot[data-state="active"] {
2538
+ background-color: var(--primary);
2539
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--primary) 30%, transparent);
2540
+ transform: scale(1.15);
2541
+ }
2542
+
2543
+ .content-quiz-dot:focus-visible {
2544
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, transparent);
2545
+ outline-offset: 2px;
2546
+ }
2547
+
2548
+ .content-quiz-nav {
2549
+ display: flex;
2550
+ align-items: center;
2551
+ gap: 0.5rem;
2552
+ }
2553
+
2554
+ .content-quiz-button {
2555
+ display: inline-flex;
2556
+ height: 2rem;
2557
+ align-items: center;
2558
+ justify-content: center;
2559
+ gap: 0.375rem;
2560
+ appearance: none;
2561
+ cursor: pointer;
2562
+ border: 1px solid var(--border);
2563
+ border-radius: 999px;
2564
+ background-color: var(--secondary);
2565
+ padding: 0 0.75rem;
2566
+ color: var(--foreground);
2567
+ font-family: var(--font-body);
2568
+ font-size: 0.75rem;
2569
+ font-weight: 500;
2570
+ line-height: 1.25rem;
2571
+ white-space: nowrap;
2572
+ transition:
2573
+ border-color 150ms ease,
2574
+ background-color 150ms ease;
2575
+ }
2576
+
2577
+ .content-quiz-button :where(svg, .iconify) {
2578
+ width: 0.875rem;
2579
+ height: 0.875rem;
2580
+ }
2581
+
2582
+ .content-quiz-button:hover:not(:disabled) {
2583
+ border-color: color-mix(in oklab, var(--foreground) 25%, transparent);
2584
+ }
2585
+
2586
+ .content-quiz-button:disabled {
2587
+ pointer-events: none;
2588
+ opacity: 0.5;
2589
+ }
2590
+
2591
+ .content-quiz-button:focus-visible {
2592
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, transparent);
2593
+ outline-offset: 2px;
2594
+ }
2595
+
2596
+ .content-quiz-button-ghost {
2597
+ border-color: transparent;
2598
+ background-color: transparent;
2599
+ color: var(--muted-foreground);
2600
+ }
2601
+
2602
+ .content-quiz-button-ghost:hover:not(:disabled) {
2603
+ border-color: transparent;
2604
+ background-color: var(--secondary);
2605
+ color: var(--foreground);
2606
+ }
2607
+
2608
+ .content-quiz-question {
2609
+ display: grid;
2610
+ gap: 0.9rem;
2611
+ }
2612
+
2613
+ /* A quiz-question used directly in prose, outside a ::quiz shell. */
2614
+ .content-quiz-question-standalone {
2615
+ margin-block: 1.25rem;
2616
+ }
2617
+
2618
+ .content-quiz-question-title {
2619
+ margin: 0;
2620
+ color: var(--foreground);
2621
+ font-size: 0.875rem;
2622
+ font-weight: 600;
2623
+ line-height: 1.5;
2624
+ }
2625
+
2626
+ .content-quiz-question-hint {
2627
+ margin-inline-start: 0.5rem;
2628
+ color: var(--muted-foreground);
2629
+ font-size: 0.75rem;
2630
+ font-weight: 400;
2631
+ }
2632
+
2633
+ .content-quiz-options {
2634
+ display: grid;
2635
+ gap: 0.5rem;
2636
+ }
2637
+
2638
+ .content-quiz-option {
2639
+ display: flex;
2640
+ width: 100%;
2641
+ align-items: center;
2642
+ gap: 0.75rem;
2643
+ appearance: none;
2644
+ cursor: pointer;
2645
+ border: 1px solid var(--border);
2646
+ border-radius: calc(var(--radius) - 2px);
2647
+ background-color: transparent;
2648
+ padding: 0.5rem 0.75rem;
2649
+ color: var(--foreground);
2650
+ font-size: 0.875rem;
2651
+ text-align: start;
2652
+ transition:
2653
+ border-color 180ms ease-out,
2654
+ background-color 180ms ease-out;
2655
+ }
2656
+
2657
+ .content-quiz-option:not(:disabled):hover {
2658
+ background-color: color-mix(in oklab, var(--secondary) 50%, transparent);
2659
+ }
2660
+
2661
+ .content-quiz-option:disabled {
2662
+ cursor: default;
2663
+ }
2664
+
2665
+ .content-quiz-option:focus-visible {
2666
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, transparent);
2667
+ outline-offset: 2px;
2668
+ }
2669
+
2670
+ .content-quiz-option[data-state="selected"] {
2671
+ border-color: color-mix(in oklab, var(--primary) 55%, var(--border));
2672
+ background-color: color-mix(in oklab, var(--primary) 8%, transparent);
2673
+ }
2674
+
2675
+ .content-quiz-option[data-state="correct"] {
2676
+ border-color: color-mix(in oklab, var(--success) 55%, var(--border));
2677
+ background-color: color-mix(in oklab, var(--success) 8%, transparent);
2678
+ }
2679
+
2680
+ .content-quiz-option[data-state="incorrect"] {
2681
+ border-color: color-mix(in oklab, var(--destructive) 55%, var(--border));
2682
+ background-color: color-mix(in oklab, var(--destructive) 7%, transparent);
2683
+ }
2684
+
2685
+ .content-quiz-option-key {
2686
+ display: grid;
2687
+ width: 1.5rem;
2688
+ height: 1.5rem;
2689
+ flex: none;
2690
+ place-items: center;
2691
+ border-radius: calc(var(--radius) - 4px);
2692
+ background-color: var(--muted);
2693
+ color: var(--muted-foreground);
2694
+ font-size: 0.75rem;
2695
+ font-weight: 700;
2696
+ }
2697
+
2698
+ .content-quiz-option[data-state="selected"] .content-quiz-option-key {
2699
+ background-color: var(--primary);
2700
+ color: var(--primary-foreground);
2701
+ }
2702
+
2703
+ .content-quiz-option[data-state="correct"] .content-quiz-option-key {
2704
+ background-color: var(--success);
2705
+ color: var(--success-foreground);
2706
+ }
2707
+
2708
+ .content-quiz-option[data-state="incorrect"] .content-quiz-option-key {
2709
+ background-color: var(--destructive);
2710
+ color: var(--destructive-foreground);
2711
+ }
2712
+
2713
+ .content-quiz-option-label {
2714
+ min-width: 0;
2715
+ flex: 1;
2716
+ }
2717
+
2718
+ .content-quiz-option-result {
2719
+ width: 1rem;
2720
+ height: 1rem;
2721
+ flex: none;
2722
+ }
2723
+
2724
+ .content-quiz-option[data-state="correct"] .content-quiz-option-result {
2725
+ color: var(--success);
2726
+ }
2727
+
2728
+ .content-quiz-option[data-state="incorrect"] .content-quiz-option-result {
2729
+ color: var(--destructive);
2730
+ }
2731
+
2732
+ .content-quiz-actions {
2733
+ display: flex;
2734
+ align-items: center;
2735
+ gap: 0.75rem;
2736
+ }
2737
+
2738
+ .content-quiz-result {
2739
+ font-size: 0.875rem;
2740
+ font-weight: 500;
2741
+ }
2742
+
2743
+ .content-quiz-result[data-state="correct"] {
2744
+ color: var(--success);
2745
+ }
2746
+
2747
+ .content-quiz-result[data-state="incorrect"] {
2748
+ color: var(--destructive);
2749
+ }
2750
+
2751
+ .content-quiz-explanation {
2752
+ display: flex;
2753
+ gap: 0.6rem;
2754
+ border: 1px solid color-mix(in oklab, var(--info) 25%, var(--border));
2755
+ border-radius: calc(var(--radius) - 2px);
2756
+ background-color: color-mix(in oklab, var(--info) 7%, transparent);
2757
+ padding: 0.65rem 0.85rem;
2758
+ color: var(--foreground);
2759
+ font-size: 0.875rem;
2760
+ }
2761
+
2762
+ .content-quiz-explanation-icon {
2763
+ width: 1rem;
2764
+ height: 1rem;
2765
+ flex: none;
2766
+ margin-top: 0.15rem;
2767
+ color: var(--info);
2768
+ }
2769
+
2770
+ .content-quiz-results {
2771
+ display: flex;
2772
+ flex-direction: column;
2773
+ align-items: center;
2774
+ gap: 1rem;
2775
+ padding: 1.75rem 0.9rem;
2776
+ text-align: center;
2777
+ }
2778
+
2779
+ .content-quiz-results-icon {
2780
+ display: grid;
2781
+ width: 3rem;
2782
+ height: 3rem;
2783
+ place-items: center;
2784
+ border-radius: 999px;
2785
+ background-color: var(--muted);
2786
+ color: var(--muted-foreground);
2787
+ }
2788
+
2789
+ .content-quiz-results-icon[data-state="perfect"] {
2790
+ background-color: color-mix(in oklab, var(--success) 12%, transparent);
2791
+ color: var(--success);
2792
+ }
2793
+
2794
+ .content-quiz-results-icon :where(svg, .iconify) {
2795
+ width: 1.5rem;
2796
+ height: 1.5rem;
2797
+ }
2798
+
2799
+ .content-quiz-results-score {
2800
+ margin: 0;
2801
+ color: var(--foreground);
2802
+ font-size: 1rem;
2803
+ font-weight: 600;
2804
+ }
2805
+
2806
+ .content-quiz-results-note {
2807
+ margin: 0.25rem 0 0;
2808
+ color: var(--muted-foreground);
2809
+ font-size: 0.875rem;
2810
+ }
2811
+
2812
+ /* --- Timeline (sequence) ---------------------------------------------------
2813
+ quiet: the steps rail — 1px hairline, 1.75rem bordered tile markers,
2814
+ title-first head row, accent chip for the phase.
2815
+ tint: the RFC v2 rail — one continuous 2px bar, dot markers, tint date
2816
+ chips, uppercase phase, and an accent segment only through the active
2817
+ item. */
2818
+
2819
+ .content-timeline {
2820
+ position: relative;
2821
+ margin: 1.5rem 0 1.75rem;
2822
+ }
2823
+
2824
+ .content-timeline-item {
2825
+ position: relative;
2826
+ padding-bottom: 1.5rem;
2827
+ }
2828
+
2829
+ .content-timeline-item:last-child {
2830
+ padding-bottom: 0;
2831
+ }
2832
+
2833
+ .content-timeline-head {
2834
+ display: flex;
2835
+ flex-wrap: wrap;
2836
+ align-items: center;
2837
+ gap: 0.5rem;
2838
+ margin-bottom: 0.25rem;
2839
+ }
2840
+
2841
+ .content-timeline-title {
2842
+ order: 1;
2843
+ margin: 0;
2844
+ color: var(--foreground);
2845
+ font-size: 0.875rem;
2846
+ font-weight: 600;
2847
+ line-height: 1.5;
2848
+ }
2849
+
2850
+ .content-timeline-date {
2851
+ order: 2;
2852
+ }
2853
+
2854
+ .content-timeline-label {
2855
+ order: 3;
2856
+ }
2857
+
2858
+ .content-timeline-body {
2859
+ color: var(--muted-foreground);
2860
+ font-size: 0.875rem;
2861
+ }
2862
+
2863
+ .content-timeline-marker {
2864
+ position: absolute;
2865
+ display: flex;
2866
+ align-items: center;
2867
+ justify-content: center;
2868
+ }
2869
+
2870
+ /* quiet */
2871
+
2872
+ .content-timeline[data-appearance="quiet"] {
2873
+ margin-inline-start: 0.875rem;
2874
+ border-inline-start: 1px solid var(--border);
2875
+ padding-inline-start: 2rem;
2876
+ }
2877
+
2878
+ .content-timeline[data-appearance="quiet"] .content-timeline-marker {
2879
+ inset-block-start: 0.125rem;
2880
+ inset-inline-start: -2.875rem;
2881
+ width: 1.75rem;
2882
+ height: 1.75rem;
2883
+ border: 1px solid var(--border);
2884
+ border-radius: calc(var(--radius) - 2px);
2885
+ background-color: var(--secondary);
2886
+ color: var(--muted-foreground);
2887
+ }
2888
+
2889
+ .content-timeline[data-appearance="quiet"] .content-timeline-marker-icon {
2890
+ width: 0.85rem;
2891
+ height: 0.85rem;
2892
+ }
2893
+
2894
+ .content-timeline[data-appearance="quiet"]
2895
+ .content-timeline-marker-icon
2896
+ + .content-timeline-marker-dot {
2897
+ display: none;
2898
+ }
2899
+
2900
+ .content-timeline[data-appearance="quiet"] .content-timeline-marker-dot {
2901
+ width: 0.375rem;
2902
+ height: 0.375rem;
2903
+ border-radius: 999px;
2904
+ background-color: var(--muted-foreground);
2905
+ }
2906
+
2907
+ .content-timeline[data-appearance="quiet"] .content-timeline-date {
2908
+ order: 2;
2909
+ }
2910
+
2911
+ .content-timeline[data-appearance="quiet"] .content-timeline-label {
2912
+ display: inline-flex;
2913
+ align-items: center;
2914
+ border-radius: 0.375rem;
2915
+ background-color: color-mix(in oklab, var(--info) 12%, transparent);
2916
+ padding: 0.05rem 0.5rem;
2917
+ color: var(--info);
2918
+ font-size: 0.72rem;
2919
+ font-weight: 500;
2920
+ }
2921
+
2922
+ /* tint (RFC v2: the bar IS the timeline) */
2923
+
2924
+ .content-timeline[data-appearance="tint"] {
2925
+ padding-inline-start: 1.75rem;
2926
+ }
2927
+
2928
+ .content-timeline[data-appearance="tint"]::before {
2929
+ content: "";
2930
+ position: absolute;
2931
+ inset-block: 0.45rem;
2932
+ inset-inline-start: 0.37rem;
2933
+ width: 2px;
2934
+ border-radius: 999px;
2935
+ background-color: color-mix(in oklab, var(--muted-foreground) 22%, transparent);
2936
+ }
2937
+
2938
+ .content-timeline[data-appearance="tint"] .content-timeline-marker {
2939
+ inset-block-start: 0.3rem;
2940
+ inset-inline-start: -1.75rem;
2941
+ width: 0.875rem;
2942
+ height: 0.875rem;
2943
+ border-radius: 999px;
2944
+ background-color: var(--secondary);
2945
+ outline: 3px solid var(--background);
2946
+ }
2947
+
2948
+ .content-timeline[data-appearance="tint"] .content-timeline-marker-icon {
2949
+ display: none;
2950
+ }
2951
+
2952
+ .content-timeline[data-appearance="tint"] .content-timeline-marker-dot {
2953
+ width: 0.375rem;
2954
+ height: 0.375rem;
2955
+ border-radius: 999px;
2956
+ background-color: var(--muted-foreground);
2957
+ }
2958
+
2959
+ .content-timeline[data-appearance="tint"]
2960
+ .content-timeline-item[data-active="true"]
2961
+ .content-timeline-marker-dot {
2962
+ background-color: var(--info);
2963
+ }
2964
+
2965
+ /* The accent segment runs only through the active item. */
2966
+ .content-timeline[data-appearance="tint"] .content-timeline-item[data-active="true"]::before {
2967
+ content: "";
2968
+ position: absolute;
2969
+ inset-block: 0.95rem 0;
2970
+ inset-inline-start: calc(-1.75rem + 0.37rem);
2971
+ width: 2px;
2972
+ border-radius: 999px;
2973
+ background-color: color-mix(in oklab, var(--info) 65%, transparent);
2974
+ }
2975
+
2976
+ .content-timeline[data-appearance="tint"] .content-timeline-title {
2977
+ order: 4;
2978
+ flex-basis: 100%;
2979
+ }
2980
+
2981
+ .content-timeline[data-appearance="tint"] .content-timeline-date {
2982
+ border-radius: 0.375rem;
2983
+ background-color: var(--secondary);
2984
+ padding: 0.05rem 0.5rem;
2985
+ font-size: 0.72rem;
2986
+ }
2987
+
2988
+ .content-timeline[data-appearance="tint"] .content-timeline-label {
2989
+ color: var(--muted-foreground);
2990
+ font-size: 0.6875rem;
2991
+ font-weight: 600;
2992
+ letter-spacing: 0.08em;
2993
+ text-transform: uppercase;
2994
+ }
2995
+
2996
+ .content-timeline[data-appearance="tint"]
2997
+ .content-timeline-item[data-active="true"]
2998
+ .content-timeline-label {
2999
+ color: var(--info);
3000
+ }
3001
+
3002
+ /* --- Steps (sequence; canonical quiet rail defined above) --- */
3003
+
3004
+ .content-steps {
3005
+ margin: 1.5rem 0 1.75rem 0.875rem;
3006
+ }
3007
+
3008
+ /* tint: no hairline rail — tint number chips with bar segments between. */
3009
+ .content-steps[data-appearance="tint"] {
3010
+ margin-inline-start: 0;
3011
+ border-inline-start: 0;
3012
+ padding-inline-start: 2.35rem;
3013
+ }
3014
+
3015
+ .content-steps[data-appearance="tint"] .content-step-marker {
3016
+ inset-inline-start: -2.35rem;
3017
+ width: 1.6rem;
3018
+ height: 1.6rem;
3019
+ border: 0;
3020
+ border-radius: 999px;
3021
+ background-color: var(--secondary);
3022
+ color: var(--foreground);
3023
+ font-size: 0.78rem;
3024
+ font-weight: 600;
3025
+ }
3026
+
3027
+ .content-steps[data-appearance="tint"] .content-step:not(:last-child)::after {
3028
+ content: "";
3029
+ position: absolute;
3030
+ inset-block-start: 2.1rem;
3031
+ inset-block-end: calc(-1.25rem + 0.35rem);
3032
+ inset-inline-start: calc(-2.35rem + 0.74rem);
3033
+ width: 2px;
3034
+ border-radius: 999px;
3035
+ background-color: color-mix(in oklab, var(--muted-foreground) 30%, transparent);
3036
+ }
3037
+
3038
+ /* --- Inline TOC (structural, appearance-neutral card) --- */
3039
+
3040
+ .content-inline-toc {
3041
+ margin-block: 1.25rem;
3042
+ border: 1px solid var(--border);
3043
+ border-radius: var(--radius);
3044
+ background-color: var(--card);
3045
+ box-shadow: var(--shadow-xs);
3046
+ color: var(--foreground);
3047
+ }
3048
+
3049
+ .content-inline-toc-trigger {
3050
+ display: flex;
3051
+ width: 100%;
3052
+ align-items: center;
3053
+ gap: 0.5rem;
3054
+ appearance: none;
3055
+ cursor: pointer;
3056
+ border: 0;
3057
+ border-radius: inherit;
3058
+ background-color: transparent;
3059
+ padding: 0.65rem 0.9rem;
3060
+ color: var(--foreground);
3061
+ font-family: var(--font-body);
3062
+ font-size: 0.875rem;
3063
+ font-weight: 500;
3064
+ text-align: start;
3065
+ transition: background-color 180ms ease-out;
3066
+ }
3067
+
3068
+ .content-inline-toc-trigger:hover {
3069
+ background-color: color-mix(in oklab, var(--secondary) 50%, transparent);
3070
+ }
3071
+
3072
+ .content-inline-toc-trigger:focus-visible {
3073
+ outline: 2px solid color-mix(in oklab, var(--ring) 50%, transparent);
3074
+ outline-offset: -2px;
3075
+ }
3076
+
3077
+ .content-inline-toc-icon {
3078
+ width: 1rem;
3079
+ height: 1rem;
3080
+ flex: none;
3081
+ color: var(--muted-foreground);
3082
+ }
3083
+
3084
+ .content-inline-toc-title {
3085
+ min-width: 0;
3086
+ overflow: hidden;
3087
+ text-overflow: ellipsis;
3088
+ white-space: nowrap;
3089
+ }
3090
+
3091
+ .content-inline-toc-chevron {
3092
+ width: 1rem;
3093
+ height: 1rem;
3094
+ flex: none;
3095
+ margin-inline-start: auto;
3096
+ color: color-mix(in oklab, var(--muted-foreground) 55%, transparent);
3097
+ transition: transform 200ms ease;
3098
+ }
3099
+
3100
+ .content-inline-toc-trigger[data-state="open"] .content-inline-toc-chevron {
3101
+ transform: rotate(180deg);
3102
+ }
3103
+
3104
+ .content-inline-toc-content {
3105
+ padding: 0 0.9rem 0.9rem;
3106
+ }
3107
+
3108
+ /* --- Prose bodies inside components -----------------------------------------
3109
+ These selectors match `.content-prose.content-prose` (0,2,0) and win by
3110
+ order: component bodies read at the component scale, and annotation
3111
+ bodies (aside, excerpt, timeline, accordion, card) read muted. */
3112
+
3113
+ .content-aside-body.content-prose,
3114
+ .content-excerpt-body.content-prose,
3115
+ .content-timeline-body.content-prose,
3116
+ .content-accordion-copy.content-prose,
3117
+ .content-card-body.content-prose {
3118
+ color: var(--muted-foreground);
3119
+ font-size: 0.875rem;
3120
+ line-height: 1.625;
3121
+ }
3122
+
3123
+ .content-tabs-content-area.content-prose,
3124
+ .content-quiz-explanation .content-prose {
3125
+ font-size: 0.875rem;
3126
+ }
3127
+
3128
+ .content-step-body.content-prose {
3129
+ color: var(--muted-foreground);
3130
+ font-size: 0.875rem;
3131
+ line-height: 1.625;
3132
+ }
3133
+
3134
+ /* Component titles rendered as p elements: match `.content-prose p` (0,1,1). */
3135
+ p.content-timeline-title,
3136
+ p.content-quiz-question-title {
3137
+ font-size: 0.875rem;
3138
+ line-height: 1.5;
3139
+ }
3140
+
3141
+ p.content-quiz-results-score {
3142
+ font-size: 1rem;
3143
+ line-height: 1.5;
3144
+ }
3145
+
3146
+ p.content-quiz-results-note {
3147
+ font-size: 0.875rem;
3148
+ line-height: 1.5;
3149
+ }
3150
+
3151
+ /* --- Kbd (inline; a compact, lightly raised physical key) --- */
3152
+
3153
+ .content-kbd {
3154
+ display: inline-grid;
3155
+ min-width: 1.625rem;
3156
+ height: 1.625rem;
3157
+ place-items: center;
3158
+ border: 1px solid color-mix(in oklab, var(--foreground) 12%, var(--border));
3159
+ border-bottom-color: color-mix(in oklab, var(--foreground) 24%, var(--border));
3160
+ border-radius: calc(var(--radius) - 3px);
3161
+ background: color-mix(in oklab, var(--muted) 78%, var(--background));
3162
+ box-shadow:
3163
+ 0 1px 1px color-mix(in oklab, var(--foreground) 10%, transparent),
3164
+ inset 0 1px 0 color-mix(in oklab, var(--background) 80%, transparent);
3165
+ padding-inline: 0.4rem;
3166
+ color: var(--foreground);
3167
+ font-family: inherit;
3168
+ font-size: 0.75rem;
3169
+ font-weight: 600;
3170
+ line-height: 1;
3171
+ vertical-align: 0.08em;
3172
+ white-space: nowrap;
3173
+ }
3174
+
3175
+ @media (pointer: coarse) {
3176
+ :where(
3177
+ .content-tabs-tab,
3178
+ .content-codegroup-tab,
3179
+ .content-code-tree-row,
3180
+ .content-accordion-trigger,
3181
+ .content-inline-toc-trigger,
3182
+ .content-collapse-button
3183
+ ) {
3184
+ min-height: 2.75rem;
3185
+ }
3186
+ }
3187
+
3188
+ @media (prefers-reduced-motion: reduce) {
3189
+ :where(
3190
+ .content-card-surface,
3191
+ .content-card-arrow,
3192
+ .content-read-more-link,
3193
+ .content-read-more-arrow,
3194
+ .content-accordion-trigger,
3195
+ .content-accordion-chevron,
3196
+ .content-tabs-tab,
3197
+ .content-codegroup-tab,
3198
+ .content-code-tree-row,
3199
+ .content-code-tree-chevron,
3200
+ .content-inline-toc-trigger,
3201
+ .content-inline-toc-chevron,
3202
+ .content-quiz-option,
3203
+ .content-quiz-button,
3204
+ .content-quiz-dot
3205
+ ) {
3206
+ transition-duration: 0.01ms;
3207
+ }
3208
+ }