Hex & Throne
Remix this template to create a similar design — same sections, layout, animations, colors, and typography.
An app for a digital strategy board game. Dark shadow-charcoal canvas, ember-orange with moss-green and sea-blue accents, VT323 pixel and Inter type.
Palette
Typography
20px
13px
10px
10px
Spacing & Shape
| Token | Value | Preview |
|---|---|---|
| xs | 4px | |
| sm | 8px | |
| md | 12px | |
| lg | 16px | |
| xl | 24px |
Border Radius
| Token | Value | Preview |
|---|---|---|
| none | 0px | |
| sm | 3px | |
| md | 6px | |
| full | 9999px |
design.md
tokens (raw)
name: hex-throne-design
version: alpha
description: >
A pixel-art tactics game client rendered in dark "shadow" charcoals with a warm
bone foreground and three faction "voltages" — ember orange, moss green, and sea
blue. The signature moves are dithered pixel terrain tiles, CRT scanline overlays,
chunky inset-bevel buttons that physically squish, and a parchment-skinned rulebook
modal that inverts the whole palette. Typography pairs a blocky bitmap display face
(VT323) with a clean Inter UI body and a JetBrains Mono micro-label face. Geometry
is deliberately hard-edged — near-zero radius everywhere, pixelated rendering, and
a fixed three-column campaign cockpit (chat rail · board · unit rail).
colors:
# Brand / Faction voltages
ember: '#E25822' # primary accent — turn/action highlights, ember faction, CTAs
moss: '#4F7942' # moss faction, health pips, heal action, positive deltas
sea: '#2072AF' # sea faction, voice/active glow, move action, "me" chat bubble
ember-deep: '#8a3416' # ember tile shadow / darker fill in sprites & gradients
ember-glow: '#ffae5e' # ember highlight in gradients (button shine, progress fill)
# Surface (the "shadow" stack)
page: '#0d0d0c' # app background, deepest surface
board-bg: '#0a0a09' # board frame inner fill
topbar: '#111110' # header bar / --shadow
rail: '#101010' # left & right sidebars
card: '#161614' # chrome-card base / panel fill
input: '#1b1b1a' # chat input + bubble-them surfaces
inset: '#1a1a18' # avatar wells, dim surfaces, progress track, kbd
spent: '#2a2a26' # dimmed/spent pips, timeline dots, scrollbar thumb
parchment: '#E3DAC9' # rulebook modal surface (palette inversion) / --bone
parchment-dim: '#d6cab3' # rulebook secondary panels
# Text
bone: '#E3DAC9' # primary foreground / headings on dark / --bone
bone-dim: '#a39e90' # secondary body text / --bone-dim
muted: '#7a7468' # tertiary labels, captions, tags
ink: '#1B1B1B' # text on parchment (rulebook)
ink-soft: '#2a2a26' # body text on parchment
parchment-label: '#7a6a4a' # muted labels on parchment
# Hairlines
hairline: 'rgba(227,218,201,.08)' # divider / chrome-card border / board halo
hairline-12: 'rgba(227,218,201,.12)' # dock border, slightly brighter rules
# Gradient / Glow (approx)
ember-grad: 'linear-gradient(180deg,#E25822 0%,#b53e12 100%)' # btn-ember fill
moss-grad: 'linear-gradient(180deg,#5f8e51 0%,#3a5d2f 100%)' # btn-moss fill
sea-grad: 'linear-gradient(180deg,#2d8bce 0%,#1a578a 100%)' # btn-sea fill
typography:
display:
fontFamily: "'VT323', monospace"
fontSize: 20px # ranges 14px–42px across UI; 42px in rulebook title
fontWeight: 400
lineHeight: 1
letterSpacing: 0.02em
body:
fontFamily: "'Inter', sans-serif"
fontSize: 13px
fontWeight: 400
lineHeight: 1.4
tag:
fontFamily: "'JetBrains Mono', monospace"
fontSize: 10px
fontWeight: 400
letterSpacing: 0.08em
textTransform: uppercase
mono:
fontFamily: "'JetBrains Mono', monospace"
fontSize: 10px
fontWeight: 400
rounded: # near-brutalist pixel geometry — mostly sharp
none: 0px
sm: 3px # rounded-sm / kbd / scrollbar thumb
md: 6px # dock / rounded-md
full: 9999px # avatars, status dots, timeline dots, progress
spacing: # 4px base unit (Tailwind scale)
xs: 4px
sm: 8px
md: 12px
lg: 16px
xl: 24px
components:
buttonPrimary: # btn-ember
background: '{colors.ember-grad}'
textColor: '#ffffff'
typography: '{typography.tag}'
rounded: '{rounded.sm}'
padding: '8px 12px'
border: '1px solid #2a0e04'
shadow: 'inset 0 1px 0 rgba(255,255,255,.25), inset 0 -2px 0 rgba(0,0,0,.35), 0 2px 0 #5a1e08'
buttonMoss:
background: '{colors.moss-grad}'
textColor: '#ffffff'
rounded: '{rounded.sm}'
border: '1px solid #142109'
shadow: 'inset 0 1px 0 rgba(255,255,255,.2), inset 0 -2px 0 rgba(0,0,0,.35), 0 2px 0 #1e3017'
buttonSea:
background: '{colors.sea-grad}'
textColor: '#ffffff'
rounded: '{rounded.sm}'
border: '1px solid #061b30'
shadow: 'inset 0 1px 0 rgba(255,255,255,.2), inset 0 -2px 0 rgba(0,0,0,.35), 0 2px 0 #0c3354'
chromeCard:
background: '{colors.card}'
textColor: '{colors.bone}'
border: '1px solid {colors.hairline}'
rounded: '{rounded.sm}'
padding: '12px'
chatInput:
background: '{colors.input}'
textColor: '{colors.bone}'
border: '1px solid rgba(227,218,201,.1)'
rounded: '{rounded.sm}'
padding: '0 12px'
focusBorder: '{colors.sea}'
tile:
aspectRatio: '1'
border: '1px solid rgba(0,0,0,.35)'
shadow: 'inset 0 -3px 0 rgba(0,0,0,.25), inset 0 1px 0 rgba(255,255,255,.04)'
note: 'dithered terrain via layered linear/radial gradients; image-rendering: pixelated'
dock:
background: 'rgba(22,22,20,.92)'
backdropFilter: 'blur(10px)'
border: '1px solid {colors.hairline-12}'
rounded: '{rounded.md}'
shadow: '0 20px 40px rgba(0,0,0,.6), 0 0 0 1px rgba(0,0,0,.5)'
hpPip:
background: '{colors.moss}'
size: '10px'
shadow: 'inset 0 -2px 0 rgba(0,0,0,.4), 0 0 0 1px #000'
apPip:
background: '{colors.ember}'
size: '14px'
shadow: 'inset 0 1px 0 rgba(255,255,255,.3), inset 0 -2px 0 rgba(0,0,0,.4), 0 0 0 1px #000'
kbd:
background: '{colors.inset}'
textColor: '{colors.bone-dim}'
typography: '{typography.mono}'
border: '1px solid {colors.spent}'
rounded: '{rounded.sm}'
padding: '2px 5px'
bubbleMe:
background: '{colors.sea}'
textColor: '#ffffff'
rounded: '{rounded.sm}'
bubbleThem:
background: '#1f1f1d'
textColor: '{colors.bone}'
border: '1px solid rgba(227,218,201,.06)'
rounded: '{rounded.sm}'
rulebookModal:
background: '{colors.parchment}'
textColor: '{colors.ink}'
border: '1px solid rgba(0,0,0,.2)'
overlay: 'rgba(8,8,7,.78) + backdrop-filter: blur(8px)'
motion:
gridEntry: 'anime.js — tiles fade in (opacity 0→1) + translateY -12→0, staggered by row/col, 500ms ease out(3)'
buttonSquish: 'anime.js — scale to 0.94 on pointerdown, back to 1 on pointerup (100/300ms); CSS :active also nudges translateY(2px) and flattens bevel'
selRing: 'CSS blink — opacity 1↔.35, 1.4s steps(2) infinite'
targetDot: 'CSS pulse — scale 1↔1.3 + opacity, 1s ease-in-out infinite'
voiceBars: 'CSS vol — height 3px↔12px, 1s ease-in-out, staggered .15s per bar'
rulebookOpen: 'anime.js — overlay fade 200ms + panel opacity/scale .92→1 over 280ms'
dockEntry: 'GSAP — fade + y 24→0, 0.6s power3.out, delay 0.5s; header fade + y -12→0'
icons:
library: Tabler icons-webfont (ti) + game-icons (lorc/delapouite SVGs) + inline pixel SVG sprites + OpenMoji
style: outline (Tabler), pixel-art (inline SVG units), flat color (OpenMoji)
sizes: { sm: 14px, base: 16px, lg: 20px }
color: '{colors.bone}'Hex Throne
hex-throne-design · alpha
Design spec — version alpha. Source: static HTML (
index.html); tokens read from inline styles + class rules. Fictional/sample product; described factually.
Overview
Hex Throne is a pixel-art tactics game client — a full-screen campaign cockpit dressed
in deep "shadow" charcoals (#0d0d0c page, #101010 rails, #161614 cards) with a
warm bone foreground (#E3DAC9). Three faction voltages drive the whole interface:
ember orange #E25822 (the primary accent — your turn, CTAs, action points),
moss green #4F7942 (health, healing), and sea blue #2072AF (voice activity,
movement, your own chat bubbles). The signature moves are unapologetically retro:
terrain tiles are painted with layered dithered gradients and image-rendering: pixelated,
a CRT scanline overlay sits on the board, faction buttons are chunky 3D inset-bevel
slabs that physically squish on press, and player units are tiny hand-built pixel SVG
sprites. The type story pairs VT323, a blocky bitmap display face used for every
name and number, with Inter for readable UI body and JetBrains Mono for uppercase
micro-tags. Geometry is near-brutalist — radii top out at 6px, most corners are
perfectly square, and even the rounded avatars feel pixel-snapped. The one dramatic
inversion is the rulebook modal: it flips to a parchment surface (#E3DAC9 ground,
#1B1B1B ink) like an in-world manual page.
Colors
Brand / Faction voltages. ember #E25822 is the dominant accent — turn indicators,
the primary btn-ember CTA, action-point pips, "EMBER PHASE" labels, and the active
timeline node. moss #4F7942 carries health pips, the heal action, and positive HP
deltas. sea #2072AF signals voice/active state (the glow-sea ring), the move
action, and the player's own chat bubble. Supporting ember tones include ember-deep
#8a3416 (tile/sprite shadow) and ember-glow #ffae5e (gradient shine, progress fill).
Surface (the shadow stack). A tight ladder of charcoals: page #0d0d0c (app bg),
board-bg #0a0a09 (board frame), topbar #111110, rail #101010 (both sidebars),
card #161614 (chrome-card), input #1b1b1a, inset #1a1a18 (wells, progress
track, kbd), and spent #2a2a26 (dimmed pips, timeline dots, scrollbar). The rulebook
inverts to parchment #E3DAC9 / parchment-dim #d6cab3.
Text. bone #E3DAC9 is primary foreground and all VT323 headings; bone-dim
#a39e90 is secondary body; muted #7a7468 is tertiary tags and captions. On
parchment: ink #1B1B1B, ink-soft #2a2a26, and parchment-label #7a6a4a.
Hairlines. Dividers and card borders are translucent bone: hairline
rgba(227,218,201,.08); the dock uses a slightly brighter hairline-12
rgba(227,218,201,.12). Many bevels also use pure-black rgba(0,0,0,.35) insets.
Gradient / Glow. Faction buttons use vertical two-stop gradients (ember-grad,
moss-grad, sea-grad). Status glows are colored box-shadows (glow-sea, ember turn
markers). The board background is a faint radial wash of ember + sea over near-black.
Typography
Three faces, all from Google Fonts. VT323 is the bitmap display face — a single-weight
monospace pixel font used for every name, stat number, and headline, with letter-spacing:.02em.
It scales from ~14px in lists up to 42px in the rulebook title. Inter (300–700) is the
clean UI body. JetBrains Mono (400/500) serves the .tag micro-label style (10px,
letter-spacing:.08em, uppercase) and the .mono timecodes. If VT323 is unavailable,
substitute another bitmap face such as "Silkscreen" or "Pixelify Sans".
| Token | Size | Weight | Line-height | Tracking | Usage |
|---|---|---|---|---|---|
| display (VT323) | 20px (14–42px) | 400 | 1 | .02em | names, stats, headings, titles |
| body (Inter) | 13px | 400 | 1.4 | — | chat, descriptions, UI text |
| tag (JetBrains Mono) | 10px | 400 | — | .08em | uppercase labels, captions, kbd |
| mono (JetBrains Mono) | 10px | 400 | — | — | replay timecodes |
Layout
Base unit is 4px (Tailwind scale). The page is a fixed cockpit: a 48px top bar over a
three-column CSS grid 300px 1fr 340px filling calc(100vh - 48px). Left rail —
chat/voice/table tabs, a compact voice roster, a scrolling chat log, and an input row.
Center — a board-wrap holding a 12×8 board-grid (2px gaps, aspect-ratio:1 tiles)
inside a framed, scanlined container with decorative pixel corner brackets, plus absolutely
positioned overlays (turn banner top-center, coordinate chip top-left, minimap top-right,
legend below). Right rail — active-player banner, HP/shard/gold and action-economy pips,
a vertical initiative timeline, and a selected-unit card with action grid and tile-effect
note. A floating 640px replay dock is fixed bottom-center, and a full-screen rulebook
modal overlays everything. Whitespace is dense and information-rich, befitting a game HUD.
Elevation & Depth
Depth is built from inset pixel bevels, not soft shadows. Tiles, pips, and buttons all
use paired inset shadows — a light top edge inset 0 1px 0 rgba(255,255,255,.x) and a dark
bottom edge inset 0 -2px/-3px 0 rgba(0,0,0,.x) — to read as raised pixel blocks. Buttons
add a hard offset drop 0 2px 0 <dark> that collapses on :active (the slab "presses
down"). The board floats on a big soft shadow 0 30px 80px rgba(0,0,0,.6) plus a bone halo.
The dock is the one glass element: rgba(22,22,20,.92) + backdrop-filter: blur(10px).
Glows are colored box-shadows — glow-sea (active speaker), ember turn nodes, status dots.
Shapes
Aggressively hard-edged. The radius scale is none (0), sm (3px, rounded-sm cards,
buttons, kbd, scrollbar), md (6px, only the dock), and full (9999px, avatars, status
dots, timeline dots, progress bar/handle). Everything structural — tiles, pips, panels,
banners, the rulebook — is square or barely-softened, reinforcing the pixel-grid aesthetic.
Components
- buttonPrimary (
btn-ember) — ember vertical gradient, white VT323/tag text, 3px radius,8px 12pxpad, dark border#2a0e04, inset bevel +0 2px 0 #5a1e08drop. Labels: "END TURN", "ATTACK". - buttonMoss / buttonSea — same slab construction in moss and sea gradients; "HEAL", "MOVE".
- chromeCard —
#161614(with faint top-light gradient),1pxbone-.08border, 3px radius, 12px pad. Used for panels, secondary buttons ("SAVE", "SETTINGS", "GUARD"), info cards. - tile — square dithered terrain (moss/sea/ember/stone/sand/fog variants), 1px black border,
inset bevel,
image-rendering: pixelated; carries pieces, move-dots, target-dots, sel-rings. - dock — glass replay bar, 6px radius,
blur(10px), deep drop shadow; holds transport buttons, a gradient progress track with colored turn markers and a bone handle, and a speed<select>. - hpPip / apPip — small beveled squares (10px moss health, 14px ember action); dim variant
#2a2a26. - chatInput —
#1b1b1afill, bone-.1border, sea focus border, 3px radius, 36px tall. - bubbleMe / bubbleThem — chat bubbles: sea fill (you) vs
#1f1f1dbordered (others). - kbd — inset key cap
#1a1a18, double-bottom border#2a2a26, mono 10px (/roll,SPACE,E). - rulebookModal — palette-inverted parchment panel, split illustration/text, dark overlay + blur.
Motion
Driven by anime.js and GSAP (with Tailwind v4 browser build). Board tiles stagger in
on load (fade + 12px rise, 500ms out(3), delay computed per row/column). Faction buttons squish
to scale 0.94 on pointerdown and spring back (anime.js), reinforced by a CSS :active
translateY(2px) bevel flatten. Continuous CSS loops: blink selection ring (1.4s steps),
pulse target dot (1s), vol voice bars (1s, staggered). The rulebook fades in with a panel
scale 0.92→1 (280ms). On entry, GSAP fades the dock up (y 24→0, delay 0.5s) and drops the header in.
Iconography
Mixed, fitting a game client. Tabler icons-webfont (<i class="ti ...">, outline, ~14–20px)
for all UI affordances — help, mic, send, transport controls, refresh, shield, flame, info.
game-icons (lorc sword-hilt, delapouite magic-potion) as white-filtered SVGs on action
buttons. Inline pixel SVGs (shape-rendering: crispEdges) hand-draw unit sprites and the
rulebook illustration. OpenMoji color SVGs supply the otter creature avatar. Default UI icon
color is bone #E3DAC9, dimming to #7a7468 for idle states, tinting ember/sea/moss for status.
Do's and Don'ts
- Do keep every name and number in VT323 and every uppercase micro-label in JetBrains Mono.
- Do build depth from inset pixel bevels and hard offset shadows, not blur.
- Do reserve ember for "now/yours/action", moss for health/heal, sea for movement/voice.
- Do keep
image-rendering: pixelatedon tiles, sprites, and any scaled pixel art. - Don't introduce large radii or soft floating cards — corners stay sharp (≤6px).
- Don't add full-color photographic surfaces to the dark UI; the only "warm" surface is the parchment rulebook.
- Don't let body text drift off the bone/bone-dim/muted ladder, or mix faction colors arbitrarily.
Known Gaps
- VT323 display sizes vary contextually (14px in rosters up to 42px rulebook title); the token records a representative 20px and notes the range.
- Terrain tile fills are layered dithered gradients (multiple linear/radial stacks); the spec names base colors and the technique rather than reproducing every gradient stop.
- Button gradient end-stops (
#b53e12,#3a5d2f,#1a578a) and bevel shadow colors are read directly from CSS and recorded on the component, not promoted to standalone color tokens. - Unit/illustration colors inside inline pixel SVGs reuse the faction/bone palette and are not separately tokenized.