dark · brutalist · sans · structured · dense

DESIGN.md inspired by Valorant

Tactical-shooter design language — Tungsten condensed all-caps, signal-red CTAs, and an off-white text the brand calls "ECE8E1".

By webdesignhot · playvalorant.com
$ npx @webdesignhot/design-md add valorant
Learn more about the CLI
Compare to…
try on →
theme
1440 × 900
mobile · 390 × 844
Tokens webdesignhot/0.1
  • bg #0f1923
  • bg-deep #1a242e
  • bg-section #212d39
  • surface #1a242e
  • surface-strong #212d39
  • surface-translucent rgba(15, 25, 35, 0.85)
  • brand AA · 5.3 #ff4655
  • brand-deep #d62836
  • brand-active #a81e29
  • brand-tint rgba(255, 70, 85, 0.15)
  • on-brand #ffffff
  • bone #ece8e1
  • bone-soft rgba(236, 232, 225, 0.7)
  • bone-faint rgba(236, 232, 225, 0.4)
  • text AAA · 14.5 #ece8e1
  • text-strong #ffffff
  • text-muted #9aa6b1
  • text-faint AA·LG · 3.9 #6c7780
  • text-on-brand #ffffff
  • link #ff4655
  • link-hover #ffffff
  • selected-bg rgba(255, 70, 85, 0.20)
  • border — · 1.5 rgba(236, 232, 225, 0.15)
  • border-strong — · 2.4 rgba(236, 232, 225, 0.30)
  • border-brand #ff4655
  • success #22c55e
  • warning #f5a524
  • danger #ff4655
  • info #9aa6b1
Typography
Ship faster than ever.
display-hero "Tungsten-Bold" 144px w700 0.01em
Ship faster than ever.
display-xl "Tungsten-Bold" 96px w700 0.01em
Ship faster than ever.
display-lg "Tungsten-Bold" 72px w700 0.01em
Ship faster than ever.
h1 "Tungsten-Bold" 56px w700 0.005em
Built for teams that ship.
h2 "Tungsten-Bold" 40px w700 0.005em
A complete kit
h3 "Tungsten-Bold" 28px w700 0
The quick brown fox jumps over the lazy dog.
h4 "Tungsten-Bold" 22px w700 0
The quick brown fox jumps over the lazy dog.
body-lg "Inter" 18px w400 0
The quick brown fox jumps over the lazy dog.
button-lg "Inter" 16px w700 0.16em
The quick brown fox jumps over the lazy dog.
body "Inter" 15px w400 0
The quick brown fox jumps over the lazy dog.
eyebrow "Inter" 14px w700 0.18em
The quick brown fox jumps over the lazy dog.
button "Inter" 14px w700 0.16em
The quick brown fox jumps over the lazy dog.
body-sm "Inter" 13px w400 0
npx @webdesignhot/design-md add stripe
code "JetBrains Mono" 13px w400 0
OUR DESIGN SYSTEM
label "Inter" 12px w700 0.20em
OUR DESIGN SYSTEM
caption "Inter" 11px w500 0.04em
Spacing
  • step-0 0px
  • step-1 4px
  • step-2 8px
  • step-3 12px
  • step-4 16px
  • step-5 20px
  • step-6 24px
  • step-7 32px
  • step-8 40px
  • step-9 56px
  • step-10 72px
  • step-11 96px
  • step-12 128px
  • step-13 160px
  • step-14 200px
Radius
  • none 0px
  • micro 1px
  • sm 2px
  • md 4px
  • lg 6px
  • pill 9999px
Components
Text link →
Card preview A complete kit — everything your product needs. Hero, pricing, FAQ, dashboard, docs — every layout your product needs.
New Stable v1.0
Design roles 7/8 mapped · webdesignhot/0.1

Maps the 8 canonical role names to this entry's actual tokens. Use these to plug the design into role-aware tools — shadcn/ui themes, role-aware Tailwind plugins, atelier-lint — without hard-coding token names.

  • background bg
  • foreground text
  • primary brand
  • primary-foreground on-brand
  • accent
  • muted text-muted
  • border border
  • ring border-brand
Lineage & influences

Valorant's marketing system is what happens when Riot lets a tactical-shooter team hire magazine art directors. Tungsten Bold — the condensed sans drawn for Esquire and Sports Illustrated — runs every display headline at 96–144px, all caps, tightly tracked. The signal-red `#ff4655` is Riot-internal "ELO Red"; bone-white `#ece8e1` is borrowed from the in-game agent uniforms. CTA buttons skew at -6° because they evoke knife edges; cards have hard 0px corners and red top-stripe rules instead of shadows. The whole thing rejects the rounded-edtech instinct of mainstream gaming sites and reads more like a Wired feature than a marketing page.

Export 4 formats · paste-ready
Tailwind

theme.extend block for tailwind.config.js

tailwind.config.js
CSS variables

:root { --bg, --text, --brand, … } you can paste anywhere

design.css
DTCG JSON

W3C Design Tokens Community Group format

design.tokens.json
Figma Variables

Importable into Figma → Variables → Import

figma-variables.json
The file
---
name: Valorant
tagline: Tactical-shooter design language — Tungsten condensed all-caps, signal-red CTAs, and an off-white text the brand calls "ECE8E1".
updated_at: 2026-05-08T00:00:00.000Z
published_at: 2026-05-07T20:01:46.885Z
author: webdesignhot
source_url: https://playvalorant.com
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [gaming]
tags: [dark, brutalist, sans, structured, dense]
preview_swatch: ['#0f1923', '#ff4655', '#ece8e1']
related: [playstation, xbox, krea]
description: 'Riot''s Valorant marketing site is the rare AAA-game brand site that has accepted typography as the primary instrument: Tungsten Bold (condensed, all-caps) handles every display and pre-headline, Inter (regular weight) carries body copy, and the only chromatic accents on a near-black `#0f1923` canvas are the signature signal-red `#ff4655` and a warm bone-white `#ece8e1` borrowed from agent uniforms. Hard 0–4px corners across every component reject the rounded-edtech instinct; thick strokes, hairline rules, and edge-of-page brand watermarks sit beside dense agent stat blocks. The whole system reads like a magazine for tactical shooters.'


