Design system Back to the site
EOTAK design system

Style guide

Tokens, type, controls and motion for eotak.com. Switch the theme in the nav and every swatch, ratio and specimen below re-reads itself.

Theme · dark (default)Theme · light
01

Color tokens

Contrast is measured, not judged. Ratios are against --bg unless noted. Copper #8E654C is a light-background color: on dark it is legal for fills, rules and text at 24px or above, and small copper text uses the lightened --accent-txt instead.

--bg
#0B0A0A#F4F1EA
Ground · body text on it 17.91:115.95:1
--bg2
#141313#FBF9F4
Raised · body text on it 16.80:117.10:1
--bg3
#1A1919#E9E5DA
Sunken · body text on it 15.89:114.29:1
--fg
#F6F3F2#14171A
Body 17.91:115.95:1 · AAA
--fg2
#BEBBBA#4A4F55
Secondary 10.36:17.33:1 · AAA
--fg3
#8C8683#5F6469
Faint 5.51:15.30:1 · AA
--dim
#6E6764#63686D
3.57:14.99:1 · decorative meta only, never body
--accent
#8E654C
3.88:14.52:1 · fills, rules, ≥24px text
--accent-txt
#BE8B6B#6B4A34
Small accent text 6.68:17.01:1 · AAA
Aa
--accent-fg
#FFF6F0
On the copper fill 4.78:1 · AA
--focus
#D9A88A#6B4A34
Ring 9.34:17.01:1 · ≥3:1 on --bg and --bg2
--line / --line2
rgba(255,255,255,.09 / .16)#C7C2B6 / #8F8879
Hairline and structural rule · non-text
02

Type scale

Two faces. Inter carries display and body. Space Grotesk carries every eyebrow, label, caption and figure, the role a monospace used to hold. It is a proportional grotesque, so anywhere digits have to line up in a column (prices, stat rails, key/value pairs, the swatch ratios above) the rule is font-variant-numeric: tabular-nums, which is baked into .mono, .price, .kv .v and the rail labels rather than left to the author.

.h-huge
Inter 800
clamp(40px,5.6vw,80px)
tracking -.042em
Stand up
.h-big
Inter 800
clamp(34px,6.4vw,86px)
Replay the day
.h-lg
Inter 800
clamp(34px,3.6vw,48px)
Three plans, no setup fee
.h-md
Inter 800
clamp(26px,2.4vw,34px)
Section heading
.lede
Inter 350
19px / 1.55
EOTAK Servers are hosted, patched and yours to administer from the first minute.
body
Inter 400
15px / 1.62
Managed TAK servers on DigitalOcean and AWS GovCloud. MARS after-action replay is included on every plan.
.eyebrow
Space Grotesk 500
11px · .24em · caps
Managed TAK server hosting
.mono label
Space Grotesk 400
10.5px · .2em · caps
tabular-nums
Weapon sensor → ATAK → EOTAK Server
.price
Inter 800
tabular-nums
$162.00
PER USER / YEAR
$10,800.00
PER SERVER / YEAR
03

Buttons and states

One filled copper action per viewport. Scarcity is what makes the accent read. Everything else is .btn2. Hover lifts 1px, active returns it. The focus ring is --focus at 2px with a 3px offset and is never removed.

.btn · restGet a server
.btn · focusGet a server
.btn · disabledGet a server
.btn2 · restSee pricing
.btn2 · focusSee pricing
.btn.btn-sm · navGet a server
04

Pricing figures

EOTAK Servers are one plan on a graduated volume rate card, sold by the year, plus a flat compliance addon. The rate card table is the primitive that carries it: .rate-scroll wraps .rate so wide tables scroll inside their own box instead of widening the document, the row header is the seat threshold, and every figure is tabular. The middle column is the effective rate — the graduated total divided by the seat count — never a single band’s marginal rate.

Specimen · per user, per year · USD
SeatsEffective rateAnnual total
10$120.00$1,200.00
25$92.40$2,310.00
50$90.00$4,500.00

The pricing toggle is a display unit, not a discount: the same money shown two ways, with the monthly figure being the annual figure divided by twelve. It never carries a savings badge. No production page ships it at the moment, because EOTAK Servers are billed annually and there is no second way to show that money — it stays documented, and in core.css and site.js, for the next thing that is priced two ways. Markup: a wrapper with data-pricing, buttons with data-mode="month" / "year", and each figure in a <span data-m data-y> with its unit label in a [data-per-m][data-per-y]. This one is live. Press it.

$13.50
PER USER / MONTH
$900.00
PER SERVER / MONTH
05

Spacing scale

A ten-step scale. Components use the steps; page rhythm uses clamp() between them so the vertical measure breathes with the viewport instead of stepping. Page gutter is --sp7, dropping to --sp5 below 1100px. Corner radius: --r-sm 10px, --r-md 14px, --r-lg 18px.

--sp14px
--sp28px
--sp312px
--sp416px
--sp524px
--sp632px
--sp748px
--sp864px
--sp996px
--sp10128px
06

Motion tokens

Enters are slower than exits, always. prefers-reduced-motion yields a fully static page: reveals resolve instantly, the contour field freezes on a fixed frame rather than disappearing, and the bar below stops. The field also pauses whenever it scrolls out of view, and device pixel ratio is capped at 1.6.

--e-out
cubic-bezier(.16, 1, .30, 1). The only easing on the page.
--d-hover · 140ms
Color, border and lift on hover.
--d-in · 220ms
Menus, the navigation panel, anything arriving.
--d-out · 150ms
Anything leaving. Shorter than the entry.
.rv · 8px / 180ms
Scroll reveal. Fires once, never above the fold. At this size it reads as the page settling.
Ambient · contour field
The hero terrain drifts because the product is maps. It demonstrates rather than decorates.
EOTAK design system · both themes carry every token · Distribution Statement A: approved for public release; distribution is unlimited