@tanstack/charts
Version:
A chart grammar for TypeScript and JavaScript. Marks consume your data directly, channels describe visual encodings, and the engine compiles them into a renderer-neutral keyed scene. TanStack's compact scales cover common numeric and categorical mappings.
181 lines (152 loc) • 4.19 kB
Markdown
---
title: Octane Quick Start
description: Install the Octane adapter, define a typed chart, render responsive SSR-safe SVG, and add native interaction.
---
Install TanStack Charts and its Octane peer:
```sh
pnpm add @tanstack/charts octane
```
The shared [Scales](../../concepts/scales-and-d3.md) page explains the
compact scale families and when a chart needs D3 instead.
Definitions are framework-independent and can be shared with any adapter:
```tsx group=octane-quick-start env=charts-octane file=/src/App.tsrx entry
import { scaleBand } from '@tanstack/charts/scales/band'
import { scaleLinear } from '@tanstack/charts/scales/linear'
import { barY, defineChart } from '@tanstack/charts'
import { tooltip } from '@tanstack/charts/tooltip'
import { Chart } from '@tanstack/charts/octane'
import { alphabet } from './data'
const percent = new Intl.NumberFormat('en-US', {
style: 'percent',
maximumFractionDigits: 1,
})
const letterFrequencyChart = defineChart({
marks: [
barY(alphabet, {
x: 'letter',
y: 'frequency',
}),
],
x: {
scale: () => scaleBand().padding(0.18),
},
y: {
scale: scaleLinear,
nice: true,
grid: true,
axis: {
label: 'Frequency',
ticks: { format: (value) => percent.format(value) },
},
},
tooltip,
})
export default function App() {
return (
<Chart
definition={letterFrequencyChart}
height={320}
ariaLabel="English letter frequencies"
/>
)
}
```
```ts group=octane-quick-start file=/src/data.ts collapsed
export interface AlphabetRow {
letter: string
frequency: number
}
export const alphabet: readonly AlphabetRow[] = [
{ letter: 'E', frequency: 0.12702 },
{ letter: 'T', frequency: 0.09056 },
{ letter: 'A', frequency: 0.08167 },
{ letter: 'O', frequency: 0.07507 },
{ letter: 'I', frequency: 0.06966 },
]
```
The definition infers the row, scale, and callback types. Normal TSRX authoring
does not need `Chart` generics or casts.
Use `height` for a fixed-height responsive chart:
```tsx
<Chart
definition={letterFrequencyChart}
height={320}
ariaLabel="English letter frequencies"
/>
```
Use `aspectRatio` when height should follow width:
```tsx
<Chart
definition={letterFrequencyChart}
aspectRatio={16 / 9}
initialWidth={720}
ariaLabel="English letter frequencies"
/>
```
The server scene uses `initialWidth`, then the shared host measures the actual
container after hydration. See
[](./adapter.md
```tsx
import { useMemo } from 'octane'
interface LetterFrequencyInput {
rows: readonly AlphabetRow[]
accent: string
}
export function LiveLetterFrequency({ rows, accent }: LetterFrequencyInput) {
const definition = useMemo(() => {
return defineChart({
marks: [
barY(rows, {
x: 'letter',
y: 'frequency',
fill: accent,
}),
],
x: {
scale: () => scaleBand().padding(0.18),
},
y: {
scale: scaleLinear,
nice: true,
},
svgAnimation: true,
tooltip,
})
})
return (
<Chart
definition={definition}
height={320}
ariaLabel="Filtered English letter frequencies"
/>
)
}
```
Octane tracks the values read by `useMemo`. Definition identity tells the chart
host when captured values changed. See
[](../../reference/chart-definitions.md).
```tsx
<Chart
definition={letterFrequencyChart}
height={320}
ariaLabel="English letter frequencies"
onFocusChange={(point) => {
if (point) {
console.log(point.datum.letter, point.yValue)
}
}}
onSelect={(point) => {
if (point) openLetter(point.datum.letter)
}}
/>
```
Grouped focus, tooltip formatting, keyboard behavior, and application-owned
interaction are documented in
[](../../reference/focus-and-interaction.md).
Continue with the [Octane adapter](./adapter.md) for lifecycle and SSR, the
[`Chart` reference](./reference/chart.md) for every prop, or the
[](../../reference/index.md).