Once UI Blog
Posts
Once UI
Once UI 1.8: Polish as a feature
Once UI 1.7: Form with Intent
From products to systems: a new service model
Magic Journal: A different medium for long-form writing
Supa Social: The next milestone of our journey
Once UI is open source. Here's how we plan to keep it that way.
Designing a timeless, AI-native brand
Once UI 1.5: Curiosity in code
Once UI 1.4 migration guide: The breakpoint object
Launching in the AI-native era: A guide for indie builders
The first design system for indie builders
Builder Stories
OsmyReal: Launching a platform for mobile gaming with minimal coding
JExcellence and Once UI: Turning experiments into enterprise apps
Dev: Blending science and code with Once UI
IQON and Once UI: Scaling with a design system
TrademarkTrademark
Ctrl k
Search...
Sign up
Once UI Blog
Posts
Once UI
Once UI 1.8: Polish as a feature
Once UI 1.7: Form with Intent
From products to systems: a new service model
Magic Journal: A different medium for long-form writing
Supa Social: The next milestone of our journey
Once UI is open source. Here's how we plan to keep it that way.
Designing a timeless, AI-native brand
Once UI 1.5: Curiosity in code
Once UI 1.4 migration guide: The breakpoint object
Launching in the AI-native era: A guide for indie builders
The first design system for indie builders
Builder Stories
OsmyReal: Launching a platform for mobile gaming with minimal coding
JExcellence and Once UI: Turning experiments into enterprise apps
Dev: Blending science and code with Once UI
IQON and Once UI: Scaling with a design system
TrademarkTrademark
Once UIDocumentationBlog
© Once UI. All rights reserved.
Built with Aveiro

Once UI 1.8: Polish as a feature

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.
Updated 24d ago
Once UI 1.7: Form with Intent
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.
Full changelog

Built with the community

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.
divyanshudhruv