Skip to content
WingoUI
ComponentsTemplatesDocsPricingAI agentsBlogChangelog
Components
Buttons & Actions
ButtonButton GroupCopy ButtonDelete ButtonTheme ToggleToggleToggle Group
Inputs
Avatar UploadCalendarCheckboxColor PickerComboboxCron PickerCurrency InputDate PickerDate Range PickerDate Time PickerDuration PickerEmail InputFile UploadFilter BuilderInputInput GroupListboxMasked InputMention InputMonth PickerMulti SelectNumber InputOTP InputPassword InputPhone InputRadio GroupRatingSearch InputSegmented ControlSelectSignature PadSliderSwitchTag InputTextareaTime PickerTimezone Select
Forms
Address InputCSV ImportFieldForm WizardInline EditInvoice line itemsRich Text EditorSchema Builder
Navigation
Back To TopBounce SidebarBreadcrumbCommand MenuGlobal SearchGooey NavHook SidebarNav MenuNav TabsPaginationProximity SidebarScroll ProgressSidebarStepsTable Of ContentsTabsTopbarUser MenuWorkspace Switcher
Overlays
Alert DialogContext MenuDialogDrawerDropdown MenuFamily DrawerHover CardPopoverShare DialogSheetShortcuts DialogTooltipTour
Feedback
AlertBannerCookie ConsentEmoji ReactionEmpty StateNotification BellNotification CenterProgressRoute ProgressSetup ChecklistSkeletonSpinnerToast
Data Display
Approval FlowAvatarBadgeCalendar ViewCode BlockComment ThreadContact cardCountdownDescription ListDiff ViewerFile ListFile managerFolderGanttJSON ViewerKbdLog ViewerMarkdownPresenceSchedulerTagTimelineTree View
Tables & Lists
Audit LogData TableDeal PipelineEditable GridKanbanListMembers tablePermissions MatrixTableTask ListVirtual List
Charts & Stats
Animated CounterArea chartBar chartDonut chartFunnel chartGaugeGitHub ActivityHeatmap calendarLeaderboardLine chartRadar chartRadial barSparklineStat CardTrackerTrend badge
Layout
AccordionApp ShellCardCollapsibleDetail LayoutEntity HeaderPage HeaderScroll AreaSeparatorSettings LayoutSplit ViewToolbar
Media
Audio PlayerCarouselCSV ViewerDOCX EditorDOCX ViewerExcel ViewerFile SystemImage compareImage CropperImage LightboxLocation MapPDF ViewerPowerPoint ViewerQR CodeStep PlayerVideo Player
AI Kit
Agent Status CardChat MessageChat ThreadConversation ListFluid OrbGrid RevealMatrix OrbModel PickerPrompt InputReasoning IndicatorRule BuilderSuggestion ChipsTool Call TimelineUsage MeterVoice InputWorkflow Canvas
Text & Effects
Background PatternGravity LettersMarqueeText AnimateText Rotate
Mobile
Action SheetBottom Tab BarFABHaptic ButtonHero HeaderInstall PromptLarge Title HeaderNotification BannerOnboarding CarouselPicker WheelPull To RefreshSlide To ConfirmSticky CTA BarSwipe DeckSwipeable Tabs
Commerce
Cart drawerCategory pickerCheckout stepsCoupon inputFavorite buttonFilter panelListing cardListing gridOrder trackerPricePrice rangePricing tableProduct galleryQuantity stepperReviewsSeller card
Marketing Sections
App Download SectionBlog Cards SectionCTA SectionFAQ SectionFeature GridFeature ShowcaseHero SectionIntegrations SectionLogo CloudMarketing FooterMarketing HeaderMarketing SectionNewsletter SectionPricing SectionStats SectionSteps SectionTeam SectionTestimonials SectionTimeline SectionVideo Section
Blocks
Admin Dashboard PageAdmin ShellAI Chat PageAPI Keys PageAutomation Builder PageCheckout PageCRM Contact PageCRM Pipeline PageError PagesInbox PageInvoice PageKPI DashboardListing Detail PageLogin PageMarketplace Home PageMarketplace Search PageMarketplace ShellMobile App HomeOnboarding FlowPost Listing WizardPricing PageRegister PageSettings PageUsers Admin Page
Templates
About PageAcademy PageAccessibility PageAffiliate PageAI Product PageBlog PageBlog Post PageBug Bounty PageCareers PageChangelog PageCommunity PageCompare PageContact PageCustomer Story PageCustomers PageDemo Booking PageDevelopers PageDocs Home PageDownload PageEnterprise PageEvents PageExperts PageFAQ PageFeature PageGlossary PageHelp Article PageHelp Center PageImpact PageIntegration Detail PageIntegrations PageJob Detail PageLanding PageLaunch PageLegal PageManifesto PagePress PageProduct Tour PagePromo PageReferral PageResearch Report PageRoadmap PageROI Calculator PageSecurity PageSolutions PageStartups PageStatus PageSwitch PageTemplate Gallery PageWaitlist PageYear in Review Page
Hooks & Utilities
AI ChatChart kitCommerceDate utilsFile exportFile typesFiltersForm validationHapticsInvoicingMotion presetsNavigationNumber formatRelative timeRomanian locationsSpreadsheetText matchTonesUIProvideruseClipboarduseConsentuseControllableStateuseCooldownuseDebounceuseKeyboardInsetuseLocaleuseLongPressuseMediaControlsuseMediaQueryuseOverflowItemsusePersistedStateuseScrollEdgesuseScrollStateuseSelectionuseShortcutuseStickToBottom
GalleryTheme

