@invana/charts 0.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/base/theme.ts","../src/base/hooks.ts","../src/base/uplot-styles.ts","../src/base/chart-frame.tsx","../src/base/floors.ts","../src/base/use-latest.ts","../src/line-chart.tsx","../src/base/draw.ts","../src/stacked-bar-chart-v.tsx","../src/stacked-area-chart.tsx","../src/sparkline.tsx","../src/inline-meter.tsx","../src/segmented-bar.tsx","../src/heat-lane.tsx","../src/bar-chart-h.tsx","../src/bar-chart-v.tsx","../src/diverging-bar.tsx","../src/heat-strip.tsx"],"names":["React","u","uPlot","React3","React4","measured","named","jsx","NONE","React5","React6","measure","React7","jsxs","cn","React8","whole","React9","Legend","LegendItem","React10","React11","ceiling","React12","React13","React14","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The tokens a canvas draws in, resolved to concrete values.\n *\n * A canvas cannot read `var()`: `ctx.fillStyle = \"var(--color-data-1)\"` is\n * silently ignored. So every colour and size a uPlot chart uses is read off the\n * live document here, through a probe element that sits inside the chart — a\n * theme scoped to a subtree resolves the same as one on the root.\n *\n * Read on every redraw rather than cached: a redraw happens on a theme,\n * density or size change, which is exactly when a cache would be stale.\n */\n\nexport interface ChartTheme {\n /** `--color-data-1…8`, in slot order. Index 0 is slot 1. */\n data: string[]\n success: string\n warning: string\n destructive: string\n foreground: string\n mutedForeground: string\n border: string\n card: string\n /** Canvas font strings — `\"11px Inter, sans-serif\"` — for the three rungs. */\n font: { base: string; sm: string; xs: string }\n /** The same rungs in CSS pixels, for layout arithmetic. */\n size: { base: number; sm: number; xs: number }\n /** The inherited font family, for fonts a draw hook builds at device scale. */\n family: string\n}\n\nexport const DATA_SLOTS = 8\n\n/** Resolve any CSS colour (a token, `var()`, a named colour) against `host`. */\nexport function resolveColor(host: HTMLElement, css: string): string {\n const probe = document.createElement(\"span\")\n probe.style.color = css\n probe.style.display = \"none\"\n host.appendChild(probe)\n const value = getComputedStyle(probe).color\n probe.remove()\n return toRgba(value)\n}\n\nlet pixel: CanvasRenderingContext2D | null | undefined\n\n/**\n * Normalise to `rgba()`. A browser may hand back a computed colour in the space\n * it was authored in — `oklch(…)`, `color(srgb …)` — so the value is painted to\n * one pixel and read back, which is the one form every canvas API accepts and\n * `withAlpha` can take apart.\n */\nfunction toRgba(css: string): string {\n if (/^rgba?\\(/.test(css)) return css\n if (pixel === undefined) {\n const canvas = document.createElement(\"canvas\")\n canvas.width = canvas.height = 1\n pixel = canvas.getContext(\"2d\", { willReadFrequently: true })\n }\n if (!pixel) return css\n pixel.clearRect(0, 0, 1, 1)\n pixel.fillStyle = css\n pixel.fillRect(0, 0, 1, 1)\n const [r, g, b, a] = pixel.getImageData(0, 0, 1, 1).data\n return `rgba(${r}, ${g}, ${b}, ${Math.round((a / 255) * 1000) / 1000})`\n}\n\nfunction resolveSize(host: HTMLElement, css: string): number {\n const probe = document.createElement(\"span\")\n probe.style.fontSize = css\n probe.style.display = \"none\"\n host.appendChild(probe)\n const value = parseFloat(getComputedStyle(probe).fontSize)\n probe.remove()\n return value\n}\n\nexport function readChartTheme(host: HTMLElement): ChartTheme {\n const color = (name: string) => resolveColor(host, `var(${name})`)\n const family = getComputedStyle(host).fontFamily\n // The type ladder is `--text-*`, a ratio of the root: whatever the root is,\n // the canvas follows it exactly as the DOM text beside it does.\n const size = {\n base: resolveSize(host, \"var(--text-base, 1rem)\"),\n sm: resolveSize(host, \"var(--text-sm, 0.923rem)\"),\n xs: resolveSize(host, \"var(--text-xs, 0.846rem)\"),\n }\n return {\n data: Array.from({ length: DATA_SLOTS }, (_, i) =>\n resolveColor(host, `var(--color-data-${i + 1}, var(--color-muted-foreground))`),\n ),\n success: color(\"--color-success\"),\n warning: color(\"--color-warning\"),\n destructive: color(\"--color-destructive\"),\n foreground: color(\"--color-foreground\"),\n mutedForeground: color(\"--color-muted-foreground\"),\n border: color(\"--color-border\"),\n card: color(\"--color-card\"),\n // Whole pixels: uPlot rescales a font for the device by matching\n // `(\\d+)px`, which reads `10.998px` as `998px`.\n font: {\n base: `${Math.round(size.base)}px ${family}`,\n sm: `${Math.round(size.sm)}px ${family}`,\n xs: `${Math.round(size.xs)}px ${family}`,\n },\n size,\n family,\n }\n}\n\n/** A colour at an alpha, from the `rgb()`/`rgba()` a probe returns. */\nexport function withAlpha(rgb: string, alpha: number): string {\n const parts = rgb.match(/[\\d.]+/g)\n if (!parts || parts.length < 3) return rgb\n return `rgba(${parts[0]}, ${parts[1]}, ${parts[2]}, ${alpha})`\n}\n","import * as React from \"react\"\n\nimport { readChartTheme, type ChartTheme } from \"./theme\"\n\n/**\n * The attributes on `<html>` a theme, a mode or a density switch changes.\n * `data-density` is watched ahead of the token landing in `@invana/styling`,\n * so a chart redraws the day it does without a change here.\n */\nconst THEME_ATTRIBUTES = [\"class\", \"style\", \"data-theme\", \"data-density\"]\n\n/**\n * The resolved tokens for the chart at `ref`, re-read whenever the root's theme,\n * mode or density changes, or the OS colour scheme flips under a `system` theme.\n * `null` until the element has mounted.\n */\nexport function useChartTheme(ref: React.RefObject<HTMLElement | null>): ChartTheme | null {\n const [theme, setTheme] = React.useState<ChartTheme | null>(null)\n\n React.useLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const read = () => setTheme(readChartTheme(el))\n read()\n const observer = new MutationObserver(read)\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: THEME_ATTRIBUTES,\n })\n const scheme = window.matchMedia?.(\"(prefers-color-scheme: dark)\")\n scheme?.addEventListener?.(\"change\", read)\n // Fonts arriving late change the measured text, not the tokens — but a\n // canvas drawn before they load keeps the fallback face until redrawn.\n document.fonts?.ready.then(read).catch(() => {})\n return () => {\n observer.disconnect()\n scheme?.removeEventListener?.(\"change\", read)\n }\n }, [ref])\n\n return theme\n}\n\n/**\n * The element's content width, so a canvas is drawn at its real size and its\n * text is never stretched. `0` until measured.\n */\nexport function useWidth(ref: React.RefObject<HTMLElement | null>): number {\n const [width, setWidth] = React.useState(0)\n React.useLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n setWidth(Math.floor(el.getBoundingClientRect().width))\n const observer = new ResizeObserver(([entry]) =>\n setWidth(Math.floor(entry.contentRect.width)),\n )\n observer.observe(el)\n return () => observer.disconnect()\n }, [ref])\n return width\n}\n","/**\n * The part of uPlot's stylesheet these charts need, installed once.\n *\n * uPlot ships `uPlot.min.css`, but a CSS import would make every consumer wire\n * a second stylesheet for a dozen rules — most of them for uPlot's own legend\n * and title, which these charts replace with `Legend` and the panel heading.\n * What is left is positioning, plus the crosshair drawn in the border token.\n */\nconst CSS = `\n.invana-uplot, .invana-uplot * { box-sizing: border-box; }\n.invana-uplot { width: min-content; line-height: 1; }\n.invana-uplot .u-wrap { position: relative; user-select: none; }\n.invana-uplot .u-over, .invana-uplot .u-under { position: absolute; }\n.invana-uplot .u-under { overflow: hidden; }\n.invana-uplot canvas { display: block; position: relative; width: 100%; height: 100%; }\n.invana-uplot .u-axis { position: absolute; }\n.invana-uplot .u-select { position: absolute; pointer-events: none; }\n.invana-uplot .u-cursor-x, .invana-uplot .u-cursor-y {\n position: absolute; left: 0; top: 0; pointer-events: none; will-change: transform;\n}\n.invana-uplot .u-hz .u-cursor-x { height: 100%; border-right: 1px solid var(--color-border); }\n.invana-uplot .u-cursor-pt {\n position: absolute; top: 0; left: 0; border-radius: 50%; border: 0 solid;\n pointer-events: none; will-change: transform; background-clip: padding-box !important;\n}\n.invana-uplot .u-off { display: none; }\n`\n\nconst ID = \"invana-charts-uplot\"\n\nexport function installUPlotStyles(): void {\n if (typeof document === \"undefined\" || document.getElementById(ID)) return\n const style = document.createElement(\"style\")\n style.id = ID\n style.textContent = CSS\n document.head.appendChild(style)\n}\n","/**\n * The frame every uPlot chart sits in. Internal — the package exports charts,\n * not this.\n *\n * uPlot owns the scales, the canvas, the y axis and the cursor. Everything a\n * reader reads as text — the period ticks, the tooltip, the legend, the table\n * view — is DOM composed from `@invana/ui`, so it sets in the same type as the\n * panel around it and never scales with a canvas.\n *\n * The x axis runs from -½ to n-½: every period owns one equal slot with its\n * point or column in the middle, so a line and a column chart of the same days\n * line up when they sit side by side, and a single period sits centred rather\n * than on an edge.\n */\nimport * as React from \"react\"\nimport uPlot from \"uplot\"\nimport {\n Button,\n Card,\n Eyebrow,\n Legend,\n LegendItem,\n cn,\n type LegendSwatchKind,\n} from \"@invana/ui\"\nimport { DataTable, type DataTableProps } from \"@invana/tables\"\n\nimport { useChartTheme, useWidth } from \"./hooks\"\nimport type { ChartTheme } from \"./theme\"\nimport { installUPlotStyles } from \"./uplot-styles\"\n\nexport interface ChartMark {\n /** The period the mark sits on. */\n index: number\n /** Named above the rule. Without one the rule stands alone — a boundary, not an event. */\n label?: string\n}\n\nexport interface ChartReference {\n /** Where the rule sits, on the chart's own axis. */\n value: number\n label: string\n}\n\nexport interface LegendEntry {\n key: string\n label: string\n /** The series colour, as CSS — `var(--color-data-3)`. */\n color: string\n kind?: LegendSwatchKind\n}\n\nexport interface TooltipRow {\n key: string\n label: string\n /** CSS colour for the row's line key. */\n color: string\n value: string\n}\n\nexport interface TooltipContent {\n title: string\n rows: TooltipRow[]\n /** A mark on this period, or why it has no value — `nothing ran`. */\n note?: string\n}\n\n/** What a chart hands the frame once its tokens have been resolved. */\nexport interface BuiltChart {\n series: uPlot.Series[]\n data: (number | null)[][]\n bands?: uPlot.Band[]\n /** The top of the y scale. */\n ceiling: number\n /** The bottom of the y scale. Default: 0. */\n floor?: number\n /** Where the y hairlines and their labels go. */\n splits: number[]\n format: (value: number) => string\n /** A crosshair for lines and areas; columns get a hover band instead. */\n crosshair: boolean\n /** Dots on each series at the hovered period. Default: with the crosshair. */\n cursorPoints?: boolean\n /** Custom marks drawn after the series and before event marks. */\n draw?: (u: uPlot) => void\n /** Custom marks drawn over the grid and under the series — a band. */\n drawUnder?: (u: uPlot) => void\n /** CSS px kept free right of the plot, for direct labels. */\n padRight?: number\n}\n\n// Row values are whatever the chart puts in its table; DataTable owns rendering.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TableRow = Record<string, any>\n\nexport interface ChartFrameProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** What the chart shows, for assistive tech. */\n summary: string\n /** One per period. */\n labels: string[]\n /** The plot's height in CSS px. Ticks, legend and toggle sit below it, inside the chart. */\n height: number\n /** Which periods name themselves under the plot. Default: the first and the last. */\n ticks?: number[]\n marks?: ChartMark[]\n reference?: ChartReference\n /** Drawn for two or more entries; a single series is named by its panel. */\n legend?: LegendEntry[]\n /** Shown in place of the plot when there is nothing to draw. */\n empty?: React.ReactNode\n build: (theme: ChartTheme, host: HTMLElement) => BuiltChart\n tooltip: (index: number) => TooltipContent\n table: { columns: DataTableProps<TableRow>[\"columns\"]; rows: TableRow[] }\n}\n\ninterface PlotBox {\n left: number\n top: number\n width: number\n height: number\n}\n\nconst measure = (() => {\n let ctx: CanvasRenderingContext2D | null | undefined\n return (font: string, text: string) => {\n if (ctx === undefined) ctx = document.createElement(\"canvas\").getContext(\"2d\")\n if (!ctx) return text.length * 7\n ctx.font = font\n return ctx.measureText(text).width\n }\n})()\n\nexport const ChartFrame = React.forwardRef<HTMLDivElement, ChartFrameProps>(\n (\n {\n summary,\n labels,\n height,\n ticks,\n marks = [],\n reference,\n legend = [],\n empty,\n build,\n tooltip,\n table,\n className,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref,\n ) => {\n const root = React.useRef<HTMLDivElement>(null)\n React.useImperativeHandle(ref, () => root.current as HTMLDivElement)\n const mount = React.useRef<HTMLDivElement>(null)\n const plot = React.useRef<uPlot | null>(null)\n\n const theme = useChartTheme(root)\n const width = useWidth(root)\n const widthRef = React.useRef(width)\n React.useLayoutEffect(() => {\n widthRef.current = width\n })\n\n const [asTable, setAsTable] = React.useState(false)\n const [hover, setHover] = React.useState<number | null>(null)\n const [box, setBox] = React.useState<PlotBox | null>(null)\n const [crosshair, setCrosshair] = React.useState(true)\n\n const n = labels.length\n const blank = empty != null || n === 0\n // Marks arrive as inline arrays; key them by value so a parent's re-render\n // does not rebuild the canvas.\n const marksKey = JSON.stringify(marks)\n const referenceKey = JSON.stringify(reference ?? null)\n const hasWidth = width > 0\n\n React.useEffect(() => {\n const el = mount.current\n const host = root.current\n if (!el || !host || !theme || !hasWidth || blank || asTable) return\n installUPlotStyles()\n const built = build(theme, host)\n const marksNow: ChartMark[] = JSON.parse(marksKey)\n const referenceNow: ChartReference | null = JSON.parse(referenceKey)\n setCrosshair(built.crosshair)\n\n const labelBand = marksNow.some((m) => m.label) ? Math.ceil(theme.size.xs) + 8 : 0\n const half = Math.ceil(theme.size.xs / 2) + 1\n const axisWidth =\n Math.ceil(Math.max(0, ...built.splits.map((s) => measure(theme.font.xs, built.format(s))))) + 10\n\n // A reference is named right of the plot, beside its rule, where the\n // series cannot run through the label.\n const referenceBand = referenceNow\n ? Math.ceil(measure(theme.font.xs, referenceNow.label)) + 10\n : 0\n\n const readBox = (u: uPlot) =>\n setBox({\n left: u.over.offsetLeft,\n top: u.over.offsetTop,\n width: u.over.clientWidth,\n height: u.over.clientHeight,\n })\n\n const drawMarks = (u: uPlot) => {\n const ctx = u.ctx\n const pr = uPlot.pxRatio\n const { left, top, width: w, height: h } = u.bbox\n ctx.save()\n ctx.font = `${theme.size.xs * pr}px ${theme.family}`\n ctx.lineWidth = pr\n ctx.setLineDash([3 * pr, 3 * pr])\n ctx.strokeStyle = theme.mutedForeground\n ctx.fillStyle = theme.mutedForeground\n ctx.textBaseline = \"bottom\"\n\n // An event: a dashed rule through the plot, named above it. Labels that\n // would collide are left to the tooltip rather than stacked.\n let lastRight = -Infinity\n for (const m of marksNow) {\n if (m.index < 0 || m.index >= n) continue\n const x = Math.round(u.valToPos(m.index, \"x\", true)) + 0.5\n ctx.beginPath()\n ctx.moveTo(x, top - 2 * pr)\n ctx.lineTo(x, top + h)\n ctx.stroke()\n if (!m.label) continue\n const tw = ctx.measureText(m.label).width\n const flip = x + 4 * pr + tw > left + w\n const start = flip ? x - 4 * pr - tw : x + 4 * pr\n if (start < lastRight + 6 * pr) continue\n ctx.textAlign = \"left\"\n ctx.fillText(m.label, start, top - 2 * pr)\n lastRight = start + tw\n }\n\n // A reference: a dashed rule across the plot, named at its right end.\n if (referenceNow) {\n const y = Math.round(u.valToPos(referenceNow.value, \"y\", true)) + 0.5\n ctx.setLineDash([2 * pr, 4 * pr])\n ctx.beginPath()\n ctx.moveTo(left, y)\n ctx.lineTo(left + w, y)\n ctx.stroke()\n ctx.textAlign = \"left\"\n ctx.textBaseline = \"middle\"\n ctx.fillText(referenceNow.label, left + w + 6 * pr, y)\n }\n ctx.restore()\n }\n\n const color = (u: uPlot, i: number) => {\n const stroke = u.series[i].stroke\n return String(typeof stroke === \"function\" ? stroke(u, i) : stroke)\n }\n\n const opts: uPlot.Options = {\n class: \"invana-uplot\",\n width: widthRef.current,\n height,\n padding: [labelBand || half, Math.max(built.padRight ?? 4, referenceBand), half, 0],\n legend: { show: false },\n scales: {\n x: { time: false, range: [-0.5, n - 0.5] },\n y: { range: [built.floor ?? 0, built.ceiling] },\n },\n axes: [\n { show: false },\n {\n scale: \"y\",\n side: 3,\n size: axisWidth,\n gap: 6,\n font: theme.font.xs,\n stroke: theme.mutedForeground,\n ticks: { show: false },\n grid: { stroke: theme.border, width: 1 },\n splits: () => built.splits,\n values: (_u, splits) => splits.map((s) => built.format(s)),\n },\n ],\n series: [{}, ...built.series],\n bands: built.bands,\n cursor: {\n x: built.crosshair,\n y: false,\n drag: { x: false, y: false, setScale: false },\n points: {\n show: built.cursorPoints ?? built.crosshair,\n size: 8,\n width: 2,\n stroke: () => theme.card,\n fill: color,\n },\n },\n hooks: {\n ready: [readBox],\n setSize: [readBox],\n setCursor: [(u) => setHover(u.cursor.idx ?? null)],\n drawAxes: built.drawUnder ? [built.drawUnder] : [],\n draw: [...(built.draw ? [built.draw] : []), drawMarks],\n },\n }\n\n const xs = Array.from({ length: n }, (_, i) => i)\n const u = new uPlot(opts, [xs, ...built.data] as uPlot.AlignedData, el)\n plot.current = u\n return () => {\n u.destroy()\n plot.current = null\n setHover(null)\n }\n }, [theme, build, hasWidth, blank, asTable, n, height, marksKey, referenceKey])\n\n React.useEffect(() => {\n if (hasWidth) plot.current?.setSize({ width, height })\n }, [width, height, hasWidth])\n\n const slot = box ? box.width / Math.max(n, 1) : 0\n const xAt = (i: number) => (box ? box.left + (i + 0.5) * slot : 0)\n // Where each tick's text runs, given how it is anchored: the first starts at\n // its slot's left edge, the last ends at its slot's right edge, the rest\n // centre. A tick that would overlap one already placed is dropped — the\n // first and the last are placed first, so the window's ends always read.\n const tickStyle = (i: number): React.CSSProperties =>\n n > 1 && i === 0\n ? { left: xAt(i) - slot / 2 }\n : n > 1 && i === n - 1\n ? { right: (width || 0) - (xAt(i) + slot / 2) }\n : { left: xAt(i), transform: \"translateX(-50%)\" }\n const tickSpan = (i: number): [number, number] => {\n const w = theme ? measure(theme.font.xs, labels[i] ?? \"\") : 0\n if (n > 1 && i === 0) return [xAt(i) - slot / 2, xAt(i) - slot / 2 + w]\n if (n > 1 && i === n - 1) return [xAt(i) + slot / 2 - w, xAt(i) + slot / 2]\n return [xAt(i) - w / 2, xAt(i) + w / 2]\n }\n const wanted = [...new Set(ticks ?? (n > 1 ? [0, n - 1] : [0]))].filter((i) => i >= 0 && i < n)\n const placed: [number, number][] = []\n const named = [\n ...wanted.filter((i) => i === 0 || i === n - 1),\n ...wanted.filter((i) => i !== 0 && i !== n - 1),\n ].filter((i) => {\n const [a, b] = tickSpan(i)\n if (placed.some(([c, d]) => a < d + 8 && b > c - 8)) return false\n placed.push([a, b])\n return true\n })\n\n const tip = hover != null && hover < n ? tooltip(hover) : null\n const markHere =\n hover != null\n ? marks.flatMap((m) => (m.index === hover && m.label ? [m.label] : []))\n : []\n const tipLeft = hover != null ? xAt(hover) : 0\n const tipFlip = box ? tipLeft > box.left + box.width / 2 : false\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key !== \"ArrowLeft\" && e.key !== \"ArrowRight\") return\n e.preventDefault()\n const step = e.key === \"ArrowLeft\" ? -1 : 1\n setHover((at) => Math.min(n - 1, Math.max(0, (at ?? (step > 0 ? -1 : n)) + step)))\n }\n\n return (\n <div ref={root} className={cn(\"flex min-w-0 flex-col gap-1\", className)} {...props}>\n {asTable ? (\n <DataTable\n columns={table.columns}\n data={table.rows}\n enableSorting={false}\n />\n ) : (\n <>\n <div\n role=\"img\"\n aria-label={ariaLabel ?? summary}\n tabIndex={blank ? undefined : 0}\n onKeyDown={onKeyDown}\n onBlur={() => setHover(null)}\n className=\"relative w-full rounded-sm outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n style={{ height }}\n >\n {blank ? (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n {empty ?? \"Nothing in this period\"}\n </div>\n ) : (\n <>\n {!crosshair && hover != null && box ? (\n // The hover band sits behind the transparent canvas, so a\n // column lifts without its colour being tinted.\n <div\n aria-hidden\n className=\"absolute rounded-sm bg-muted\"\n style={{ left: xAt(hover) - slot / 2, width: slot, top: box.top, height: box.height }}\n />\n ) : null}\n <div ref={mount} aria-hidden className=\"relative\" />\n {tip && box ? (\n <Card\n aria-hidden\n className=\"pointer-events-none absolute z-10 flex min-w-32 max-w-64 flex-col gap-1 px-2 py-1.5 shadow-sm\"\n style={{\n top: box.top,\n left: tipFlip ? undefined : tipLeft + 10,\n right: tipFlip ? (width || 0) - tipLeft + 10 : undefined,\n }}\n >\n <Eyebrow>{tip.title}</Eyebrow>\n {tip.rows.map((r) => (\n <div key={r.key} className=\"flex items-center gap-1.5\">\n <span aria-hidden className=\"h-0.5 w-3 shrink-0 rounded-full\" style={{ background: r.color }} />\n <span className=\"font-semibold tabular-nums\">{r.value}</span>\n <span className=\"min-w-0 truncate text-muted-foreground\">{r.label}</span>\n </div>\n ))}\n {[...markHere, ...(tip.note ? [tip.note] : [])].map((note) => (\n <div key={note} className=\"text-sm text-muted-foreground\">\n {note}\n </div>\n ))}\n </Card>\n ) : null}\n </>\n )}\n </div>\n {!blank && box ? (\n <div aria-hidden className=\"relative h-4 text-xs text-muted-foreground\">\n {named.map((i) => (\n <span\n key={i}\n className=\"absolute top-0 whitespace-nowrap tabular-nums\"\n style={tickStyle(i)}\n >\n {labels[i]}\n </span>\n ))}\n </div>\n ) : null}\n </>\n )}\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n {legend.length > 1 && !blank ? (\n <Legend>\n {legend.map((s) => (\n <LegendItem key={s.key} color={s.color} label={s.label} kind={s.kind} />\n ))}\n </Legend>\n ) : null}\n {blank ? null : (\n <Button\n variant=\"link\"\n size=\"xs\"\n className=\"ml-auto px-0 text-muted-foreground\"\n aria-pressed={asTable}\n onClick={() => setAsTable((v) => !v)}\n >\n {asTable ? \"View as chart\" : \"View as table\"}\n </Button>\n )}\n </div>\n </div>\n )\n },\n)\nChartFrame.displayName = \"ChartFrame\"\n","/**\n * The floors every chart holds, so a thin period never draws a false picture.\n */\n\n/**\n * A count axis never tops out below this. One run on a quiet day would\n * otherwise scale to a full-height column and read as a busy one.\n */\nexport const COUNT_FLOOR = 5\n\n/** No bar or column is drawn wider than this, however few periods there are. */\nexport const MAX_BAR_WIDTH = 24\n\n/** The gap in the surface colour between touching segments. */\nexport const SEGMENT_GAP = 2\n\n/** The rounded data end of a bar. The baseline end stays square. */\nexport const BAR_RADIUS = 4\n\nexport interface Scale {\n /** The top of the axis. The bottom is always 0. */\n ceiling: number\n /** A hairline and a label at each: 0, then every step to the ceiling. */\n splits: number[]\n}\n\n/**\n * A clean axis for values running 0 → `max`: a step of 1, 2 or 5 × 10ⁿ, and\n * two to four of them to the top — 0 · 20 · 40 · 60 for a busiest day of 51,\n * 0 · 50K · 100K · 150K for 128,120. A count axis steps in whole numbers.\n */\nexport function niceScale(max: number, { integers = false } = {}): Scale {\n const top = max > 0 ? max : 1\n let power = 10 ** Math.floor(Math.log10(top / 4))\n if (integers) power = Math.max(1, power)\n for (;;) {\n for (const m of [1, 2, 5]) {\n const step = m * power\n const k = Math.max(1, Math.ceil(top / step - 1e-9))\n if (k <= 4) return { ceiling: step * k, splits: Array.from({ length: k + 1 }, (_, i) => i * step) }\n }\n power *= 10\n }\n}\n\n/**\n * A clean axis for values running `min` → `max` that need not start at 0 — a\n * lead time moving between 16 and 28 days reads as a flat line on a 0-based\n * axis. The same 1, 2 or 5 × 10ⁿ step, two to four of them, with the floor on\n * a step below the lowest value: 15 · 20 · 25 · 30 for 16.3 → 29.2.\n */\nexport function niceRange(min: number, max: number): Scale & { floor: number } {\n const span = max > min ? max - min : Math.abs(max) || 1\n let power = 10 ** Math.floor(Math.log10(span / 4))\n for (;;) {\n for (const m of [1, 2, 5]) {\n const step = m * power\n const floor = Math.floor(min / step + 1e-9) * step\n const k = Math.max(1, Math.ceil((max - floor) / step - 1e-9))\n if (k <= 4) {\n return {\n floor,\n ceiling: floor + step * k,\n splits: Array.from({ length: k + 1 }, (_, i) => floor + i * step),\n }\n }\n }\n power *= 10\n }\n}\n\n/** A count axis: clean, and never topping out below {@link COUNT_FLOOR}. */\nexport function countScale(max: number): Scale {\n return niceScale(Math.max(max, COUNT_FLOOR), { integers: true })\n}\n\n/** Splits for a caller-fixed ceiling: 0, the middle and the top. */\nexport function fixedSplits(ceiling: number): number[] {\n return [0, ceiling / 2, ceiling]\n}\n\nconst compact = new Intl.NumberFormat(undefined, { notation: \"compact\", maximumFractionDigits: 1 })\nconst whole = new Intl.NumberFormat()\n\n/** `1,284` under ten thousand, `12.9K` above it. */\nexport function formatCount(value: number): string {\n return Math.abs(value) < 10_000 ? whole.format(value) : compact.format(value)\n}\n","import * as React from \"react\"\n\n/**\n * A ref that always holds the latest value — for a callback such as `format`,\n * which callers pass inline, so a new function each render does not rebuild\n * the canvas.\n */\nexport function useLatest<T>(value: T): React.RefObject<T> {\n const ref = React.useRef(value)\n React.useLayoutEffect(() => {\n ref.current = value\n })\n return ref\n}\n","/**\n * One measure over time, with the moments that might explain it marked on the\n * axis — a plan's work p50 a day, with each version's publish.\n *\n * One series and one axis, so no legend: the panel's title names what is\n * plotted. A day with no value breaks the line rather than drawing it to zero,\n * because *nothing ran* is not *it took no time*; a measured day between two\n * gaps draws as a point, so it is not lost. A mark is a dashed rule with its\n * label at the top — an event, not a value. A reference is a dashed rule with\n * its label at the right — a line to compare against, such as the Graph's p95.\n * Hover (or the arrow keys) reads the nearest day.\n *\n * A band shades the range the line is judged against — a normal range, or a\n * forecast's interval — under the line. A highlight rings a period that stands\n * out, in its own colour, without a label: whatever sits beside the chart says\n * why. After `forecastFrom` the line is dashed, with an unlabelled rule at the\n * boundary unless `forecastLabel` names it. A measure that never nears zero can\n * drop the zero baseline (`zero={false}`), so its movement is not flattened.\n */\nimport * as React from \"react\"\nimport uPlot from \"uplot\"\n\nimport { ChartFrame, type ChartMark, type ChartReference } from \"./base/chart-frame\"\nimport { fixedSplits, niceRange, niceScale } from \"./base/floors\"\nimport { resolveColor, withAlpha, type ChartTheme } from \"./base/theme\"\nimport { useLatest } from \"./base/use-latest\"\n\nexport type LineChartMark = ChartMark\nexport type LineChartReference = ChartReference\n\nexport interface LineChartBand {\n /** The bottom edge: one value across the plot, or one per period (`null` leaves a gap). */\n lower: number | (number | null)[]\n upper: number | (number | null)[]\n /** Named below the band's right end — `normal range`. */\n label?: string\n /** A CSS colour or token. Default: the line's. */\n color?: string\n}\n\nexport interface LineChartHighlight {\n /** The period ringed. */\n index: number\n /** A CSS colour or token — `var(--color-warning)`. Default: the line's. */\n color?: string\n}\n\n/** A line read against the main one — last year beside this — drawn behind it. */\nexport interface LineChartSeries {\n /** Named at the line's right end, in the hover and in the table. */\n name: string\n /** One per period, as `values`; `null` where nothing was measured. */\n values: (number | null)[]\n /** A CSS colour or token. Default: the muted foreground. */\n color?: string\n}\n\nexport interface LineChartProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** One per period; `null` where nothing was measured. */\n values: (number | null)[]\n /**\n * The main line's name. Needed once there is a `compare`: every line is then\n * named at its right end, where it finishes, instead of in a legend.\n */\n name?: string\n /** Lines to read the main one against, drawn behind it without its marks or forecast. */\n compare?: LineChartSeries[]\n /** One per period — what the hover and a tick name it. */\n labels: string[]\n /** How a value is written on the axis and in the hover — `6.0s`. */\n format?: (value: number) => string\n /** Fixes the scale. Defaults to a clean step above the largest value. */\n max?: number\n /** Values to draw a hairline at. Default: 0 and every clean step to the top. */\n gridlines?: number[]\n marks?: LineChartMark[]\n /** A value to compare against, drawn as a dashed rule labelled at the right. */\n reference?: LineChartReference\n /** A range shaded under the line. */\n band?: LineChartBand\n /** Periods ringed because they stand out. */\n highlights?: LineChartHighlight[]\n /** The last actual period — the one the forecast runs from. The line is dashed after it. */\n forecastFrom?: number\n /** Names the rule at `forecastFrom` — `today`. */\n forecastLabel?: string\n /** Start the axis at 0. Default: true. */\n zero?: boolean\n /** Which periods name themselves under the axis. Default: the first and the last. */\n ticks?: number[]\n /** The plot's height in px. */\n height?: number\n /** A CSS colour or token — `var(--color-primary)`. */\n color?: string\n /** Shown in place of the plot when no period has a value. */\n empty?: React.ReactNode\n}\n\nconst NONE: never[] = []\n\nexport const LineChart = React.forwardRef<HTMLDivElement, LineChartProps>(\n (\n {\n values,\n name,\n compare = NONE,\n labels,\n format = String,\n max,\n gridlines = NONE,\n marks = NONE,\n reference,\n band,\n highlights = NONE,\n forecastFrom,\n forecastLabel,\n zero = true,\n ticks,\n height = 132,\n color = \"var(--color-primary)\",\n empty,\n ...props\n },\n ref,\n ) => {\n const fmt = useLatest(format)\n const referenceValue = reference?.value\n const n = values.length\n // The band as one value per period, whichever form it arrived in.\n const [lower, upper] = React.useMemo(() => {\n const spread = (edge: number | (number | null)[] | undefined) =>\n edge == null ? null : Array.from({ length: n }, (_, i) => (typeof edge === \"number\" ? edge : (edge[i] ?? null)))\n return [spread(band?.lower), spread(band?.upper)]\n }, [band?.lower, band?.upper, n])\n const forecast = forecastFrom != null && forecastFrom >= 0 && forecastFrom < n ? forecastFrom : null\n // Inline arrays; keyed by value so a parent's re-render keeps the canvas.\n const highlightsKey = JSON.stringify(highlights)\n const compareKey = JSON.stringify(compare)\n const named = compare.length > 0\n\n const build = React.useCallback(\n (theme: ChartTheme, host: HTMLElement) => {\n const stroke = resolveColor(host, color)\n const rings: { index: number; color: string }[] = (JSON.parse(highlightsKey) as LineChartHighlight[])\n .filter((h) => h.index >= 0 && h.index < n)\n .map((h) => ({ index: h.index, color: h.color ? resolveColor(host, h.color) : stroke }))\n const ringed = new Set(rings.map((r) => r.index))\n const others = (JSON.parse(compareKey) as LineChartSeries[]).map((c) => ({\n ...c,\n stroke: resolveColor(host, c.color ?? \"var(--color-muted-foreground)\"),\n }))\n const measured = [...values, ...others.flatMap((c) => c.values)].filter((v): v is number => v != null)\n const edges = [...(lower ?? []), ...(upper ?? [])].filter((v): v is number => v != null)\n const top = Math.max(...measured, ...edges, referenceValue ?? -Infinity)\n const bottom = Math.min(...measured, ...edges, referenceValue ?? Infinity)\n // Headroom above the highest value, so a single point or a flat line\n // is not pinned to the top of the plot.\n const scale = zero\n ? { floor: 0, ...niceScale(Math.max(0, top) * 1.05) }\n : niceRange(bottom, top + (top - bottom) * 0.05)\n const ceiling = max ?? Math.max(scale.ceiling, ...gridlines)\n const last = forecast ?? values.reduce<number>((at, v, i) => (v != null ? i : at), -1)\n // Points: the latest actual value, and any value with no neighbour to\n // join — unless a ring already marks the period.\n const points = values\n .map((v, i) => (v != null && (i === last || (values[i - 1] == null && values[i + 1] == null)) ? i : -1))\n .filter((i) => i >= 0 && !ringed.has(i))\n const line = (dash?: number[]): uPlot.Series => ({\n stroke,\n width: 2,\n dash,\n spanGaps: false,\n points: {\n show: !dash,\n size: 10,\n width: 2,\n stroke: theme.card,\n fill: stroke,\n filter: () => points,\n },\n })\n // A forecast is a second, dashed series that shares the boundary\n // period, so the two lines join.\n const actual = forecast == null ? values : values.map((v, i) => (i <= forecast ? v : null))\n const ahead = forecast == null ? null : values.map((v, i) => (i >= forecast ? v : null))\n const bandFill = withAlpha(band?.color ? resolveColor(host, band.color) : stroke, 0.1)\n const bandLabel = band?.label\n\n const drawUnder = (u: uPlot) => {\n if (!lower || !upper) return\n const ctx = u.ctx\n const pr = uPlot.pxRatio\n const { left, width: w, top: t, height: h } = u.bbox\n ctx.save()\n ctx.beginPath()\n ctx.rect(left, t, w, h)\n ctx.clip()\n ctx.fillStyle = bandFill\n const y = (v: number) => u.valToPos(v, \"y\", true)\n if (typeof band?.lower === \"number\" && typeof band?.upper === \"number\") {\n // A constant range runs the width of the plot.\n ctx.fillRect(left, y(band.upper), w, y(band.lower) - y(band.upper))\n } else {\n // One polygon per run of periods with both edges.\n let run: number[] = []\n const flush = () => {\n if (run.length) {\n const x = (i: number) => u.valToPos(i, \"x\", true)\n ctx.beginPath()\n run.forEach((i, k) => (k ? ctx.lineTo(x(i), y(upper[i] as number)) : ctx.moveTo(x(i), y(upper[i] as number))))\n for (const i of [...run].reverse()) ctx.lineTo(x(i), y(lower[i] as number))\n ctx.closePath()\n ctx.fill()\n }\n run = []\n }\n for (let i = 0; i < n; i++) {\n if (lower[i] != null && upper[i] != null) run.push(i)\n else flush()\n }\n flush()\n }\n ctx.restore()\n if (bandLabel) {\n // Named under the band's right end, or over it when the band sits\n // on the floor of the plot.\n const at = n - 1 - [...lower].reverse().findIndex((v, k) => v != null && upper[n - 1 - k] != null)\n if (at < n) {\n ctx.save()\n ctx.font = `${theme.size.xs * pr}px ${theme.family}`\n ctx.fillStyle = theme.mutedForeground\n ctx.textAlign = \"right\"\n const below = y(lower[at] as number) + 3 * pr\n const room = below + theme.size.xs * pr <= t + h\n ctx.textBaseline = room ? \"top\" : \"bottom\"\n ctx.fillText(bandLabel, left + w - 4 * pr, room ? below : y(upper[at] as number) - 3 * pr)\n ctx.restore()\n }\n }\n }\n\n // Every line named at its right end, where it finishes; labels that\n // would collide are nudged apart, the main line's first.\n const lastOf = (vs: (number | null)[]) => vs.reduce<number>((at, v, i) => (v != null ? i : at), -1)\n const endLabels = named\n ? [{ name: name ?? \"\", values, stroke, main: true }, ...others.map((c) => ({ ...c, main: false }))]\n : []\n const font = `600 ${theme.size.xs}px ${theme.family}`\n const padRight = named\n ? Math.ceil(\n Math.max(\n 0,\n ...endLabels.map((l) => {\n const m = document.createElement(\"canvas\").getContext(\"2d\")\n if (!m) return l.name.length * 7\n m.font = font\n return m.measureText(l.name).width\n }),\n ),\n ) + 12\n : undefined\n const drawLabels = (u: uPlot) => {\n if (!named) return\n const ctx = u.ctx\n const pr = uPlot.pxRatio\n const x = u.bbox.left + u.bbox.width + 6 * pr\n const step = theme.size.xs * pr + 2 * pr\n const placed = endLabels\n .map((l) => {\n const at = lastOf(l.values)\n return at < 0 ? null : { ...l, y: u.valToPos(l.values[at] as number, \"y\", true) }\n })\n .filter((l): l is NonNullable<typeof l> => l != null)\n .sort((a, b) => a.y - b.y)\n for (let i = 1; i < placed.length; i++) placed[i].y = Math.max(placed[i].y, placed[i - 1].y + step)\n ctx.save()\n ctx.font = `600 ${theme.size.xs * pr}px ${theme.family}`\n ctx.textBaseline = \"middle\"\n ctx.textAlign = \"left\"\n for (const l of placed) {\n ctx.fillStyle = l.main ? theme.foreground : l.stroke\n ctx.fillText(l.name, x, l.y)\n }\n ctx.restore()\n }\n\n const draw = (u: uPlot) => {\n drawLabels(u)\n if (!rings.length) return\n const ctx = u.ctx\n const pr = uPlot.pxRatio\n ctx.save()\n ctx.lineWidth = 1.5 * pr\n for (const r of rings) {\n const v = values[r.index]\n if (v == null) continue\n ctx.strokeStyle = r.color\n ctx.beginPath()\n ctx.arc(u.valToPos(r.index, \"x\", true), u.valToPos(v, \"y\", true), 4.5 * pr, 0, Math.PI * 2)\n ctx.stroke()\n }\n ctx.restore()\n }\n\n // The lines it is read against go behind the main one, plain.\n const behind = others.map(\n (c): uPlot.Series => ({ stroke: c.stroke, width: 2, spanGaps: false, points: { show: false } }),\n )\n return {\n series: [...behind, ...(ahead ? [line(), line([6, 4])] : [line()])],\n data: [...others.map((c) => c.values), ...(ahead ? [actual, ahead] : [actual])],\n padRight,\n floor: scale.floor,\n ceiling,\n splits: gridlines.length ? gridlines : max != null ? fixedSplits(max) : scale.splits,\n format: (v: number) => fmt.current(v),\n crosshair: true,\n cursorPoints: true,\n drawUnder,\n draw,\n }\n },\n [values, name, compareKey, named, color, max, gridlines, referenceValue, fmt, zero, lower, upper, band?.lower, band?.upper, band?.color, band?.label, forecast, highlightsKey, n],\n )\n\n const measured = values.filter((v): v is number => v != null)\n const blank = measured.length === 0\n const summary = React.useMemo(() => {\n if (blank) return \"Line chart with no measured periods.\"\n const f = format\n let top = 0\n values.forEach((v, i) => {\n if (v != null && v > (values[top] ?? -Infinity)) top = i\n })\n const lastIdx = forecast ?? values.reduce<number>((at, v, i) => (v != null ? i : at), -1)\n const parts = [\n `Line chart over ${values.length} periods, ${labels[0]} to ${labels[labels.length - 1]}.`,\n `Latest ${f(values[lastIdx] as number)} on ${labels[lastIdx]}; highest ${f(values[top] as number)} on ${labels[top]}.`,\n ]\n const gaps = values.length - measured.length\n if (gaps) parts.push(`${gaps} periods with nothing measured.`)\n if (forecast != null) parts.push(`Forecast from ${labels[forecast]}.`)\n if (band && typeof band.lower === \"number\" && typeof band.upper === \"number\")\n parts.push(`${band.label ?? \"Band\"} ${f(band.lower)} to ${f(band.upper)}.`)\n else if (band) parts.push(`${band.label ?? \"A band\"} shaded.`)\n if (highlights.length) parts.push(`Highlighted: ${highlights.map((h) => labels[h.index]).join(\", \")}.`)\n const named = marks.filter((m) => m.label)\n if (named.length) parts.push(`Marked: ${named.map((m) => `${m.label} (${labels[m.index]})`).join(\", \")}.`)\n if (reference) parts.push(`Reference ${reference.label} at ${f(reference.value)}.`)\n for (const c of compare) {\n const at = c.values.reduce<number>((last, v, i) => (v != null ? i : last), -1)\n if (at >= 0) parts.push(`Against ${c.name}: ${f(c.values[at] as number)} on ${labels[at]}.`)\n }\n return parts.join(\" \")\n }, [blank, values, labels, marks, reference, measured.length, format, forecast, band, highlights, compare])\n\n // The forecast boundary is a mark: a dashed rule, named only if asked.\n const allMarks = React.useMemo(\n () => (forecast == null ? marks : [...marks, { index: forecast, label: forecastLabel }]),\n [marks, forecast, forecastLabel],\n )\n const bandText = (i: number) =>\n lower?.[i] != null && upper?.[i] != null ? `${format(lower[i] as number)} – ${format(upper[i] as number)}` : \"\"\n\n return (\n <ChartFrame\n ref={ref}\n summary={summary}\n labels={labels}\n height={height}\n ticks={ticks}\n marks={allMarks}\n reference={reference}\n empty={blank ? (empty ?? \"Nothing measured in this period\") : undefined}\n build={build}\n tooltip={(i) => ({\n title: labels[i],\n rows: [\n ...(values[i] != null ? [{ key: \"value\", label: named ? (name ?? \"\") : \"\", color, value: format(values[i] as number) }] : []),\n ...compare.flatMap((c, k) =>\n c.values[i] != null\n ? [{ key: `compare-${k}`, label: c.name, color: c.color ?? \"var(--color-muted-foreground)\", value: format(c.values[i] as number) }]\n : [],\n ),\n ],\n note:\n values[i] == null\n ? \"nothing ran\"\n : [\n forecast != null && i > forecast ? \"forecast\" : \"\",\n bandText(i) ? `${band?.label ?? \"band\"} ${bandText(i)}` : \"\",\n ]\n .filter(Boolean)\n .join(\" · \") || undefined,\n })}\n table={{\n columns: [\n { accessorKey: \"period\", header: \"Period\" },\n { accessorKey: \"value\", header: name ?? \"Value\" },\n ...compare.map((c, k) => ({ accessorKey: `compare${k}`, header: c.name })),\n ...(band ? [{ accessorKey: \"band\", header: band.label ?? \"Band\" }] : []),\n ],\n rows: values.map((v, i) => ({\n period: labels[i],\n value: v != null ? `${format(v)}${forecast != null && i > forecast ? \" (forecast)\" : \"\"}` : \"—\",\n ...Object.fromEntries(compare.map((c, k) => [`compare${k}`, c.values[i] != null ? format(c.values[i] as number) : \"—\"])),\n band: bandText(i) || \"—\",\n })),\n }}\n {...props}\n />\n )\n },\n)\nLineChart.displayName = \"LineChart\"\n","/**\n * Canvas helpers shared by the charts that draw their own marks.\n */\n\n/** A rectangle rounded on its top two corners only — a column's data end. */\nexport function topRoundedRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n): void {\n const radius = Math.max(0, Math.min(r, w / 2, h))\n ctx.beginPath()\n ctx.moveTo(x, y + h)\n ctx.lineTo(x, y + radius)\n ctx.arcTo(x, y, x + radius, y, radius)\n ctx.lineTo(x + w - radius, y)\n ctx.arcTo(x + w, y, x + w, y + radius, radius)\n ctx.lineTo(x + w, y + h)\n ctx.closePath()\n ctx.fill()\n}\n","/**\n * Counts over days, split into the parts that make them up — `served` and\n * `failed` in each day's runs, or a model's queries by caller.\n *\n * Vertical because the x-axis is time. The parts stack bottom-up in `series`\n * order with a 2px surface gap between them, and only the top of a column is\n * rounded, so a stack reads as one count cut into pieces rather than as bars\n * balanced on each other. A day with nothing draws nothing: a zero is a gap,\n * not a sliver.\n *\n * The floors: the count axis never tops out below five, so one run on a quiet\n * day is a short column, not a full-height one; a column is never wider than\n * 24px, however few days there are; and a window where every day is zero shows\n * that it is empty rather than an axis of zeros.\n *\n * Every column answers a hover with its day and each part's count; the hover\n * target is the day's whole slot, not the painted bar. Two or more series\n * always carry a legend, inside the chart, because identity is never colour\n * alone; the axis labels are sparse (`ticks`), because thirty dates under\n * thirty columns is texture.\n */\nimport * as React from \"react\"\nimport uPlot from \"uplot\"\n\nimport { ChartFrame } from \"./base/chart-frame\"\nimport { topRoundedRect } from \"./base/draw\"\nimport {\n BAR_RADIUS,\n MAX_BAR_WIDTH,\n SEGMENT_GAP,\n countScale,\n fixedSplits,\n formatCount,\n} from \"./base/floors\"\nimport { resolveColor, type ChartTheme } from \"./base/theme\"\n\nexport interface StackSeries {\n key: string\n label: string\n /** A token — `var(--color-success)`. Status tokens only for status series. */\n color: string\n}\n\nexport interface StackedColumnDatum {\n /** The period, as the tooltip and a tick name it — `17 Sep`. */\n label: string\n /** The count per series `key`. A missing key is 0. */\n values: Record<string, number>\n}\n\nexport interface StackedBarChartVProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n data: StackedColumnDatum[]\n series: StackSeries[]\n /** Fixes the scale. Defaults to a clean step above the tallest column, and never below 5. */\n max?: number\n /** Values to draw a hairline at — `[20, 40, 60]`. */\n gridlines?: number[]\n /** The plot's height in px. */\n height?: number\n /** Which columns name their period under the axis. Default: the first and the last. */\n ticks?: number[]\n /** Shown in place of the plot when every column is zero. */\n empty?: React.ReactNode\n}\n\nconst NONE: never[] = []\n\nexport const StackedBarChartV = React.forwardRef<HTMLDivElement, StackedBarChartVProps>(\n ({ data, series, max, gridlines = NONE, height = 132, ticks, empty, ...props }, ref) => {\n const totals = React.useMemo(\n () => data.map((d) => series.reduce((sum, s) => sum + (d.values[s.key] ?? 0), 0)),\n [data, series],\n )\n const blank = totals.every((t) => t === 0)\n\n const build = React.useCallback(\n (_theme: ChartTheme, host: HTMLElement) => {\n const colors = series.map((s) => resolveColor(host, s.color))\n const scale = countScale(Math.max(0, ...totals))\n const ceiling = max ?? Math.max(scale.ceiling, ...gridlines)\n const draw = (u: uPlot) => {\n const ctx = u.ctx\n const pr = uPlot.pxRatio\n const slot = u.bbox.width / Math.max(data.length, 1)\n const width = Math.max(pr, Math.min(MAX_BAR_WIDTH * pr, slot * 0.72))\n const gap = SEGMENT_GAP * pr\n const baseline = u.valToPos(0, \"y\", true)\n ctx.save()\n data.forEach((d, i) => {\n const x = Math.round(u.valToPos(i, \"x\", true) - width / 2)\n const parts = series\n .map((s, k) => ({ value: d.values[s.key] ?? 0, color: colors[k] }))\n .filter((p) => p.value > 0)\n let sum = 0\n let bottom = baseline\n parts.forEach((p, j) => {\n sum += p.value\n const top = u.valToPos(Math.min(sum, ceiling), \"y\", true)\n const last = j === parts.length - 1\n // The gap sits on top of every segment but the last; a segment\n // too small to survive it keeps one device pixel.\n const y = last ? top : Math.min(top + gap, bottom - pr)\n const h = Math.max(pr, bottom - y)\n ctx.fillStyle = p.color\n if (last) topRoundedRect(ctx, x, y, width, h, BAR_RADIUS * pr)\n else ctx.fillRect(x, y, width, h)\n bottom = top\n })\n })\n ctx.restore()\n }\n return {\n // One invisible series carries the totals, so the cursor has a value\n // to snap to on every day; the columns themselves are drawn above.\n series: [{ stroke: \"transparent\", paths: () => null, points: { show: false } }],\n data: [totals],\n ceiling,\n splits: gridlines.length ? gridlines : max != null ? fixedSplits(max) : scale.splits,\n format: formatCount,\n crosshair: false,\n draw,\n }\n },\n [data, series, totals, max, gridlines],\n )\n\n const summary = React.useMemo(() => {\n if (blank) return \"Stacked column chart with nothing counted in this period.\"\n const sums = series.map((s) => data.reduce((sum, d) => sum + (d.values[s.key] ?? 0), 0))\n const busiest = totals.indexOf(Math.max(...totals))\n return [\n `Stacked column chart over ${data.length} periods, ${data[0].label} to ${data[data.length - 1].label}.`,\n `Totals: ${series.map((s, k) => `${s.label} ${formatCount(sums[k])}`).join(\", \")}.`,\n `Busiest: ${data[busiest].label} with ${formatCount(totals[busiest])}.`,\n ].join(\" \")\n }, [blank, data, series, totals])\n\n return (\n <ChartFrame\n ref={ref}\n summary={summary}\n labels={data.map((d) => d.label)}\n height={height}\n ticks={ticks}\n legend={series}\n empty={blank ? (empty ?? \"Nothing counted in this period\") : undefined}\n build={build}\n tooltip={(i) => ({\n title: data[i].label,\n rows: series.map((s) => ({\n key: s.key,\n label: s.label,\n color: s.color,\n value: formatCount(data[i].values[s.key] ?? 0),\n })),\n })}\n table={{\n columns: [\n { accessorKey: \"period\", header: \"Period\" },\n ...series.map((s) => ({ accessorKey: s.key, header: s.label })),\n { accessorKey: \"__total\", header: \"Total\" },\n ],\n rows: data.map((d, i) => ({\n period: d.label,\n ...Object.fromEntries(series.map((s) => [s.key, formatCount(d.values[s.key] ?? 0)])),\n __total: formatCount(totals[i]),\n })),\n }}\n {...props}\n />\n )\n },\n)\nStackedBarChartV.displayName = \"StackedBarChartV\"\n","/**\n * Totals over time, split into the parts that make them up — records over time\n * by model, or by node type inside one model.\n *\n * The paths are stepped: a record count only moves where a write happened, so\n * the edge stays flat between writes and rises in one step at the write rather\n * than sloping across days that changed nothing. Each write is marked — a\n * dashed rule with its label at the top, `import` or `stitch commit` — because\n * the step is the event and the mark says which one.\n *\n * The parts stack bottom-up in `series` order, which is fixed: a model keeps its\n * band and its colour whatever its size, so a filter or a re-sort never\n * repaints the survivors. Bands are separated by a 2px surface line rather than\n * outlined. Up to four series are also named at the right edge, beside their\n * band; a name that would collide with its neighbour is left to the legend,\n * which is always there for two or more series. A series with nothing in it has\n * no band and no direct label, but keeps its legend entry.\n */\nimport * as React from \"react\"\nimport uPlot from \"uplot\"\n\nimport { ChartFrame, type ChartMark, type LegendEntry } from \"./base/chart-frame\"\nimport { fixedSplits, formatCount, niceScale } from \"./base/floors\"\nimport { resolveColor, withAlpha, type ChartTheme } from \"./base/theme\"\nimport { useLatest } from \"./base/use-latest\"\n\nexport interface AreaSeries {\n key: string\n label: string\n /** A token — `var(--color-data-1)`. */\n color: string\n}\n\nexport interface StackedAreaDatum {\n /** The period, as the tooltip and a tick name it — `17 Sep`. */\n label: string\n /** The total per series `key` at the end of the period. A missing key is 0. */\n values: Record<string, number>\n}\n\nexport interface StackedAreaChartProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n data: StackedAreaDatum[]\n series: AreaSeries[]\n /** The writes that moved the totals — each import, each stitch commit. */\n marks?: ChartMark[]\n /** Names the marks in the legend — `a write — an import or a stitch commit`. */\n markLegend?: string\n /** How a value is written on the axis and in the hover. Default: `1,284` / `12.9K`. */\n format?: (value: number) => string\n /** Fixes the scale. Defaults to a clean step above the tallest stack. */\n max?: number\n /** Values to draw a hairline at. Default: 0 and every clean step to the top. */\n gridlines?: number[]\n /** Which periods name themselves under the axis. Default: the first and the last. */\n ticks?: number[]\n /** The plot's height in px. */\n height?: number\n /** Name each band at the right edge. Default: on for four series or fewer. */\n directLabels?: boolean\n /** Shown in place of the plot when every period is zero. */\n empty?: React.ReactNode\n}\n\nconst NONE: never[] = []\nconst FILL_ALPHA = 0.78\n\nexport const StackedAreaChart = React.forwardRef<HTMLDivElement, StackedAreaChartProps>(\n (\n {\n data,\n series,\n marks = NONE,\n markLegend,\n format = formatCount,\n max,\n gridlines = NONE,\n ticks,\n height = 200,\n directLabels,\n empty,\n ...props\n },\n ref,\n ) => {\n const fmt = useLatest(format)\n const labelled = directLabels ?? series.length <= 4\n\n // Running sums bottom-up: stack[k][i] is the top edge of band k on day i.\n const stack = React.useMemo(() => {\n const sums = data.map(() => 0)\n return series.map((s) =>\n data.map((d, i) => {\n sums[i] += d.values[s.key] ?? 0\n return sums[i]\n }),\n )\n }, [data, series])\n const totals = stack.length ? stack[stack.length - 1] : data.map(() => 0)\n const blank = totals.every((t) => t === 0)\n\n const build = React.useCallback(\n (theme: ChartTheme, host: HTMLElement) => {\n const colors = series.map((s) => resolveColor(host, s.color))\n const scale = niceScale(Math.max(0, ...totals))\n const ceiling = max ?? Math.max(scale.ceiling, ...gridlines)\n const stepped = uPlot.paths.stepped!({ align: 1 })\n const last = data.length - 1\n\n const uSeries: uPlot.Series[] = series.map((_, k) => ({\n stroke: theme.card,\n width: 2,\n paths: stepped,\n points: { show: false },\n // The bottom band fills to the baseline; every other band is a\n // `bands` entry filling down to the band beneath it.\n fill: k === 0 ? withAlpha(colors[0], FILL_ALPHA) : undefined,\n }))\n const bands: uPlot.Band[] = series.slice(1).map((_, j) => ({\n series: [j + 2, j + 1],\n fill: withAlpha(colors[j + 1], FILL_ALPHA),\n }))\n\n const measure = document.createElement(\"canvas\").getContext(\"2d\")\n let padRight = 4\n if (labelled && measure) {\n measure.font = `600 ${theme.font.xs}`\n padRight = Math.ceil(Math.max(0, ...series.map((s) => measure.measureText(s.label).width))) + 20\n }\n\n const draw = (u: uPlot) => {\n if (!labelled || last < 0) return\n const ctx = u.ctx\n const pr = uPlot.pxRatio\n const x = u.bbox.left + u.bbox.width + 6 * pr\n const line = theme.size.xs * pr + 2 * pr\n const placed = series\n .map((s, k) => {\n const top = stack[k][last]\n const bottom = k ? stack[k - 1][last] : 0\n return { s, k, empty: top === bottom, y: u.valToPos((top + bottom) / 2, \"y\", true) }\n })\n .filter((p) => !p.empty)\n .sort((a, b) => b.y - a.y)\n ctx.save()\n ctx.font = `600 ${theme.size.xs * pr}px ${theme.family}`\n ctx.textBaseline = \"middle\"\n ctx.textAlign = \"left\"\n let prev = Infinity\n for (const p of placed) {\n if (prev - p.y < line) continue\n ctx.fillStyle = colors[p.k]\n ctx.fillRect(x, Math.round(p.y - pr), 6 * pr, 2 * pr)\n ctx.fillStyle = theme.foreground\n ctx.fillText(p.s.label, x + 10 * pr, p.y)\n prev = p.y\n }\n ctx.restore()\n }\n\n return {\n series: uSeries,\n data: stack,\n bands,\n ceiling,\n splits: gridlines.length ? gridlines : max != null ? fixedSplits(max) : scale.splits,\n format: (v: number) => fmt.current(v),\n crosshair: true,\n cursorPoints: false,\n draw,\n padRight,\n }\n },\n [data, series, stack, totals, max, gridlines, labelled, fmt],\n )\n\n const legend: LegendEntry[] = [\n ...series,\n ...(marks.length && markLegend\n ? [{ key: \"__mark\", label: markLegend, color: \"var(--color-muted-foreground)\", kind: \"dashed\" as const }]\n : []),\n ]\n\n const summary = React.useMemo(() => {\n if (blank) return \"Stacked area chart with nothing recorded in this period.\"\n const last = data.length - 1\n return [\n `Stacked area chart over ${data.length} periods, ${data[0].label} to ${data[last].label}.`,\n `${format(totals[0])} at the start, ${format(totals[last])} at the end.`,\n `At the end: ${series.map((s) => `${s.label} ${format(data[last].values[s.key] ?? 0)}`).join(\", \")}.`,\n marks.length ? `Writes marked: ${marks.map((m) => `${m.label} (${data[m.index]?.label})`).join(\", \")}.` : \"\",\n ]\n .filter(Boolean)\n .join(\" \")\n }, [blank, data, series, totals, marks, format])\n\n return (\n <ChartFrame\n ref={ref}\n summary={summary}\n labels={data.map((d) => d.label)}\n height={height}\n ticks={ticks}\n marks={marks}\n legend={legend}\n empty={blank ? (empty ?? \"Nothing recorded in this period\") : undefined}\n build={build}\n tooltip={(i) => ({\n title: data[i].label,\n // Top-down, the order the bands are read in.\n rows: [...series].reverse().map((s) => ({\n key: s.key,\n label: s.label,\n color: s.color,\n value: format(data[i].values[s.key] ?? 0),\n })),\n note: `${format(totals[i])} in all`,\n })}\n table={{\n columns: [\n { accessorKey: \"period\", header: \"Period\" },\n ...series.map((s) => ({ accessorKey: s.key, header: s.label })),\n { accessorKey: \"__total\", header: \"Total\" },\n ],\n rows: data.map((d, i) => ({\n period: d.label,\n ...Object.fromEntries(series.map((s) => [s.key, format(d.values[s.key] ?? 0)])),\n __total: format(totals[i]),\n })),\n }}\n {...props}\n />\n )\n },\n)\nStackedAreaChart.displayName = \"StackedAreaChart\"\n","/**\n * TODO — provisional. Built ahead of its design review.\n *\n * The chart set was deliberately deferred while the rest of the kit was built,\n * because charts are the one group with a real design question in them rather\n * than a markup question: which forms this product actually needs, at what\n * sizes, and how much a 330px drawer can carry. This component satisfies the\n * dataviz rules and the validated palette, but the *form inventory* has not been\n * agreed — treat the API as unsettled until a board screen uses it in anger.\n */\nimport * as React from \"react\"\n\nimport { cn } from \"@invana/ui\"\n\nexport interface SparklineProps\n extends Omit<React.SVGAttributes<SVGSVGElement>, \"children\" | \"values\"> {\n values: number[]\n width?: number\n height?: number\n color?: string\n /** Washes the area under the line at 10%. Off by default at this size. */\n area?: boolean\n /** The line's width, in px. `2` by default; a sparkline beside a figure draws finer. */\n strokeWidth?: number\n /** A filled dot on the last point, ringed in the surface colour. */\n endMarker?: boolean\n /** What the line is, for assistive tech. The surface around it usually says. */\n label?: string\n}\n\n/**\n * The shape of a series, small enough to sit inside a row.\n *\n * No axis, no gridlines, no labels — a sparkline answers \"which way, and how\n * steadily\", and the number it accompanies answers \"how much\". If a reader\n * needs to read a value off it, it wanted to be a chart.\n *\n * The end marker carries a 2px ring in the surface colour so it stays legible\n * where the line runs under it.\n */\nexport const Sparkline = React.forwardRef<SVGSVGElement, SparklineProps>(\n (\n {\n values,\n width = 72,\n height = 20,\n color = \"var(--color-data-1)\",\n area,\n strokeWidth = 2,\n endMarker = true,\n label,\n className,\n ...props\n },\n ref,\n ) => {\n const pad = 3\n const min = Math.min(...values)\n const max = Math.max(...values)\n const span = max - min || 1\n const stepX = values.length > 1 ? (width - pad * 2) / (values.length - 1) : 0\n const points = values.map((v, i) => [\n pad + i * stepX,\n height - pad - ((v - min) / span) * (height - pad * 2),\n ])\n const d = points.map((p, i) => `${i ? \"L\" : \"M\"}${p[0]} ${p[1]}`).join(\" \")\n const last = points[points.length - 1]\n\n return (\n <svg\n ref={ref}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n className={cn(\"shrink-0 overflow-visible\", className)}\n role={label ? \"img\" : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n {...props}\n >\n {area ? (\n <path\n d={`${d} L${last[0]} ${height} L${points[0][0]} ${height} Z`}\n fill={color}\n opacity={0.1}\n />\n ) : null}\n <path\n d={d}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n {endMarker ? (\n <circle\n cx={last[0]}\n cy={last[1]}\n r={4}\n fill={color}\n stroke=\"var(--color-card)\"\n strokeWidth={2}\n />\n ) : null}\n </svg>\n )\n },\n)\nSparkline.displayName = \"Sparkline\"\n","/**\n * A share, drawn as a bar inside a table cell with its value beside it — a\n * model's share of queries, a step's share of a plan's work.\n *\n * DOM, not canvas: it sits in every row of a table, sets in the row's own type\n * and needs nothing a canvas gives.\n *\n * The bar's length is `value ÷ max`; the number is `value` itself. A column of\n * small shares can pass `max` = the largest share so the longest bar fills the\n * track while every number stays the true share. Zero, or no value, reads `—`\n * with no track: an empty bar looks like a measured zero, and a dash says there\n * is nothing to measure.\n *\n * `tone` is the fill's job: `primary` by default, `muted` for a secondary column,\n * and the status tones only when the share *is* a status. When the row is an\n * entity with its own colour — a model, a node type — pass `color` instead, so\n * the meter carries the same hue as the entity everywhere else.\n */\nimport * as React from \"react\"\nimport { cn } from \"@invana/ui\"\n\nexport type InlineMeterTone = \"primary\" | \"muted\" | \"success\" | \"warning\" | \"destructive\"\n\nconst TONE: Record<InlineMeterTone, string> = {\n primary: \"bg-primary\",\n muted: \"bg-muted-foreground\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n destructive: \"bg-destructive\",\n}\n\nexport interface InlineMeterProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** The share, on the same scale as `max` — `0.32` of 1. `null` reads as `—`. */\n value: number | null | undefined\n /** What a full track means. Default 1. */\n max?: number\n /** How the value is written. Default: a whole percentage of 1 — `32%`. */\n format?: (value: number) => string\n tone?: InlineMeterTone\n /** An entity's colour, as CSS — `var(--color-data-2)`. Overrides `tone`. */\n color?: string\n /** What is being measured, for assistive tech — `share of queries`. */\n label?: string\n}\n\nconst percent = (v: number) => `${Math.round(v * 100)}%`\n\nexport const InlineMeter = React.forwardRef<HTMLDivElement, InlineMeterProps>(\n ({ value, max = 1, format = percent, tone = \"primary\", color, label, className, ...props }, ref) => {\n const none = value == null || value <= 0\n const share = none ? 0 : Math.min(1, value / (max || 1))\n return (\n <div\n ref={ref}\n role={none ? undefined : \"meter\"}\n aria-label={label}\n aria-valuenow={none ? undefined : value}\n aria-valuemin={none ? undefined : 0}\n aria-valuemax={none ? undefined : max}\n className={cn(\"flex min-w-0 items-center gap-2\", className)}\n {...props}\n >\n {none ? null : (\n <span aria-hidden className=\"h-1.5 w-16 shrink-0 overflow-hidden rounded-full bg-muted\">\n <span\n className={cn(\"block h-full rounded-full\", color ? undefined : TONE[tone])}\n style={{ width: `${share * 100}%`, background: color }}\n />\n </span>\n )}\n <span className=\"text-sm tabular-nums text-muted-foreground\">\n {none ? \"—\" : format(value)}\n </span>\n </div>\n )\n },\n)\nInlineMeter.displayName = \"InlineMeter\"\n","/**\n * One row's total, split into categories along a single 100% bar — a model's\n * queries by caller: agent, plan, Explorer, API.\n *\n * DOM, not canvas: it repeats down a table, one per row.\n *\n * The categories run left to right in `series` order, and the order is the same\n * in every row, so a caller is always in the same place and the same colour\n * down the column. Segments are separated by a 2px gap in the surface colour,\n * never outlined. A category with nothing in it takes no space. A row with\n * nothing at all draws an empty track rather than a bar of one category.\n *\n * The legend is not per row. Pass the same `series` to one\n * {@link SegmentedBarLegend} in the table's header, so the colours are named\n * once for the whole column. Each segment names itself on hover, so identity\n * is never colour alone.\n */\nimport * as React from \"react\"\nimport {\n Legend,\n LegendItem,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn,\n type LegendProps,\n} from \"@invana/ui\"\n\nexport interface SegmentSeries {\n key: string\n label: string\n /** A token — `var(--color-data-7)`. */\n color: string\n}\n\nexport interface SegmentedBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** The count per series `key`. A missing key is 0. */\n values: Record<string, number>\n /** The categories, in the fixed order every row shares. */\n series: SegmentSeries[]\n /** How a count is written in the hover. Default: `1,284`. */\n format?: (value: number) => string\n}\n\nconst whole = new Intl.NumberFormat()\n\nexport const SegmentedBar = React.forwardRef<HTMLDivElement, SegmentedBarProps>(\n ({ values, series, format = (v) => whole.format(v), className, ...props }, ref) => {\n const total = series.reduce((sum, s) => sum + Math.max(0, values[s.key] ?? 0), 0)\n const parts = series\n .map((s) => ({ ...s, value: Math.max(0, values[s.key] ?? 0) }))\n .filter((p) => p.value > 0)\n const pct = (v: number) => `${Math.round((v / total) * 100)}%`\n const summary = total\n ? parts.map((p) => `${p.label} ${pct(p.value)}`).join(\", \")\n : \"nothing counted\"\n\n return (\n <TooltipProvider delayDuration={0}>\n <div\n ref={ref}\n role=\"img\"\n aria-label={summary}\n // The gaps show the surface behind the bar; only an empty row draws a track.\n className={cn(\n \"flex h-2 w-full min-w-16 gap-[2px] overflow-hidden rounded-full\",\n total === 0 && \"bg-muted\",\n className,\n )}\n {...props}\n >\n {parts.map((p) => (\n <Tooltip key={p.key}>\n <TooltipTrigger asChild>\n <span\n className=\"h-full min-w-[2px]\"\n style={{ flexGrow: p.value, flexBasis: 0, background: p.color }}\n />\n </TooltipTrigger>\n <TooltipContent>\n <span className=\"tabular-nums\">\n {p.label} · {format(p.value)} · {pct(p.value)}\n </span>\n </TooltipContent>\n </Tooltip>\n ))}\n </div>\n </TooltipProvider>\n )\n },\n)\nSegmentedBar.displayName = \"SegmentedBar\"\n\nexport interface SegmentedBarLegendProps extends Omit<LegendProps, \"children\"> {\n /** The same `series` every row's {@link SegmentedBar} is given. */\n series: SegmentSeries[]\n}\n\n/** The one legend for a column of {@link SegmentedBar}s. */\nexport const SegmentedBarLegend = React.forwardRef<HTMLDivElement, SegmentedBarLegendProps>(\n ({ series, ...props }, ref) => (\n <Legend ref={ref} {...props}>\n {series.map((s) => (\n <LegendItem key={s.key} color={s.color} label={s.label} />\n ))}\n </Legend>\n ),\n)\nSegmentedBarLegend.displayName = \"SegmentedBarLegend\"\n","import * as React from \"react\"\nimport { cn } from \"@invana/ui\"\n\n/** A cell that is more than how busy it was: a guardrail said no, or data left the boundary. */\nexport interface HeatLaneMark {\n /** The cell's index. */\n at: number\n /** `refused` — a rule stopped it; `egress` — data crossed to a third party or a model. */\n kind: \"refused\" | \"egress\"\n}\n\nexport interface HeatLaneProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /**\n * How busy each slice of time was, `0`–`1`, oldest first. `0` is touched and\n * idle — a faint cell; `null` is not touched at all — a hollow one.\n */\n values: (number | null)[]\n marks?: HeatLaneMark[]\n /** The cell held open — drawn ringed. */\n pinned?: number | null\n /** Makes every lit cell a button: it receives the cell's index, or `null` to let it go. */\n onPin?: (at: number | null) => void\n /** What each cell's title says — `4.25–4.50 s`. Defaults to its index. */\n cellLabel?: (at: number) => string\n /**\n * The lit cells' fill, as a class — `bg-info`, `bg-data-3`. The lane's\n * busyness is the cell's opacity, so one hue carries the whole lane.\n * @default \"bg-info\"\n */\n fill?: string\n /** No signal: the lane is dimmed, not cooled — it does not know, rather than knows it is quiet. */\n stale?: boolean\n}\n\nconst MARK: Record<HeatLaneMark[\"kind\"], string> = {\n refused: \"bg-destructive\",\n egress: \"bg-warning\",\n}\n\n/**\n * One lane of busyness over time: a cell per slice, brighter where it was\n * busier.\n *\n * The lanes of a layer-activity drawing, one per layer, sharing an axis — so\n * *which layers were busy, and when* is read down the column rather than\n * from numbers. **Not touched and touched-but-idle are different cells**:\n * hollow is *nothing reached for it*, faint is *it was there and quiet*. A\n * refusal or a crossing is marked in its cell in a status colour, never a\n * brighter one, so it is not mistaken for load.\n *\n * The cells stretch to the lane's width: the axis is the same for every lane,\n * whatever the width it is drawn at.\n */\nexport const HeatLane = React.forwardRef<HTMLDivElement, HeatLaneProps>(\n ({ values, marks, pinned, onPin, cellLabel, fill = \"bg-info\", stale, className, style, ...props }, ref) => {\n const markAt = React.useMemo(() => new Map((marks ?? []).map((m) => [m.at, m.kind])), [marks])\n return (\n <div\n ref={ref}\n className={cn(\"grid h-3 gap-px\", stale && \"opacity-40 grayscale\", className)}\n style={{ gridTemplateColumns: `repeat(${values.length}, minmax(0, 1fr))`, ...style }}\n {...props}\n >\n {values.map((v, i) => {\n const mark = markAt.get(i)\n const label = `${cellLabel ? cellLabel(i) : i}${mark ? ` · ${mark}` : v == null ? \" · not touched\" : \"\"}`\n const cls = cn(\n \"block h-full min-w-0 rounded-[1px]\",\n mark ? MARK[mark] : v == null ? \"border border-border\" : v === 0 ? \"bg-muted\" : fill,\n pinned === i && \"ring-1 ring-foreground ring-offset-1 ring-offset-background\",\n )\n const opacity = mark || v == null || v === 0 ? undefined : Math.max(0.18, Math.min(1, v))\n return onPin && v != null ? (\n <button\n key={i}\n type=\"button\"\n title={label}\n aria-label={label}\n aria-pressed={pinned === i}\n className={cn(cls, \"cursor-pointer focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\")}\n style={{ opacity }}\n onClick={() => onPin(pinned === i ? null : i)}\n />\n ) : (\n <span key={i} title={label} className={cls} style={{ opacity }} />\n )\n })}\n </div>\n )\n },\n)\nHeatLane.displayName = \"HeatLane\"\n","/**\n * TODO — provisional. Built ahead of its design review.\n *\n * The chart set was deliberately deferred while the rest of the kit was built,\n * because charts are the one group with a real design question in them rather\n * than a markup question: which forms this product actually needs, at what\n * sizes, and how much a 330px drawer can carry. This component satisfies the\n * dataviz rules and the validated palette, but the *form inventory* has not been\n * agreed — treat the API as unsettled until a board screen uses it in anger.\n */\nimport * as React from \"react\"\n\nimport { cn } from \"@invana/ui\"\n\nexport interface BarDatum {\n label: React.ReactNode\n value: number\n /**\n * Overrides the series colour for this bar. Use a data-palette token\n * (`var(--color-data-3)`) when the bar's identity is an entity — a node type,\n * a theme — so it matches that entity everywhere else it appears.\n */\n color?: string\n /** What the tip should read, if not the raw value. */\n display?: React.ReactNode\n /**\n * Drawn as the remainder rather than an item — `3 others`, the rest folded\n * into one line: its label and bar in the muted colour. `ranked` only.\n */\n muted?: boolean\n}\n\nexport interface BarChartHProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n data: BarDatum[]\n /** Fixes the scale. Defaults to the largest value present. */\n max?: number\n /** Width of the label column, so bars start on the same x. Default: 78, or 96 in `ranked`. */\n labelWidth?: number\n /** Series colour when a datum does not override it. */\n color?: string\n /** Names what is plotted. A single series needs no legend when this is set. */\n caption?: React.ReactNode\n /**\n * `tips` labels each bar at its end. `ranked` is a list read top to bottom —\n * drivers, top-N, likely causes: the labels are the reading in the text\n * colour and may wrap, the bars take the width between, and the values line\n * up in a column at the right. A negative value draws in `negativeColor`,\n * its length its size.\n */\n variant?: \"tips\" | \"ranked\"\n /** The colour of a bar below zero, in `ranked`. */\n negativeColor?: string\n /**\n * `ranked` only: bars grow both ways from a zero rule in the middle, and the\n * line under them says what each side means — `− pulls margin down`,\n * `lifts it +`.\n */\n diverging?: { below?: React.ReactNode; above?: React.ReactNode }\n}\n\n/**\n * Magnitude across a handful of named things.\n *\n * Horizontal because the labels are words — a stock, a pattern, a theme — and\n * words read badly rotated under a column. Bars grow from a single baseline on\n * the left, so length is the only thing carrying the value.\n *\n * One series, so there is no legend: `caption` names what is plotted. Every bar\n * is directly labelled at its tip, which is also what discharges the light-mode\n * contrast obligation on the data palette — identity and value are never\n * carried by hue alone.\n */\nexport const BarChartH = React.forwardRef<HTMLDivElement, BarChartHProps>(\n (\n {\n data,\n max,\n labelWidth,\n color = \"var(--color-data-1)\",\n caption,\n variant = \"tips\",\n negativeColor = \"var(--color-destructive)\",\n diverging,\n className,\n ...props\n },\n ref,\n ) => {\n if (variant === \"ranked\") {\n const ceiling = max ?? (Math.max(...data.map((d) => Math.abs(d.value)), 0) || 1)\n const share = (d: BarDatum) => Math.min(100, (Math.abs(d.value) / ceiling) * 100)\n const fill = (d: BarDatum) =>\n d.color ??\n (d.muted\n ? \"color-mix(in srgb, var(--color-muted-foreground) 40%, transparent)\"\n : d.value < 0\n ? negativeColor\n : color)\n // Below ~290px the label and value columns narrow, so the bars keep their length.\n const columns =\n labelWidth != null\n ? { gridTemplateColumns: `${labelWidth}px minmax(0, 1fr) 40px` }\n : undefined\n return (\n <div ref={ref} className={cn(\"@container flex flex-col gap-1.5\", className)} {...props}>\n {caption != null ? (\n <span className=\"text-sm text-muted-foreground\">{caption}</span>\n ) : null}\n {data.map((d, i) => (\n <div\n key={i}\n className={cn(\n \"grid items-center gap-[7px] text-sm\",\n labelWidth == null &&\n \"grid-cols-[96px_minmax(0,1fr)_40px] @max-[290px]:grid-cols-[74px_minmax(0,1fr)_36px]\",\n )}\n style={columns}\n >\n <span className={cn(\"min-w-0 truncate\", d.muted && \"text-muted-foreground\")}>{d.label}</span>\n {diverging ? (\n <span className=\"relative block h-2 before:absolute before:-inset-y-[3px] before:left-1/2 before:border-l before:border-border\">\n <span\n title={`${d.label}: ${d.display ?? d.value}`}\n className=\"absolute top-0 h-2 rounded-[1px] opacity-85\"\n style={{\n left: d.value < 0 ? `${50 - share(d) / 2}%` : \"50%\",\n width: `${share(d) / 2}%`,\n background: fill(d),\n }}\n />\n </span>\n ) : (\n <span\n title={`${d.label}: ${d.display ?? d.value}`}\n className=\"h-2 rounded-[1px] opacity-85\"\n style={{ width: `${share(d)}%`, background: fill(d) }}\n />\n )}\n <span className=\"text-end font-mono text-xs tabular-nums\">{d.display ?? d.value}</span>\n </div>\n ))}\n {diverging ? (\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>{diverging.below}</span>\n <span>0</span>\n <span>{diverging.above}</span>\n </div>\n ) : null}\n </div>\n )\n }\n const ceiling = max ?? (Math.max(...data.map((d) => d.value), 0) || 1)\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-1\", className)} {...props}>\n {caption != null ? (\n <span className=\"text-sm text-muted-foreground\">{caption}</span>\n ) : null}\n {data.map((d, i) => (\n <div key={i} className=\"flex h-4 items-center gap-2\">\n <span\n className=\"shrink-0 truncate text-sm text-muted-foreground\"\n style={{ width: labelWidth ?? 78 }}\n >\n {d.label}\n </span>\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span\n title={`${d.label}: ${d.display ?? d.value}`}\n className=\"h-2.5 shrink-0 rounded-e-[4px]\"\n style={{\n width: `${Math.max(0, (d.value / ceiling) * 100)}%`,\n background: d.color ?? color,\n }}\n />\n <span className=\"shrink-0 text-sm tabular-nums\">\n {d.display ?? d.value}\n </span>\n </span>\n </div>\n ))}\n </div>\n )\n },\n)\nBarChartH.displayName = \"BarChartH\"\n","/**\n * TODO — provisional. Built ahead of its design review.\n *\n * The chart set was deliberately deferred while the rest of the kit was built,\n * because charts are the one group with a real design question in them rather\n * than a markup question: which forms this product actually needs, at what\n * sizes, and how much a 330px drawer can carry. This component satisfies the\n * dataviz rules and the validated palette, but the *form inventory* has not been\n * agreed — treat the API as unsettled until a board screen uses it in anger.\n */\nimport * as React from \"react\"\n\nimport { cn, Legend, LegendItem } from \"@invana/ui\"\n\ninterface ColumnBase {\n /** The period or group — `wk 36`, `F`, `paid`. */\n label: React.ReactNode\n /** A second line under the label — `1–5 Sep`. */\n sublabel?: React.ReactNode\n}\n\n/** One column: one measure in one period. */\nexport interface SingleColumnDatum extends ColumnBase {\n value: number\n display?: React.ReactNode\n /**\n * What the column was meant to reach — drawn as a dashed column the value\n * stands inside, so falling short reads as the gap between them.\n */\n plan?: number\n}\n\n/** A group of columns side by side, one per {@link BarSeries}, in the same order. */\nexport interface GroupedColumnDatum extends ColumnBase {\n values: number[]\n /** Written values, index for index with `values`. */\n display?: React.ReactNode[]\n}\n\nexport type ColumnDatum = SingleColumnDatum | GroupedColumnDatum\n\nexport interface BarSeries {\n /** What the series is — `before 2 Jun`. Named in the legend. */\n name: React.ReactNode\n /** Defaults to the data palette in order: `--color-data-1`, `-2`, … */\n color?: string\n}\n\nexport interface BarTarget {\n value: number\n /** Written at the right-hand end of the rule — `avg`, `target`. */\n label?: React.ReactNode\n /** Defaults to the muted text colour. */\n color?: string\n}\n\nexport interface BarChartVProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n data: ColumnDatum[]\n /**\n * Names the series when `data` is grouped. Two or more draw a legend; the\n * columns in a group follow this order.\n */\n series?: BarSeries[]\n /** Fixes the scale. Defaults to the largest value present, or the target. */\n max?: number\n /** Values to draw a hairline at — `[50, 75, 100]`. */\n gridlines?: number[]\n /** A dashed rule across the plot — a target, a baseline, an average. */\n target?: BarTarget\n height?: number\n color?: string\n /** Colour for the column the story is about. Defaults to `color`. Single series only. */\n highlightColor?: string\n /**\n * Which column (or group) carries the emphasis. The rest are drawn lighter.\n *\n * A single series defaults to the most recent. A grouped chart defaults to\n * none, because there the comparison is inside each group, not between them.\n * `null` says none outright.\n */\n highlightIndex?: number | null\n /**\n * Which columns get a value on the cap.\n *\n * `last` by default — the emphasised column or group. A number on every\n * column stops being a label and becomes texture; the gridlines carry the rest.\n */\n labelMode?: \"last\" | \"all\" | \"none\"\n caption?: React.ReactNode\n /**\n * `default` caps columns at 24px so the band's leftover is air. `comparison`\n * is the answer-card form: columns take two thirds of their band, so they\n * grow with the card from 280px to 720px, stand on a baseline with square\n * caps, and carry their values in the muted text colour.\n */\n variant?: \"default\" | \"comparison\"\n /** Names the dashed plan columns in the legend — `plan`. */\n planLabel?: React.ReactNode\n}\n\ninterface Mark {\n plan?: number\n value: number\n display: React.ReactNode\n color: string\n}\n\nconst isGrouped = (d: ColumnDatum): d is GroupedColumnDatum =>\n \"values\" in d && Array.isArray(d.values)\n\n/**\n * One measure over a few periods, or a few series side by side per group.\n *\n * Vertical because the x-axis is time and time reads left to right. Columns are\n * capped at 24px and separated by real gaps, so the band's leftover is air\n * rather than a fatter bar; columns in a group touch but for a 2px gap.\n *\n * Rule labels — gridlines and the target — sit in a gutter at the right that is\n * as wide as the longest of them, so a label never sits on a column however\n * narrow the chart. One series needs no legend (`caption` says what is\n * plotted); two or more get one, with the target in it.\n */\nexport const BarChartV = React.forwardRef<HTMLDivElement, BarChartVProps>(\n (\n {\n data,\n series,\n max,\n gridlines = [],\n target,\n height = 160,\n color = \"var(--color-data-1)\",\n highlightColor,\n highlightIndex,\n labelMode = \"last\",\n caption,\n variant = \"default\",\n planLabel,\n className,\n ...props\n },\n ref,\n ) => {\n const grouped = data.some(isGrouped)\n const seriesColor = (k: number) =>\n series?.[k]?.color ?? (k === 0 ? color : `var(--color-data-${k + 1})`)\n\n const emphasis =\n highlightIndex === undefined\n ? grouped\n ? undefined\n : data.length - 1\n : (highlightIndex ?? undefined)\n const marks: Mark[][] = data.map((d, i) =>\n isGrouped(d)\n ? d.values.map((value, k) => ({\n value,\n display: d.display?.[k] ?? value,\n color: seriesColor(k),\n }))\n : [\n {\n plan: d.plan,\n value: d.value,\n display: d.display ?? d.value,\n color: i === emphasis ? (highlightColor ?? color) : color,\n },\n ],\n )\n\n const largest = Math.max(\n 0,\n ...marks.flat().map((m) => Math.max(m.value, m.plan ?? 0)),\n target?.value ?? 0,\n )\n const planned = marks.some((g) => g.some((m) => m.plan != null))\n const ceiling = max ?? (largest || 1)\n const labelled = (i: number) =>\n labelMode === \"all\" || (labelMode === \"last\" && i === emphasis)\n const at = (v: number) => `${(v / ceiling) * 100}%`\n const comparison = variant === \"comparison\"\n\n const legend = (series != null && series.length > 1) || (planned && planLabel != null)\n const rules = [\n ...gridlines.map((g) => ({ key: `g${g}`, value: g, label: g as React.ReactNode })),\n // With a legend the target is named there, and a gutter label would only\n // take width from the plot.\n ...(target?.label != null && !legend\n ? [{ key: \"target\", value: target.value, label: target.label }]\n : []),\n ]\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-1\", className)} {...props}>\n {caption != null ? (\n <span className=\"text-sm text-muted-foreground\">{caption}</span>\n ) : null}\n\n {/* `mt-2` is headroom: a rule's label is centred on its line, so half\n of the topmost one sits above the plot box and would otherwise\n collide with the caption. */}\n <div className=\"mt-2 grid grid-cols-[minmax(0,1fr)_auto] gap-y-1\">\n <div className=\"relative\" style={{ height }}>\n {gridlines.map((g) => (\n <span\n key={g}\n aria-hidden\n className=\"absolute inset-x-0 h-px bg-border\"\n style={{ bottom: at(g) }}\n />\n ))}\n\n {comparison ? (\n <span aria-hidden className=\"absolute inset-x-0 bottom-0 h-px bg-border\" />\n ) : null}\n\n <div className=\"absolute inset-0 flex items-end justify-between gap-2\">\n {marks.map((group, i) => (\n <div key={i} className=\"flex h-full min-w-0 flex-1 justify-center\">\n <div\n className={cn(\n \"flex h-full min-w-0 items-end justify-center gap-0.5\",\n comparison ? \"w-2/3\" : \"w-full\",\n )}\n >\n {group.map((m, k) => (\n <div\n key={k}\n className={cn(\n \"relative flex h-full min-w-0 flex-1 flex-col items-center justify-end gap-1\",\n !comparison && \"max-w-6\",\n )}\n >\n {m.plan != null ? (\n <span\n aria-hidden\n className=\"absolute inset-x-0 bottom-0 border border-dashed border-muted-foreground\"\n style={{ height: `${Math.max(0, (m.plan / ceiling) * 100)}%` }}\n />\n ) : null}\n {labelled(i) ? (\n <span\n className={cn(\n \"text-sm whitespace-nowrap tabular-nums\",\n comparison && \"text-muted-foreground\",\n )}\n >\n {m.display}\n </span>\n ) : null}\n <span\n title={`${textOf(data[i]!.label)}: ${textOf(m.display)}`}\n className={cn(\n m.plan != null ? \"relative w-2/3\" : \"w-full\",\n !comparison && \"rounded-t-[4px]\",\n )}\n style={{\n height: `${Math.max(0, (m.value / ceiling) * 100)}%`,\n background: m.color,\n opacity: emphasis == null || i === emphasis ? 1 : 0.55,\n }}\n />\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n\n {/* Drawn over the columns: a target is read against them, so it\n must not disappear behind the one that clears it. */}\n {target ? (\n <span\n aria-hidden\n className=\"absolute inset-x-0 border-t border-dashed\"\n style={{\n bottom: at(target.value),\n borderColor: target.color ?? \"var(--color-muted-foreground)\",\n }}\n />\n ) : null}\n </div>\n\n <div className=\"relative\">\n {/* Invisible copies size the gutter to its longest label. */}\n {rules.map((r) => (\n <span\n key={r.key}\n aria-hidden\n className=\"invisible block h-0 pl-1 text-sm whitespace-nowrap\"\n >\n {r.label}\n </span>\n ))}\n {rules.map((r) => (\n <span\n key={r.key}\n className=\"absolute left-0 translate-y-1/2 pl-1 text-sm whitespace-nowrap tabular-nums text-muted-foreground\"\n style={{ bottom: at(r.value) }}\n >\n {r.label}\n </span>\n ))}\n </div>\n\n <div className=\"flex justify-between gap-2\">\n {data.map((d, i) => (\n <div key={i} className=\"flex min-w-0 flex-1 flex-col items-center\">\n <span className=\"truncate text-sm text-muted-foreground\">\n {d.label}\n </span>\n {d.sublabel != null ? (\n <span className=\"truncate text-sm text-muted-foreground/70\">\n {d.sublabel}\n </span>\n ) : null}\n </div>\n ))}\n </div>\n </div>\n\n {legend ? (\n <Legend>\n {(series ?? []).map((s, k) => (\n <LegendItem key={k} kind=\"box\" color={seriesColor(k)} label={s.name} />\n ))}\n {planned && planLabel != null ? (\n <LegendItem kind=\"outline\" color=\"var(--color-muted-foreground)\" label={planLabel} />\n ) : null}\n {target?.label != null ? (\n <LegendItem\n kind=\"dashed\"\n color={target.color ?? \"var(--color-muted-foreground)\"}\n label={target.label}\n />\n ) : null}\n </Legend>\n ) : null}\n </div>\n )\n },\n)\nBarChartV.displayName = \"BarChartV\"\n\nfunction textOf(node: React.ReactNode): string {\n return typeof node === \"string\" || typeof node === \"number\" ? String(node) : \"\"\n}\n","/**\n * TODO — provisional. Built ahead of its design review.\n *\n * The chart set was deliberately deferred while the rest of the kit was built,\n * because charts are the one group with a real design question in them rather\n * than a markup question: which forms this product actually needs, at what\n * sizes, and how much a 330px drawer can carry. This component satisfies the\n * dataviz rules and the validated palette, but the *form inventory* has not been\n * agreed — treat the API as unsettled until a board screen uses it in anger.\n */\nimport * as React from \"react\"\n\nimport { cn } from \"@invana/ui\"\n\nexport interface DivergingDatum {\n label: React.ReactNode\n /** Signed. The sign is the whole point of this chart. */\n value: number\n display?: React.ReactNode\n}\n\nexport interface DivergingBarProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n data: DivergingDatum[]\n /** Fixes the scale on both sides. Defaults to the largest magnitude present. */\n max?: number\n labelWidth?: number\n /** Above the midpoint. Defaults to `--color-success`. */\n positiveColor?: string\n /** Below it. Defaults to `--color-destructive`. */\n negativeColor?: string\n caption?: React.ReactNode\n}\n\n/**\n * Polarity — how far either side of zero.\n *\n * A net learning weight, a delta against a baseline, a sentiment score. The\n * midpoint is a real zero line, drawn in the neutral border colour, and both\n * sides share one scale so a `−9` is visibly longer than a `+6`.\n *\n * The poles use the **status** colours rather than data-palette hues, because\n * this chart's two directions are good and bad, not two categories. That is the\n * one place status colour belongs on a chart — it is encoding valence, not\n * identity, so it is never \"series 1 and series 2\". Every bar is directly\n * labelled, so the sign is readable without seeing colour at all.\n */\nexport const DivergingBar = React.forwardRef<\n HTMLDivElement,\n DivergingBarProps\n>(\n (\n {\n data,\n max,\n labelWidth = 104,\n positiveColor = \"var(--color-success)\",\n negativeColor = \"var(--color-destructive)\",\n caption,\n className,\n ...props\n },\n ref,\n ) => {\n const ceiling =\n max ?? (Math.max(...data.map((d) => Math.abs(d.value)), 0) || 1)\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-1\", className)} {...props}>\n {caption != null ? (\n <span className=\"text-sm text-muted-foreground\">{caption}</span>\n ) : null}\n {data.map((d, i) => {\n const positive = d.value >= 0\n const width = `${(Math.abs(d.value) / ceiling) * 50}%`\n return (\n <div key={i} className=\"flex h-4 items-center gap-2\">\n <span\n className=\"shrink-0 truncate text-sm text-muted-foreground\"\n style={{ width: labelWidth }}\n >\n {d.label}\n </span>\n <span className=\"relative flex min-w-0 flex-1 items-center\">\n {/* The zero line — neutral, never one of the poles. */}\n <span\n aria-hidden\n className=\"absolute left-1/2 h-4 w-px -translate-x-1/2 bg-border\"\n />\n <span className=\"flex w-1/2 justify-end\">\n {!positive ? (\n <span\n title={`${d.label}: ${d.display ?? d.value}`}\n className=\"h-2.5 rounded-s-[4px]\"\n style={{ width, background: negativeColor }}\n />\n ) : null}\n </span>\n <span className=\"flex w-1/2 justify-start\">\n {positive ? (\n <span\n title={`${d.label}: ${d.display ?? d.value}`}\n className=\"h-2.5 rounded-e-[4px]\"\n style={{ width, background: positiveColor }}\n />\n ) : null}\n </span>\n </span>\n {/* One gutter for every value, not one per side. Flipping the\n column with the sign puts a negative number immediately after\n the row's name, where it reads as part of the label. */}\n <span className=\"w-8 shrink-0 text-right text-sm tabular-nums\">\n {d.display ?? (d.value > 0 ? `+${d.value}` : d.value)}\n </span>\n </div>\n )\n })}\n </div>\n )\n },\n)\nDivergingBar.displayName = \"DivergingBar\"\n","/**\n * TODO — provisional. Built ahead of its design review.\n *\n * The chart set was deliberately deferred while the rest of the kit was built,\n * because charts are the one group with a real design question in them rather\n * than a markup question: which forms this product actually needs, at what\n * sizes, and how much a 330px drawer can carry. This component satisfies the\n * dataviz rules and the validated palette, but the *form inventory* has not been\n * agreed — treat the API as unsettled until a board screen uses it in anger.\n */\nimport * as React from \"react\"\n\nimport { cn, ExpandToggle, type ExpandedKeys, useExpandedKeys } from \"@invana/ui\"\n\nexport interface HeatCell {\n /** When this cell is — `09:45`. Used in the hover title. */\n at: React.ReactNode\n /** Which state key this cell is in. Must exist in `states`. */\n state: string\n /** Extra detail for the hover title — `2 names: BPCL, HINDPETRO`. */\n detail?: React.ReactNode\n}\n\nexport interface HeatState {\n key: string\n /** What the state is called. Shown in the legend and the hover title. */\n label: React.ReactNode\n color?: string\n /** Renders as a ring rather than a fill — for \"nothing happened here\". */\n hollow?: boolean\n}\n\n/** One labelled strip, and the strips it opens into — a schedule, then each of its jobs. */\nexport interface HeatStripRow {\n key: string\n label: React.ReactNode\n cells: HeatCell[]\n /** Drawn under it, indented, when it is open. */\n children?: HeatStripRow[]\n}\n\nexport interface HeatStripProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** One strip. Pass this or `rows`. */\n cells?: HeatCell[]\n /** Labelled strips over one axis, each opening into its `children`. Pass this or `cells`. */\n rows?: HeatStripRow[]\n states: HeatState[]\n /** Axis ticks under the strip — `[{at: 0, label: '09'}, …]`. */\n ticks?: { at: number; label: React.ReactNode }[]\n cellSize?: number\n /** The label column of `rows`, in px. Defaults to its longest label, up to 40%. */\n labelWidth?: number\n /** Which rows with `children` are open, by key — `true` for all. Controlled. */\n expanded?: ExpandedKeys\n /** Which are open at first, uncontrolled. Closed by default. */\n defaultExpanded?: ExpandedKeys\n onExpandedChange?: (expanded: ExpandedKeys) => void\n}\n\nconst INDENT = 12\n\nconst everyRow = (rows: HeatStripRow[]): HeatStripRow[] =>\n rows.flatMap((r) => [r, ...everyRow(r.children ?? [])])\n\n/** One strip of squares — the whole of a plain strip, or one row of `rows`. */\nfunction Cells({\n cells,\n byKey,\n cellSize,\n className,\n}: {\n cells: HeatCell[]\n byKey: Map<string, HeatState>\n cellSize: number\n className?: string\n}) {\n return (\n <div className={cn(\"flex gap-1\", className)}>\n {cells.map((c, i) => {\n const s = byKey.get(c.state)\n return (\n <span\n key={i}\n title={`${c.at} · ${s?.label ?? c.state}${c.detail ? ` · ${c.detail}` : \"\"}`}\n className={cn(\"shrink-0 rounded-[2px]\", s?.hollow && \"border\")}\n style={{\n width: cellSize,\n height: cellSize,\n background: s?.hollow ? \"transparent\" : (s?.color ?? \"var(--color-muted)\"),\n borderColor: s?.hollow ? (s.color ?? \"var(--color-border)\") : undefined,\n }}\n />\n )\n })}\n </div>\n )\n}\n\nfunction Ticks({\n count,\n ticks,\n cellSize,\n className,\n}: {\n count: number\n ticks: { at: number; label: React.ReactNode }[]\n cellSize: number\n className?: string\n}) {\n return (\n <div className={cn(\"flex gap-1\", className)} aria-hidden>\n {Array.from({ length: count }, (_, i) => {\n const tick = ticks.find((t) => t.at === i)\n return (\n <span\n key={i}\n className=\"shrink-0 text-sm tabular-nums text-muted-foreground\"\n style={{ width: cellSize }}\n >\n {tick ? tick.label : \"\"}\n </span>\n )\n })}\n </div>\n )\n}\n\n/**\n * A run of firings, one square each, in time order.\n *\n * A schedule's day: twenty-one firings, most served, one skipped, one that could\n * not answer. The shape of the day is the point — a reader sees the run of green\n * and the one square that is not, without reading any of them.\n *\n * `rows` draws several strips over one axis, each labelled, and a row opens into\n * its `children` — an agent into its tasks, a schedule into its jobs — so the one\n * red square can be followed down to the part that went red.\n *\n * These are **status** colours, so they are reserved and never stand in for\n * categories. The legend is mandatory rather than optional: a square carries no\n * label of its own, so without the legend the strip would be colour-alone. Each\n * cell also names its state in the hover title, which is what a screen reader\n * and a keyboard user get.\n */\nexport const HeatStrip = React.forwardRef<HTMLDivElement, HeatStripProps>(\n (\n {\n cells,\n rows,\n states,\n ticks,\n cellSize = 14,\n labelWidth,\n expanded,\n defaultExpanded,\n onExpandedChange,\n className,\n ...props\n },\n ref,\n ) => {\n const byKey = React.useMemo(\n () => new Map(states.map((s) => [s.key, s])),\n [states],\n )\n const parents = everyRow(rows ?? [])\n .filter((r) => r.children?.length)\n .map((r) => r.key)\n const nested = parents.length > 0\n const { isOpen, toggle } = useExpandedKeys({\n expanded,\n defaultExpanded,\n onExpandedChange,\n keys: parents,\n })\n\n const shown: { row: HeatStripRow; depth: number }[] = []\n const walk = (list: HeatStripRow[], depth: number) => {\n for (const row of list) {\n shown.push({ row, depth })\n if (row.children?.length && isOpen(row.key)) walk(row.children, depth + 1)\n }\n }\n walk(rows ?? [], 0)\n const count = Math.max(cells?.length ?? 0, ...shown.map((r) => r.row.cells.length))\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-1.5\", className)} {...props}>\n {rows ? (\n <div\n className=\"grid items-center gap-x-2 gap-y-1\"\n style={{\n gridTemplateColumns: `${labelWidth != null ? `${labelWidth}px` : \"fit-content(40%)\"} minmax(0, 1fr)`,\n }}\n >\n {shown.map(({ row, depth }) => {\n const kids = (row.children?.length ?? 0) > 0\n const open = kids && isOpen(row.key)\n return (\n <React.Fragment key={row.key}>\n <span\n className={cn(\"flex min-w-0 items-center gap-1 text-sm\", depth > 0 && \"text-muted-foreground\")}\n style={{ paddingLeft: depth * INDENT }}\n >\n {kids ? (\n <ExpandToggle\n open={open}\n label={typeof row.label === \"string\" ? row.label : row.key}\n onClick={() => toggle(row.key)}\n />\n ) : nested ? (\n <ExpandToggle.Spacer />\n ) : null}\n <span className=\"min-w-0 truncate\">{row.label}</span>\n </span>\n <Cells\n cells={row.cells}\n byKey={byKey}\n cellSize={cellSize}\n className=\"min-w-0 overflow-hidden\"\n />\n </React.Fragment>\n )\n })}\n {ticks?.length ? (\n <>\n <span />\n <Ticks count={count} ticks={ticks} cellSize={cellSize} className=\"min-w-0 overflow-hidden\" />\n </>\n ) : null}\n </div>\n ) : (\n <>\n <Cells cells={cells ?? []} byKey={byKey} cellSize={cellSize} className=\"flex-wrap\" />\n {ticks?.length ? (\n <Ticks count={count} ticks={ticks} cellSize={cellSize} className=\"flex-wrap\" />\n ) : null}\n </>\n )}\n\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-sm\">\n {states.map((s) => (\n <span key={s.key} className=\"flex items-center gap-1.5\">\n <span\n aria-hidden\n className={cn(\"size-2.5 shrink-0 rounded-[2px]\", s.hollow && \"border\")}\n style={{\n background: s.hollow ? \"transparent\" : (s.color ?? \"var(--color-muted)\"),\n borderColor: s.hollow ? (s.color ?? \"var(--color-border)\") : undefined,\n }}\n />\n <span className=\"text-muted-foreground\">{s.label}</span>\n </span>\n ))}\n </div>\n </div>\n )\n },\n)\nHeatStrip.displayName = \"HeatStrip\"\n"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@invana/charts",
3
+ "version": "0.0.32",
4
+ "description": "Invana Design System - Charts: time series on uPlot, small marks in DOM/SVG",
5
+ "homepage": "https://github.com/invana/design-kit#readme",
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "keywords": [
21
+ "design-system",
22
+ "react",
23
+ "charts",
24
+ "uplot",
25
+ "invana/charts"
26
+ ],
27
+ "bugs": {
28
+ "url": "https://github.com/invana/design-kit/issues"
29
+ },
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/invana/design-kit.git",
33
+ "directory": "packages/charts"
34
+ },
35
+ "license": "MIT",
36
+ "author": "Ravi Raja Merugu",
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "peerDependencies": {
41
+ "react": "^18 || ^19",
42
+ "react-dom": "^18 || ^19",
43
+ "@invana/styling": "0.0.32",
44
+ "@invana/ui": "0.0.32",
45
+ "@invana/tables": "0.0.32"
46
+ },
47
+ "dependencies": {
48
+ "uplot": "^1.6.32"
49
+ },
50
+ "devDependencies": {
51
+ "@types/react": "^19.2.17",
52
+ "@types/react-dom": "^19.2.3",
53
+ "react": "^19.2.7",
54
+ "react-dom": "^19.2.7",
55
+ "tsup": "^8.5.1",
56
+ "typescript": "~5.9.3",
57
+ "@invana/styling": "0.0.32",
58
+ "@invana/tables": "0.0.32",
59
+ "@invana/ui": "0.0.32"
60
+ },
61
+ "scripts": {
62
+ "build": "tsup",
63
+ "lint": "eslint .",
64
+ "type-check": "tsc --noEmit -p tsconfig.lib.json"
65
+ }
66
+ }