@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.
- package/CHANGELOG.md +347 -0
- package/LICENSE +21 -0
- package/README.md +317 -2
- package/dist/components/AlertDialog.js +95 -0
- package/dist/components/AlertDialog.js.map +1 -0
- package/dist/components/AppShell.js +261 -0
- package/dist/components/AppShell.js.map +1 -0
- package/dist/components/AsciiDivider.js +8 -0
- package/dist/components/AsciiDivider.js.map +1 -0
- package/dist/components/AsciiGauge.js +130 -0
- package/dist/components/AsciiGauge.js.map +1 -0
- package/dist/components/Avatar.js +87 -0
- package/dist/components/Avatar.js.map +1 -0
- package/dist/components/Badge.js +25 -0
- package/dist/components/Badge.js.map +1 -0
- package/dist/components/BarChart.js +288 -0
- package/dist/components/BarChart.js.map +1 -0
- package/dist/components/BracketText.js +23 -0
- package/dist/components/BracketText.js.map +1 -0
- package/dist/components/BulletChart.js +50 -0
- package/dist/components/BulletChart.js.map +1 -0
- package/dist/components/Button.js +130 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Card.js +181 -0
- package/dist/components/Card.js.map +1 -0
- package/dist/components/ChartTooltip.js +54 -0
- package/dist/components/ChartTooltip.js.map +1 -0
- package/dist/components/Checkbox.js +55 -0
- package/dist/components/Checkbox.js.map +1 -0
- package/dist/components/ColophonCard.js +122 -0
- package/dist/components/ColophonCard.js.map +1 -0
- package/dist/components/DataTable.js +299 -0
- package/dist/components/DataTable.js.map +1 -0
- package/dist/components/Divider.js +42 -0
- package/dist/components/Divider.js.map +1 -0
- package/dist/components/Drawer.js +81 -0
- package/dist/components/Drawer.js.map +1 -0
- package/dist/components/EmptyState.js +39 -0
- package/dist/components/EmptyState.js.map +1 -0
- package/dist/components/ErrorSummary.js +122 -0
- package/dist/components/ErrorSummary.js.map +1 -0
- package/dist/components/Fieldset.js +37 -0
- package/dist/components/Fieldset.js.map +1 -0
- package/dist/components/Glyph.js +60 -0
- package/dist/components/Glyph.js.map +1 -0
- package/dist/components/Input.js +111 -0
- package/dist/components/Input.js.map +1 -0
- package/dist/components/LinkProvider.js +76 -0
- package/dist/components/LinkProvider.js.map +1 -0
- package/dist/components/Menu.js +144 -0
- package/dist/components/Menu.js.map +1 -0
- package/dist/components/MetadataGrid.js +184 -0
- package/dist/components/MetadataGrid.js.map +1 -0
- package/dist/components/MobileNav.js +120 -0
- package/dist/components/MobileNav.js.map +1 -0
- package/dist/components/Modal.js +79 -0
- package/dist/components/Modal.js.map +1 -0
- package/dist/components/NerdIcon.js +177 -0
- package/dist/components/NerdIcon.js.map +1 -0
- package/dist/components/NoteBlock.js +84 -0
- package/dist/components/NoteBlock.js.map +1 -0
- package/dist/components/PageHeader.js +34 -0
- package/dist/components/PageHeader.js.map +1 -0
- package/dist/components/PageTitle.js +21 -0
- package/dist/components/PageTitle.js.map +1 -0
- package/dist/components/Pagination.js +96 -0
- package/dist/components/Pagination.js.map +1 -0
- package/dist/components/Popover.js +87 -0
- package/dist/components/Popover.js.map +1 -0
- package/dist/components/Progress.js +83 -0
- package/dist/components/Progress.js.map +1 -0
- package/dist/components/RadioGroup.js +74 -0
- package/dist/components/RadioGroup.js.map +1 -0
- package/dist/components/ReportDocument.js +75 -0
- package/dist/components/ReportDocument.js.map +1 -0
- package/dist/components/SectionContainer.js +18 -0
- package/dist/components/SectionContainer.js.map +1 -0
- package/dist/components/Select.js +199 -0
- package/dist/components/Select.js.map +1 -0
- package/dist/components/SiteFooter.js +29 -0
- package/dist/components/SiteFooter.js.map +1 -0
- package/dist/components/SiteHeader.js +59 -0
- package/dist/components/SiteHeader.js.map +1 -0
- package/dist/components/SiteNav.js +141 -0
- package/dist/components/SiteNav.js.map +1 -0
- package/dist/components/Skeleton.js +51 -0
- package/dist/components/Skeleton.js.map +1 -0
- package/dist/components/SocialIcon.js +77 -0
- package/dist/components/SocialIcon.js.map +1 -0
- package/dist/components/Sparkline.js +104 -0
- package/dist/components/Sparkline.js.map +1 -0
- package/dist/components/Spinner.js +65 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/StatCard.js +53 -0
- package/dist/components/StatCard.js.map +1 -0
- package/dist/components/StatusPage.js +99 -0
- package/dist/components/StatusPage.js.map +1 -0
- package/dist/components/Swatch.js +55 -0
- package/dist/components/Swatch.js.map +1 -0
- package/dist/components/Switch.js +53 -0
- package/dist/components/Switch.js.map +1 -0
- package/dist/components/TLDR.js +53 -0
- package/dist/components/TLDR.js.map +1 -0
- package/dist/components/Table.js +155 -0
- package/dist/components/Table.js.map +1 -0
- package/dist/components/Tabs.js +325 -0
- package/dist/components/Tabs.js.map +1 -0
- package/dist/components/Tag.js +19 -0
- package/dist/components/Tag.js.map +1 -0
- package/dist/components/TelemetryGauge.js +112 -0
- package/dist/components/TelemetryGauge.js.map +1 -0
- package/dist/components/ThemeProvider.js +87 -0
- package/dist/components/ThemeProvider.js.map +1 -0
- package/dist/components/TickerTape.js +196 -0
- package/dist/components/TickerTape.js.map +1 -0
- package/dist/components/Toast.js +200 -0
- package/dist/components/Toast.js.map +1 -0
- package/dist/components/Tooltip.js +69 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/components/TrackCard.js +206 -0
- package/dist/components/TrackCard.js.map +1 -0
- package/dist/components/blog/BlogPost.js +116 -0
- package/dist/components/blog/BlogPost.js.map +1 -0
- package/dist/components/blog/LoremIpsumPost.js +62 -0
- package/dist/components/blog/LoremIpsumPost.js.map +1 -0
- package/dist/components/blog/author.js +25 -0
- package/dist/components/blog/author.js.map +1 -0
- package/dist/components/booleanControl.js +50 -0
- package/dist/components/booleanControl.js.map +1 -0
- package/dist/components/dialogPopupRef.js +28 -0
- package/dist/components/dialogPopupRef.js.map +1 -0
- package/dist/components/dialogSurface.js +75 -0
- package/dist/components/dialogSurface.js.map +1 -0
- package/dist/components/docs/AnchorHeading.js +80 -0
- package/dist/components/docs/AnchorHeading.js.map +1 -0
- package/dist/components/docs/Breadcrumbs.js +26 -0
- package/dist/components/docs/Breadcrumbs.js.map +1 -0
- package/dist/components/docs/CodeBlock.js +63 -0
- package/dist/components/docs/CodeBlock.js.map +1 -0
- package/dist/components/docs/CodeTabs.js +71 -0
- package/dist/components/docs/CodeTabs.js.map +1 -0
- package/dist/components/docs/DocPager.js +28 -0
- package/dist/components/docs/DocPager.js.map +1 -0
- package/dist/components/docs/DocsHeader.js +124 -0
- package/dist/components/docs/DocsHeader.js.map +1 -0
- package/dist/components/docs/DocsLayout.js +61 -0
- package/dist/components/docs/DocsLayout.js.map +1 -0
- package/dist/components/docs/DocsLinkProvider.js +25 -0
- package/dist/components/docs/DocsLinkProvider.js.map +1 -0
- package/dist/components/docs/DocsSidebar.js +147 -0
- package/dist/components/docs/DocsSidebar.js.map +1 -0
- package/dist/components/docs/Prose.js +56 -0
- package/dist/components/docs/Prose.js.map +1 -0
- package/dist/components/docs/TableOfContents.js +71 -0
- package/dist/components/docs/TableOfContents.js.map +1 -0
- package/dist/components/docs/codeTabsStore.js +75 -0
- package/dist/components/docs/codeTabsStore.js.map +1 -0
- package/dist/components/docs/figures/ActivityGrid.js +116 -0
- package/dist/components/docs/figures/ActivityGrid.js.map +1 -0
- package/dist/components/docs/figures/BeforeAfter.js +64 -0
- package/dist/components/docs/figures/BeforeAfter.js.map +1 -0
- package/dist/components/docs/figures/ChangeSummary.js +74 -0
- package/dist/components/docs/figures/ChangeSummary.js.map +1 -0
- package/dist/components/docs/figures/Decision.js +34 -0
- package/dist/components/docs/figures/Decision.js.map +1 -0
- package/dist/components/docs/figures/DrawingSheet.js +37 -0
- package/dist/components/docs/figures/DrawingSheet.js.map +1 -0
- package/dist/components/docs/figures/FigureFrame.js +226 -0
- package/dist/components/docs/figures/FigureFrame.js.map +1 -0
- package/dist/components/docs/figures/FileChangeTree.js +134 -0
- package/dist/components/docs/figures/FileChangeTree.js.map +1 -0
- package/dist/components/docs/figures/FlowDiagram.js +82 -0
- package/dist/components/docs/figures/FlowDiagram.js.map +1 -0
- package/dist/components/docs/figures/GanttChart.js +79 -0
- package/dist/components/docs/figures/GanttChart.js.map +1 -0
- package/dist/components/docs/figures/IndexedSection.js +45 -0
- package/dist/components/docs/figures/IndexedSection.js.map +1 -0
- package/dist/components/docs/figures/MetricStrip.js +23 -0
- package/dist/components/docs/figures/MetricStrip.js.map +1 -0
- package/dist/components/docs/figures/Steps.js +58 -0
- package/dist/components/docs/figures/Steps.js.map +1 -0
- package/dist/components/docs/figures/SwatchCompare.js +42 -0
- package/dist/components/docs/figures/SwatchCompare.js.map +1 -0
- package/dist/components/docs/figures/TermGrid.js +22 -0
- package/dist/components/docs/figures/TermGrid.js.map +1 -0
- package/dist/components/docs/figures/Terminal.js +37 -0
- package/dist/components/docs/figures/Terminal.js.map +1 -0
- package/dist/components/docs/figures/Timeline.js +61 -0
- package/dist/components/docs/figures/Timeline.js.map +1 -0
- package/dist/components/docs/figures/TokenTable.js +42 -0
- package/dist/components/docs/figures/TokenTable.js.map +1 -0
- package/dist/components/docs/figures/TreeDiagram.js +76 -0
- package/dist/components/docs/figures/TreeDiagram.js.map +1 -0
- package/dist/components/docs/figures/UptimeStrip.js +68 -0
- package/dist/components/docs/figures/UptimeStrip.js.map +1 -0
- package/dist/components/docs/figures/index.js +24 -0
- package/dist/components/docs/figures/index.js.map +1 -0
- package/dist/components/docs/index.js +15 -0
- package/dist/components/docs/index.js.map +1 -0
- package/dist/components/docs/mdxComponents.js +108 -0
- package/dist/components/docs/mdxComponents.js.map +1 -0
- package/dist/components/experiments/DesignSandbox.js +206 -0
- package/dist/components/experiments/DesignSandbox.js.map +1 -0
- package/dist/components/experiments/ExperimentsView.js +138 -0
- package/dist/components/experiments/ExperimentsView.js.map +1 -0
- package/dist/components/fieldFrame.js +200 -0
- package/dist/components/fieldFrame.js.map +1 -0
- package/dist/components/floatingSurface.js +35 -0
- package/dist/components/floatingSurface.js.map +1 -0
- package/dist/components/marketing/CTASection.js +47 -0
- package/dist/components/marketing/CTASection.js.map +1 -0
- package/dist/components/marketing/FeatureGrid.js +49 -0
- package/dist/components/marketing/FeatureGrid.js.map +1 -0
- package/dist/components/marketing/Hero.js +44 -0
- package/dist/components/marketing/Hero.js.map +1 -0
- package/dist/components/marketing/PricingGrid.js +65 -0
- package/dist/components/marketing/PricingGrid.js.map +1 -0
- package/dist/components/marketing/SectionGrid.js +51 -0
- package/dist/components/marketing/SectionGrid.js.map +1 -0
- package/dist/components/paginationRange.js +28 -0
- package/dist/components/paginationRange.js.map +1 -0
- package/dist/components/portalTheme.js +14 -0
- package/dist/components/portalTheme.js.map +1 -0
- package/dist/components/saas/SaasLandingPage.js +201 -0
- package/dist/components/saas/SaasLandingPage.js.map +1 -0
- package/dist/components/siteNavContext.js +24 -0
- package/dist/components/siteNavContext.js.map +1 -0
- package/dist/components/slides/Slide.js +84 -0
- package/dist/components/slides/Slide.js.map +1 -0
- package/dist/components/slides/SlideDeck.js +228 -0
- package/dist/components/slides/SlideDeck.js.map +1 -0
- package/dist/components/themeInitScript.js +16 -0
- package/dist/components/themeInitScript.js.map +1 -0
- package/dist/components/themeScope.js +9 -0
- package/dist/components/themeScope.js.map +1 -0
- package/dist/components/toastLifetime.js +21 -0
- package/dist/components/toastLifetime.js.map +1 -0
- package/dist/fonts/DSSymbols-OFL.txt +98 -0
- package/dist/fonts/DSSymbols-Regular.woff2 +0 -0
- package/dist/fonts/SymbolsNerdFontMono-Regular.woff2 +0 -0
- package/dist/hooks/useActiveHeading.js +59 -0
- package/dist/hooks/useActiveHeading.js.map +1 -0
- package/dist/hooks/useCopyToClipboard.js +58 -0
- package/dist/hooks/useCopyToClipboard.js.map +1 -0
- package/dist/index.d.ts +6394 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/accentClasses.js +87 -0
- package/dist/lib/accentClasses.js.map +1 -0
- package/dist/lib/recipe.js +33 -0
- package/dist/lib/recipe.js.map +1 -0
- package/dist/lib/slug.js +39 -0
- package/dist/lib/slug.js.map +1 -0
- package/dist/lib/theme.js +76 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/lib/tokenRules.js +51 -0
- package/dist/lib/tokenRules.js.map +1 -0
- package/dist/prose.css +766 -0
- package/dist/styles.css +203 -0
- package/dist/theme/ansi.js +77 -0
- package/dist/theme/ansi.js.map +1 -0
- package/dist/theme/contrast.js +342 -0
- package/dist/theme/contrast.js.map +1 -0
- package/dist/theme/levels.js +234 -0
- package/dist/theme/levels.js.map +1 -0
- package/dist/theme/media.js +115 -0
- package/dist/theme/media.js.map +1 -0
- package/dist/theme/recommended.js +105 -0
- package/dist/theme/recommended.js.map +1 -0
- package/dist/theme.css +538 -0
- package/dist/tokens.js +1 -0
- package/dist/tokens.js.map +1 -0
- package/package.json +209 -6
- package/skills/design-system-usage/SKILL.md +75 -0
- package/terminal/rtk-midnight.alacritty.toml +33 -0
- package/terminal/rtk-midnight.ghostty.conf +24 -0
- package/terminal/rtk-midnight.itermcolors +167 -0
- package/terminal/rtk-midnight.windows-terminal.json +23 -0
- package/terminal/rtk-sketch.alacritty.toml +33 -0
- package/terminal/rtk-sketch.ghostty.conf +24 -0
- package/terminal/rtk-sketch.itermcolors +167 -0
- package/terminal/rtk-sketch.windows-terminal.json +23 -0
- package/tokens/palette.midnight.tokens.json +477 -0
- 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.
|