@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/CHANGELOG.md ADDED
@@ -0,0 +1,347 @@
1
+ # Changelog
2
+
3
+ Pre-1.0 and moving fast. **Every minor may break.** There are two consumers —
4
+ `rtkelly13/blog` and this package's own Storybook — both in the same estate and
5
+ migrated in the same change, so compatibility between 0.x versions buys nothing
6
+ and is not attempted: no deprecation shims, no alias layers, no staged removals.
7
+
8
+ Proper release notes start at 1.0. Until then this file records only what a
9
+ consumer has to *do*, newest first. The reasoning lives in the pull requests and
10
+ in [`docs/adr/`](./docs/adr/).
11
+
12
+ ## 0.16.0
13
+
14
+ **The package is now `@rtkelly-labs/design-system`.** The repository moved to the
15
+ `rtkelly-labs` org, and npm can't move a scoped package, so 0.16.0 is the first
16
+ version under the new name. `@rtkelly13/design-system` stops at 0.12.0 and is
17
+ deprecated. Swap the dependency and rewrite imports from `@rtkelly13/design-system`
18
+ to `@rtkelly-labs/design-system`, including the CSS, token and terminal-theme
19
+ entry points. 0.13.0 to 0.15.0 were never published.
20
+
21
+ Five MDX figures: `SwatchCompare`, `MetricStrip`, `TokenTable`, `Decision` with `Option`, `TermGrid` with `Term`. Registered in `mdxComponents`.
22
+
23
+ ## 0.15.0
24
+
25
+ Text on `sketch` is darker and heavier, and `text.muted` is lighter on `midnight`
26
+ (#372). `text.muted` is `#9d9db4` on midnight and `#5c5546` on sketch; `accent.quiet`
27
+ keeps the old values. Running text on a light level is drawn at weight 450, through a
28
+ new `--ds-ink-weight` property that any weight utility overrides. Nothing to change in
29
+ code. Re-baseline visual snapshots that show sketch text or muted text.
30
+
31
+ `check:contrast` reports APCA Lc beside each ratio. It is reported only and never fails
32
+ the gate.
33
+
34
+ ## 0.13.0
35
+
36
+ This batch adds the focus-preserving Button pending state, shipped symbol coverage and
37
+ role-based typography. The package emits one file per module and supports imports from
38
+ Next.js Server Components. It ships ESM only; the migration notes follow below.
39
+
40
+ The applied documentation site and sample projects now share the Storybook deployment
41
+ under `/site`. Browser CI uses a pinned Playwright container, and accessibility tests
42
+ compare both theme-switching paths. Story selection remains in shadow mode.
43
+
44
+ The report package's 0.1.1 release admits both 0.12.x and 0.13.x design-system peers.
45
+
46
+ **ESM only.** The package is `"type": "module"` and ships one build: `dist/index.js` and one
47
+ `.js` file per module. The CommonJS build, `main` and `module` are gone, and `exports["."]` is
48
+ `{ types, default }`. No export was added or removed, and the CSS, token and terminal subpaths are
49
+ unchanged.
50
+
51
+ ### You have to do something only if
52
+
53
+ - **You `require()` the package on Node older than 22.12.** That already failed on 0.12.0: the
54
+ CommonJS build `require()`d `@microcharts/react`, which is ESM only, and Node before 22.12 throws
55
+ `ERR_REQUIRE_ESM` on it. 22.12 is the first release that loads an ES module from `require()`.
56
+ Upgrade Node, or use `import`. On 22.12+ `require('@rtkelly13/design-system')` returns the same
57
+ module `import` does.
58
+ - **A tool of yours needs the package to be CommonJS** — Jest without ESM support, say. Run it in
59
+ ESM mode, or move it to Vitest.
60
+ - **You deep-imported a file under `dist/`.** Nothing documented one, but `dist/index.mjs` and
61
+ every `dist/**/*.mjs` are now `.js`. Import from the package root.
62
+
63
+ Bundlers (Vite, Next, webpack, esbuild) resolved the `import` condition already and see no change.
64
+
65
+ A field's `error` is described, not announced (#299). It was `role="alert"`, so a failed submit
66
+ read every invalid field on top of `ErrorSummary` taking focus. No export, prop or rendering
67
+ changed; only the `role` attribute is gone. This affects `Input`, `TextArea`, `Select`, `Checkbox`,
68
+ `Switch`, `RadioGroup` and `Fieldset`.
69
+
70
+ ### You have to do something
71
+
72
+ - **A form that validates on submit should render `ErrorSummary`.** It takes focus and is the
73
+ announcement. Each field's error stays in its control's `aria-describedby`, with `aria-invalid`,
74
+ so it is read when a summary link moves focus to the field.
75
+ - **A form that validates inline or on blur, with no summary, is no longer announced.** Setting
76
+ `error` on the focused field is silent until the reader returns to it. If the change needs to be
77
+ heard, give the form one polite live region of its own and write the message into it. Do not
78
+ put a live region on each field.
79
+ - **Tests that found a field error with `getByRole('alert')` will fail.** Find it by its text, or
80
+ follow the control's `aria-describedby`.
81
+
82
+ ## 0.12.0
83
+
84
+ New documentation visuals adapted from mdxcn: `ActivityGrid`, `GanttChart`,
85
+ `UptimeStrip`, `FlowDiagram`, `Timeline`, `TreeDiagram`, `ChangeSummary`, and
86
+ `BeforeAfter`. `Steps` and `Terminal` are available as unframed blocks. Wrap one
87
+ or more of them in `FigureFrame` when the content needs a shared caption and
88
+ border. Each adapted component links to its upstream source in its file header.
89
+
90
+ No mdxcn package dependency is required. Existing published components and
91
+ their props are unchanged.
92
+
93
+ ## 0.11.0
94
+
95
+ `Select` themed on Base UI's select: the open list is painted by the Level, not the operating
96
+ system (#164). With it the last row of [`docs/capability-readiness.md`](./docs/capability-readiness.md)
97
+ is `ready`. Breaking only for `Select`: no export was added or removed, and the entry points,
98
+ dependencies and peer dependencies are the same as 0.10.0.
99
+
100
+ ### You have to do something
101
+
102
+ - **`onChange(event)` is removed. Use `onValueChange(value: string)`.** It is called with the newly
103
+ chosen option's `value` — a string, not a `ChangeEvent` — so `onChange={(e) => set(e.target.value)}`
104
+ becomes `onValueChange={set}`. There is no alias and no shim.
105
+ - **`multiple` and `size` are removed.** `Select` chooses exactly one option from a closed list.
106
+ Choosing several is `Checkbox`; showing a visible set is `RadioGroup`.
107
+ - **`value` and `defaultValue` are strings only.** `number` and `string[]` are no longer accepted.
108
+ With neither given, the first enabled option is chosen, as on a native `<select>`; pass
109
+ `placeholder` to start from nothing instead.
110
+ - **Options still come from `options`, never from children.** `children` is no longer part of
111
+ `SelectProps` at all; `<option>` elements passed as children were never rendered and are now a
112
+ type error. A row that cannot be chosen is `{ label, value, disabled: true }`.
113
+ - **The control is a button with `role="combobox"`, not a `<select>`.** `SelectProps` extends
114
+ `HTMLAttributes<HTMLElement>` instead of `SelectHTMLAttributes<HTMLSelectElement>`, and the ref
115
+ (`Select` now forwards one) is the trigger. The field label is no longer a `<label>`: it names the
116
+ trigger by `aria-labelledby`, and clicking it focuses the trigger without opening the list.
117
+ Tests that drove it with `fireEvent.change` on a `<select>` should find it with
118
+ `getByRole('combobox', { name })`, open it, and choose a row by `getByRole('option', { name })`.
119
+ - **If you need the platform picker, pass `native`.** It renders the `<select>` element, with the
120
+ same props and the same `onValueChange` — not the removed native API.
121
+ - **A `name` still submits.** Base UI keeps a hidden input under `name`, so `FormData` carries the
122
+ chosen `value` as before. `form` and `autoComplete` are now explicit props.
123
+
124
+ ### Rendering changed
125
+
126
+ - **The closed `Select` gains a chevron, and its open list is drawn from roles** — `surface.raised`
127
+ rows, an accent fill on the highlighted row, an accent `>` on the chosen one. The
128
+ `errorsummary-account-settings*` baselines move with it, and `select-*` rows are new.
129
+
130
+ ## 0.10.0
131
+
132
+ The capability release: every row in [`docs/capability-readiness.md`](./docs/capability-readiness.md)
133
+ but *Choose one* is `ready`, so a site can be built without inventing its own interaction
134
+ behaviour. The themed `Select` that finishes that row is a breaking change and follows in 0.11.0.
135
+
136
+ ### You have to do something
137
+
138
+ - **Nothing, for imports.** No export was removed or renamed; 120 were added. The entry points,
139
+ `files`, runtime dependencies and peer dependencies are the same as 0.9.0.
140
+ - **If you pass `BlogPost` an `author` string other than the default name**, the card now shows that
141
+ author — their own initials, no description — instead of the default author's initials and bio.
142
+ Pass a `BlogAuthor` object (`name`, `initials`, `avatar`, `url`, `description`) to describe them,
143
+ or `authorCard` to replace the card. Omitting `author` is unchanged.
144
+ - **If you pass `SaasLandingPage` `deployLog=""`**, the terminal preview is now hidden, as the prop
145
+ always documented.
146
+
147
+ ### Rendering changed
148
+
149
+ - **`Pagination` renders a numbered page list** rather than previous/next alone.
150
+ - **A `DataTable` with `pageSize` now paginates:** one page of rows, with `Pagination` beneath when
151
+ there is more than one page. It also renders `caption`, row headers, `scope` and `aria-sort`.
152
+ - **Portalled surfaces follow a scoped `ThemeProvider`.** `Modal`, `AlertDialog`, `Drawer`, `Toast`,
153
+ `Tooltip`, `Popover` and `Menu` rendered inside `<ThemeProvider scoped>` take that provider's Level,
154
+ not the document's. Under an unscoped provider nothing changes.
155
+ - **`SaasLandingPage`** is now composed from the marketing sections. Its prices use the display
156
+ face (they had fallen back to the system sans-serif), and its grids drop to one column below `md`
157
+ instead of overflowing a phone's width.
158
+
159
+ ### New
160
+
161
+ - **Forms:** `Checkbox`, `Switch`, `Fieldset` + `Legend`, `RadioGroup` + `Radio`, and
162
+ `ErrorSummary` — a form-level summary that links to each invalid field and takes focus when it
163
+ appears.
164
+ - **Feedback:** `Spinner`, `Skeleton`, `Progress`, `EmptyState`, and `ToastProvider` / `useToast`.
165
+ - **Overlays:** `Drawer`, `Tooltip`, `Popover` and `Menu`, all on Base UI.
166
+ - **Navigation:** `Tabs`, `SiteHeader` (skip link, breakpoint swap), `SiteNav` + `SiteNavItem`,
167
+ `MobileNav` and `SiteFooter`, with `LinkProvider` / `SiteLink` to inject a router's link and its
168
+ current-route test once. `DocsLinkProvider` keeps its API and now shares that context.
169
+ - **Layout:** `AppShell` with `AppSidebar`, `AppSidebarNav`, `AppTopbar` and `AppMain`.
170
+ - **Marketing:** `Hero`, `FeatureGrid` + `Feature`, `PricingGrid` + `PricingTier`, `CTASection`.
171
+ - **Reports:** `ReportDocument`, `ReportSection`, `ReportDetails`.
172
+ - **`BlogPost`:** `BlogAuthor` and the `authorCard` slot.
173
+
174
+ ### Fixed
175
+
176
+ - `Input`, `TextArea` and `Select` merge a caller's `style` with the accent instead of losing it.
177
+ - `TextArea` and `Select` put their `id` on the control, so the label's `for` points at it and a
178
+ click on the label focuses the field.
179
+ - `Card` forwards its ref.
180
+ ## 0.9.0
181
+
182
+ `Modal` on Base UI's dialog, and the `AlertDialog` that had to ship with it.
183
+
184
+ ### You have to do something
185
+
186
+ - **Nothing, if you only render `Modal`.** `ModalProps` is unchanged — `isOpen`, `onClose`,
187
+ `title`, `children`, `footer`, `closeOnBackdropClick`, `className` all mean what they meant.
188
+ `Modal` now also forwards a ref and spreads unrecognised props onto the dialog.
189
+ - **If you targeted `[data-slot="modal-backdrop"]` to position or size the dialog**, that element
190
+ no longer wraps it. Base UI splits the one element into two: `modal-backdrop` is the dim,
191
+ `modal-viewport` is the centring container and the dialog's parent. Styling the dim is unchanged;
192
+ anything about layout moves to `modal-viewport`.
193
+ - **If you asserted `aria-modal` on the dialog**, it is gone, and not by omission. Base UI marks the
194
+ portal's siblings `aria-hidden` instead — the mechanism `aria-modal` is a hint for, and the one
195
+ screen readers implement consistently. Assert the sibling marking, not the attribute.
196
+ - **If you tested backdrop dismissal with `mouseDown` alone**, send a pointer sequence
197
+ (`pointerdown` then `click`). Base UI confirms an outside press rather than acting on the first
198
+ event, which is closer to what a browser sends.
199
+
200
+ ### Rendering changed
201
+
202
+ - **`Modal` gains a backdrop element and a viewport element**, and fades both on open and close via
203
+ `data-starting-style` / `data-ending-style`, at `--ds-duration-quick`. The enter/exit is
204
+ suppressed under `prefers-reduced-motion`. `modal-*` baselines move.
205
+ - **Focus lands on the dialog, not on its close button.** Unchanged in effect from the hand-rolled
206
+ version, but it is now a deliberate `initialFocus` rather than a side effect of a `tabIndex={-1}`
207
+ container.
208
+
209
+ ### New
210
+
211
+ - **`AlertDialog`** — destructive confirmation. Same surface as `Modal`, different dismissal
212
+ contract: a backdrop press *cannot* close it, Escape can, and there is no `×`. `onConfirm` is
213
+ separate from `onClose`, so the two answers never collapse into one handler.
214
+
215
+ ### Deleted
216
+
217
+ - `Modal`'s hand-rolled focus trap, capture-phase `document` Escape listener, `body.style.overflow`
218
+ scroll lock and focus-return ref. With them go three defects: Escape closing two stacked dialogs
219
+ at once, a focus boundary computed once from the first and last focusable node, and a page behind
220
+ the dialog that was never hidden from assistive technology. The scroll lock also no longer shifts
221
+ the page by the scrollbar's width.
222
+
223
+ ## 0.7.0
224
+
225
+ The primitive layer, and four new gates.
226
+
227
+ ### You have to do something
228
+
229
+ - **`@base-ui/react` is a runtime dependency.** Nine packages, all MIT. `Input`, `TextArea` and
230
+ `Select` are built on its `Field` instead of a hand-rolled `useField()`; the props are unchanged.
231
+ It is now the *only* permitted primitive library — rule 4 in `AGENTS.md` — which bars `radix-ui`
232
+ and anything depending on it, `cmdk` included.
233
+ - **`BracketText` no longer accepts `accent="white"`.** Omit `accent` for the default ink. It was an
234
+ appearance name in a component API, which ADR 0001 exists to prevent, and it outlived the hue
235
+ vocabulary #138 removed because the union named it explicitly.
236
+ - **`AdminNavItem.icon` and `AdminStatusBadge.icon` take a component, not an element** —
237
+ `LayoutDashboard`, never `<LayoutDashboard size={18} />`. Size travels as a `className`. This
238
+ matches `PageHeader`, `StatCard` and `DocsHeader`, and it is what stopped Storybook's source
239
+ generator throwing on those stories.
240
+
241
+ ### Rendering changed
242
+
243
+ - **Code blocks are `text.primary`, not `intent.success`.** Every code block rendered in the
244
+ "this worked" green, contradicting the `--tw-prose-pre-code` mapping eleven lines above it.
245
+ 6.02:1 → 13.63:1 on `sketch`.
246
+ - **`Modal` is above the docs header.** It was `z-50` against the header's `z-index: 60`, so a
247
+ dialog painted *under* the page chrome it covers. Both now read the `--ds-layer-*` scale.
248
+ - **Three touch-device affordances stopped being dimmed.** `.docs-anchor-link`,
249
+ `.docs-codeblock-copy` and `.docs-sidebar-link-static` addressed `text.muted` instead of an
250
+ `opacity` on `text.primary` — 3.45:1 and 2.64:1 on `sketch`, permanently, on every touch device.
251
+ `opacity` changes the foreground *after* `check:contrast` reads it.
252
+
253
+ ### New
254
+
255
+ - **`Swatch` and `SwatchGroup`** — the package can draw its own palette outside a story file.
256
+ - `accentFillClass()`, joining `accentTextClass()` / `accentFocusClass()` / `accentHoverEdgeClass()`.
257
+ All four accent-to-class maps are now one, in `lib/accentClasses`.
258
+ - **Four gates**: `check:doc-snippets` (props and level names in documentation code fences against
259
+ `api/index.d.ts`), `check:component-docs` (every component carries a JSDoc — a ratchet at 18),
260
+ plus `motion.transitions` and `motion.keyframes` claims in `check:docs`.
261
+ - `docs/deterministic-rendering.md` — the three switches that decide whether a capture reproduces.
262
+ `scoped` is the one that does the work; `persist={false} followSystem={false}` look like the
263
+ determinism controls and are redundant under it.
264
+ - `docs/research.md` — the outside reading, and what each idea changed here.
265
+ - Interaction baselines: `button-hover`, `button-pressed`, `input-keyboard-focus`. The focus one is
266
+ the assertion `focus-ring.test.ts` says it cannot make.
267
+
268
+ ### Fixed
269
+
270
+ - The keyboard focus ring survives on `Input`, `TextArea`, `Tag`, `Modal` and `CodeTabs` —
271
+ `focus:outline-none` at (0,2,0) was beating the global `:focus-visible` at (0,1,0).
272
+ - `DocsHeader` and `AdminDashboardLayout` render without a `ThemeProvider` instead of throwing.
273
+ - `SectionContainer` merges a caller's `className` instead of appending it, so a conflicting
274
+ utility now wins.
275
+ - `accent.quiet` is audited as a fill. 220 contrast pairs → 222.
276
+ - The README's integration snippet passed a prop that does not exist.
277
+
278
+ ### Also in this release, landed after 0.6.0 published
279
+
280
+ Terminal schemes, and the second axis.
281
+
282
+ - **Terminal / ANSI ships.** `terminal/rtk-{midnight,sketch}.{itermcolors,windows-terminal.json,alacritty.toml,ghostty.conf}` — eight files, exported and packed. Four encodings of one fan-out, which is why terminal was the cheapest Target left.
283
+ - `pnpm ansi:build` / `ansi:check`. The check is **slot coverage plus a committed fixture diff** — the two gates ADR 0001 says a fan-out map requires, since a wrong map emits confidently: a terminal renders an unfilled slot as the foreground rather than erroring.
284
+ - `ANSI_SLOTS`, `SLOTS`, `ansiScheme` are public. The fan-out is data, so it is unit-tested.
285
+ - `allowImportingTsExtensions` in `tsconfig.json`, so a module can be imported by both `tsc` and a plain `.mjs` emitter without a workaround.
286
+
287
+ The second axis. Geometry and time are declared for the first time; ADRs 0001–0004 are accepted.
288
+
289
+ - **`Medium`** — `web`, `video`, `graphic`. A unit system and a time base, chosen at build time
290
+ by which artifact is being emitted, where a Level is chosen at runtime. **No token varies on
291
+ both axes.** `src/theme/media.ts`.
292
+ - `theme.css` carries exactly one Medium, `web`: `--ds-space-*`, `--ds-type-*`,
293
+ `--ds-leading-*`, `--ds-weight-*`, `--ds-stroke-*`, `--ds-elev-*`, `--ds-radius-*`,
294
+ `--ds-duration-*`, `--ds-ease`, `--ds-layer-*`, `--ds-focus-*`. 274 → 336 properties.
295
+ - **Prefixes do not collide across axes.** `--ds-text-*` is ink and `--ds-type-*` is size;
296
+ `--ds-border-*` is colour and `--ds-stroke-*` is width. Renamed before shipping, not after.
297
+ - **Radius is a token, not a reset.** `*, *::before, *::after { border-radius: 0 !important }`
298
+ is gone; Tailwind's whole radius scale is redefined to the Medium's value, so `rounded-lg` is
299
+ square without this package touching a consumer's document. Closes #54.
300
+ - **The contrast floor is Medium-keyed.** `pnpm check:contrast` defaults to the web floors;
301
+ `--medium=video` enforces the stricter frame ones, which the current palette does **not**
302
+ clear — deliberately, since no video artifact is emitted yet.
303
+ - `video` is not the web scaled: its type steps are its own and its motion is whole frames.
304
+ `graphic` has no time base at all.
305
+
306
+ ## 0.6.0
307
+
308
+ The hue vocabulary is gone from the component API. Nothing addresses a colour by
309
+ its appearance any more.
310
+
311
+ - `LegacyAccent`, `brutalistTokens`, and the `--color-brutalist-*`,
312
+ `--color-black` and `--color-white` compat aliases are **deleted**. 540
313
+ emitted custom properties down to 250.
314
+ - `accent` / `variant` props take Roles only: `primary`, `secondary`,
315
+ `tertiary`, `quiet` and the four intents. `cyan` → `primary`,
316
+ `yellow` → `secondary`, `pink` → `tertiary`, `green` → `success`.
317
+ - Tailwind utilities: `bg-brutalist-cyan` → `bg-accent-primary`,
318
+ `text-brutalist-pink` → `text-accent-tertiary`,
319
+ `text-brutalist-yellow` → `text-accent-secondary`,
320
+ `text-brutalist-neonGreen` → `text-intent-success`.
321
+ - CSS variables: `var(--brutalist-cyan)` → `var(--ds-accent-primary)`. Do not
322
+ keep a hue-named fallback — it will be a dark value applied on a light theme.
323
+ - `PageHeaderAccent`, `CardAccent`, `TagAccent` deleted; use `AccentToken`.
324
+ - **Added** a glow per role — `--shadow-glow-accent-tertiary` and friends —
325
+ because the compat layer's `glow-cyan` / `glow-pink` / `glow-orange` had no
326
+ role-named equivalent. `shadow-glow-cyan` → `shadow-glow-accent-primary`,
327
+ `shadow-glow-pink` → `shadow-glow-accent-tertiary`,
328
+ `shadow-glow-orange` → `shadow-glow-accent-secondary`. Hard shadows were
329
+ already role-named; the glows being hue-only was a symptom of the layer being
330
+ removed.
331
+
332
+ ## 0.5.0
333
+
334
+ Two themes, and a colour vocabulary underneath the semantic one.
335
+
336
+ - `THEME_LEVELS` is `['midnight', 'sketch']`. `dim`, `bright` and `white` are
337
+ gone, and so is `levelsByPolarity`. `dim` → `midnight`;
338
+ `bright` / `white` → `sketch`.
339
+ - `palette` and `paletteBright` — ten Hues per theme, gated at 5.5:1. Components
340
+ address Roles; a Hue in component code is a defect.
341
+ - `accentHue` / `intentHue` declare which Hue each Role is, and
342
+ `check:contrast` asserts they agree.
343
+ - `FIXED_COLOURS` — Level-invariant `black`, `white`, `transparent`.
344
+ - Design Tokens Format Module export at `tokens/palette.<level>.tokens.json`,
345
+ OKLCH with an sRGB hex fallback.
346
+ - Themes are selected with `[data-theme="…"]`. A consumer applying them as a
347
+ class only will match no theme block at all.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ryan Kelly
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.