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 statusPro
Pivot builderNewPro
Choropleth explorerPro
Connected scatterPro
Horizon chartPro
Account healthPro
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
AI inline editPro
Research runPro
AI insight cardPro
Catch upPro
AI feature launchPro
AI search barPro
AI setup wizardPro
Call insightsPro
Lead scoringPro
Agent runPro
Agent tasksPro
Agent approvalsPro
Agent routinesPro
Agent orchestratorPro
MCP serversPro
Knowledge basePro
Eval suitePro
Agent builderPro
Agent galleryPro
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 setupPro
Magic linkPro
Settings pagePro
Settings commandPro
Security settingsPro
Billing overviewPro
Usage billingPro
Cancel flowPro
Onboarding surveyPro
Spend alertPro
Team membersPro
Invite peoplePro
Team directoryPro
Roles and permissionsPro
Profile pagePro
API keysPro
WebhooksPro
IntegrationsPro
Environment variablesPro
Domain verifyPro
Webhook testerPro
Plan comparison
Pricing calculatorPro
Usage pricingPro
Cart drawerPro
Checkout summaryPro
Live checkoutPro
Seat managerPro
Credit top-upPro
Invoice studioPro
Wallet cardPro
Delivery trackerPro
Product listingPro
Product detailPro
Seat mapPro
Activity feedPro
Inbox triagePro
Support conversationPro
Support widgetPro
Help centerPro
Feature votingPro
File upload
Media playerPro
Week calendarPro
Availability pickerPro
Project boardPro
Gantt timelineNewPro
Release readinessPro
Kanban boardPro
Feedback boardPro
Smart schedulerPro
Task breakdownPro
Goal trackerPro
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 new4 new
BlocksChoropleth explorer

Choropleth explorer

Pro

A filled-region map that shades every state or region by revenue, growth or penetration on a stepped scale, with a country switch (United States, Canada, Brazil, United Kingdom, France, Germany, Italy, Australia), a hoverable legend, a synced ranked list and a camera zoom into local detail.

Live block · sample data

When to use

  • Sales, revenue or usage dashboards that break a metric down by state, country or territory.
  • Market coverage and penetration reviews where a region's own subareas explain its number.
  • Any analytics view where readers compare neighbouring areas and need the ranked numbers beside the map.

When not to use

  • Use offices-map to place pins at specific locations such as offices or stores.
  • Use revenue-globe for flows and totals on a spinning globe when geography is ambience rather than the comparison.
  • Use a bar chart or sortable table when the regions are few, or when area size would mislead (a large, sparse region draws more attention than a small, dense one).

Installation

Pro source and install commands unlock with a Pro plan.

Usage

Render <ChoroplethExplorer /> for the demo, or pass your own regions (SVG paths, values per metric, optional subregions) and metrics. Listen to onRegionOpen and onMetricChange to sync the zoomed region or metric with the URL.

example.tsx
1import { ChoroplethExplorer } from "@/components/arc/blocks/choropleth-explorer/choropleth-explorer";2 3export function SalesByRegion() {4  return (5    <ChoroplethExplorer6      defaultMetric="growth"7      onRegionOpen={id => router.replace(id ? `?state=${id}` : "?")}8    />9  );10}
Built fromSegmented control

API reference

ChoroplethExplorer

A filled-region map that shades every state by a metric on a stepped sequential or diverging scale. A metric switch sweeps the new fills across the map from west to east, the legend steps light every region in their bin, a ranked list stays in sync with the map both ways, and selecting a state zooms the camera into it and shades its counties.

PropTypeDefaultDescription
mapsChoroplethMap[]choroplethMapsAreas to switch between, such as countries: an id, a name, its regions, a plural region noun, an optional title, metrics (for a local currency) and view box. A country switch appears when there is more than one. Ignored when regions is set.
defaultMapstring–Id of the area shown first. Defaults to the first one.
onMapChange(id: string) => void–Called after the area changes.
regionsChoroplethRegion[]–Top level regions of a single area: an id, a name, SVG path data in view box units, an optional bounding box, one value per metric id (null for no data) and optional subregions with their own paths and values.
metricsChoroplethMetric[]choroplethMetricsMetrics in the switch. Each has a label, a headline label, a format ("currency", "change" or "percent"), a scale ("sequential" or "diverging") and how the headline aggregates ("sum", or "weighted" by the first metric).
defaultMetricstring–Id of the metric shown first. Defaults to the first metric.
viewBox[number, number][975, 610]Width and height of the view box the region paths are drawn in.
areaNamestring"United States"Name of the whole area, shown above the map before zooming in.
regionNounstring"states"Plural noun for top level regions, used in the list heading, legend and announcements.
titlestring"Revenue by state"Heading of the block.
descriptionstringchoroplethCaptionLine under the title. Pass an empty string to hide it.
onRegionOpen(id: string | null) => void–Called after the map zooms into a region, with its id, or with null when it zooms back out.
onMetricChange(id: string) => void–Called after the metric changes.
classNamestring–Class on the root element.

