Analytics
A complete charting system for adoption analytics, reporting dashboards, and admin data views. All charts use the six-color brand palette, DM Sans typography, and consistent grid/axis styling. Charts are built with inline SVG for maximum portability.
KPI Strip — Stat Cards Component
The primary unit for surfacing metrics at the top of any dashboard or report page. Each card shows a single number, a label, and an optional delta indicator.
--radius-card, --border-default · Label=10px 500 uppercase 1px tracking #aaa · Value=28px DM Sans 400 --color-alpine · Delta up=--color-uinta · Delta down=--color-canyonlands · Neutral=#aaa · Use --color-arches on the value itself when the number is a warning metric.
Vertical Bar Chart Component
Used for comparing discrete categories or time-series values. Bar fill uses --chart-1 (Alpine) by default; a second series uses --chart-2 (Wasatch).
--chart-1 · Corner radius=3px · Value label: 11px DM Sans 500, Alpine, 4px above bar · Axis labels: 10px #aaa · Grid: dashed 4/3 --chart-grid · Axis line: --chart-axis · Reference line: --color-arches dashed · viewBox aspect: 640×240Grouped Bar Chart Component
Two series side-by-side per category. Use for period-over-period comparisons. First series=--chart-1, second=--chart-2.
Stacked Bar Chart Component
Shows part-to-whole relationships within each category. Up to 4 segments per bar using --chart-1 through --chart-4.
--chart-2 / --chart-4 / --color-canyonlandsHorizontal Bar Chart Component
Best for ranked lists with long category labels. Bars grow left to right; track uses --chart-grid as background.
--chart-4 (Uinta green) for high performers ≥80%, --chart-1 (Alpine) for mid range, --color-arches for at-risk rows below thresholdLine Chart Component
Time-series trends. Up to 3 lines using --chart-1, --chart-2, --chart-3. Dots on data points. Area fill is the series color at 8% opacity.
Data Detail Table Component
The primary structure for drilling into row-level data. Extends the base table with numeric alignment, trend indicators, inline mini-bars, and status chips. Sortable headers use Alpine on hover.
.chart-card with padding:0 — title/subtitle sit in a 20px 24px padded header above the table · Table border-top separates header from rows · Table bg=white (set on .data-table-wrap) · Column headers: 10px 500 uppercase 1.2px tracking #888 · Header row bg=--color-salt · Body cells: 13px DM Sans body · Numeric cells: right-aligned, tabular-nums · Trend up=--color-uinta · Trend down=--color-canyonlands · Progress bar: 100px, system progress tokens · Footer: Salt bg, 12px #888, pagination controlsDonut / Proportion Chart Component
For part-to-whole proportions with ≤5 segments. Center shows the primary metric. Legend on the right with exact values.
stroke-dasharray + stroke-dashoffset · Rotation offset=-90° for 12 o'clock start · Center: 18px 500 metric value + 9px label · Donut width 120px · Legend right-aligned, bold 12px valueChart Color Palette & Usage Rules
--chart-3) sits between Alpine (--chart-1) and Uinta (--chart-5) in the numbered sequence — they are never adjacent. If a 2-series chart would pair Alpine and Uinta directly, substitute Timpanogos for one of them. Use --color-canyonlands only for error/critical data (never as a chart series color). Use --color-arches for warning thresholds. Never use BSI Yellow as a chart fill — invisible on Salt (1.09:1). Axis lines: --chart-axis rgba(0,0,0,.12) · Grid lines: --chart-grid rgba(0,0,0,.06) dashed · Labels: 10px #aaa · All chart cards: white bg, --radius-card, --border-default, 20px×24px padding.
Top Assets by Starts Component
Compact ranked list of the top N assets by a primary metric. Each row is a filled pill bar — the asset name sits inside the fill, the count floats to the right of the track. A different series color per row helps fast visual scanning without needing a legend. Use in dashboard summary panels.
--text-primary) + count (12px 500 tabular-nums) on top row · Bar (12px height, --radius-pill) full-width below · Track bg=rgba(Alpine,.07) · Series colors in order per row (chart-1→2→3→4) · Footer: count label left (#888) + Wasatch ghost link right (padding:0) · Works for any asset type by swapping the subtitle and iconTrending Assets List Component
A scannable list of recently high-momentum content. Each row shows asset type icon, asset name, and a right-aligned completion rate badge color-coded to performance tier. No bars — the badge alone communicates quality. "View more" links to the full report. Use in sidebar widgets and dashboard summary cards.
var(--space-3) top+bottom · Asset icon: 32px rounded square, --agent-bg fill, Alpine icon · Title: 13px DM Sans 500, truncated · Trend icon (between title and badge): fa-arrow-trend-up = Uinta green (momentum increasing) · fa-minus = --text-muted (stable, conflicting signals, or insufficient data) · fa-arrow-trend-down = Canyonlands red (momentum declining) · 13px for directional arrows, 11px for minus · Completion badge right-aligned pill: ≥80% = Uinta · 60–79% = Arches · <60% = Canyonlands · Trend icon color is independent of badge color — an asset can be trending up while still in the Arches range (improving from worse), or trending down while still Uinta (declining from high) · "View more" = Wasatch ghost linkVariant — Trending Survey Questions
Survey question variant of the Trending List. Each row carries two information layers: the question text and a sub-row with survey frequency, sentiment direction, and response volume direction. The right-aligned trend icon synthesises both signals into a single overall momentum read — the same icon language as the asset variant. Includes a time-range filter in the card header.
--border-default pipe dividers · Inline direction indicators: fa-arrow-up = Uinta (--color-uinta) · fa-arrow-down = Canyonlands (--color-canyonlands) · fa-minus = muted · Overall right-edge trend icons use the same palette colors for visual consistency · Right-aligned overall trend icon synthesises both signals: both up = fa-arrow-trend-up Uinta · both down = fa-arrow-trend-down Canyonlands · conflicting = fa-minus muted · Overall trend icon: 16px (vs 13px in asset variant) to compensate for no icon square · Time period baked into chart title ("Last 30 Days") rather than a filter control · Row padding: var(--space-4) top+bottom (vs var(--space-3) in asset variant — more breathing room for the two-line row)
Assets Needing Attention Component
Surfaces underperforming or at-risk content with clear severity tiering. Each row shows a title with colored diagnostic subtext (starts + completion rate) and a slim action button on the right. Two severity levels: Warning (Arches) for moderate risk, Critical (Canyonlands) for severe. Rows are separated by a simple gray rule — no background containers — keeping the list light and scannable.
display:flex;align-items:center;justify-content:space-between · Row padding: var(--space-4) 0 · Row separator: border-bottom:1px solid var(--border-default) (last row has no bottom border) · Title: 13px DM Sans 500, --text-primary · Subtext: 12px DM Sans 500, severity color (Warning=--color-arches, Critical=--color-canyonlands) · Action button: filled severity color, white text, --radius-pill, 11px 500, padding:4px 12px · Header count pill: severity text + 10% opacity bg · Use buildAttentionList() via .bsn-attention-list-mount — never hardcode.Usage — Reusable Component
NEVER hardcode Assets Needing Attention HTML. Use the mount point — buildAttentionList() renders the component on DOMContentLoaded.
<div class="bsn-attention-list-mount" data-bsn-attention-list='{
"title": "Videos Needing Attention",
"subtitle": "High starts but low completion — review content",
"badge": "2 critical · 1 warning",
"badgeSeverity": "critical",
"items": [
{"label":"Advanced Pivot Tables", "meta":"1,247 starts · 23% completion", "severity":"warning", "action":"Review"},
{"label":"PowerPoint Animations Deep Dive","meta":"892 starts · 31% completion", "severity":"warning", "action":"Review"},
{"label":"SharePoint Site Architecture", "meta":"756 starts · 18% completion", "severity":"critical", "action":"Review"}
]
}'></div>
| Property | Type | Required | Description |
|---|---|---|---|
title | string | yes | Chart-card title (chart-title class). |
subtitle | string | no | Chart-card subtitle (chart-subtitle class). |
badge | string | no | Severity summary shown in the header (e.g. "2 critical · 1 warning"). |
badgeSeverity | string | no | "warning" or "critical". Controls badge text color and background. Default "critical". |
items | array | yes | Array of row objects. Each has label, meta, severity, action. |
items[].label | string | yes | Asset or content name. Rendered at 13px, DM Sans 500, --text-primary. |
items[].meta | string | yes | Diagnostic subtext shown in severity color (e.g. "1,247 starts · 23% completion"). |
items[].severity | string | yes | "warning" → Arches · "critical" → Canyonlands. Controls subtext color and button fill. |
items[].action | string | no | Button label. Default "Review". |
class | string | no | Extra CSS classes on the outer .chart-card wrapper. |
Emerging Trends Component
Week-over-week performance shifts surfaced by BrainStorm AI. Each metric shows the comparison period, a large delta value with direction icon, and an optional count of assets driving the trend. Positive momentum uses Uinta green; negative uses Canyonlands. A "Surging assets" count shows how many assets are driving the trend. Use in summary dashboards and AI insight reports.
fa-arrow-up/fa-arrow-down, same color as delta · Count value (asset tallies): 32px DM Sans 400, Wasatch blue (neutral informational) · Row divider: --border-default · Footer link: Wasatch ghost · Up to 3–4 metrics per card before scrollingBullet Chart — Industry Benchmark Component
The recommended chart type for benchmarking an organization's metric against reference values (industry average, top performers, target). Three information layers read left-to-right: qualitative range bands in the background show performance zones, a primary measure bar shows the organization's current value, and a thin comparative marker shows the target or benchmark. Cleaner and more information-dense than side-by-side bar charts for this use case.
--chart-grid · X axis = --chart-axis · Zone labels: 8–9px #aaa below axis · All text: DM Sans
Top Themes Across Surveys Component
Top Themes Across Surveys is an AI-generated synthesis of recurring patterns found across all survey responses — not a single survey, question, or moment in time. It answers the question: "What are users consistently telling us across many surveys?" This is not a sentiment score and not a count of responses. It's a pattern-detection layer built on top of raw survey data, designed to surface recurring signals and directional themes while avoiding over-claiming statistical precision.
--text-body · Signal label: 11px 500 Alpine, min-width:100px right-aligned · Signal dots: 10px circles, 1.5px Alpine border, Alpine fill when active, 3px gap · Count: 13px 500 Alpine tabular-nums · Users icon: fa-solid fa-users 14px #ccc · Row hover: rgba(Alpine,.03) · Row divider: --border-default · Footer: --surface-subtle, Wasatch ghost link · Tooltip: white bg, --shadow-md, 11px, 180px wide, arrow pointing down to dot cluster
Sentiment Breakdown — Horizontal Bar Variant Component
A variant of the horizontal bar chart for displaying sentiment distribution. Uses the same row structure as the standard hbar — label column, pill track, right-aligned percentage value — with a face icon added at the far right as an at-a-glance emotional signal. The percentage and face icon share the same color as the bar fill.
hbar-value column, color-matched to the bar fill. No new CSS classes needed — uses .hbar-row, .hbar-track, .hbar-fill, .hbar-value unchanged.
--color-uinta (Uinta green) · Neutral = --color-arches (Arches copper) · Negative = --color-canyonlands (Canyonlands dark red). Bar fill, % value, and face stroke all share the same color token per row.
M8,14.5 Q12,18 16,14.5 (curves up) · Neutral mouth: line x1=8.5 x2=15.5 y=15.5 · Sad mouth: M8,17 Q12,13.5 16,17 (curves down). All faces: circle r=10, eye circles r=1.5, stroke-width 1.5px, fill=none on outer circle.
What Users Are Saying Component
A simple verbatim quote list surfacing representative user responses from surveys. No scores, no categorization — raw voice of the user. Pairs naturally with the Sentiment Breakdown chart and the Top Themes component to complete the "How Users Feel" cluster. Quotes use italic body text to signal verbatim content. Opening quotation marks are decorative and oversized to anchor the visual rhythm.
--text-body, line-height 1.6 · Row divider: --border-default · Row hover: rgba(Alpine,.03) · Footer: --surface-subtle · "View more" = Wasatch ghost link · No sentiment tagging or icons per row — this component intentionally presents unfiltered voice; tagging is handled by Sentiment Breakdown