Skip to content

Progress

Clamped determinate progress bar with native progressbar semantics.

  • Category: Overlays & feedback
  • Status: stable public Registry/export-map component family
  • Targets: iOS · Android · Web, subject to the compatibility contract
  • Prerequisites: @beemvp/beeui-ui installed (or this component’s source copied via the Registry CLI below) and, on Web, the BeeUI Tailwind/Uniwind theme CSS loaded — see Start for full platform setup.
  • Source: packages/ui/src/components/progress.tsx
import { Progress, progressVariants } from '@beemvp/beeui-ui';

There is no documented deep/private source import. For source ownership from a BeeUI checkout:

Terminal window
pnpm beeui add progress

Registry (used throughout this page) is BeeUI’s source-ownership manifest — registry/registry.json — that the pnpm beeui/@beemvp/beeui-cli CLI reads to copy a component’s real source into your app and rewrite its internal imports; it is not an npm package index. This component’s own Registry entry: registry/registry.json.

  • Family exports: Progress progressVariants
    • Also routed here, outside the Registry family:
      • progress
    • Package export subpath: @beemvp/beeui-ui/progress

Exported types: ProgressProps

The generated API inventory is mechanically joined to packages/ui/src/index.ts, Registry metadata, and the component reference contract. Each type’s field table below is parsed directly from that source, not a second hand-maintained copy; for the fuller behavior narrative see the canonical component behavior catalog.

Stateless clamped determinate progress bar; there is no lower-bound prop — value is clamped between 0 and max, and max itself falls back to 100 when non-finite or <= 0 — and it exposes native progressbar semantics with no indeterminate mode.

Prop Type Default Description
className string — Extra utility classes, merged after the component’s own via cn(...), so they win on conflict. An escape hatch for source-owned and application work, not a cross-engine portability guarantee.
indicatorClassName string — Applied to the filled indicator bar, not the track.
indicatorStyle StyleProp<ViewStyle> — Applied to the filled indicator bar, alongside the computed width style; not the track.
max number 100 Upper bound value is measured against to compute the filled percentage. Non-finite or non-positive values fall back to 100. The accessible minimum is always 0 — there is no min prop. Defaults to 100.
size 'sm' | 'md' | 'lg' 'md' Chooses this element’s size from progressVariants’s presets, declared in packages/ui/src/components/progress.tsx — the classes each value applies are there.
value (required) number — Current progress, clamped to [0, max]; a non-finite value is treated as 0.

Also carries every prop of Omit<ViewProps, 'accessibilityRole' | 'role' | 'children'> — that upstream contract is not reproduced here.

The executable fixtures below are the source-grounded usage examples; consumers should not infer state ownership from DOM structure or another UI library.

  • No additional provider is required by this family. BeeUIProvider remains the recommended application root.
  • Peer/native dependencies visible to this Registry item: react, react-native
  • Registry dependency closure: core-cn, theme
  • Safe-area ownership remains explicit: shell surfaces touching system edges opt into SafeArea; components do not silently invent app-shell insets.
  • Web consumers load the BeeUI semantic theme CSS as documented in Web onboarding.

This family ships no platform-specific file, and its own source takes no Platform branch.

The same public family is exposed across the supported target matrix; meaningful platform differences remain governed by the compatibility contract.

Evidence classes are not equal and this page does not blur them: Web behavior is exercised in a real browser, while iOS and Android carry package/export and native-compile evidence, which is not device-runtime proof. The compatibility contract records which class each claim rests on.

  • Roles this family assigns: progressbar — set in progress.tsx by the components themselves, not by the caller.
  • Accessibility states and properties it sets: accessibilityLabel, accessibilityLabelledBy, max, min, now, valuemax, valuemin, valuenow — read from progress.tsx.

Keyboard/focus behavior, announcements, Dynamic Type/Web zoom, RTL and reduced-motion expectations are not derived here — see Accessibility overview, Keyboard & focus, RTL/localization and Large text & zoom. BeeUI does not claim universal accessibility certification from automated tests.

  • Style axes: size (3 values) — the values are in the props tables above.
  • Class-name surfaces: className, indicatorClassName.

Colors, spacing and typography come from semantic tokens rather than from values written here — see Theming and Density. A className is an escape hatch for source-owned and application work, not a cross-engine portability guarantee.

Each link below opens the Showcase at that exact example, not at the top of the gallery:

  • basic — smallest meaningful complete usage

The Showcase links demonstrate Web behavior; use the native-preview guide for real simulator/emulator/device paths.

This frame loads the real BeeUI Web Showcase on demand; it is not a second docs-only implementation. It proves browser behavior only. Use native preview for iOS/Android simulator, emulator or device paths.

  • Family root / primary export: Progress
    • Public composition parts / helpers:
      • progressVariants
    • Exported type surface:
      • ProgressProps

The tree above is ordinary document structure so it remains readable with keyboard and assistive technology; it is derived from the real public export family rather than a canvas-only diagram.

These are the parts of the typechecked runtime Showcase fixture behind this live preview — apps/showcase/component-gallery/component-gallery.tsx, 1103 lines — where Progress is actually used: 19 lines in 1 place. Each block is copied verbatim from the line range named above it, so it is the same executable source, not a retelling of it. The rest of that file exercises other families and is not reproduced here.

Imports the examples below need (a filtered subset of the fixture’s own top-level imports):

import { Badge, Box, Card, Progress, Separator, Spinner, Text } from '@beemvp/beeui-ui';

lines 547–565:

<Card className="gap-4" variant="muted">
<Text variant="heading">Status and feedback</Text>
<Box className="flex-row flex-wrap gap-2">
<Badge>Primary</Badge>
<Badge variant="secondary">Secondary</Badge>
<Badge variant="success">Success</Badge>
<Badge variant="warning">Warning</Badge>
<Badge variant="destructive">Error</Badge>
<Badge variant="info">Info</Badge>
</Box>
<Separator />
<Box className="flex-row items-center gap-5">
<Spinner testID="spinner-default" />
<Spinner tone="success" />
<Spinner tone="warning" />
<Spinner testID="spinner-destructive" tone="destructive" />
</Box>
<Progress accessibilityLabel="Profile completion" value={72} />
</Card>

Open the fixture itself for the full surrounding component. For a smaller app-specific example, start from the imports and fixture-state blocks above and keep only the state your screen owns.

With neither accessibilityLabel nor a labelled-by relationship, the bar falls back to the English literal Progress as its accessible name, so a localized app must supply one. The track has three fixed heights and no buffered or segmented rendering.