Charts & Stats

Radar chart

Charts & Stats

Radar chart React component for Tailwind CSS v4

Line chartRadial bar
Live props
Content
xKey
valueFormat
currency
decimals
locale
label
description
Layout
size
maxAuto
min
showLegend
legendPosition
Appearance
shape
levels4
fillOpacity0.18
strokeWidth2px
curve
showDots
showGrid
showAxisLabels
showLevelLabels
surface
Behavior
legendToggle
showTooltip
tooltipMode
animated
State
loading
defaultActiveIndex
Code
import { RadarChart } from "@/components/ui/radar-chart"

<RadarChart />
  1. Home
  2. Components
  3. Charts & Stats
  4. Radar chart
Pro

Radar chart React component for Tailwind CSS v4

v1.0.0·Added in 1.10.0

Compares one or more series across 3 to 12 categories on a spider web, for skills, product scores, survey results and plan comparisons.

Each series grows out of the center the first time the chart scrolls into view, the series a beat apart. Move the mouse around the web and the nearest spoke lights up, its label turns bold, the dots on it swell and a readout lists every visible series for that category. On a phone, tap near a spoke to pin the readout, drag around to move from spoke to spoke (a vertical drag still scrolls the page), tap the same spoke again or anywhere outside to clear it. With the keyboard, Tab to the chart: Right / Down move clockwise, Left / Up counter-clockwise (both wrap around), Home / End jump to the first and last axis and Escape clears; a live region reads each axis. Click or tap a legend entry to hide its series, hover or focus one to highlight it. Long category names wrap onto two lines, then shorten with an ellipsis on narrow screens; the full name stays in the readout and the screen reader table.

Radar chart is a Pro React component in the React chart and stat components category, written in TypeScript for React 19 and Tailwind CSS v4. It installs as source with npx wingo-ui@latest add radar-chart, together with Chart kit, UIProvider and useLocale and the npm packages motion and d3-shape.

Add to a project

Requirements: React 19 and Tailwind CSS v4, in Next.js (App Router or Pages), Vite or React Router. Installation guide · Next.js setup · Vite setup

npx wingo-ui@latest add radar-chart

