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.

  1. viz.index-meter

    Index Meter (decomposable 0–100)

    percentile-calloutcompositioncategorical-breakdown

    A 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.tsx

  2. viz.forest-plot

    Forest Plot (dot + interval)

    estimate-intervalcomparison-pairdistribution

    Sorted 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.tsx

  3. viz.waterfall

    Waterfall (bridge)

    flow-bridgecategorical-breakdown

    Bridge 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.tsx

  4. viz.slopegraph

    Slopegraph (before / after)

    before-aftertrendcomparison-pair

    Two-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.tsx

  5. viz.trend-with-ci-bands

    Trend with CI Bands

    trendlongitudinal

    Line 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.tsx

  6. viz.small-multiples-by-segment

    Small Multiples by Segment

    cohort-comparisonlongitudinaltrend

    Responsive 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.tsx

  7. viz.cohort-survival-curve

    Cohort Survival Curve

    survivallongitudinalcohort-comparison

    Kaplan-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 tenure
    When 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.tsx

  8. viz.funnel-stage-conversion

    Funnel Stage Conversion

    funnel-conversioncategorical-breakdown

    Horizontal 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.tsx

  9. viz.compa-ratio-distribution

    Compa-Ratio Distribution by Level

    distributioncomparison-paircohort-comparison

    Per-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.tsx

  10. viz.sparkline-grid

    Sparkline Grid

    trendmatrix-grid

    Dense 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[] }>

    MetricTrendLatestΔ vs first
    Voluntary turnover0.11+0.03
    Time to fill (days)36.98-3.92
    Engagement score4.06+0.29
    Span of control7.58+0.30
    Promotion velocity0.13+0.02
    Internal mobility0.09+0.03
    Regrettable attrition0.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.tsx

  11. viz.kt-grid

    Kepner-Tregoe Decision Grid

    matrix-grid

    Decision 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[] }

    CriterionWeightBuy vendor XBuy vendor YBuild in-house
    Cost to implement0.258.06.54.0
    Time to value0.207.57.05.5
    Org disruption0.156.05.58.0
    Methodology rigor0.206.57.59.0
    Adoption likelihood0.207.57.05.0
    Weighted total7.206.756.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.tsx

  12. viz.distribution-histogram

    Distribution Histogram

    distribution

    Single-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.tsx

  13. viz.comparison-pair

    Comparison Pair

    comparison-paircohort-comparison

    Side-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.tsx

  14. viz.percentile-callout

    Percentile Callout

    percentile-callout

    Single-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%)

    p0Percentilep100

    You 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.tsx

  15. viz.range-strip

    Range Strip

    compensationcomparison-paircategorical-breakdown

    Discrete-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.tsx

  16. viz.confidence-band

    Confidence Band

    forecasttrendlongitudinal

    Line 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.tsx

  17. viz.box-whisker

    Box & Whisker

    distributioncohort-comparison

    Per-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.tsx

  18. viz.bullet-bar

    Bullet Bar

    target-vs-actualcomparison-paircategorical-breakdown

    Horizontal 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.tsx

  19. viz.sparkline-rows

    Sparkline Rows

    trendmatrix-gridcategorical-breakdown

    Labeled 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.tsx

  20. viz.range-target-bullet

    Range Target Bullet

    compensationtarget-vs-actualcomparison-pair

    Horizontal 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 }

    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.tsx

  21. viz.range-dot-plot

    Range Dot Plot

    compensationdistribution

    Per-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 }> }

    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.tsx

  22. viz.range-strip-aligned

    Range Strip Aligned By Midpoint

    compensationcomparison-pair

    Each 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 }

    When 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.tsx

  23. viz.interactive-range-strip

    Interactive Range Strip

    compensationdistribution

    Scatter 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.tsx

  24. viz.multi-line

    Multi-Line Forecast Compare

    forecasttrendlongitudinal

    Overlaid 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.tsx

  25. viz.slope-comparison

    Slope Comparison

    comparison-pairtrend

    Per-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.tsx

  26. viz.bump

    Bump Chart

    cohort-comparisonmatrix-grid

    Line 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.tsx

  27. viz.bubble-scatter

    Bubble Scatter

    distribution

    Two-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.tsx

  28. viz.heatmap

    Categorical Heatmap

    matrix-gridcategorical-breakdown

    Row/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 }

    When 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.tsx

  29. viz.strip-dot

    Strip Dot Beeswarm Sketch

    distribution

    Single-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.tsx

  30. viz.stacked-area

    Stacked Area Composition

    compositionlongitudinal

    Layered 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.tsx

  31. viz.waffle-bar

    Waffle Bar Tiles

    compositioncategorical-breakdown

    Multiple horizontal waffle strips whose block counts summarize percentage shares.

    Input: { buckets: Array<{ label: string; value: number; color?: string }>; cols?: number }

    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.tsx

  32. viz.waffle-percent

    Waffle Percent

    percentile-callout

    10×100 grid emphasizing a solitary percentage storyline.

    Input: { percent: number; label?: string }

    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.tsx

  33. viz.alluvial

    Alluvial Flow

    composition

    Two-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 }> }

    BeforeAfterICMUnfilledICM
    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.tsx

  34. viz.dendrogram

    Dendrogram List

    matrix-grid

    Indented tree layout approximating dendrogram readability without D3 clustering.

    Input: { root: { id: string; label: string; children?: same[] } }

    When 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.tsx

  35. viz.radial-bar

    Radial Bar

    matrix-grid

    Polar 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.tsx

  36. viz.tile-cartogram

    Tile Cartogram Sketch

    categorical-breakdown

    Square-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.tsx

  37. viz.timeline-milestone

    Timeline Milestone

    longitudinal

    Horizontal axis with tonal milestone markers keyed by fractional completion positions.

    Input: { milestones: Array<{ id?: string; label: string; t: number; tone?: "neutral"|"warn"|"critical" }> }

    Policy draftedLegal reviewUnion consultPayroll QAGo-live
    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.tsx

  38. viz.control

    Control Chart

    trend

    Shewhart-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