Chart

Recharts on the six categorical tokens, in sequence. Grid and axes stay recessive on `border` / `muted-foreground`; the tooltip is the floating surface (`popover`, 12px, `shadow-sm`). A series is only a status colour when it *is* that status — never for "series 4".

const config = {
  personalCare: { label: "Personal care", color: "var(--chart-1)" },
} satisfies ChartConfig;

<ChartContainer config={config}>
  <BarChart data={data}>
    <ChartTooltip content={<ChartTooltipContent />} />
    <ChartLegend content={<ChartLegendContent />} />
    <Bar dataKey="personalCare" fill="var(--color-personalCare)" />
  </BarChart>
</ChartContainer>

Bar chart — interactive

shadcn's interactive card: the series totals sit in the header as aria-pressed toggles and the chart shows one series at a time, so the number and its bars share a colour. Daily data for three months; the totals are derived from the rows.

Lot views and bids

Daily, for the last three months.

Lot views per day from 20 June 2026 over 92 days; 29,946 lot views and 1,772 bids in total.

Lots by category (bar)

One colour per category, chart-1 through chart-4 in order, with the value on every bar so colour is never the only channel. Legend entries are toggles (aria-pressed); an sr-only figcaption carries the numbers.

Food & drink leads both months, 32 then 27 lots; Electronics 21 then 19; Personal care 14 then 18; Household grew most, 9 to 15.

Orders per day (line)

Bids and buy-now orders on chart-1 and chart-2; the crosshair snaps to the nearest day and the tooltip lists both.

Bid orders peak Thursday at 30 and fall to 10 on Sunday; buy-now orders stay between 1 and 9, highest Wednesday.

Order status (stacked bar, semantic)

Cancelled, pending and delivered are opt-in status colours because the series *is* that status — danger, warning, success, never chart-1…6. The stack carries its total on top; the exceptions sit on the baseline so they read against each other.

Totals run 22 to 26 orders a day. Delivered ranges 15 to 24, highest Thursday; pending peaks Wednesday at 5; cancelled is 0 to 2 a day.

Recharts gallery

Every example from recharts.org/en-US/examples, ported onto the tokens through `ChartContainer`. Each keeps its Recharts structure and behaviour; where the original exists to show something the system forbids (a gradient, a decorative colour), the note says what it became.

LineChart

Simple Line Chart

Two series on chart-1 and chart-2, the baseline every other example varies. Grid drops its vertical rules and the axes lose their lines, per the house style.

Completed lots climb from 182 in week 1 to 291 in week 6; bids stay between 35 and 52.

Dashed Line Chart

Dash patterns separate the series without a second colour channel. Given to planned against actual lot views, where the dash already means 'not measured'.

Planned lot views rise 320 to 420 over six weeks; actual lot views track within 20 either side, ending 431.

Vertical Line Chart

layout="vertical" puts the categories on the y axis, so the grid flips to vertical rules and the container takes a fixed height instead of aspect-video.

Intake holds the deepest backlog at 42 queued, falling to 5 in Archive; running work peaks at 15 in Drafting.

Biaxial Line Chart

Two y axes for two units, listings left and euros right. Both active dots drop to r=4, the size the rest of the page uses.

Listings grow 1,240 to 1,905 a week on the left axis; support cost on the right axis moves €86 to €112, so cost per listing falls.

Vertical Line Chart With Specified Domain

The value axis takes an explicit domain with dataMax + 1000 of headroom, so the widest seller never crosses into the edge.

Rhine Outlet GmbH reads the most prompt tokens at 9,800k against 2,000k completion; every other seller reads no more than 4,800k on both.

Line Chart Connect Nulls

The same missing reading twice: broken above, bridged by connectNulls below. Each chart carries its own caption, because the difference is the whole point.

Default: p95 latency falls 4,000 to 2,000 ms by Wednesday, the line breaks over Thursday's missing reading, and resumes at 1,890 ms on Friday.
connectNulls: the same series, with Wednesday's 2,000 ms joined straight to Friday's 1,890 ms across the gap.

Line Chart With X Axis Padding

Axis padding holds the series 30px off the left and 100px off the right of the plot.

Queued work peaks at 89 lots at 14:00 and drops to 38 by 18:00; cleared work rises steadily from 41 to a 74 peak at 16:00.

Line Chart With Reference Lines

Two reference lines, one vertical, one horizontal with a rotated label. The original's red became border-strong for the event marker and warning for the GMV ceiling — a threshold the series can breach is exactly what warning is for; labels read on muted-foreground.

Daily GMV crosses the €500 ceiling on Thursday at €610 and again on Friday at €540; refunds stay between €90 and €180. Wednesday carries the catalogue switch.

Customized Dot Line Chart

A render function per dot, keyed on the value. The green and red emoji faces became a filled success dot above target and a hollow warning ring below, so shape carries the state alongside colour.

Resolved disputes clear the 60 target on Monday, Wednesday and Friday (64, 71, 66) and miss it on Tuesday, Thursday and Saturday (52, 48, 58); escalations move the other way, 9 to 21.

Customized Label Line Chart

A custom point label and a rotated custom axis tick. Both take muted-foreground at 11px rather than inheriting the series colour, which would not hold 4.5:1.

Rhine Outlet GmbH lists the most lots at 312 with 41 relists; Iberia Surplus SL lists the fewest at 94 with 6. Relists stay under 15 percent of lots listed for every seller.

Synchronized Line Chart