Pro item: the CLI needs a Pro account. See plans

Usage

Import RadarChart from @/components/ui/radar-chart.

import { RadarChart } from "@/components/ui/radar-chart"

const data = [
  { label: "Speed", starter: 6, pro: 9 },
  { label: "Storage", starter: 4, pro: 8 },
  { label: "Integrations", starter: 5, pro: 9 },
  { label: "Support", starter: 3, pro: 8 },
  { label: "Security", starter: 6, pro: 9 },
  { label: "Analytics", starter: 4, pro: 7 },
]

export function PlanComparison() {
  return (
    <RadarChart
      data={data}
      series={[
        { key: "starter", label: "Starter" },
        { key: "pro", label: "Pro" },
      ]}
      max={10}
      label="Starter vs. Pro, scored out of 10"
    />
  )
}

Props

  • data*
    ChartDatum[]

    One row per axis, in clockwise order from the top: { label: "Speed", starter: 6, pro: 9 }. A missing value sits at the center.

  • xKeydefault "label"
    string

    The row key that names each axis.

  • series
    RadarChartSeries[]

    Which keys to draw, in color order: { key, label?, color?, name?, dashed? }. dashed draws an outline only (a target or last period) with a muted tooltip row. Inferred from the numeric keys of the first rows when omitted.

  • colors
    string[]

    Per-position palette overrides: a slot ("series-3"), a tone ("neutral", "brand") or any CSS color.

  • sizedefault "md"
    "sm" | "md" | "lg"

    The largest square the chart takes: 240, 320 or 420px. It shrinks to the container's width below that.

  • shapedefault "polygon"
    "polygon" | "circle"

    The grid rings: straight-edged polygons or circles.

  • levelsdefault 4
    number

    How many grid rings divide the range from min to max.

  • maxdefault 0
    number

    The value on the outer ring (100 for percentages). 0, or anything not above min, rounds the largest visible value up so every ring lands on a round number.

  • mindefault 0
    number

    The value at the center.

  • fillOpacitydefault 0.18
    number

    Opacity of each series' fill (dashed series have no fill).

  • strokeWidthdefault 2
    number

    Outline width in px.

  • curvedefault "linear"
    "linear" | "cardinal"

    Straight edges between axes, or a smooth closed curve through every point.

  • showDotsdefault true
    boolean

    A dot on every value. Without them the inspected axis still shows its dots.

  • showGriddefault true
    boolean

    The rings and spokes behind the series.

  • showAxisLabelsdefault true
    boolean

    Category names around the web. Off, the web takes the whole square.

  • showLevelLabelsdefault false
    boolean

    The value of each ring, printed along the top spoke.

  • showLegenddefault true
    boolean

    A legend for two or more series.

  • legendPositiondefault "bottom"
    "top" | "bottom"

    Where the legend sits; it wraps onto more lines on narrow screens.

  • legendToggledefault true
    boolean

    Legend entries are toggle buttons that hide and show a series (the last visible one stays).

  • showTooltipdefault true
    boolean

    The readout for the inspected axis. Off, the spoke still highlights and the live region still speaks.

  • tooltipModedefault "auto"
    "auto" | "float" | "fixed"

    float beside the spoke's end (mouse), fixed above the chart where a finger cannot cover it (touch); auto picks by pointer.

  • valueFormatdefault "number"
    ChartValueFormat

    How values print in the readout, ring labels and table: number, compact, currency or percent. Percent takes whole numbers (82 -> "82%").

  • currencydefault "USD"
    string

    ISO 4217 code for valueFormat currency.

  • decimalsdefault ""
    number

    Fraction digits in the readout and table; auto by magnitude when unset (Default in the playground).

  • formatValue
    (value: number, context: { series: string; kind: "tooltip" | "level" | "table" }) => string

    Replaces the built-in value formatting everywhere.

  • localedefault ""
    string

    Locale for numbers. Empty uses the UIProvider / LocaleProvider locale (en-US in the playground).

  • animateddefault true
    boolean

    Series grow out of the center on first view, morph when the data changes and fade when hidden or highlighted. Always off under reduced motion.

  • loadingdefault false
    boolean

    A round skeleton in the chart's square while data loads.

  • emptyState
    ReactNode

    Replaces the built-in empty state when no row has a value.

  • labeldefault ""
    string

    The accessible name of the chart and the table caption. Empty joins the series names.

  • descriptiondefault ""
    string

    A sentence for screen readers that states the takeaway.

  • surfacedefault ""
    string

    The color behind the chart, used to ring the dots and halo the ring labels. Empty uses the surface token.

  • hiddenSeries
    string[]

    Hidden series keys when you control legend toggling; pair with onHiddenSeriesChange.

  • defaultHiddenSeries
    string[]

    Series hidden at first, uncontrolled.

  • onHiddenSeriesChange
    (keys: string[]) => void

    Called when a legend toggle hides or shows a series.

  • activeIndex
    number | null

    The inspected axis when you control it.

  • defaultActiveIndexdefault ""
    number | null

    The axis inspected at first, uncontrolled. Unset (Default in the playground) starts with no readout.

  • onActiveIndexChange
    (index: number | null) => void

    Called as the inspected axis changes (mouse, touch or keyboard) and with null when it clears.

  • labels
    Partial<RadarChartLabels>

    Strings: empty, loading, table, inspectHint, showSeries, hideSeries, axis (Category), compare ((comparison)).

  • classNames
    Partial<Record<RadarChartSlot, string>>

    Classes for legend, plot, tooltip, table, grid, axisLabel, levelLabel, area, dot and inspect.

