@rtkelly-labs/design-system 0.0.0-bootstrap.0 → 0.16.0-dev.0.37dedac

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 (284) hide show
  1. package/CHANGELOG.md +347 -0
  2. package/LICENSE +21 -0
  3. package/README.md +317 -2
  4. package/dist/components/AlertDialog.js +95 -0
  5. package/dist/components/AlertDialog.js.map +1 -0
  6. package/dist/components/AppShell.js +261 -0
  7. package/dist/components/AppShell.js.map +1 -0
  8. package/dist/components/AsciiDivider.js +8 -0
  9. package/dist/components/AsciiDivider.js.map +1 -0
  10. package/dist/components/AsciiGauge.js +130 -0
  11. package/dist/components/AsciiGauge.js.map +1 -0
  12. package/dist/components/Avatar.js +87 -0
  13. package/dist/components/Avatar.js.map +1 -0
  14. package/dist/components/Badge.js +25 -0
  15. package/dist/components/Badge.js.map +1 -0
  16. package/dist/components/BarChart.js +288 -0
  17. package/dist/components/BarChart.js.map +1 -0
  18. package/dist/components/BracketText.js +23 -0
  19. package/dist/components/BracketText.js.map +1 -0
  20. package/dist/components/BulletChart.js +50 -0
  21. package/dist/components/BulletChart.js.map +1 -0
  22. package/dist/components/Button.js +130 -0
  23. package/dist/components/Button.js.map +1 -0
  24. package/dist/components/Card.js +181 -0
  25. package/dist/components/Card.js.map +1 -0
  26. package/dist/components/ChartTooltip.js +54 -0
  27. package/dist/components/ChartTooltip.js.map +1 -0
  28. package/dist/components/Checkbox.js +55 -0
  29. package/dist/components/Checkbox.js.map +1 -0
  30. package/dist/components/ColophonCard.js +122 -0
  31. package/dist/components/ColophonCard.js.map +1 -0
  32. package/dist/components/DataTable.js +299 -0
  33. package/dist/components/DataTable.js.map +1 -0
  34. package/dist/components/Divider.js +42 -0
  35. package/dist/components/Divider.js.map +1 -0
  36. package/dist/components/Drawer.js +81 -0
  37. package/dist/components/Drawer.js.map +1 -0
  38. package/dist/components/EmptyState.js +39 -0
  39. package/dist/components/EmptyState.js.map +1 -0
  40. package/dist/components/ErrorSummary.js +122 -0
  41. package/dist/components/ErrorSummary.js.map +1 -0
  42. package/dist/components/Fieldset.js +37 -0
  43. package/dist/components/Fieldset.js.map +1 -0
  44. package/dist/components/Glyph.js +60 -0
  45. package/dist/components/Glyph.js.map +1 -0
  46. package/dist/components/Input.js +111 -0
  47. package/dist/components/Input.js.map +1 -0
  48. package/dist/components/LinkProvider.js +76 -0
  49. package/dist/components/LinkProvider.js.map +1 -0
  50. package/dist/components/Menu.js +144 -0
  51. package/dist/components/Menu.js.map +1 -0
  52. package/dist/components/MetadataGrid.js +184 -0
  53. package/dist/components/MetadataGrid.js.map +1 -0
  54. package/dist/components/MobileNav.js +120 -0
  55. package/dist/components/MobileNav.js.map +1 -0
  56. package/dist/components/Modal.js +79 -0
  57. package/dist/components/Modal.js.map +1 -0
  58. package/dist/components/NerdIcon.js +177 -0
  59. package/dist/components/NerdIcon.js.map +1 -0
  60. package/dist/components/NoteBlock.js +84 -0
  61. package/dist/components/NoteBlock.js.map +1 -0
  62. package/dist/components/PageHeader.js +34 -0
  63. package/dist/components/PageHeader.js.map +1 -0
  64. package/dist/components/PageTitle.js +21 -0
  65. package/dist/components/PageTitle.js.map +1 -0
  66. package/dist/components/Pagination.js +96 -0
  67. package/dist/components/Pagination.js.map +1 -0
  68. package/dist/components/Popover.js +87 -0
  69. package/dist/components/Popover.js.map +1 -0
  70. package/dist/components/Progress.js +83 -0
  71. package/dist/components/Progress.js.map +1 -0
  72. package/dist/components/RadioGroup.js +74 -0
  73. package/dist/components/RadioGroup.js.map +1 -0
  74. package/dist/components/ReportDocument.js +75 -0
  75. package/dist/components/ReportDocument.js.map +1 -0
  76. package/dist/components/SectionContainer.js +18 -0
  77. package/dist/components/SectionContainer.js.map +1 -0
  78. package/dist/components/Select.js +199 -0
  79. package/dist/components/Select.js.map +1 -0
  80. package/dist/components/SiteFooter.js +29 -0
  81. package/dist/components/SiteFooter.js.map +1 -0
  82. package/dist/components/SiteHeader.js +59 -0
  83. package/dist/components/SiteHeader.js.map +1 -0
  84. package/dist/components/SiteNav.js +141 -0
  85. package/dist/components/SiteNav.js.map +1 -0
  86. package/dist/components/Skeleton.js +51 -0
  87. package/dist/components/Skeleton.js.map +1 -0
  88. package/dist/components/SocialIcon.js +77 -0
  89. package/dist/components/SocialIcon.js.map +1 -0
  90. package/dist/components/Sparkline.js +104 -0
  91. package/dist/components/Sparkline.js.map +1 -0
  92. package/dist/components/Spinner.js +65 -0
  93. package/dist/components/Spinner.js.map +1 -0
  94. package/dist/components/StatCard.js +53 -0
  95. package/dist/components/StatCard.js.map +1 -0
  96. package/dist/components/StatusPage.js +99 -0
  97. package/dist/components/StatusPage.js.map +1 -0
  98. package/dist/components/Swatch.js +55 -0
  99. package/dist/components/Swatch.js.map +1 -0
  100. package/dist/components/Switch.js +53 -0
  101. package/dist/components/Switch.js.map +1 -0
  102. package/dist/components/TLDR.js +53 -0
  103. package/dist/components/TLDR.js.map +1 -0
  104. package/dist/components/Table.js +155 -0
  105. package/dist/components/Table.js.map +1 -0
  106. package/dist/components/Tabs.js +325 -0
  107. package/dist/components/Tabs.js.map +1 -0
  108. package/dist/components/Tag.js +19 -0
  109. package/dist/components/Tag.js.map +1 -0
  110. package/dist/components/TelemetryGauge.js +112 -0
  111. package/dist/components/TelemetryGauge.js.map +1 -0
  112. package/dist/components/ThemeProvider.js +87 -0
  113. package/dist/components/ThemeProvider.js.map +1 -0
  114. package/dist/components/TickerTape.js +196 -0
  115. package/dist/components/TickerTape.js.map +1 -0
  116. package/dist/components/Toast.js +200 -0
  117. package/dist/components/Toast.js.map +1 -0
  118. package/dist/components/Tooltip.js +69 -0
  119. package/dist/components/Tooltip.js.map +1 -0
  120. package/dist/components/TrackCard.js +206 -0
  121. package/dist/components/TrackCard.js.map +1 -0
  122. package/dist/components/blog/BlogPost.js +116 -0
  123. package/dist/components/blog/BlogPost.js.map +1 -0
  124. package/dist/components/blog/LoremIpsumPost.js +62 -0
  125. package/dist/components/blog/LoremIpsumPost.js.map +1 -0
  126. package/dist/components/blog/author.js +25 -0
  127. package/dist/components/blog/author.js.map +1 -0
  128. package/dist/components/booleanControl.js +50 -0
  129. package/dist/components/booleanControl.js.map +1 -0
  130. package/dist/components/dialogPopupRef.js +28 -0
  131. package/dist/components/dialogPopupRef.js.map +1 -0
  132. package/dist/components/dialogSurface.js +75 -0
  133. package/dist/components/dialogSurface.js.map +1 -0
  134. package/dist/components/docs/AnchorHeading.js +80 -0
  135. package/dist/components/docs/AnchorHeading.js.map +1 -0
  136. package/dist/components/docs/Breadcrumbs.js +26 -0
  137. package/dist/components/docs/Breadcrumbs.js.map +1 -0
  138. package/dist/components/docs/CodeBlock.js +63 -0
  139. package/dist/components/docs/CodeBlock.js.map +1 -0
  140. package/dist/components/docs/CodeTabs.js +71 -0
  141. package/dist/components/docs/CodeTabs.js.map +1 -0
  142. package/dist/components/docs/DocPager.js +28 -0
  143. package/dist/components/docs/DocPager.js.map +1 -0
  144. package/dist/components/docs/DocsHeader.js +124 -0
  145. package/dist/components/docs/DocsHeader.js.map +1 -0
  146. package/dist/components/docs/DocsLayout.js +61 -0
  147. package/dist/components/docs/DocsLayout.js.map +1 -0
  148. package/dist/components/docs/DocsLinkProvider.js +25 -0
  149. package/dist/components/docs/DocsLinkProvider.js.map +1 -0
  150. package/dist/components/docs/DocsSidebar.js +147 -0
  151. package/dist/components/docs/DocsSidebar.js.map +1 -0
  152. package/dist/components/docs/Prose.js +56 -0
  153. package/dist/components/docs/Prose.js.map +1 -0
  154. package/dist/components/docs/TableOfContents.js +71 -0
  155. package/dist/components/docs/TableOfContents.js.map +1 -0
  156. package/dist/components/docs/codeTabsStore.js +75 -0
  157. package/dist/components/docs/codeTabsStore.js.map +1 -0
  158. package/dist/components/docs/figures/ActivityGrid.js +116 -0
  159. package/dist/components/docs/figures/ActivityGrid.js.map +1 -0
  160. package/dist/components/docs/figures/BeforeAfter.js +64 -0
  161. package/dist/components/docs/figures/BeforeAfter.js.map +1 -0
  162. package/dist/components/docs/figures/ChangeSummary.js +74 -0
  163. package/dist/components/docs/figures/ChangeSummary.js.map +1 -0
  164. package/dist/components/docs/figures/Decision.js +34 -0
  165. package/dist/components/docs/figures/Decision.js.map +1 -0
  166. package/dist/components/docs/figures/DrawingSheet.js +37 -0
  167. package/dist/components/docs/figures/DrawingSheet.js.map +1 -0
  168. package/dist/components/docs/figures/FigureFrame.js +226 -0
  169. package/dist/components/docs/figures/FigureFrame.js.map +1 -0
  170. package/dist/components/docs/figures/FileChangeTree.js +134 -0
  171. package/dist/components/docs/figures/FileChangeTree.js.map +1 -0
  172. package/dist/components/docs/figures/FlowDiagram.js +82 -0
  173. package/dist/components/docs/figures/FlowDiagram.js.map +1 -0
  174. package/dist/components/docs/figures/GanttChart.js +79 -0
  175. package/dist/components/docs/figures/GanttChart.js.map +1 -0
  176. package/dist/components/docs/figures/IndexedSection.js +45 -0
  177. package/dist/components/docs/figures/IndexedSection.js.map +1 -0
  178. package/dist/components/docs/figures/MetricStrip.js +23 -0
  179. package/dist/components/docs/figures/MetricStrip.js.map +1 -0
  180. package/dist/components/docs/figures/Steps.js +58 -0
  181. package/dist/components/docs/figures/Steps.js.map +1 -0
  182. package/dist/components/docs/figures/SwatchCompare.js +42 -0
  183. package/dist/components/docs/figures/SwatchCompare.js.map +1 -0
  184. package/dist/components/docs/figures/TermGrid.js +22 -0
  185. package/dist/components/docs/figures/TermGrid.js.map +1 -0
  186. package/dist/components/docs/figures/Terminal.js +37 -0
  187. package/dist/components/docs/figures/Terminal.js.map +1 -0
  188. package/dist/components/docs/figures/Timeline.js +61 -0
  189. package/dist/components/docs/figures/Timeline.js.map +1 -0
  190. package/dist/components/docs/figures/TokenTable.js +42 -0
  191. package/dist/components/docs/figures/TokenTable.js.map +1 -0
  192. package/dist/components/docs/figures/TreeDiagram.js +76 -0
  193. package/dist/components/docs/figures/TreeDiagram.js.map +1 -0
  194. package/dist/components/docs/figures/UptimeStrip.js +68 -0
  195. package/dist/components/docs/figures/UptimeStrip.js.map +1 -0
  196. package/dist/components/docs/figures/index.js +24 -0
  197. package/dist/components/docs/figures/index.js.map +1 -0
  198. package/dist/components/docs/index.js +15 -0
  199. package/dist/components/docs/index.js.map +1 -0
  200. package/dist/components/docs/mdxComponents.js +108 -0
  201. package/dist/components/docs/mdxComponents.js.map +1 -0
  202. package/dist/components/experiments/DesignSandbox.js +206 -0
  203. package/dist/components/experiments/DesignSandbox.js.map +1 -0
  204. package/dist/components/experiments/ExperimentsView.js +138 -0
  205. package/dist/components/experiments/ExperimentsView.js.map +1 -0
  206. package/dist/components/fieldFrame.js +200 -0
  207. package/dist/components/fieldFrame.js.map +1 -0
  208. package/dist/components/floatingSurface.js +35 -0
  209. package/dist/components/floatingSurface.js.map +1 -0
  210. package/dist/components/marketing/CTASection.js +47 -0
  211. package/dist/components/marketing/CTASection.js.map +1 -0
  212. package/dist/components/marketing/FeatureGrid.js +49 -0
  213. package/dist/components/marketing/FeatureGrid.js.map +1 -0
  214. package/dist/components/marketing/Hero.js +44 -0
  215. package/dist/components/marketing/Hero.js.map +1 -0
  216. package/dist/components/marketing/PricingGrid.js +65 -0
  217. package/dist/components/marketing/PricingGrid.js.map +1 -0
  218. package/dist/components/marketing/SectionGrid.js +51 -0
  219. package/dist/components/marketing/SectionGrid.js.map +1 -0
  220. package/dist/components/paginationRange.js +28 -0
  221. package/dist/components/paginationRange.js.map +1 -0
  222. package/dist/components/portalTheme.js +14 -0
  223. package/dist/components/portalTheme.js.map +1 -0
  224. package/dist/components/saas/SaasLandingPage.js +201 -0
  225. package/dist/components/saas/SaasLandingPage.js.map +1 -0
  226. package/dist/components/siteNavContext.js +24 -0
  227. package/dist/components/siteNavContext.js.map +1 -0
  228. package/dist/components/slides/Slide.js +84 -0
  229. package/dist/components/slides/Slide.js.map +1 -0
  230. package/dist/components/slides/SlideDeck.js +228 -0
  231. package/dist/components/slides/SlideDeck.js.map +1 -0
  232. package/dist/components/themeInitScript.js +16 -0
  233. package/dist/components/themeInitScript.js.map +1 -0
  234. package/dist/components/themeScope.js +9 -0
  235. package/dist/components/themeScope.js.map +1 -0
  236. package/dist/components/toastLifetime.js +21 -0
  237. package/dist/components/toastLifetime.js.map +1 -0
  238. package/dist/fonts/DSSymbols-OFL.txt +98 -0
  239. package/dist/fonts/DSSymbols-Regular.woff2 +0 -0
  240. package/dist/fonts/SymbolsNerdFontMono-Regular.woff2 +0 -0
  241. package/dist/hooks/useActiveHeading.js +59 -0
  242. package/dist/hooks/useActiveHeading.js.map +1 -0
  243. package/dist/hooks/useCopyToClipboard.js +58 -0
  244. package/dist/hooks/useCopyToClipboard.js.map +1 -0
  245. package/dist/index.d.ts +6394 -0
  246. package/dist/index.js +117 -0
  247. package/dist/index.js.map +1 -0
  248. package/dist/lib/accentClasses.js +87 -0
  249. package/dist/lib/accentClasses.js.map +1 -0
  250. package/dist/lib/recipe.js +33 -0
  251. package/dist/lib/recipe.js.map +1 -0
  252. package/dist/lib/slug.js +39 -0
  253. package/dist/lib/slug.js.map +1 -0
  254. package/dist/lib/theme.js +76 -0
  255. package/dist/lib/theme.js.map +1 -0
  256. package/dist/lib/tokenRules.js +51 -0
  257. package/dist/lib/tokenRules.js.map +1 -0
  258. package/dist/prose.css +766 -0
  259. package/dist/styles.css +203 -0
  260. package/dist/theme/ansi.js +77 -0
  261. package/dist/theme/ansi.js.map +1 -0
  262. package/dist/theme/contrast.js +342 -0
  263. package/dist/theme/contrast.js.map +1 -0
  264. package/dist/theme/levels.js +234 -0
  265. package/dist/theme/levels.js.map +1 -0
  266. package/dist/theme/media.js +115 -0
  267. package/dist/theme/media.js.map +1 -0
  268. package/dist/theme/recommended.js +105 -0
  269. package/dist/theme/recommended.js.map +1 -0
  270. package/dist/theme.css +538 -0
  271. package/dist/tokens.js +1 -0
  272. package/dist/tokens.js.map +1 -0
  273. package/package.json +209 -6
  274. package/skills/design-system-usage/SKILL.md +75 -0
  275. package/terminal/rtk-midnight.alacritty.toml +33 -0
  276. package/terminal/rtk-midnight.ghostty.conf +24 -0
  277. package/terminal/rtk-midnight.itermcolors +167 -0
  278. package/terminal/rtk-midnight.windows-terminal.json +23 -0
  279. package/terminal/rtk-sketch.alacritty.toml +33 -0
  280. package/terminal/rtk-sketch.ghostty.conf +24 -0
  281. package/terminal/rtk-sketch.itermcolors +167 -0
  282. package/terminal/rtk-sketch.windows-terminal.json +23 -0
  283. package/tokens/palette.midnight.tokens.json +477 -0
  284. package/tokens/palette.sketch.tokens.json +477 -0
