---
id: "packages/active-charts/capabilities"
title: "Capabilities"
description: "What each chart family supports, per capability, and where the limits are."
url: "/packages/active-charts/capabilities"
locale: "en"
revision: "a63c2f024302b643"
---

# Capabilities

> [!NOTE]
> **The package's own guide**
>
> This page is the package's `docs/CAPABILITIES.md`, included unchanged from the
> package as it is in Foundation. Links to the package's internal design
> documents keep their text.

**Example: Every chart family**

Client: Runs entirely in your browser. Source: `examples/charts/families.tsx`.

```tsx
// apps/docs/examples/charts/families.tsx
'use client';

import {useState, type ReactNode} from 'react';
import {
  BEFORE_AFTER,
  DAILY_PRICES,
  DELIVERY_DAYS,
  DELIVERY_SPREAD,
  FLOW_LINKS,
  FLOW_NODES,
  FUNNEL,
  MILESTONES,
  MONTHLY_SALES,
  ORGANISATION,
  PRICE_VS_RATING,
  PRODUCT_TREE,
  PROFIT_BRIDGE,
  SALES_SERIES,
  SHARE_BY_REGION,
  SKILL_SERIES,
  SKILLS,
  TEMPERATURE_BAND,
  WEEKDAY_ORDERS,
} from '@/lib/examples/chart-data';

import {
  AreaChart,
  BarChart,
  BoxPlotChart,
  BulletChart,
  CandlestickChart,
  ChartDefaults,
  DumbbellChart,
  englishChartTranslator,
  FunnelChart,
  GaugeChart,
  HeatmapChart,
  Histogram,
  LinearGauge,
  LineChart,
  LollipopChart,
  NightingaleChart,
  OhlcChart,
  OrgChart,
  PieChart,
  RadarChart,
  RadialBarChart,
  RangeAreaChart,
  RangeBarChart,
  SankeyChart,
  ScatterChart,
  Sparkline,
  SunburstChart,
  TimelineChart,
  TreemapChart,
  WaterfallChart,
} from '@workspace/active-charts';
import {
  Field,
  FieldLabel,
} from '@workspace/active-ui/components/primitives/field';
import {
  NativeSelect,
  NativeSelectOptGroup,
  NativeSelectOption,
} from '@workspace/active-ui/components/primitives/native-select';

const H = 280;
const PRICE = {kind: 'price', currency: 'EUR', decimals: 2} as const;

/** Every public chart family, grouped by the archetype that shapes its props. */
const FAMILIES: Record<string, Record<string, () => ReactNode>> = {
  Cartesian: {
    Line: () => (
      <LineChart
        data={MONTHLY_SALES}
        xKey="month"
        xAxis="category"
        series={SALES_SERIES}
        legend
        height={H}
      />
    ),
    Area: () => (
      <AreaChart
        data={MONTHLY_SALES}
        xKey="month"
        xAxis="category"
        series={SALES_SERIES}
        stacked
        legend
        height={H}
      />
    ),
    Bar: () => (
      <BarChart
        data={MONTHLY_SALES}
        xKey="month"
        xAxis="category"
        series={SALES_SERIES}
        legend
        height={H}
      />
    ),
    Histogram: () => (
      <Histogram
        data={DELIVERY_DAYS}
        xKey="days"
        name="Orders"
        binCount={8}
        height={H}
      />
    ),
    Scatter: () => (
      <ScatterChart
        data={PRICE_VS_RATING}
        xKey="price"
        xAxis={{type: 'number', title: 'Price'}}
        yKey="rating"
        name="Products"
        yAxis={{title: 'Rating'}}
        height={H}
      />
    ),
    Candlestick: () => (
      <CandlestickChart
        data={DAILY_PRICES}
        xKey="date"
        xAxis={{temporalSemantic: 'calendarDate'}}
        openKey="open"
        highKey="high"
        lowKey="low"
        closeKey="close"
        name="Price"
        yAxis={{valueSemantics: PRICE}}
        height={H}
      />
    ),
    OHLC: () => (
      <OhlcChart
        data={DAILY_PRICES}
        xKey="date"
        xAxis={{temporalSemantic: 'calendarDate'}}
        openKey="open"
        highKey="high"
        lowKey="low"
        closeKey="close"
        name="Price"
        yAxis={{valueSemantics: PRICE}}
        height={H}
      />
    ),
    'Range area': () => (
      <RangeAreaChart
        data={TEMPERATURE_BAND}
        xKey="month"
        xAxis="category"
        yLowKey="low"
        yHighKey="high"
        name="Temperature"
        height={H}
      />
    ),
    'Range bar': () => (
      <RangeBarChart
        data={TEMPERATURE_BAND}
        xKey="month"
        xAxis="category"
        yLowKey="low"
        yHighKey="high"
        name="Temperature"
        height={H}
      />
    ),
    'Box plot': () => (
      <BoxPlotChart
        data={DELIVERY_SPREAD}
        xKey="carrier"
        xAxis="category"
        minKey="min"
        q1Key="q1"
        medianKey="median"
        q3Key="q3"
        maxKey="max"
        outliersKey="out"
        name="Delivery days"
        height={H}
      />
    ),
    Dumbbell: () => (
      <DumbbellChart
        data={BEFORE_AFTER}
        xKey="team"
        xAxis="category"
        yLowKey="before"
        yHighKey="after"
        lowName="2025"
        highName="2026"
        height={H}
      />
    ),
    Lollipop: () => (
      <LollipopChart
        data={MONTHLY_SALES}
        xKey="month"
        xAxis="category"
        yKey="online"
        name="Online"
        height={H}
      />
    ),
    Waterfall: () => (
      <WaterfallChart
        data={PROFIT_BRIDGE}
        xKey="step"
        yKey="amount"
        kindKey="kind"
        name="Profit"
        height={H}
      />
    ),
    Heatmap: () => (
      <HeatmapChart
        data={WEEKDAY_ORDERS}
        xKey="day"
        yKey="part"
        colorKey="orders"
        name="Orders"
        label={{enabled: true}}
        height={H}
      />
    ),
  },
  Categorical: {
    Pie: () => (
      <PieChart
        data={SHARE_BY_REGION}
        valueKey="value"
        categoryKey="region"
        name="Share"
        legend
        height={H}
      />
    ),
    Funnel: () => (
      <FunnelChart
        data={FUNNEL}
        valueKey="count"
        categoryKey="stage"
        name="Visitors"
        height={H}
      />
    ),
    'Radial bar': () => (
      <RadialBarChart
        data={SHARE_BY_REGION}
        valueKey="value"
        categoryKey="region"
        name="Share"
        height={H}
      />
    ),
    Nightingale: () => (
      <NightingaleChart
        data={SHARE_BY_REGION}
        valueKey="value"
        categoryKey="region"
        name="Share"
        legend
        height={H}
      />
    ),
    Radar: () => (
      <RadarChart
        data={SKILLS}
        categoryKey="skill"
        series={SKILL_SERIES}
        min={0}
        max={10}
        legend
        height={H}
      />
    ),
  },
  'Hierarchy and flow': {
    Treemap: () => <TreemapChart data={PRODUCT_TREE} height={H} />,
    Sunburst: () => <SunburstChart data={PRODUCT_TREE} height={H} />,
    Sankey: () => (
      <SankeyChart nodes={FLOW_NODES} links={FLOW_LINKS} height={H} />
    ),
    'Organisation chart': () => (
      <OrgChart data={ORGANISATION} direction="horizontal" height={320} />
    ),
    Timeline: () => <TimelineChart data={MILESTONES} height={220} />,
  },
  Scalar: {
    Gauge: () => (
      <GaugeChart
        value={72}
        min={0}
        max={100}
        zones={[
          {from: 0, to: 40, color: 'var(--chart-negative)', label: 'low'},
          {from: 40, to: 75, color: 'var(--chart-caution)', label: 'fair'},
          {from: 75, to: 100, color: 'var(--chart-positive)', label: 'good'},
        ]}
        label="Satisfaction"
        height={220}
      />
    ),
    'Linear gauge': () => (
      <LinearGauge
        value={68}
        min={0}
        max={100}
        target={75}
        label="Budget used (%)"
        height={120}
      />
    ),
    Bullet: () => (
      <BulletChart
        value={82}
        min={0}
        max={120}
        target={100}
        label="Orders vs target"
        height={90}
      />
    ),
    Sparkline: () => (
      <Sparkline
        data={MONTHLY_SALES.map((row) => row.online)}
        width={220}
        height={48}
        type="area"
        showLastPoint
      />
    ),
  },
};

const ALL = Object.entries(FAMILIES).flatMap(([group, members]) =>
  Object.keys(members).map((name) => ({group, name})),
);

/** The public chart families, each with small fixed data; pick one to draw it. */
export default function ChartFamilies() {
  const [choice, setChoice] = useState('Cartesian/Line');
  const [group, name] = choice.split('/') as [string, string];
  const render = FAMILIES[group]![name]!;
  return (
    <div className="flex w-full flex-col gap-4">
      <Field className="max-w-xs">
        <FieldLabel htmlFor="chart-family">Chart family</FieldLabel>
        <NativeSelect
          id="chart-family"
          className="w-full"
          value={choice}
          onChange={(event) => setChoice(event.target.value)}
        >
          {Object.keys(FAMILIES).map((g) => (
            <NativeSelectOptGroup key={g} label={g}>
              {ALL.filter((entry) => entry.group === g).map((entry) => (
                <NativeSelectOption
                  key={entry.name}
                  value={`${g}/${entry.name}`}
                >
                  {entry.name}
                </NativeSelectOption>
              ))}
            </NativeSelectOptGroup>
          ))}
        </NativeSelect>
      </Field>
      <ChartDefaults locale="en-GB" t={englishChartTranslator}>
        <div key={choice} data-chart-family={choice}>
          {render()}
        </div>
      </ChartDefaults>
    </div>
  );
}
```

