Bloomberg-y "terminal grid" KPI panel — mono numbers, status tags, sparklines, ▲▼ deltas. The header strip is a tab control: each tab swaps in a separate pane with its own tile set and grid layout (different tile counts allowed). Hover any tile for the detail breakdown.

Key Performance Indicators

LIVE
KPI.01 · 30d WARN
Completion Rate
88.6 %
prev 84.2% ▲ 5.2%
KPI.02 · 12mo GOOD
Monthly Revenue
$ 835 K
prev $752K ▲ 11.0%
KPI.03 · 24h GOOD
Server Temp
22.9 °C
prev 24.5°C ▼ 6.5%
KPI.04 · 7d WARN
Server Capacity
81.6 %
prev 71.0% ▲ 14.9%
KPI.05 · 24h GOOD
Error Rate
0.24 %
prev 0.41% ▼ 41.0%
KPI.06 · 12mo NEUTRAL
Tokyo Office
¥ 11.6 M
prev ¥11.2M ▲ 3.5%
KPI.02 · 12mo GOOD
Monthly Revenue
$ 835 K
prev $752K ▲ 11.0%
KPI.06 · 12mo NEUTRAL
Tokyo Office
¥ 11.6 M
prev ¥11.2M ▲ 3.5%
KPI.01 · 30d WARN
Completion Rate
88.6 %
prev 84.2% ▲ 5.2%
KPI.03 · 24h GOOD
Server Temp
22.9 °C
prev 24.5°C ▼ 6.5%
KPI.04 · 7d WARN
Server Capacity
81.6 %
prev 71.0% ▲ 14.9%
KPI.05 · 24h GOOD
Error Rate
0.24 %
prev 0.41% ▼ 41.0%

1×3 · .pa-col-1-3 columns

Each tile in its own .pa-col-1-3 (33% page-grid column) as a standalone mini-card — no shared terminal-grid chrome, no tabs. Tests how a single tile renders at one-third of the viewport width, the typical "stat strip" placement.

KPI.01 · 30d WARN
Completion Rate
88.6 %
prev 84.2% ▲ 5.2%
KPI.02 · 12mo GOOD
Monthly Revenue
$ 835 K
prev $752K ▲ 11.0%
KPI.03 · 24h GOOD
Server Temp
22.9 °C
prev 24.5°C ▼ 6.5%

Asymmetric · .pa-col-25 + .pa-col-45 + .pa-col-30

Mixed-width page-grid: a narrow .pa-col-25 (25%), a mid .pa-col-45 (45%), and a .pa-col-30 (30%) all carrying standalone tiles. Surfaces how the typography + layout handles narrow vs wide cells in the same row.

KPI.01 · 30d WARN
Completion Rate
88.6 %
prev 84.2% ▲ 5.2%
KPI.02 · 12mo GOOD
Monthly Revenue
$ 835 K
prev $752K ▲ 11.0%
KPI.05 · 24h GOOD
Error Rate
0.24 %
prev 0.41% ▼ 41.0%

Custom chart library · Chart.js in the chart slot

The terminal sparkline is just a <svg class="pa-kpi-tile__spark"> — swap it for a <canvas class="pa-kpi-tile__spark" data-kpi-chart> and a real charting library renders into the same place, here a Chart.js bar chart so it's clearly not the default line sparkline. The pa-kpi-tile__spark class still carries the tile's sentiment color, so the bars read currentColor and track the sentiment scale + theme.

Key Performance Indicators

LIVE
KPI.01 · 30d WARN
Completion Rate
88.6 %
prev 84.2% ▲ 5.2%
KPI.02 · 24h GOOD
Error Rate
0.28 %
prev 0.42% ▼ 33.3%

Usage Guide

When to use

Bloomberg-style dense KPI panels: per-tile depth (id, status pill, label, focal value, prev row, sparkline) with an optional tab strip on top that swaps in a different pane (different tile set, different grid layout) per tab. Best for trading floor / NOC / operations dashboards where a single panel must carry several distinct views. If you want even-weight grids with less per-tile chrome, pick Sparkline list or Editorial minimal.

Tab strip (optional)

Each kpi_terminal/1 can hold one or more :pane slots, each carrying an id + label_text. The header auto-renders a tab strip; the PureAdminKpiTerminalTabs hook toggles .is-active on the clicked tab and matching pane. Panes are independent — different tile counts in this demo: OVERVIEW has 6, FINANCE has 2, OPERATIONS has 4.