Three charts share a syncId, so a cursor in one moves all three, and the brush on the middle chart ranges all three. Brush track on surface-2, handles and frame on border-strong.

Listings move between 198 and 372 a day over ten days, peaking on 7 March.
p95 latency follows the same shape, 760 to 1,260 ms; the brush below narrows all three charts to the same days.
Daily GMV tracks both, €15 to €30.

Line that animates opacity

The line's shape prop swaps in a Curve that fades its stroke in. Recharts 3.8 gives a custom shape no animation progress, so the fade is a 320ms transition driven from React, with a button to replay it and another to swap datasets.

Throughput over a working day: dataset one peaks at 73 lots an hour at 14:00 and falls to 28 by 20:00; dataset two peaks later, 81 at 16:00.

Highlight And Zoom Line Chart

Drag across the plot to zoom both value axes to that range; the selection draws as a ReferenceArea on surface-2 inside a border-strong edge. Zoom out is an outline Button, disabled while the chart is already full width.

GMV per batch ranges €0 to €9 across 20 batches, highest at batch 16; unit volume ranges 50k to 499k, highest at batch 6. Drag across the plot to zoom both axes to that range.

Line Chart Has Multi Series

Three series with their own data arrays over overlapping weeks, joined by allowDuplicatedCategory={false}. The config is keyed by series name so legend and tooltip still resolve labels and colours.

Three sellers went live in different weeks; each climbs about 12 points over its first three weeks — Intake triage 62 to 74, Lead research 55 to 71, Draft writer 48 to 66 percent listed.

Line Chart Axis Interval

The same 100-point series under five tick intervals. The interval is named in a line of text above each chart rather than a Label inside the plot, which had nothing to anchor to.

interval: preserveStart

Lot views and relists over 100 hours with tick interval preserveStart: lot views cycle between about 40 and 230 an hour, relists between 4 and 34.

interval: preserveEnd

Lot views and relists over 100 hours with tick interval preserveEnd: lot views cycle between about 40 and 230 an hour, relists between 4 and 34.

interval: preserveStartEnd

Lot views and relists over 100 hours with tick interval preserveStartEnd: lot views cycle between about 40 and 230 an hour, relists between 4 and 34.

interval: equidistantPreserveStart

Lot views and relists over 100 hours with tick interval equidistantPreserveStart: lot views cycle between about 40 and 230 an hour, relists between 4 and 34.

interval: 1

Lot views and relists over 100 hours with tick interval 1: lot views cycle between about 40 and 230 an hour, relists between 4 and 34.

Line Chart Negative Values With Reference Lines

Numeric axes on both sides of zero: each axis line is dropped where a zero reference line on border-strong already draws it, and the axis titles read on muted-foreground.

Net margin moves from minus €1,800 60 days before launch to €5,400 120 days after, crossing zero on launch day.

Compare Two Lines

Hovering reveals the comparison line, the ad cost base and the gap between the two at the cursor. The original dims everything past the cursor with a hard-stop gradient; here the gmv series splits into two flat keys at the cursor instead, full strength before and 0.25 after.

GMV to date grows from €200,250 to €367,372 over the year. Hovering reveals the reinvested comparison, which climbs up to €23,000 ahead by October before the two meet in December, and the ad cost base rising €200,000 to €300,000.

Dynamic Z-Index Line Chart

Hovering or focusing a legend entry raises that line's zIndex above the others. ChartLegendContent drops recharts' legend mouse handlers, so this one renders its own entries on the same tokens and dims the other series to 0.25 rather than the hovered one.

Drafts open the week at 400 and end at 349; reviews peak Thursday at 390; sends stay between 200 and 250 all week. Hovering or focusing a legend entry lifts that series above the others.

Tiny Line Chart

A sparkline: no axes, no grid, no tooltip, the container overridden to h-16 w-40. The figcaption still reads the six values.

Listings over six days: 186, 205, 171, 243, 268, 221.

Animated Time Series

A six-point window slides over a 30-point stream, each step animating in over 320ms. It plays on a timer, so it starts paused behind a Play button.

A six-minute window over a half-hour stream of review queue depth; depth cycles between about 65 and 200 lots. The window advances one minute per step while playing.

AreaChart

Simple Area Chart

Two series over the same weeks. The original fades each fill into a vertical gradient; gradients are off-system, so both areas take their series colour flat at 25% under a 2px stroke.

Delivered orders rise from 182 in week 23 to 291 in week 28; pending orders peak at 72 in week 25 and fall to 29.

Stacked Area Chart

Three channels stacked into the weekly listings total, chart-1 to chart-3 in order. Stack totals are real: the caption reads the sum, not the top band.

Weekly listings climb from 202 to 293. Scheduled carries the bulk, 120 to 175; webhook 58 to 104; manual stays between 9 and 24.

Ranged Area Chart

A [low, high] tuple per point draws the band between the two instead of down to the baseline. The tooltip formats the tuple as a range so it never prints as a comma-joined pair.

Lot search latency between the 10th and 90th percentile. The band is widest on Wednesday, 240 to 1150 ms, and narrowest on Sunday, 110 to 360 ms.

Area Chart Connect Nulls

Six charts in three pairs: one series then a stack, each drawn with connectNulls off and on, over data with a missing reading and data with a missing day. Each pair is labelled, and the captions say what actually happens — a lone series is bridged, a stacked one counts as zero and pinches to the baseline.

One series, one missing day

connectNulls off

Scheduled listings measure 40, 34, 28, no reading, 22, 26, 33. The missing Thursday leaves a break in the area.

