coulomb-social/docs/design-extract/coulomb-social.brand.html
tegwick 6fe263444a Extract authenticated coulomb.social design language via designlang
Session probe lands on /vw_pages (Research). Use main designlang extract
with --cookie-file — pack ignores auth. 39 artifacts under
docs/design-extract; tolerate designlang late summary crash when cores exist.
2026-08-09 01:31:00 +02:00

795 lines
No EOL
38 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>coulomb.social · brand guidelines</title>
<meta name="description" content="Design-system documentation for coulomb.social: colour, type, spacing, motion, voice, accessibility, components, and drop-in tokens.">
<meta property="og:title" content="coulomb.social · brand guidelines">
<meta property="og:description" content="Design-system documentation for coulomb.social: colour, type, spacing, motion, voice, accessibility, components, and drop-in tokens.">
<meta property="og:type" content="article">
<meta name="twitter:card" content="summary_large_image">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Instrument%20Serif&family=Inter:wght@400;500;600&family=JetBrains%20Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root {
--paper: #f6f3ec;
--paper-2: #efebe1;
--ink: #131313;
--ink-soft: #555048;
--ink-faint: #8a8579;
--rule: #e0dccf;
--accent: #d08728;
--display: 'Instrument Serif', 'Times New Roman', serif;
--body: 'Inter', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
--mono: 'JetBrains Mono', ui-monospace, 'SF Mono', monospace;
}
[data-theme="dark"] {
--paper: #0d0c0a;
--paper-2: #15140f;
--ink: #ece8de;
--ink-soft: #9d978a;
--ink-faint: #5b574e;
--rule: #292621;
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
html, body { margin: 0; padding: 0; }
body {
background: var(--paper);
color: var(--ink);
font-family: var(--body);
font-size: 16px;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
transition: background .25s, color .25s;
}
a { color: var(--ink); text-decoration: none; border-bottom: 1px solid var(--rule); padding-bottom: 1px; }
a:hover { border-color: var(--ink); }
code { font-family: var(--mono); font-size: 0.92em; }
.muted { color: var(--ink-soft); }
.summary { font-family: var(--mono); font-size: 12px; letter-spacing: .04em; color: var(--ink-faint); margin: 0 0 32px; padding-bottom: 14px; border-bottom: 1px solid var(--rule); }
.wrap { max-width: 880px; margin: 0 auto; padding: 0 0 96px; }
/* — Top bar — */
.topbar { display: flex; justify-content: space-between; align-items: center; padding: 24px 40px; font-size: 13px; border-bottom: 1px solid var(--rule); }
.brand { font-family: var(--display); font-size: 22px; }
.brand a { color: var(--ink); text-decoration: none; border-bottom: 0; }
.topbar nav { display: flex; gap: 18px; align-items: center; color: var(--ink-soft); }
.theme-btn { background: transparent; border: 1px solid var(--rule); color: var(--ink-soft); font-size: 11px; padding: 6px 12px; border-radius: 999px; cursor: pointer; letter-spacing: .12em; text-transform: uppercase; font-family: var(--body); }
.theme-btn:hover { color: var(--ink); border-color: var(--ink); }
/* — Cover — */
.cover { padding: 0; border-bottom: 1px solid var(--rule); }
.cover-band {
height: clamp(180px, 28vw, 320px);
display: flex;
align-items: flex-end;
justify-content: space-between;
padding: 32px 40px;
}
.cover-band-label {
font-family: var(--mono);
font-size: 11px;
text-transform: uppercase;
letter-spacing: .18em;
opacity: 0.78;
}
.cover-band-hex code { font-family: var(--mono); font-size: 13px; opacity: 0.9; }
.cover-body { padding: 56px 40px 64px; }
.kicker { font-family: var(--mono); text-transform: uppercase; letter-spacing: .18em; font-size: 11px; color: var(--ink-soft); margin: 0 0 18px; }
.cover-title {
font-family: var(--display);
font-weight: 400;
font-size: clamp(56px, 11vw, 132px);
line-height: .94;
letter-spacing: -.02em;
margin: 0 0 24px;
}
.cover-sub { font-size: 19px; line-height: 1.5; color: var(--ink-soft); max-width: 60ch; margin: 0 0 36px; }
.cover-meta { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 22px 32px; padding: 28px 0 0; border-top: 1px solid var(--rule); margin: 0; }
.cover-meta dt { font-family: var(--mono); font-size: 10px; text-transform: uppercase; letter-spacing: .14em; color: var(--ink-faint); margin-bottom: 4px; }
.cover-meta dd { margin: 0; font-size: 15px; }
/* — TOC — */
.toc { padding: 56px 40px; border-bottom: 1px solid var(--rule); background: var(--paper-2); }
.toc-title { font-family: var(--display); font-weight: 400; font-size: 28px; margin: 0 0 24px; }
.toc ol { list-style: none; padding: 0; margin: 0; columns: 2; column-gap: 48px; }
@media (max-width: 640px) { .toc ol { columns: 1; } .toc, .topbar, .cover-band, .cover-body { padding-left: 22px; padding-right: 22px; } }
.toc li { padding: 10px 0; border-top: 1px solid var(--rule); break-inside: avoid; }
.toc li:last-child { border-bottom: 1px solid var(--rule); }
.toc a { display: flex; gap: 14px; align-items: baseline; border: 0; }
.toc-num { font-family: var(--mono); font-size: 11px; color: var(--ink-faint); width: 26px; }
.toc-label { font-family: var(--display); font-size: 18px; }
/* — Sections — */
section { padding: 72px 40px; border-bottom: 1px solid var(--rule); }
section:last-of-type { border-bottom: 0; }
@media (max-width: 640px) { section { padding: 48px 22px; } }
.chapter-header { padding-bottom: 18px; margin-bottom: 28px; border-bottom: 1px solid var(--rule); }
.sec-num { font-family: var(--mono); font-size: 11px; letter-spacing: .14em; color: var(--ink-faint); text-transform: uppercase; display: block; margin-bottom: 10px; }
section h2 { font-family: var(--display); font-weight: 400; font-size: clamp(36px, 4.5vw, 56px); line-height: 1.04; letter-spacing: -.005em; margin: 0; }
.sub { font-family: var(--display); font-weight: 400; font-size: 22px; margin: 36px 0 14px; }
/* — Meta grid — */
.meta-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 18px 32px; padding: 0; margin: 0 0 24px; }
.meta-grid > div { padding: 0; }
.meta-grid dt { font-family: var(--mono); font-size: 10px; text-transform: uppercase; letter-spacing: .12em; color: var(--ink-faint); margin-bottom: 4px; }
.meta-grid dd { margin: 0; font-size: 15px; }
/* — Color section — */
.brand-grid { display: grid; gap: 20px; margin: 0 0 28px; }
.brand-grid-pair { grid-template-columns: 1fr 1fr; }
@media (max-width: 640px) { .brand-grid-pair { grid-template-columns: 1fr; } }
.brand-color { display: flex; flex-direction: column; gap: 14px; }
.big-swatch {
aspect-ratio: 1.9 / 1;
border-radius: 8px;
padding: 22px 24px;
display: flex;
flex-direction: column;
justify-content: space-between;
box-shadow: inset 0 0 0 1px rgba(0,0,0,.06);
}
.brand-color-primary .big-swatch { aspect-ratio: 2.6 / 1; }
.big-swatch-name { font-family: var(--display); font-size: 32px; line-height: 1; }
.big-swatch-hex { font-family: var(--mono); font-size: 14px; letter-spacing: .04em; opacity: 0.92; }
.color-meta { display: grid; grid-template-columns: 1fr 1fr; gap: 0 24px; padding: 0; margin: 0; }
.color-meta dt { font-family: var(--mono); font-size: 10px; text-transform: uppercase; letter-spacing: .12em; color: var(--ink-faint); margin-bottom: 2px; }
.color-meta dd { margin: 0 0 10px; font-size: 14px; }
.neutral-strip { display: grid; grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); border: 1px solid var(--rule); border-radius: 6px; overflow: hidden; }
.neutral-cell { aspect-ratio: 1.8 / 1; display: flex; align-items: flex-end; padding: 10px 12px; }
.neutral-cell code { font-size: 11px; }
.palette-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(110px, 1fr)); gap: 6px; }
.mini-swatch { aspect-ratio: 1.6 / 1; border-radius: 5px; padding: 9px 11px; display: flex; align-items: flex-end; box-shadow: inset 0 0 0 1px rgba(0,0,0,.06); }
.mini-swatch code { font-size: 10px; opacity: 0.92; }
.callout {
margin-top: 32px;
padding: 14px 18px;
background: rgba(0,0,0,.03);
border-left: 2px solid var(--accent);
border-radius: 0 4px 4px 0;
font-size: 14px;
}
[data-theme="dark"] .callout { background: rgba(255,255,255,.04); }
/* — Logo — */
.logo-card { display: grid; grid-template-columns: 2fr 1fr; gap: 24px; align-items: center; padding: 24px 0; }
@media (max-width: 640px) { .logo-card { grid-template-columns: 1fr; } }
.logo-canvas { aspect-ratio: 16 / 9; background: var(--paper-2); border-radius: 8px; display: flex; align-items: center; justify-content: center; padding: 32px; box-shadow: inset 0 0 0 1px var(--rule); }
.logo-canvas svg { max-width: 60%; max-height: 80%; }
.logo-placeholder { font-family: var(--display); font-size: 36px; color: var(--ink-soft); }
.logo-meta { grid-template-columns: 1fr; }
/* — Type — */
.specimen { padding: 18px 0 26px; }
.spec-line { line-height: 1.05; margin: 0 0 18px; letter-spacing: -.01em; }
.spec-display { font-weight: 400; }
.spec-body { color: var(--ink-soft); font-style: italic; }
.scale-table { width: 100%; border-collapse: collapse; font-size: 14px; }
.scale-table th, .scale-table td { padding: 14px 8px; text-align: left; border-bottom: 1px solid var(--rule); vertical-align: middle; }
.scale-table th { font-family: var(--mono); font-size: 10px; text-transform: uppercase; letter-spacing: .12em; color: var(--ink-faint); border-bottom: 1px solid var(--ink); }
.scale-table .t-step { width: 64px; }
.scale-table .t-size { width: 80px; }
.scale-table .t-sample { color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* — Spacing — */
.space-rhythm { display: flex; flex-direction: column; gap: 10px; padding: 8px 0; }
.space-step { display: flex; align-items: center; gap: 14px; }
.space-block { height: 14px; background: var(--ink); border-radius: 2px; flex: 0 0 auto; }
[data-theme="dark"] .space-block { background: var(--ink); }
.space-step code { font-size: 11px; color: var(--ink-soft); min-width: 56px; }
/* — Shape — */
.radii-row, .shadows-row { display: grid; gap: 16px; }
.radii-row { grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); }
.shadows-row { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); }
.radius-card, .shadow-card { display: flex; flex-direction: column; gap: 10px; align-items: flex-start; }
.radius-block { width: 96px; height: 96px; background: var(--paper-2); box-shadow: inset 0 0 0 1px var(--rule); }
.shadow-block { width: 100%; height: 96px; background: var(--paper); border-radius: 10px; }
[data-theme="dark"] .shadow-block { background: var(--paper-2); }
.radius-card code, .shadow-card code { font-size: 11px; color: var(--ink-soft); }
/* — Iconography — */
.icon-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(56px, 1fr)); gap: 10px; }
.icon-cell { aspect-ratio: 1; display: flex; align-items: center; justify-content: center; border: 1px solid var(--rule); border-radius: 6px; padding: 10px; background: var(--paper-2); }
.icon-cell svg { width: 100%; height: 100%; }
/* — Motion — */
.motion-tempo { display: flex; flex-direction: column; gap: 10px; }
.tempo-item { display: flex; align-items: center; gap: 14px; }
.tempo-bar { height: 6px; border-radius: 999px; min-width: 24px; opacity: 0.8; flex: 0 0 auto; animation: tempoSlide var(--dur, 600ms) cubic-bezier(.2,.7,.2,1) infinite alternate; }
@keyframes tempoSlide { from { width: 24px; opacity: 0.5; } to { width: 280px; opacity: 0.95; } }
.tempo-item code { font-family: var(--mono); font-size: 12px; color: var(--ink-soft); min-width: 120px; }
.easings { list-style: none; padding: 0; margin: 0; display: flex; flex-wrap: wrap; gap: 10px; }
.easings li { padding: 6px 12px; background: var(--paper-2); border: 1px solid var(--rule); border-radius: 4px; font-size: 12px; }
/* — Components — */
.mock-grid { display: grid; grid-template-columns: 1fr 1.4fr; gap: 24px; align-items: start; padding: 8px 0 28px; }
@media (max-width: 640px) { .mock-grid { grid-template-columns: 1fr; } }
.mock-button { display: flex; flex-direction: column; gap: 14px; padding: 32px; background: var(--paper-2); border-radius: 12px; box-shadow: inset 0 0 0 1px var(--rule); align-items: flex-start; }
.m-btn { font-family: var(--body); font-size: 14px; font-weight: 500; padding: 12px 22px; border: 1px solid transparent; cursor: pointer; }
.m-btn-secondary { background: transparent; border-style: solid; border-width: 1px; }
.mock-card { padding: 26px 28px; box-shadow: inset 0 0 0 1px var(--rule); }
.m-card-eyebrow { font-family: var(--mono); font-size: 10px; text-transform: uppercase; letter-spacing: .14em; color: var(--ink-faint); }
.m-card-title { font-family: var(--display); font-weight: 400; font-size: 26px; margin: 8px 0 8px; line-height: 1.1; }
.m-card-body { margin: 0 0 14px; font-size: 14px; color: var(--ink-soft); line-height: 1.5; }
.m-card-link { font-family: var(--body); font-size: 13px; font-weight: 500; border: 0; padding: 0; }
.component-list { display: flex; flex-direction: column; }
.component-card { padding: 18px 0; border-top: 1px solid var(--rule); }
.component-card:last-of-type { border-bottom: 1px solid var(--rule); }
.component-card h4 { font-family: var(--display); font-weight: 400; font-size: 22px; margin: 0 0 14px; }
/* — Voice — */
.quotes { list-style: none; padding: 0; margin: 0; }
.quotes li {
font-family: var(--display);
font-size: 26px;
line-height: 1.18;
padding: 22px 0;
border-top: 1px solid var(--rule);
color: var(--ink);
}
.quotes li:last-child { border-bottom: 1px solid var(--rule); }
.cta-verbs { list-style: none; padding: 0; margin: 0; display: flex; flex-wrap: wrap; gap: 8px 20px; }
.cta-verbs li { display: flex; align-items: baseline; gap: 6px; font-size: 14px; }
.cta-verbs code { font-size: 13px; }
.cta-verbs .muted { font-family: var(--mono); font-size: 11px; }
/* — Accessibility — */
.a11y-score { display: flex; align-items: baseline; gap: 24px; padding: 12px 0 32px; border-bottom: 1px solid var(--rule); margin-bottom: 24px; }
.a11y-num { font-family: var(--display); font-size: clamp(72px, 10vw, 120px); line-height: 1; letter-spacing: -.02em; }
.a11y-suffix { font-size: 0.5em; color: var(--ink-soft); margin-left: 4px; }
.a11y-label { color: var(--ink-soft); font-size: 14px; line-height: 1.4; }
.a11y-pairs { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 18px; }
.a11y-pair { display: flex; flex-direction: column; gap: 12px; }
.a11y-stack { padding: 22px 18px; border-radius: 6px; box-shadow: inset 0 0 0 1px rgba(0,0,0,.06); display: flex; justify-content: space-between; align-items: center; }
.a11y-Aa { font-family: var(--display); font-size: 32px; line-height: 1; }
.a11y-ratio { font-family: var(--mono); font-size: 12px; opacity: 0.9; }
.a11y-pair dl { display: grid; grid-template-columns: 1fr 1fr; gap: 0 12px; padding: 0; margin: 0; }
.a11y-pair dt { font-family: var(--mono); font-size: 9px; text-transform: uppercase; letter-spacing: .14em; color: var(--ink-faint); }
.a11y-pair dd { margin: 0 0 4px; font-size: 12px; }
.remediation { list-style: none; padding: 0; margin: 0; }
.remediation li { padding: 10px 0; border-top: 1px solid var(--rule); }
.remediation li:last-child { border-bottom: 1px solid var(--rule); }
/* — Tokens — */
.codeblock-wrap { margin: 0 0 18px; border: 1px solid var(--rule); border-radius: 6px; overflow: hidden; }
.codeblock-head { display: flex; justify-content: space-between; padding: 10px 14px; font-family: var(--mono); font-size: 10px; text-transform: uppercase; letter-spacing: .14em; color: var(--ink-faint); background: var(--paper-2); border-bottom: 1px solid var(--rule); }
.codeblock { background: var(--paper-2); padding: 16px 18px; overflow-x: auto; font-family: var(--mono); font-size: 12px; line-height: 1.6; margin: 0; color: var(--ink); }
/* — Usage — */
.usage-list { padding: 0; margin: 0; counter-reset: rule; list-style: none; }
.usage-list li { padding: 22px 0; border-top: 1px solid var(--rule); position: relative; padding-left: 56px; counter-increment: rule; }
.usage-list li:last-child { border-bottom: 1px solid var(--rule); }
.usage-list li::before { content: counter(rule, decimal-leading-zero); position: absolute; left: 0; top: 26px; font-family: var(--mono); font-size: 11px; color: var(--ink-faint); letter-spacing: .14em; }
.usage-title { font-family: var(--display); font-weight: 400; font-size: 22px; margin: 0 0 6px; }
.usage-body { margin: 0; color: var(--ink-soft); font-size: 15px; line-height: 1.55; }
/* — Footer — */
footer { padding: 40px 40px 0; font-size: 13px; color: var(--ink-soft); display: flex; justify-content: space-between; align-items: end; flex-wrap: wrap; gap: 16px; }
footer .sig { font-family: var(--display); font-size: 22px; color: var(--ink); }
footer .stamp { font-family: var(--mono); font-size: 10px; text-transform: uppercase; letter-spacing: .14em; }
@media (max-width: 640px) { footer { padding: 40px 22px 0; } }
/* — Print — */
@media print {
body { background: white; color: black; }
.topbar nav, .theme-btn { display: none; }
.cover, .toc, section { page-break-inside: avoid; border-color: #ddd; padding: 36px 32px; }
.cover-band { background-color: var(--accent) !important; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
.toc, .cover { page-break-after: always; }
section { page-break-before: always; page-break-after: always; break-before: page; }
.topbar { display: none !important; }
.scale-table, .a11y-pair, .component-card { page-break-inside: avoid; }
}
</style>
</head>
<body>
<header class="topbar">
<div class="brand"><a href="https://designlang.app">designlang</a></div>
<nav>
<span>Brand guidelines</span>
<button class="theme-btn" id="themeBtn" type="button">Theme</button>
</nav>
</header>
<main class="wrap">
<section class="cover" id="cover" aria-labelledby="cover-title">
<div class="cover-band" style="background:#d08728;color:#ffffff">
<span class="cover-band-label">Brand guidelines</span>
<span class="cover-band-hex"><code>#d08728</code></span>
</div>
<div class="cover-body">
<p class="kicker">August 9, 2026</p>
<h1 id="cover-title" class="cover-title">coulomb.social</h1>
<p class="cover-sub">A reading of the visual language at <a href="https://coulomb.social" target="_blank" rel="noopener">https://coulomb.social</a>. Every token, every rule, every component — captured from the live site.</p>
<dl class="cover-meta">
<div><dt>Page intent</dt><dd>landing</dd></div>
<div><dt>System grade</dt><dd>B <span class="muted">85/100</span></dd></div>
<div><dt>Tokens</dt><dd>8 colours · 7 sizes</dd></div>
<div><dt>Generated</dt><dd>designlang</dd></div>
</dl>
</div>
</section>
<nav class="toc" aria-label="Table of contents">
<h2 class="toc-title">Contents</h2>
<ol>
<li><a href="#about"><span class="toc-num">01</span><span class="toc-label">About</span></a></li><li><a href="#logo"><span class="toc-num">02</span><span class="toc-label">Logo</span></a></li><li><a href="#color"><span class="toc-num">03</span><span class="toc-label">Colour</span></a></li><li><a href="#type"><span class="toc-num">04</span><span class="toc-label">Typography</span></a></li><li><a href="#spacing"><span class="toc-num">05</span><span class="toc-label">Spacing</span></a></li><li><a href="#shape"><span class="toc-num">06</span><span class="toc-label">Shape</span></a></li><li><a href="#iconography"><span class="toc-num">07</span><span class="toc-label">Iconography</span></a></li><li><a href="#motion"><span class="toc-num">08</span><span class="toc-label">Motion</span></a></li><li><a href="#components"><span class="toc-num">09</span><span class="toc-label">Components</span></a></li><li><a href="#voice"><span class="toc-num">10</span><span class="toc-label">Voice</span></a></li><li><a href="#accessibility"><span class="toc-num">11</span><span class="toc-label">Accessibility</span></a></li><li><a href="#tokens"><span class="toc-num">12</span><span class="toc-label">Tokens</span></a></li><li><a href="#usage"><span class="toc-num">13</span><span class="toc-label">Usage</span></a></li>
</ol>
</nav>
<section id="about">
<header class="chapter-header">
<span class="sec-num">Chapter 01</span>
<h2>About</h2>
</header>
<dl class="meta-grid">
<div><dt>Page intent</dt><dd>landing <span class="muted">45% confidence</span></dd></div>
<div><dt>Material language</dt><dd>flat</dd></div>
<div><dt>Imagery style</dt><dd>mixed</dd></div>
<div><dt>Component library</dt><dd>unknown</dd></div>
<div><dt>Stack</dt><dd>unknown · Tailwind</dd></div>
<div><dt>Voice tone</dt><dd>neutral</dd></div>
</dl>
</section>
<section id="logo">
<header class="chapter-header">
<span class="sec-num">Chapter 02</span>
<h2>Logo</h2>
</header>
<div class="logo-card">
<div class="logo-canvas" aria-label="Extracted logo on canvas">
<span class="logo-placeholder">coulomb.social</span>
</div>
<dl class="meta-grid logo-meta">
<div><dt>Source</dt><dd>inferred</dd></div>
<div><dt>Dimensions</dt><dd></dd></div>
<div><dt>Aspect</dt><dd></dd></div>
<div><dt>Format</dt><dd>unknown</dd></div>
</dl>
</div>
</section>
<section id="color">
<header class="chapter-header">
<span class="sec-num">Chapter 03</span>
<h2>Colour</h2>
</header>
<p class="summary">1 primary · 7 neutrals · 8 total</p>
<div class="brand-grid brand-grid-primary">
<article class="brand-color brand-color-primary">
<div class="big-swatch" style="background:#d08728;color:#ffffff">
<span class="big-swatch-name">Primary</span>
<span class="big-swatch-hex">#D08728</span>
</div>
<dl class="color-meta">
<div><dt>RGB</dt><dd><code>208, 135, 40</code></dd></div>
<div><dt>HSL</dt><dd><code>34°, 68%, 49%</code></dd></div>
</dl>
</article></div>
<h3 class="sub">Neutrals</h3>
<div class="neutral-strip">
<div class="neutral-cell" style="background:#000000;color:#ffffff"><code>#000000</code></div><div class="neutral-cell" style="background:#efefef;color:#0a0a0a"><code>#EFEFEF</code></div><div class="neutral-cell" style="background:#616161;color:#ffffff"><code>#616161</code></div><div class="neutral-cell" style="background:#373737;color:#ffffff"><code>#373737</code></div><div class="neutral-cell" style="background:#171717;color:#ffffff"><code>#171717</code></div><div class="neutral-cell" style="background:#ffffff;color:#0a0a0a"><code>#FFFFFF</code></div><div class="neutral-cell" style="background:#e5e5e5;color:#0a0a0a"><code>#E5E5E5</code></div>
</div>
<h3 class="sub">Full palette</h3>
<div class="palette-grid">
<div class="mini-swatch" style="background:#000000;color:#ffffff"><code>#000000</code></div><div class="mini-swatch" style="background:#efefef;color:#0a0a0a"><code>#EFEFEF</code></div><div class="mini-swatch" style="background:#616161;color:#ffffff"><code>#616161</code></div><div class="mini-swatch" style="background:#373737;color:#ffffff"><code>#373737</code></div><div class="mini-swatch" style="background:#171717;color:#ffffff"><code>#171717</code></div><div class="mini-swatch" style="background:#ffffff;color:#0a0a0a"><code>#FFFFFF</code></div><div class="mini-swatch" style="background:#e5e5e5;color:#0a0a0a"><code>#E5E5E5</code></div><div class="mini-swatch" style="background:#d08728;color:#ffffff"><code>#D08728</code></div>
</div>
<p class="callout"><strong>WCAG 100%</strong> · 0 passing pairs · 0 failing. Full breakdown in §11.</p>
</section>
<section id="type">
<header class="chapter-header">
<span class="sec-num">Chapter 04</span>
<h2>Typography</h2>
</header>
<p class="summary">4 families · 7 sizes · 4 weights</p>
<dl class="meta-grid">
<div><dt>Display</dt><dd>Helvetica</dd></div>
<div><dt>Body</dt><dd>Arial</dd></div>
<div><dt>Weights</dt><dd>400, 500, 600, 700</dd></div>
</dl>
<h3 class="sub">Specimen</h3>
<div class="specimen" style="font-family: Helvetica, 'Instrument Serif', serif;">
<div class="spec-line spec-display" style="font-size: 50px">Quick brown fox jumps over the lazy dog.</div>
<div class="spec-line spec-body" style="font-size: 24px">AaBbCc 0123456789 ?!&amp;</div>
</div>
<h3 class="sub">Scale</h3>
<table class="scale-table">
<thead><tr><th class="t-step">Step</th><th class="t-size">Size</th><th class="t-sample">Sample</th></tr></thead>
<tbody>
<tr>
<td class="t-step"><code>t00</code></td>
<td class="t-size"><code>50px</code></td>
<td class="t-sample" style="font-size:50px; font-family: Helvetica, 'Instrument Serif', serif; line-height: 1;">Quick brown fox jumps over t</td>
</tr>
<tr>
<td class="t-step"><code>t01</code></td>
<td class="t-size"><code>42px</code></td>
<td class="t-sample" style="font-size:42px; font-family: Helvetica, 'Instrument Serif', serif; line-height: 1;">Quick brown fox jumps over t</td>
</tr>
<tr>
<td class="t-step"><code>t02</code></td>
<td class="t-size"><code>24px</code></td>
<td class="t-sample" style="font-size:24px; font-family: Helvetica, 'Instrument Serif', serif; line-height: 1;">Quick brown fox jumps over t</td>
</tr>
<tr>
<td class="t-step"><code>t03</code></td>
<td class="t-size"><code>18px</code></td>
<td class="t-sample" style="font-size:18px; font-family: Helvetica, 'Instrument Serif', serif; line-height: 1;">Quick brown fox jumps over t</td>
</tr>
<tr>
<td class="t-step"><code>t04</code></td>
<td class="t-size"><code>16px</code></td>
<td class="t-sample" style="font-size:16px; font-family: Helvetica, 'Instrument Serif', serif; line-height: 1;">Quick brown fox jumps over t</td>
</tr>
<tr>
<td class="t-step"><code>t05</code></td>
<td class="t-size"><code>14px</code></td>
<td class="t-sample" style="font-size:14px; font-family: Helvetica, 'Instrument Serif', serif; line-height: 1;">Quick brown fox jumps over t</td>
</tr>
<tr>
<td class="t-step"><code>t06</code></td>
<td class="t-size"><code>13.3333px</code></td>
<td class="t-sample" style="font-size:13.3333px; font-family: Helvetica, 'Instrument Serif', serif; line-height: 1;">Quick brown fox jumps over t</td>
</tr>
</tbody>
</table>
</section>
<section id="spacing">
<header class="chapter-header">
<span class="sec-num">Chapter 05</span>
<h2>Spacing</h2>
</header>
<p class="summary">Base 4px · 8 steps captured</p>
<h3 class="sub">Rhythm</h3>
<div class="space-rhythm">
<div class="space-step">
<div class="space-block" style="width:1.6px"></div>
<code>1px</code>
</div>
<div class="space-step">
<div class="space-block" style="width:38.400000000000006px"></div>
<code>24px</code>
</div>
<div class="space-step">
<div class="space-block" style="width:51.2px"></div>
<code>32px</code>
</div>
<div class="space-step">
<div class="space-block" style="width:64px"></div>
<code>40px</code>
</div>
<div class="space-step">
<div class="space-block" style="width:96px"></div>
<code>60px</code>
</div>
<div class="space-step">
<div class="space-block" style="width:128px"></div>
<code>80px</code>
</div>
<div class="space-step">
<div class="space-block" style="width:153.60000000000002px"></div>
<code>96px</code>
</div>
<div class="space-step">
<div class="space-block" style="width:320px"></div>
<code>320px</code>
</div>
</div>
</section>
<section id="shape">
<header class="chapter-header">
<span class="sec-num">Chapter 06</span>
<h2>Shape</h2>
</header>
<p class="summary">5 radii · 2 elevation tiers</p>
<h3 class="sub">Border radii</h3>
<div class="radii-row">
<div class="radius-card">
<div class="radius-block" style="border-radius:4px"></div>
<code>4px</code>
</div>
<div class="radius-card">
<div class="radius-block" style="border-radius:8px"></div>
<code>8px</code>
</div>
<div class="radius-card">
<div class="radius-block" style="border-radius:12px"></div>
<code>12px</code>
</div>
<div class="radius-card">
<div class="radius-block" style="border-radius:15px"></div>
<code>15px</code>
</div>
<div class="radius-card">
<div class="radius-block" style="border-radius:20px"></div>
<code>20px</code>
</div>
</div>
<h3 class="sub">Elevation</h3>
<div class="shadows-row">
<div class="shadow-card">
<div class="shadow-block" style="box-shadow:rgb(170, 170, 170) 2px 2px 4px 0px"></div>
<code>xs</code>
</div>
<div class="shadow-card">
<div class="shadow-block" style="box-shadow:rgba(23, 23, 23, 0.1) 2px 2px 8px 2px"></div>
<code>sm</code>
</div>
</div>
</section>
<section id="iconography">
<header class="chapter-header">
<span class="sec-num">Chapter 07</span>
<h2>Iconography</h2>
</header>
<p class="summary">unknown · 24 captured</p>
<dl class="meta-grid">
<div><dt>Library</dt><dd>unknown</dd></div>
<div><dt>Confidence</dt><dd>0%</dd></div>
<div><dt>Stroke style</dt><dd>fillDominant</dd></div>
</dl>
<div class="icon-grid">
<div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div><div class="icon-cell"><code>icon</code></div>
</div>
</section>
<section id="motion">
<header class="chapter-header">
<span class="sec-num">Chapter 08</span>
<h2>Motion</h2>
</header>
<p class="summary">Feel: mixed · 1 durations · 0 easings</p>
<h3 class="sub">Duration scale</h3>
<div class="motion-tempo">
<div class="tempo-item">
<div class="tempo-bar" style="--dur:250ms; background:#d08728"></div>
<code>250ms</code>
</div>
</div>
</section>
<section id="components">
<header class="chapter-header">
<span class="sec-num">Chapter 09</span>
<h2>Components</h2>
</header>
<p class="summary">unknown · 1 component patterns captured</p>
<h3 class="sub">Mocks</h3>
<div class="mock-grid">
<div class="mock-button">
<button type="button" class="m-btn m-btn-primary" style="background:#d08728;color:#ffffff;border-radius:8px">Primary action</button>
<button type="button" class="m-btn m-btn-secondary" style="border-radius:8px;border-color:#d08728;color:#d08728">Secondary</button>
</div>
<div class="mock-card" style="background:#e5e5e5;color:#000000;border-radius:12px">
<span class="m-card-eyebrow">Card</span>
<h4 class="m-card-title">Built from these tokens</h4>
<p class="m-card-body">Radius, primary, surface, text — all sampled from the live site.</p>
<a class="m-card-link" href="#" style="color:#d08728">Read more →</a>
</div>
</div>
<h3 class="sub">Detected patterns</h3>
<div class="component-list">
<article class="component-card">
<h4>button</h4>
<dl class="meta-grid">
<div><dt>Slots</dt><dd>label, icon, badge</dd></div>
<div><dt>Variants</dt><dd></dd></div>
<div><dt>Sizes</dt><dd></dd></div>
</dl>
</article>
</div>
</section>
<section id="voice">
<header class="chapter-header">
<span class="sec-num">Chapter 10</span>
<h2>Voice</h2>
</header>
<p class="summary">neutral · — · —</p>
<h3 class="sub">CTA verbs</h3>
<ul class="cta-verbs">
<li><code></code><span class="muted">×25</span></li><li><code></code><span class="muted">×25</span></li><li><code></code><span class="muted">×1</span></li><li><code></code><span class="muted">×1</span></li><li><code></code><span class="muted">×1</span></li><li><code></code><span class="muted">×1</span></li><li><code></code><span class="muted">×1</span></li>
</ul>
</section>
<section id="accessibility">
<header class="chapter-header">
<span class="sec-num">Chapter 11</span>
<h2>Accessibility</h2>
</header>
<div class="a11y-score">
<span class="a11y-num">100<span class="a11y-suffix">%</span></span>
<span class="a11y-label">WCAG 2.1 contrast<br>0 passing · 0 failing</span>
</div>
<p class="muted">No failing contrast pairs detected.</p>
</section>
<section id="tokens">
<header class="chapter-header">
<span class="sec-num">Chapter 12</span>
<h2>Tokens</h2>
</header>
<p class="summary">Drop-in code for the most common stacks. All values from the live extraction.</p>
<div class="codeblock-wrap">
<div class="codeblock-head"><span>CSS variables</span><span class="muted">variables.css</span></div>
<pre class="codeblock"><code>:root {
--color-primary: #d08728;
--font-display: &quot;Helvetica&quot;;
--space-base: 4px;
--radius-md: 8px;
}</code></pre>
</div>
<div class="codeblock-wrap">
<div class="codeblock-head"><span>Tailwind config</span><span class="muted">tailwind.config.js</span></div>
<pre class="codeblock"><code>// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: { brand: &#39;#d08728&#39; },
fontFamily: { display: [&#39;Helvetica&#39;, &#39;serif&#39;] },
spacing: { base: &#39;4px&#39; },
borderRadius: { md: &#39;8px&#39; },
},
},
};</code></pre>
</div>
<p class="muted">Run <code>npx designlang pack coulomb.social</code> for the full bundle (DTCG, shadcn, Figma vars, motion, anatomy, Storybook).</p>
</section>
<section id="usage">
<header class="chapter-header">
<span class="sec-num">Chapter 13</span>
<h2>Usage</h2>
</header>
<ol class="usage-list">
<li>
<h3 class="usage-title">Lead with the primary.</h3>
<p class="usage-body">It belongs on calls-to-action and one accent moment per screen. Not on body copy.</p>
</li>
<li>
<h3 class="usage-title">Two type families, three weights.</h3>
<p class="usage-body">Display for headlines, body for paragraphs. Resist a third unless there is a real reason.</p>
</li>
<li>
<h3 class="usage-title">Snap to the spacing scale.</h3>
<p class="usage-body">Padding, margin, and gap should land on the values in §05. One-off pixels accumulate into noise.</p>
</li>
<li>
<h3 class="usage-title">Treat accessibility as a hard constraint.</h3>
<p class="usage-body">When a colour pair fails WCAG, fix the colour — not the contrast check.</p>
</li>
</ol>
</section>
<footer>
<div>
<div class="sig">designlang</div>
<div>Re-run: <code>npx designlang brand coulomb.social</code></div>
</div>
<div class="stamp">Aug 9, 2026 · v12.21.0</div>
</footer>
</main>
<script>
(function () {
var btn = document.getElementById('themeBtn');
var saved = null;
try { saved = localStorage.getItem('dl-theme'); } catch (e) {}
if (saved) document.documentElement.setAttribute('data-theme', saved);
btn && btn.addEventListener('click', function () {
var cur = document.documentElement.getAttribute('data-theme') === 'dark' ? '' : 'dark';
if (cur) document.documentElement.setAttribute('data-theme', cur);
else document.documentElement.removeAttribute('data-theme');
try { localStorage.setItem('dl-theme', cur); } catch (e) {}
});
})();
</script>
</body>
</html>