package/dist/prose.css ADDED
@@ -0,0 +1,766 @@
1
+ /* @rtkelly-labs/design-system — documentation & prose layer.
2
+ *
3
+ * @import "@rtkelly-labs/design-system/theme.css"; (tokens)
4
+ * @import "@rtkelly-labs/design-system/prose.css"; (this file)
5
+ *
6
+ * Deliberately plain CSS. The docs chrome is layout-critical, and Tailwind v4
7
+ * skips node_modules during automatic content detection — a consumer whose
8
+ * `@source` is wrong would otherwise get a half-styled sidebar rather than an
9
+ * obvious failure. Everything here works with the tokens alone.
10
+ *
11
+ * Two responsibilities:
12
+ * 1. `prose-ladder` — maps @tailwindcss/typography's variables onto the
13
+ * ladder's role tokens. Variables only; the deltas live in `Prose.tsx`.
14
+ * 2. `.docs-*` — the documentation chrome components, not yet migrated.
15
+ */
16
+
17
+ /* This file promises to work with the tokens alone, so it cannot assume a
18
+ * reset. Without `border-box`, every fixed-width chrome element blows out by
19
+ * its own padding — the contents rail is `width: 15rem` plus 2rem of padding
20
+ * and a 2px rule, so it renders 34px wider than its grid column and pushes the
21
+ * page sideways. `styles.css` consumers get this from Tailwind's preflight;
22
+ * `theme.css` + `prose.css` consumers previously got nothing.
23
+ *
24
+ * Scoped to the docs subtree rather than `*` so importing this file does not
25
+ * silently restyle the rest of a host application. */
26
+ .docs-layout,
27
+ .docs-layout *,
28
+ .docs-layout *::before,
29
+ .docs-layout *::after {
30
+ box-sizing: border-box;
31
+ }
32
+
33
+ :root {
34
+ /* Republished by DocsHeader from its measured height. The fallback keeps
35
+ * anchor offsets sane when no header is mounted (Storybook, tests). */
36
+ --docs-header-height: 0px;
37
+ --docs-sidebar-width: 17rem;
38
+ --docs-toc-width: 15rem;
39
+ --docs-content-max: 48rem;
40
+ }
41
+
42
+ /* Anchor jumps must clear the sticky header. `scroll-padding-top` covers
43
+ * browser-driven scrolls (hash on load, in-page link clicks); the
44
+ * `scroll-margin-top` on headings covers programmatic scrollIntoView. */
45
+ html {
46
+ scroll-behavior: smooth;
47
+ scroll-padding-top: calc(var(--docs-header-height) + 1.5rem);
48
+ }
49
+
50
+ @media (prefers-reduced-motion: reduce) {
51
+ html {
52
+ scroll-behavior: auto;
53
+ }
54
+ }
55
+
56
+ /* ==========================================================================
57
+ Anchored headings
58
+ ========================================================================== */
59
+
60
+ .docs-anchor-heading {
61
+ position: relative;
62
+ scroll-margin-top: calc(var(--docs-header-height) + 1.5rem);
63
+ }
64
+
65
+ /* The heading itself is the focus target after a TOC jump; it gets tabindex
66
+ *="-1" at runtime, and the default focus ring on a block heading is ugly. */
67
+ .docs-anchor-heading:focus {
68
+ outline: none;
69
+ }
70
+
71
+ .docs-anchor-heading:focus-visible {
72
+ outline: 2px solid var(--ds-accent-primary);
73
+ outline-offset: 4px;
74
+ }
75
+
76
+ .docs-anchor-link {
77
+ display: inline-flex;
78
+ align-items: center;
79
+ gap: 0.3rem;
80
+ margin-left: 0.6rem;
81
+ padding: 0.1rem 0.4rem;
82
+ border: 2px solid currentColor;
83
+ font-family: var(--ds-font-mono);
84
+ font-size: 0.6rem;
85
+ font-weight: 700;
86
+ letter-spacing: 0.08em;
87
+ text-transform: uppercase;
88
+ text-decoration: none;
89
+ vertical-align: middle;
90
+ white-space: nowrap;
91
+ opacity: 0;
92
+ transition: opacity 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
93
+ }
94
+
95
+ /* Revealed on hover, but never hidden from keyboard users. */
96
+ .docs-anchor-heading:hover .docs-anchor-link,
97
+ .docs-anchor-link:focus-visible {
98
+ opacity: 1;
99
+ }
100
+
101
+ .docs-anchor-link:hover {
102
+ transform: translate(-1px, -1px);
103
+ box-shadow: 2px 2px 0 0 currentColor;
104
+ }
105
+
106
+ /*
107
+ * Touch devices have no hover state, so the affordance would be unreachable.
108
+ *
109
+ * Shown at full opacity in a *declared* role rather than dimmed. `opacity`
110
+ * changes the foreground after `check:contrast` has read it, so a dimmed
111
+ * `text.primary` is invisible to the gate: this rule was 0.55, which composites
112
+ * to 3.45:1 on `sketch` and fails AA on every touch device permanently.
113
+ * `text.muted` is a Role the gate measures — 5.90 on midnight, 5.43 on sketch.
114
+ */
115
+ @media (hover: none) {
116
+ .docs-anchor-link {
117
+ opacity: 1;
118
+ color: var(--ds-text-muted);
119
+ }
120
+ }
121
+
122
+ /* ==========================================================================
123
+ Prose — compiled Markdown output
124
+ ==========================================================================
125
+
126
+ `@tailwindcss/typography` does this job, and it is built for exactly this
127
+ case: "typographic defaults for HTML you don't control". A Markdown pipeline
128
+ emits bare tags with no class names, so there is nothing for a utility to
129
+ attach to — and hand-writing ~150 descendant declarations here, or the same
130
+ number as `[&_h2]:…` arbitrary variants on the container, is reimplementing a
131
+ plugin badly either way.
132
+
133
+ What stays in CSS is the part the styling-lives-in-TSX rule already sanctions:
134
+ variables. `prose-ladder` maps the plugin's `--tw-prose-*` knobs onto this
135
+ system's role tokens. The brutalist deltas — the double rule under an h1, the
136
+ uppercase display headings, the mono tables — are `prose-h1:` / `prose-table:`
137
+ modifiers on the element, in `Prose.tsx`.
138
+
139
+ Note there is no `--tw-prose-invert-*` block. The plugin needs one because it
140
+ models theming as a light/dark flip; the ladder does not — `--ds-*` already
141
+ resolves per level, so one mapping is correct on all four rungs and would be
142
+ correct on a fifth.
143
+ ========================================================================== */
144
+
145
+ @plugin "@tailwindcss/typography";
146
+
147
+ @utility prose-ladder {
148
+ --tw-prose-body: var(--ds-text-primary);
149
+ --tw-prose-headings: var(--ds-text-primary);
150
+ --tw-prose-lead: var(--ds-text-secondary);
151
+ --tw-prose-links: var(--ds-accent-primary);
152
+ --tw-prose-bold: var(--ds-text-primary);
153
+ --tw-prose-counters: var(--ds-accent-secondary);
154
+ --tw-prose-bullets: var(--ds-accent-primary);
155
+ --tw-prose-hr: var(--ds-border-strong);
156
+ --tw-prose-quotes: var(--ds-text-primary);
157
+ --tw-prose-quote-borders: var(--ds-accent-tertiary);
158
+ --tw-prose-captions: var(--ds-text-muted);
159
+ --tw-prose-kbd: var(--ds-text-primary);
160
+ --tw-prose-code: var(--ds-accent-secondary);
161
+ --tw-prose-pre-code: var(--ds-text-primary);
162
+ --tw-prose-pre-bg: var(--ds-surface-sunken);
163
+ --tw-prose-th-borders: var(--ds-border-strong);
164
+ --tw-prose-td-borders: var(--ds-border-default);
165
+ }
166
+
167
+ /* ==========================================================================
168
+ Code block
169
+ ========================================================================== */
170
+
171
+ .docs-codeblock {
172
+ margin: 1.5rem 0;
173
+ border: 2px solid var(--ds-border-strong);
174
+ background-color: var(--ds-surface-base);
175
+ }
176
+
177
+ .docs-codeblock-bar {
178
+ display: flex;
179
+ align-items: center;
180
+ justify-content: space-between;
181
+ gap: 1rem;
182
+ padding: 0.4rem 0.85rem;
183
+ border-bottom: 2px solid var(--ds-border-strong);
184
+ font-family: var(--ds-font-mono);
185
+ font-size: 0.75rem;
186
+ font-weight: 700;
187
+ text-transform: uppercase;
188
+ }
189
+
190
+ .docs-codeblock-title {
191
+ color: var(--ds-accent-secondary);
192
+ }
193
+
194
+ .docs-codeblock-lang {
195
+ color: var(--ds-accent-tertiary);
196
+ }
197
+
198
+ .docs-codeblock-body {
199
+ position: relative;
200
+ }
201
+
202
+ .docs-codeblock-body pre {
203
+ margin: 0;
204
+ padding: 1rem;
205
+ overflow-x: auto;
206
+ font-family: var(--ds-font-mono);
207
+ font-size: 0.85rem;
208
+ line-height: 1.6;
209
+ /*
210
+ * `text.primary`, not `intent.success`. This rendered every code block in the
211
+ * success green — a Role that means "this worked", used as body ink — and
212
+ * contradicted the mapping eleven lines up, which already declares
213
+ * `--tw-prose-pre-code: var(--ds-text-primary)`. Set explicitly rather than
214
+ * inherited because `.docs-codeblock` is also used outside `.prose`, where
215
+ * the `--tw-prose-*` variables are not in scope.
216
+ */
217
+ color: var(--ds-text-primary);
218
+ }
219
+
220
+ .docs-codeblock-body pre code {
221
+ font-family: inherit;
222
+ background: none;
223
+ border: 0;
224
+ padding: 0;
225
+ color: inherit;
226
+ white-space: pre;
227
+ }
228
+
229
+ .docs-codeblock-copy {
230
+ position: absolute;
231
+ top: 0.5rem;
232
+ right: 0.5rem;
233
+ /* Above the code it sits on. */
234
+ z-index: var(--ds-layer-raised);
235
+ display: inline-flex;
236
+ align-items: center;
237
+ justify-content: center;
238
+ width: 1.9rem;
239
+ height: 1.9rem;
240
+ border: 2px solid var(--ds-border-strong);
241
+ background-color: var(--ds-surface-base);
242
+ color: var(--ds-text-primary);
243
+ cursor: pointer;
244
+ opacity: 0;
245
+ transition: opacity 0.15s ease, background-color 0.15s ease, color 0.15s ease;
246
+ }
247
+
248
+ .docs-codeblock:hover .docs-codeblock-copy,
249
+ .docs-codeblock-copy:focus-visible {
250
+ opacity: 1;
251
+ }
252
+
253
+ .docs-codeblock-copy:hover {
254
+ background-color: var(--ds-text-primary);
255
+ color: var(--ds-surface-base);
256
+ }
257
+
258
+ .docs-codeblock-copy[data-copied='true'] {
259
+ opacity: 1;
260
+ border-color: var(--ds-intent-success);
261
+ color: var(--ds-intent-success);
262
+ }
263
+
264
+ /* Same reasoning as `.docs-anchor-link` above: 0.6 composited to 2.64:1 on
265
+ * `sketch`, so the copy button failed AA on every touch device. */
266
+ @media (hover: none) {
267
+ .docs-codeblock-copy {
268
+ opacity: 1;
269
+ color: var(--ds-text-muted);
270
+ }
271
+ }
272
+
273
+ /* ==========================================================================
274
+ Layout shell
275
+ ========================================================================== */
276
+
277
+ .docs-layout {
278
+ min-height: 100vh;
279
+ background-color: var(--ds-surface-base);
280
+ color: var(--ds-text-primary);
281
+ }
282
+
283
+ .docs-layout-body {
284
+ display: grid;
285
+ grid-template-columns: 1fr;
286
+ align-items: start;
287
+ max-width: 100rem;
288
+ margin: 0 auto;
289
+ width: 100%;
290
+ }
291
+
292
+ .docs-layout-main {
293
+ min-width: 0; /* lets long code blocks scroll instead of stretching the grid */
294
+ padding: 2rem 1.25rem 4rem;
295
+ }
296
+
297
+ .docs-layout-sidebar,
298
+ .docs-layout-toc {
299
+ position: sticky;
300
+ top: var(--docs-header-height);
301
+ max-height: calc(100vh - var(--docs-header-height));
302
+ overflow-y: auto;
303
+ }
304
+
305
+ .docs-layout-sidebar {
306
+ width: var(--docs-sidebar-width);
307
+ padding: 1.5rem 1rem;
308
+ border-right: 2px solid var(--ds-border-strong);
309
+ }
310
+
311
+ .docs-layout-toc {
312
+ width: var(--docs-toc-width);
313
+ padding: 1.5rem 1rem;
314
+ border-left: 2px solid var(--ds-border-strong);
315
+ }
316
+
317
+ .docs-layout-scrim {
318
+ position: fixed;
319
+ inset: 0;
320
+ z-index: var(--ds-layer-overlay);
321
+ background-color: var(--ds-surface-overlay);
322
+ }
323
+
324
+ /* Mobile: the sidebar is an off-canvas drawer. */
325
+ @media (max-width: 1023px) {
326
+ .docs-layout-sidebar {
327
+ position: fixed;
328
+ top: var(--docs-header-height);
329
+ left: 0;
330
+ bottom: 0;
331
+ /*
332
+ * One above the scrim it covers. The layer scale has four rungs and this
333
+ * chrome needs five — scrim, then sidebar, then header — so the extra step
334
+ * is expressed as an offset from the token rather than as a new literal.
335
+ */
336
+ z-index: calc(var(--ds-layer-overlay) + 1);
337
+ max-height: none;
338
+ background-color: var(--ds-surface-base);
339
+ transform: translateX(-100%);
340
+ transition: transform 0.2s ease;
341
+ }
342
+
343
+ .docs-layout-sidebar[data-open='true'] {
344
+ transform: translateX(0);
345
+ }
346
+ }
347
+
348
+ @media (min-width: 1024px) {
349
+ .docs-layout-body {
350
+ grid-template-columns: var(--docs-sidebar-width) minmax(0, 1fr);
351
+ }
352
+
353
+ .docs-layout-main {
354
+ padding: 2.5rem 2.5rem 5rem;
355
+ }
356
+
357
+ .docs-layout-scrim {
358
+ display: none;
359
+ }
360
+ }
361
+
362
+ @media (min-width: 1280px) {
363
+ .docs-layout-body {
364
+ grid-template-columns: var(--docs-sidebar-width) minmax(0, 1fr) var(--docs-toc-width);
365
+ }
366
+ }
367
+
368
+ /* Below xl there is no third column to put the contents rail in. */
369
+ @media (max-width: 1279px) {
370
+ .docs-layout-toc {
371
+ display: none;
372
+ }
373
+ }
374
+
375
+ /* ==========================================================================
376
+ Header
377
+ ========================================================================== */
378
+
379
+ .docs-header {
380
+ position: sticky;
381
+ top: 0;
382
+ z-index: var(--ds-layer-top);
383
+ display: flex;
384
+ align-items: center;
385
+ gap: 1rem;
386
+ padding: 0.75rem 1.25rem;
387
+ border-bottom: 2px solid var(--ds-border-strong);
388
+ background-color: var(--ds-surface-base);
389
+ }
390
+
391
+ .docs-header-left {
392
+ display: flex;
393
+ align-items: center;
394
+ gap: 0.75rem;
395
+ }
396
+
397
+ .docs-header-right {
398
+ display: flex;
399
+ align-items: center;
400
+ gap: 0.5rem;
401
+ margin-left: auto;
402
+ }
403
+
404
+ .docs-header-brand {
405
+ display: inline-flex;
406
+ align-items: center;
407
+ gap: 0.5rem;
408
+ font-family: var(--ds-font-display);
409
+ font-size: 1rem;
410
+ font-weight: 800;
411
+ letter-spacing: 0.04em;
412
+ text-transform: uppercase;
413
+ text-decoration: none;
414
+ color: var(--ds-text-primary);
415
+ white-space: nowrap;
416
+ }
417
+
418
+ .docs-header-brand:hover {
419
+ color: var(--ds-accent-primary);
420
+ }
421
+
422
+ .docs-header-brand-icon {
423
+ width: 1.15rem;
424
+ height: 1.15rem;
425
+ color: var(--ds-accent-primary);
426
+ }
427
+
428
+ .docs-header-nav {
429
+ display: flex;
430
+ align-items: center;
431
+ gap: 1.25rem;
432
+ }
433
+
434
+ .docs-header-nav-link {
435
+ font-family: var(--ds-font-mono);
436
+ font-size: 0.8rem;
437
+ font-weight: 700;
438
+ text-transform: uppercase;
439
+ letter-spacing: 0.04em;
440
+ text-decoration: none;
441
+ color: var(--ds-text-primary);
442
+ opacity: 0.75;
443
+ padding-bottom: 2px;
444
+ border-bottom: 2px solid transparent;
445
+ }
446
+
447
+ .docs-header-nav-link:hover {
448
+ opacity: 1;
449
+ color: var(--ds-accent-primary);
450
+ }
451
+
452
+ .docs-header-nav-link[aria-current='page'] {
453
+ opacity: 1;
454
+ color: var(--ds-accent-primary);
455
+ border-bottom-color: var(--ds-accent-primary);
456
+ }
457
+
458
+ .docs-header-icon-btn {
459
+ display: inline-flex;
460
+ align-items: center;
461
+ justify-content: center;
462
+ width: 2rem;
463
+ height: 2rem;
464
+ border: 2px solid var(--ds-border-strong);
465
+ background-color: var(--ds-surface-base);
466
+ color: var(--ds-text-primary);
467
+ cursor: pointer;
468
+ transition: background-color 0.15s ease, color 0.15s ease;
469
+ }
470
+
471
+ .docs-header-icon-btn:hover {
472
+ background-color: var(--ds-accent-primary);
473
+ color: var(--ds-surface-base);
474
+ }
475
+
476
+ .docs-header-search {
477
+ display: inline-flex;
478
+ align-items: center;
479
+ gap: 0.5rem;
480
+ height: 2rem;
481
+ padding: 0 0.6rem;
482
+ border: 2px solid var(--ds-border-strong);
483
+ background-color: var(--ds-surface-base);
484
+ color: var(--ds-text-primary);
485
+ font-family: var(--ds-font-mono);
486
+ font-size: 0.7rem;
487
+ font-weight: 700;
488
+ letter-spacing: 0.06em;
489
+ cursor: pointer;
490
+ }
491
+
492
+ .docs-header-search:hover {
493
+ background-color: var(--ds-accent-primary);
494
+ color: var(--ds-surface-base);
495
+ }
496
+
497
+ .docs-header-kbd {
498
+ padding: 0 0.3rem;
499
+ border: 1px solid currentColor;
500
+ font-size: 0.65rem;
501
+ opacity: 0.8;
502
+ }
503
+
504
+ /* The sidebar toggle only exists below lg, where the rail is a drawer. */
505
+ @media (min-width: 1024px) {
506
+ .docs-header-sidebar-toggle {
507
+ display: none;
508
+ }
509
+ }
510
+
511
+ @media (max-width: 1023px) {
512
+ .docs-header-nav {
513
+ display: none;
514
+ }
515
+ }
516
+
517
+ @media (max-width: 639px) {
518
+ .docs-header-search-label,
519
+ .docs-header-kbd {
520
+ display: none;
521
+ }
522
+ }
523
+
524
+ /* ==========================================================================
525
+ Sidebar
526
+ ========================================================================== */
527
+
528
+ .docs-sidebar-label,
529
+ .docs-toc-label {
530
+ margin: 0 0 0.75rem;
531
+ font-family: var(--ds-font-display);
532
+ font-size: 0.7rem;
533
+ font-weight: 800;
534
+ letter-spacing: 0.12em;
535
+ text-transform: uppercase;
536
+ color: var(--ds-accent-secondary);
537
+ }
538
+
539
+ .docs-sidebar-list {
540
+ list-style: none;
541
+ margin: 0;
542
+ padding: 0;
543
+ }
544
+
545
+ /* Nested levels indent and gain a rule to make the hierarchy legible. */
546
+ .docs-sidebar-list[data-depth='1'],
547
+ .docs-sidebar-list[data-depth='2'],
548
+ .docs-sidebar-list[data-depth='3'] {
549
+ margin-left: 0.55rem;
550
+ padding-left: 0.55rem;
551
+ border-left: 2px solid var(--ds-border-subtle);
552
+ }
553
+
554
+ .docs-sidebar-group {
555
+ display: flex;
556
+ align-items: center;
557
+ gap: 0.25rem;
558
+ }
559
+
560
+ .docs-sidebar-toggle {
561
+ display: inline-flex;
562
+ align-items: center;
563
+ justify-content: center;
564
+ width: 1.1rem;
565
+ height: 1.1rem;
566
+ flex: none;
567
+ border: 0;
568
+ background: none;
569
+ color: var(--ds-accent-primary);
570
+ cursor: pointer;
571
+ }
572
+
573
+ .docs-sidebar-link {
574
+ display: block;
575
+ width: 100%;
576
+ padding: 0.3rem 0.4rem;
577
+ border: 0;
578
+ border-left: 2px solid transparent;
579
+ background: none;
580
+ font-family: var(--ds-font-mono);
581
+ font-size: 0.8rem;
582
+ line-height: 1.4;
583
+ text-align: left;
584
+ text-decoration: none;
585
+ color: var(--ds-text-primary);
586
+ opacity: 0.72;
587
+ cursor: pointer;
588
+ transition: opacity 0.12s ease, color 0.12s ease, border-color 0.12s ease;
589
+ }
590
+
591
+ .docs-sidebar-link:hover {
592
+ opacity: 1;
593
+ color: var(--ds-accent-primary);
594
+ }
595
+
596
+ .docs-sidebar-link[data-active='true'] {
597
+ opacity: 1;
598
+ font-weight: 700;
599
+ color: var(--ds-accent-primary);
600
+ border-left-color: var(--ds-accent-primary);
601
+ background-color: color-mix(in oklab, var(--ds-accent-primary) 12%, transparent);
602
+ }
603
+
604
+ .docs-sidebar-group-label {
605
+ font-weight: 700;
606
+ text-transform: uppercase;
607
+ letter-spacing: 0.04em;
608
+ opacity: 0.9;
609
+ }
610
+
611
+ /*
612
+ * Muted by Role, not by opacity. At 0.55 this composited to 3.45:1 on `sketch`
613
+ * — readable text below AA, and invisible to `check:contrast`, which reads the
614
+ * declared foreground before `opacity` is applied. `text.muted` is measured.
615
+ */
616
+ .docs-sidebar-link-static {
617
+ cursor: default;
618
+ color: var(--ds-text-muted);
619
+ }
620
+
621
+ /* ==========================================================================
622
+ Table of contents
623
+ ========================================================================== */
624
+
625
+ .docs-toc-list {
626
+ list-style: none;
627
+ margin: 0;
628
+ padding: 0;
629
+ }
630
+
631
+ .docs-toc-link {
632
+ display: block;
633
+ padding: 0.22rem 0.5rem;
634
+ border-left: 2px solid var(--ds-border-subtle);
635
+ font-family: var(--ds-font-mono);
636
+ font-size: 0.75rem;
637
+ line-height: 1.45;
638
+ text-decoration: none;
639
+ color: var(--ds-text-primary);
640
+ opacity: 0.65;
641
+ transition: opacity 0.12s ease, color 0.12s ease, border-color 0.12s ease;
642
+ /* Heading text is arbitrary and often long — `tvs metadata --readonly-only`
643
+ * has no break opportunity the rail can use on its own. */
644
+ overflow-wrap: anywhere;
645
+ }
646
+
647
+ .docs-toc-link:hover {
648
+ opacity: 1;
649
+ color: var(--ds-accent-primary);
650
+ }
651
+
652
+ .docs-toc-link[data-active='true'] {
653
+ opacity: 1;
654
+ font-weight: 700;
655
+ color: var(--ds-accent-primary);
656
+ border-left-color: var(--ds-accent-primary);
657
+ }
658
+
659
+ /* ==========================================================================
660
+ Breadcrumbs
661
+ ========================================================================== */
662
+
663
+ .docs-breadcrumbs-list {
664
+ display: flex;
665
+ flex-wrap: wrap;
666
+ align-items: center;
667
+ gap: 0.4rem;
668
+ list-style: none;
669
+ margin: 0 0 1.25rem;
670
+ padding: 0;
671
+ font-family: var(--ds-font-mono);
672
+ font-size: 0.72rem;
673
+ text-transform: uppercase;
674
+ letter-spacing: 0.06em;
675
+ }
676
+
677
+ .docs-breadcrumbs-link {
678
+ color: var(--ds-text-primary);
679
+ opacity: 0.65;
680
+ text-decoration: none;
681
+ }
682
+
683
+ .docs-breadcrumbs-link:hover {
684
+ opacity: 1;
685
+ color: var(--ds-accent-primary);
686
+ }
687
+
688
+ .docs-breadcrumbs-sep {
689
+ color: var(--ds-accent-tertiary);
690
+ }
691
+
692
+ .docs-breadcrumbs-current {
693
+ color: var(--ds-accent-secondary);
694
+ font-weight: 700;
695
+ }
696
+
697
+ /* ==========================================================================
698
+ Prev/next pager
699
+ ========================================================================== */
700
+
701
+ .docs-pager {
702
+ display: grid;
703
+ grid-template-columns: 1fr 1fr;
704
+ gap: 1rem;
705
+ margin-top: 3.5rem;
706
+ padding-top: 1.5rem;
707
+ border-top: 2px solid var(--ds-border-strong);
708
+ }
709
+
710
+ .docs-pager-link {
711
+ display: flex;
712
+ flex-direction: column;
713
+ gap: 0.35rem;
714
+ padding: 0.85rem 1rem;
715
+ border: 2px solid var(--ds-border-strong);
716
+ text-decoration: none;
717
+ color: var(--ds-text-primary);
718
+ transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease;
719
+ }
720
+
721
+ .docs-pager-link:hover {
722
+ transform: translate(-2px, -2px);
723
+ border-color: var(--ds-accent-primary);
724
+ box-shadow: 4px 4px 0 0 var(--ds-accent-primary);
725
+ }
726
+
727
+ .docs-pager-next {
728
+ text-align: right;
729
+ }
730
+
731
+ .docs-pager-dir {
732
+ display: inline-flex;
733
+ align-items: center;
734
+ gap: 0.3rem;
735
+ font-family: var(--ds-font-mono);
736
+ font-size: 0.65rem;
737
+ font-weight: 700;
738
+ letter-spacing: 0.1em;
739
+ color: var(--ds-accent-tertiary);
740
+ }
741
+
742
+ .docs-pager-next .docs-pager-dir {
743
+ justify-content: flex-end;
744
+ }
745
+
746
+ .docs-pager-label {
747
+ font-family: var(--ds-font-display);
748
+ font-size: 0.95rem;
749
+ font-weight: 800;
750
+ text-transform: uppercase;
751
+ line-height: 1.25;
752
+ }
753
+
754
+ @media (max-width: 639px) {
755
+ .docs-pager {
756
+ grid-template-columns: 1fr;
757
+ }
758
+
759
+ .docs-pager-next {
760
+ text-align: left;
761
+ }
762
+
763
+ .docs-pager-next .docs-pager-dir {
764
+ justify-content: flex-start;
765
+ }
766
+ }