# Canonical 8-role aliases (per google-labs-code/design.md PR #76).
# Maps role names to this entry's actual token names so role-aware
# downstream tools resolve `theme.background` → entry's `bg`, etc.
# Auto-generated by scripts/add-aliases.mjs — do not edit manually;
# regenerate after changing color token names.
aliases:
  background: bg
  foreground: text
  primary: brand
  primary-foreground: on-brand
  muted: text-muted
  border: border
  ring: border-brand
colors:
  bg: '#0f1923'
  bg-deep: '#1a242e'
  bg-section: '#212d39'
  surface: '#1a242e'
  surface-strong: '#212d39'
  surface-translucent: 'rgba(15, 25, 35, 0.85)'
  brand: '#ff4655'
  brand-deep: '#d62836'
  brand-active: '#a81e29'
  brand-tint: 'rgba(255, 70, 85, 0.15)'
  on-brand: '#ffffff'
  bone: '#ece8e1'
  bone-soft: 'rgba(236, 232, 225, 0.7)'
  bone-faint: 'rgba(236, 232, 225, 0.4)'
  text: '#ece8e1'
  text-strong: '#ffffff'
  text-muted: '#9aa6b1'
  text-faint: '#6c7780'
  text-on-brand: '#ffffff'
  link: '#ff4655'
  link-hover: '#ffffff'
  selected-bg: 'rgba(255, 70, 85, 0.20)'
  border: 'rgba(236, 232, 225, 0.15)'
  border-strong: 'rgba(236, 232, 225, 0.30)'
  border-brand: '#ff4655'
  success: '#22c55e'
  warning: '#f5a524'
  danger: '#ff4655'
  info: '#9aa6b1'

typography:
  display:
    family: '"Tungsten-Bold", "Tungsten", "Bebas Neue", "Oswald", Impact, sans-serif'
    weights: [700]
    opentype-features: 'kern, liga'
  body:
    family: '"Inter", "DIN Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, sans-serif'
    weights: [400, 500, 700]
  mono:
    family: '"JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace'
    weights: [400, 500]
  scale:
    display-hero:    { size: 144, weight: 700, lineHeight: 0.92, tracking: '0.01em',  family: display, opentype: 'liga' }
    display-xl:      { size: 96,  weight: 700, lineHeight: 0.95, tracking: '0.01em',  family: display }
    display-lg:      { size: 72,  weight: 700, lineHeight: 1.0,  tracking: '0.01em',  family: display }
    h1:              { size: 56,  weight: 700, lineHeight: 1.05, tracking: '0.005em', family: display }
    h2:              { size: 40,  weight: 700, lineHeight: 1.1,  tracking: '0.005em', family: display }
    h3:              { size: 28,  weight: 700, lineHeight: 1.15, tracking: '0',       family: display }
    h4:              { size: 22,  weight: 700, lineHeight: 1.25, tracking: '0',       family: display }
    eyebrow:         { size: 14,  weight: 700, lineHeight: 1.2,  tracking: '0.18em',  family: body }
    body-lg:         { size: 18,  weight: 400, lineHeight: 1.55, tracking: '0',       family: body }
    body:            { size: 15,  weight: 400, lineHeight: 1.6,  tracking: '0',       family: body }
    body-sm:         { size: 13,  weight: 400, lineHeight: 1.5,  tracking: '0',       family: body }
    label:           { size: 12,  weight: 700, lineHeight: 1.2,  tracking: '0.20em',  family: body }
    button:          { size: 14,  weight: 700, lineHeight: 1.0,  tracking: '0.16em',  family: body }
    button-lg:       { size: 16,  weight: 700, lineHeight: 1.0,  tracking: '0.16em',  family: body }
    caption:         { size: 11,  weight: 500, lineHeight: 1.4,  tracking: '0.04em',  family: body }
    code:            { size: 13,  weight: 400, lineHeight: 1.6,  tracking: '0',       family: mono }

radius:
  none: 0
  micro: 1
  sm: 2
  md: 4
  lg: 6
  pill: 9999

spacing:
  base: 4
  scale: [0, 4, 8, 12, 16, 20, 24, 32, 40, 56, 72, 96, 128, 160, 200]

layout:
  page-width: 1440
  prose-width: 720
  header-height: 80
  hero-y: 200

motion:
  ease-standard: 'cubic-bezier(0.65, 0, 0.35, 1)'
  ease-emphasized: 'cubic-bezier(0.85, 0, 0.15, 1)'
  duration-fast: 100
  duration-standard: 180
  duration-slow: 260
  duration-cinematic: 420
  reduced-motion: 'respects prefers-reduced-motion: reduce — replaces all transforms with opacity'

breakpoints:
  mobile: 480
  tablet: 768
  desktop: 1280
  wide: 1440

shadows:
  card: '0 1px 0 0 rgba(236, 232, 225, 0.10)'
  card-hover: '0 0 0 1px rgba(255, 70, 85, 0.6)'
  modal: '0 24px 64px rgba(0, 0, 0, 0.80)'

accessibility:
  contrast-text-on-bg: 14.2
  contrast-text-on-brand: 4.5
  focus-ring: '2px solid #ff4655 + 1px outset bg gap'
  reduced-motion-honored: true

components:
  button-primary: { bg: brand, text: on-brand, padding: '14px 32px', radius: 0, font: button, transform: 'skew(-6deg)' }
  button-ghost: { bg: transparent, text: text, padding: '12px 28px', border: '1px solid border-strong', radius: 0, transform: 'skew(-6deg)' }
  card: { bg: surface, radius: 0, padding: 32, border-top: '2px solid border-brand' }
  pill: { bg: bg-deep, text: text, border: '1px solid border', radius: pill, padding: '4px 12px', font: 'label' }
  input: { bg: bg-deep, border: '1px solid border-strong', text: text, radius: 0, padding: '12px 16px', focus-border: brand }
  badge-agent: { bg: brand, text: on-brand, radius: 0, padding: '4px 8px', font: 'label' }