Sections without tabs simply omit the :pane slots and place tiles as inner_block — the wrapper supplies a pa-kpi-terminal__grid--2col automatically. The 1×3 / asymmetric stress tests and the Chart.js demo do this.

Status pills (different axis from sentiment)

Three pill styles for tile-level status: WARN (filled orange — needs attention), GOOD (text-only — passing, no chrome by design), NEUTRAL (filled grey — informational).

The pill is on a different axis from the 5-step sentiment scale (very_positive / positive / neutral / negative / very_negative) used on value_variant and delta_variant. Sentiment is direction of change; the pill is action urgency. A tile can be very_negative numerically AND good pill-wise if the drop is on target.

is_standalone modifier

Tiles inside a kpi_terminal share grid-bookkeeping borders. A tile placed directly inside a .pa-col-* outside a grid needs is_standalone to draw its own full border + card-bg + bottom margin so it doesn't look orphaned.

Sparkline trailing dot

SVG preserveAspectRatio="none" stretches a <circle> into an oval, so the PureAdminKpiSparkDot hook converts each circle to an HTML <span> inside a .pa-kpi-spark-wrap on mount. The dot is sized in CSS pixels so it stays a true circle regardless of chart aspect ratio.

Hover detail popover

Cursor-anchored via Floating UI's computePosition + virtual reference element. Each tile's detail is appended to <body> on init to escape ancestor overflow: hidden. Set detail_title_text (plus any combination of previous_value_text / delta_absolute_text / target_text) and the popover body is auto-built; pass a :detail slot for fully-custom markup.


CSS Classes Reference

Card structure

  • pa-kpi-terminal — page-namespace class on .pa-card. Scopes the tab/pane DOM contract.
  • pa-kpi-header — flex header with title + controls + LIVE indicator.
  • pa-kpi-terminal__controls — controls group (tabs + LIVE side by side).
  • pa-kpi-live / pa-kpi-live__dot — LIVE pill + animated dot.
  • pa-kpi-terminal__body — card body with internal padding.
  • pa-kpi-terminal__grid — internal tile grid.
  • pa-kpi-terminal__grid--2col — 2-col layout modifier (canonical dense grid).

Tab strip

  • pa-kpi-terminal__tabs — segmented tab container (role="tablist").
  • pa-kpi-terminal__tab — tab button. data-tab="slug" matches a pane; add is-active for the selected one.
  • pa-kpi-terminal__pane — pane container. data-tab="slug" matches a tab; add is-active for the visible one.

Tile structure

  • pa-kpi-tile — single tile.
  • pa-kpi-tile--standalone — for tiles directly in a .pa-col-* outside a grid.
  • pa-kpi-tile--up-strong / --up / --flat / --down / --down-strong — sparkline-direction sentiment.

Tile head

  • pa-kpi-tile__head — top row (id + status pill).
  • pa-kpi-tile__id — tile id (e.g. "KPI.01").
  • pa-kpi-tile__status + --warn / --good / --neutral.
  • pa-kpi-tile__label — uppercase mono caption below the head.

Tile value

  • pa-kpi-tile__values — wrapper.
  • pa-kpi-tile__value — focal value element.
  • pa-kpi-tile__num / pa-kpi-tile__unit — numeric + unit spans.
  • pa-kpi-tile__value--very-positive / --positive / --neutral / --negative / --very-negative — coloured-number sentiment.

Prev row + delta

  • pa-kpi-tile__prev — previous-period row.
  • pa-kpi-tile__delta--very-positive / --positive / --neutral / --negative / --very-negative — delta sentiment.

Sparkline

  • pa-kpi-tile__spark — chart SVG (or <canvas data-kpi-chart> for library-rendered charts).
  • pa-kpi-spark-wrap — JS-inserted wrapper around the SVG.
  • pa-kpi-spark-dot — HTML span replacing the SVG circle.

Hover detail popover

  • pa-kpi-detail — popover root (moved to <body> on init).
  • pa-kpi-detail__title — uppercase mono header.
  • pa-kpi-detail .pos / .neg / .warn — sentiment-coloured <dd> text.

Framework tokens used by this showcase

  • --pa-very-positive / --pa-positive / --pa-neutral / --pa-negative / --pa-very-negative — 5-step sentiment.
  • --pa-warning — orange "off-target / approaching limit" signal.
  • --pa-detail-bg / -text / -row-label / -title / -shadow — popover chrome.

John Doe

Administrator

Settings

Sidebar
Display
Profile Panel
Body text size. All elements scale proportionally.