Keyboard interactions

Tab
Moves to the metric switch, the back button when zoomed in, the legend steps and the ranked list.
Arrow uporArrow down
In the ranked list, moves between regions and outlines the focused one on the map.
HomeorEnd
In the ranked list, jumps to the first or last region.
EnterorSpace
On a state, zooms into it and lists its counties. On a county, pins it on the map. On a legend step, keeps its regions lit until pressed again.
Escape
Releases a pinned legend step, then zooms back out to every state.

Accessibility

  • The map is an image with a label naming the area and the metric; the ranked list next to it is the accessible path to every value and every zoom.
  • The list is one tab stop with roving focus. Each row names its rank, region, value and whether it opens counties.
  • Zooming, zooming out, switching the metric and pinning a county are announced through one polite live region, including the highest region for the new metric.
  • Legend steps are toggle buttons with aria-pressed and a label that counts their regions and states their range. Values carry a sign and a true minus, so direction never depends on color alone.
  • Pointer focus draws no ring; keyboard focus shows Arc's shared focus ring. Keyboard position shows as a filled row and an outline on the map.

Motion

  • Switching the metric fades each region to its new fill with a delay set by its position, so the change sweeps across the map from west to east in under 800ms.
  • Selecting a state moves one camera on a critically damped spring: translate and scale travel together, so the state glides to the center in a straight line and can be reversed mid-flight. Counties fade in while the camera is still arriving; other states recede to context.
  • The headline total counts to each new value on a motion value, list rows glide to their new rank with a layout spring, and rank bars resize on a transform.
  • The tooltip follows the pointer on motion values without React renders; the hovered row scrolls into view inside the list, never the page.
  • Reduced motion makes every fill, zoom, count and reorder instant.

Responsive behavior

  • From an 820px container the map and the ranked list sit side by side and the list matches the map column's height; below that the list stacks under the map and scrolls inside a fixed height.
  • The metric switch takes the full width on phones; the legend wraps its no data step below the ramp.
  • Rows are 44px tall, and switches, legend steps and the back button grow to 44px on touch. Tapping a state zooms in directly; tooltips are limited to fine pointers.
  • Nothing scrolls sideways: the map scales with its container through the view box.

Performance

  • About 51 state paths plus the counties of one state at a time, with one delegated pointer listener for the whole map.
  • The camera writes a single transform attribute from three motion values, and strokes use non-scaling-stroke so the zoom never re-rasterises line widths in JavaScript.
  • Fills change through CSS transitions of fill and fill-opacity; ranking and binning are memoized per metric and level.
  • The sample data file is about 85KB of simplified path data; supply your own paths at the precision your map needs.

Notes for AI

Give your coding assistant the Markdown reference instead of screenshots.

  • Choose it when the question is how a metric is distributed across areas that people recognise by shape, and when a region's subareas are worth a closer look.
  • Bins are recomputed for whatever is in view: quantile breaks rounded to two significant digits, split at zero with a second hue on diverging metrics. Pass raw values and let the block choose the steps.
  • Paths are straight segment SVG data. Top level regions share one view box; subregions use a local grid placed with origin [x, y, unit], which keeps small states sharp when zoomed. The sample data is simplified US Census cartographic boundaries in Albers USA.
  • Only ten states carry county data in the sample; the others zoom in and explain there is no county detail, which is also how the block handles a region without subregions.
  • The positive side uses the first chart series color and the negative side the third, both theme tokens. No data renders as a flat neutral with its own legend step.
/components/blocks/choropleth-explorer/markdown

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

Related

Revenue globeProBlockA dotted globe where live payments arc home to headquarters, with a replayable day.Revenue explorerProBlockA SaaS revenue chart you zoom with a brush while paths, axes and figures glide to the range.KPI drilldownProBlockKPI cards that expand into a full detail chart with period comparison and a breakdown table, then fold back.Metric explorerProBlockKPI cards that open into a scrubbable chart and morph between metrics and ranges.
PreviousBudget varianceNextSmall multiples
Arc · 134 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

Revenue by state

Twelve months to August 31, 2026

Country
United States
United States51
Canada13
Brazil27
United Kingdom12
France13
Germany16
Italy20
Australia8

United States

$55.9MAnnual recurring revenue

$120K$230K$760K$1.6M

Shaded by annual recurring revenue

51 states

Ranked by revenue

Select a state on the map or in the ranked list to zoom in. In the list, use the arrow keys to move and Enter to open. Escape zooms back out.