Arc
ComponentsBlocksDocsPricingTry the demo
Get Pro
Introduction
Installation
Theming
Motion
AI and MCP
Changelog
Metrics dashboardPro
KPI drilldownPro
Metric explorerPro
Revenue explorerPro
MRR waterfallPro
Cohort retentionPro
Usage forecastPro
Journey flowPro
Uptime statusNewPro
Choropleth explorerPro
Connected scatterPro
Horizon chartPro
Account healthNewPro
Market terminalPro
Budget variancePro
Small multiplesPro
Line replayPro
AI chatPro
AI composerPro
AI answerPro
Model pickerPro
Model arenaPro
Prompt studioPro
Document extractionPro
Agent memoryPro
AI side panelPro
Research runPro
AI insight cardNewPro
Catch upNewPro
AI feature launchNewPro
AI search barNewPro
AI setup wizardNewPro
Call insightsNewPro
Lead scoringNewPro
Agent runPro
Agent tasksPro
Agent approvalsPro
Agent routinesPro
Agent orchestratorPro
MCP serversPro
Knowledge basePro
Eval suitePro
Agent builderNewPro
Agent galleryNewPro
SidebarPro4
Page header
Command palette
Notification center
Selection toolbarPro
Empty states
Search resultsPro
Login and sign up5, free and Pro variants
Onboarding illustrationPro
OTP input
Multi-step formPro
Two-factor setupNewPro
Magic linkNewPro
Settings pagePro
Settings commandPro
Security settingsPro
Billing overviewPro
Usage billingPro
Cancel flowPro
Onboarding surveyNewPro
Spend alertNewPro
Team membersPro
Invite peoplePro
Team directoryPro
Roles and permissionsPro
Profile pageNewPro
API keysPro
WebhooksPro
IntegrationsPro
Environment variablesPro
Domain verifyNewPro
Webhook testerNewPro
Plan comparison
Pricing calculatorPro
Usage pricingPro
Cart drawerPro
Checkout summaryPro
Live checkoutPro
Seat managerNewPro
Credit top-upNewPro
Invoice studioPro
Wallet cardPro
Delivery trackerPro
Product listingPro
Product detailPro
Activity feedNewPro
Inbox triagePro
Support conversationPro
Support widgetPro
Help centerPro
Feature votingNewPro
File upload
Media playerPro
Week calendarPro
Availability pickerPro
Project boardPro
Release readinessPro
Kanban boardPro
Smart schedulerNewPro
Task breakdownNewPro
Goal trackerNewPro
Hero section
Hero signupPro
Scroll storyPro
Spotlight gridPro
Feature bentoPro
Comparison table
Logo marquee
Studio perspectivesPro
Stats band
Changelog feed
FAQ section
Contact section
Team showcasePro
Blog grid
Site header
Site footer
CTA section
Newsletter signup
Activity terrainPro
Revenue globePro
Customer galaxyPro
Semantic zoomPro
Layout morphPro
Exploded viewPro
What’s new74 new
BlocksGoal tracker

Goal tracker

Pro

A team goals card where objectives open into key results with owners, confidence and progress bars. A weekly check-in updates a value, confidence and note in place, fills the bar and recalculates the objective, and a quarter selector steps from last quarter's final scores to next quarter's planning.

Live block · sample data

When to use

  • Showing a team's quarterly objectives and key results with owners and confidence.
  • Collecting a lightweight weekly check-in (value, confidence, note) without leaving the page.
  • Comparing the active quarter against last quarter's final scores.

When not to use

  • A single KPI with a trend line; use a metric or stat card.
  • Task or project tracking with assignees and due dates; use a task list or kanban block.
  • Org-wide goal trees with parent and child alignment; this card is one level deep.

Installation

Pro source and install commands unlock with a Pro plan.

Usage

Pass `quarters` (each with id, label, status of active, closed or planning, optional meta and footnote, and objectives with key results). For each key result, set start, target and current in the metric's own units. The card works out progress itself, so a target below the start value (latency, cost) works with no extra setup. Save check-ins in `onCheckIn(checkIn, { signal })`. The card updates once the promise resolves. If it throws, the form shows "Not saved" and a Retry button. Control the selector with `quarterId` and `onQuarterChange`, and set `autoPlay={false}` in production. Helpers (`keyResultProgress`, `objectiveProgress`, `formatGoalValue`) and `sampleGoalQuarters` are exported.

example.tsx
1import { GoalTracker, type GoalCheckIn, type GoalQuarter } from "@/components/arc/blocks/goal-tracker/goal-tracker";2 3export function TeamGoals({ quarters }: { quarters: GoalQuarter[] }) {4  return (5    <GoalTracker6      title="Platform goals"7      quarters={quarters}8      onCheckIn={async (checkIn: GoalCheckIn, { signal }) => {9        const response = await fetch("/api/check-ins", { method: "POST", body: JSON.stringify(checkIn), signal });10        if (!response.ok) throw new Error("Check-in failed");11      }}12    />13  );14}
Built fromButtonAvatarSegmentedControl

API reference

3 parts. The first is the root.

GoalTracker

A team goals card. Objectives expand into key results with owners, confidence and progress bars; a key result opens a weekly check-in that updates its value, confidence and note, animates the bar and recalculates the objective. A quarter selector steps between closed, active and planning quarters. With no props it shows sample Q4 2026 goals and plays one check-in.

