tac-design-tokens

Load when authoring premium UI surfaces (landing hero, marketing sections, mission-control panels, KPI cards, dashboard headers) in tac-express. Provides the full Violet Grid (v5.0) token reference —

SKILL.md

GitHub

TAC Express — Design Tokens & Premium Composition (Violet Grid v5.0)

Use this skill when you need to reach for the right token instead of a raw value. It is the index to globals.css plus the playbook for premium feel: motion choreography, type rhythm, gradient text, and signal glow.

Single source of truth: packages/ui/src/styles/globals.css. If a token isn't listed here, check there.


Color Tokens

Surfaces (LAW 1 — never raw colors)

Class Light Dark Use
bg-background oklch(0.9940 0 0) oklch(0.2223 0.0060 271.14) Page canvas
bg-card oklch(1 0 0) oklch(0.2568 0.0076 274.65) Primary panel
bg-popover oklch(1 0 0) oklch(0.2568 0.0076 274.65) Floating surface
bg-surface oklch(0.9700 0.005 264.53) oklch(0.2837 0.0137 274.65) Mid-layer
bg-overlay oklch(1 0 0) oklch(0.2568 0.0076 274.65) Modal/sheet backdrop content
bg-muted oklch(0.9400 0.010 264.53) oklch(0.3003 0.0094 271.14) De-emphasized
bg-code-bg oklch(0.9556 0.0074 264.53) oklch(0.2223 0.0060 271.14) Code blocks

Text

Class Use
text-foreground Primary text
text-muted-foreground Secondary / dimmed
text-primary Violet brand color (links, key data)
text-primary-foreground On-violet fills (buttons, badges)
text-accent-{success,warning,danger,info} Status text

Borders & Rings

Class Use
border-border All structural framing (1px)
border-primary Hover/active accent (1px)
outline-ring Focus outline — sharp, no fuzz

Brand & Status

Token Light Dark Role
--primary oklch(0.5393 0.2713 286.7462) oklch(0.6132 0.2294 291.7437) Violet — CTAs, focus, primary signal
--accent-success oklch(0.60 0.18 150) same Delivered / paid / healthy
--accent-warning oklch(0.72 0.18 80) same In-transit / due-soon
--accent-danger oklch(0.5885 0.2090 24) oklch(0.6368 0.2078 25) Delayed / error
--accent-info violet (= primary) violet (= primary) Info signal

Charts — TAC Orbital telemetry tokens

The Orbital chart system (docs/CHARTS-ORBITAL.md) uses its own token namespace. Use these inside any @workspace/ui/components/charts/* primitive — never the old --chart-1..5 ramp (kept for backward compat only).

Token Use
--chart-primary Single saturated hue per chart
--chart-primary-muted Optional secondary series — never standalone
--chart-axis / --chart-grid / --chart-track Structural greys
--chart-ramp-1..5 Single-hue intensity ramp (heatmap / density only)
--chart-ontime / --chart-late / --chart-breached SLA STATE ONLY — never decorative

Hard rules: at most two hues per chart; ontime/late/breached reserved for SLA components; no donuts (use SegmentBar); no smooth curves (use stepAfter); percentage gauges use ProgressMeter, not donut rings.

Tailwind utilities: bg-chart-primary, text-chart-axis, border-chart-grid, fill-chart-ramp-3, stroke-chart-late, etc.

Chart-internal typography utilities

Class Purpose
tac-caption Mono 11px ALL-CAPS — chart frame headers
tac-tag Mono 10px ALL-CAPS — sub-labels, legend entries
tac-axis Mono 11px tabular — axis ticks
tac-readout tnum + lnum — KPI numeric values

Use these only inside chart primitives — they complement, do not replace, the t-display / t-h1..h4 / t-data / t-overline / t-mono premium type scale.


Typography

Font Families (LAW 4 — declared only in apps/*/app/layout.tsx)

Class Family Use
font-sans Plus Jakarta Sans UI text, headings, labels
font-mono IBM Plex Mono AWBs, IDs, weights, currency, timestamps
font-serif Lora Blockquotes, editorial / prose ONLY

Premium Type Scale (defined in globals.css @layer utilities)

Prefer these utilities over ad-hoc text-* classes on branded surfaces. They include kerning, ligatures, balanced text, and tabular nums.