**Peildatum: 2026-10-07.** Dit is de ene gedateerde autoriteit voor wat
`@workspace/active-charts` ondersteunt, met welk bewijs en met welke bekende
beperking. Een claim elders in de documentatie die hier niet staat, is geen
claim. Het document doet geen uitspraak over andere bibliotheken; de
vergelijking staat in `COMPETITIVE-ANALYSIS.md`.
Hoe een optie precies heet en welke voorrang zij heeft, staat in
`API.md`; hier staat wat er werkt en waarop dat rust.

**Level 1** is de enterprise-algemene basis: wat een chartbibliotheek voor
bedrijfsdashboards en rapporten binnen de beoogde scope van dit pakket moet
kunnen, elk met reproduceerbaar bewijs (ADR-040). **Level 2**
is de geautoriseerde uitbreiding daarop: selectie, gekoppelde weergaven en de
compound-navigator (ADR-041 scope,
ADR-042 contracten). De thema's daarna beschrijven de
configureerbaarheid en de familiedekking die binnen dezelfde contracten zijn
toegevoegd. De presentatiebudgetten (ADR-037,
ADR-038) staan in `QUALITY-BUDGETS.md`;
de prestatiebudgetten en de trigger voor een andere renderer of incrementele
updates in `PERFORMANCE.md` § Budgetten.

Drie dingen worden uit elkaar gehouden:

1. **Implementatie**: gebouwd en in het publieke contract.
2. **Geautomatiseerd bewijs**: tests die in deze repository opnieuw draaien.
3. **Menselijk AT-bewijs**: opgenomen runs met een echte schermlezer.

**Menselijk AT-bewijs ontbreekt nog.** De runs op de W6-matrix (NVDA met
Chrome of Edge, VoiceOver met Safari) zijn niet uitgevoerd (ROADMAP AC-V4).
Alle toegankelijkheidsregels hieronder rusten op geautomatiseerd bewijs:
rollen, namen, tabellen, toetsenbord en aankondigingen in een echte browser.
Er wordt niets geclaimd over hoe een schermlezer het voorleest. Dat geldt voor
elk thema in dit document.

## Bewijssoorten

Elke code is hier één keer gedefinieerd en betekent overal hetzelfde. Een
naam van een bouwstap (BC2, T5, P8A) is nooit een bewijscode; waar zo'n naam
nog voorkomt, is het herkomst.

| Code | Wat |
| --- | --- |
| Unit | Vitest in jsdom: pure logica, gerenderde componenten en interactie, typecontracten (`*.test-d.tsx`): `pnpm --filter @workspace/active-charts test` |
| Browser | Echte browser via Playwright, zonder retries: Chromium volledig, Firefox op de `@cross-engine`-subset (`test:browser`: gedrag, consumentencorpus, screenshotmatrix, metingen) |
| Bench | Benchmark met budgetten, Chromium, geen retries: `benchmark:browser` (`PERFORMANCE.md`) |
| Mutatie | Mutatieproef: een bewuste breuk van de invariant laat een test falen; de gedode en equivalente mutanten staan per afsluiting in `DONE.md` |
| Contract | Bron- of registercontract in Vitest, waar een runtimeproef onpraktisch is |
| Gate | Repositorygate in `pnpm check` (`packages/repo-tools/src/checks/`), met eigen gedragsproef |
| Doc | Uitvoerbare documentatie: elk TypeScript-voorbeeld van README, API, recepten en ACCESSIBILITY wordt tegen de publieke API getypecheckt (`src/__tests__/doc-examples.test.ts`) |

**Status** zegt alleen wat vandaag geldt: `ondersteund` (in het publieke
contract en bewezen), `gedeeltelijk`, `gemeten` (een meting zonder belofte),
`bewijs, geen belofte` of `niet aanwezig`. Elk thema sluit af met de bekende
beperkingen die niet bij één rij horen: wat bewust niet of nog niet bestaat.

