Streamgraph

Layered streams on a wiggle baseline that morph between ranges, with a layer you can isolate and read week by week.

pnpm dlx shadcn@latest add @uiarc/streamgraph
Live · keyboard ready

Support tickets by topic

22,616 tickets

Support tickets by topic, Week of Sep 22, 2025 to Week of Sep 14, 2026. Bugs, latest 108 tickets. Billing, latest 78 tickets. Integrations, latest 96 tickets. Onboarding, latest 63 tickets. Account access, latest 43 tickets. Feature requests, latest 82 tickets.

Support tickets by topic
WeekBugsBillingIntegrationsOnboardingAccount accessFeature requests
Week of Sep 22, 2025110 tickets78 tickets35 tickets55 tickets53 tickets61 tickets
Week of Sep 29, 2025130 tickets80 tickets37 tickets56 tickets49 tickets62 tickets
Week of Oct 6, 2025136 tickets70 tickets33 tickets63 tickets48 tickets61 tickets
Week of Oct 13, 2025130 tickets79 tickets35 tickets61 tickets49 tickets59 tickets
Week of Oct 20, 2025125 tickets71 tickets39 tickets58 tickets45 tickets63 tickets
Week of Oct 27, 2025151 tickets68 tickets38 tickets70 tickets40 tickets61 tickets
Week of Nov 3, 2025141 tickets74 tickets42 tickets69 tickets40 tickets58 tickets
Week of Nov 10, 2025129 tickets74 tickets38 tickets66 tickets42 tickets57 tickets
Week of Nov 17, 2025137 tickets73 tickets46 tickets70 tickets38 tickets57 tickets
Week of Nov 24, 2025140 tickets77 tickets47 tickets72 tickets34 tickets60 tickets
Week of Dec 1, 2025139 tickets79 tickets41 tickets65 tickets37 tickets57 tickets
Week of Dec 8, 2025138 tickets79 tickets45 tickets75 tickets40 tickets64 tickets
Week of Dec 15, 2025107 tickets72 tickets48 tickets70 tickets33 tickets57 tickets
Week of Dec 22, 202575 tickets51 tickets34 tickets55 tickets26 tickets40 tickets
Week of Dec 29, 202571 tickets52 tickets30 tickets73 tickets27 tickets38 tickets
Week of Jan 5, 202699 tickets67 tickets49 tickets136 tickets42 tickets48 tickets
Week of Jan 12, 2026111 tickets69 tickets52 tickets174 tickets49 tickets52 tickets
Week of Jan 19, 2026106 tickets68 tickets56 tickets159 tickets49 tickets52 tickets
Week of Jan 26, 2026104 tickets78 tickets53 tickets144 tickets56 tickets52 tickets
Week of Feb 2, 2026102 tickets79 tickets53 tickets88 tickets49 tickets46 tickets
Week of Feb 9, 2026101 tickets72 tickets56 tickets59 tickets55 tickets46 tickets
Week of Feb 16, 202696 tickets71 tickets56 tickets48 tickets49 tickets45 tickets
Week of Feb 23, 202695 tickets72 tickets60 tickets43 tickets44 tickets45 tickets
Week of Mar 2, 202697 tickets76 tickets58 tickets38 tickets42 tickets44 tickets
Week of Mar 9, 2026104 tickets77 tickets60 tickets37 tickets43 tickets50 tickets
Week of Mar 16, 2026103 tickets81 tickets60 tickets39 tickets40 tickets44 tickets
Week of Mar 23, 2026120 tickets87 tickets66 tickets35 tickets37 tickets46 tickets
Week of Mar 30, 2026122 tickets146 tickets65 tickets36 tickets40 tickets51 tickets
Week of Apr 6, 2026124 tickets203 tickets68 tickets34 tickets37 tickets50 tickets
Week of Apr 13, 2026141 tickets198 tickets66 tickets35 tickets39 tickets51 tickets
Week of Apr 20, 2026128 tickets119 tickets63 tickets36 tickets35 tickets47 tickets
Week of Apr 27, 2026139 tickets81 tickets72 tickets38 tickets40 tickets47 tickets
Week of May 4, 2026139 tickets80 tickets68 tickets35 tickets39 tickets54 tickets
Week of May 11, 2026136 tickets74 tickets70 tickets36 tickets43 tickets52 tickets
Week of May 18, 2026139 tickets77 tickets73 tickets42 tickets47 tickets52 tickets
Week of May 25, 2026131 tickets79 tickets68 tickets47 tickets51 tickets56 tickets
Week of Jun 1, 2026125 tickets70 tickets78 tickets48 tickets47 tickets57 tickets
Week of Jun 8, 2026133 tickets74 tickets84 tickets50 tickets53 tickets63 tickets
Week of Jun 15, 2026165 tickets85 tickets145 tickets54 tickets53 tickets67 tickets
Week of Jun 22, 2026199 tickets102 tickets147 tickets60 tickets50 tickets69 tickets
Week of Jun 29, 2026156 tickets93 tickets136 tickets55 tickets48 tickets70 tickets
Week of Jul 6, 2026114 tickets109 tickets103 tickets62 tickets50 tickets65 tickets
Week of Jul 13, 2026110 tickets100 tickets81 tickets68 tickets44 tickets73 tickets
Week of Jul 20, 2026103 tickets89 tickets79 tickets65 tickets40 tickets73 tickets
Week of Jul 27, 2026100 tickets78 tickets83 tickets70 tickets38 tickets81 tickets
Week of Aug 3, 2026102 tickets85 tickets90 tickets69 tickets41 tickets72 tickets
Week of Aug 10, 202688 tickets74 tickets84 tickets73 tickets37 tickets79 tickets
Week of Aug 17, 2026102 tickets77 tickets93 tickets67 tickets35 tickets84 tickets
Week of Aug 24, 2026105 tickets77 tickets82 tickets66 tickets33 tickets74 tickets
Week of Aug 31, 202693 tickets80 tickets87 tickets74 tickets36 tickets80 tickets
Week of Sep 7, 2026100 tickets72 tickets96 tickets64 tickets40 tickets85 tickets
Week of Sep 14, 2026108 tickets78 tickets96 tickets63 tickets43 tickets82 tickets
  • Showing the changing share of topics, channels, or genres week by week.
  • Storytelling dashboards where the shape of seasonality and spikes is the point.
  • Comparing ranges where a morph between them explains what changed.
  • Use line-chart when exact values or comparisons between series matter.
  • Use bar-chart for a few periods or categories.
  • Avoid it for data with negative values; streams stack magnitudes.

