Meter

Meters are visual representations of a quantity or an achievement. Their progress is determined by user actions, rather than system actions.

installyarn add @adobe/react-spectrum
added3.0.0
usageimport {Meter} from '@adobe/react-spectrum'

Example#


<Meter label="Storage space" value={35} />
<Meter label="Storage space" value={35} />
<Meter
  label="Storage space"
  value={35}
/>

Value#


Meters are controlled with the value prop. By default, the value prop represents the current percentage of progress, as the minimum and maximum values default to 0 and 100, respectively.

<Meter
  label="Storage space"
  value={25} />
<Meter
  label="Storage space"
  value={25} />
<Meter
  label="Storage space"
  value={25} />

Alternatively, a different scale can be used by setting the minValue and maxValue props.

<Meter
  label="Widgets Used"
  minValue={50}
  maxValue={150}
  value={100} />
<Meter
  label="Widgets Used"
  minValue={50}
  maxValue={150}
  value={100} />
<Meter
  label="Widgets Used"
  minValue={50}
  maxValue={150}
  value={100} />

Values are formatted as a percentage by default, but this can be modified by using the formatOptions prop to specify a different format. formatOptions is compatible with the option parameter of Intl.NumberFormat and is applied based on the current locale.

<Meter
  label="Currency"
  formatOptions={{style: 'currency', currency: 'JPY'}}
  value={60} />
<Meter
  label="Currency"
  formatOptions={{style: 'currency', currency: 'JPY'}}
  value={60} />
<Meter
  label="Currency"
  formatOptions={{
    style: 'currency',
    currency: 'JPY'
  }}
  value={60}
/>

Labeling#


Value labels are shown above the Meter by default, but they can also be moved to the side or hidden as needed. The label text should be in sentence case.

<Flex direction="column" maxWidth="size-3000" gap="size-300">
  <Meter label="Label" value={25} variant="warning" />
  <Meter label="Label" labelPosition="side" value={25} variant="warning" />
  <Meter label="Label" showValueLabel={false} value={25} variant="warning" />
</Flex>
<Flex
  direction="column"
  maxWidth="size-3000"
  gap="size-300"
>
  <Meter label="Label" value={25} variant="warning" />
  <Meter
    label="Label"
    labelPosition="side"
    value={25}
    variant="warning"
  />
  <Meter
    label="Label"
    showValueLabel={false}
    value={25}
    variant="warning"
  />
</Flex>
<Flex
  direction="column"
  maxWidth="size-3000"
  gap="size-300"
>
  <Meter
    label="Label"
    value={25}
    variant="warning"
  />
  <Meter
    label="Label"
    labelPosition="side"
    value={25}
    variant="warning"
  />
  <Meter
    label="Label"
    showValueLabel={false}
    value={25}
    variant="warning"
  />
</Flex>

The value label can be updated via the valueLabel prop in cases where showing a different scale makes sense.

<Meter
  label="Progress"
  marginBottom="size-300"
  value={25}
  valueLabel="1 of 4"
  variant="warning"
/>
<Meter
  label="Progress"
  marginBottom="size-300"
  value={25}
  valueLabel="1 of 4"
  variant="warning"
/>
<Meter
  label="Progress"
  marginBottom="size-300"
  value={25}
  valueLabel="1 of 4"
  variant="warning"
/>

By default, the value label is formatted as a percentage. This can be customized using the following props.

  • showValueLabel: Allows you to display or hide the value label.
  • formatOptions: Allows you to customize the format of the value.
  • valueLabel: Allows you to customize the value label to any string.
<Flex direction="column" maxWidth="size-3000" gap="size-300">
  <Meter
    label="Space used"
    showValueLabel={false}
    value={90}
    variant="critical" />

  <Meter
    label="Space used"
    valueLabel="54 of 60GB"
    value={90} variant="critical" />

  <Meter
    label="Space used"
    formatOptions={{style: 'percent', minimumFractionDigits: 2}}
    value={89.123}
    variant="critical" />
</Flex>
<Flex
  direction="column"
  maxWidth="size-3000"
  gap="size-300"
