PAT-43 · Catalog 4 · Visualization
Visualization Catalog — sample renders
Internal preview. 38 templates, each rendered with its getSampleData() export. Templates back the InsightCard.visual.kind enum and are queryable via the toolbox.viz.* MCP tools.
viz.index-meter
Index Meter (decomposable 0–100)
percentile-calloutcompositioncategorical-breakdownA headline 0–100 index that opens to weighted component sub-scores, each opening to the measures beneath. Components read as dots on a shared 0–100 axis (not bars) with the headline as a reference marker. The canonical composite-of-composites display (Leadership Quality, CAMS) — the Index Doctrine made visible.
Input: { headline: { label: string; value: number; band?: string }; components: Array<{ label: string; value: number; weight: number; measures?: Array<{ label: string; value: number; unit?: string; n?: number }> }>; asOf?: string }
No renderer wired.
When to use / when not to use
When to use: Use for a 0–100 composite that must stay decomposable: a headline score, ~3 weighted components, and the measures + data under each. Reading: each component is a dot on a shared 0–100 axis vs the headline marker; the measures open beneath it.
When not to use: Do not use a gauge/speedometer or a full-width single-value bar for an index (retired — they exaggerate and don't decompose). For a single value vs a target use `viz.bullet-bar`; for an estimate with uncertainty use `viz.forest-plot`.
Renderer:
src/lib/visualizations/templates/IndexMeter.tsxviz.forest-plot
Forest Plot (dot + interval)
estimate-intervalcomparison-pairdistributionSorted dot-and-confidence-interval (point-range) chart against a reference line. Reads estimate + uncertainty at once; the canonical chart for pay-equity / fairness gaps, segment scores with CIs, and any ranking where intervals must be honored.
Input: { rows: Array<{ label: string; estimate: number; ciLower: number; ciUpper: number; n?: number }>; reference?: number }
No renderer wired.
When to use / when not to use
When to use: Use when the answer is an ESTIMATE WITH UNCERTAINTY across groups or against a reference: pay-equity gaps centered on zero, engagement/manager scores with CIs, ranking-with-uncertainty. Reading: dot = estimate, line = 95% CI, vertical rule = no-effect/reference; judge each interval against the rule.
When not to use: Do not use mirrored/butterfly bars or two-bar comparisons when the output is a gap estimate — they force mental subtraction and hide uncertainty. Do not use for a single value vs a target (use `viz.bullet-bar`). Do not infer significance from two overlapping group CIs; this chart shows the difference's own interval.
Renderer:
src/lib/visualizations/templates/ForestPlot.tsxviz.waterfall
Waterfall (bridge)
flow-bridgecategorical-breakdownBridge chart showing how a starting total reaches an ending total through sequential positive and negative contributions. Canonical for headcount reconciliation (start → hires → exits → end) and compensation walks.
Input: { stages: Array<{ label: string; delta: number; isTotal?: boolean }> }
No renderer wired.
When to use / when not to use
When to use: Use when the question is how a net total is built from additive/subtractive contributors over an ordered sequence. Reading: totals anchor at zero; each rise/fall is a signed delta off the running level.
When not to use: Do not use for simple stage-count comparison (use ranked bars) or for pure part-to-whole at one point in time (use a 100% stacked bar). Do not use a stacked bar to fake a bridge — same-category segments can't be compared.
Renderer:
src/lib/visualizations/templates/Waterfall.tsxviz.slopegraph
Slopegraph (before / after)
before-aftertrendcomparison-pairTwo-point slopegraph — each item is a line from its before value to its after value. The slope encodes direction and magnitude of change; crossings show rank changes.
Input: { items: Array<{ label: string; before: number; after: number }>; beforeLabel?: string; afterLabel?: string }
No renderer wired.
When to use / when not to use
When to use: Use for before/after change or rank change across exactly two ordered points (then vs now, pre/post program), especially across many items where a full line chart would be empty between endpoints.
When not to use: Do not use for a full time trajectory (use a line chart) or for start-vs-end magnitude where absolute bars are the point (use `viz.slope-comparison`). Keep item count modest or lines overlap.
Renderer:
src/lib/visualizations/templates/Slopegraph.tsxviz.trend-with-ci-bands
Trend with CI Bands
trendlongitudinalLine chart over time with a shaded pointwise confidence-interval band. The CI band reads as methodology-rigorous attention to uncertainty.
Input: Array<{ period: string; value: number; ciLower?: number; ciUpper?: number }>
When to use / when not to use
When to use: Use when showing a single metric trending over time AND you have pointwise CIs (e.g., Wilson CIs for a proportion). Reading: the band's width tells the reader how much noise vs signal sits in any one period.
When not to use: Do not use without CIs — `viz.sparkline-grid` is a better fit for bare lines, or just use a plain line chart. Do not use for cohort-by-cohort trends — use `viz.small-multiples-by-segment` (one trend per cohort, shared y-axis).
Renderer:
src/lib/visualizations/templates/TrendWithCiBands.tsxviz.small-multiples-by-segment
Small Multiples by Segment
cohort-comparisonlongitudinaltrendResponsive grid of mini line charts — one panel per segment, shared y-axis range — so cross-segment trend comparisons are visually honest.
Input: Array<{ segment: string; points: Array<{ period: string; value: number }> }>
Engineering
Sales
Marketing
Finance
Customer Success
Operations
Product
Legal
y: Voluntary turnover rate
When to use / when not to use
When to use: Use when comparing the SHAPE of a trend across many segments (5+ panels). Shared y-axis range matters: a segment that looks like it's dropping fast might just have a different baseline.
When not to use: Do not use for 1-2 segments — `viz.comparison-pair` or two overlaid trend lines read better. Do not use when you want to compare ONE segment's absolute level to a baseline — use `viz.percentile-callout`.
Renderer:
src/lib/visualizations/templates/SmallMultiplesBySegment.tsxviz.cohort-survival-curve
Cohort Survival Curve
survivallongitudinalcohort-comparisonKaplan-Meier-style step survival curves per cohort with shaded pointwise CI bands. Compares retention trajectories across cohorts using the same methodology demographers use.
Input: Array<{ cohort: string; period: number; survivalProbability: number; ciLower: number; ciUpper: number }>
0-1 yr tenure1-3 yr tenure3+ yr tenureWhen to use / when not to use
When to use: Use when answering 'how long do people last' across two or more cohorts (tenure bands, hire years, manager type, comp percentile). The step-function shape reads as serious survival analysis.
When not to use: Do not use for non-survival metrics. Do not use for a single cohort with no comparison group — `viz.trend-with-ci-bands` is cleaner. Do not use for very short period grids (<4 points) — the steps will look noisy.
Renderer:
src/lib/visualizations/templates/CohortSurvivalCurve.tsxviz.funnel-stage-conversion
Funnel Stage Conversion
funnel-conversioncategorical-breakdownHorizontal funnel bars by stage with prior-stage conversion percentages. Reads top-to-bottom as the recruiting / pipeline reader expects.
Input: Array<{ stage: string; count: number; conversionFromPrior?: number }>
Screened: 28% from prior stage
Phone Screen: 52% from prior stage
Onsite: 41% from prior stage
Offer Extended: 37% from prior stage
Offer Accepted: 77% from prior stage
When to use / when not to use
When to use: Use for any sequential-stage conversion analysis: hiring funnel, performance-review participation, training completion, exit-process steps. Prior-stage % is the diagnostic; absolute counts give scale.
When not to use: Do not use for non-sequential category breakdowns — use a bar chart. Do not use when stages aren't strictly nested (every stage-N person must have been a stage-N-1 person).
Renderer:
src/lib/visualizations/templates/FunnelStageConversion.tsxviz.compa-ratio-distribution
Compa-Ratio Distribution by Level
distributioncomparison-paircohort-comparisonPer-level histogram with median dashed-line + p25 / p75 markers. Stacked one row per level to compare distribution shapes (skew, spread) across the comp hierarchy.
Input: Array<{ level: string; compaRatios: number[] }>
IC1
n=40 · median 0.94 · p25 0.89 · p75 1.00
IC2
n=58 · median 1.00 · p25 0.95 · p75 1.07
IC3
n=72 · median 1.01 · p25 0.97 · p75 1.07
IC4
n=48 · median 1.04 · p25 0.97 · p75 1.11
M1
n=22 · median 1.08 · p25 1.03 · p75 1.14
When to use / when not to use
When to use: Use when showing comp-band positioning per level: where employees sit relative to the band's p50, and how wide each level's spread actually is. The median tick + IQR markers make the diagnostic explicit.
When not to use: Do not use for a single level — `viz.distribution-histogram` is the simpler choice. Do not use for non-compensation distributions — the methodology framing (medians/IQR vs means/SD) is specifically a comp pattern.
Renderer:
src/lib/visualizations/templates/CompaRatioDistribution.tsxviz.sparkline-grid
Sparkline Grid
trendmatrix-gridDense table of mini trends (one row per metric) with latest value and total delta. Designed for at-a-glance scanning of 8-30+ metrics in one frame.
Input: Array<{ label: string; points: number[] }>
Metric Trend Latest Δ vs first Voluntary turnover 0.11 +0.03 Time to fill (days) 36.98 -3.92 Engagement score 4.06 +0.29 Span of control 7.58 +0.30 Promotion velocity 0.13 +0.02 Internal mobility 0.09 +0.03 Regrettable attrition 0.05 +0.01 Headcount growth (yoy) 0.08 -0.06 When to use / when not to use
When to use: Use for the 'monitor everything' surface: an executive scorecard, a metric-explorer index, a daily ops digest. Cells are intentionally small so density doesn't drop with row count.
When not to use: Do not use as a primary chart — sparklines aren't meant for inspection. Do not use when you need axes (no axis labels per cell). Do not use for single-metric deep dives — promote to `viz.trend-with-ci-bands`.
Renderer:
src/lib/visualizations/templates/SparklineGrid.tsxviz.kt-grid
Kepner-Tregoe Decision Grid
matrix-gridDecision matrix: weighted criteria rows × options columns, scored 0-10 with neutral-shade cell color encoding. Bottom row sums the weighted total and highlights the winner.
Input: { criteria: string[]; options: string[]; scores: number[][]; weights: number[] }
Criterion Weight Buy vendor X Buy vendor Y Build in-house Cost to implement 0.25 8.0 6.5 4.0 Time to value 0.20 7.5 7.0 5.5 Org disruption 0.15 6.0 5.5 8.0 Methodology rigor 0.20 6.5 7.5 9.0 Adoption likelihood 0.20 7.5 7.0 5.0 Weighted total 7.20★ 6.75 6.10 When to use / when not to use
When to use: Use for any explicit Kepner-Tregoe-style decision: vendor evaluation, comp-strategy choice, intervention selection. The weighted-sum row makes the tradeoff explicit instead of hand-wavy.
When not to use: Do not use for non-decision contexts. Do not use when criteria aren't independent (entangled criteria need a different scoring frame). Do not use with >10 options or >12 criteria — the matrix becomes unreadable.
Renderer:
src/lib/visualizations/templates/KepnerTregoeGrid.tsxviz.distribution-histogram
Distribution Histogram
distributionSingle-variable histogram with mean and median reference lines. Reads as the canonical 'shape of this column' visualization.
Input: { values: number[]; binCount?: number; xLabel?: string }
When to use / when not to use
When to use: Use for any one-dimensional continuous distribution: tenure, salary, engagement scores, time-to-fill. Mean + median together flag skew at a glance (large gap = skewed).
When not to use: Do not use for split distributions — promote to `viz.compa-ratio-distribution` (per-level panels). Do not use for categorical breakdowns — use a bar chart. Do not use with n<30 — the bins will be noise.
Renderer:
src/lib/visualizations/templates/DistributionHistogram.tsxviz.comparison-pair
Comparison Pair
comparison-paircohort-comparisonSide-by-side bar comparison with CI whiskers, delta callout, and a coarse significance flag (overlapping vs non-overlapping 95% CIs).
Input: Array<{ group: string; value: number; ciLower?: number; ciUpper?: number; n: number }>
Manager: Tenured: 0.082 (95% CI 0.072–0.092) · n=1,840
Manager: New (<1yr): 0.137 (95% CI 0.121–0.154) · n=920
Δ = +0.055 — Significant (non-overlapping 95% CIs)
When to use / when not to use
When to use: Use for binary-cohort comparisons: control vs treatment, manager-tenured vs manager-new, before vs after. CIs and the sig flag prevent the 'two bars look different but aren't actually different' failure mode.
When not to use: Do not use for >3 groups — bars get cluttered and the pairwise sig flag stops being useful. Use a small-multiples or distribution view instead. Do not use without n — the sig flag depends on sample-size-aware CIs.
Renderer:
src/lib/visualizations/templates/ComparisonPair.tsxviz.percentile-callout
Percentile Callout
percentile-calloutSingle-stat hero with the value, its percentile band (visual marker on a 0–100 axis), and a baseline comparison with absolute and percent delta.
Input: { value: number; percentile: number; baseline: number; baselineLabel: string; unit?: string; metricLabel?: string }
Engineering 12-month voluntary turnover
0.087
vs Industry median (US tech, 100-500 emp): 0.142 (-38.7%)
p0Percentilep100You are at p28 of the comparison cohort.
When to use / when not to use
When to use: Use for an 'answer-first' summary card: 'your value is X, that's pNN of the comparison cohort, baseline is Y'. The percentile band gives shape context without a full distribution chart.
When not to use: Do not use for a trend over time — promote to `viz.trend-with-ci-bands`. Do not use when there's no baseline cohort — a plain metric tile is cleaner. Do not use when percentile is unknown — drop to a simple delta tile.
Renderer:
src/lib/visualizations/templates/PercentileCallout.tsxviz.range-strip
Range Strip
compensationcomparison-paircategorical-breakdownDiscrete-block compensation range visualization on a shared dollar scale. Each row is a labeled set of fixed-width boxes; highlighted segments form the active pay range with optional reference marker.
Input: { rows: Array<{ label: string; segments: Array<{ value: number; highlighted?: boolean; label?: string }>; markerPosition?: number; markerLabel?: string }> }
No renderer wired.
When to use / when not to use
When to use: Use for pay-structure visualization: where a band actually sits on a shared dollar scale, level-over-level overlap, market positioning. The shared step-sized boxes (e.g., $10K each) keep cross-row comparison honest in a way that bar widths can't.
When not to use: Do not use for continuous distributions — use `viz.compa-ratio-distribution`. Do not use when ranges aren't on the same numeric scale (e.g., one row is salary, another is bonus pct). Do not use with >12 rows — the strip table loses readability.
Renderer:
src/lib/visualizations/render/templates/range-strip.tsxviz.confidence-band
Confidence Band
forecasttrendlongitudinalLine chart over a numeric x-axis with inner and outer pointwise prediction bands (e.g., 1-sigma and 2-sigma). Reads as forecast-with-uncertainty.
Input: { data: Array<{ x: number; y: number; lo1?: number; hi1?: number; lo2?: number; hi2?: number }>; xLabel?: string; yLabel?: string }
No renderer wired.
When to use / when not to use
When to use: Use for metric forecasting with explicit uncertainty: attrition forecast, headcount projection, comp-cost forward look. Inner band typically represents 1-sigma, outer band 2-sigma — the wider band signals the methodologically honest answer.
When not to use: Do not use without bands — degrade to a plain trend line or `viz.trend-with-ci-bands` (period-string axis + single CI band). Do not use for historical-only series — the band framing implies a forecast.
Renderer:
src/lib/visualizations/render/templates/confidence-band.tsxviz.box-whisker
Box & Whisker
distributioncohort-comparisonPer-group five-number-summary candlestick: min / Q1 / median / Q3 / max. Compares spread + central tendency across categories at a glance.
Input: Array<{ label: string; min: number; q1: number; median: number; q3: number; max: number }>
No renderer wired.
When to use / when not to use
When to use: Use when comparing distribution shape across 2–12 groups (departments, levels, hire cohorts): the box's IQR shows spread, the whiskers show range, the median tick shows skew. Pre-aggregate to the five-number summary before plotting — this template doesn't compute quartiles.
When not to use: Do not use for raw points — use `viz.distribution-histogram` (single group) or `viz.compa-ratio-distribution` (per-level histograms). Do not use with n<10 per group — the quartiles are noise. Do not use without the 5-number summary computed upstream.
Renderer:
src/lib/visualizations/render/templates/box-whisker.tsxviz.bullet-bar
Bullet Bar
target-vs-actualcomparison-paircategorical-breakdownHorizontal bars with quantitative background bands, an actual-value bar, and a target marker. Compact target-vs-actual view per KPI row.
Input: Array<{ label: string; ranges: number[]; value: number; marker: number }>
No renderer wired.
When to use / when not to use
When to use: Use for KPI scorecards where each metric has a target + qualitative bands (e.g., poor/satisfactory/good). The marker (target) and value-bar render side by side so 'are we hitting it' reads at a glance. Stephen Few's bullet-chart shape; replaces gauge dials.
When not to use: Do not use without a target — degrade to a plain bar chart. Do not use when ranges don't share a unit. Do not use for time-series — promote to `viz.trend-with-ci-bands`.
Renderer:
src/lib/visualizations/render/templates/bullet-bar.tsxviz.sparkline-rows
Sparkline Rows
trendmatrix-gridcategorical-breakdownLabeled rows with individual sparklines for compact multi-metric overview. Each row shows a label, formatted current value, and trend mini-chart.
Input: { rows: Array<{ label: string; value: string; data: number[] }> }
No renderer wired.
When to use / when not to use
When to use: Use for compact dashboard summaries and watchlists: 5–20 metrics, each with its own trend. Reads more like a 'list' than a 'chart'; sibling of `viz.sparkline-grid` but optimized for narrower frames (one trend per row, formatted value as text).
When not to use: Do not use for single-metric deep dives — promote to `viz.trend-with-ci-bands`. Do not use for very dense scoreboards (30+ rows) — use `viz.sparkline-grid` with table layout. Do not use when values aren't pre-formatted strings.
Renderer:
src/lib/visualizations/render/templates/sparkline-rows.tsxviz.range-target-bullet
Range Target Bullet
compensationtarget-vs-actualcomparison-pairHorizontal pay band with gradient track, triangular target cue, and a vertical bullet for observed pay — compact comp-strip diagnostic.
Input: { rows: Array<{ label: string; floor: number; target: number; ceiling: number; current: number }>; formatValue?: (n: number) => string }
IC3 Engineer
now $126K · tgt $130K
IC4 Engineer
now $160K · tgt $152K
When to use / when not to use
When to use: Show where an employee or cohort lands inside an explicit dollar floor/target/ceiling trio on one scale per row.
When not to use: When you lack explicit numeric band edges — degrade to percentile callout instead.
Renderer:
src/lib/visualizations/templates/RangeTargetBullet.tsxviz.range-dot-plot
Range Dot Plot
compensationdistributionPer-role horizontal band shading with jitter-free dot markers showing each employee observation on a shared monetary axis.
Input: { bands: Array<{ label: string; min: number; max: number }>; dots: Array<{ id: string; label: string; value: number }> }
IC2
IC3
When to use / when not to use
When to use: Compare employee placement inside multiple pay bands simultaneously while keeping outliers visible.
When not to use: When you only have aggregates — reuse `viz.box-whisker` histogram instead.
Renderer:
src/lib/visualizations/templates/RangeDotPlot.tsxviz.range-strip-aligned
Range Strip Aligned By Midpoint
compensationcomparison-pairEach row aligns its midpoint vertically so overlaps and skew versus policy targets read quickly across roles.
Input: { rows: Array<{ label: string; midpoint: number; halfWidth: number }>; formatTick?: (n: number) => string }
Junior PM$120KSenior PM$150KStaff PM$178KWhen to use / when not to use
When to use: Structural compensation comparisons emphasizing midpoint alignment versus absolute dollar spread.
When not to use: Situations needing shared absolute min/max anchors — reuse `viz.range-strip`.
Renderer:
src/lib/visualizations/templates/RangeStripAligned.tsxviz.interactive-range-strip
Interactive Range Strip
compensationdistributionScatter rendition of dots per labeled band with Recharts Tooltip for employee-level hovering.
Input: { bands: Array<{ label: string; min: number; max: number }>; dots: Array<{ id: string; band: string; value: number }> }
When to use / when not to use
When to use: Operator desktops where hovered employee detail complements static range charts.
When not to use: SSR-only thumbnails without hydration — PNG render path unsupported today.
Renderer:
src/lib/visualizations/templates/InteractiveRangeStrip.tsxviz.multi-line
Multi-Line Forecast Compare
forecasttrendlongitudinalOverlaid monotone lines keyed by categorical series with shared categorical x-axis ticks.
Input: { data: Record<string,string|number>[]; categoryKey: string; seriesKeys: string[]; yLabel?: string }
When to use / when not to use
When to use: When two or more related metrics evolve over identical calendar periods.
When not to use: When envelopes include CI overlays — reuse `viz.trend-with-ci-bands` or `viz.confidence-band`.
Renderer:
src/lib/visualizations/templates/MultiLine.tsxviz.slope-comparison
Slope Comparison
comparison-pairtrendPer-item delta bars from start-vs-end checkpoints with proportional percent deltas labeled.
Input: { items: Array<{ label: string; start: number; end: number }>; valueLabel?: string }
When to use / when not to use
When to use: Headline comparisons of KPI directionality between two audited periods.
When not to use: Fine-grained chronological noise — reuse line trends instead.
Renderer:
src/lib/visualizations/templates/SlopeComparison.tsxviz.bump
Bump Chart
cohort-comparisonmatrix-gridLine chart encoding ordinal ranks per entity across ordered periods.
Input: { periods: string[]; ranksByEntity: Record<string, number[]> /* rank positions 1=best aligned to periods */ }
When to use / when not to use
When to use: Demonstrate leaderboard churn for a handful of named entities.
When not to use: When raw magnitudes matter more than ordinal ordering.
Renderer:
src/lib/visualizations/templates/Bump.tsxviz.bubble-scatter
Bubble Scatter
distributionTwo-dimensional quantitative scatter scaled by bubble size for a third latent dimension.
Input: { points: Array<{ id?: string; label?: string; x: number; y: number; z: number }>; xLabel?: string; yLabel?: string }
When to use / when not to use
When to use: Correlation storytelling with tertiary emphasis via diameter (e.g., headcount-adjusted outliers).
When not to use: When z-dimension unreliable — degrade to planar scatter equivalents.
Renderer:
src/lib/visualizations/templates/BubbleScatter.tsxviz.heatmap
Categorical Heatmap
matrix-gridcategorical-breakdownRow/column lattice with continuous encodings derived from pairwise categorical intersections.
Input: { rows: string[]; cols: string[]; cells: Array<{ row: string; col: string; value: number }>; valueSuffix?: string }
FemaleMaleNon-binaryPrefer notEngineering0.941.060.880.75Sales1.120.981.041.09G&A1.031.080.910.87When to use / when not to use
When to use: Intersectional breakdowns across two nominal dimensions.
When not to use: Temporal ordering priorities — transpose to longitudinal strip instead.
Renderer:
src/lib/visualizations/templates/VizHeatmap.tsxviz.strip-dot
Strip Dot Beeswarm Sketch
distributionSingle-axis jittered scatter approximating bee-swarm readability without force simulation.
Input: { points: Array<{ id?: string; value: number; lane?: number }>; lanes?: number; stripLabel?: string }
Compa-ratio sample (pseudo beeswarm jitter)
When to use / when not to use
When to use: Showing raw observations per metric where density matters more than quartiles.
When not to use: When strict statistical jitter is mandated — escalate to analytic pipeline.
Renderer:
src/lib/visualizations/templates/StripDot.tsxviz.stacked-area
Stacked Area Composition
compositionlongitudinalLayered monotone areas conveying cumulative composition across ordered periods.
Input: { periods: string[]; series: Record<string /* category */, number[]> /* aligned arrays */ }
When to use / when not to use
When to use: Demonstrate mixes (cost components, HC mix) accumulating over FY slices.
When not to use: Additive constraint violated (negative contributors) unless pre-normalized upstream.
Renderer:
src/lib/visualizations/templates/StackedArea.tsxviz.waffle-bar
Waffle Bar Tiles
compositioncategorical-breakdownMultiple horizontal waffle strips whose block counts summarize percentage shares.
Input: { buckets: Array<{ label: string; value: number; color?: string }>; cols?: number }
IC46.0%M28.0%Dir+18.0%Support8.0%When to use / when not to use
When to use: Audience-friendly composition tiles when donut charts feel too sugary.
When not to use: >8 buckets — degrade to stacked bar percentages.
Renderer:
src/lib/visualizations/templates/WaffleBar.tsxviz.waffle-percent
Waffle Percent
percentile-callout10×100 grid emphasizing a solitary percentage storyline.
Input: { percent: number; label?: string }
Offer acceptance · rolling 180d
64.3%
When to use / when not to use
When to use: Executive tiles that must telegraph attainment vs nominal 100 baseline.
When not to use: Fractional composites — use waffle-bar buckets instead.
Renderer:
src/lib/visualizations/templates/WafflePercent.tsxviz.alluvial
Alluvial Flow
compositionTwo-column chord-like flows between categorical cohorts annotated with Bézier ribbons sized by weights.
Input: { leftTitle?: string; rightTitle?: string; lanes: Array<{ from: string; to: string; weight: number }> }
When to use / when not to use
When to use: Transitions such as leveling mix before/after restructuring.
When not to use: Ultra-dense pairwise exchanges — escalate to analytic tables.
Renderer:
src/lib/visualizations/templates/AlluvialFlow.tsxviz.dendrogram
Dendrogram List
matrix-gridIndented tree layout approximating dendrogram readability without D3 clustering.
Input: { root: { id: string; label: string; children?: same[] } }
Org / taxonomy tree · MVP indented layout (not-force layout)
root: CEOnode: Engnode: Platformnode: Paymentsnode: Productnode: Revenuenode: SMBnode: EnterpriseWhen to use / when not to use
When to use: Executive drill-down previews of hierarchies.
When not to use: Large balanced trees (>50 nodes interactive) needing force layout fidelity.
Renderer:
src/lib/visualizations/templates/DendrogramTree.tsxviz.radial-bar
Radial Bar
matrix-gridPolar bar wedges comparing ordinal KPI readiness scores normalized to common radial domain.
Input: { rows: Array<{ category: string; value: number; fill?: string }> }
When to use / when not to use
When to use: Circular scoreboards with ≤8 spokes.
When not to use: Temporal analysis — radial layout loses chronology fidelity.
Renderer:
src/lib/visualizations/templates/RadialBarViz.tsxviz.tile-cartogram
Tile Cartogram Sketch
categorical-breakdownSquare-tile schematic map keyed by abbreviated regions with choropleth fill.
Input: { tiles: Array<{ id: string; value: number }> }
When to use / when not to use
When to use: Rough geographic variance without projecting GeoJSON payloads.
When not to use: District-level precision mandates — escalate to Vega/D3 choropleths.
Renderer:
src/lib/visualizations/templates/TileCartogram.tsxviz.timeline-milestone
Timeline Milestone
longitudinalHorizontal axis with tonal milestone markers keyed by fractional completion positions.
Input: { milestones: Array<{ id?: string; label: string; t: number; tone?: "neutral"|"warn"|"critical" }> }
When to use / when not to use
When to use: Compliance or launch programs tracking ordered gate reviews.
When not to use: When timelines need duration-length segments — escalate to gantts.
Renderer:
src/lib/visualizations/templates/TimelineMilestone.tsxviz.control
Control Chart
trendShewhart-inspired line run with annotated median/UCL/LCL reference rails.
Input: { data: Array<{ index:number; value:number }>; median: number; ucl: number; lcl: number; yLabel?: string }
When to use / when not to use
When to use: Operational metrics where breaches beyond control rails matter.
When not to use: Insufficient samples for meaningful control limits (<20 obs).
Renderer:
src/lib/visualizations/templates/ControlChart.tsx