Once UI Handbook
Beginner Guides
What is Once UI?
Install & config
Page skeleton
Your first page
Build And Launch
How to launch a portfolio site that actually gets you hired
How to build a documentation site with MDX and Next.js
How to ship a landing page and dashboard with authentication in Next.js
How to launch a social app with Next.js and Supabase
Vibe Coding
Introduction to vibe coding
Set up your local dev environment
Essential tools for vibe coding
Build your first Once UI app
Common Patterns
Hero section
Static panel
Form layout
Highlighted card
Responsive stacking
Decoration layers
Dialog & modal
Toast & feedback
Tables & lists
Loading states
App shell navigation
Dashboard & charts
Chat & messaging
Auth & verification
Settings & split panels
Data filters & toolbar
Command palette
Pricing & plans
Accordion & FAQ
Media & uploads
Empty & error states
SEO, Open Graph, and structured data
Documentation code blocks with live preview
Carousels, galleries, and before/after comparisons
Date pickers and scheduling
Context menus and dropdown actions
Tags, chips, and multi-value inputs
Roadmap & kanban
Form inputs & controls
Progress, status & badges
Scrolling & feeds
Profile, avatars & identity
Social proof & logo clouds
Masonry & media grids
Table pagination, search & bulk selection
Banners & announcements
Footer layouts
Onboarding & first run
Waitlist & coming soon
Design Tips
Color & surfaces
Harness overview
Row, Column & Grid
Spacing & rhythm
Icons & buttons
Reveal & motion
Theme tokens, FOUC-free init, and runtime style controls
Tooltips and hover cards
Block updates
Block updates changelog
Agent Resources
Column, not Flex
Semantics over CSS
Typography scale
Common gotchas
Block anchors
Validate generated code
Pro block registry
Match task bundles
TrademarkTrademark
Ctrl k
Search...
Sign up
Once UI Handbook
Beginner Guides
What is Once UI?
Install & config
Page skeleton
Your first page
Build And Launch
How to launch a portfolio site that actually gets you hired
How to build a documentation site with MDX and Next.js
How to ship a landing page and dashboard with authentication in Next.js
How to launch a social app with Next.js and Supabase
Vibe Coding
Introduction to vibe coding
Set up your local dev environment
Essential tools for vibe coding
Build your first Once UI app
Common Patterns
Hero section
Static panel
Form layout
Highlighted card
Responsive stacking
Decoration layers
Dialog & modal
Toast & feedback
Tables & lists
Loading states
App shell navigation
Dashboard & charts
Chat & messaging
Auth & verification
Settings & split panels
Data filters & toolbar
Command palette
Pricing & plans
Accordion & FAQ
Media & uploads
Empty & error states
SEO, Open Graph, and structured data
Documentation code blocks with live preview
Carousels, galleries, and before/after comparisons
Date pickers and scheduling
Context menus and dropdown actions
Tags, chips, and multi-value inputs
Roadmap & kanban
Form inputs & controls
Progress, status & badges
Scrolling & feeds
Profile, avatars & identity
Social proof & logo clouds
Masonry & media grids
Table pagination, search & bulk selection
Banners & announcements
Footer layouts
Onboarding & first run
Waitlist & coming soon
Design Tips
Color & surfaces
Harness overview
Row, Column & Grid
Spacing & rhythm
Icons & buttons
Reveal & motion
Theme tokens, FOUC-free init, and runtime style controls
Tooltips and hover cards
Block updates
Block updates changelog
Agent Resources
Column, not Flex
Semantics over CSS
Typography scale
Common gotchas
Block anchors
Validate generated code
Pro block registry
Match task bundles
TrademarkTrademark
Once UIDocumentationBlog
© Once UI. All rights reserved.
Built with Aveiro
Common patterns

Tags, chips, and multi-value inputs

TagInput, Chip, Tag, and Checkbox patterns for filters, labels, and multi-select form fields.
Updated 19d ago
Context menus and dropdown actions
Roadmap & kanban
5 min · Pattern
The tag input collects multiple strings as removable chips. Tag displays read-only labels. Checkbox handles boolean consent and multi-select lists. Compose them in filter bars and settings forms.

Component roles

Component
Mode
Typical use
Tag inputEditable multi-valueEmail recipients, skill tags, filter tokens
ChipRemovable pill inside tag inputVisual token with X button
TagRead-only labelCategories, status labels, skill badges
CheckboxBoolean or list selectionTerms acceptance, bulk row select
All extend Core layout primitives — use Column/Row gaps consistently with other form controls.

Tag input for multi-value fields

The tag input wraps Input and manages a string array value. Users type a token and press Enter or comma to commit; Backspace on empty input removes the last chip. Keep tags in parent state as a string array. Wire id, label, placeholder, value, and onChange to the tag input field. Use an actionable placeholder like "Add a skill and press Enter". Each committed string renders as a removable chip. Keep placeholders actionable so the interaction is discoverable.

Validation

Validate on submit, not on every keystroke. Reject duplicates in your onChange handler before updating state. Cap count server-side too — the tag input does not enforce max length by itself.

Read-only Tag rows

Use Tag when values are informational, not editable. Stack tags in a Row with gap 8 and wrap enabled.
Row gap="8" wrap
  Tag → Design system
  Tag → Documentation
  Tag → Open source
Tags inherit typography tokens — do not override with custom font sizes. For interactive filters, pair Tag with Button semantics or use toggle buttons instead.

Checkbox patterns

Single consent

Wire id, label, checked, and onChange to the checkbox. Place consent checkboxes directly above the submit Button. Disable submit until checked is true.

Select-all in tables

Use a header checkbox to toggle all visible rows. Keep indeterminate state in parent logic when some rows are selected. Pair with the tables guide for row selection layout.

Filter bar composition

A typical filter toolbar stacks:
  • Row with gap 12 and wrap
  • Tag input for free-text tokens (search facets)
  • SegmentedControl or dropdown for enumerated filters
  • Button variant ghost to clear all
Row gap="12" wrap vertical="center"
  Input or tag input → keywords
  Button variant="ghost" → Clear
Align label sizes with other inputs in the bar (size m default).

Write this / not this

✅ Once UI way
❌ Common mistake
string array state for tag inputComma-separated string in one Input
Chip remove via onChangeManually rendering unstyled spans
Tag for display-only labelsEditable contenteditable divs
Checkbox with linked id + labelClickable div with no input semantics

Check yourself

  • Tag input value is a string array, not a delimited string
  • Duplicate tags rejected before state update
  • Read-only labels use Tag, not chip
  • Consent checkboxes gate the submit action
  • Filter bar inputs share the same size token

Related

→ Data filters toolbar → Form layout → Full reference: docs.once-ui.com — Input