connectNulls on

The same series with connectNulls: the break is bridged straight from Wednesday's 28 to Friday's 22.

Stacked, one missing day

connectNulls off

Three stacked series; scheduled has no Thursday reading, so the stack drops to webhook and manual alone that day.

connectNulls on

The same stack with connectNulls: the areas stay continuous, but a stacked series with no value counts as zero, so Thursday pinches towards the baseline rather than being bridged.

Stacked, a whole day and a single series missing

connectNulls off

Wednesday has no readings at all and Saturday is missing scheduled; both collapse the stack towards the baseline.

connectNulls on

With connectNulls no segment is dropped, but Wednesday's missing readings still stack as zero, so the whole stack pinches to the baseline there and loses its scheduled band on Saturday.

Cardinal Area Chart

One dataset under two curve interpolations. d3's curveCardinal needs d3-shape, which this app does not depend on, so the second curve is Recharts' own natural spline — same comparison, no new package.

Bids per week: 22, 48, 31, 64, 41, 57, drawn twice — once with a monotone curve that never overshoots a point, once with a natural spline that does.

Percent Area Chart

stackOffset="expand" normalises the stack to 100% while the payload keeps the raw counts. The tooltip states both, which ChartTooltipContent has no shape for, so this one renders its own on bg-popover with the hairline and shadow-sm.

Share of weekly GMV by category. Personal care holds roughly half throughout, 48 to 56 per cent; food & drink swings between 27 and 40 per cent; household stays between 11 and 17 per cent.

Synchronized Area Chart

One syncId across three charts: hovering any of them moves the cursor and tooltip in all three to the same day. The third series keeps the original's dashed stroke, thinned from 4px to 2px to match the other two.

Listings per day: 64, 71, 58, 83, 76, then 31 and 27 at the weekend.
Bids per day: 12, 9, 17, 11, 14, then 3 and 2 at the weekend.
GMV per day in euros: 38, 44, 35, 51, 47, then 19 and 16 at the weekend.

Tiny Area Chart

No axes, grid or tooltip — the shape is the whole message. Overrides the container's aspect-video with a fixed 64 by 160.

Listings per day: 64, 71, 58, 83, 76, 31.

Area Chart Fill By Value

The original splits one area with a gradient stop at zero. Gradients are off-system, so the series splits into two clamped at zero: surplus on --success, deficit on --danger, semantic because each series is that status. The break-even line is chrome on border-strong.

Net payout per day in euros: €420, €310, minus €180, €90, minus €260, minus €40, €380. Three of seven days close at a loss; the worst is Friday at minus €260.

Custom Animation Example

Recharts 3.8 has no animationInterpolateFn or AreaRevealShape (both land after it), so the grow-from-bottom interpolation is not portable. What survives is user-controlled motion: Replay remounts the series, Swap repeats the update animation, both at the system's 320ms ease-out.

Lot views per category in the current dataset, between 1,100 and 4,600. The buttons above replay the entrance and swap the data so the update animation can be watched.

Range Area Custom Animation

Range data gives the area an inner baseline path to interpolate as well as an outer one. Same substitution as above — no animationInterpolateFn in 3.8 — and the contrived doubled top series becomes a second honest band, p75 to p99 above p25 to p75.

Monthly search latency in milliseconds, as two stacked bands: the typical p25–p75 range and the p75–p99 tail above it. Both bands are widest in June.

Area Chart With Custom Events

Every pointer handler on the chart root, typed with MouseHandlerDataParam and getRelativeCoordinate. The original logs to the console; here the last event lands in a polite live region, so it is readable without devtools and announced to a screen reader.

Bids per hour, 08:00 to 19:00: 3, 7, 12, 9, 4, 6, 14, 11, 8, 5, 2, 1. The peak is 14 at 14:00.

No chart event yet — hover, click or right-click the chart.

Prevent right click menu

onContextMenu calls preventDefault, so the browser menu never opens over the plot. Nothing replaces it, so no action becomes right-click-only.

GMV per day, in thousands of euros: 640, 712, 588, 834, 761, then 312 and 274 at the weekend.

BarChart

Simple Bar Chart

Two grouped series on chart-1 and chart-2, each bar carrying its value. The original's 10px corners drop to the system's 4px and bars cap at 24px wide.

Antwerp Stock NV has the most views at 51 with 3 offers; Rhine Outlet GmbH has 29 views and 24 offers, the highest share. Baltic Goods OÜ is lowest at 17 views.

Stacked Bar Chart

One stack per category with the total on top and the slot behind each bar on surface-2. Tops stay square so the segments read as one column.

Personal care lists the most at 76 lots, 64 sold by bid. Toys is the smallest category at 40 and the least bid-driven, 9 of 40. Household closes 28 of 50 by offer.

Population Pyramid

Two mirrored distributions around zero via stackOffset="sign", the left side stored negative and the axis dropping the sign. Recoloured to chart-1 and chart-2: seller and buyer are categories, not statuses.

Sellers respond to 72.5% of all offers and buyers to 27.5%. Seller responses cluster at 1 to 5 seconds (22%); buyer responses cluster at 1 to 5 minutes (8%) and 5 to 30 minutes (7%).

Timeline

Absolute [start, end] ranges on one stacked track, a Gantt row per order. The original colours each row from inside a custom shape; here the outcome is the series, so success, danger and running are earned and the legend explains them.

