Skip to content
CodeAtlas UI

Charts

BarChart

Vertical, horizontal, stacked and grouped bars.

<script>
  import { BarChart } from "@codeatlasdev/ui/charts";
</script>

<BarChart series={[{ name: "Revenue", data: [38400, 54200, 71600, 89800] }]} categories={["Q1", "Q2", "Q3", "Q4"]} />

Multiple series render grouped by default. Set stacked to stack them into one column per category.

Vertical bars

Code
svelte
<script lang="ts">
  import { GlassCard } from '@codeatlasdev/ui';
  import { BarChart } from '@codeatlasdev/ui/charts';

  const fmt = (v: number) => `$${(v / 1000).toFixed(0)}k`;
</script>

<GlassCard full>
  <BarChart series={[{ name: 'Revenue', data: [38400, 54200, 71600, 89800] }]} categories={['Q1', 'Q2', 'Q3', 'Q4']} valueFormatter={fmt} height="300px" />
</GlassCard>

Horizontal bars

Good for long category names and rankings.

Code
svelte
<script lang="ts">
  import { GlassCard } from '@codeatlasdev/ui';
  import { BarChart } from '@codeatlasdev/ui/charts';

  const products = ['Atlas Pro', 'Nova Suite', 'Relay SDK', 'Mesh API', 'Drift UI', 'Pulse DB', 'Forge CI', 'Orbit ML'];
</script>

<GlassCard full>
  <BarChart
    series={[{ name: 'Sales', data: [9840, 8720, 7650, 6430, 5980, 4810, 3920, 3140] }]}
    categories={products}
    valueFormatter={(v) => `${(v / 1000).toFixed(1)}k`}
    horizontal
    height="300px"
  />
</GlassCard>

Stacked bars

Code
svelte
<script lang="ts">
  import { GlassCard } from '@codeatlasdev/ui';
  import { BarChart } from '@codeatlasdev/ui/charts';

  const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'];
  const fmt = (v: number) => `$${(v / 1000).toFixed(0)}k`;
</script>

<GlassCard full>
  <BarChart
    series={[
      { name: 'Organic', data: [12400, 14800, 18200, 16600, 21200, 24800] },
      { name: 'Paid', data: [8200, 9600, 11800, 10400, 13600, 15200] },
      { name: 'Referral', data: [4800, 5600, 7200, 6400, 8800, 10400] },
      { name: 'Direct', data: [3200, 4000, 5200, 4600, 6200, 7600] },
    ]}
    categories={months}
    valueFormatter={fmt}
    stacked
    height="300px"
  />
</GlassCard>

Grouped and stacked

Toggling stacked animates between both layouts.

Code
svelte
<script lang="ts">
  import { GlassCard, Row, Button } from '@codeatlasdev/ui';
  import { BarChart } from '@codeatlasdev/ui/charts';

  const fmt = (v: number) => `$${(v / 1000).toFixed(0)}k`;
  let mode = $state<'grouped' | 'stacked'>('grouped');
</script>

<div class="wrap">
  <Row gap={8}>
    <Button variant={mode === 'grouped' ? 'filled' : 'glass'} size="sm" onclick={() => (mode = 'grouped')}>Grouped</Button>
    <Button variant={mode === 'stacked' ? 'filled' : 'glass'} size="sm" onclick={() => (mode = 'stacked')}>Stacked</Button>
  </Row>
  <GlassCard full>
    <BarChart
      series={[
        { name: '2025', data: [44200, 58600, 67400, 81200] },
        { name: '2026', data: [52800, 71400, 84600, 98800] },
      ]}
      categories={['Q1', 'Q2', 'Q3', 'Q4']}
      valueFormatter={fmt}
      stacked={mode === 'stacked'}
      height="300px"
    />
  </GlassCard>
</div>

<style>
  .wrap { width: 100%; display: flex; flex-direction: column; gap: var(--ca-space-3); }
</style>

Props

PropTypeDefaultDescription
seriesChartSeries[]–Named series sharing one category axis. Each is { name, data: number[], color? }.
categoriesstring[]–Category labels, one per bar group.
valueFormatter(value: number) => string–Formats value-axis ticks and tooltip values.
horizontalbooleanfalseRenders bars horizontally.
stackedbooleanfalseStacks all series into one column per category.
heightstring'320px'CSS height of the chart.
classstring''Extra class names.