Installation

Add Streamgraph with the shadcn CLI, or copy the source by hand.

pnpm dlx shadcn@latest add @uiarc/streamgraph

Adds the component and its local dependencies, and installs motion. First time? Add the @uiarc registry to components.json, or use the full URL:

example.tsx
import { Streamgraph } from "@/registry/components/streamgraph/streamgraph"; const series = [{ key: "bugs", label: "Bugs" }, { key: "billing", label: "Billing" }, { key: "onboarding", label: "Onboarding" }];const data = weeks.map(week => ({ key: week.iso, label: `Week of ${week.name}`, axisLabel: week.monthStart ? week.month : undefined, values: week.tickets })); export function TicketsByTopic() {  return <Streamgraph data={data} series={series} label="Support tickets by topic" unit="tickets" categoryLabel="Week" />;}

Streamgraph

Layers stacked on a wiggle baseline that flow over time. Switching ranges morphs every layer; hovering one isolates it and reads every layer at that point.

PropTypeDefaultDescription
dataRequired{ key: string; label: string; axisLabel?: string; values: Record<string, number | undefined> }[]–Points in time. Datasets of any length morph into each other.
seriesRequired{ key: string; label: string; color?: string }[]–Layers from the centre out: the first runs through the middle and the rest alternate above and below it.
labelRequiredstring–Names the chart for assistive technology.
unitstring""Unit after each value.
heightnumber260Plot height in pixels.
offset"wiggle" | "silhouette" | "zero""wiggle"Wiggle minimises layer slopes, silhouette centres the stack, zero stacks from a flat baseline.
formatValue(value: number, series) => string–Formats values in the tooltip and table.
hiddenSeriesstring[]–Controlled hidden layers. A hidden layer thins to nothing and the rest reflow.
defaultHiddenSeriesstring[]–Initial hidden layers when uncontrolled.
onHiddenSeriesChange(hidden: string[]) => void–Called when a legend toggle is pressed.
onActiveChange(index: number | null, seriesKey: string | null) => void–Called as the reading moves between points and layers.
legendbooleantrueLayer toggles above the plot.
directLabelsbooleantrueNames each layer at its thickest stretch when the text fits.
categoryLabelstring"Date"Header of the first column in the screen reader table.
emptyLabelstring"No data for this range"Shown when there are no points.
classNamestring–Extra class on the figure.
Tab
Focuses the plot and reads the latest point.
ArrowLeftorArrowRight
Moves through time.
ArrowUporArrowDown
Moves the isolated layer up or down the stack.
PageUporPageDownorHomeorEnd
Jumps by a sixth of the range, or to the first or last point.
Escape
Clears the reading.
  • The plot is a focusable group; each reading is announced with the point, the isolated layer's value, and the total.
  • Legend toggles are buttons with aria-pressed; hovering or focusing one isolates its layer.
  • A visually hidden table lists every point and layer value.
  • Layers are separated by a 2px surface gap and named in place, so identity never rests on shade alone.
  • The stream swells out of a hairline along its centre the first time it is seen.
  • New data blends every layer on a shared grid, so ranges of different lengths morph without redrawing.
  • Hidden layers thin to nothing while the rest reflow; the crosshair and tooltip glide on springs.
  • Reduced motion jumps to the final shapes and keeps the crosshair and tooltip without travel.
  • The plot fills its container; axis labels thin out to one per 72px, counted back from the latest.
  • Direct labels hide where a layer is too thin or the plot too narrow; the tooltip and legend still name it.
  • Touch drags scrub through time with pointer capture while vertical page scroll stays free.
  • Each layer is resampled once per data change onto 161 points; paint recomputes the baseline and writes paths directly.
  • Hover state re-renders only the tooltip and a few attributes; morphs never re-render React per frame.

Notes for AI

Give your coding assistant the Markdown reference instead of screenshots.

  • Choose it for how a mix changes over time when the overall rhythm matters more than exact totals.
  • Put the most important layer first; it runs through the middle of the stream.
  • Use offset="zero" when people need to read totals against a baseline, like a stacked area chart.
  • Keep layers to about eight; fold the rest into Other.

The full library index for assistants is at /llms.txt.