## Level 1: de enterprise-algemene basis

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| Lijn, spline, area, staaf/kolom, scatter/bubble, taart/donut, combinatie | ondersteund | Unit, Browser, Mutatie | — |
| Stapelen met gemengde tekens; verborgen serie herstapelt (W2) | ondersteund | Unit, Browser, Mutatie | — |
| Percentagestapels uit ruwe waarden, staaf en area (W9); het aandeel hoort alleen bij het lid (ADR-048) | ondersteund | Unit, Browser, Bench, Mutatie | de navigator toont de ruwe waarden, niet de aandelen (bewust, ADR-042); ruw tegenover getoond per pad: ARCHITECTURE § 8.7 |
| Ingezoomde waterval behoudt het lopende totaal van de bronrijen, ook naast een percentagestapel (PH3-02, ADR-048) | ondersteund | Unit, Browser, Mutatie | — |
| Categorie-, tijd-, ordinal-time-, log-, sqrt- en omgekeerde assen | ondersteund | Unit, Browser | — |
| Twee y-assen: één binding voor domein, tekening, hit, tooltip, tabel, referentielijn | ondersteund | Unit, Browser, Bench, Mutatie | meer dan twee assen en onafhankelijke x-assen: buiten scope (ADR-041); wrappers geven beide y-assen één `yAxis`; het label van een referentielijn staat boven de series (PH6-01) |
| Waarheidsgetrouwe reductie en groepering (W3, W4) | ondersteund | Unit, Browser, Bench | Canvas en incrementele updates bestaan niet; de trigger staat in PERFORMANCE § Budgetten |
| Tooltip (single, shared, split, pin), ook op compound-glyphs | ondersteund | Unit, Browser | bereikvlak, bereikstaaf, boxplot en histogram nemen alleen `single` (ADR-085, API § 3.1); de gedeelde tooltip snapt binnen zijn afstand (bewust) |
| Legenda: toggle, isoleren, dynamische series, dichte legenda | ondersteund | Unit, Browser, Mutatie | — |
| Headless legenda (ADR-105): `useChartLegend()` en `legendLink` op elke familie met een discrete legenda; entries op identiteit met sleutel zoals getekend en beschikbare acties; één legendaroute, ook voor de host; `onLegendChange` op identiteit | ondersteund | Unit, Browser, Mutatie | alleen discrete sleutels (een kwantitatieve sleutel blijft in de chart); geen gecontroleerde zichtbaarheid |
| Toetsenbord per archetype, compound als één stop | ondersteund | Unit, Browser | menselijke AT-runs ontbreken |
| Datavervanger (schermlezertabel) voor elke ondersteunde familie | ondersteund | Unit, Browser, Mutatie | sparkline decoratief (W6); menselijke AT-runs ontbreken |
| Aankondigingen (legenda, zoom, stappen, compound, gegroepeerd, contextmenu); de recentste bron spreekt (ADR-052) | ondersteund | Unit, Browser, Mutatie | menselijke AT-runs ontbreken; de standalone families kondigen hun contextmenu niet aan |
| Eén contextmenu in elke familie behalve de Sparkline, op Base UI zoals de grid (ADR-087): toetsenbord, aanwijzer, lange druk en een optionele menuknop; hostitems eerst met één bevroren context (element, legenda-item of chart); kopiëren, reset zoom, reeksen (verbergen, alleen dit, alles), export; scalairen alleen export; 44 px onder een grove aanwijzer | ondersteund | Unit, Browser, Mutatie | — |
| Export SVG/PNG/PDF met voltooiing en falen, stil beeld, rapporttekst (W11); legenda en rapporttekst leesbaar in PDF onder `oklch()`-tokens (FAM-V2-T6) | ondersteund | Unit, Browser, Mutatie | PDF-tekst: zie de rij PDF-tekst en exportfonts; zonder exportfontset: PNG-hostfont alleen bij same-origin `@font-face` met `url()` (met een set: de rij SVG- en PNG-exportfonts); export draait in de browser; materialisatiegrens: API § 4 |
| Exportresultaat (ADR-105): elke export geeft haar ene bestand (`ChartExportResult`), gedownload of met `download: false` alleen teruggegeven; `onExportComplete(result)`; `font-fallback`; de formaten van het exportsubmenu per chart (`contextMenu.features.export`) | ondersteund | Unit, Browser, Mutatie | — |
| Export over een datawijziging: één moment; legenda en tekening uit dezelfde commit (ADR-053) | ondersteund | Unit, Browser, Mutatie | CSV schrijft de rijen van de laatste commit bij de aanroep; wat na het capture-moment verandert, staat niet in het bestand |
| Niet-Latijns schrift (Cyrillisch, Grieks, Arabisch, Japans, Koreaans) in SVG en PNG; PDF: zie de rij PDF-tekst en exportfonts | bewijs, geen belofte | Browser (Chromium; SVG ook Firefox) | PNG zonder exportfontset: tekens buiten het ingebedde webfont tekenen in het standaardfont van de browser, niet in een `local()`-terugval van de pagina (CH-6 in de inherit-modus; met een set deterministisch); PDF weigert Arabisch |
| PDF-tekst en exportfonts (ADR-058): één exportfontmodel (`ChartExportFonts`: bytes of een lazy hostloader, gewichten en stijlen, families in terugvalvolgorde); `ChartDefaults.exportFonts`, een expliciete aanroep wint, `'inherit'` slaat over, ook in het contextmenu; per tekstelement de eerste familie die het volledig dekt; zonder fonts Helvetica met alleen WinAnsi; getypeerde weigering (`ChartExportError.code`) van complexe schriften, combinerende tekens, joiners en selectors, emoji en het supplementaire vlak | ondersteund | Unit, Bench (Chromium; `@cross-engine` Firefox) | alleen TrueType (geen WOFF, WOFF2, CFF of collectie; geen variabele assen); geen terugval per teken binnen één element; geen vormgeving: gevormde PDF is hostbezit (L3b); een exportfont met een andere metriek dan het live font kan tekst verschuiven (geen herlay-out) |
| SVG- en PNG-exportfonts (ADR-059): dezelfde `ChartExportFonts` en dezelfde voorrang, ook in beide contextmenu's; SVG noemt de families vóór de live stack en bedt met `embedInSvg` elke face in als `@font-face`-data-URL; PNG bedt elke face van elke familie in en valt per glyph terug over de families van de host vóór een systeemfont; TrueType, OpenType CFF, WOFF en WOFF2; geen netwerk, loaders vóór het capture-moment | ondersteund | Unit, Bench (Chromium; `@cross-engine` Firefox) | zonder set blijft PNG best effort (CH-6 in de inherit-modus); geen herlay-out; de browser kiest per glyph en vormt, het pakket niet; ingebedde faces in SVG gelden in browsers, andere kijkers mogen ze negeren; collecties en onbekende bytes geweigerd; bewezen in Chromium en Firefox, niet in Safari |
| Exportgarantietrappen (ADR-060): L0 CSV (elk schrift, logisch, zonder richtingstekens); L1 live (browser); L2 SVG en PNG; L3a PDF (ingebedde TrueType, Latijn, Grieks, Cyrillisch, Armeens, Georgisch, Han, Kana, Hangul; de rest geweigerd met een code); L3b-raster en L3b-print als hostrecepten; per schrift en route in EXPORT-GUARANTEES.md | ondersteund | Contract (`export-script-matrix.contract.test.ts` tegen charts en grid), Bench (`e2e/export-fonts.spec.ts`, Chromium en `@cross-engine` Firefox) | L3b is geen pakketfunctie; L3b-print is eenmaal in een onderzoeksharnas geverifieerd (Chromium 153, Windows) en blijft een hostclaim; een PDF met Arabisch, Hebreeuws, Indisch schrift of emoji is een hostroute |
| CSV ruw, ook voor hiërarchie, stroom, organigram, tijdlijn, scalair, sparkline (W4, W11) | ondersteund | Unit, Browser, Mutatie | — |
| Richting en bidi (ADR-056): `dir` expliciet of geërfd, nooit uit de locale; contextmenu, tooltip en schermlezertabel dragen de richting; namen en waarden geïsoleerd; export behoudt `direction`/`unicode-bidi`; CSV zonder bidi-tekens | ondersteund | Unit, Bench (Chromium, Firefox) | — |
| RTL-chrome (ADR-057): gespiegelde legenda en legendapijlen, tooltip aan de inline-eindzijde, contextmenu en submenu met gespiegelde toetsen, richtingsbewuste ankers, referentielabel aan het inline-einde, rapporttekst en legenda in de export; assen, datavolgorde, navigator en plottoetsen onveranderd | ondersteund binnen de geteste reikwijdte | Unit, Bench (Chromium; `@cross-engine` Firefox) | geautomatiseerd browserbewijs, geen menselijke AT-sessie en geen fysiek apparaat; Playwright-WebKit is niet geclaimd |
| Tekstmeting en segmentatie (ADR-057): labels gemeten in het geschilderde font (gewicht, stijl, richting, letterafstand, kerning), opnieuw na een fontlading; graphemeveilig afkappen; rapportafbreking met CJK-breekpunten en zonder breuk bij NBSP/NNBSP | ondersteund | Unit, Bench (Chromium, Firefox) | meting is die van de renderende browser; geen variabele-fontassen, geen regelbreekmotor |
| Afnemer buiten deze repository (ADR-061): uit een verpakt artefact in een schone Vite + React-app zonder werkruimte, Next, active-ui, Tailwind of hoststylesheet: rendering, legenda, tooltip, contextmenu, schermlezertabel, rtl-chrome, twaalf schriften, locales met inheemse cijfers, en de exporttrappen van ADR-060 | bewijs, geen belofte | Browser (Chromium, Firefox, WebKit, in een tijdelijke afnemer) | eenmalige proef, geen staande suite; de artefactbouw zelf is geen product; menselijke AT en moedertaallezer niet gedaan (AC-V4, PORT-V1) |
| Lege toestand en niet-beschikbare toestand bij contractschendende invoer (W12) | ondersteund | Unit, Browser, Mutatie | alleen de genoemde contracten worden getoetst (ADR-040); onverwachte fouten gaan naar de error boundary van de host |
| Woorden van de host, geen Engelse terugval (W13); Engels alleen als bewust meegegeven `englishChartTranslator` | ondersteund | Unit, Mutatie | een host die een verkeerde vertaler meegeeft wordt niet gezien (ADR-028, ADR-051) |
| Leesbaarheid op smalle breedte: tekstvloer, degradatie, randlabels (W8, PH5-01) | ondersteund | Browser, Mutatie | — |
| Categorisch palet, donkere modus, onderscheid, on-fill; stabiel onder accentthema's (W7, W18) | ondersteund | Browser, Mutatie | — |
| Geforceerde kleuren en verminderde beweging over elke familie: lijnen met streeppatroon, staven, bins en watervalstappen in systeemkleuren met passende legendasleutels (CH-26), heatmapklassen als naam (CH-27), kaarsen hol op en gevuld neer, bereikstaven per reeks (CH-28), foutstaven, de losse families | ondersteund | Browser, Mutatie | area-vullingen zijn omtrekken; vanaf de zesde staafreeks herhalen de systeemkleuren; alleen Chromium- en Firefox-emulatie, geen Windows Hoog contrast (AC-V6) |
| Opruimen na unmount: observers, timers, frames, listeners, ontkoppelde DOM, heap; ook een dicht dashboard met exports (FAM-V2-T6) | ondersteund | Browser, Bench, Mutatie | heapmeting alleen Chromium, als trend binnen een tolerantie (cleanupsuite 2 MB over drie cycli; dichtheidsbench 12 cycli) |
| Dicht dashboard (24 charts, ~14.800 getekende markeringen) binnen het compositiebudget; gesimuleerd zwakker profiel (4x, 6x) gemeten | gemeten | Bench | CPU-throttling in Chromium, geen fysiek toestel; geen budget voor het gesimuleerde profiel (`PERFORMANCE.md`) |
| Gedocumenteerde prestatiebudgetten voor de aanvaarde workloads | ondersteund | Bench | één machine; een ander toestel is een andere meting |
| Touch en smalle breedte: scrollen tegen slepen, pinch, pan, lange druk, navigator-brush, draaien; 390 en 320 px | bewijs, geen belofte | Browser (geëmuleerd in Chromium), Mutatie | geen fysiek toestel; geen ondersteuningsbelofte; bewijsrecord in `accessibility/EVIDENCE.md` |
| Uitvoerbare documentatievoorbeelden | ondersteund | Doc | lijsten en fragmenten zijn gemarkeerd en worden niet gecompileerd |
| Menselijk schermlezerbewijs (NVDA, VoiceOver) | **niet aanwezig** | — | AC-V4: uitvoering door een mens (`accessibility/BROWSER-AT-CHECKLIST.md` § Human handoff) |

## Level 2: selectie, gekoppelde weergaven en navigator

Scope ADR-041, contracten ADR-042. De
selectie op de losse families staat onder § Activering en selectie.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| Selectie van items, gecontroleerd en ongecontroleerd, op logische identiteit | ondersteund | Unit, Browser, Bench, Mutatie | `<Chart>`, de dertien Cartesische wrappers en de negen losse families van § Activering en selectie; organigram, tijdlijn, scalairen en sparkline niet |
| Eén `seriesId` per serie: een gedeclareerde `id` botst nooit met een afgeleide of positionele identiteit (ADR-049) | ondersteund | Unit, Browser, Mutatie | een herhaalde identiteit heet naar haar volgorde (`#2`); een serie zonder waardesleutel naar haar positie |
| Selectie en activering met aanwijzer en toetsenbord; focus is geen selectie | ondersteund | Unit, Browser, Mutatie | menselijke AT-runs ontbreken |
| Geselecteerde toestand niet-visueel: tabel, aankondiging, beschrijving; geforceerde kleuren | ondersteund | Unit, Browser, Mutatie | menselijke AT-runs ontbreken |
| Gegroepeerde bucket als item met interval; verborgen, weggezoomd of hergroepeerd is inactief | ondersteund | Unit, Browser, Mutatie | — |
| Events `onSelectionChange` en `onItemActivate`, geen eventbus | ondersteund | Unit, Browser | — |
| Gecontroleerde waarheid en invoerbron (ADR-105): `requested` op selectie en inklappen, de hostprop is de waarheid; `pointer`, `touch` en `keyboard` als bron | ondersteund | Unit, Browser, Mutatie | — |
| Gekoppelde positie en x-bereik op waarde in een `SyncGroup`, ook met andere rijen en maten | ondersteund | Unit, Browser, Bench, Mutatie | selectie wordt niet gekoppeld; alleen categorie, getal en tijd van dezelfde semantiek |
| Geen terugkoppeling; een lid dat verdwijnt laat niets achter; niet-leden onberoerd | ondersteund | Unit, Browser, Mutatie | — |
| Navigator tekent compound-series met hun omvang, verborgen series niet, gaten en pieken behouden | ondersteund | Unit, Browser, Bench, Mutatie | — (de brush leest zijn pixels door de schaal, valt ook bij onregelmatige rijen op de lijn en volgt `reversed`; CH-7) |
| Navigatorbereik, groepering, tooltip, tabel, toetsenbord en koppeling lezen hetzelfde venster | ondersteund | Browser, Mutatie | — |