>
  <Meter
    label="Space used"
    showValueLabel={false}
    value={90}
    variant="critical"
  />
   <Meter
    label="Space used"
    valueLabel="54 of 60GB"
    value={90}
    variant="critical"
  />
   <Meter
    label="Space used"
    formatOptions={{
      style: 'percent',
      minimumFractionDigits: 2
    }}
    value={89.123}
    variant="critical"
  />
</Flex>
<Flex
  direction="column"
  maxWidth="size-3000"
  gap="size-300"
>
  <Meter
    label="Space used"
    showValueLabel={false}
    value={90}
    variant="critical"
  />
   <Meter
    label="Space used"
    valueLabel="54 of 60GB"
    value={90}
    variant="critical"
  />
   <Meter
    label="Space used"
    formatOptions={{
      style: 'percent',
      minimumFractionDigits:
        2
    }}
    value={89.123}
    variant="critical"
  />
</Flex>

Accessibility#

Depending on the visualization being used (i.e. depending on the showValueLabel prop), a label, aria-label, or aria-labelledby prop is required.

Internationalization#

To internationalize a Meter, a localized string should be passed to the label prop, aria-label prop, or value of the associated aria-labelledby element.

For languages that are read right-to-left (e.g. Hebrew and Arabic), the layout of the meter is automatically flipped. In addition, Meter automatically uses the current locale to format the value label.

Props#


NameTypeDefaultDescription
variant'informative' | 'positive' | 'warning' | 'critical''informative'The visual style of the Meter.
size'S' | 'L''L'How thick the bar should be.
labelPositionLabelPosition'top'The label's overall position relative to the element it is labeling.
showValueLabelboolean—Whether the value's label is displayed. True by default if there's a label, false by default if not.
labelReactNode—The content to display as the label.
formatOptionsIntl.NumberFormatOptions{style: 'percent'}The display format of the value label.
valueLabelReactNode—The content to display as the value's label (e.g. 1 of 4).
valuenumber0The current value (controlled).
minValuenumber0The smallest value allowed for the input.
maxValuenumber100The largest value allowed for the input.
Layout
NameTypeDescription
flexResponsive<string | number | boolean>When used in a flex layout, specifies how the element will grow or shrink to fit the space available. See MDN.
flexGrowResponsive<number>When used in a flex layout, specifies how the element will grow to fit the space available. See MDN.
flexShrinkResponsive<number>When used in a flex layout, specifies how the element will shrink to fit the space available. See MDN.
flexBasisResponsive<number | string>When used in a flex layout, specifies the initial main size of the element. See MDN.
alignSelfResponsive<'auto' | 'normal' | 'start' | 'end' | 'center' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'stretch'>Overrides the alignItems property of a flex or grid container. See MDN.
justifySelfResponsive<'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'>Specifies how the element is justified inside a flex or grid container. See MDN.
orderResponsive<number>The layout order for the element within a flex or grid container. See MDN.
gridAreaResponsive<string>When used in a grid layout, specifies the named grid area that the element should be placed in within the grid. See MDN.
gridColumnResponsive<string>When used in a grid layout, specifies the column the element should be placed in within the grid. See MDN.
gridRowResponsive<string>When used in a grid layout, specifies the row the element should be placed in within the grid. See MDN.
gridColumnStartResponsive<string>When used in a grid layout, specifies the starting column to span within the grid. See MDN.
gridColumnEndResponsive<string>When used in a grid layout, specifies the ending column to span within the grid. See MDN.
gridRowStartResponsive<string>When used in a grid layout, specifies the starting row to span within the grid. See MDN.
gridRowEndResponsive<string>When used in a grid layout, specifies the ending row to span within the grid. See MDN.
Spacing
NameTypeDescription
marginResponsive<DimensionValue>The margin for all four sides of the element. See MDN.
marginTopResponsive<DimensionValue>The margin for the top side of the element. See MDN.
marginBottomResponsive<DimensionValue>The margin for the bottom side of the element. See MDN.
marginStartResponsive<DimensionValue>The margin for the logical start side of the element, depending on layout direction. See MDN.
marginEndResponsive<DimensionValue>The margin for the logical end side of an element, depending on layout direction. See MDN.
marginXResponsive<DimensionValue>The margin for both the left and right sides of the element. See MDN.
marginYResponsive<DimensionValue>The margin for both the top and bottom sides of the element. See MDN.
Sizing
NameTypeDescription
widthResponsive<DimensionValue>The width of the element. See MDN.
minWidthResponsive<DimensionValue>The minimum width of the element. See MDN.
maxWidthResponsive<DimensionValue>The maximum width of the element. See MDN.
heightResponsive<DimensionValue>The height of the element. See MDN.
minHeightResponsive<DimensionValue>The minimum height of the element. See MDN.
maxHeightResponsive<DimensionValue>The maximum height of the element. See MDN.
Positioning
NameTypeDescription
positionResponsive<'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'>Specifies how the element is positioned. See MDN.
topResponsive<DimensionValue>The top position for the element. See MDN.
bottomResponsive<DimensionValue>The bottom position for the element. See MDN.
leftResponsive<DimensionValue>The left position for the element. See MDN. Consider using start instead for RTL support.
rightResponsive<DimensionValue>The right position for the element. See MDN. Consider using start instead for RTL support.
startResponsive<DimensionValue>The logical start position for the element, depending on layout direction. See MDN.
endResponsive<DimensionValue>The logical end position for the element, depending on layout direction. See MDN.
zIndexResponsive<number>The stacking order for the element. See MDN.
isHiddenResponsive<boolean>Hides the element.
Accessibility
NameTypeDescription
idstringThe element's unique identifier. See MDN.
aria-labelstringDefines a string value that labels the current element.
aria-labelledbystringIdentifies the element (or elements) that labels the current element.
aria-describedbystringIdentifies the element (or elements) that describes the object.
aria-detailsstringIdentifies the element (or elements) that provide a detailed, extended description for the object.
Advanced
NameTypeDescription
UNSAFE_classNamestringSets the CSS className for the element. Only use as a last resort. Use style props instead.
UNSAFE_styleCSSPropertiesSets inline style for the element. Only use as a last resort. Use style props instead.

