@lupinum/ginko-docs 0.2.2 → 0.2.5

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 (206) hide show
  1. package/README.md +130 -73
  2. package/app/app.config.ts +15 -13
  3. package/app/app.vue +4 -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 +34 -99
  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 +266 -132
  57. package/app/components/site/SiteHeroCode.vue +164 -0
  58. package/app/components/site/SiteLocaleSwitcher.vue +25 -9
  59. package/app/components/site/SiteSocialLinks.vue +31 -0
  60. package/app/components/ui/badge/Badge.vue +1 -1
  61. package/app/components/ui/button/Button.vue +1 -1
  62. package/app/components/ui/collapsible/CollapsibleContent.vue +1 -1
  63. package/app/components/ui/dropdown-menu/DropdownMenuContent.vue +14 -4
  64. package/app/components/ui/dropdown-menu/DropdownMenuItem.vue +1 -1
  65. package/app/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +1 -1
  66. package/app/components/ui/dropdown-menu/DropdownMenuSeparator.vue +1 -1
  67. package/app/components/ui/dropdown-menu/index.ts +0 -9
  68. package/app/components/ui/kbd/Kbd.vue +1 -1
  69. package/app/components/ui/kbd/index.ts +0 -1
  70. package/app/components/ui/scroll-area/ScrollArea.vue +1 -1
  71. package/app/components/ui/scroll-area/ScrollBar.vue +1 -1
  72. package/app/components/ui/separator/Separator.vue +1 -1
  73. package/app/components/ui/sheet/SheetContent.vue +1 -1
  74. package/app/components/ui/sheet/SheetDescription.vue +1 -1
  75. package/app/components/ui/sheet/SheetOverlay.vue +1 -1
  76. package/app/components/ui/sheet/SheetTitle.vue +1 -1
  77. package/app/components/ui/sheet/index.ts +0 -3
  78. package/app/components/ui/tabs/Tabs.vue +1 -1
  79. package/app/components/ui/tabs/TabsList.vue +1 -1
  80. package/app/components/ui/tabs/TabsTrigger.vue +1 -1
  81. package/app/components/ui/tabs/index.ts +0 -1
  82. package/app/composables/site-navigation.utils.ts +69 -12
  83. package/app/composables/useContentRouteAlternates.ts +13 -21
  84. package/app/composables/useLocalizedRouteSwitch.ts +1 -1
  85. package/app/composables/useMetaKey.ts +18 -0
  86. package/app/composables/useProseAppearance.ts +24 -0
  87. package/app/composables/useSiteNavigation.ts +10 -40
  88. package/app/config/site.utils.ts +1 -1
  89. package/app/error.vue +1 -5
  90. package/app/features/docs/components/DocsBreadcrumb.vue +37 -0
  91. package/app/features/docs/components/DocsContributeLinks.vue +28 -18
  92. package/app/features/docs/components/DocsMobileToc.vue +12 -8
  93. package/app/features/docs/components/DocsPageContent.vue +93 -47
  94. package/app/features/docs/components/DocsPageNav.vue +1 -1
  95. package/app/features/docs/components/DocsSidebar.vue +37 -21
  96. package/app/features/docs/components/DocsSidebarItem.vue +53 -100
  97. package/app/features/docs/components/DocsSidebarRow.vue +27 -0
  98. package/app/features/docs/components/DocsSidebarTabs.vue +46 -22
  99. package/app/features/docs/components/DocsToc.vue +80 -34
  100. package/app/features/docs/composables/useDocsNavigation.ts +2 -2
  101. package/app/features/docs/composables/useDocsNavigationData.ts +4 -1
  102. package/app/features/docs/composables/useRevealActive.ts +58 -0
  103. package/app/features/docs/composables/useScrollspy.ts +87 -19
  104. package/app/features/docs/docs-navigation.ts +17 -30
  105. package/app/features/docs/toc-context.ts +6 -0
  106. package/app/features/search/command-center.ts +11 -90
  107. package/app/features/search/components/SiteCommandCenter.vue +58 -38
  108. package/app/features/search/useCommandCenter.ts +48 -48
  109. package/app/layouts/docs.vue +1 -1
  110. package/app/lib/errors.ts +2 -49
  111. package/app/pages/blog/[slug].vue +26 -9
  112. package/app/pages/blog/index.vue +38 -14
  113. package/app/pages/docs/index.vue +10 -14
  114. package/app/pages/index.vue +180 -61
  115. package/app/plugins/ginko-docs-theme.ts +12 -0
  116. package/app/utils/content.ts +11 -0
  117. package/app/utils/file-icons.ts +90 -0
  118. package/app/utils/index.ts +7 -1
  119. package/app/utils/repository.ts +20 -0
  120. package/content.js +68 -50
  121. package/content.ts +51 -32
  122. package/i18n/messages/global/blog.ts +4 -0
  123. package/i18n/messages/global/command.ts +6 -2
  124. package/i18n/messages/global/docs.ts +4 -0
  125. package/i18n/messages/global/nav.ts +6 -3
  126. package/i18n/messages/index.ts +3 -3
  127. package/icon-bundle.ts +9 -56
  128. package/index.d.ts +7 -1
  129. package/modules/feature-routing.ts +15 -0
  130. package/nuxt.config.ts +21 -7
  131. package/package.json +29 -26
  132. package/runtime/server/agent-markdown.ts +0 -2
  133. package/server/api/_ginko-docs/redirects.get.ts +28 -0
  134. package/server/middleware/redirects.ts +22 -0
  135. package/server/routes/[locale]/blog/rss.xml.get.ts +13 -0
  136. package/server/routes/blog/rss.xml.get.ts +5 -0
  137. package/server/utils/blog-feed.ts +49 -0
  138. package/server/utils/feed.ts +70 -0
  139. package/server/utils/redirects.ts +38 -0
  140. package/server/utils/redirects.utils.ts +58 -0
  141. package/shared/theme-palettes.ts +37 -0
  142. package/shared/types/app-config.ts +75 -10
  143. package/tags.ts +47 -59
  144. package/app/components/mdc/MdcAlert.vue +0 -34
  145. package/app/components/mdc/MdcCardGroup.vue +0 -47
  146. package/app/components/mdc/MdcDocImg.vue +0 -25
  147. package/app/components/mdc/MdcField.vue +0 -62
  148. package/app/components/mdc/MdcFieldGroup.vue +0 -18
  149. package/app/components/mdc/MdcPassage.vue +0 -32
  150. package/app/components/mdc/MdcQuizOption.vue +0 -91
  151. package/app/components/mdc/MdcReadMoreGroup.vue +0 -18
  152. package/app/components/mdc/MdcShortcut.vue +0 -46
  153. package/app/components/mdc/MdcStep.vue +0 -42
  154. package/app/components/ui/accordion/Accordion.vue +0 -15
  155. package/app/components/ui/accordion/AccordionContent.vue +0 -23
  156. package/app/components/ui/accordion/AccordionItem.vue +0 -24
  157. package/app/components/ui/accordion/AccordionTrigger.vue +0 -35
  158. package/app/components/ui/accordion/index.ts +0 -4
  159. package/app/components/ui/alert/Alert.vue +0 -21
  160. package/app/components/ui/alert/AlertDescription.vue +0 -22
  161. package/app/components/ui/alert/AlertTitle.vue +0 -22
  162. package/app/components/ui/alert/index.ts +0 -34
  163. package/app/components/ui/card/Card.vue +0 -16
  164. package/app/components/ui/card/CardAction.vue +0 -17
  165. package/app/components/ui/card/CardContent.vue +0 -14
  166. package/app/components/ui/card/CardDescription.vue +0 -14
  167. package/app/components/ui/card/CardFooter.vue +0 -14
  168. package/app/components/ui/card/CardHeader.vue +0 -22
  169. package/app/components/ui/card/card-variants.ts +0 -15
  170. package/app/components/ui/card/index.ts +0 -8
  171. package/app/components/ui/checkbox/Checkbox.vue +0 -35
  172. package/app/components/ui/checkbox/index.ts +0 -1
  173. package/app/components/ui/dialog/Dialog.vue +0 -15
  174. package/app/components/ui/dialog/DialogClose.vue +0 -12
  175. package/app/components/ui/dialog/DialogContent.vue +0 -69
  176. package/app/components/ui/dialog/DialogDescription.vue +0 -21
  177. package/app/components/ui/dialog/DialogFooter.vue +0 -15
  178. package/app/components/ui/dialog/DialogOverlay.vue +0 -26
  179. package/app/components/ui/dialog/DialogPortal.vue +0 -12
  180. package/app/components/ui/dialog/DialogTitle.vue +0 -21
  181. package/app/components/ui/dialog/DialogTrigger.vue +0 -12
  182. package/app/components/ui/dialog/index.ts +0 -10
  183. package/app/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +0 -36
  184. package/app/components/ui/dropdown-menu/DropdownMenuGroup.vue +0 -12
  185. package/app/components/ui/dropdown-menu/DropdownMenuLabel.vue +0 -25
  186. package/app/components/ui/dropdown-menu/DropdownMenuShortcut.vue +0 -17
  187. package/app/components/ui/dropdown-menu/DropdownMenuSub.vue +0 -15
  188. package/app/components/ui/dropdown-menu/DropdownMenuSubContent.vue +0 -29
  189. package/app/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +0 -31
  190. package/app/components/ui/input/Input.vue +0 -23
  191. package/app/components/ui/input/index.ts +0 -1
  192. package/app/components/ui/label/Label.vue +0 -14
  193. package/app/components/ui/label/index.ts +0 -1
  194. package/app/components/ui/sheet/SheetClose.vue +0 -12
  195. package/app/components/ui/sheet/SheetFooter.vue +0 -12
  196. package/app/components/ui/sheet/SheetHeader.vue +0 -12
  197. package/app/components/ui/switch/Switch.vue +0 -39
  198. package/app/components/ui/switch/index.ts +0 -1
  199. package/app/components/ui/tabs/TabsContent.vue +0 -21
  200. package/app/components/ui/textarea/Textarea.vue +0 -31
  201. package/app/components/ui/textarea/index.ts +0 -1
  202. package/app/features/docs/composables/useDocsEntryPath.ts +0 -13
  203. package/app/lib/utils.ts +0 -7
  204. package/i18n/messages/source.ts +0 -5
  205. package/runtime/markdown/inline-code-highlight.ts +0 -155
  206. 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
+ }