Components

Chart Bar

Data visualization bar components for charts, graphs, and analytics displays

Chart Bar

Flexible bar chart components for data visualization. Features glassmorphic styling, animated height transitions, and support for percentage displays with custom icons.

Usage

import { ChartBarContainer, ChartBar, PercentageBar } from "@/components/ui/chart-bar";

export default function Example() {
  return (
    <ChartBarContainer>
      <ChartBar value={40} maxValue={100} label="Desktop" />
      <ChartBar value={35} maxValue={100} label="Mobile" />
      <ChartBar value={25} maxValue={100} label="Tablet" />
    </ChartBarContainer>
  );
}

Components

ChartBarContainer

Container component that manages layout and spacing for multiple bars.

ChartBar

Individual bar with automatic height calculation, inner glow orb, and optional label.

PercentageBar

Specialized bar for percentage displays with icon support (Bento17 pattern).

Props

ChartBarContainer Props

PropTypeDefaultDescription
gap"none" | "sm" | "default" | "lg""default"Spacing between bars
orientation"horizontal" | "vertical""horizontal"Layout direction

ChartBar Props

PropTypeDefaultDescription
valuenumber-Current value
maxValuenumber100Maximum value for height calculation
labelstring-Label text below bar
showLabelbooleantrueDisplay label
barColorstring-Custom bar fill color
variant"default" | "highlighted""default"Visual style

PercentageBar Props

PropTypeDefaultDescription
percentagenumber-Percentage value (0-100)
iconReactNode-Icon or image to display in bar
size"sm" | "default" | "lg""default"Bar width

Variants

Gap Variants

// No gap
<ChartBarContainer gap="none">...</ChartBarContainer>

// Small gap - 4px
<ChartBarContainer gap="sm">...</ChartBarContainer>

// Default gap - 8px
<ChartBarContainer gap="default">...</ChartBarContainer>

// Large gap - 16px
<ChartBarContainer gap="lg">...</ChartBarContainer>

Orientation

// Horizontal layout (default)
<ChartBarContainer orientation="horizontal">
  <ChartBar value={40} />
  <ChartBar value={60} />
</ChartBarContainer>

// Vertical layout
<ChartBarContainer orientation="vertical">
  <ChartBar value={40} />
  <ChartBar value={60} />
</ChartBarContainer>

Examples

Basic Bar Chart

<ChartBarContainer>
  <ChartBar value={40} maxValue={100} label="Q1" />
  <ChartBar value={65} maxValue={100} label="Q2" />
  <ChartBar value={55} maxValue={100} label="Q3" />
  <ChartBar value={80} maxValue={100} label="Q4" />
</ChartBarContainer>

With Custom Colors

<ChartBarContainer>
  <ChartBar value={40} label="Sales" barColor="#4ade80" />
  <ChartBar value={60} label="Revenue" barColor="#60a5fa" />
  <ChartBar value={30} label="Profit" barColor="#fbbf24" />
</ChartBarContainer>

Percentage Bars (Bento17 Pattern)

import Image from "next/image";

<ChartBarContainer className="h-[200px]">
  <PercentageBar 
    percentage={40}
    icon={<Image src="/balls-1.svg" alt="" fill />}
  />
  <PercentageBar 
    percentage={15}
    icon={<Image src="/balls-2.svg" alt="" fill />}
  />
  <PercentageBar 
    percentage={68}
    icon={<Image src="/balls-3.svg" alt="" fill />}
  />
  <PercentageBar 
    percentage={24}
    icon={<Image src="/balls-4.svg" alt="" fill />}
  />
</ChartBarContainer>

Without Labels

<ChartBarContainer>
  <ChartBar value={40} showLabel={false} />
  <ChartBar value={60} showLabel={false} />
  <ChartBar value={80} showLabel={false} />
</ChartBarContainer>

Compact Layout

<ChartBarContainer gap="sm" className="h-32">
  <ChartBar value={20} label="Mon" />
  <ChartBar value={40} label="Tue" />
  <ChartBar value={30} label="Wed" />
  <ChartBar value={60} label="Thu" />
  <ChartBar value={50} label="Fri" />
  <ChartBar value={70} label="Sat" />
  <ChartBar value={45} label="Sun" />
</ChartBarContainer>

With Custom Heights

<ChartBarContainer className="h-[300px]">
  <ChartBar value={40} maxValue={100} />
  <ChartBar value={80} maxValue={100} />
  <ChartBar value={60} maxValue={100} />
</ChartBarContainer>

Design Tokens

Dimensions

ElementValueToken
Border radius12pxvar(--radius-sm)
Border width1.5pxvar(--border-width-default)
Orb size16px-
Min height20px-

Effects

TokenValueDescription
Backgroundvar(--neutral-2-5)Bar background
Bordervar(--ui-stroke-subtle)Bar border
Orb gradientvar(--gradient-orb)Inner glow effect
Orb shadow0px 24px 24px 0px rgba(0,0,0,0.3)Orb elevation

Colors

ElementToken
Label textvar(--ui-text-secondary)
Bar fillCustom or var(--neutral-2-5)

Height Calculation

Bar height is automatically calculated based on value and maxValue:

height = (value / maxValue) × 100%

Example:

  • Value: 40
  • Max: 100
  • Height: 40%

The height animates smoothly with a 500ms transition when the value changes.

Inner Glow Orb

Each bar includes a decorative orb at its center:

  • 16px diameter
  • Circular with gradient fill
  • 10% opacity
  • Positioned at center of bar
  • Uses var(--gradient-orb) token

Found In

  • Bento17 - Engagement rate percentages with icon bars
  • Bento23 - Analytics chart with multiple bars
  • Bento24 - Performance metrics
  • Bento26 - Dashboard statistics

Accessibility

ChartBar

  • Semantic structure with labels
  • Color is not the only indicator (labels + height)
  • Smooth animations respect prefers-reduced-motion
  • Labels are readable by screen readers

Best Practices

// Provide context for data
<div role="img" aria-label="Quarterly sales data">
  <ChartBarContainer>
    <ChartBar value={40} label="Q1" />
    <ChartBar value={65} label="Q2" />
    <ChartBar value={55} label="Q3" />
    <ChartBar value={80} label="Q4" />
  </ChartBarContainer>
</div>

// Include data table for screen readers
<div>
  <ChartBarContainer aria-hidden="true">
    {/* Visual chart */}
  </ChartBarContainer>
  <table className="sr-only">
    <caption>Sales data by quarter</caption>
    {/* Data table */}
  </table>
</div>

Performance

  • CSS-based height transitions (hardware accelerated)
  • Minimal re-renders (only on value change)
  • No external chart libraries required
  • Lightweight DOM structure
  • Smooth 500ms transitions

Responsive Behavior

Bars automatically adjust to container height. For responsive charts:

<div className="h-32 md:h-48 lg:h-64">
  <ChartBarContainer className="h-full">
    <ChartBar value={40} />
    <ChartBar value={60} />
  </ChartBarContainer>
</div>

On this page