Meter

PreviousNext

A minimal meter component using Base UI Meter with Material UI styling

Docs
mui-treasuryitem

Preview

Loading preview…
components/meter-01/meter-01.tsx
"use client";

import * as React from "react";
import { Meter } from "@base-ui-components/react/meter";
import Box from "@mui/material/Box";
import Stack from "@mui/material/Stack";
import Typography from "@mui/material/Typography";

export interface Meter01Props {
  label: string;
  value: number;
  min?: number;
  max?: number;
  showValue?: boolean;
}

export function Meter01({
  label,
  value,
  min = 0,
  max = 100,
  showValue = true,
}: Meter01Props) {
  return (
    <Meter.Root value={value} min={min} max={max}>
      <Stack
        direction="row"
        sx={{
          justifyContent: "space-between",
          alignItems: "baseline",
          mb: 1,
        }}
      >
        <Meter.Label>
          <Typography
            variant="body1"
            component="span"
            sx={{
              textTransform: "uppercase",
              fontWeight: 500,
              fontSize: "0.75rem",
              letterSpacing: "0.1em",
            }}
          >
            {label}
          </Typography>
        </Meter.Label>
        {showValue && (
          <Meter.Value>
            {(formattedValue, numValue) => (
              <Typography
                variant="h4"
                component="span"
                sx={{ fontSize: "0.875rem" }}
              >
                {numValue}%
              </Typography>
            )}
          </Meter.Value>
        )}
      </Stack>
      <Meter.Track
        render={
          <Box
            sx={(theme) => ({
              height: 6,
              width: "100%",
              bgcolor: (theme.vars || theme).palette.action.disabledBackground,
              borderRadius: 1,
              overflow: "hidden",
              position: "relative",
            })}
          />
        }
      >
        <Meter.Indicator
          render={
            <Box
              sx={(theme) => ({
                height: "100%",
                bgcolor: (theme.vars || theme).palette.text.primary,
                transition: "width 0.3s ease",
              })}
            />
          }
        />
      </Meter.Track>
    </Meter.Root>
  );
}

Installation

npx shadcn@latest add @mui-treasury/meter-01

Usage

import { Meter01 } from "@/components/meter-01"
<Meter01 />