Skip to components
Onflow Labs isotype

Light-only brand Style

Onflow components

This is the full catalog of 24 components: Button, Card, Badge, Input, Textarea, Checkbox, Switch, Radio Group, Tabs, Accordion, Input Group, Popover, Tooltip, Sonner, Select, Dialog, Dropdown Menu, Sheet, Drawer, Command, Back to top, Floating actions, Navbar, and Navigation dock. Native installs were checked in three representative consumers (see the install guide). Onflow is always light, even under a dark ancestor, and uses Satoshi.

Brand intro lab

Button

Seven variants including the brand Flow Blue Button, five text sizes, icon sizes, disabled and link composition. Primary and brand actions use the pill call-to-action radius; icon Buttons are circular. Effect current, the default, sends one light across on hover or keyboard focus, floats the Button 2px, advances a marked arrow and sinks to 0.97 on press. Effect fill floods default and brand CTAs with water; with progress the water level shows a submission in flight. Effect wave continuously moves the whole contour, multicolour water and foam, with pause and reduced-motion support; highlight sends one light around the edge of current and fill Buttons.

Variants

Sizes

Icon and states

Install guide

Effect: current

Hover, focus with the keyboard or press: one light crosses left to right, the Button floats 2px, a marked arrow advances 4px and the press sinks to 0.97. data-interaction="none" opts out.

Effect: current on every variant

Effect: fill

Default and brand CTAs only. Hover, focus with the keyboard or press (touch included): water enters from the left and rises over the label, ripples and settles, then drains left. Wrap the text in ButtonLabel when the CTA has an icon.

An outline Button is not a CTA, so fill falls back to current.

Effect: wave

The contour and multicolour water flow continuously, without hover. Text, focus and hit area stay still. Pause below to compare; reduced motion keeps the waves static.

Highlight

Mark the one action that matters with highlight: hover or focus with the keyboard sends one light around its edge, which fades as the lap closes. It works with current and fill; it is omitted on wave, which has its own foam rim and motion. Reduced motion shows a still highlight ring.

Effect: fill with progress

Send the form: while progress is set the Button is busy, stays focusable and cannot be pressed again, and the water rises step by step to the value before it drains. The page owns the status message. The second form opts out with data-interaction="none".

Local Shape


Card

A native compound surface in default, brand and brand-with-current-background forms, plus the compact size. The surface radius follows the Onflow Shape. On hover or keyboard focus of a child action a Card lifts 2px and sends one reflection across; data-interaction="none" keeps it still. A media frame zooms its image inside the clipped frame. Selected Cards fill with pale water and drain when deselected: try the checkbox Cards here, or the plans in Radio Group.

Default
Digital solutions that keep work flowing.
Cards keep text and actions inside the surface, with focus rings left unclipped.
Brand
Digital solutions that keep work flowing.
Cards keep text and actions inside the surface, with focus rings left unclipped.
Brand and current
Digital solutions that keep work flowing.
Cards keep text and actions inside the surface, with focus rings left unclipped.
Small
Digital solutions that keep work flowing.
Cards keep text and actions inside the surface, with focus rings left unclipped.

Select and deselect

Click a Card to select it, click again to deselect. 1 selected.
Answers on WhatsApp and the web, hands over to a person.
Online slots, deposits and reminders.
Catalogue, local payments and order tracking.

Reflection, lift and media

Hover a Card or Tab to its Button: the Card lifts 2px and one 1200 ms light crosses it, once per entry. The media frame zooms its image to 1.06 and lifts 4px with a deeper shadow while the caption follows. The last Card opts out.

Rainforest canopy in soft light
Case studyMedia frame
Reflection sweep
One diagonal light crosses the glass left to right, then fades.
Lift: 2px.
Opted out
The shared data-interaction="none" opt-out: no lift and no sweep.

Badge

Compact labels in Default's six variants, as plain text, with an icon and as a real link. Every variant pairs text and fill on neutral paint, and status always names its state.

On neutral

Static water & glass · informational labels and a real link

OnflowIn progressDesign partner
PublishedOverdueDraft
Ready for your next chapterExplore OnflowSquare

On atmosphere

Static water & glass · informational labels and a real link

OnflowIn progressDesign partner
PublishedOverdueDraft
Ready for your next chapterExplore OnflowSquare

Input

A native text and file field with a visible boundary border. Focus is a Deep Flow outline, invalid is danger with a message, and disabled and read-only keep a recognizable field.

