Origin is out. See it
HomeBlocksGoal progress
Free · MITMetricsmetricsprogressgoals

Goal progress

Quarter goals with linear progress bars that fill in sequence, milestone ticks, and a count-up percentage. A goal hitting 100% earns a quiet check mark and a soft ring pulse.

Full preview

Preview

Resize it, switch the theme, replay the entrance — or read the source.

Quarter goals

Q4 · progress against targets

1 of 4 complete
  • Recurring revenue
    84%

    $84.3k of $100k MRR

  • New signups
    64%

    1,024 of 1,600 accounts

  • Activation rate
    48%

    48% of new signups activated

  • Expansion revenue
    100%

    $40k of $40k added

Installation

Add the block to a project that already uses shadcn/ui.

bash
npx shadcn@latest add https://prequelui.terravidhal.me/r/goal-progress.json

Requires a project that already uses shadcn/ui on React and Tailwind CSS v4. The block is copied into your project as a single file you own and can edit.

Usage

Import the named export and render it with your own data.

Every prop is optional and ships with deterministic demo data, so a bare render shows the block at its default. Pass props to plug in your own data and formatters.

import { GoalProgress } from "@/components/prequel/goal-progress/goal-progress";

export default function DashboardPage() {
  return <GoalProgress />;
}

Props

Every prop is optional and ships with demo-data defaults.

PropTypeDescription
classNamestringExtra classes merged onto the root element.
titlestring—
descriptionstring—
goalsGoalProgressGoal[]—
formatProgress(progress: number) => string—

Accessibility

The rules every PrequelUI block follows, verified against this block's source.

Charts and graphics expose a text summary via role="img" and an aria-label describing the data.

Interactive charts respond to arrow keys, Home and End, and show tooltips on keyboard focus.

Every button carries a visible focus ring so keyboard users can always see where they are.

The block honours prefers-reduced-motion: animations are skipped and content is fully visible.

Live updates run on timers inside effects and pause when the block is off-screen or hovered.

More blocks