Arc
ComponentsBlocksScreensDocsPricingTry the demo
Get Pro
Saved

Docs

IntroductionInstallationThemingMotionAI and MCPChangelog

Components136

ButtonAction buttonSplit buttonButton groupFloating button groupExpanding button groupCopy buttonAction swapIcon morphConfirm morphTheme switcher

Hold to confirmSwipe actionsReactions

Dropdown menuContext menuUser menu

InputTextareaPassword fieldPassword strengthSearch fieldExpanding searchInline edit

Number fieldMoney inputPhone inputScrub inputTag inputMention inputShortcut recorder

SelectComboboxMulti-selectMorph selectChip group

Radio cardsBilling toggleCheckboxRadio groupSwitchSegmented controlRatingToggle group

SliderElastic sliderRange histogram sliderRuler sliderWindow rangeNewProLens rangeNewPro

CalendarDate pickerDate range pickerTime pickerColor pickerEmoji pickerPro

Rich text editorSignature padFile dropzoneAvatar uploadPro

TabsBreadcrumbPaginationMega menu morphProTable of contents progressPro

Scroll areaAccordionExpandable cardResizable panelsExpandable text

DialogDrawerBottom sheetPopoverHover cardTooltipShare accessProConfirm popoverPro

AlertToastToast stackAnnouncement barCookie consentUndo toastPro

ProgressSkeletonStepperCountdownUsage meterOnboarding checklist

AvatarAvatar groupBadgePresence stackPro

CardMetric cardEmpty stateMetric tickerPro

Line chartBar chartDonut chartStreamgraphBrush chartWaffle chartSlope chartSparklineGaugeActivity heatmapAnimated counterRidgelineTreemapSplit barPro

SunburstProSankey flowProFunnel chartProRadar chartProRealtime streamProRace bar chartProData gridPro

Sortable data tableTree tableTree viewReorderable listFilter toolbarCode blockJSON viewer

TimelineComment threadChat thread

Image compareCarouselCard stack

Text revealIn-view titleText morphText shimmer

Blocks122

KPI drilldownProMetric explorerProRevenue explorerProMRR waterfallProCohort retentionProUsage forecastProJourney flowProUptime statusProPivot builderProChoropleth explorerProConnected scatterProHorizon chartProAccount healthPro

Budget variancePro

Small multiplesProLine replayPro

AI chatProAI composerProAI answerProModel pickerProModel arenaProPrompt studioProDocument extractionProAgent memoryProAI side panelProAI inline editProResearch runProAI insight cardProCatch upProAI feature launchProAI search barProAI setup wizardProCall insightsProLead scoringPro

Agent runProAgent tasksProAgent approvalsProAgent routinesProAgent orchestratorProMCP serversProKnowledge baseProEval suiteProAgent builderProAgent galleryPro

SidebarPro4Page headerCommand paletteNotification centerSelection toolbarProEmpty statesSearch resultsPro

Login and sign up5, free and Pro variantsOnboarding illustrationProOTP inputMulti-step formProTwo-factor setupProMagic linkPro

Settings pageProSettings commandProSecurity settingsProBilling overviewProUsage billingProCancel flowProOnboarding surveyProSpend alertPro

Team membersProInvite peopleProRoles and permissionsProProfile pagePro

API keysProWebhooksProIntegrationsProImport wizardNewProEnvironment variablesProDomain verifyProWebhook testerPro

Plan comparisonPricing calculatorProUsage pricingProCart drawerProCheckout summaryProLive checkoutProSeat managerProCredit top-upPro

Wallet cardProDelivery trackerProSeat mapPro

Activity feedProSupport widgetProFeature votingPro

File uploadMedia playerPro

Availability pickerProRelease readinessProFeedback boardProSmart schedulerProTask breakdownProGoal trackerPro

Hero sectionHero signupPro

Scroll storyProSpotlight gridProFeature bentoProComparison table

Logo marqueeStudio perspectivesProStats band

Changelog feedFAQ sectionContact sectionTeam showcaseProBlog grid

Site headerSite footerCTA sectionNewsletter signup

Activity terrainProRevenue globeProCustomer galaxyProSemantic zoomProLayout morphProExploded viewPro

Screens14

Metrics dashboardProMarket terminalPro

Kanban boardProProject boardProGantt timelinePro

Week calendarProMonth calendarNewPro

Team directoryPro

Inbox triageProSupport conversationProHelp centerPro

Product listingProProduct detailProInvoice studioPro

Special components106

Share sheetProAction morphProMorph navProDockProLiquid tab barProOrbit menuPro

Glass menuProGlass segmentedProGlass cardProGlass tab barPro

Sheet stackProWallet stackProControl centerProHolo cardProCard to articleProLink unfurlPro

Product galleryProLightbox galleryProPhoto gridProCover flowPro