lineage:
  summary: 'Valorant''s marketing system is what happens when Riot lets a tactical-shooter team hire magazine art directors. Tungsten Bold — the condensed sans drawn for Esquire and Sports Illustrated — runs every display headline at 96–144px, all caps, tightly tracked. The signal-red `#ff4655` is Riot-internal "ELO Red"; bone-white `#ece8e1` is borrowed from the in-game agent uniforms. CTA buttons skew at -6° because they evoke knife edges; cards have hard 0px corners and red top-stripe rules instead of shadows. The whole thing rejects the rounded-edtech instinct of mainstream gaming sites and reads more like a Wired feature than a marketing page.'
  influences:
    - { name: 'Tungsten by Hoefler & Co', role: 'condensed display sans drawn for Esquire / Sports Illustrated', url: 'https://www.typography.com/fonts/tungsten' }
    - { name: 'Counter-Strike (Valve)', role: 'tactical-shooter UI legacy — dense agent stat blocks, hard corners', url: 'https://blog.counter-strike.net' }
    - { name: 'Wired (US edition)', role: 'magazine layout instincts — eyebrow + display + dek', url: 'https://www.wired.com' }
    - { name: 'Tactical military typography', role: 'all-caps + extended tracking on agent code-names', url: 'https://en.wikipedia.org/wiki/Military_alphabet' }
    - { name: 'Riot League of Legends', role: 'in-house Riot brand language for esports clients', url: 'https://www.leagueoflegends.com' }
---

## 1. Visual Theme & Atmosphere

Valorant's marketing site is the rare AAA-game brand that has accepted typography as the primary instrument. Tungsten Bold — the condensed display sans Hoefler & Co drew for *Esquire* and *Sports Illustrated* — runs every display headline at 96–144px, all-caps, tightly tracked. Inter handles body copy at 15px regular. The canvas is the brand's "blacksite" near-black `#0f1923` (subtle cool tilt, not pure black). The only chromatic accents are the signal-red `#ff4655` (every CTA, every error, every hit-marker indicator) and a warm bone-white `#ece8e1` (body copy, secondary CTAs) borrowed from agent uniforms.

What's rejected here is more telling than what's adopted. No rounded corners on interactive elements — buttons, cards, inputs all 0px. No drop shadows with blur — only hairline rules and 1px red rings on hover. No gradients on CTAs. No serif anywhere. No friendly mascot. The brand has decided it's making a tactical shooter, not a console-store loyalty program.

CTAs skew at `-6°` because they evoke knife edges. Section labels are 12px Inter all-caps, 0.20em tracking, sitting above 96px Tungsten display. Cards get a red 2px top-stripe rule instead of a shadow. Agent reveal pages are full-bleed video heroes with the agent codename in 144px Tungsten over a 70% black scrim. The whole layout reads like a *Wired* feature about a war you can't quite tell is real.

**Key Characteristics:**
- Near-black canvas `#0f1923` (cool tilt, never pure black)
- Tungsten Bold for ALL display, all-caps, 96–144px hero
- Bone-white `#ece8e1` body — never pure white at 100%
- Signal-red `#ff4655` is the only chromatic accent
- 0px radius on every interactive element
- CTAs skew `-6°` (the knife-edge mark)
- Cards use red top-stripes, not shadows
- 0.16–0.20em tracking on every uppercase label
- Hairline rules everywhere; no soft shadows on UI
- Dense agent-stat blocks coexist with magazine-scale display type

## 2. Color Palette & Roles

### Primary
- **Background** (`#0f1923`): the "blacksite" canvas — near-black with cool tilt, never pure `#000`.
- **Text** (`#ece8e1`): body uses Bone, never pure white at 100%.
- **Text Strong** (`#ffffff`): display headlines pop to pure white.

### Brand — Signal Red
- **Brand** (`#ff4655`): "ELO Red" / signal red — every CTA, hit-marker, error.
- **Brand Deep** (`#d62836`): pressed.
- **Brand Active** (`#a81e29`): icon strokes on red bg.
- **Brand Tint** (`rgba(255, 70, 85, 0.15)`): subtle wash for selected.

### Bone (warm off-white scale)
- **Bone** (`#ece8e1`): body, secondary CTAs.
- **Bone Soft** (70%): muted body, captions.
- **Bone Faint** (40%): tertiary, breadcrumbs.

### Surface
- **Surface** (`#1a242e`): cards on dark.
- **Surface Strong** (`#212d39`): featured / hover.
- **Surface Translucent** (85% bg): video-hero overlay.

### Borders
- **Border** (15% bone): hairline.
- **Border Strong** (30% bone): emphasis hairline.
- **Border Brand** (`#ff4655`): 1–2px red rule under headers + cards.

### Semantic
- success `#22c55e`, warning `#f5a524`, danger `#ff4655` (= brand), info cool gray.

## 3. Typography Rules

### Font Family
- **Display**: Tungsten Bold (condensed all-caps display sans). Fallback chain Tungsten-Bold → Bebas Neue → Oswald → Impact → sans-serif.
- **Body**: Inter regular at 15px line-height 1.6. Falls back to DIN Pro and system stacks.
- **Mono**: JetBrains Mono / IBM Plex Mono in stat blocks and code samples.

### Hierarchy

| Role | Font | Size | Weight | LH | Tracking | Notes |
|------|------|------|--------|-----|----------|-------|
| display-hero | Tungsten | 144 | 700 | 0.92 | 0.01em | agent reveal |
| display-xl | Tungsten | 96 | 700 | 0.95 | 0.01em | section H |
| display-lg | Tungsten | 72 | 700 | 1.0 | 0.01em | feature heading |
| h1 | Tungsten | 56 | 700 | 1.05 | 0.005em | sub-section |
| h2 | Tungsten | 40 | 700 | 1.1 | 0.005em | card heading |
| h3 | Tungsten | 28 | 700 | 1.15 | 0 | sub-card |
| h4 | Tungsten | 22 | 700 | 1.25 | 0 | inline emphasis |
| eyebrow | Inter | 14 | 700 | 1.2 | 0.18em (UPPER) | section labels |
| body-lg | Inter | 18 | 400 | 1.55 | 0 | hero subhead |
| body | Inter | 15 | 400 | 1.6 | 0 | body |
| body-sm | Inter | 13 | 400 | 1.5 | 0 | secondary |
| label | Inter | 12 | 700 | 1.2 | 0.20em (UPPER) | tags, agent badges |
| button | Inter | 14 | 700 | 1.0 | 0.16em (UPPER) | CTA |
| button-lg | Inter | 16 | 700 | 1.0 | 0.16em (UPPER) | hero CTA |