Eight orders over eleven minutes. SL-2026-0408 waits longest, 5.4 minutes, and is still shipping at 11; SL-2026-0403 and SL-2026-0406 were cancelled after 1.3 and 1.1 minutes of processing; the other four were delivered.

Candlestick

Body is a range bar from open to close, wick an asymmetric ErrorBar behind it. Up closes take success and down closes danger; the wick stays on muted-foreground because ErrorBar takes one colour for the whole series.

Lot price opens at €4.10 and closes at €4.69, a high of €4.80 at 20:00 and a low of €4.02 at 09:00. Eight of twelve hours close up.

Box Plot

Interquartile range as a range bar, whiskers as an ErrorBar, median as a surface-coloured rule through the box, outliers as a Scatter on chart-5. Five sellers instead of 100 synthetic points.

Antwerp Stock NV is fastest, median 1.7s; Rhine Outlet GmbH slowest, median 3.0s and the widest box, 2.6 to 3.4s. Seven outliers, the worst a 6.1s Rhine Outlet GmbH response.

Animated Bar Width

Bars rest at a fifth of their slot and grow to full width on hover, over 320ms ease-out instead of the original 200ms. A transparent hitbox keeps the pointer from falling into the gap, and the tooltip parks on the plot floor. The label inside the bar is dropped: nothing fits at a fifth width.

Pending bids peak at 27 at 15:00 with a second ridge of 24 at 11:00, and drain to 3 by 19:00.

Waterfall

Each bar starts where the last ended, held as an absolute range. Contributions take success, deductions danger, and the closing total chart-1 because a subtotal is not a status. The figures close: 420 + 210 − 170 − 120 − 60 = 280.

Commission €420k and listing fees €210k build to €630k; logistics €170k, payment processing €120k and support €60k take €350k back out, leaving a net margin of €280k.

Animated Bar series

A six-minute window sliding over thirty minutes of throughput. recharts 3.8 has no animationMatchBy or animationInterpolateFn, so the custom swipe interpolation is gone; the window still steps and a Play/Pause button owns the timer.

A six-minute window sliding over thirty minutes of lots listed; the full series runs between 6 and 27 lots a minute.

Mix Bar Chart

Two stacked series beside a third standalone bar. The original greys the unfocused series to #eee on legend hover; that reading falls under 3:1, so the legend becomes the house visibility toggle with aria-pressed.

The listed-plus-verified pipeline runs 30 to 41 lots a week, peaking in week 4. Sold climbs steadily from 9 to 21 and overtakes verified in week 6.

Custom Shape Bar Chart

A bell path instead of a rectangle, with the active bar's outline easing in over 320ms. The decorative seven-colour cycle becomes chart-1 through chart-6, and the value labels stay on muted-foreground because the hues only clear 3:1.

Antwerp Stock NV lists the most, €152k GMV; Baltic Goods OÜ the least, €41k. Total €579k across six sellers.

Positive and Negative Bar Chart

Signed bars around a zero reference line, with the y-axis ticks coloured by sign — success above, danger below, neutral and bold at zero. Sign is the subject here, so the status tokens are earned.

Household clears backlog in four of seven weeks, best W1 at plus 40 and worst W2 at minus 30. Electronics swings wider, minus 48 in W3 and plus 48 in W5.

Brush Bar Chart

Forty days behind a brush: track on surface-2, frame and travellers on border-strong, traveller labels forced up to muted-foreground because they otherwise inherit the frame's stroke.

Forty days of orders fulfilled, 2 to 92 a day, against the net queue change, which swings from plus 37 on day 19 to minus 42 on day 26. The brush selects a range.

Bar Chart With Customized Event

Click a bar to select it. The original logs to the console and carries the state on fill opacity alone; selection here is opacity plus an outline, and a polite live region names what is selected.

Click a bar to select a seller.

Lots listed per seller: Nordic Retail AB 40, Iberia Surplus SL 35, Tilburg Trading BV 30, Antwerp Stock NV 28, Rhine Outlet GmbH 20, Baltic Goods OÜ 19.

Bar Chart With Min Height

minPointSize keeps an 8 and an 18 visible beside values in the thousands. The original's filled label circle becomes the house LabelList so the value is not a second coloured shape.

Lots listed run 8 to 4,800 and bids received run 18 to 4,000. Rhine Outlet GmbH listed 8 lots and Baltic Goods OÜ received 18 bids; both still draw a bar.

Bar Chart Stacked By Sign

stackOffset="sign" splits each stack around zero. No stack total: a signed stack has two, one each side, and either label would land on the reference line.

W7 clears the most backlog, 78 lots across both categories; W3 adds the most, 68. W2, W5 and W6 split, one category clearing while the other falls behind.

Biaxial Bar Chart

Counts on the left axis, euros on the right, both axes recessive on the house tick style.

Lot views peak Thursday at 498 but GMV peaks Wednesday at €31.60 on only 275 views, the priciest day per view. Saturday is lightest, 140 views for €8.70.

Bar Chart with background

The first series draws its full slot behind the bar on surface-2, so the fill reads as a share of capacity.

Dock slots used peaks Thursday at 88 of 100 with 34 lots queued behind it; Saturday uses 23 with 4 queued.

Bar Chart With Multi X Axis

A second x-axis brackets the months into quarters. The original's red separators become border hairlines and the quarter labels muted-foreground.

Lots listed range 1,398 in February and September to 4,800 in May and December. Bids track them loosely and peak in December at 810. Q4 is the strongest quarter.

Ranged Stacked Bar Chart

Three contiguous latency bands per seller as absolute ranges under one BarStack. The 25px pill stack goes square: stacked bars keep square tops.

