Once UI Blog
Posts
Once UI
Once UI 2.5: reactions that move
Once UI 2.4: ready for AI apps
Once UI 3.0 beta: one way to say it
Stack languages: your app in Hungarian, or in two
Stack store: your shop on your own site
Liquid Metal: chrome that never sets
Chirio, redesigned
Styled screenshots in Chirio
Once UI 2.3: made for real apps
Frametic is now a video and capture studio
Agents write about 40% less code from Stack
Magic Portfolio, now on Once UI 2
Frametic MCP: let your agent film your site
Once UI Stack: your site as a desktop app
Once UI Stack, redesigned
Stack: teams and billing
Prism Glow: soft prism light behind your sign-in screen
Once UI for React Native: the same props on a phone
Once UI 2.2: chat, forms and mobile
Dither: your own image or video as a dithered print
Once UI 2.1: The pieces apps kept asking for
Once UI 2.0: A system an AI can build with
What made Once UI 2.0 possible
Once UI 2.0 alpha: Measured, not assumed
Colour arrives in pairs
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
Side and Once UI: From café website to reservation system
SatisPro and Once UI: Scaling smarter review management
IQON and Once UI: Scaling with a design system
Dev: Blending science and code with Once UI
JExcellence and Once UI: Turning experiments into enterprise apps
OsmyReal: Launching a platform for mobile gaming with minimal coding
TrademarkTrademark
Ctrl k
Search…
Sign up
Once UI Blog
Posts
Once UI
Once UI 2.5: reactions that move
Once UI 2.4: ready for AI apps
Once UI 3.0 beta: one way to say it
Stack languages: your app in Hungarian, or in two
Stack store: your shop on your own site
Liquid Metal: chrome that never sets
Chirio, redesigned
Styled screenshots in Chirio
Once UI 2.3: made for real apps
Frametic is now a video and capture studio
Agents write about 40% less code from Stack
Magic Portfolio, now on Once UI 2
Frametic MCP: let your agent film your site
Once UI Stack: your site as a desktop app
Once UI Stack, redesigned
Stack: teams and billing
Prism Glow: soft prism light behind your sign-in screen
Once UI for React Native: the same props on a phone
Once UI 2.2: chat, forms and mobile
Dither: your own image or video as a dithered print
Once UI 2.1: The pieces apps kept asking for
Once UI 2.0: A system an AI can build with
What made Once UI 2.0 possible
Once UI 2.0 alpha: Measured, not assumed
Colour arrives in pairs
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
Side and Once UI: From café website to reservation system
SatisPro and Once UI: Scaling smarter review management
IQON and Once UI: Scaling with a design system
Dev: Blending science and code with Once UI
JExcellence and Once UI: Turning experiments into enterprise apps
OsmyReal: Launching a platform for mobile gaming with minimal coding
Sponsored
Aveiro
aveiro.app
Sponsored
Aveiro
aveiro.app
TrademarkTrademark
Once UIDocumentationBlog
© Once UI. All rights reserved.
Built with Aveiro
Release

Once UI 2.2: chat, forms and mobile

Building blocks for chat and forms, a core that works on phones, about 25 fixes, and docs an AI agent reads in one go.
Updated 2 days ago
Once UI for React Native: the same props on a phone
Dither: your own image or video as a dithered print
Once UI 2.2 adds the parts most apps end up building by hand: a chat, forms that wire themselves up, and a core that behaves on a phone. It also makes the docs cheaper for an AI agent to read, and fixes about 25 bugs.
Once UI 2.2 at a glance, slide 1 of 9
Once UI 2.2 at a glance, slide 2 of 9
Once UI 2.2 at a glance, slide 3 of 9
Once UI 2.2 at a glance, slide 4 of 9
Once UI 2.2 at a glance, slide 5 of 9
Once UI 2.2 at a glance, slide 6 of 9
Once UI 2.2 at a glance, slide 7 of 9
Once UI 2.2 at a glance, slide 8 of 9
Once UI 2.2 at a glance, slide 9 of 9
npm i @once-ui-system/core@latest

Chat

Five components cover what every chat has: ChatMessage for a bubble with its author, time and delivery state, ChatMessageList that follows the conversation as it grows, ChatComposer with send and attach, TypingIndicator, and ConversationItem for inbox rows. They work for people talking to each other and for an assistant that streams its replies.
<ChatMessageList ariaLabel="Chat">
  {messages.map((m) => (
    <ChatMessage key={m.id} from={m.from} time={m.time}>
      {m.text}
    </ChatMessage>
  ))}
  {typing && <TypingIndicator />}
</ChatMessageList>
<ChatComposer onSend={send} attach />
Set from="self" to put a message on the right, and grouped on a follow-up from the same author so the bubbles line up. They are under Modules, then Chat, in the docs.

Forms

A label, a hint and an error each need an id, and the control needs aria-describedby and aria-invalid pointing at them. Written by hand, that bookkeeping breaks silently: the error shows and a screen reader never hears it. Field does the wiring for you. Fieldset groups controls, SubmitButton shows a pending state while the submit runs, and FormErrorSummary lists what to fix and links to each field.
Form now takes an async onSubmit, and useField and useFormPending let your own controls join in.

Mobile-ready core

On a touch screen, small controls grow to a 44px touch target without changing how they look. Hover styles no longer stick after a tap. New --safe-area-* tokens keep sheets and bars clear of notches and the home indicator, and the viewport units no longer jump when the browser bar slides away.

Fewer tokens for agents

When an AI agent builds a page with Once UI, most of what it pays for is reading. The package now ships one Markdown bundle per kind of page, such as a dashboard, a pricing page or a changelog, with the rules, the components, their known gotchas and a finished example in one file. AGENTS.md points to the right bundle, so an agent reads one file and starts writing.
Page
2.1
2.2
Change
Dashboard726k186k−74%
Product grid345k141k−59%
Changelog264k91k−66%
Pricing page136k73k−46%
These are our own test runs with the same model, prompts and checks as for 2.1, one or two runs per page. They are not a benchmark, and we have not rated the pages for quality yet.

Fixes

About 25 bugs are fixed. The date components take labels for other languages, and the locale now reaches the time picker. DatePicker respects the week start, Checkbox, Radio and Switch pass their native props through so they work with react-hook-form, and AccordionGroup, OTPInput, DateRangeInput and Badge behave as documented. The full list is in the changelog.
<Form as="form" onSubmit={async (e) => {
  e.preventDefault();
  await save(new FormData(e.currentTarget));
}}>
  <Field label="Email" hint="For receipts" error={error}>
    <Input id="email" />
  </Field>
  <SubmitButton pendingLabel="Saving…">Save</SubmitButton>
</Form>