### Principles
- **Tungsten condensed for display, no exceptions.**
- **Display copy ALL CAPS** — eyebrow, hero, section H. Mixed case only on body and dek.
- **Heavy tracking on uppercase**: 0.16em on buttons, 0.18em on eyebrows, 0.20em on labels.
- **Never pure white for body**. Bone `#ece8e1` is warmer; white reserved for max-emphasis display.
- **Tight leading on display**: 0.92 hero, 0.95–1.0 elsewhere.
- **Body 15px, not 16px** — denser, magazine-like.

## 4. Component Stylings

### Buttons (skewed -6°)

**Primary** — signal red:
- bg `#ff4655`, text `#ffffff`, font Inter 14px 700 0.16em UPPER
- padding 14×32, radius 0, transform `skew(-6deg)`, text counter-skewed `+6°`
- Hover: bg `#ffffff`, text `#0f1923` (full inversion)
- Press: bg `#d62836`
- Disabled: bg 40% red, text 40% white

**Ghost** — bordered:
- bg transparent, text bone, 1px border at 30% bone
- Same skew
- Hover: bg bone, text blacksite

### Cards
- bg `#1a242e`, 0px radius, padding 32
- 2px solid red `#ff4655` top-stripe — the brand's card signature
- No drop shadow; on hover, 1px red ring outside card

### Pills (agent role badges)
- bg bg-deep, text bone, 1px border at 15% bone, radius 9999 (only place pills exist)
- font label (12px 700 0.20em UPPER)

### Inputs
- bg bg-deep, 1px border at 30% bone, 0px radius, padding 12×16
- Focus: border shifts to `#ff4655`, no glow ring
- Label sits above input in eyebrow style

### Navigation
- 80px sticky header, near-black bg with bottom hairline
- Logo left (V mark in white), 5-6 items center bone color 0.18em 14px, "PLAY FREE" red skewed CTA right

## 5. Layout Principles

### Spacing
- Base 4px, scale `[0, 4, 8, 12, 16, 20, 24, 32, 40, 56, 72, 96, 128, 160, 200]`
- 96px is the workhorse between sections
- 200px reserved for hero top-pad

### Grid & Container
- Page max width 1440px (wider than typical SaaS)
- Hero often full-bleed video, 100vh
- Agent reveal: image left 60%, copy right 40% (asymmetric on purpose)
- Stat blocks: 4-up dense grid, 32px gap, no internal borders — only external

### Whitespace
- Density allowed in stat blocks; generous around hero typography
- Section pads 128–200px on marketing; 56–72px on docs

### Section Cadence
- Alternating bg `#0f1923` ↔ `#1a242e` ↔ video hero
- No light sections at all

## 6. Shapes & Radius Scale

| Tier | Value | Use |
|------|-------|-----|
| None | 0 | **default** for buttons, cards, inputs, panels |
| Micro | 1 | hairline-style indicator dots |
| Standard | 2 | rare; only on agent stat sub-cells |
| Comfortable | 4 | tooltip / toast |
| Relaxed | 6 | dropdown menu |
| Pill | 9999 | agent role badges only |

The brand commits to **0px** on all primary surfaces. 4-6px shows up only on tooltips/dropdowns where rounding aids legibility.

## 7. Depth & Elevation

| Level | Treatment | Use |
|-------|-----------|-----|
| 0 | none | default |
| 1 | 1px hairline rule | cards, panels |
| 2 | 1px red ring outside | hover state |
| 3 | 2px solid red top-stripe | featured cards |
| 4 | `0 24px 64px rgba(0,0,0,0.80)` | modal / video lightbox |

### Shadow Philosophy
The brand rejects soft shadows on UI. Elevation is signaled by **rules and rings**, not blur. Modals get a heavy black shadow because they're cinematic, not interface.

## 8. Interaction & Motion

### Easing & duration
- **Standard ease**: `cubic-bezier(0.65, 0, 0.35, 1)` — sharp tactical curve
- **Emphasized ease**: `cubic-bezier(0.85, 0, 0.15, 1)` — weapon-snap
- Durations: 100ms (hover), 180ms (focus), 260ms (modal, dropdown), 420ms (cinematic, agent reveal)

### Per-component
- **Primary CTA hover**: bg → bone, text → blacksite, full color inversion in 100ms
- **Card hover**: 1px red ring grows from 0 to 1px in 180ms
- **Agent card reveal (scroll)**: cinematic ease, 420ms, fade + 24px translate
- **Video hero**: autoplay loops with first 4s opacity fade-in
- **Cursor on interactive**: subtle scale 1.02

### Reduced Motion
Honors `prefers-reduced-motion: reduce`. Skew transforms remain (purely visual brand signal); translate/scale animations replaced with opacity. Video heroes pause and show poster frame.

## 9. Accessibility & A11y

### Contrast
- bone on bg: `#ece8e1` on `#0f1923` = **14.2:1** (AAA at body)
- white on bg: `#ffffff` on `#0f1923` = **17.8:1** (AAA)
- white on brand: `#ffffff` on `#ff4655` = **4.5:1** (AA at body, AAA at large)

### Focus
2px solid `#ff4655` ring with 1px outset bg gap (looks like a tactical UI selection).

### ARIA & Keyboard
- Skewed CTAs maintain accessible name from text content (skew is decorative)
- Video heroes have visible play/pause + `prefers-reduced-motion` poster fallback
- Agent stat blocks use semantic table markup with `<th scope="row">` for screen readers