## Waardebetekenis en labels

Besluiten: ADR-089 (waardebetekenis, wrapperpariteit),
ADR-091 (labelrollen, terugloop),
ADR-103 (staafplaatsing, trechtercontext). Detail: API § 10.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| `valueSemantics` (`ChartValueSemantics`) op de twaalf numerieke losse families: labels, schalen, uitlezing, tooltip, tabel en aankondiging in één declaratie; rolformatter en `tooltip.valueFormatter` winnen; een aandeel blijft procent; CSV en Copy value ruw | ondersteund | Unit, Browser, Mutatie | naam van tegel, boog en knoop krijgt geen waarde erbij |
| Cartesische datalabels (staaf, waterval, lijn, scatter, histogram) zonder formatter lezen de waardesemantiek van serie of y-as, anders het kale getal (CH-21); het aandeel in de taart- en trechtertooltip is altijd procent, ook zonder declaratie en naast `tooltip.valueFormatter` (CH-22) | ondersteund | Unit, Mutatie | een percentagestapel houdt zijn aandeellabels |
| Wrapperpariteit: puntlabels op lijn, scatter en histogram; `visible` en `showInLegend` op elke wrapperserieconfig; `annotations` op elke Cartesische wrapper, op de vier liggende families alleen rechtop | ondersteund | Unit, Browser, Mutatie | een wrapper met één serie neemt geen `visible`; een vlak, bereik, box, dumbbell, lollipop of financieel glyph tekent geen waardelabel |
| Labelrollen: vlak en lollipop (`label`), bereikstaaf, bereikvlak en dumbbell (`label.endpoints`, rol in de formattercontext), rollen vast onder een omgekeerde as en liggend, met asruimte; de vlakwaarden van alle reeksen en de stapeltotalen van een plot nemen één botsingsbeslissing (NEW-01) | ondersteund | Unit, Browser, Mutatie | één plaats per label, geen binnenplaatsing; lollipop, bereik en dumbbell beslissen per reeks; een buitenlabel kan op het merk van een andere familie vallen (CH-25) |
| Terugloop van categorielabels (`wrap`): heel teruggelopen, dan draaien, dan de laatste regel afgekapt; volle naam in `<title>`; rtl en CJK; lay-out reserveert de regels; tijd- en getalassen ongewijzigd | ondersteund | Unit, Browser, Mutatie | geen afbreekstreepjes; de definitieve ronde loopt niet verder terug dan de voorlopige reserveerde |
| Staaf: `'inside-end'` en `'inside-base'` op semantische einden voor beide tekens, beide oriëntaties, een omgekeerde as, stapel- en procentstapelsegmenten; zonder ruimte naar buiten (`auto`) of verborgen; geen kleiner font | ondersteund | Unit, Browser, Mutatie | niet op de waterval (bewust, ADR-103) |
| Staaf: `label` per reeks in `BarChart` vervangt het chartlabel als heel object; wrapper en `<Chart>` plaatsen gelijk | ondersteund | Unit, Browser, Mutatie | — |
| Trechter: `dataLabels.formatter(value, context?)` met rij, bronindex, `shareOfFirst` en `shareOfPrevious` over de zichtbare stappen; één tekst in label, tabel en aankondiging; tooltip en CSV ongewijzigd | ondersteund | Unit, Browser, Mutatie | geen ingebouwde modus "aandeel van de vorige": de context draagt het getal (bewust) |

## Identiteit, markers en legenda

Besluiten: ADR-090 (markervormen, legenda),
ADR-091 (exportlegenda), ADR-093
(renderpariteit, toegankelijke naam). Detail: API § 10.7.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| Markervormen (`MarkerShape`: cirkel, vierkant, ruit, driehoek, omgekeerde driehoek) op lijn- en vlakmarkers, scatter en bubbel, lollipop, dumbbell, radarhoekpunten en tijdlijn; elke vorm heeft het oppervlak van de cirkel; legendasleutel, tooltipsleutel, aandachtsknoop, toetsenbordcue, export en geforceerde kleuren volgen de vorm | ondersteund | Unit, Browser, Mutatie | geen vorm per datum, geen beeld of pad; de aanwijzer treft het dichtstbijzijnde punt, niet de getekende omtrek |
| Automatische markervorm alleen waar kleur niet volstaat: vanaf het zevende standaardpaletslot of waar een hostpalet zich herhaalt (de trigger van het streeppatroon, ADR-038); expliciet wint; een kleur krijgt binnen vier herhalingen nooit twee keer dezelfde vorm | ondersteund | Unit, Browser, Mutatie | dumbbell, radar en tijdlijn alleen expliciet |
| `legend.align` (`start`, `center`, `end`) langs elke zijde, logisch onder rtl, ook in de export | ondersteund | Unit, Browser, Mutatie | geen offsets of zwevende legenda (beleid) |
| Stapelvolgorde als leesvolgorde: legenda en gedeelde tooltip van een gestapelde staaf of vlak lezen de stapel zoals het oog hem ziet, ook bij negatieve, gemengde en procentstapels, liggend en onder rtl | ondersteund | Unit, Browser, Mutatie | de legenda leest één volgorde voor alle categorieën; een lid met beide tekens leest aan de positieve kant |
| Smalle terugval van een zijlegenda: onder de chart waar ernaast minder dan 240 px overblijft, terug zodra er ruimte is, zonder heen-en-weer; export volgt de tekening; een kolom wordt niet smaller dan haar breedste naam (CH-16) | ondersteund | Unit, Browser, Mutatie | de drempel is één vaste ondergrens voor elke familie, geen meting van de plot per familie |
| Exportlegenda met het streeppatroon van een lijn (expliciet of automatisch), ook met een markervorm, in SVG, PNG en PDF (CH-23) | ondersteund | Unit, Browser, Mutatie | — |
| Legenda-renderpariteit van OHLC, boxplot, bereikvlak en bereikstaaf (QR-2) | ondersteund | Browser | — |
| Toegankelijke naam en identiteit: scalaire naam met bereik, ontbrekend categorisch is "(no value)", hiërarchie-id's los van het label, lege naam is geen naam, de sparkline benoembaar (CH-10) | ondersteund | Unit, Browser, Mutatie | — |

## Assen, zoom en dradenkruis

Besluiten: ADR-093; zachte grenzen staan onder § Overlays,
foutstaven en zones.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| Zoom (slepen, wiel, pannen, knijpen, navigator) volgt omgekeerde, logaritmische en ongelijk verdeelde schalen; een vastgepinde tooltip blijft op zijn rij (CH-7, CH-8) | ondersteund | Unit, Browser, Mutatie | — |
| Een losse asgrens voorbij de data keert de as niet om (genegeerd en gemeld); een niet-eindige grens is ongeldig (CH-12) | ondersteund | Unit, Browser, Mutatie | — |
| Dradenkruis: hulplijn en aflezing noemen dezelfde grootheid, per oriëntatie (LAB-AT4); een gestapeld segment en een watervalstap lezen de aswaarde aan hun einde (CH-29) | ondersteund | Unit, Browser, Mutatie | — |

## Stapels

Besluiten: ADR-091, ADR-093. Mengtekens en
percentagestapels: § Level 1. Detail: API § 10.8.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| `stackGroup` op staaf- en vlakreeksen: staafgroepen naast elkaar in de categorie, elk met eigen basislijn, procentbasis, tooltiptotaal en stapeltotaal; vlakgroepen elk vanaf de eigen basislijn | ondersteund | Unit, Browser, Mutatie | geen geneste groepen; vlakgroepen tekenen over dezelfde x |
| Staafkolommen zonder `stackGroup`: een stapel naast ongestapelde staven krijgt eigen kolommen; een totaal of vlakwaarde wijkt voor een vreemde staaf (CH-24, CH-25) | ondersteund | Unit, Browser, Mutatie | de labellagen per reeks (lollipop, bereik, dumbbell) toetsen geen vreemde merken |
| `stackTotal`: één netto totaal per stapel en categorie, voorbij het einde waar het teken heen wijst, in de tabel en de aankondiging, met asruimte aan het domeineinde; niet op een procentstapel | ondersteund | Unit, Browser, Mutatie | één plaats: botst of past het niet, dan verdwijnt het; geen totaal op een vlakstapel |

## Kleur, verf per datum en kwantitatieve schalen