Parts

  • DEFAULT_RADAR_CHART_LABELS

    constant

    The English strings the chart uses, the chart kit's labels plus axis and compare. Spread it to translate a few.

  • RadarChartSeries

    type

    One series: { key, label?, color?, name?, dashed? }.

  • RadarChartLabels

    type

    The shape of the labels prop.

  • RadarChartFormatContext

    type

    What formatValue receives besides the value: the series key and where it prints ("tooltip", "level" or "table").

Examples

Skills against a bar

A neutral series over a dashed target, circle grid, cardinal curve and ring labels.

Single series

One brand-colored series on a circle grid; no legend for one series.

Three series, toggled legend

hiddenSeries controlled from the legend, which sits on top.

Percent

valueFormat percent with max 100; a long category name wraps onto two lines.

Loading and empty

The round skeleton and the empty state in the chart's square.

Dependencies

motiond3-shapechart-kitui-configuse-locale

Files

  • components/ui/radar-chart.tsx

FAQ

Is the React Radar chart component free?

The preview, props and docs are free; copying the source needs a Pro plan. See plans.

How do I install Radar chart?

Run npx wingo-ui@latest add radar-chart. It also adds the Wingo UI items it builds on (Chart kit, UIProvider and useLocale) and the npm packages motion and d3-shape. With shadcn, add the @wingo-ui registry with your API key, then run npx shadcn@latest add @wingo-ui/radar-chart.

How does Radar chart behave on phones?

On a phone, tap near a spoke to pin the readout, drag around to move from spoke to spoke (a vertical drag still scrolls the page), tap the same spoke again or anywhere outside to clear it.

See also

Line chartBar chartDonut chartRadial barStat Card

More React chart and stat components

Trend badgeGaugeGitHub ActivityAnimated CounterTrackerHeatmap calendar
All 16 React chart and stat components
PreviousLine chartNext Radial bar

Which plan fits your team?

Northwind CRM plans, average scores out of 10 from our product team

Starter, Pro
CategoryStarterPro
Speed68.5
Storage47.5
Integrations58.75
Support3.257
Security6.58
Analytics4.58.5
Compare Starter with