Triumph Brand · Dashboards Mode

Designed
for the screen.

The Triumph design system, recalibrated for long-session dashboards. Same green. Same identity. Calmed slate canvas, Inter doing the work Fabiola was never built for, dashboard-tight spacing, restrained chroma.

Audience
Staff & ops tools
Default mode
Dark (light opt-in)
02 — DIAGNOSIS

Why the old system looked bad on dashboards

The strict Triumph kit was built for sponsor decks, programs, posters, kits. Those carry well at distance with high saturation and big display type. Drag the same tokens onto a 27" monitor at desk distance for six hours and they fight the data. Four specific failures, four targeted fixes in this system.

01 / SURFACES

Two saturated navies stacked

Page #020022 + surface #002855, both saturated navy. No neutral, no hierarchy. Cards floated as the decorated panel, not as content lifted out of a calm canvas. Fix: chroma-0.013 slate canvas with four lift-steps.

02 / TYPOGRAPHY

Fabiola on every heading

Fabiola Capitals is a single-weight display face designed for poster sizes. On a dashboard h3 at 22px it cramps, all-caps strokes turn heavy, and it competes with the data. Fix: Fabiola reserved for the page hero, Inter for h2 through h4.

03 / CHROMA

Four max-saturation brand colors on black

Navy 0.13, green 0.18, sky 0.13, lime 0.20, all stacked on a near-black bg with no neutral. The brand green at full saturation is correct, the canvas behind it is what made it scream. Fix: keep Triumph green at exact brand chroma (0.182, #61a631), sit it on a calm slate canvas. Brand-accurate, dashboard-comfortable.

04 / SPACING

Section padding sized for posters

Section padding maxed at 4.25rem read like museum gallery walls. A dashboard with twenty widgets feels disassembled. Fix: section padding tops out at 6rem at widest viewport, interior rhythm tightened to the design.seantippen scale.

03 — COLOR

Color

Soft slate canvas with a 0.013-chroma whisper of navy hue. Triumph green at the exact Brandpad value (#61a631) so anything that needs to read as on-brand for a customer does. Greenville Blue family for the secondary, lightened to read on dark. A four-color decorative rotation. All values in OKLCH so light mode is a clean inversion, not a separate palette.

Surfaces
BG
SURFACE
HOVER
RAISED
OVERLAY
Decorative palette

Per global rule, decorative accents rotate through green, royal blue, coral, and soft purple. Yellow and lime are status-only.

--color-accent
Triumph green · #61a631
--color-secondary
Greenville-blue family
--color-tertiary
Coral
--color-quaternary
Soft purple
Status
Success Warning Danger Info Accent
Brand reference palette

The canonical Brandpad values stay available as --brand-* for logo lockups and brand strips. They are not used as chrome.

--brand-greenville-blue
#002855 · PMS 295 C
--brand-triumph-green
#61a631 · PMS 369 C
--brand-upstate-fog
#f2fafa
--brand-deep-night
#020022
04 — TYPOGRAPHY

Typography

The single biggest fix versus the strict brand. Fabiola Capitals lives on the page hero. Inter does the rest. The discipline is brutal and not optional. Fabiola at 22px on a dashboard h3 is the source of half the ugliness in this codebase.

Hero (Fabiola — use once per page)
.h-display font-family: --font-display
weight: 400
letter-spacing: -0.01em
text-transform: uppercase
Greenville
Headings (Inter, all of them)
h1 Inter / 800 / -0.02em
var(--text-3xl)

2026 ticket revenue

h2 Inter / 600 / -0.015em
var(--text-2xl)

Match day performance

h3 Inter / 600 / -0.010em
var(--text-xl)

Season ticket holders by section

h4 Inter / 600 / -0.005em
var(--text-lg)

Recent transactions

Body and data
p Inter / 400
var(--text-base)
color: secondary

Body copy uses Inter at the base size with relaxed leading. Comfortable at desk distance for hours. The grayish-blue secondary text reduces eye fatigue versus pure white on the slate canvas.

.mono JetBrains Mono / 500
tabular-nums
$847,221.50 · 2,341 tickets · +18.4%
.eyebrow JetBrains Mono / 700
uppercase / 0.18em tracking
SECTION LABEL
05 — SPACING

Spacing

Dashboard-tight rhythm. Fluid values that scale gracefully from laptop to widescreen without spreading thin.

--space-xs
4px — 8px
--space-sm
8px — 14px
--space-md
16px — 24px
--space-lg
24px — 40px
--space-xl
32px — 64px
--space-section
48px — 96px
06 — BUTTONS

Buttons

Solid for primary actions, outline for secondary, ghost for tertiary. Lift two pixels on hover, never scale.

07 — INPUTS

Inputs

Underline-only by default. Accent underline expands from the center on focus. Block inputs for forms where structure matters.

Underline
Block
08 — BADGES & PILLS

Badges and pills

Badges for status tags. Pills with leading dot for live state indicators.

Badges
Confirmed Pending Failed In review Featured
Pills
Last updated 2 min ago Updated 6 hours ago Stale · 3 days Live
Delta chips
+18.4% -2.1% 0.0% +243 -17
09 — CARDS & KPIs

Cards and KPIs

KPI markers use a left border that rotates through the four decorative accents. No card wrapper. The number is the hero, the chrome stays out of the way.

KPI grid
Season revenue
$847,221
+18.4% vs. 2025 final
Tickets sold
14,283
73% of season cap
STH renewals
91%
+4 pts vs. last season
Average ticket price
$31.42
All sections, weighted
Cards

Surface card

Default surface, 1px border, dashboard chrome.

Raised card

Lifted surface for emphasis, with shadow.

Interactive card

Hover lifts two pixels, tightens the border.

10 — TABLES

Tables

Bare structure. No card wrapper. Monospace tabular numerals so columns align. Row hover tints accent-subtle. Total row gets a thicker top border and lifted background.

Match Date Tickets Revenue Delta
Greenville Triumph vs. CharlotteMay 93,241$94,820+12.4%
Greenville Triumph vs. Tampa BayMay 162,887$81,114+8.1%
Greenville Triumph vs. AshevilleMay 303,612$108,930+21.7%
Greenville Triumph vs. CharlestonJun 62,194$58,490-4.2%
Total11,934$343,354+9.5%
11 — TABS & CONTROLS

Tabs and segmented controls

Tabs for view-level navigation. Segmented for time ranges or mode switches. Both underline-active, both keyboard-navigable.

Tabs
Overview
Season
Match day
Season ticket holders
Method of payment
Segmented
Progress
Season cap progress 73%
12 — CHART

Chart preview

Chart.js 4.4.7. Series colors via tok('--green'), tok('--blue'), etc. Hex literals only, because the Canvas API cannot resolve CSS custom properties.

13 — DO NOT

Don't do this

Anti-patterns from the strict brand that landed on dashboards by mistake.

Fabiola on h2 / h3 / h4

Single-weight display face cramps at UI sizes. Inter does this job. Fabiola earns one appearance per page, on the hero.

Saturated navy as a surface

Triumph navy is a poster color. Sitting cards on it floods the field with chroma and kills hierarchy. Use the slate canvas instead.

Lime or yellow as decorative accent

Reserved for status UI only. Default decorative rotation is green, royal blue, coral, soft purple.

Gradient text or gradient backgrounds

Flat surface plus optional noise grain. Small decorative gradients on a KPI top bar are fine. Radial blobs are banned.

transform: scale() on hover

Layout shifts cascade through grids. Lift two pixels and increase shadow.

Hardcoded hex in CSS

Reach for the token. The Chart.js exception is the only exception, because Canvas does not resolve CSS variables.

14 — USAGE

Usage

Link the token sheet and the components sheet in the head of every Triumph dashboard. Single-file dashboards also pull Inter and JetBrains Mono from Google Fonts directly. Fabiola loads from this domain via @font-face already declared in tokens.css.

Drop into <head>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300..900&family=JetBrains+Mono:wght@500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://dashboards.greenvilletriumph.club/tokens.css">
<link rel="stylesheet" href="https://dashboards.greenvilletriumph.club/components.css">
Reference a token
/* CSS */
.card {
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  padding: var(--space-md);
}

// Chart.js — hex literal because Canvas cannot read CSS vars
const tok = (k) => getComputedStyle(document.documentElement).getPropertyValue(k).trim();
chart.data.datasets[0].borderColor = tok('--green');
File map
URLPurpose
tokens.cssCSS custom properties: colors, type, spacing, motion
components.cssComponent patterns: buttons, badges, tables, KPIs, tabs, toasts
/fonts/Fabiola-Capitals.otfFabiola Capitals OTF (served from design.greenvilletriumph.club, CORS open)