Required. Enter at least three characters.


Textarea

A native multiline field with the same boundary, focus and invalid treatment as Input, plus disabled and read-only states.

Required. Enter at least three characters.


Checkbox

A boundary-bordered box that fills Deep Flow with a Mist mark when checked or indeterminate. Invalid turns danger, disabled dims to half, and every control has a visible label.


Switch

A glass pill, 40×24 or 32×18 small, with a white thumb ringed in Deep Flow. Checking sends Flow Blue water across the track and the Flow Blue track with its Deep Flow border arrives once it has crossed; unchecking drains it. Only the thumb moves; disabled and invalid Switches never fill, and data-interaction="none" skips the water.


Radio Group

Circular radios with a boundary border that fill Deep Flow with a Mist dot when selected, plus a disabled item and an invalid group. As cards, each plan is a selected-styled Card whose label covers it: the selected plan fills with pale water and takes a Deep Flow border, the arrow keys move the selection and the Card shows the focus.

Cards

One site, the core components and email support.
$12 / month
Five sites, every block and motion primitive, priority support.
$29 / month
Unlimited sites, client handoff and a shared design review.
$79 / month
Five sites, every block and motion primitive, priority support.
$29 / month
Five sites, every block and motion primitive, priority support.
$29 / month

A disabled option never fills. With data-interaction="none" the border and the radio still mark the selection.


Tabs

Default and line lists in horizontal and vertical orientation. The selected tab carries a static Deep Flow bar and Deep Flow text, never Flow Blue alone; disabled tabs are skipped by the arrow keys.

The default list with Overview selected.
The line list with Overview selected.
Vertical default list: CRM.
Vertical line list: CRM.

Accordion

Single and multiple disclosure with a Deep Flow label, a chevron pair and a disabled item. Panels show and hide without a height animation, so focus rings stay whole.

CRM, scheduling, chatbots and e-commerce, installed natively.

Several items can be open together.

Opening one does not close the other.


Input Group

One bordered field that owns the boundary, the Deep Flow focus and the danger state while its Input, Textarea, text and Button parts stay borderless. Addons sit inline or on a block edge, and inner Buttons use a smaller radius than the group so there is no pill seam.

https://
USD
Message
0 / 280
@

Required. Enter a valid address.


Popover

An opaque white surface with a heading, description, a labelled field and a close action, with the overlay radius and one restrained shadow. It renders into a stable host inside the Onflow scope or into body with an explicit scope, and stays light under a dark ancestor.

Safe host and body portal

Under a dark ancestor (body portal)


Tooltip

A Deep Flow label with Mist text and a matching arrow, readable at 15.53:1, on all four sides, on an icon Button and under a dark ancestor. It describes its trigger while open and only fades.

Sides and icon Button

Under a dark ancestor (body portal)


Sonner

Toasts on the white overlay surface with Deep Flow text, a subtle ring, the overlay radius and one restrained shadow, in default, success, info, warning, error, action and promise forms. Status icons carry their own colour, the action button keeps a solid Deep Flow focus outline, and the toaster stays light even under a dark ancestor or a dark html class because it never follows next-themes.

Toasts from the Onflow scope (bottom right)

Under a dark ancestor (top right, stays light)


Select

A field-like trigger with a boundary border, Deep Flow focus and danger when invalid, opening an opaque overlay list with groups, labels, a separator and disabled items. The selected item carries a Deep Flow check, and the popup stays light in a host, in body with an explicit scope and under a dark ancestor.

Default, placeholder and states

Required. Choose a fruit.

Groups, labels, separator and a disabled item

Body portal with an explicit scope, and under a dark ancestor


Dialog

A white modal surface with Deep Flow text, a subtle ring, the overlay radius and one restrained shadow over a low-alpha Deep Flow backdrop. It traps focus, locks page scroll, returns focus on Escape, and renders into a stable host or into body with an explicit scope, light even under a dark ancestor. An initially open dialog waits for its host instead of flashing into body.

Form, no close button and long content

Body portal with an explicit scope, and an initially open dialog

Under a dark ancestor (body portal)


Sheet

An edge-attached modal panel on the top, right, bottom or left, with the dialog backdrop, surface, ring and shadow. Only the free-edge corners use the overlay radius; the corners on the viewport edge stay square, including under the square Shape. It fades in without sliding, traps focus, locks page scroll, and renders into a stable host or into body with an explicit scope, light even under a dark ancestor.