Class Size Use
.t-display 3rem / 800 / -0.045em Hero displays
.t-h1 1.75rem / 700 / -0.035em Page titles
.t-h2 1.375rem / 700 / -0.030em Section heads
.t-h3 1.125rem / 600 / -0.022em Sub-section heads
.t-h4 0.9375rem / 600 / -0.016em Panel heads
.t-body 0.9375rem / 400 Reading text
.t-body-sm 0.8125rem / 400 Dense reading text
.t-caption 0.75rem / 400 / muted Captions
.t-overline 0.6875rem / 500 / +0.1em / uppercase Eyebrow labels
.t-data 2.5rem / 600 / mono / tabular-nums KPI displays
.t-data-sm 1.25rem / 500 / mono / tabular-nums Inline KPIs
.t-mono 0.8125rem / mono / tabular-nums Inline mono data
.t-mono-sm 0.6875rem / mono / tabular-nums Dense mono cells

Extra small text scales

  • text-3xs → 0.5625rem
  • text-2xs → 0.625rem

For mission-control field-key labels, prefer .tac-mono-label (uppercase mono caps in primary violet).


Geometry

Token Value
--radius 0rem (LAW 13 — sharp always)
--radius-sm/md/lg/xl all alias to var(--radius)
--spacing 0.25rem (Tailwind's base unit)
--tracking-normal -0.025em (body letter-spacing)

Shadows (Brutalist Offset Only — LAW 9)

All shadow-* utilities resolve to sharp offset shadows on var(--border):

Class Offset
shadow-2xs 1px 1px
shadow-xs 2px 2px
shadow-sm 3px 3px
shadow 4px 4px
shadow-md 6px 6px
shadow-lg 8px 8px
shadow-xl 12px 12px
shadow-2xl 16px 16px

Aliases (kept for backward compat): --shadow-brutal-sm = shadow-sm; --shadow-brutal = shadow-md.

Soft drop shadows do not exist in this system. If you reach for one, you're using the wrong token.


Motion Choreography (Premium Cadence)

Tokens

Token Value Use
--duration-fast 80ms Hover, focus, instant feedback
--duration-base 150ms Modal / sheet open, tab switch
--duration-slow 300ms Page-level enter, drawer slide
--duration-slower 500ms Hero entrance, marquee start
--ease-smooth cubic-bezier(0.4, 0, 0.2, 1) Default ease-in-out
--ease-spring cubic-bezier(0.34, 1.56, 0.64, 1) Premium "bounce" — buttons, badges
--ease-linear linear Mission-control instant transitions, marquees

The Premium Recipe

// Mission-control surfaces — instant, machine-like (default)
className="transition-all duration-fast ease-linear"

// Branded marketing surfaces — smooth, considered
className="transition-all duration-base ease-[var(--ease-smooth)]"

// Hover lift on a brutalist card — preserves the offset shadow read
className="transition-transform duration-fast ease-linear
           hover:-translate-x-0.5 hover:-translate-y-0.5"

// Premium press feedback — bouncy, confident
className="transition-transform duration-base ease-[var(--ease-spring)]
           active:scale-[0.98]"

// Entrance choreography — staggered with tw-animate-css
<div className="animate-in fade-in-0 duration-slow">
  <h1 className="animate-in slide-in-from-bottom-4 duration-slow">…</h1>
  <p  className="animate-in slide-in-from-bottom-3 duration-slower delay-100">…</p>
</div>

prefers-reduced-motion

globals.css already handles the global override. For component-level safety:

className="tac-scanline motion-reduce:hidden"
className="tac-blink motion-reduce:animate-none"

FUI Utilities (the mission-control vocabulary)

Defined in globals.css @layer utilities. Compose, don't redefine.

Class Use
.tac-fui-panel Solid card surface, 1px border, brutalist offset shadow
.tac-fui-border 1px border on background
.tac-fui-hover Instant border + 5%-mix bg on hover
.tac-mono-label Uppercase mono caps in primary violet
.tac-fui-crosshair Centered + decoration via ::before
.tac-signal-glow 1px ring + 8px primary color-mix bloom
.tac-hazard-stripes -45° border/transparent repeating gradient
.tac-scanline 1px primary line scanning vertically (8s loop)
.tac-blink 1s step terminal blink
.tac-surface / .tac-overlay / .tac-code-bg Surface convenience classes
.tac-print-label Print-safe black-on-white wrapper
.tac-hero-bleed Full-bleed hero (compensates layout padding at every breakpoint)

Text Gradients & Glow (Premium Hero Treatment)

Use sparingly — these are the visual "splash" reserved for marketing surfaces and dashboard hero KPIs.

// Violet primary gradient — for headings and key labels
<h1 className="t-display t-gradient-primary">Mission Control</h1>

// Hero gradient — wider sweep, includes adjacent hue for richness
<h1 className="t-display t-gradient-hero">North-East Logistics</h1>

// Success gradient — for positive KPI values
<span className="t-data t-gradient-success">98.7%</span>

// Violet glow on dark mode hero
<h1 className="t-display dark:text-glow-primary">Velocity</h1>

// Text shadows for depth on busy backgrounds
<p className="text-shadow-sm">Subtle</p>
<p className="text-shadow-md">Medium</p>
<p className="text-shadow-lg">Heavy (use only behind imagery)</p>

Premium Composition Patterns

Signal Panel (the canonical card)

<div
  data-slot="signal-panel"
  className={cn(
    "bg-card",
    "border border-border",
    "border-t-2 border-t-primary",   // top accent = hierarchy marker
    "p-6",
    "shadow-sm",                     // 3px brutalist offset
    "transition-colors duration-fast ease-linear",
    "hover:border-primary",
  )}
/>

KPI Card

<div className="tac-fui-panel p-6 flex flex-col gap-2">
  <span className="tac-mono-label">Active Manifests</span>
  <span className="t-data text-foreground">128</span>
  <span className="t-caption">+12 vs. last hour</span>
</div>

Mission-Control Header

<header className="border-b border-border bg-card">
  <div className="container flex items-center justify-between py-3">
    <div className="flex items-center gap-3">
      <span className="tac-mono-label">SECTOR</span>
      <span className="font-mono text-sm tabular-nums">DEL · BLR · BOM · MAA</span>
    </div>
    <span className="t-mono-sm text-muted-foreground tabular-nums">
      {now.toISOString()}
    </span>
  </div>
</header>

Hero Display (landing page)

<section className="tac-hero-bleed bg-background relative">
  <div className="absolute inset-0 tac-scanline pointer-events-none" />
  <div className="container py-24 lg:py-32">
    <span className="t-overline text-primary">North-East Corridor · Logistics</span>
    <h1 className="t-display t-gradient-hero mt-4">
      Move faster than the road.
    </h1>
    <p className="t-body mt-6 max-w-prose text-muted-foreground">
      Real-time tracking, predictive arrival, mission-grade ops.
    </p>
  </div>
</section>

What NOT to do (premium-killers)

❌ Soft drop shadows                      → use brutalist offset
❌ Glassmorphism / backdrop-blur          → solid surfaces only
❌ Curved decorations / wavy SVGs         → straight lines, brackets, hazard stripes
❌ Three or more accent hues in one view  → one violet, one status hue, that's it
❌ Mid-saturation pastels                 → violet is saturated; status hues are saturated; surfaces are neutral
❌ Three+ font weights in one block       → 400 / 600 / 700 / 800 are all you need
❌ Inline styles                          → semantic tokens via Tailwind classes only
❌ `Inter`, `Geist`, `Space Grotesk`,
   `JetBrains Mono`, `Fira Mono` strings  → those are dead identities; only Plus Jakarta Sans / IBM Plex Mono / Lora

Pre-flight Before Shipping a Premium Surface

[ ] Uses .t-display / .t-h1..h4 / .t-data / .t-overline (not raw text-* classes)
[ ] Uses violet primary, never indigo (260°)
[ ] Brutalist offset shadows, never blur
[ ] Zero radius — sharp corners read as "engineered, premium"
[ ] Motion choreography uses --ease-smooth or --ease-spring (not stock ease-out)
[ ] FUI utility used where it earns its place (.tac-mono-label on every field key)
[ ] Dark mode: text-glow-primary or t-gradient-hero on the hero only (don't sprinkle)
[ ] prefers-reduced-motion guard on .tac-scanline / .tac-blink
[ ] All copy in font-sans; all numbers in font-mono with tabular-nums