Once UI 1.8 is the release where the details got their due: new composition props, long-overdue fixes, a fully green test suite, and a changelog that's now the source of truth.
Once UI 1.8 is what happens when the largest community pull request in our history meets a growing obsession with quality. New composition props across Dialog, CodeBlock, Checkbox and RadioButton. Fixes that were overdue. And behind it all, something we've never shipped before: a fully green test suite and a changelog that acts as the source of truth.
More control where it counts
Dialog gains a flush prop for full-bleed, headerless dialogs—perfect for onboarding flows, media lightboxes, or anything where the chrome should disappear. Pair it with hideClose when you want full control over how users exit.CodeBlock picks up background and hideCode props, so code samples adapt to their surroundings instead of fighting them. And Checkbox and RadioButton now accept a hoverable prop to suppress the hover pulse when a quieter interaction fits better.
Typography fills in
TextWeight gains normal (400) and medium (500) variants, with matching --font-weight-display-* tokens and .font-normal / .font-medium utilities. Two small weights, a big difference in how much nuance your type system can carry.
Typed breakpoints, per component
Responsive props are now typed per component—FlexBreakpointProps, GridBreakpointProps, TextBreakpointProps and friends. Your editor knows exactly which responsive props each component accepts, and so does your AI agent.
Fixes that were overdue
Some bugs linger because they're hard. Some linger because they're small. 1.8 closes both kinds:
Checkbox and RadioButton ids now come from useId() instead of Math.random()—no more SSR hydration mismatches.
RadioButton no longer shows an unchecked border in dark mode.
Empty charts no longer collapse to zero height.
CodeBlock grammars now resolve for md, mdx, dockerfile and shell aliases—and plain-text languages stopped warning.
A ScrollLock regression was caught and fixed in release integration, and with it, four long-standing test failures. The full suite now passes at 92/92.
Lighter under the hood
We swapped classnames for —identical API, smaller bundle. Several components moved from to . The package map now ships conditions on every subpath, with CJS support preserved. Image-rendering components like , , and accept an prop for when you need to bypass optimization. And positioning got smarter across , , and everything else built on it.
clsx
React.FC
forwardRef
exports
types
Carousel
CompareImage
OgCard
Swiper
unoptimized
DropdownWrapper
Select
DateInput
ContextMenu
A changelog you can trust
1.8 also marks a process milestone: CHANGELOG.md and RELEASING.md now live in the repository, and release notes are generated from them—not the other way around. When 1.8.1 followed a day later, it did exactly what a patch should: restored the AI harness JSON, corrected Table styles, and patched seven transitive security advisories. Documented, classified, shipped.
Most of what you just read arrived in a single community pull request—the largest we've ever merged. Props, fixes, tokens, types: one contributor, one PR, one release transformed.
Thank you to everyone who contributed, filed issues, or shared feedback. This is what a community-driven design system looks like.