Skip to main content
Urbicon UI

BarChartbeta

Categorical bar chart — single, grouped, or stacked — on the design-token palette.

Playground

Settled — form: 20In progress — form: 5Settled — display: 5In progress — display: 11Settled — feedback: 10In progress — feedback: 1Settled — ai: 0In progress — ai: 10Settled — layout: 7In progress — layout: 3Settled — navigation: 5In progress — navigation: 3Settled — overlay: 4In progress — overlay: 4Settled — action: 6In progress — action: 2Settled — data: 2In progress — data: 0
  • Settled
  • In progress
Bar chart: 9 categories, 2 series
CategorySettledIn progress
form205
display511
feedback101
ai010
layout73
navigation53
overlay44
action62
data20
<script lang="ts">
  import { BarChart } from '@urbicon-ui/blocks';

  const data = [
    { label: 'form', values: [20, 5] },
    { label: 'display', values: [5, 11] },
    { label: 'feedback', values: [10, 1] },
    { label: 'ai', values: [0, 10] },
    { label: 'layout', values: [7, 3] },
    { label: 'navigation', values: [5, 3] },
    { label: 'overlay', values: [4, 4] },
    { label: 'action', values: [6, 2] },
    { label: 'data', values: [2, 0] }
  ];
  const series = [{ label: 'Settled' }, { label: 'In progress' }];
</script>

<BarChart
  {data}
  {series}
  height={260}
/>

01 Examples

Grouped series

Two series rendered side by side per category — the default when each datum carries more than one value.
Revenue — Q1: €42kCost — Q1: €30kRevenue — Q2: €55kCost — Q2: €38kRevenue — Q3: €48kCost — Q3: €41kRevenue — Q4: €67kCost — Q4: €52k
  • Revenue
  • Cost
Bar chart: 4 categories, 2 series
CategoryRevenueCost
Q1€42k€30k
Q2€55k€38k
Q3€48k€41k
Q4€67k€52k
<div class="w-full max-w-2xl">
  <BarChart data={quarterly} series={revenueCost} formatValue={eur} />
</div>

Stacked

Set stacked to stack the series into one bar per category — useful for part-to-whole comparisons over time.
Revenue — Q1: €42kCost — Q1: €30kRevenue — Q2: €55kCost — Q2: €38kRevenue — Q3: €48kCost — Q3: €41kRevenue — Q4: €67kCost — Q4: €52k
  • Revenue
  • Cost
Bar chart: 4 categories, 2 series
CategoryRevenueCost
Q1€42k€30k
Q2€55k€38k
Q3€48k€41k
Q4€67k€52k
<div class="w-full max-w-2xl">
  <BarChart stacked data={quarterly} series={revenueCost} formatValue={eur} />
</div>

Single series

One value per datum renders simple bars. The legend hides automatically with a single series.
Series 1 — Mon: 120Series 1 — Tue: 180Series 1 — Wed: 150Series 1 — Thu: 210Series 1 — Fri: 240
Bar chart: 5 categories
CategorySeries 1
Mon120
Tue180
Wed150
Thu210
Fri240
<div class="w-full max-w-xl">
  <BarChart data={visitors} height={200} />
</div>

02 Customization

Custom series colors

Each series accepts an explicit color (any CSS color or design token) to override the cycled categorical palette.
Revenue — Q1: €42kCost — Q1: €30kRevenue — Q2: €55kCost — Q2: €38kRevenue — Q3: €48kCost — Q3: €41kRevenue — Q4: €67kCost — Q4: €52k
  • Revenue
  • Cost
Bar chart: 4 categories, 2 series
CategoryRevenueCost
Q1€42k€30k
Q2€55k€38k
Q3€48k€41k
Q4€67k€52k
<div class="w-full max-w-2xl">
  <BarChart
    data={quarterly}
    series={[
      { label: 'Revenue', color: 'var(--color-primary)' },
      { label: 'Cost', color: 'var(--color-warning)' }
    ]}
    formatValue={eur}
  />
</div>

03 Accessibility

SVG with role="img"

The chart SVG carries role="img" and a generated aria-label summarising the category and series count. Pass ariaLabel to override it with a domain-specific description.

Data-table fallback

A visually hidden (sr-only) table mirrors the data — one row per category, one column per series — so screen-reader users get the exact values, not just the visual summary.

Per-bar tooltips

Each bar includes a native SVG <title> ("series — category: value"), giving a zero-JavaScript hover tooltip that the browser also exposes to assistive tech.

04 API Reference

16 props
16 props 1 required
Prop
Type
Default
Description

05 Types

Local type definitions used by this component.

7 types
Name
Kind
Category
Used by
Description

06 Installation

Import

import { BarChart } from '@urbicon-ui/blocks';