### Screen Reader
- Visually all-caps labels are NOT all-caps in HTML (CSS `text-transform: uppercase`) so screen readers pronounce them as normal words
- Decorative red top-stripes have `aria-hidden`
- Agent ability tooltips announce via `aria-describedby`

## 10. Responsive Behavior

| Breakpoint | px | Behavior |
|-----------|-----|----------|
| mobile | 0-479 | hero scales 144→64px; nav collapses to red hamburger |
| tablet | 480-767 | 2-col agent grid; stat blocks stack |
| desktop | 768-1279 | full marketing grid; 4-up stat blocks |
| wide | 1280-1440 | identical, larger hero video |

### Touch Targets
44×44px min on mobile, but skewed buttons get extra horizontal pad to compensate for visual angle.

### Per-component
- Nav → red hamburger at <768px, full-screen overlay menu
- Agent cards → vertical scroll with snap points on mobile
- Stat tables → horizontal-scroll containers with red gradient fade on right edge

### Image Behavior
- Hero video: `cover`, 16:9 aspect with hard 100vh cap
- Agent portraits: `cover`, top-aligned, 60vh tall

## 11. Content & Voice

### Tone
**Tactical-precise, never effusive.** Copy is short, declarative, military-coded. Verbs over adjectives. Headlines often drop subjects ("DEFY THE LIMITS" not "You can defy the limits").

### Microcopy patterns
- Primary CTA: **"PLAY FREE"** — never "Sign up" or "Get started"
- Agent reveal: **"REVEALED: <NAME>"** — always uppercase, colon-anchored
- Lobby: **"AGENT SELECT"**, **"ROUND 1"** — magazine all-caps
- Errors: **"CONNECTION TERMINATED"**, **"AGENT UNAVAILABLE"**
- Loading: **"INITIALIZING"** — never "Please wait"

### Empty states
The brand mostly avoids empty states by replacing them with 0-stat displays (0 wins, 0 deaths, 0 elims). When unavoidable: **"NO MATCHES YET — DEPLOY TO FIND ONE"**.

### CTA verb conventions
- **PLAY** (game entry, lobby, queue)
- **DEPLOY** (training, range)
- **VIEW** (agent, weapon, map detail)
- **REVEAL** (cinematic / story)
- Avoid: "Learn", "Discover", "Explore" — too soft

## 12. Dark Mode & Theming

**Dark-only.** The brand has no light mode. Marketing site, in-game UI, and Riot Account interfaces all use the same `#0f1923` base.

If a partner integration requires light mode (e.g. embedded press kit), invert: bg → bone, text → blacksite, brand red unchanged. Skew, hard corners, Tungsten remain.

## 13. Lineage & Influences

Valorant's brand language emerged in 2020 as Riot positioned the title as the tactical-shooter answer to *Counter-Strike: Global Offensive*. Where CS:GO leaned military-utility, Valorant leaned magazine-editorial. Hoefler & Co's Tungsten — drawn for *Esquire* and *Sports Illustrated* — became the display face. The signal-red `#ff4655` was tuned in-house to read on dark canvas without glow at 5+ meters (the assumed esports stage distance).

The site rejects the rounded-edtech instinct of mainstream gaming sites (PlayStation, Xbox web feels comparatively soft). Hard corners, hairline rules, all-caps display, 0.16–0.20em tracking on labels read like a *Wired* feature, not a marketing page. The skewed CTA is Riot's signature interaction trick — also visible on League of Legends (different colors) and Project L.