Antwerp Stock NV is tightest, 30 to 220 ms end to end; Rhine Outlet GmbH widest, 90 to 540 ms. Every seller's p50 lands between 80 and 160 ms.

Ranged Bar Chart

One bar per day spanning that day's low and high concurrent lot views — a single series with no baseline at zero.

Concurrent lot views span 1 to 40 over nine days. The busiest day is 05-05, never dropping below 18; the quietest is 05-09, peaking at 14.

Tiny Bar Chart

No axes, no legend, no tooltip. The container drops aspect-video for a fixed 160×64 box and the caption carries the numbers the shape cannot.

Lots listed per day this week, 40 on Monday down to 19 on Friday and back to 35 on Sunday.

Animate by Scroll

Scroll position is the clock: bars grow as the figure rises through the viewport and shrink if the reader scrolls back. recharts 3.8 has no AnimationControllerProvider, so the progress is measured here and the bars render with isAnimationActive={false}. Reduced motion draws them full height.

Lot views and offers per seller, drawn in as the chart scrolls into view: Antwerp Stock NV 51 views, Rhine Outlet GmbH 29 views against 24 offers, Baltic Goods OÜ lowest at 17.

Stacked Bar Chart with Horizontal Line

Three cost centres stacked against a budget line. The threshold takes warning, not danger — overspend is recoverable — and the total loses its white pill for the house LabelList.

Monthly operating cost runs €7,900 to €16,000. Only March crosses the €14,000 budget, at €16,000, driven by €9,800 of shipping. January is cheapest at €7,900.

ComposedChart

Line Bar Area Composed Chart

Four marks on one axis — area, bar, line, scatter — on chart-1 to chart-4 in declaration order. The area fill drops to 20% so the bars in front of it stay legible.

Weekly warehouse capacity rises from 1,400 to 1,700 pallets. Lots listed climb from 800 to 1,380 and orders placed from 590 to 1,240; disputes stay between 350 and 590.

Same Data Composed Chart

One measurement drawn twice, as bars and as a line. The value is duplicated into a field per mark because legend and tooltip identify a series by its dataKey, and two marks sharing a key collapse into one entry.

Orders placed per week: 590, 868, 997, 1,080, 1,020, 1,240 — drawn once as bars and once as a line over the same axis.

Vertical Composed Chart

layout="vertical" puts the categories on the y axis, so category names read straight. The grid flips with it (horizontal={false}) and the bars round on the trailing edge; the container takes a portrait ratio instead of aspect-video.

Capacity, lots listed and orders placed per category. Toys does the most work, 1,380 of 1,700; Personal care the least, 800 of 1,400.

Composed Chart With Axis Labels

Both axes carry a title. Recharts draws the label object as its own text node, outside the tick selector ChartContainer restyles, so the class that matches the ticks goes on the label itself.

Capacity, lots listed and orders placed by week, with both axes titled. Lots listed climb from 800 to 1,380 against capacity rising from 1,400 to 1,700.

Scatter And Line Of Best Fit

Measurements as points, each fit as a two-endpoint line in the same colour. The fits carry legendType and tooltipType "none" so they stay out of both — the tokens' way of doing what the original does with hand-filtered payloads.

Fulfilment time against lot value. Nordic Retail AB climbs from 210 h at €1,200 to 1,180 h at €9,000; Rhine Outlet GmbH from 120 h to 540 h over the same range. Both fits are close to linear.

Banded Chart

A forecast band behind the actual line, both bridging a week with no forecast via connectNulls. The band is a backdrop rather than a series: surface-2, and legendType and tooltipType "none" instead of the original's custom legend and tooltip components.

GMV against its forecast band, in € thousands per week: 0, 106, 229, 312, 451, 623. Every reading falls inside the band, which runs from 50 to 300 in week 24 and 305 to 821 in week 28. Week 26 has no forecast.

Target Price Chart with active Label

Hovering pins the value of each series in the plot instead of gathering them in a tooltip, so the tooltip renders nothing and only its cursor remains. The band drops its own label, which would have printed a tuple.

Weekly GMV against target, in thousands of euros over fourteen weeks. GMV climbs from 31.7 to 44.9 while the target moves from 39.7 to 48.0, so the gap never closes. The plan band widens from 29.8–44.0 to 37.0–50.0.

ScatterChart

Simple Scatter Chart

Two sellers on chart-1 and chart-2, dot size from the z axis. Tooltip rows are named by the axis that produced them, so the axis keys carry the labels.

Nordic Retail AB sits between €10,000 and €17,000 lot value at a 4 to 11 cent fee; Rhine Outlet GmbH lists higher-value lots, €18,000 to €25,000 at a 6 to 12 cent fee. Dot size is views, 85 to 200.

Three Dim Scatter Chart

The same three measures with a wider z range, star against triangle. Shape repeats what colour says so the two sellers survive a colour-blind reading.

Three measures at once: lot value across, fee up, views as dot size. Nordic Retail AB peaks at 300 views at €15,000 lot value; Rhine Outlet GmbH stays between 125 and 160 views.

Joint Line Scatter Chart

Points joined by a line, linear for one scheduler and monotone for the other. The line takes the series colour; the fixed z range keeps every dot the same size.

Both schedulers flatten out: batched reaches 130 orders a minute at 12 workers, greedy keeps climbing to 150 at 16. Greedy is slower below 6 workers.

Bubble Chart