Besluiten: ADR-092 (kleurstops, klassen, verf per datum),
ADR-094 (verf op de overige natuurlijke merken),
ADR-098 (gedeelde kleurschaal, kleur naar maat, belgrootte,
heatmapassen). Detail: API § 10.9 en § 10.13. Bewijs onder meer in
`__tests__/t5-quantitative-scales.test.tsx` en `e2e/t5-scales.spec.ts`.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| Eén publieke `QuantitativeColorScale` (lineair met eigen `colors`, stops, klassen), gedeeld door heatmap, treemap en sunburst; de heatmap tekent haar standaardkleuren als voorheen | ondersteund | Unit, Mutatie | — |
| Kleurstops (`'stops'`): N kleuren op waarden, onregelmatig, de eerste en laatste stop zijn de uiteinden met `≤`/`≥`; twee en drie stops verven exact als sequentieel en divergerend; de gradiënt tekent elke stop | ondersteund | Unit, Browser, Mutatie | — |
| Benoemde klassen (`'classes'`, `[from, to)`): klasselegenda onder of naast de matrix, de klasse in tooltip, tabel, aankondiging en beschrijving; een waarde buiten elke klasse neutraal en benoemd, ontbrekend blijft leeg; overlap en gaten gemeld | ondersteund | Unit, Browser, Mutatie | de klasselegenda staat alleen onder of rechts; geen klasse in CSV (ruwe waarden) |
| Kleur naar maat op treemap en sunburst: `colorMeasure` + `colorValue`, domein over de hele boom, eigen waarde per datamerk, neutraal "no value", sleutel met onderschrift | ondersteund | Unit, Browser, Mutatie | — |
| Labels op de werkelijke maatvulling (4,5:1 gemeten); drillen herschaalt niets; tooltip, tabel, aankondiging en CSV noemen de maat; export SVG, PNG en PDF zoals het scherm | ondersteund | Browser, Mutatie | — |
| Heatmapassen: `xAxis`/`yAxis` met titel, formatter, datumnotatie, `order`, `reversed`; één weergegeven volgorde voor alle lezers; gemeten goten (1440 tot 320 px, rtl, CJK) | ondersteund | Unit, Browser, Mutatie | geen scrollen of virtualisatie |
| Belgrootte over de volledige data: zoom, pan en hergroepering veranderen geen straal; `sizeDomain` klemt met ware waarden; ontbrekende grootte op markergrootte; een groottekolom in de datatabel, "(no value)" bij een ontbrekende grootte | ondersteund | Unit, Browser, Mutatie | alleen de wortelafbeelding (bewust) |
| Groottesleutel (`sizeLegend`, opt-in): door de straalfunctie van de merken, na de reekslegenda, in de export; weggelaten als dubbelzinnig bij verschillende schalen | ondersteund | Unit, Browser, Mutatie | geen sleutel per reeks (bewust, ADR-098) |
| Veilige verf per datum (`paint`) op staaf- en scatterreeksen, lijn- en vlakmarkers (`marker.paint`) en taartpunten: één lezing per item voor merk, binnenlabelcontrast, tooltipsleutel en export; geforceerde kleuren overschrijven haar; de reekslegenda blijft de reekskleur, een taartsleutel volgt haar punt | ondersteund | Unit, Browser, Mutatie | "alleen verf" is runtime afgedwongen, niet in het type; alleen vulling, geen rand (W-FV-1) |
| Verf per datum op lollipop (kop; de steel volgt), bereikstaaf (interval) en dumbbell (per einde, `role`), en per item op trechter, radiale staaf en nightingale: merk, legendasleutel, tooltip, export en labelcontrast volgen | ondersteund | Unit, Browser, Mutatie | de dumbbellconnector blijft de reekslijn |
| Eén resolveraanroep per item, ook over vele aanwijzerbewegingen (5.000 scatterpunten, 2.000 lollipopkoppen); `scatter-10k` met en zonder verf binnen de ruis | ondersteund | Browser, Mutatie | gemeten op een drukke machine; PF-V2 staat hier los van |
| Geforceerde kleuren: gradiëntbalk, klassestalen en maatvullingen klappen in tot `Canvas` met rand; groottesleutel in `CanvasText` | ondersteund | Browser, Mutatie | alleen Chromium- en Firefox-emulatie, geen echte HCM |

Bekende beperkingen:

- Geen logaritmische kleurschaal (uitgesteld, ADR-098).
- Geen labels op gedeclareerde stops of tickintervallen op de gradiëntbalk.
- Geen generieke `colorAxis` over families, geen legenda voor meerdere schalen
  en geen kleurschaal per hiërarchieniveau.
- Geen kleur naar maat op scatter; geen bivariate kleur; geen
  `sizeByAbsoluteValue`.
- Geen verf per datum op boxplot en bereikvlak; kaars, OHLC en waterval verven
  naar rol (ADR-085). Verf is alleen vulling, nooit een rand (W-FV-1); geen
  drempelzones op staaf of scatter (zones: § Overlays, foutstaven en zones).

## Radiale hoeken

Besluiten: ADR-095 (hoekconventie), ADR-093
(radar). Detail: API § 10.10.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| Eén radiale klok: graden met de klok mee vanaf 12 uur, `startAngle` + `endAngle`, op radiale staaf en gauge; `startAngle` op taart en nightingale | ondersteund | Unit, Browser, Mutatie | geen gedeeltelijke taart of roos (`endAngle`), geen starthoek op sunburst en radar (uitgesteld) |
| Volle cirkel uit het ruwe verschil (0 → 360, 90 → 450, -90 → 270); omgekeerd, leeg of niet-eindig: één diagnose en de familiestandaard; meer dan één slag: de volle cirkel | ondersteund | Unit, Browser, Mutatie | de gauge kent geen volle cirkel (bewust) |
| Standaardtekening van radiale staaf, gauge, taart, nightingale, sunburst en radar ongewijzigd door de conventie | ondersteund | Unit, Browser | — |
| Taart: één snijhoekmodel voor snijden, sectorlabels, callouts, toetsenbordtick en tooltipanker; draaien verandert geen legenda-, toetsenbord-, tabel- of aankondigingsvolgorde | ondersteund | Unit, Browser, Mutatie | — |
| `padAngle` in graden op taart en nightingale | ondersteund | Unit, Mutatie | het type blijft `number`: een oude radiaalwaarde valt niet op bij het compileren |
| RTL en donker laten de radiale geometrie ongewijzigd; SVG-, PNG- en PDF-export dragen de schermgeometrie | ondersteund | Unit, Browser | de straal van een taart met callouts volgt de tekstmeting (minder dan 1 px verschil tussen LTR en RTL) |
| Veeg: start op de opgeloste start, het eigen aandeel van een slag over de hele duur, om het draaipunt (SVG-masker, Chromium en Firefox); in rust geen masker; gereduceerde beweging tekent meteen de rusttoestand | ondersteund | Unit, Browser, Mutatie | — |
| Radar: ontbrekend is een gat, de schaal volgt de zichtbare data, een expliciete grens wordt geopenbaard; de legenda telt op bij `height` (CH-20) | ondersteund | Unit, Browser, Mutatie | geen optie om over een gat te verbinden |

## Overlays, foutstaven en zones

Besluit: ADR-096. Detail: API § 10.11.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| Foutstaven op lijn, scatter (ook x op een numerieke x-as) en staaf, staand en liggend, en `<Chart>`: `errorBars: {lowKey, highKey}`, neutrale inkt, kappen op getoonde grenzen, open einde aan de plotrand bij een expliciete grens of ≤ 0 op log | ondersteund | Unit, Browser, Mutatie | niet op stapels of vlakken (bewust) |
| De foutgrenzen in het automatische domein, de tooltip (enkel, gedeeld, gesplitst), de tabel, de aankondiging, CSV en kopiëren als tabel; een buitenlabel voorbij de snorhaar | ondersteund | Unit, Browser, Mutatie | — |
| Een reeks met foutstaven wordt niet gereduceerd en niet gegroepeerd (diagnose) | ondersteund | Unit, Mutatie | een dichte scatter met foutstaven kost verf per aanwijzerbeweging (PF-V3) |
| `softMin`/`softMax` op numerieke assen: verbreden, nooit versmallen; volgorde bijdragen → zacht → expliciet → labelruimte → `nice` → zoom; ongeldig genegeerd met een diagnose | ondersteund | Unit, Mutatie | — |
| Zones op lijn en vlak (`zones: {axis?, ranges}`), `[from, to)`: de verf wisselt waar het getekende pad de grens kruist, op elke curve, omgekeerde en log-as, x op number, time en ordinal-time | ondersteund | Unit, Browser, Mutatie | geen x-zones op een categorie-as |
| Vlakzones: vulling en lijn per gebied (y naar hoogte, x naar positie); gestapeld vlak alleen x | ondersteund | Unit, Browser, Mutatie | y-zones op een stapel genegeerd (bewust) |
| Markers volgen de zone van hun waarde; benoemde zones in tooltip, tabel en aankondiging; geforceerde kleuren: systeemkleur van de reeks, de streep blijft; SVG, PNG en PDF tekenen dezelfde banden | ondersteund | Unit, Browser, Mutatie | — |
| Zonder `errorBars`, `softMin`/`softMax` en `zones` tekent elke chart als voorheen | ondersteund | Unit, Browser | — |

Bekende beperkingen:

- Geen x-foutstaaf op een lijn; geen foutstaven op lollipop, dumbbell of de
  bereikfamilies.
- Geen zones op staven of scatterpunten; geen vlakvulling tot een drempel;
  geen zonesleutel in de legenda.
- Geen stijlknoppen voor foutstaven of zones (kaplengte, breedte, dekking,
  hoverstijl): neutrale inkt is beleid.
- Een zachte grens op een tijd-, ordinal-time- of categorie-as wordt genegeerd
  met een diagnose (bewust).

## Samengestelde reeksen en oriëntatie