**Named influences:**
- **Tungsten by Hoefler & Co** ([typography.com](https://www.typography.com/fonts/tungsten))
- **Counter-Strike (Valve)** — tactical-shooter UI legacy
- **Wired (US edition)** — magazine layout instincts
- **Tactical military typography** — all-caps + extended tracking on agent code-names
- **Riot League of Legends** — in-house Riot brand language

## 14. Do's and Don'ts

### Do
- **Use Tungsten Bold for every display.** No Helvetica Compressed substitute.
- **Skew CTAs `-6°`** with text counter-skewed `+6°` to read straight.
- **Commit to 0px radius** on buttons, cards, inputs.
- **Use Bone `#ece8e1` for body**, not pure white.
- **Track uppercase aggressively** (0.16em buttons, 0.18em eyebrows, 0.20em labels).
- **Cards get a 2px red top-stripe**, not a shadow.
- **Use red `#ff4655` exclusively for primary CTA + brand mark.**
- **Hero typography goes huge** (96–144px). Don't scale below 64px on hero, even mobile.

### Don't
- **Don't round corners.** 0px is the rule; 4-6px on dropdowns is the only exception.
- **Don't use rounded sans-serif for display.** Tungsten Bold or nothing.
- **Don't add gradients** on CTAs, headers, or cards.
- **Don't add drop-shadow blur on UI.** Hairlines and rings only.
- **Don't make body 16px.** 15px is the brand's beat.
- **Don't substitute red.** `#ff4655` is the brand red — not Tailwind red, not `#dc2626`.
- **Don't write friendly microcopy.** "Welcome back!" is off-brand. "DEPLOYED" is on-brand.
- **Don't add a light mode** without explicit Riot brand approval.

## 15. Agent Prompt Guide

### Quick Color Reference
- bg (blacksite): `#0f1923`
- bg-deep (surface): `#1a242e`
- text (bone): `#ece8e1`
- text-strong (white): `#ffffff`
- brand (signal red): `#ff4655` / pressed `#d62836`
- border (15% bone): `rgba(236, 232, 225, 0.15)`

### Example Component Prompts

> Build a Valorant-style hero: 100vh full-bleed video bg, near-black overlay scrim, 144px Tungsten Bold heading "DEFY THE LIMITS" all-caps tracked 0.01em in pure white, 18px Inter dek in `#ece8e1`. Skewed `-6°` red CTA "PLAY FREE" 14px Inter 700 0.16em UPPER. 200px top pad.

> Design an agent reveal card: `#1a242e` surface, 0px radius, 32px pad, 2px red top-stripe `#ff4655`. 96px Tungsten codename ALL-CAPS, 12px label eyebrow "DUELIST" in `#ff4655`. 4-up ability stats below in mono.

> Render a stat block: 4 columns, no internal borders, each cell labelled in 12px Inter 700 0.20em UPPER bone-soft, value in 56px Tungsten Bold pure white. 1px hairline divider top + bottom.

> Build a tactical button: 0px radius, signal-red bg, white text 14px Inter 700 0.16em uppercase "DEPLOY", padding 14×32, transformed `skew(-6deg)` with text inner-counter `skew(6deg)`. Hover inverts colors fully.

> Design a tooltip: 4px radius (only place corners aren't 0), bg-deep, 1px bone-15% border, 13px Inter body, 12×16 padding. No arrow.

### Iteration Guide

1. **Start with Tungsten and 0px corners.**
2. **Skew every primary CTA.** -6° transform is the brand's signature.
3. **Track uppercase 0.16em+.** Eyebrows go 0.18-0.20em.
4. **Use red sparingly.** One CTA per fold, one accent stripe per card.
5. **Bone, not white.** Body in `#ece8e1`; reserve `#ffffff` for max-emphasis display.
6. **Hairlines beat shadows.** 1px rules and 1-2px stripes; avoid `box-shadow: blur > 0` on UI.
7. **Density is OK in stat blocks**, generous around hero.
8. **Reject roundness.** If it feels Discord-friendly, you're off-brand.
Prose

1. Visual Theme & Atmosphere

Valorant’s marketing site is the rare AAA-game brand that has accepted typography as the primary instrument. Tungsten Bold — the condensed display sans Hoefler & Co drew for Esquire and Sports Illustrated — runs every display headline at 96–144px, all-caps, tightly tracked. Inter handles body copy at 15px regular. The canvas is the brand’s “blacksite” near-black #0f1923 (subtle cool tilt, not pure black). The only chromatic accents are the signal-red #ff4655 (every CTA, every error, every hit-marker indicator) and a warm bone-white #ece8e1 (body copy, secondary CTAs) borrowed from agent uniforms.

What’s rejected here is more telling than what’s adopted. No rounded corners on interactive elements — buttons, cards, inputs all 0px. No drop shadows with blur — only hairline rules and 1px red rings on hover. No gradients on CTAs. No serif anywhere. No friendly mascot. The brand has decided it’s making a tactical shooter, not a console-store loyalty program.

CTAs skew at -6° because they evoke knife edges. Section labels are 12px Inter all-caps, 0.20em tracking, sitting above 96px Tungsten display. Cards get a red 2px top-stripe rule instead of a shadow. Agent reveal pages are full-bleed video heroes with the agent codename in 144px Tungsten over a 70% black scrim. The whole layout reads like a Wired feature about a war you can’t quite tell is real.

Key Characteristics:

  • Near-black canvas #0f1923 (cool tilt, never pure black)
  • Tungsten Bold for ALL display, all-caps, 96–144px hero
  • Bone-white #ece8e1 body — never pure white at 100%
  • Signal-red #ff4655 is the only chromatic accent
  • 0px radius on every interactive element
  • CTAs skew -6° (the knife-edge mark)
  • Cards use red top-stripes, not shadows
  • 0.16–0.20em tracking on every uppercase label
  • Hairline rules everywhere; no soft shadows on UI
  • Dense agent-stat blocks coexist with magazine-scale display type

2. Color Palette & Roles

Primary

  • Background (#0f1923): the “blacksite” canvas — near-black with cool tilt, never pure #000.
  • Text (#ece8e1): body uses Bone, never pure white at 100%.
  • Text Strong (#ffffff): display headlines pop to pure white.

Brand — Signal Red

  • Brand (#ff4655): “ELO Red” / signal red — every CTA, hit-marker, error.
  • Brand Deep (#d62836): pressed.
  • Brand Active (#a81e29): icon strokes on red bg.
  • Brand Tint (rgba(255, 70, 85, 0.15)): subtle wash for selected.

Bone (warm off-white scale)

  • Bone (#ece8e1): body, secondary CTAs.
  • Bone Soft (70%): muted body, captions.
  • Bone Faint (40%): tertiary, breadcrumbs.

Surface

  • Surface (#1a242e): cards on dark.
  • Surface Strong (#212d39): featured / hover.
  • Surface Translucent (85% bg): video-hero overlay.

Borders

  • Border (15% bone): hairline.
  • Border Strong (30% bone): emphasis hairline.
  • Border Brand (#ff4655): 1–2px red rule under headers + cards.

Semantic

  • success #22c55e, warning #f5a524, danger #ff4655 (= brand), info cool gray.

3. Typography Rules

Font Family

  • Display: Tungsten Bold (condensed all-caps display sans). Fallback chain Tungsten-Bold → Bebas Neue → Oswald → Impact → sans-serif.
  • Body: Inter regular at 15px line-height 1.6. Falls back to DIN Pro and system stacks.
  • Mono: JetBrains Mono / IBM Plex Mono in stat blocks and code samples.

Hierarchy

RoleFontSizeWeightLHTrackingNotes
display-heroTungsten1447000.920.01emagent reveal
display-xlTungsten967000.950.01emsection H
display-lgTungsten727001.00.01emfeature heading
h1Tungsten567001.050.005emsub-section
h2Tungsten407001.10.005emcard heading
h3Tungsten287001.150sub-card
h4Tungsten227001.250inline emphasis
eyebrowInter147001.20.18em (UPPER)section labels
body-lgInter184001.550hero subhead
bodyInter154001.60body
body-smInter134001.50secondary
labelInter127001.20.20em (UPPER)tags, agent badges
buttonInter147001.00.16em (UPPER)CTA
button-lgInter167001.00.16em (UPPER)hero CTA

Principles

  • Tungsten condensed for display, no exceptions.
  • Display copy ALL CAPS — eyebrow, hero, section H. Mixed case only on body and dek.
  • Heavy tracking on uppercase: 0.16em on buttons, 0.18em on eyebrows, 0.20em on labels.
  • Never pure white for body. Bone #ece8e1 is warmer; white reserved for max-emphasis display.
  • Tight leading on display: 0.92 hero, 0.95–1.0 elsewhere.
  • Body 15px, not 16px — denser, magazine-like.

4. Component Stylings

Buttons (skewed -6°)

Primary — signal red:

  • bg #ff4655, text #ffffff, font Inter 14px 700 0.16em UPPER
  • padding 14×32, radius 0, transform skew(-6deg), text counter-skewed +6°
  • Hover: bg #ffffff, text #0f1923 (full inversion)
  • Press: bg #d62836
  • Disabled: bg 40% red, text 40% white

Ghost — bordered:

  • bg transparent, text bone, 1px border at 30% bone
  • Same skew
  • Hover: bg bone, text blacksite

Cards

  • bg #1a242e, 0px radius, padding 32
  • 2px solid red #ff4655 top-stripe — the brand’s card signature
  • No drop shadow; on hover, 1px red ring outside card

Pills (agent role badges)

  • bg bg-deep, text bone, 1px border at 15% bone, radius 9999 (only place pills exist)
  • font label (12px 700 0.20em UPPER)

Inputs

  • bg bg-deep, 1px border at 30% bone, 0px radius, padding 12×16
  • Focus: border shifts to #ff4655, no glow ring
  • Label sits above input in eyebrow style
  • 80px sticky header, near-black bg with bottom hairline
  • Logo left (V mark in white), 5-6 items center bone color 0.18em 14px, “PLAY FREE” red skewed CTA right

5. Layout Principles

Spacing

  • Base 4px, scale [0, 4, 8, 12, 16, 20, 24, 32, 40, 56, 72, 96, 128, 160, 200]
  • 96px is the workhorse between sections
  • 200px reserved for hero top-pad

Grid & Container

  • Page max width 1440px (wider than typical SaaS)
  • Hero often full-bleed video, 100vh
  • Agent reveal: image left 60%, copy right 40% (asymmetric on purpose)
  • Stat blocks: 4-up dense grid, 32px gap, no internal borders — only external

Whitespace

  • Density allowed in stat blocks; generous around hero typography
  • Section pads 128–200px on marketing; 56–72px on docs

Section Cadence

  • Alternating bg #0f1923#1a242e ↔ video hero
  • No light sections at all

6. Shapes & Radius Scale

TierValueUse
None0default for buttons, cards, inputs, panels
Micro1hairline-style indicator dots
Standard2rare; only on agent stat sub-cells
Comfortable4tooltip / toast
Relaxed6dropdown menu
Pill9999agent role badges only

The brand commits to 0px on all primary surfaces. 4-6px shows up only on tooltips/dropdowns where rounding aids legibility.

7. Depth & Elevation

LevelTreatmentUse
0nonedefault
11px hairline rulecards, panels
21px red ring outsidehover state
32px solid red top-stripefeatured cards
40 24px 64px rgba(0,0,0,0.80)modal / video lightbox

Shadow Philosophy

The brand rejects soft shadows on UI. Elevation is signaled by rules and rings, not blur. Modals get a heavy black shadow because they’re cinematic, not interface.

8. Interaction & Motion

Easing & duration

  • Standard ease: cubic-bezier(0.65, 0, 0.35, 1) — sharp tactical curve
  • Emphasized ease: cubic-bezier(0.85, 0, 0.15, 1) — weapon-snap
  • Durations: 100ms (hover), 180ms (focus), 260ms (modal, dropdown), 420ms (cinematic, agent reveal)

Per-component

  • Primary CTA hover: bg → bone, text → blacksite, full color inversion in 100ms
  • Card hover: 1px red ring grows from 0 to 1px in 180ms
  • Agent card reveal (scroll): cinematic ease, 420ms, fade + 24px translate
  • Video hero: autoplay loops with first 4s opacity fade-in
  • Cursor on interactive: subtle scale 1.02

Reduced Motion

Honors prefers-reduced-motion: reduce. Skew transforms remain (purely visual brand signal); translate/scale animations replaced with opacity. Video heroes pause and show poster frame.

9. Accessibility & A11y

Contrast

  • bone on bg: #ece8e1 on #0f1923 = 14.2:1 (AAA at body)
  • white on bg: #ffffff on #0f1923 = 17.8:1 (AAA)
  • white on brand: #ffffff on #ff4655 = 4.5:1 (AA at body, AAA at large)

Focus

2px solid #ff4655 ring with 1px outset bg gap (looks like a tactical UI selection).

ARIA & Keyboard

  • Skewed CTAs maintain accessible name from text content (skew is decorative)
  • Video heroes have visible play/pause + prefers-reduced-motion poster fallback
  • Agent stat blocks use semantic table markup with <th scope="row"> for screen readers

Screen Reader

  • Visually all-caps labels are NOT all-caps in HTML (CSS text-transform: uppercase) so screen readers pronounce them as normal words
  • Decorative red top-stripes have aria-hidden
  • Agent ability tooltips announce via aria-describedby

10. Responsive Behavior

BreakpointpxBehavior
mobile0-479hero scales 144→64px; nav collapses to red hamburger
tablet480-7672-col agent grid; stat blocks stack
desktop768-1279full marketing grid; 4-up stat blocks
wide1280-1440identical, larger hero video

Touch Targets

44×44px min on mobile, but skewed buttons get extra horizontal pad to compensate for visual angle.

Per-component

  • Nav → red hamburger at <768px, full-screen overlay menu
  • Agent cards → vertical scroll with snap points on mobile
  • Stat tables → horizontal-scroll containers with red gradient fade on right edge

Image Behavior

  • Hero video: cover, 16:9 aspect with hard 100vh cap
  • Agent portraits: cover, top-aligned, 60vh tall

11. Content & Voice

Tone

Tactical-precise, never effusive. Copy is short, declarative, military-coded. Verbs over adjectives. Headlines often drop subjects (“DEFY THE LIMITS” not “You can defy the limits”).

Microcopy patterns

  • Primary CTA: “PLAY FREE” — never “Sign up” or “Get started”
  • Agent reveal: “REVEALED: — always uppercase, colon-anchored
  • Lobby: “AGENT SELECT”, “ROUND 1” — magazine all-caps
  • Errors: “CONNECTION TERMINATED”, “AGENT UNAVAILABLE”
  • Loading: “INITIALIZING” — never “Please wait”

Empty states

The brand mostly avoids empty states by replacing them with 0-stat displays (0 wins, 0 deaths, 0 elims). When unavoidable: “NO MATCHES YET — DEPLOY TO FIND ONE”.

CTA verb conventions

  • PLAY (game entry, lobby, queue)
  • DEPLOY (training, range)
  • VIEW (agent, weapon, map detail)
  • REVEAL (cinematic / story)
  • Avoid: “Learn”, “Discover”, “Explore” — too soft

12. Dark Mode & Theming

Dark-only. The brand has no light mode. Marketing site, in-game UI, and Riot Account interfaces all use the same #0f1923 base.

If a partner integration requires light mode (e.g. embedded press kit), invert: bg → bone, text → blacksite, brand red unchanged. Skew, hard corners, Tungsten remain.

13. Lineage & Influences

Valorant’s brand language emerged in 2020 as Riot positioned the title as the tactical-shooter answer to Counter-Strike: Global Offensive. Where CS:GO leaned military-utility, Valorant leaned magazine-editorial. Hoefler & Co’s Tungsten — drawn for Esquire and Sports Illustrated — became the display face. The signal-red #ff4655 was tuned in-house to read on dark canvas without glow at 5+ meters (the assumed esports stage distance).

The site rejects the rounded-edtech instinct of mainstream gaming sites (PlayStation, Xbox web feels comparatively soft). Hard corners, hairline rules, all-caps display, 0.16–0.20em tracking on labels read like a Wired feature, not a marketing page. The skewed CTA is Riot’s signature interaction trick — also visible on League of Legends (different colors) and Project L.

Named influences:

  • Tungsten by Hoefler & Co (typography.com)
  • Counter-Strike (Valve) — tactical-shooter UI legacy
  • Wired (US edition) — magazine layout instincts
  • Tactical military typography — all-caps + extended tracking on agent code-names
  • Riot League of Legends — in-house Riot brand language

14. Do’s and Don’ts

Do

  • Use Tungsten Bold for every display. No Helvetica Compressed substitute.
  • Skew CTAs -6° with text counter-skewed +6° to read straight.
  • Commit to 0px radius on buttons, cards, inputs.
  • Use Bone #ece8e1 for body, not pure white.
  • Track uppercase aggressively (0.16em buttons, 0.18em eyebrows, 0.20em labels).
  • Cards get a 2px red top-stripe, not a shadow.
  • Use red #ff4655 exclusively for primary CTA + brand mark.
  • Hero typography goes huge (96–144px). Don’t scale below 64px on hero, even mobile.

Don’t

  • Don’t round corners. 0px is the rule; 4-6px on dropdowns is the only exception.
  • Don’t use rounded sans-serif for display. Tungsten Bold or nothing.
  • Don’t add gradients on CTAs, headers, or cards.
  • Don’t add drop-shadow blur on UI. Hairlines and rings only.
  • Don’t make body 16px. 15px is the brand’s beat.
  • Don’t substitute red. #ff4655 is the brand red — not Tailwind red, not #dc2626.
  • Don’t write friendly microcopy. “Welcome back!” is off-brand. “DEPLOYED” is on-brand.
  • Don’t add a light mode without explicit Riot brand approval.

15. Agent Prompt Guide

Quick Color Reference

  • bg (blacksite): #0f1923
  • bg-deep (surface): #1a242e
  • text (bone): #ece8e1
  • text-strong (white): #ffffff
  • brand (signal red): #ff4655 / pressed #d62836
  • border (15% bone): rgba(236, 232, 225, 0.15)

Example Component Prompts

Build a Valorant-style hero: 100vh full-bleed video bg, near-black overlay scrim, 144px Tungsten Bold heading “DEFY THE LIMITS” all-caps tracked 0.01em in pure white, 18px Inter dek in #ece8e1. Skewed -6° red CTA “PLAY FREE” 14px Inter 700 0.16em UPPER. 200px top pad.

Design an agent reveal card: #1a242e surface, 0px radius, 32px pad, 2px red top-stripe #ff4655. 96px Tungsten codename ALL-CAPS, 12px label eyebrow “DUELIST” in #ff4655. 4-up ability stats below in mono.

Render a stat block: 4 columns, no internal borders, each cell labelled in 12px Inter 700 0.20em UPPER bone-soft, value in 56px Tungsten Bold pure white. 1px hairline divider top + bottom.

Build a tactical button: 0px radius, signal-red bg, white text 14px Inter 700 0.16em uppercase “DEPLOY”, padding 14×32, transformed skew(-6deg) with text inner-counter skew(6deg). Hover inverts colors fully.

Design a tooltip: 4px radius (only place corners aren’t 0), bg-deep, 1px bone-15% border, 13px Inter body, 12×16 padding. No arrow.

Iteration Guide

  1. Start with Tungsten and 0px corners.
  2. Skew every primary CTA. -6° transform is the brand’s signature.
  3. Track uppercase 0.16em+. Eyebrows go 0.18-0.20em.
  4. Use red sparingly. One CTA per fold, one accent stripe per card.
  5. Bone, not white. Body in #ece8e1; reserve #ffffff for max-emphasis display.
  6. Hairlines beat shadows. 1px rules and 1-2px stripes; avoid box-shadow: blur > 0 on UI.
  7. Density is OK in stat blocks, generous around hero.
  8. Reject roundness. If it feels Discord-friendly, you’re off-brand.
Ship with this

Drop valorant into your project, then ship the actual sections in an afternoon.

1 · install design
npx @webdesignhot/design-md add valorant
2 · ship landing page
npx agentkit init --design valorant
How AgentKit reads DESIGN.md