Seven single-row charts, one per weekday, bubble area by queue depth on a shared domain. Only the last row prints its hours; the rest keep zero-size ticks so the rows stay aligned.

Sunday: the queue is deepest at 10a with 16 bids waiting and shallowest at 3a with 2.
Monday: the queue is deepest at 9a with 42 bids waiting and shallowest at 3a with 4.
Tuesday: the queue is deepest at 9a with 42 bids waiting and shallowest at 3a with 4.
Wednesday: the queue is deepest at 9a with 42 bids waiting and shallowest at 3a with 4.
Thursday: the queue is deepest at 9a with 42 bids waiting and shallowest at 3a with 4.
Friday: the queue is deepest at 9a with 42 bids waiting and shallowest at 3a with 4.
Saturday: the queue is deepest at 10a with 16 bids waiting and shallowest at 3a with 2.

Custom Animation

Recharts 3.8 has no animationInterpolateFn, so the staggered entrance is three interleaved Scatters offset by animationBegin, each still 320ms ease-out. Replay and the week swap are buttons, so the motion only runs when asked.

This week
This week: fulfilment time climbs from 2.1 days at €8,000 lot value to 7.1 days at €26,000. Dot size is views, 45 to 180.

Scatter Chart With Labels

A LabelList inside each dot on chart-foreground. The original turned the hovered dot green; a second hue would read as a second series, so it takes an ink ring instead.

Six categories. Lots listed a week rise with the AI-assisted share, from 120 lots at 42 percent to 320 at 74 percent; the most automated category at 88 percent lists 260. Dot size is sellers, 3 to 8.

Multiple Y Axes Scatter Chart

Two cost scales, cents on the left and a ten-times-larger range on the right, each series bound to its own axis.

Two fee scales on one plot: Nordic Retail AB pays 4 to 11 cents a lot, read on the left; Rhine Outlet GmbH pays 280 to 780 cents, read on the right.

Scatter Chart With Cells

A custom Symbols shape per point. The original cycled four web colours plus red and pink; the cycle is now chart-1 to chart-6 in order, symbol and hue advancing together.

Six categories from €10,000 to €17,000 lot value at a 4 to 11 cent fee per lot; each carries its own hue and symbol.

Scatter Chart with many points (performance test)

A runtime demo: a thousand points in a hundred series, kept at full count, drawn with isAnimationActive={false} and half-opacity fills. Delivered and cancelled are real statuses, so success and danger are the right tokens.

A thousand orders in 100 batches, latency 40 to 400 milliseconds against cost 1 to 100 cents. 49 batches delivered, 51 cancelled.

PieChart

Two Level Pie Chart

Stages inside, the categories that make them up outside, the two totals equal. Both rings run the six hues from the start; radius and the 2px surface stroke separate them, not colour.

Ninety lots this week. Inner ring by stage: draft 42, under review 30, listed 18. Outer ring by category: personal care 24, food & drink 18, household 17, electronics 13, beauty 11, toys 7.

Straight Angle Pie Chart

A half pie from 180 to 0 degrees, six stages on chart-1 to chart-6 in order, each slice labelled with its tokens. The legend sits above the arc, the only space a semicircle leaves.

Lots by pipeline stage, 1,667 in total: submitted 400, photos checked 300, priced 300, cleared 278, compliance 200, listed 189.

Custom Active Shape Pie Chart

The hovered slice grows an outer arc and a leader line to its numbers. The callout text is ink and muted ink rather than the slice hue: the hues are tuned to 3:1 as fills, not to 4.5:1 as 12px type.

A thousand lots: draft 400, review 300, archived 200, listed 100. Hovering a slice pulls it out and reads its share.

Pie Chart With Customized Label

Percentages drawn inside each slice on chart-foreground. The original dimmed the other slices to 50% on hover, which takes those percentages under 4.5:1, so the hovered slice takes an ink ring instead.

A thousand two hundred lots by stage: draft 400 (33%), review 300 (25%), listed 300 (25%), archived 200 (17%).

Pie Chart with gap and rounded corners

A ring where paddingAngle and a 50% corner radius turn the slices into separate pills. The gap already separates them, so the 2px surface stroke only shows where a pill meets the background. A legend names the stages the ring cannot label.

A thousand two hundred lots by stage: draft 400, review 300, listed 300, archived 200.

Pie Chart With Needle

A gauge: the bands are statuses, so danger, warning and success are the right tokens. The needle is muted-foreground because it points, it does not report a fourth state.

Offer response time against its target: the first tenth of the dial is a breach, the next quarter is watch, the rest is healthy. The needle sits in the healthy band.

Pie Chart in Flexbox

Three of the same ring in a flex row, each box sized differently, all still square. The chart reads its size from ChartContainer, so the layout is plain Tailwind flex utilities.

flex-1 box. Lots by stage: draft 42, review 30, listed 18, archived 10.
max-w-[240px] box. Lots by stage: draft 42, review 30, listed 18, archived 10.
basis-1/3 box. Lots by stage: draft 42, review 30, listed 18, archived 10.

Pie Chart in Grid

The same ring across a three-column grid, one chart spanning 2×2, two single cells and one full-width row.

2×2 cell. Lots by stage: draft 42, review 30, listed 18, archived 10.
1×1 cell. Lots by stage: draft 42, review 30, listed 18, archived 10.
1×1 cell. Lots by stage: draft 42, review 30, listed 18, archived 10.
3×1 cell. Lots by stage: draft 42, review 30, listed 18, archived 10.

Pie Chart with Gradient

