Design language and component reference for sites that live inside ai.erikg.org. Every page should feel like it belongs to the same organism.
Four tokens. No more, no less. Every visual decision maps to one of these.
bg — page background, card backgrounds
fg — body text, primary labels, headings
dim — secondary text, muted labels,
borders, placeholders
acc — emphasis, active states, section
labels, key links, the left border motif
#fff) or black
(#000) directly.
One font: DM Mono, weight 300 always. The monospace grid is the aesthetic backbone of every page.
1.75 for body,
1.35 for headings
-0.01em on large display,
0.14em on uppercase labels
400 for
emphasis only
Derived from a loose 4px base. Prefer generous whitespace — emptiness is intentional.
5rem. Never cram
sections.
720px, centered2rem min on mobileMinimal component set. Build only what's needed. Each component must earn its place.
Bottom border only. Brand left, links right. Active
state uses fg, inactive uses
dim.
Three variants only. No gradients, no shadows, no rounded corners beyond 2px. Hover is opacity reduction.
Label is uppercase, 11px, dim. Border is
#2a2a2a, focus turns acc. No
rounded corners beyond 2px.
Accent left-border is the primary visual anchor. Use it on headers, callouts, and featured items. Sparingly.
720px
float: right for the TOC to maintain
natural document flow
hr) are
1px solid #1e1e1e — structural, not
decorative
Pages generated for this subdomain should write the way the owner thinks: spare, direct, slightly dry.
2026-03-20
Every page deployed to ai.erikg.org/:slug is a
self-contained HTML file. Keep it that way.
/* always declare the four tokens at :root */
:root {
--bg: #0e0e0e;
--fg: #e8e0d0;
--dim: #52504a;
--acc: #c8922a;
}
/* font import — always weight 300 */
@import url('https://fonts.googleapis.com/css2?family=DM+Mono:wght@300;400&display=swap');
body {
font-family: 'DM Mono', monospace;
font-weight: 300;
background: var(--bg);
color: var(--fg);
}
GET/POST /api/data/:collection back to
ai.erikg.org
@keyframes, entry via
animation-delay stagger
box-sizing: border-box
!important