TanStack
Catalog

Horizontal ranking with long labels

bar

TanStack

benchmarks/conformance/cases/bar-horizontal-ranking/tanstack.ts
import { barX, defineChart, ruleX } from '@tanstack/charts'
import { rollups, sum } from 'd3-array'
import { scaleBand, scaleLinear } from 'd3-scale'
import type { CategoryPoint } from '../../shared/data'
import { categoryData, categoryTotalDomain } from '../../shared/data'
import { tanstackMount } from '../../shared/mount'
import type { ConformanceInput } from '../../types'

const definition = defineChart<ConformanceInput>()(({ input }) => {
  const rows = summarizeCategories(categoryData(input.revision)).sort(
    (left, right) => right.value - left.value,
  )

  return {
    marks: [
      barX(rows, {
        x: 'value',
        y: 'category',
        key: 'id',
        fill: '#7c3aed',
        inset: 1,
      }),
      ruleX([0]),
    ],
    x: {
      scale: scaleLinear().domain(categoryTotalDomain),
      label: 'Total value',
      ticks: 5,
      grid: true,
    },
    y: {
      scale: scaleBand<string>()
        .domain(rows.map((row) => row.category))
        .paddingInner(0.1)
        .paddingOuter(0.05),
      format: formatCategory,
    },
  }
})

export const mount = tanstackMount(
  definition,
  'Horizontal ranking with long labels',
)

function summarizeCategories(rows: readonly CategoryPoint[]) {
  return rollups(
    rows,
    (values) => sum(values, (row) => row.value),
    (row) => row.category,
  ).map(([category, value]) => ({
    id: category,
    category,
    value,
  }))
}

function formatCategory(value: unknown): string {
  switch (String(value)) {
    case 'Query':
      return 'TanStack Query — async data'
    case 'Router':
      return 'TanStack Router — routing'
    case 'Table':
      return 'TanStack Table — data grids'
    case 'Form':
      return 'TanStack Form — form state'
    case 'Start':
      return 'TanStack Start — full stack'
    case 'Virtual':
      return 'TanStack Virtual — large lists'
    case 'Store':
      return 'TanStack Store — client state'
    case 'DB':
      return 'TanStack DB — reactive data'
    default:
      return String(value)
  }
}