Progress

Headless progress and spinner primitives for Roblox UI.

Stable direction
@lattice-ui/progress

Part of the stable direction toward v1.0.

What It Is For

Use Progress and Spinner for task feedback when the app should communicate either measurable completion or ongoing work.

The package gives you normalized progress state and timing hooks while leaving the visuals completely up to you.

Preview size

Live demo is experimental and may contain bugs.

Install

Global CLI command: lattice add progress

Monorepo local script

Use your package manager wrapper when running the local lattice command.

pnpm lattice add progress

npm package: @lattice-ui/progress

Peer dependencies

  • @rbxts/react
  • @rbxts/react-roblox

Public Exports

  • Progress
  • Progress.Root
  • Progress.Indicator
  • Progress.Spinner
  • clampProgressValue
  • resolveProgressRatio

State Model

  • Progress.Root tracks value, max, a normalized ratio, and indeterminate state.
  • The component supports controlled and uncontrolled numeric progress values.
  • Spinner is a separate primitive that owns only whether it is spinning and how fast it rotates.

Key API

Progress.Root

Use value, defaultValue, onValueChange, max, and indeterminate to define the semantic progress state.

Progress.Indicator

Render your own bar or fill element and read the shared ratio through the compound component wiring.

Progress.Spinner

Use spinning and speedDegPerSecond when you need an activity indicator rather than a measurable progress bar.

Composition Patterns

Linear task feedback

Use Progress.Root plus Progress.Indicator for uploads, saves, and loading bars that should reflect a bounded numeric state.

Compact pending indicators

Use Spinner for asynchronous work that has no trustworthy completion percentage.

Cautions / Limits

  • indeterminate mode is a semantic state, not a built-in animation style; you still own the visuals.
  • Out-of-range values are normalized by the package, so do not depend on raw overflow behavior in your UI.