The original filled each slice with a radial gradient. The system has no gradients in charts, so the slices are flat chart-1 to chart-4 and the shape carries the reading on its own.

A thousand euros of monthly GMV: personal care €620, food & drink €240, household €90, electronics €50.

RadarChart

Simple Radar Chart

One seller's listing readiness across six checks. The web is a 2px stroke with the fill at 0.2 so the grid stays readable through it; the grid itself is `border`, restyled by the container.

Coverage out of 100: Photos 92, Pricing 85, Description 78, Shipping 71, Compliance 64, Payment 58.

Specified Domain Radar Chart

The radius axis is pinned to 0–150 instead of fitted to the data, so two sellers compare on one scale. Both webs take chart-1 and chart-2 at 0.2 fill — the original's 0.6 muddies where they overlap.

Lots listed this month on a fixed 0–150 scale. Nordic Retail AB leads Personal care 120 to 110 and Electronics 99 to 100 is near level; Tilburg Trading BV leads Food & drink 130 to 98, Household 130 to 86, Beauty 90 to 85 and Toys 85 to 65.

Range Radar Custom Animation

Each point is a p50–p95 band rather than a value, and the web grows out of the centre on mount. recharts 3.8 has no `animationInterpolateFn`, so the band is interpolated in state over 320ms ease-out; Replay re-runs it and reduced motion skips straight to the end.

Response time in seconds, p50 to p95: Payout 30–110, Seller onboarding 55–120, Refunds 40–95, Disputes 65–135, Bid response 50–105, VIES check 70–125.

RadialBarChart

Simple Radial Bar Chart

Six shares of this month's GMV, one ring each on chart-1…6, with the rest of the turn as a `surface-2` background sector. The angle axis is pinned to 0–100 so a ring's sweep is its percentage, and the legend moves from the right edge to the bottom.

Share of this month's GMV: Personal care 31.5%, Food & drink 26.7%, Household 15.7%, Electronics 9.3%, Beauty 8.6%, Toys 8.2%.

Radial Bar Chart with Click to Focus Legend

Clicking a legend entry or a ring focuses one seller and dims the rest to 0.25 fill; clicking it again clears. The original's random per-sector palette becomes chart-1…6 in order, and the legend entries are `aria-pressed` buttons so focus is reachable without a mouse.

Lots listed this week: Nordic Retail AB 134, Tilburg Trading BV 112, Rhine Outlet GmbH 96, Antwerp Stock NV 74, Baltic Goods OÜ 58, Iberia Surplus SL 41.

Treemap

Bundle Size Treemap

Summary tiles over a treemap you drill into a level at a time. The recharts bundle manifest becomes this product's own monthly lot GMV, category → seller → lot, so the nesting still has three levels and fifteen leaves.

Measured month
September
Total GMV
€1,625
Largest category
Household, €450
Monthly lot GMV of €1,625: Household €450, Personal care €390, Food & drink €330, Beauty €205, Electronics €155, Toys €95. Selecting a category opens its sellers, and a seller its lots.

Simple Treemap

One rectangle per lot, sized by GMV and coloured by the category it belongs to. recharts' default cell hardcodes a white stroke and black labels, so the port supplies content: chart-1…6 by branch, 2px `surface` gutters, and a label only where the cell is wide enough for it.

Monthly lot GMV of €1,625: Household €450, Personal care €390, Food & drink €330, Beauty €205, Electronics €155, Toys €95. The largest single lot is Dishwasher tablets at €210.

Custom Content Treemap

The custom cell keeps the branch block solid and its lots transparent, with the category's rank and name inside. Ink is `chart-foreground`, the token for text on a chart fill — `foreground` drops under 4.5:1 on all six hues.

Monthly lot GMV by category, biggest first: Household €450, Personal care €390, Food & drink €330, Beauty €205, Electronics €155, Toys €95.

Nested Treemap

`type="nest"`: selecting a category opens its sellers and a breadcrumb back. Depth carries the fill — a branch is the full hue, anything under it a 0.45 tint of the same one.

Monthly lot GMV of €1,625 across six categories: Household €450, Personal care €390, Food & drink €330, Beauty €205, Electronics €155, Toys €95. Selecting a category opens its sellers, and a seller its lots.

Treemap with Padding and Gaps

recharts 3.8 has no `nodeInset` / `nodeGap`, so the cell content insets itself — 7px for a category, 4px for a seller, 2px for a lot. The gutter between two siblings is twice their inset, and each category and seller shows as a frame around the GMV underneath it.

The same €1,625 of monthly lot GMV, with each category and seller drawn as a frame around its lots: Household €450, Personal care €390, Food & drink €330, Beauty €205, Electronics €155, Toys €95.

SunburstChart

Bundle Size Sunburst

The same GMV tree in polar coordinates: categories on the inner ring, then sellers, then lots. Rings do not overlap, so depth is 1 / 0.7 / 0.45 of the branch hue, mixed against `surface` because SunburstChart takes a colour per node and no opacity.

Sunburst Chart Example

The same hierarchy swept from `startAngle` 90 over `endAngle` 270 degrees, so the ring opens at the top right. recharts prints every arc's value whatever the arc is worth, so the labels are off and the numbers sit in the tooltip and the caption.

Tooltip

Custom Content Of Tooltip

The tooltip is written by hand rather than routed through `ChartTooltipContent`, so it can carry a sentence about the queue under the value. It stays on the system's floating surface: `popover` fill, hairline, 8px radius, `shadow-sm`, 12px text.