Besluit: ADR-101. Detail: API § 10.15. Bewijs onder meer in
`__tests__/t4-compound-grouping.test.tsx`, het typecontract
`__tests__/t4-option-contract.test-d.tsx` en `e2e/t4-compound.spec.ts`.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| Meerdere reeksen op `RangeBarChart`, `RangeAreaChart`, `BoxPlotChart` en `DumbbellChart` (`series`), uit de enkelvoudige sleutels óf uit `series` | ondersteund | Unit, Browser, Mutatie | — |
| Bereikstaven, boxen en halters van één familie, oriëntatie en as automatisch naast elkaar in reeksvolgorde, binnen hun categorie; een verborgen reeks geeft haar vak terug; families groeperen niet met elkaar | ondersteund | Unit, Browser, Mutatie | geen groeperingsoptie, geen vakbreedte of -opvulling (bewust) |
| Bereikvlakken over elkaar in reeksvolgorde, de latere boven, elk met eigen dekking en randen; gaten per reeks | ondersteund | Unit, Browser, Mutatie | geen liggend bereikvlak (bewust) |
| Liggende boxplot (`horizontal`): dezelfde vijf statistieken, rollen en woorden; liggend geen navigator en geen annotaties | ondersteund | Unit, Browser, Mutatie | — |
| De aanwijzer vindt het gegroepeerde glyph dat hij ziet; het toetsenbord stapt categorie, reeks, dan laag voor hoog; een verborgen reeks is geen stap | ondersteund | Unit, Browser, Mutatie | — |
| Meerdere halters: één legenda-item per reeks met een gepaarde sleutel van haar twee eindkleuren (scherm en export); tooltip, aankondiging en tabel noemen de reeks eerst | ondersteund | Unit, Browser, Mutatie | — |
| Eindpuntlabels van bereikstaaf, bereikvlak en halter in de ene botsingsbeslissing van de plot; elk label bij zijn eigen glyph; geen kleiner font | ondersteund | Unit, Browser, Mutatie | — |
| Dichte groepen: geen reeksgrens en geen "geen ruimte"-staat; glyphs blijven in hun categorie op 1200, 768, 390 en 320 px; labels wijken eerst | ondersteund | Browser, Mutatie | zeer smalle glyphs op de telefoon (bewust) |
| Omgekeerde as: de doos tussen Q1 en Q3 in beide oriëntaties; eindpuntlabels houden hun rol | ondersteund | Unit, Browser, Mutatie | — |
| Geforceerde kleuren: gegroepeerde bereikstaven in hun systeemkleuren per reeks (CH-28) en hun plaats; boxen, haltermarkers, randen en beide sleutels van een gepaard item zichtbaar | ondersteund | Browser | vanaf de zesde reeks herhalen de systeemkleuren; plaats en naam blijven |
| Export: SVG, PNG en PDF tekenen gegroepeerde en liggende geometrie zoals het scherm, met de gepaarde sleutel; CSV de ruwe rijen | ondersteund | Browser, Mutatie | — |

Bekende beperkingen:

- Geen update-animatie van de waarden op dumbbell, lollipop, boxplot,
  bereikstaaf en bereikvlak: zij hertekenen (LAB-AT10); hun gegroepeerde
  vakken schuiven wel bij verbergen en tonen (ADR-104).
- Geen gedeelde of gesplitste tooltip op bereikvlak, bereikstaaf en boxplot
  (ADR-085); geen legenda-item per rol bij meerdere reeksen.
- Bereikstaaf: geen binnenlabels, geen `minPointLength`.
- Boxplot: geen kapverhouding, geen gemiddelde, geen inkeping (notch), geen
  verf per datum.
- Bereikvlak: geen eigen randlijnen per zijde, geen markers, geen
  `connectMissingData`.
- Geen violin, jitter of swarm en geen statistische generatie: de host levert
  de vijf statistieken.

## Hiërarchie en stroom

Besluiten: ADR-099, ADR-093 (paden in rtl).
Detail: API § 10.14. Bewijs onder meer in
`__tests__/t6-hierarchy-flow.test.tsx` en `e2e/t6-hierarchy-flow.spec.ts`.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| Eén labelbeleid voor treemap en sunburst: `label.secondary` (`'share'`, `'value'` in `valueSemantics`, `'none'`), heel of niet; treemap alleen bladtegels | ondersteund | Unit, Browser, Mutatie | geen hostveld of formatter als tweede regel (bewust) |
| `label.levels`: zichtbaarheid per niveau, geteld vanaf de getoonde wortel (drilldown herbasiseert); lezers houden elke naam en waarde | ondersteund | Unit, Browser, Mutatie | geen stijl per niveau (bewust) |
| Sunburst: tweede regel alleen waar de ring haar heel draagt, binnen de boog gemeten | ondersteund | Unit, Browser, Mutatie | op dunne buitenringen meestal afwezig (geometrie) |
| Een kop voor elke interne treemapknoop, een kopband alleen waar een kop staat (ook niet op de getoonde wortel); elke geneste groep een eigen toetsenbordelement (N3, CH-34) | ondersteund | Unit, Browser, Mutatie | — |
| Het drillpad op identiteit; een vervangen boom tekent uit zijn huidige knopen, een verdwenen pad landt op het diepste overgebleven niveau (N2) | ondersteund | Unit, Mutatie | — |
| Hiërarchiepaden lezen in ltr en rtl, met de kruimel naar het inline einde (CH-11) | ondersteund | Unit, Browser, Mutatie | — |
| Sankey `nodeAlignment` (`justify`, `source`, `sink`, `center`); labels, hover en menu volgen de knoop; geometrie spiegelt niet in `rtl` | ondersteund | Unit, Browser, Mutatie | geen expliciete kolom per knoop |
| Sankey `linkColor` (`source`, `target`, `gradient`); de eigen `color` van een link wint; gradiënt als gevulde band in SVG, PNG en PDF (axiale shading) | ondersteund | Unit, Browser, Mutatie | geforceerde kleuren houden de geschreven tinten, zoals elke identiteitsvulling (bevestigd) |
| Sankey `nodeOrder` (`auto`, `input`); de tabel houdt de volgorde van `links` | ondersteund | Unit, Browser, Mutatie | geen waardesortering (bewust) |
| Het sankeytoetsenbord stapt per getekende kolom (`layer`), van boven naar beneden (N1) | ondersteund | Unit, Browser, Mutatie | — |
| Organigram `collapsible`, gecontroleerd en ongecontroleerd, op host-`id`; dubbele id ongeldig; zichtbare boom in layout, lijnen en pasgrenzen | ondersteund | Unit, Browser, Mutatie | een kaart zonder `id` kan niet inklappen |
| Eén schakelgrammatica: badge met aantal, Enter en Spatie, menu (Collapse, Expand, Expand all below); de kaart schakelt nooit; focus naar de dichtstbijzijnde zichtbare voorouder | ondersteund | Unit, Browser, Mutatie | geen animatie van een deelboom (bewust) |
| Organigram `cardFields` (ten hoogste drie, op sleutel), van onderen weggelaten, nooit kleiner font; tooltip, tabel en CSV houden elk veld; 1200 tot 320 px binnen de kaart | ondersteund | Unit, Browser, Mutatie | geen automatische kaarthoogte, geen afbeelding |
| Export organigram: zichtbare boom, onderschrift over het ingeklapte deel; CSV en tabel de hele organisatie | ondersteund | Browser, Mutatie | — |

Bekende beperkingen:

- Geen totaal in het midden van een sunburst: het centrum houdt de naam van
  de gedrilde knoop.
- Geen styler of dekkingsknop per sankeylink (bewust: de aandachtsgrammatica
  bezit de dekking).
- Geen alternatieve organigramlayouts (hangend, gestapeld); geen eigen
  knoop- of kaartrenderers.

## Scalairen: schaal, doel en replay

Besluit: ADR-100. Detail: API § 3.5. Bewijs onder meer in
`__tests__/t7-scalar-scales-targets.test.tsx` en `e2e/t7-scalar.spec.ts`.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| Eén schaal op meter, lineaire meter en bullet: `scale` (`true`: ronde waarden naar de lengte van boog of baan, nooit fijner dan de waardesemantiek; `{ticks: [...]}`: precies deze waarden, buiten het bereik niet getekend en gemeld); zonder `scale` ongewijzigd | ondersteund | Unit, Browser, Mutatie | — |
| Schaalwoorden: uiteinden en doelwoord altijd, een tussenlabel wijkt (eerst om de andere), zijn streepje blijft; nooit een kleiner font; 1200, 768, 390 en 320 px zonder overlap en binnen de chart | ondersteund | Unit, Browser, Mutatie | — |
| Eén doel: `target` als getal of `{value, label}` op meter, lineaire meter en bullet; het label vervangt het woord "Doel", het getal blijft; CSV houdt het getal | ondersteund | Unit, Browser, Mutatie | — |
| Doel buiten de schaal: het merk stopt aan het uiteinde, woord, naam en tabel houden het ware getal (naam en tabel: "boven/onder de schaal"); een niet-eindig doel wordt niet getekend of genoemd (diagnose); doel 0 overal genoemd | ondersteund | Unit, Browser, Mutatie | geen eigen merk buiten de schaal (bewust) |
| Waarde buiten de schaal: de naam noemt de ware waarde "boven/onder het bereik", zonder afgeklemd aandeel; het aandeel van het doel alleen waar het iets betekent | ondersteund | Unit, Mutatie | — |
| Meter `indicator: 'needle' \| 'bar'` (exclusief): de balk smaller dan de band, van `startAngle` naar de waarde, in de on-fill-tint; zones, doel en uitlezing blijven; het doel boven naald en balk | ondersteund | Unit, Browser, Mutatie | — |
| Meter `replay`: een onzichtbaar trefgebied om de spil (geen cursor), en Replay animation in het menu waar de host het houdt (`features.replay`); terug naar het begin, dan de intrede naar de huidige waarde; genegeerd zolang de meter beweegt; niets onder verminderde beweging; `contextMenu={false}` laat de spil werken | ondersteund | Unit, Browser, Mutatie | zonder menu-item alleen aanwijzer en aanraking (bewust: het is geen essentiële functie) |
| Export: schaal, doel en balk in SVG, PNG en PDF zoals het scherm; een export tijdens een replay schrijft de rustwaarde; het trefgebied gaat nooit mee | ondersteund | Browser, Mutatie | — |
| Geforceerde kleuren: naald, balk, markeringen en doelen `CanvasText`, streepjes `GrayText`, teksten `CanvasText`; de zones houden hun tinten | ondersteund | Browser | alleen emulatie |