PropTypeDefaultDescription
quartersGoalQuarter[]sampleGoalQuartersQuarters, oldest first. Each has id, label, status (active, closed or planning), optional meta and footnote lines, and objectives. Seeds the card; saved check-ins update it in place.
titlestring"Company goals"Card heading.
quarterIdstring–Selected quarter id. Pair with onQuarterChange to control the selector.
defaultQuarterIdstringthe active quarterQuarter shown first when uncontrolled.
onQuarterChange(quarterId: string) => void–Called when the person steps to another quarter.
onCheckIn(checkIn: GoalCheckIn, context: { signal: AbortSignal }) => Promise<void> | void–Saves a check-in: quarterId, objectiveId, keyResultId, value, previousValue, confidence and note. Throw to show the error state with Retry; the signal aborts when the person cancels. Leave it out to simulate a save.
autoPlaybooleantrue with sample data, false with your ownPlays one scripted check-in the first time the card scrolls into view. Any pointer or key input hands control back at once.
classNamestring–Extra class on the card.

GoalKeyResult

One measurable result. Progress runs from start to target, so a target below start (latency, cost, ticket counts) also works.

PropTypeDefaultDescription
idRequiredstring–Stable id, returned in GoalCheckIn.
titleRequiredstring–What success looks like, such as "Checkout p95 latency under 400 ms".
startRequirednumber–Value when the quarter began.
targetRequirednumber–Value that counts as 100%.
currentRequirednumber–Latest checked in value.
prefixstring–Text before the number, such as "$".
unitstring–Text after the number, such as "%", " ms" or "k".
decimalsnumber0Decimal places shown and pre-filled in the check-in.
confidenceRequired"on-track" | "at-risk" | "off-track"–Owner's confidence, shown as an icon and label and as the bar color.
source{ name: string; icon?: ReactNode }–Where the number is synced from, shown as a small mark (Stripe, Linear, Vercel in the sample).

GoalObjective

An objective with its owner and key results. Progress is the mean of its key results; confidence is their rounded mean.

PropTypeDefaultDescription
idRequiredstring–Stable id.
titleRequiredstring–The objective.
ownerRequired{ name: string; avatar?: string }–Owner shown with an avatar; initials when there is no image.
keyResultsRequiredGoalKeyResult[]–Two to five key results reads best.

Keyboard interactions

Tab
Moves through the quarter buttons, objectives, key results and the footer Check in button.
EnterorSpace
On an objective, expands or collapses it. On a key result, opens its check-in with the value selected.
Arrow keys
In the check-in, moves between On track, At risk and Off track.
Enter
In the check-in, saves.
Escape
Cancels the check-in and returns focus to the key result.

Accessibility

  • Objectives are disclosure buttons with aria-expanded and aria-controls; collapsed bodies are inert.
  • Each key result button has a label with its value, target, progress and confidence, so the visual bar is not the only source.
  • Confidence is always an icon plus a text label, never color alone.
  • The check-in is a labelled form; the hidden form and hidden key results are inert so focus never lands on invisible controls.
  • A polite live region announces saves, errors and the recalculated objective, and says when a save was simulated.

Motion

  • Bars fill once when the card first scrolls into view, then tween to new values (560ms ease-out) with percentages counting in tabular numerals.
  • The objective bar follows its key result 120ms later so cause and effect read clearly.
  • Key results and the check-in form share one grid cell and crossfade (100ms out, 160ms in), so the card never changes height when the form opens.
  • Objective bodies open with a bounce-free 240ms spring on measured height; quarters crossfade with an 8px directional shift and the empty state borrows the previous height.
  • Reduced motion keeps the end states, crossfades and feedback, and drops the fill travel, shifts and the scripted demo.

Responsive behavior

  • Fluid from 360px to 640px wide using container queries, so it adapts to its column rather than the viewport.
  • Below 480px the bars shorten and the confidence picker moves under the value field; below 380px owner names collapse to avatars.
  • Titles truncate with an ellipsis; numbers, labels and bars never wrap or shift.

Performance

  • Progress animations run on motion values and clip-path, so numbers and bars update without React re-renders.
  • One IntersectionObserver for the first fill and one ResizeObserver for the quarter height; both disconnect on unmount.
  • Designed for up to about five objectives with five key results each per quarter.

Notes for AI

Give your coding assistant the Markdown reference instead of screenshots.

  • Use for OKRs, team goals or quarterly targets inside a product: a settings or team page, a dashboard column, or a weekly review.
  • Pass real data through quarters and persist check-ins in onCheckIn; the card updates optimistically after the promise resolves, and shows Retry if it throws.
  • Set start, target and current in the metric's own units; the card computes progress, so decreasing targets need no special handling.
  • Set autoPlay={false} in production. The sample data plays one demo check-in by default.
  • Keep one card per team; for many teams, stack cards rather than adding more objectives to one card.
/components/blocks/goal-tracker/markdown

The full library index for assistants is at /llms.txt.

Related

Agent tasksProBlockA home for background coding agents: start a task on a repository and branch, watch each card move from queued to running to ready for review, and open a pull request from the result.Activity feedProBlockA team activity feed grouped by day on a quiet avatar timeline, with a type filter, a live new updates button, expandable details, and a mark all read sweep.Account healthProBlockA customer success card where a health score gauge, a renewal countdown and five sourced signals with sparklines lead into an AI risk summary and one recommended next step, like scheduling a QBR before usage slips further.
PreviousCredit top-upNextSpend alert
Arc · 129 block pagesllms.txt

On this page

  • Preview
  • When to use
  • When not to use
  • Installation
  • Usage
  • API reference
  • Keyboard
  • Accessibility
  • Motion
  • Responsive behavior
  • Performance
  • Notes for AI
  • Related
View as Markdown

Company goals

Week 4 of 13·0% overall

Q4 2026
    Checkout p95 latency under 400 msTarget 400 ms
    Enter a number
    New self serve MRR to $180kTarget $180k
    Enter a number
    Median first response under 2 hTarget 2.0 h
    Enter a number
Next check-in due Fri, Oct 30