Voice orbProNow playingProVoice recorderPro

Booking pillProActivity ringsProTime dialProDate reelPro

Keycap keyboardProSlot textSand textProTypewriter terminalPro

Stretch refreshProMorph loaderProSkeleton morphProBlack holeProCharge sessionPro

Sticker peelProTicket tearProPage curlProOrbit logosProPrize wheelPro

Dot gridProImage trailProGravity wellProInk fluidProCursor trail drawPro

Agent statusProTool callProAgent planProAgent timelineProContext windowProReasoning blockProSource cardsProModel cardProAI workflowProCode suggestionProGhost textProImage generationProDictation buttonProSpeech playerProMeeting summaryProReply draftProAgent handoffProPII redactionProResponse feedbackProLLM cost calculatorProProvider keysProGeneration statsProAI translateProTL;DR toggleProConnector setupProSmart form fillProEnrich columnProTicket routerProAsk your dataProAgent cursorProProvider statusProTraining runProAI commandProStarter promptsProAI mascotProImage revealProAI sparkProPixel mascotProGhost mascotProCube mascotProTone tunerProUpgrade promptProReferral cardProTrial bannerProTeam switcherProLive visitorsProSocial proof toastProInstall snippetPro

Data flowProPayment flowProDNS resolutionProModel trainingProMulti-region failoverProVector searchProBranch graphProAgent loopProMixture of expertsProSpeculative decodingProPrompt cacheProReasoning treePro
What’s new4 new
BlocksBudget variance

Budget variance

Pro

Budget against actual operating spend by department as aligned bullet charts, with favorable and unfavorable variance, a month, quarter and year to date switch that springs every bar, in-place drill-down into budget lines, and a total row.

Live block · sample data

When to use

  • Monthly close and budget review screens that compare planned and actual operating spend by department or cost center.
  • Finance dashboards where a controller needs to see at a glance which teams are over, which are under, and by how much.
  • Any plan against actual comparison with a meaningful tolerance band, such as headcount cost or cloud spend by team.

When not to use

  • Use mrr-waterfall to explain how a single total moved from one value to another.
  • Use usage-forecast to project spend against a cap over time.
  • Use a line or bar chart to show a trend across many periods; this block compares one window at a time.
  • Use a sortable data table when there are dozens of cost centers and sorting matters more than the visual comparison.

Installation

Pro source and install commands unlock with a Pro plan.

Usage

Render <BudgetVariance /> for the demo, or pass departments (lines with budget and actual keyed by period id), periods, defaultPeriod, defaultExpanded and ranges. Department figures and the total are summed from the lines, and onPeriodChange and onDepartmentToggle report changes.

example.tsx
1import { BudgetVariance } from "@/components/arc/blocks/budget-variance/budget-variance";2 3export function FinanceOverview({ departments }) {4  return (5    <BudgetVariance6      departments={departments}7      defaultPeriod="quarter"8      ranges={[0.9, 1.05]}9      onDepartmentToggle={(id, open) => open && prefetchLines(id)}10    />11  );12}
Built fromSegmented controlAvatar

API reference

BudgetVariance

Budget against actual spend by department as bullet charts on one shared scale, so every budget tick lines up down the table. Each row shows qualitative bands, the actual bar with the overspend drawn in the danger color past the tick, and variance as a signed amount and share colored by whether it is favorable. A month, quarter and year to date switch springs every bar and counts every number to the new window, a total row sums the table, and any department opens in place to show its budget lines.

PropTypeDefaultDescription
departmentsBudgetDepartment[]budgetDepartmentsDepartments with an id, a name, an owner ({ name, avatar? }) and budget lines. Each line has an id, a name, and budget and actual amounts keyed by period id. Department figures and the total are summed from the lines.
periodsBudgetPeriod[]budgetPeriodsReporting windows for the switch, each with an id, a short label, a description shown under the title and a phrase for screen reader sentences ("in the third quarter").
defaultPeriodstring–Id of the window shown first. Defaults to the first period.
defaultExpandedstring | null"engineering"Id of the department open on first render. Pass null to start with every department closed.
ranges[number, number][0.9, 1.1]Qualitative band edges as shares of budget. Spend between them is within tolerance; the bands step darker past the upper edge.
onPlanThresholdnumber0.005Variance smaller than this share of budget reads as on plan and stays neutral.
currencystring"$"Symbol placed before every amount. Amounts shorten to k and M.
titlestring"Budget vs actual"Heading of the block.
descriptionstring–Replaces the period description under the title.
onPeriodChange(periodId: string) => void–Called when the reporting window changes.
onDepartmentToggle(departmentId: string, open: boolean) => void–Called when a department opens or closes. Opening one closes the one that was open, which is reported first.
classNamestring–Class on the root element.

Keyboard interactions

