mcpField
V
visx

visx

github.com/cericoData & databases037 installsUpdated 28w ago
Repository

About visx

visx is a React library for building custom data visualizations from D3 primitives. This starter skill provides chart patterns for developers who need interactive, responsive visualizations tailored to dashboards and specific design requirements.

Key features

  1. 01React components built from D3 primitives
  2. 02Line and bar chart patterns
  3. 03Responsive chart containers
  4. 04Tooltip interaction patterns
  5. 05SVG styling guidance

Use cases

  1. 01Creating custom interactive charts
  2. 02Building dashboard visualizations
  3. 03Making charts responsive to containers

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/cerico/macfair --skill visx

After installing, type/visxin Claude Code to confirm it loaded.

Details

From the project README

visx

Build data visualizations with React using visx (Airbnb's React + D3 library).

Status: Starter

Patterns will evolve with use.

When to Use

  • Custom charts beyond basic chart libraries
  • Interactive data exploration
  • Dashboards with specific design requirements
  • When you need D3 power with React patterns

Why visx over other options

LibraryGood for
visxCustom, interactive, design-specific charts
RechartsQuick standard charts
Chart.jsSimple, canvas-based
D3 directMaximum control, non-React

visx = D3 primitives as React components. Full control, React-friendly.

Setup

# Core
pnpm add @visx/group @visx/scale @visx/shape @visx/axis @visx/grid

# Common additions
pnpm add @visx/tooltip @visx/responsive @visx/gradient @visx/curve

# All of visx (larger bundle)
pnpm add @visx/visx

Basic Patterns

Line Chart
import { LinePath } from '@visx/shape'
import { scaleLinear, scaleTime } from '@visx/scale'
import { AxisBottom, AxisLeft } from '@visx/axis'
import { Group } from '@visx/group'

interface DataPoint {
  date: Date
  value: number
}

const data: DataPoint[] = [
  { date: new Date('2024-01'), value: 10 },
  { date: new Date('2024-02'), value: 25 },
  { date: new Date('2024-03'), value: 15 },
]

const width = 600
const height = 400
const margin = { top: 20, right: 20, bottom: 40, left: 40 }

const innerWidth = width - margin.left - margin.right
const innerHeight = height - margin.top - margin.bottom

const xScale = scaleTime({
  domain: [Math.min(...data.map(d => d.date)), Math.max(...data.map(d => d.date))],
  range: [0, innerWidth],
})

const yScale = scaleLinear({
  domain: [0, Math.max(...data.map(d => d.value))],
  range: [innerHeight, 0],
})

export function LineChart() {
  return (
    <svg width={width} height={height}>
      <Group left={margin.left} top={margin.top}>
        <AxisBottom scale={xScale} top={innerHeight} />
        <AxisLeft scale={yScale} />
        <LinePath
          data={data}
          x={d => xScale(d.date)}
          y={d => yScale(d.value)}
          stroke="currentColor"
          strokeWidth={2}
        />
      </Group>
    </svg>
  )
}
Bar Chart
import { Bar } from '@visx/shape'
import { scaleBand, scaleLinear } from '@visx/scale'
import { Group } from '@visx/group'

interface DataPoint {
  label: string
  value: number
}

const data: DataPoint[] = [
  { label: 'A', value: 30 },
  { label: 'B', value: 80 },
  { label: 'C', value: 45 },
]

const xScale = scaleBand({
  domain: data.map(d => d.label),
  range: [0, innerWidth],
  padding: 0.2,
})

const yScale = scaleLinear({
  domain: [0, Math.max(...data.map(d => d.value))],
  range: [innerHeight, 0],
})

export function BarChart() {
  return (
    <svg width={width} height={height}>
      <Group left={margin.left} top={margin.top}>
        {data.map(d => (
          <Bar
            key={d.label}
            x={xScale(d.label)}
            y={yScale(d.value)}
            width={xScale.bandwidth()}
            height={innerHeight - yScale(d.value)}
            fill="currentColor"
          />
        ))}
      </Group>
    </svg>
  )
}
Responsive Container
import { ParentSize } from '@visx/responsive'

export function ResponsiveChart() {
  return (
    <ParentSize>
      {({ width, height }) => (
        <LineChart width={width} height={height} />
      )}
    </ParentSize>
  )
}
Tooltip
import { useTooltip, TooltipWithBounds } from '@visx/tooltip'
import { localPoint } from '@visx/event'

const { showTooltip, hideTooltip, tooltipData, tooltipLeft, tooltipTop } = useTooltip()

// In your component:
<circle
  onMouseMove={(event) => {
    const point = localPoint(event)
    showTooltip({
      tooltipData: dataPoint,
      tooltipLeft: point.x,
      tooltipTop: point.y,
    })
  }}
  onMouseLeave={hideTooltip}
/>

{tooltipData && (
  <TooltipWithBounds left={tooltipLeft} top={tooltipTop}>
    {tooltipData.value}
  </TooltipWithBounds>
)}

Styling with Tailwind

visx renders SVG - style with className or inline styles:

<LinePath
  stroke="hsl(var(--primary))"
  className="transition-all duration-200"
/>

Reference

TODO

  • First real chart to establish patterns
  • Add area chart pattern
  • Add pie/donut pattern
  • Add animation patterns
  • Integrate with tRPC data fetching

Comments

Markdown supported