Bekende beperkingen:

- Eén doel per scalair; geen tweede vergelijkend merk.
- Geen tickaantal of -interval, geen kleine streepjes, geen tickformatter en
  geen stijl per streepje of doel.
- Geen zichtbare namen van meterzones of bulletbanden (de lezers noemen ze wel).
- Geen naald en balk tegelijk, geen gesegmenteerde boog, geen stijl voor
  radiale voortgang; de lineaire meter vult niet naar zone.
- Geen logaritmische scalaire schaal; geen multi-bullet op een gedeelde as.
- Geen gebeurtenis bij het einde van een replay en geen generieke replay-API
  (`onAnimationComplete` vuurt niet opnieuw).

## Activering en selectie

Besluiten: ADR-042 (betekenis, Cartesisch: § Level 2),
ADR-102 (de losse families). Detail: API § 2.1 en § 2.1.1.
Bewijs onder meer in `__tests__/t8-*-selection.test.tsx` en
`e2e/t8-selection.spec.ts`.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| `selection`, `selectedItems`, `defaultSelectedItems`, `onSelectionChange` en `onItemActivate` op taart, trechter, radiale staaf, nightingale, radar, heatmap, treemap, sunburst en sankey, met de betekenis van ADR-042 | ondersteund | Unit, Browser, Mutatie | organigram, tijdlijn, scalairen en sparkline niet (bewust) |
| Eén `ChartItemRef` in vier vormen: item van een reeks, cel, knoop, link; één vergelijking, nooit een positie of label | ondersteund | Unit, Browser, Mutatie | een host die een verwijzing als reeksitem leest, vernauwt (`'seriesId' in ref`, `kind`) |
| Een klik of tik selecteert en activeert daarna; Spatie selecteert, Enter activeert; activering zonder selectie en selectie zonder handler; zonder de props verandert er niets | ondersteund | Unit, Browser, Mutatie | — |
| Radar: het hoekpunt als item; het toetsenbord met PageUp en PageDown op één hoekpunt | ondersteund | Unit, Browser, Mutatie | alleen met selectie of activering aan; anders blijft het toetsenbord op de variabele |
| Heatmap: een cel met een rij; een lege kruising is geen item; identiteit op de waarden, ongevoelig voor asvolgorde | ondersteund | Unit, Browser, Mutatie | — |
| Treemap en sunburst: alleen bladeren op hun host-`id`; een ouder blijft drillen; een uitgedrild blad is inactief | ondersteund | Unit, Browser, Mutatie | een blad zonder `id` is alleen te activeren |
| Sankey: knopen en links; `LinkDatum.id`, anders bron en doel; parallelle links zonder id één item met één melding; Spatie selecteert, Enter doorloopt, Shift+Enter activeert; aandacht van een link op dezelfde identiteit | ondersteund | Unit, Browser, Mutatie | — |
| Gecontroleerd en ongecontroleerd; niet getekend is inactief, niet verwijderd; alleen ongecontroleerd snoeit, één keer met `update` | ondersteund | Unit, Mutatie | — |
| Het driehoekje op het item, zonder andere vulling, maat of plaats; geforceerde kleuren `Highlight`; 390 en 320 px binnen de chart, de pagina groeit niet | ondersteund | Unit, Browser, Mutatie | — |
| Naam, aankondiging, tabel en `selectedItemCount` noemen de geselecteerde getekende items; geen `aria-selected` op `role="img"` | ondersteund | Unit, Browser | een sankeyknoop heeft geen tabelrij |
| Export en print in rust: geen driehoekje in SVG, PNG, PDF of print; CSV ruw | ondersteund | Unit, Browser, Mutatie | — |
| Op omvang (2.500 cellen, 2.000 bladeren, 500 links) een selectiewijziging binnen de kosten van een gewone hover op dezelfde chart, niet groeiend met het aantal geselecteerde | gemeten | Browser | een interactie hertekent de hele familie (ook een hover; ROADMAP PF-V4) |

Bekende beperkingen:

- Geen ouder- of groepsselectie op treemap en sunburst; geen automatische
  selectie van voorouders of afstammelingen.
- Geen ingebouwde menu-items Selecteren en Deselecteren in het contextmenu.
- Geen selectie op reeksniveau en geen bereik-, lasso-, brush- of
  sleepselectie.
- Dubbelklikken heeft geen betekenis.
- Geen stijlopties voor de selectie; geen zin met het aantal geselecteerde
  items in de beschrijving; geen selectiekolom in CSV.
- Geen generiek selectiemodel voor grafen buiten de sankey.

## Familie-enkelingen

Besluiten: ADR-103 (histogram, tijdlijn, kaars, sparkline),
ADR-097 (watervalsoorten). Staafplaatsing en
trechtercontext: § Waardebetekenis en labels. Detail: API § 10.12 en § 10.16.
Bewijs onder meer in `__tests__/t9-family-singles.test.tsx`,
`t9-option-contract.test-d.tsx`, `t9-waterfall-kinds.test.tsx`,
`e2e/t9-singles.spec.ts` en `e2e/t9-waterfall.spec.ts`.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| Histogram: één binregel (`binCount`, `binWidth` of `bins`); een onbruikbare regel geeft een diagnose en de standaardtelling (API § 10.16) | ondersteund | Unit, Browser, Mutatie | — |
| Histogram: `areaProportional` bij telling en som tekent ongelijke bins naar oppervlak; label, tooltipwaarde, aankondiging en tabel houden de hoeveelheid (API § 10.16) | ondersteund | Unit, Browser, Mutatie | niet bij een gemiddelde; de y-astitel is van de host |
| Tijdlijn: ordinaal blijft de standaard; `timeAxis` met machine-`time` per event plaatst op tijd, gelijke tijden op één x, markers nooit verschoven; toetsenbord, tabel en aankondiging in tijdvolgorde, gelijke tijden in hostvolgorde; CSV in hostvolgorde met `time`; één event zonder tijd: de hele chart ordinaal met één diagnose | ondersteund | Unit, Browser, Mutatie | samenvallende markers zijn voor de aanwijzer één doel (toetsenbord en tabel bereiken elk event) |
| Candlestick: `bodyStrokeWidth` (standaard 1, `0` mag) in de richtingskleur, de lont ongewijzigd; geforceerde kleuren houden een rand van 1 px op een randloos lichaam, hol tegenover gevuld blijft | ondersteund | Unit, Browser, Mutatie | — |
| Sparkline: `domain` exact (geen opvulling, geen nul) op lijn, vlak en staaf; gedeeld domein tekent gelijke waarden op gelijke hoogte; buiten het domein tot de rand, punten buiten niet getekend, CSV ruw; ongeldig: diagnose en automatisch | ondersteund | Unit, Browser, Mutatie | — |
| Sparkline: een staaf leest vanaf nul; het automatische domein van een staafsparkline reikt tot nul, dat van lijn en vlak niet; een hostdomein wordt nooit verbreed | ondersteund | Unit, Browser, Mutatie | — |
| Export van deze opties: SVG schrijft de schermgeometrie van elk geval; PNG en PDF dragen de lichaamsrand; CSV ruw | ondersteund | Browser, Mutatie | — |
| Waterval: één rolveld `kindKey` met `change`, `subtotal`, `total` | ondersteund | Unit, Mutatie | geen totalen op positie zonder datarij (bewust) |
| Waterval: zwevend subtotaal (nettobeweging sinds het vorige subtotaal of totaal), totaal vanaf nul; beide waar ook, herhaald, gevolgd door mutaties; het saldo verandert niet | ondersteund | Unit, Browser, Mutatie | — |
| Waterval: afgeleid bedrag; een afwijkende eigen waarde, een onbekende soort en een niet-eindige mutatie geven een ontwikkeldiagnose; een ontbrekende mutatie tekent niets | ondersteund | Unit, Mutatie | — |
| Waterval: label, tooltip, tabel (soortkolom), aankondiging, dradenkruis en kopieer-waarde lezen dezelfde soort en hetzelfde bedrag; zoom hernoemt niets | ondersteund | Unit, Browser, Mutatie | — |
| Waterval: subtotaal in de verf van het totaal; geforceerde kleuren `GrayText`; bruggen alleen op saldi; omgekeerde as; SVG, PNG en PDF zoals het scherm; CSV ruw met de soortkolom | ondersteund | Unit, Browser, Mutatie | geen eigen subtotaalverf (bewust) |

Bekende beperkingen:

- Histogram: geen binoorsprong en geen benoemde binregels; geen KDE of
  normaalcurve (hostsamenstelling), geen cumulatief histogram, geen bins op
  tijdwaarden.
- Trechter: geen ingebouwde modus "aandeel van de vorige" (de context draagt
  het getal); geen piramide en geen liggende trechter.
- Tijdlijn: geen Gantt, geen periode-events, geen verticale oriëntatie; geen
  tijdas met streepjes; geen aanwijzing voor samenvallende markers.