Lots waiting per queue: Dispute 42, Compliance check 31, Photo check 24, Pricing check 18, Payout 15, Bid response 12, VIES check 9.

Tooltip Style

The original repaints the panel and every part of its text. Panel, edge and type are the container's job here, so what is left to vary is `ChartTooltipContent`'s indicator — dot, line and dashed, side by side, each pinned open with `active`.

indicator="dot"

Lots listed per day with the dot tooltip indicator. Scheduled lots 24, 28, 22, 30, 26; manual lots 6, 4, 9, 5, 7.

indicator="line"

Lots listed per day with the line tooltip indicator. Scheduled lots 24, 28, 22, 30, 26; manual lots 6, 4, 9, 5, 7.

indicator="dashed"

Lots listed per day with the dashed tooltip indicator. Scheduled lots 24, 28, 22, 30, 26; manual lots 6, 4, 9, 5, 7.

Legend

Legend with Opacity

Pointing at or tabbing to a legend entry dims the other lines' strokes to 0.25; the labels never fade, so 12px text stays over 4.5:1. recharts only hands its pointer handlers to the default legend content, so the entries are buttons written here.

Scheduled lots peak Thursday at 30 and fall to 10 on Sunday; manual lots stay between 1 and 9, highest Wednesday.

Legend Position

The original exposes thirteen `position` values and a pixel offset. The system has three places a legend belongs — over the plot, under it, beside it — set here as `verticalAlign` / `align` on `ChartLegend`.

Scheduled lots 24, 28, 22, 30, 26 through the week; manual lots 6, 4, 9, 5, 7.

Custom Legend Styles

The original's panel colour, 2px blue edge, 8px radius and bold 14px labels become `surface-2` in a hairline box at the system's radius, with the emphasis carried by ink rather than weight. Everything else the original sets by hand — type, icon size, inactive colour — is already the container's.

Offers accepted per week: 42, 51, 47, 58, 55, 61. Offers declined: 8, 6, 11, 5, 9, 7.

ResponsiveContainer

Area Responsive Container

`ChartContainer` already wraps `ResponsiveContainer`, so nothing is added: the same area chart is shown at `w-full`, `max-w-md` and `max-w-xs`, dropping ticks as it narrows. The original's green minimum and red maximum are not statuses, so both reference lines take `border-strong`.

w-full

Thousands of lot views a day at w-full: 410, 380, 520, 470, 610, 240, 180. The target line sits at 500k and Friday is the only day over it.

max-w-md

Thousands of lot views a day at max-w-md: 410, 380, 520, 470, 610, 240, 180. The target line sits at 500k and Friday is the only day over it.

max-w-xs

Thousands of lot views a day at max-w-xs: 410, 380, 520, 470, 610, 240, 180. The target line sits at 500k and Friday is the only day over it.

Composed Responsive Container

Area, bar and line on one plot at the same three widths. The bar keeps its 20px size, so at `max-w-xs` the gaps close rather than the bars stretching.

w-full

Capacity, lots reviewed and queue depth by hour at w-full. Lots reviewed climb from 59 at 08:00 to 152 at 16:00; spare capacity is lowest at 12:00 with 99 against 140 lots reviewed.

max-w-md

Capacity, lots reviewed and queue depth by hour at max-w-md. Lots reviewed climb from 59 at 08:00 to 152 at 16:00; spare capacity is lowest at 12:00 with 99 against 140 lots reviewed.

max-w-xs

Capacity, lots reviewed and queue depth by hour at max-w-xs. Lots reviewed climb from 59 at 08:00 to 152 at 16:00; spare capacity is lowest at 12:00 with 99 against 140 lots reviewed.

Pie Responsive Container

A pie has no ticks to drop, so it scales with its box: `outerRadius` is a percentage and the leader labels follow it in. Slice colours come from `shape`, since recharts 3.8 deprecates `Cell`; the slices are named in the tooltip and the caption, as in the original.

w-full

Lots this week by stage at w-full, 1,200 in total: Draft 400, Photo check 300, Priced 300, Review 200.

max-w-md

Lots this week by stage at max-w-md, 1,200 in total: Draft 400, Photo check 300, Priced 300, Review 200.

max-w-xs

Lots this week by stage at max-w-xs, 1,200 in total: Draft 400, Photo check 300, Priced 300, Review 200.

XAxis

Multiple X Axes

Once one axis has an `xAxisId`, every axis, every line and the tooltip needs one. Only the day axis carries tick labels; the three value axes are `mirror` rules inside the plot so four scales do not become four rows of numbers.

Four series over one week. Bids 30, 34, 27, 38, 35, 14, 11; lots 24, 28, 22, 30, 26, 12, 9; lot views in thousands 410, 380, 520, 470, 610, 240, 180; GMV in thousands of euros 62, 57, 78, 71, 92, 36, 27.

Automatic X Axis Height

Rotated labels longer than the axis' 30px default get cut off. The original fixes that with `height="auto"`, which recharts 3.8 implements for `YAxis width` only, so the second chart states the height the labels need — 84px, measured for six 18-character labels at 35 degrees.

height={30}

Lots by intake source with the x axis 30 pixels tall: Scheduled cron 420, Inbound webhook 310, Partner referral 278, Manual trigger 240, Email intake 205, Support escalation 189.

height={84}

Lots by intake source with the x axis 84 pixels tall: Scheduled cron 420, Inbound webhook 310, Partner referral 278, Manual trigger 240, Email intake 205, Support escalation 189.