Components
Component
productdevbook/ui

Stable in React

Meter

A graphical display of a numeric value within a known range, such as disk usage or a password's strength.

Loading React 19.3.1…
Hover a part or use it. The code follows. · Loading React…
186Tests passing in React · 0 failing
3.8 KiBSize
Not measured yetMemory
Not measured yetSpeed
productdevbook and 10 upstream authors8 commits · last

Install#

One package per framework. Meter's parts come from it; the anatomy tab at the top shows how they nest.

bun add @▢▢▢▢/react

Five parts. The example uses five of them; the data does not say which are required.

  • Meter.RootGroups all parts of the meter and provides the value for screen readers.
  • Meter.LabelAn accessible label for the meter.
  • Meter.ValueA text element displaying the current value.
  • Meter.TrackContains the meter indicator and represents the entire range of the meter.
  • Meter.IndicatorVisualizes the position of the value along the range.

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.

Meter has no data attributes or CSS variables.

Keyboard

Meter takes no focus and has no keys of its own.

Set for you

  • role="meter", aria-valuenow, aria-valuemin, aria-valuemaxa screen reader reads the value within its rangeRoot
  • aria-valuetext from format, getAriaValueText or aria-valuetextthe value is read as written, such as "75%"Root
  • aria-labelledby to Labelthe meter is read with its nameRoot
  • aria-hidden="true"the visible number is not read twiceValue

API reference#

8 props across 5 parts, in React syntax, and className, style, render once for every part. Open a row to try it.

Meter · all parts
Shared propsEvery part that renders an element takes these.
classNameCSS 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> for Switch.Root.

  • Props and events

    Props and callbacks have upstream's names and signatures: onCheckedChange(checked, details), onOpenChange(open, details), onValueChange(value, details). details carries reason, event, cancel() and allowPropagation(). Native handlers are React's (onClick, onKeyDown), and event.preventBaseUIHandler() stops a part's own handler.

  • Styling

    className takes a string or a function (state) => string; style takes an object or a function (state) => object. The state's data-* attributes are on the element for CSS.

  • render

    render takes an element (render={<a href="/docs" />}) or a function (props, state) => element that spreads props on what it returns.

  • Refs

    ref reaches the part's element. Imperative handles are ref props, as upstream: inputRef, and actionsRef ({ 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 the default form (defaultChecked, defaultOpen, defaultValue). React has no two-way binding: pair the value with its change callback.

  • From @base-ui/react
    Change the import from @base-ui/react/<component> to @▢▢▢▢/react/<component>.
  • From @base-ui/react
    Nothing else changes: props, parts, data attributes and errors are the same.