- Candlestick: geen breedte per richting; geen holle variant in gewone
  weergave.
- Sparkline: geen eenzijdige of zachte grenzen; geen tooltip, referentielijn of
  negatieve kleur.
- Waterval: geen liggende of gestapelde waterval; geen annotaties; geen breedte
  of streep voor de bruggen; geen stijlknoppen voor het subtotaal; geen
  binnenlabels.

## Beweging: profiel en klassen

Besluit: ADR-104 met zijn aanvullingen. Detail: API § 2.4,
ARCHITECTURE § 7.10. Metrieken: QUALITY-BUDGETS § 7.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| `animation` als profiel (`calm`, `responsive`) plus de klassen `entrance`, `update`, `exit`, `tooltip`, `attention`, `replay`; serialiseerbaar, benoemde curves | ondersteund | Unit, Type, Mutatie | — |
| Voorrang profiel → `ChartDefaults` → grafiek → serie (`entrance`, `exit`) → gereduceerde beweging, klasse voor klasse samengevoegd; ook een plain `<Chart>` | ondersteund | Unit, Browser, Mutatie | — |
| `animation: false` en gereduceerde beweging: elke interpolatie ogenblikkelijk (ook herschikking, replay en discrete zoom), alle interactie en elk resultaat blijft | ondersteund | Unit, Browser, Mutatie | — |
| Validatie: niet-eindig of negatief valt terug op het profiel; tooltip en aandacht ≤ 600 ms, geometrie ≤ 3.000 ms; één ontwikkeldiagnose | ondersteund | Unit, Mutatie | — |
| Tooltip: inhoud in het eerste frame, invagen en uitvagen op de tooltipduur, glijden tussen merken binnen één zijde, direct bij een zijdewissel of bij volgen, terugkeer zonder knipper | ondersteund | Unit, Browser, Mutatie | de gesplitste tooltip glijdt niet (elk vak hangt aan een steel) |
| Locators (crosshair, knopen, cues, heatmaprugmarkeringen) direct op hun plaats; vertrek samen met de tooltip | ondersteund | Browser, Mutatie | — |
| Aandacht: wissel en vrijgave (1,8 × de wissel), ook bij een legendavoorbeeld; alleen dekking | ondersteund | Browser, Mutatie | organigram en tijdlijn kennen geen aandachtsovergang |
| Kleursleutelmarkering van de heatmap reist naar de nieuwe waarde; de waarde staat meteen in de tooltip | ondersteund | Browser, Mutatie | — |
| Update standaard aan op elke updatefamilie, vanaf de getekende stand, met de curve van de klasse | ondersteund | Unit, Browser, Mutatie | geen eerlijk paar voor een gewijzigd aantal punten: dan geldt `d3-interpolate-path` |
| Gegroepeerde vakken (staaf, bereikstaaf, boxplot, halter): exit in het eigen vak, daarna schuiven de buren; hitgebied en labels bewegen mee | ondersteund | Unit, Browser, Mutatie | een teruggekeerde reeks staat meteen in haar eindvak |
| Replay van de meter: 35 % terug, 65 % omhoog op de replayklasse; waarde en toegankelijke naam blijven de rustwaarde | ondersteund | Unit, Browser, Mutatie | een verzoek tijdens een lopende beweging wordt genegeerd |
| Oriëntatiewijziging: direct in de nieuwe ligging, geen beweging ertussen | ondersteund | Unit, Mutatie | — |
| Export tijdens een beweging (entrance, update, herschikking, replay, discrete zoom) wacht tot rust; geen tooltip, locator, aandacht of markering in de export, SVG, PNG en PDF | ondersteund | Unit, Browser, Mutatie | — |
| Aanraking: een tik toont de kaart en zij blijft; een glijdende vinger draagt een aanwijzergebonden kaart direct; een tweede vinger is geen hover | ondersteund | Unit, Browser | geëmuleerd in Chromium; een echt toestel is AC-V5 |

- Geen `none`-profiel, geen presets, geen vrije cubic-bezier, geen easing per
  interactieklasse, geen override van gereduceerde beweging en geen aparte
  knop voor de herschikking of de replayverdeling (ADR-104).

## Theming: het CSS-tokencontract en zijn grenzen

Besluiten: ADR-043 (tokencontract, pakketdefaults,
zelfgeladen stylesheet), ADR-044 (kleurbeslissingen in het
levende element, capture-transactie), ADR-045 (geen visuele
thema-API), ADR-046 (hostpalet is hostbezit),
ADR-047 (paletkopieën, privé-eigendom),
ADR-050 (stylesheetactivering, tekstmeting in de scope).
Detail: API § 13.

| Capaciteit | Status | Bewijs | Bekende beperking |
| --- | --- | --- | --- |
| Eén tokencontract: publieke token over privé-pakketdefault; geen `--color-*`-alias gelezen | ondersteund | Unit, Contract, Browser, Mutatie | de aliasveeg ziet alleen wat de scenario's renderen |
| Volledige pakketdefaults licht en donker, zonder host-stylesheet, binnen de budgetten | ondersteund | Contract, Browser, Mutatie | gemeten op de eigen oppervlakken van het package; hostwaarden meet de host |
| Eén geaggregeerd stylesheet, door de entry geladen; geen Tailwind-scan of designsysteemimport nodig | ondersteund | Contract, Browser, Mutatie | geen publiek stylesheet-subpad (publicatiewerk) |
| Centrale hostoverride bereikt Cartesische en losse charts, in elke stylesheetvolgorde | ondersteund | Browser, Mutatie | — |
| Geen visuele thema-API: geen `theme`, geen `ChartThemeOverride`, geen kleur op `<ChartDefaults>` (ADR-045) | ondersteund | Unit, Mutatie | — |
| Chartlokale `colors` en expliciete serie-, datum- en annotatiekleuren, ook in SVG- en PNG-export (ADR-045) | ondersteund | Unit, Browser, Mutatie | — |
| Gescoopte CSS-override bereikt Cartesische en losse charts, alleen binnen haar scope (ADR-045) | ondersteund | Browser, Mutatie | — |
| Bullet: waardebalk als contrasterende markering over banden en track, zonder eigen rol (ADR-045) | ondersteund | Unit, Mutatie | ongemeten (server, eerste render) het donkere on-fill-token |
| Afnemers dragen geen eigen palet en geen UI-intentiekleur als categorie (ADR-045) | ondersteund | Gate, Mutatie | een kleur die via een variabele uit een ander bestand komt, ziet de gate niet |
| Afnemers declareren geen paletkopie in een stylesheet of stijlobject; één slot of een semantische rol blijft een gescoopte override (ADR-047) | ondersteund | Gate, Mutatie | een palet via `setProperty` of een berekende sleutel ziet de gate niet |
| Wat het package declareert of schrijft, staat onder `--ac-`; de publieke `--chart-*`-namen zijn van de host (ADR-047) | ondersteund | Contract, Mutatie | — |
| Een hostpalet wijzigt niets in het package: de pakketdefaults blijven merkneutraal en letterlijk (ADR-046) | ondersteund | Contract, Browser, Mutatie | wat het palet van de host is, beslist en meet de host |
| On-fill-beslissingen lossen op in het chartelement: een gescoopte override telt mee (ADR-044) | ondersteund | Unit, Browser, Mutatie | — |
| Moduswissel, accentwissel, centrale tokenwijziging en gescoopte override zonder remount (ADR-044) | ondersteund | Unit, Browser, Mutatie | een CSSOM-wijziging vraagt `invalidateChartStyles()`; de paint volgt wel vanzelf |
| Heatmapcellen en gradiëntlegenda tonen één schaal, in licht en donker | ondersteund | Unit, Browser, Mutatie | — |
| SVG-, PNG- en PDF-export tonen de weergave van het moment waarop zij oplossen, ook na een wissel; een stijlwissel vóór of tijdens de capture geeft één generatie (ADR-044) | ondersteund | Unit, Browser, Mutatie | stijl die alleen uit een stylesheetregel komt (focusring, print) gaat niet mee; drie pogingen, dan een fout |
| Server-render en hydratatie zonder stijllezing tijdens de render; een niet-gemounte chart schat zijn labels (ADR-050) | ondersteund | Unit, Mutatie | — |
| Stylesheetactivering (`media`, `disabled`, `rel`, `type`, `href`, `title` in `<head>`; een `<link>` die laadt of niet laadt) invalideert vanzelf, ook tijdens een export (ADR-050) | ondersteund | Unit, Browser, Mutatie | stylesheets buiten `<head>`, CSSOM-vlaggen en andere mediavoorwaarden vragen `invalidateChartStyles()` (API § 13) |
| Tick- en datalabels gemeten in het font van de eigen scope: fontvariabele, geërfde familie en gewicht; zustercharts verschillen (ADR-050) | ondersteund | Unit, Browser, Mutatie | taart, gauge, funnel, nightingale, radial bar, bullet, labelachtergrond en heatmapcellabel schatten heuristisch |

## Buiten scope

Niet geautoriseerd en geparkeerd (ADR-041): meer dan twee
assen, willekeurige assen aan één kant, onafhankelijke x-assen, generieke
drilldown, rijkere of bewerkbare annotaties, extra indicatoren, brede generics
voor callbackcontexten en een publiek plugin-ecosysteem
(`ROADMAP.md` § 5.4 en § 5.5). Een andere renderer en live data
wachten op de trigger in `PERFORMANCE.md` § Budgetten en
besluit A2. Specialistische families en tools vallen buiten de beoogde scope
(ROADMAP § 5.1 en § 6); maps en geografische charts voorlopig ook
(ADR-062).