Visual options#


Size#

View guidelines

<Flex direction="column" gap="size-300">
  <Meter label="Space used" size="S" value={90} variant="critical" />
  <Meter label="Space used" size="L" value={90} variant="critical" />
</Flex>
<Flex direction="column" gap="size-300">
  <Meter
    label="Space used"
    size="S"
    value={90}
    variant="critical"
  />
  <Meter
    label="Space used"
    size="L"
    value={90}
    variant="critical"
  />
</Flex>
<Flex
  direction="column"
  gap="size-300"
>
  <Meter
    label="Space used"
    size="S"
    value={90}
    variant="critical"
  />
  <Meter
    label="Space used"
    size="L"
    value={90}
    variant="critical"
  />
</Flex>

Variants#

View guidelines

<Flex direction="column" gap="size-300">
  <Meter label="Space used" value={25} variant="informative" />
  <Meter label="Space used" value={25} variant="positive" />
  <Meter label="Space used" value={90} variant="critical" />
  <Meter label="Space used" value={70} variant="warning" />
</Flex>
<Flex direction="column" gap="size-300">
  <Meter
    label="Space used"
    value={25}
    variant="informative"
  />
  <Meter
    label="Space used"
    value={25}
    variant="positive"
  />
  <Meter
    label="Space used"
    value={90}
    variant="critical"
  />
  <Meter
    label="Space used"
    value={70}
    variant="warning"
  />
</Flex>
<Flex
  direction="column"
  gap="size-300"
>
  <Meter
    label="Space used"
    value={25}
    variant="informative"
  />
  <Meter
    label="Space used"
    value={25}
    variant="positive"
  />
  <Meter
    label="Space used"
    value={90}
    variant="critical"
  />
  <Meter
    label="Space used"
    value={70}
    variant="warning"
  />
</Flex>