Stable in React
Progress
Displays the status of a task that takes a long time, such as an upload or an export.
Install#
One package per framework. Progress's parts come from it; the anatomy tab at the top shows how they nest.
bun add @▢▢▢▢/reactFive parts. The example uses five of them; the data does not say which are required.
Progress.RootGroups all parts of the progress bar and provides the task completion status to screen readers.Progress.LabelAn accessible label for the progress bar.Progress.ValueA text element displaying the current value.Progress.TrackContains the progress bar indicator.Progress.IndicatorVisualizes the completion status of the task.
Examples#
The demo at the top is the one example this component has so far.
Styling and accessibility#
The parts ship no styles. Style their states with these attributes; the CSS tab at the top has a sheet. The same CSS works in all five frameworks.
[data-complete]Present when the progress has completed. On Root, Label, Value, Track, Indicator.[data-indeterminate]Present when the progress is in indeterminate state. On Root, Label, Value, Track, Indicator.[data-progressing]Present while the progress is progressing. On Root, Label, Value, Track, Indicator.
Keyboard
Progress takes no focus and has no keys of its own.
Set for you
a screen reader reads how far the task is, or that it is in progressRootrole="progressbar",aria-valuemin,aria-valuemax,aria-valuenow(left out while the value is unknown)the value is read as written, such as "40%"Rootaria-valuetextfromformat,getAriaValueTextoraria-valuetextthe bar is read with its nameRootaria-labelledbyto Labelthe visible number is not read twiceValuearia-hidden="true"
API reference#
8 props across 5 parts, in React syntax, and className, style, render once for every part. Open a row to try it.
Progress · all partsclassNameCSS class applied to the element, or a function that
returns a class based on the component's state.string | ((state: State) => string | undefined)styleStyle applied to the element, or a function that
returns a style object based on the component's state.React.CSSProperties | ((state: State) => React.CSSProperties | undefined)renderAllows you to replace the component's HTML element
with a different tag, or compose it with another component.React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, State>Use it in React#
What differs from the React API. Switch the framework at the top of the page.
@▢▢▢▢/react is the React 19 package. Its parts, props, data attributes and error messages are upstream Base UI's, and upstream's own tests run against it.
- Parts
Each component is its own entry point and exports one namespace named after it.
import { Switch } from '@base-ui-next/react/switch' export function Example() { return ( <Switch.Root> <Switch.Thumb /> </Switch.Root> ) }A part renders the element its API reference names, such as a
<span>forSwitch.Root. - Props and events
Props and callbacks have upstream's names and signatures:
onCheckedChange(checked, details),onOpenChange(open, details),onValueChange(value, details).detailscarriesreason,event,cancel()andallowPropagation(). Native handlers are React's (onClick,onKeyDown), andevent.preventBaseUIHandler()stops a part's own handler. - Styling
classNametakes a string or a function(state) => string;styletakes an object or a function(state) => object. The state'sdata-*attributes are on the element for CSS. renderrendertakes an element (render={<a href="/docs" />}) or a function(props, state) => elementthat spreadspropson what it returns.- Refs
refreaches the part's element. Imperative handles are ref props, as upstream:inputRef, andactionsRef({ validate }on Field and Form,{ unmount, close }on Dialog). - Binding
A part is controlled when its value prop (
checked,open,value) is set, and uncontrolled with thedefaultform (defaultChecked,defaultOpen,defaultValue). React has no two-way binding: pair the value with its change callback. - From @base-ui/reactChange the import from
@base-ui/react/<component>to@▢▢▢▢/react/<component>. - From @base-ui/reactNothing else changes: props, parts, data attributes and errors are the same.