Four sides, safe host

Form with footer, no close button and square Shape

Body portal with an explicit scope, and under a dark ancestor


Drawer

A modal panel that slides in from the bottom by default, or from the top, left or right, with the dialog backdrop, surface, ring and shadow. Base UI keeps the swipe-to-dismiss and snap-point behavior; only the free-edge corners use the overlay radius and the viewport edge stays square, including under the square Shape. The handle uses the boundary colour, and the drawer renders into a stable host or into body with an explicit scope, light even under a dark ancestor.

Bottom by default, and the other directions, in a safe host

Form with footer, snap points and square Shape

Body portal with an explicit scope, and under a dark ancestor


Command

A searchable command list on the overlay surface, inline or inside a dialog. The search field is an input group that owns one border and the Deep Flow focus ring, typing filters the items, the arrow keys move a subtle accent highlight with Deep Flow text, and Enter selects. It has groups, shortcuts, a separator, a checked item, a disabled item and an empty state, and the dialog renders into a stable host or into body with an explicit scope, light even under a dark ancestor.

Inline command with groups, shortcuts, a separator, a checked and a disabled item

Selected: none

Command dialog in a safe host, and with the square Shape

Selected: noneSelected: none

Body portal with an explicit scope, and under a dark ancestor

Selected: none
Selected: none

Back to top

A fixed circular Onflow Button that fades in after scrolling past a threshold and returns to the top, moving focus to the top target. Hidden, it is inert, unfocusable and click-through. Scroll inside the frame: the button fills with water to the scroll progress, a hover sends one ripple, and the ring of water on its rim turns while you scroll or hover, then calms to rest. The page keeps its own scroll; under reduced motion the jump is instant, the water moves in quarter steps and the ring stays still.

Open direct view

Floating actions

A corner-fixed Onflow Button, or an expandable disclosure of actions that opens toward the page interior. Escape, an outside press or an action closes it and returns focus to the trigger; collapsed actions are inert and hidden from assistive technology. Scroll and interact inside the frame; it fades without moving, and under reduced motion without fading.

Open direct view

Current background

One macro surface specimen: the static `.mui-onflow-macro` radius with the current recipe painted as layered gradients. Content stays Deep Flow throughout.

Work that keeps flowing

A macro surface with the current background: Mist washes in from the top corners over Flow Blue, and the text stays Deep Flow.


Glass

The three glass tiers on the atmosphere, the same tiers under the `data-onflow-glass="reduce"` opt-out, and the corner notch utility. Glass is on by default and falls back to opaque fills without backdrop-filter support.

Default

Glass

.mui-onflow-glass

Translucent fill, blur, white edge and cool shadow: Navbar, Dock, Card.

Overlay

.mui-onflow-glass-overlay

Same blur, higher opacity: Popover, Menu, Select, Command, Sonner.

Dense

.mui-onflow-glass-dense

Nearly opaque, no blur: fields, Dialog, Sheet, Drawer.

Opted out with data-onflow-glass="reduce": opaque Mist-tinted fills, no blur

Glass

.mui-onflow-glass

Translucent fill, blur, white edge and cool shadow: Navbar, Dock, Card.

Overlay

.mui-onflow-glass-overlay

Same blur, higher opacity: Popover, Menu, Select, Command, Sonner.

Dense

.mui-onflow-glass-dense

Nearly opaque, no blur: fields, Dialog, Sheet, Drawer.

Logo slot

Notch

.mui-onflow-notch cuts a corner for a logo, sized by --mui-onflow-notch-w and -h. The logo is a sibling placed in the cut-out.


Droplet cursor

The opt-in droplet cursor, mounted once for this page with an on/off switch. A glass drop follows the pointer with spring inertia, becomes a lens around buttons, links and data-cursor="lens" elements, ripples on click and fades over text fields. data-cursor="default" keeps the drop without lenses, data-cursor="none" hides it, disabled controls never lens, and a data-onflow-glass="reduce" scope makes it opaque. It stays on inside the Dialog and Drawer specimens and is off for touch and reduced motion.

Inline text link, a data-cursor="lens" chip, a data-cursor="default" link and a data-cursor="none" zone.

Scope with data-onflow-glass="reduce": the drop and lens turn opaque, without blur.

Move fast across the empty glass to see the stretch, then click anywhere for a ripple. Open a Dialog or Drawer specimen: the drop keeps working inside the modal.