Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .changeset/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ Add a changeset for every user-visible package change:
pnpm changeset
```

All thirteen public Charts packages release as one fixed version. Documentation,
All twelve public Charts packages release as one fixed version. Documentation,
tests, benchmarks, and build-only changes do not need a changeset unless they
change the published package contract.
28 changes: 28 additions & 0 deletions .changeset/official-alpha.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
'@tanstack/charts': minor
---

Move TanStack Charts into official Alpha on the regular `0.x` release line.

Chart definitions now require Cartesian scales under `scales.x` and `scales.y`.
Polar definitions require `scales.angle` and `scales.radius`. The temporary
pre-Alpha root properties, runtime adapters, and development warnings have been
removed. Custom mark types should replace `ChartMarkX` and `ChartMarkY` with
`ChartMarkPointX` and `ChartMarkPointY`, imported from
`@tanstack/charts/mark/scale-values`. Polar layout callbacks should read the
reserved mappings from `layout.scales`.
Comment thread
coderabbitai[bot] marked this conversation as resolved.

Reserved scale entries are checked against the marks that use them at the
precise authored type boundary. A materialized dimension requires a configured
scale, while an unused dimension requires an explicit `null` entry. Runtime
validation still checks required reserved entries and channels that actually
materialize, but type-only scale ownership cannot be recovered after a custom
mark or stored definition has been erased.

Fresh built-in mark option literals now reject unsupported properties while
preserving typed channels, named scale IDs, and generic mark wrappers.

Exact-zero cells in diverging stacks now stay on their running positive or
negative baseline instead of drawing false spikes through lower area layers.
Pinned tooltips now dismiss when the pointer is pressed outside the chart and
tooltip, so pointer inspection resumes after focus leaves the chart.
77 changes: 49 additions & 28 deletions API-FRICTION.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ Each entry records:
| F-013 | Bar series identity also changed bar geometry | API | resolved |
| F-014 | Responsive nicing duplicates layout calculations | API | resolved |
| F-015 | Legacy scale helpers compete with the D3-first API | API | resolved |
| F-016 | Stats animated export still renders through Plot | Integration/API | resolved |
| F-016 | Stats animated export still renders through Plot | Integration/API | monitoring |
| F-017 | React migration rebuilt a static definition | Documentation | resolved |
| F-018 | Stats derivations still invalidate dynamic input | Application | resolved |
| F-019 | Custom tooltip formatting leaked float artifacts | Application | resolved |
Expand Down Expand Up @@ -298,7 +298,7 @@ Each entry records:
| F-259 | Chart resources cannot declare patterns | API | open |
| F-260 | Static guides cannot express stroke treatment | API | open |
| F-261 | Cartesian bars cannot round only exposed corners | API | open |
| F-262 | Mark inference accepted an unsupported style option | API | open |
| F-262 | Mark inference accepted an unsupported style option | API | resolved |
| F-263 | Chromium transport suspension interrupted catalog previews | Tooling | resolved |
| F-264 | Drillable sunbursts required rebuilding hierarchy rows | API/Documentation | resolved |
| F-265 | Sunburst motion lost hierarchy across enter and exit | API | resolved |
Expand Down Expand Up @@ -376,14 +376,18 @@ Each entry records:
had to describe an axis it could never materialize.
- Decision: derive each axis requirement from the marks' scale phantoms. A
materialized dimension requires a configured scale. A dimension whose marks
all expose `never` may be omitted or explicitly set to `null`, and rejects a
configured phantom axis. Mixed charts require every dimension materialized
by any constituent mark. The runtime mirrors the type contract and renders
guides only for configured axes.
all expose `never` requires an explicit `null` reserved entry and rejects a
configured phantom axis at the precise authored type boundary. Every
definition explicitly declares both reserved entries. Mixed charts require
every dimension materialized by any constituent mark. Runtime validation
requires both reserved entries, rejects `null` for channels that materialize,
and renders guides only for configured axes. It cannot recover type-only
scale phantoms after a custom mark or stored definition has been erased.
- Verification: focused type-contract and configured-scale tests cover
required Cartesian axes, mixed charts, omitted positionless axes, rejected
phantom axes, one-dimensional rules, runtime guards, and guide suppression.
Root typecheck passes.
required Cartesian axes, mixed charts, explicit null positionless axes,
rejected configured phantom axes, one-dimensional rules, deferred custom
marks, erased definitions, runtime guards, and guide suppression. Root
typecheck passes.

### F-004 — A radius channel silently imported continuous D3

Expand Down Expand Up @@ -659,7 +663,7 @@ Each entry records:

### F-016 — Stats animated export still renders through Plot

- Status: resolved
- Status: monitoring
- Severity: high
- Owner: Integration/API
- Observed in: TanStack Stats default-renderer cutover
Expand Down Expand Up @@ -1051,9 +1055,8 @@ Each entry records:
rectangle endpoints remain inferred, widened rectangle options remain
compatible, and custom marks and `ChartScale` retain the unchecked path.
Public `ChartMarkPointX`/`ChartMarkPointY` helpers expose interaction values
separately from `ChartMarkScaleX`/`ChartMarkScaleY`. The pre-existing
`ChartMarkX`/`ChartMarkY` names remain point aliases rather than silently
changing meaning. The explicit helpers ship from the advanced
separately from `ChartMarkScaleX`/`ChartMarkScaleY`. The explicit helpers
ship from the advanced
`mark/scale-values` subpath: exporting them from the ergonomic root changed
esbuild symbol ordering by 1–5 gzip bytes despite erasing at runtime, so the
exact ordinary-bundle gate rejected that shape.
Expand Down Expand Up @@ -4469,6 +4472,14 @@ Each entry records:
`tree/v<version>` and `blob/v<version>` links as release references, validates
their exact count, and advances them with the package version. The focused
regression counts only the matching version tag.
- `0.15.0` follow-up: all twelve shipped Intent skills still targeted 0.9.0.
Intent defines `metadata.library_version` as the source library version the
skill targets and reports drift against the currently published version. The
release synchronizer now includes every shipped `SKILL.md` with one exact
version reference. A focused regression discovers the shipped skill
directories and rejects any skill missing from the allowlist, then the normal
reference test checks that every tracked skill matches the current package
version.

### F-154 — Root barrels crossed the browser host boundary

Expand Down Expand Up @@ -7819,18 +7830,28 @@ Each entry records:

### F-262 — Mark inference accepted an unsupported style option

- Status: open
- Status: resolved
- Severity: medium
- Owner: API
- Observed in: hiding the unfocused dots in the themed area case 120
- Friction: `dot(rows, { opacity: 0 })` typechecked because the literal-
preserving generic options overload accepts extra keys, but `DotOptions`
does not own base `opacity` and the renderer silently ignored it. State
styles do accept `opacity`, so the boundary was especially easy to misread.
- Current decision: case 120 sets both `fillOpacity` and `strokeOpacity` to
zero, then restores them in focused states. Keep an exact-options check or a
consistent base-opacity contract open for the mark family; do not add a
runtime-only special case for dots.
- Decision: keep the distinct base style contracts and give public mark
factories fixed-key contextual option signatures. Per-property const
generics retain direct channel and named-scale inference, while fresh object
literals receive normal TypeScript excess-property checks. Generic
`Options` and `Options | undefined` forwarding wrappers remain assignable.
Predeclared structural supersets remain accepted, which matches standard
TypeScript behavior. The helpers are type-only and add no runtime code or
bundle weight.
- Verification: `cartesian-scale-types.test.ts` infers named scale IDs across
every Cartesian built-in factory and a polar mark, keeps reserved scale IDs
for explicit `undefined`, and compiles whole-options and optional forwarding
wrappers. Negative type checks reject fresh dot `opacity` and unknown keys
on Cartesian, composite, and polar factories. The focused strict TypeScript
compile and the full workspace `pnpm typecheck` pass.

### F-263 — Chromium transport and context churn interrupted catalog previews

Expand Down Expand Up @@ -8448,17 +8469,17 @@ Each entry records:
- Decision: make `scales` the canonical Cartesian and polar registry, reserve
`x`, `y`, `angle`, and `radius` as readable defaults, and let marks bind to
named entries. Each named scale declares its positional channel and guide
side. Axes support all four sides and stack when they share one side. Keep the
old root options only as temporary compatibility, warn once with exact
migration instructions, and remove the warning text from production bundles.
Preserve positional identity through composite channel namespacing and expose
the public resolved polar registry to length callbacks.
side. Axes support all four sides and stack when they share one side. The
pre-Alpha release kept the old root options temporarily and warned with exact
migration instructions. The Alpha API removes those options, their runtime
adapters, and their deprecated aliases. Preserve positional identity through
composite channel namespacing and expose the public resolved polar registry
to length callbacks.
- Verification: named scale, axis, grid, focus, facet, motion, composite, box,
regression, polar, and type-contract regressions pass. All authored examples,
benchmarks, fixtures, adapters, and docs use the canonical registry, while
focused compatibility tests are the only intentional legacy syntax. The full
1,920-test suite, workspace typecheck, documentation contract, and packed
package gate pass.
regression, polar, and type-contract regressions pass. Every TanStack Charts
definition in examples, benchmarks, adapters, tests, and docs uses the
canonical registry. Alpha residue checks find no root scale compatibility
types, runtime fallback, warning, or deprecated public alias.

### F-294 - Automatic mark renderers imposed shared host plumbing

Expand Down
30 changes: 16 additions & 14 deletions MARKETING.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
# TanStack Charts Marketing Strategy

Last updated: 2026-08-09
Last updated: 2026-08-26

## Status

The latest public pre-alpha release is TanStack Charts `0.15.0`. Repository docs,
examples, and the catalog follow unreleased `main` and may include contracts not
available in `0.15.0`; documentation at the verified release source revision is
the release record. Marketing must keep that distinction and the pre-alpha
status visible until the gates in [`PLAN.md`](./PLAN.md) are complete.
TanStack Charts is in official Alpha on `main`. The latest public release is
`0.15.0`. Repository docs, examples, and the catalog may include contracts not
available in that release, so documentation at the verified release source
revision remains the release record. Alpha is not a production-readiness claim,
and marketing must keep the compatibility limits in
[Alpha stability](./docs/stability.md) visible.

## Executive summary

Expand Down Expand Up @@ -44,7 +45,7 @@ responsive, accessible, server-rendered application charts.
library.

**Product type:** MIT-licensed open-source developer library. The current
package line is pre-alpha.
package line is Alpha.

**Core model:** Marks consume application data directly. Channels describe
visual encodings. Compact TanStack primitives and native D3 callables compose
Expand Down Expand Up @@ -461,7 +462,7 @@ about being "AI-native."
| The chart catalog is smaller than AG Charts, ECharts, or Nivo | Also correct. The product thesis is a composable grammar with interoperable primitives, not first-party ownership of every specialized chart type. |
| Why not use D3 or visx directly? | They provide the algorithms or primitives. TanStack supplies the application runtime: responsive layout, guides, scene compilation, lifecycle, interaction, accessibility, SSR, hydration, animation, and export. |
| Why not use Observable Plot? | Plot is the closest API inspiration and remains an excellent choice for concise exploratory visualization. TanStack is an independent implementation focused on typed application integration, composable capability-level imports, framework lifecycle, and stable interactive scenes. |
| Is it ready for production? | Not yet. `0.15.0` is a public pre-alpha release. Marketing must keep the documented release gates visible until they close. |
| Is it ready for production? | It is Alpha. Teams can evaluate it or adopt it with exact version pins and upgrade tests, but minor releases may contain breaking changes. Do not market Alpha as stable or production-ready. |
| Can it handle millions of live points? | Canvas is an explicit opt-in and keeps the same definition and interaction API while removing per-mark DOM cost. It still creates scene nodes and interaction points, default focus is linear without a spatial index, and overplotting does not become useful because the pixels are cheaper. Treat million-point streaming as a measured representation problem, not a renderer claim. |

## Anti-personas
Expand Down Expand Up @@ -587,17 +588,18 @@ production case study.

## Launch sequence

### Current proof phase
### Official Alpha

- Conversion: Install `0.15.0`, read its release-source docs, explore the catalog,
and report friction.
- Conversion: Install `0.15.0`, read its release-source docs, explore the
catalog, and report friction.
- Publish architecture, benchmarks, and working examples with limitations.
- Recruit a small number of chart-heavy TanStack users.
- Keep the migration guide and Alpha stability policy current with every
breaking minor release.

### Public alpha or beta
### Public beta

- Conversion: Install the prerelease and report friction.
- Publish migration guides and an API stability policy.
- Add packed-consumer, visual regression, accessibility, and browser benchmark
evidence.

Expand All @@ -618,7 +620,7 @@ tracked in [`PLAN.md`](./PLAN.md):
- Longitudinal, release-linked bundle-comparison results.
- Remaining Plot-backed animated export migration.
- Accessibility, locale, and RTL release gates.
- Release and compatibility policy.
- Stable-release compatibility policy.

## Goals

Expand Down
24 changes: 13 additions & 11 deletions PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Observed difficulty from using the API is tracked separately in
[`API-FRICTION.md`](./API-FRICTION.md). Production migrations, examples, and
agent evaluations must update that log when they expose a repeatable problem.

Last updated: 2026-08-06
Last updated: 2026-08-26

## Working thesis

Expand Down Expand Up @@ -380,7 +380,7 @@ Remaining production gaps are tracked by the open and monitoring entries in
Plot-backed GIF/WebM frame generator after the TanStack.com default-renderer
cutover.

`pnpm package:check` now builds real package artifacts, packs all three public
`pnpm package:check` now builds real package artifacts, packs all twelve public
packages, installs their tarballs into a disposable offline fixture, and gates
every ESM subpath, strict declaration inference, required dynamic input,
React/Octane runtime loading, and minimal production bundles. Every TanStack
Expand Down Expand Up @@ -1553,10 +1553,12 @@ export const downloadsChart = defineChart({
key: 'id',
}),
],
x: { scale: scaleUtc().domain(dateDomain) },
y: {
scale: scaleLinear().domain(downloadDomain).nice(),
label: 'Weekly downloads',
scales: {
x: { scale: scaleUtc().domain(dateDomain) },
y: {
scale: scaleLinear().domain(downloadDomain).nice(),
axis: { label: 'Weekly downloads' },
},
},
})
```
Expand Down Expand Up @@ -3140,11 +3142,11 @@ Exit criteria:

### Phase 2: minimal production core

Status: in progress. Package names, capability boundaries, packed-consumer
artifacts, automated visual and interaction conformance, production-browser
stress evidence, and bundle CI are established. Remaining productization gates
include public diagnostics, release compatibility policy, and published bundle
budgets.
Status: complete for Alpha and ongoing for production readiness. Package names,
capability boundaries, packed-consumer artifacts, automated visual and
interaction conformance, production-browser stress evidence, bundle CI, locked
budgets, and the Alpha compatibility policy are established. Public diagnostics
and stable-release policy remain productization work.

- Finalize public package and entry-point structure.
- Implement host lifecycle and diagnostics.
Expand Down
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

<div align="center">
<a href="#status">
<img alt="Status - PRE-ALPHA" src="https://img.shields.io/badge/status-pre--alpha-orange" />
<img alt="Status - ALPHA" src="https://img.shields.io/badge/status-alpha-yellow" />
</a>
<a href="https://twitter.com/tan_stack">
<img alt="Follow @TanStack" src="https://img.shields.io/twitter/follow/tan_stack.svg?style=social" />
Expand All @@ -39,10 +39,12 @@ server-rendered application charts.
<a id="status"></a>

> [!IMPORTANT]
> This README follows unreleased `main`. The latest published release is
> TanStack Charts `0.15.0`; use its
> This README follows unreleased `main`, the official Alpha line. The latest
> published release is TanStack Charts `0.15.0`; use its
> [release-source documentation](https://github.com/TanStack/charts/tree/v0.15.0/docs).
> It is pre-alpha and not ready for production use.
> Alpha releases use regular `0.x` versions and may contain breaking changes
> between minor releases. Pin an exact version for production use and read the
> [Alpha stability policy](./docs/stability.md) before upgrading.

Most chart libraries are easy until the chart stops being standard. TanStack
Charts gives you one typed grammar that can grow from a familiar line or bar
Expand Down
Loading