Tab
Moves to the period switch, then into the department list, then out of the block.
Arrow leftorArrow right
On the period switch, changes the reporting window.
Arrow uporArrow down
In the department list, moves to the previous or next department.
HomeorEnd
In the department list, jumps to the first or last department.
EnterorSpace
Opens or closes the budget lines of the department in focus.

Accessibility

  • Each department is a heading with a disclosure button (aria-expanded, aria-controls) whose name is a full sentence: spent, budget, variance and whether it is favorable.
  • The total and every budget line carry the same sentence in visually hidden text; the charts and the counting numbers are hidden from assistive technology so nothing is read twice or mid-count.
  • Changing the window announces the new window and the total through a polite live region.
  • Variance never relies on color: amounts carry a sign and every share ends in over, under or on plan.
  • Pointer focus draws no ring; keyboard focus shows Arc's shared focus ring. The focused department shows a filled row.

Motion

  • Switching the window springs every bar to its new length on one critically damped spring and counts every amount and share to the new value, all written to the DOM from motion values.
  • The overspend is the same bar clipped to the space past budget, so the danger color appears exactly as the bar crosses the tick, with no second animation to keep in sync.
  • Opening a department grows its lines in height and opacity together without overshoot; closing is faster. The chevron turns on the shared spring curve.
  • Every animation is interruptible: a new window or toggle starts from wherever the bars and numbers are.
  • Reduced motion jumps bars and numbers to their final values and opens lines at full height.

Responsive behavior

  • From a 760px container the block is a table: name and owner, the bullet chart, actual, budget, variance and the disclosure chevron in aligned columns.
  • Below that each row puts the name, its actual of budget and the variance on top and the bullet chart across the full width below, so the chart never gets squeezed.
  • Long names wrap instead of truncating. The period switch fills the width on phones.
  • Rows are at least 60px tall and the switch grows to 44px on touch screens.

Performance

  • Bars animate transform only (scaleX from the left edge); bands and ticks are static percentage positions, so a window change never measures layout.
  • Numbers count on motion values that write text content directly, so a window change renders React once, not once per frame.
  • Department and total figures are memoized per window; the shared scale is computed once per data set.

Notes for AI

Give your coding assistant the Markdown reference instead of screenshots.

  • Choose it for cost centers where spending under budget is favorable. Every department and line is read as an expense.
  • Pass one amount per period id for both budget and actual on every line; departments and the total are summed, so they always reconcile.
  • The scale is shared by every row and every period (at least 120 percent of budget, rounded up to fit the largest line), so the budget tick never moves when the window changes.
  • Bands mix the text color and the overspend uses the danger token, so the block stays neutral in any accent. The accent marks only the open department's chevron and the selected window.
  • The first render formats every number from props, so server and client match.
/components/blocks/budget-variance/markdown

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

Related

MRR waterfallProBlockAn MRR bridge whose floating bars morph by period and open the accounts behind each move.Usage forecastProBlockA billing period usage chart with a forecast cone and a draggable budget that dates the crossing.Revenue explorerProBlockA SaaS revenue chart you zoom with a brush while paths, axes and figures glide to the range.Metrics dashboardProBlockA complete product analytics app on the screen shell, with sites, saved views, a date range and filters. It has KPI tabs over one chart you can drag to zoom, breakdowns by page, source, location and device, goals, sortable tables, and a detail panel for any row.
PreviousEnvironment variablesNextChoropleth explorer
Arc · 122 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

Budget vs actual

September 2026

Department0%50%100%ActualBudgetVariance
Total operating spend7 departments$4.01M of $3.96M$4.01M$3.96M+$48.9k+1.2% over

Total operating spend: $4.01M spent of $3.96M in September, $48.9k over budget, 1.2%, unfavorable.

    • Salaries and benefits$993.6k of $1.03M$993.6k$1.03M−$41.4k−4.0% under
      Salaries and benefits: $993.6k spent of $1.03M in September, $41.4k under budget, 4.0%, favorable.
    • Cloud infrastructure$216.6k of $182.0k$216.6k$182.0k+$34.6k+19.0% over
      Cloud infrastructure: $216.6k spent of $182.0k in September, $34.6k over budget, 19.0%, unfavorable.
    • Contractors$93.1k of $96.0k$93.1k$96.0k−$2.9k−3.0% under
      Contractors: $93.1k spent of $96.0k in September, $2.9k under budget, 3.0%, favorable.
    • Software and tools$50.9k of $48.0k$50.9k$48.0k+$2.9k+6.0% over
      Software and tools: $50.9k spent of $48.0k in September, $2.9k over budget, 6.0%, unfavorable.
    • Travel$14.9k of $12.0k$14.9k$12.0k+$2.9k+24.0% over
      Travel: $14.9k spent of $12.0k in September, $2.9k over budget, 24.0%, unfavorable.
ActualBudgetOver budget90 to 110% of budget