open-design/design-systems/huggingface/components.html
chaoxiaoche b68e4d3252
feat(design-systems): add tokens.css + components.html for 9 AI product brands (#1841)
* feat(design-systems): add tokens.css + components.html for 9 AI product brands

Compiles DESIGN.md prose into machine-consumable agent artifacts for
claude, cohere, elevenlabs, huggingface, mistral-ai, nvidia, opencode-ai,
replicate, and together-ai.

Each brand adds:
- tokens.css  — :root block of CSS custom properties derived from the brand's
                DESIGN.md; agents paste this directly into generated HTML <style> tags
- components.html — reference fixture embedding the token block inline and
                    demonstrating buttons, inputs, cards, and badges styled
                    with var(--token-name) calls

Key brand decisions encoded:
- claude: warm parchment canvas, terracotta accent, Anthropic Serif display
- cohere: pure white, 22px signature radius, CohereText + Unica77
- elevenlabs: achromatic + warm stone, Waldenburg weight 300, pill-shaped
- huggingface: IBM Plex Mono headings/tags, HF Yellow (#ffd21e), 4-6px radius
- mistral-ai: golden amber palette, Arial weight 400, near-zero radius
- nvidia: true black, NVIDIA Green as border/outline signal only, teal hover
- opencode-ai: Berkeley Mono sole typeface, flat depth (ring-only elevation)
- replicate: pill-shaped everything (9999px), rb-freigeist-neue heavy
- together-ai: "The Future" font, -0.03em tracking, white/midnight dual world

openai tokens.css + components.html were merged to main separately.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(design-systems): sync :root token blocks with tokens.css for opencode-ai and together-ai

opencode-ai: add missing "Liberation Mono" to all three font-stack fallbacks.
together-ai: remove --lavender declaration absent from tokens.css (guard requires byte-identical :root blocks).
Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: chaoxiaoche <chaoxiaoche@chaoxiaochedeMacBook-Pro.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-18 11:54:50 +08:00

346 lines
14 KiB
HTML
Raw Permalink 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>Hugging Face — reference components</title>
<meta
name="description"
content="Reference fixture for design-systems/huggingface. ML community hub:
IBM Plex Mono headings, HF Yellow badge accent, crisp 1px borders, 4-6px radius."
/>
<style>
:root {
--bg: #fafafa;
--surface: #ffffff;
--surface-warm: #fff4cc;
--fg: #0d1117;
--fg-2: #374151;
--muted: #6b7280;
--meta: var(--muted);
--border: #e5e7eb;
--border-soft: #f3f4f6;
--accent: #ffd21e;
--accent-on: #0d1117;
--accent-hover: #f59e0b;
--accent-active: color-mix(in oklab, var(--accent), black 20%);
--success: #16a34a;
--warn: #f59e0b;
--danger: #dc2626;
--font-display: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
--font-body: "Source Sans Pro", Inter, system-ui, -apple-system, sans-serif;
--font-mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
--text-xs: 12px;
--text-sm: 13px;
--text-base: 15px;
--text-lg: 18px;
--text-xl: 24px;
--text-2xl: 32px;
--text-3xl: 40px;
--text-4xl: 48px;
--leading-body: 1.55;
--leading-tight: 1.1;
--tracking-display: -0.01em;
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
--space-8: 32px;
--space-12: 48px;
--section-y-desktop: 80px;
--section-y-tablet: 48px;
--section-y-phone: 32px;
--radius-sm: 4px;
--radius-md: 6px;
--radius-lg: 8px;
--radius-pill: 9999px;
--elev-flat: none;
--elev-ring: 0 0 0 1px var(--border);
--elev-raised: 0 2px 8px color-mix(in oklab, var(--fg), transparent 90%);
--focus-ring: 0 0 0 3px rgba(13, 17, 23, 0.1);
--motion-fast: 120ms;
--motion-base: 200ms;
--ease-standard: cubic-bezier(0.2, 0, 0, 1);
--container-max: 1280px;
--container-gutter-desktop: 24px;
--container-gutter-tablet: 16px;
--container-gutter-phone: 12px;
}
/* ─── Reset ─────────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body {
background: var(--bg);
color: var(--fg);
font-family: var(--font-body);
font-size: var(--text-base);
line-height: var(--leading-body);
-webkit-font-smoothing: antialiased;
}
/* ─── Layout ─────────────────────────────────────────────── */
.container { max-width: var(--container-max); margin-inline: auto; padding-inline: var(--container-gutter-desktop); }
section { padding-block: var(--section-y-desktop); }
section + section { border-top: 1px solid var(--border); }
@media (max-width: 1023px) {
.container { padding-inline: var(--container-gutter-tablet); }
section { padding-block: var(--section-y-tablet); }
}
@media (max-width: 639px) {
.container { padding-inline: var(--container-gutter-phone); }
section { padding-block: var(--section-y-phone); }
}
/* ─── Typography — IBM Plex Mono for all headings/tags ─── */
h1, h2, h3 {
font-family: var(--font-display); /* IBM Plex Mono — "config file is README" */
font-weight: 600; /* Weight cap at 600 — 700 is too loud vs yellow */
line-height: var(--leading-tight);
margin: 0;
letter-spacing: var(--tracking-display);
}
h1 { font-size: var(--text-4xl); }
h2 { font-size: var(--text-2xl); }
h3 { font-size: var(--text-xl); }
p { margin: 0; font-family: var(--font-body); } /* Source Sans Pro for all body */
.lead { font-size: var(--text-lg); color: var(--fg-2); line-height: var(--leading-body); }
.body-muted { color: var(--muted); }
.body-sm { font-size: var(--text-sm); }
/* IBM Plex Mono tags — look like the strings devs paste into Python */
.eyebrow {
font-family: var(--font-display);
font-size: var(--text-xs);
font-weight: 500;
color: var(--muted);
letter-spacing: 0.02em;
}
.stack-3 > * + * { margin-block-start: var(--space-3); }
.stack-4 > * + * { margin-block-start: var(--space-4); }
.stack-6 > * + * { margin-block-start: var(--space-6); }
/* ─── Buttons — dark primary, yellow CTA, outlined ──────── */
.btn {
display: inline-flex;
align-items: center;
gap: var(--space-2);
padding: 8px 16px;
border-radius: var(--radius-md); /* 6px — crisp, not rounded */
font-family: var(--font-display); /* IBM Plex Mono on buttons */
font-size: var(--text-sm);
font-weight: 500;
line-height: 1;
cursor: pointer;
border: 1px solid transparent;
transition: background-color var(--motion-fast) var(--ease-standard),
border-color var(--motion-fast) var(--ease-standard);
text-decoration: none;
}
.btn:active { transform: translateY(1px); }
.btn:focus-visible { outline: none; box-shadow: var(--focus-ring); }
/* Primary: dark — "Use this model", primary actions */
.btn-primary {
background: var(--fg);
color: #ffffff;
}
.btn-primary:hover { background: var(--fg-2); }
/* Yellow CTA: HF accent — "Pro upgrade", "Sponsor" */
.btn-secondary {
background: var(--accent);
color: var(--accent-on);
border-color: var(--accent);
}
.btn-secondary:hover { background: var(--accent-hover); border-color: var(--accent-hover); }
/* ─── Inputs ────────────────────────────────────────────── */
.field { display: flex; flex-direction: column; gap: var(--space-2); }
.field label {
font-family: var(--font-display);
font-size: var(--text-sm); font-weight: 500;
}
.field input {
padding: 8px 12px;
border-radius: var(--radius-md);
border: 1px solid var(--border);
background: var(--surface);
color: var(--fg);
font-family: var(--font-body);
font-size: var(--text-sm);
outline: none;
transition: border-color var(--motion-fast) var(--ease-standard),
box-shadow var(--motion-fast) var(--ease-standard);
}
.field input:focus-visible {
border-color: var(--fg);
box-shadow: var(--focus-ring);
}
.field input::placeholder { color: var(--muted); }
.field-help { font-size: var(--text-xs); color: var(--muted); }
/* ─── Cards — model card style ──────────────────────────── */
.card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 16px 20px;
display: flex;
flex-direction: column;
gap: var(--space-3);
}
/* Yellow header strip — featured model card indicator */
.card.featured { border-top: 4px solid var(--accent); }
/* ─── Badges — task category tags ───────────────────────── */
.badge {
display: inline-flex; align-items: center; gap: var(--space-2);
padding: 2px 8px;
border-radius: var(--radius-sm);
font-family: var(--font-display);
font-size: var(--text-xs); font-weight: 500; line-height: 1.2;
}
.badge-success { color: #16a34a; background: #dcfce7; } /* Vision green */
.badge-muted { color: var(--muted); background: var(--border-soft); }
.badge-dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
/* ─── Links, Kbd ────────────────────────────────────────── */
a { color: var(--fg); text-decoration: none; }
a:hover { text-decoration: underline; }
kbd {
font-family: var(--font-display);
font-size: var(--text-xs);
padding: 2px 6px; border-radius: var(--radius-sm);
border: 1px solid var(--border); background: var(--border-soft); color: var(--muted);
}
/* ─── Layout helpers ────────────────────────────────────── */
.hero-grid { display: grid; grid-template-columns: 1.4fr 1fr; gap: var(--space-12); align-items: end; }
@media (max-width: 1023px) { .hero-grid { grid-template-columns: 1fr; gap: var(--space-8); } }
.hero-actions { display: flex; gap: var(--space-3); margin-block-start: var(--space-6); flex-wrap: wrap; }
.hero-meta {
display: flex; flex-direction: column; gap: var(--space-3);
padding: var(--space-4); border: 1px solid var(--border);
border-radius: var(--radius-md); background: var(--surface);
}
.features-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-5); }
@media (max-width: 1023px) { .features-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 639px) { .features-grid { grid-template-columns: 1fr; } }
.form-row { display: grid; grid-template-columns: 1.4fr 1fr; gap: var(--space-12); align-items: start; }
@media (max-width: 1023px) { .form-row { grid-template-columns: 1fr; } }
.form { display: flex; flex-direction: column; gap: var(--space-4); max-width: 420px; }
.form-actions { display: flex; gap: var(--space-3); margin-block-start: var(--space-2); }
.icon { width: 16px; height: 16px; flex-shrink: 0; }
.row-between { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); }
</style>
</head>
<body>
<main class="container">
<section data-od-id="hero">
<div class="hero-grid">
<div class="stack-4">
<p class="eyebrow">reference-fixture · huggingface</p>
<h1>The AI community building the future.</h1>
<p class="lead" style="max-width: 52ch">
The ML platform that refuses to look serious. Sunshine yellow,
monospace everywhere, crisp 1px borders. A community zine, not a research lab.
</p>
<div class="hero-actions">
<a href="./tokens.css" class="btn btn-primary">
View tokens
<svg class="icon" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="1.75"
stroke-linecap="round" stroke-linejoin="round"
aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
</a>
<a href="./DESIGN.md" class="btn btn-secondary">Sponsor 🤗</a>
</div>
</div>
<aside class="hero-meta" aria-label="System status">
<div class="row-between">
<span class="eyebrow">build status</span>
<span class="badge badge-success">
<span class="badge-dot" aria-hidden="true"></span>
passing
</span>
</div>
<p class="body-sm body-muted">Last reviewed <time datetime="2026-05-15">2026-05-15</time> · v1.0</p>
<p class="body-sm body-muted">Press <kbd></kbd> <kbd>K</kbd> to search.</p>
</aside>
</div>
</section>
<section data-od-id="features">
<div class="stack-3">
<p class="eyebrow">what-this-fixture-exercises</p>
<h2 style="max-width: 28ch">Mono headings. Yellow accents. Crisp borders.</h2>
</div>
<div class="features-grid" style="margin-block-start: var(--space-8)">
<article class="card featured">
<h3>IBM Plex Mono</h3>
<p class="body-muted body-sm">
All headings and tags use IBM Plex Mono — they look like strings
developers paste into Python. Source Sans Pro for prose only.
</p>
<a href="./tokens.css" class="body-sm">Inspect →</a>
</article>
<article class="card">
<h3>HF Yellow (#ffd21e)</h3>
<p class="body-muted body-sm">
--accent: #ffd21e. The sunshine yellow for badge strips, "new" pills,
and sponsor CTAs. Dark text (--accent-on: #0d1117) for contrast.
</p>
<a href="./DESIGN.md" class="body-sm">Read the rule →</a>
</article>
<article class="card">
<h3>46px brutalist radius</h3>
<p class="body-muted body-sm">
--radius-md: 6px. Closer to brutalist than rounded. Borders announce
themselves. Tables are dense — this is a hub for power users.
</p>
<a href="./tokens.css" class="body-sm">Inspect radius →</a>
</article>
</div>
</section>
<section data-od-id="form">
<div class="form-row">
<div class="stack-4">
<p class="eyebrow">form-components</p>
<h2>Model search with crisp inputs.</h2>
<p class="body-muted" style="max-width: 48ch">
Inputs use 6px radius with 1px borders. Focus shifts border to --fg
(#0d1117) with dark ring. Dark focus ring — 3px rgba(13,17,23,0.1).
</p>
</div>
<form class="form" onsubmit="event.preventDefault();">
<div class="field">
<label for="email">Email or username</label>
<input id="email" type="email" placeholder="your@email.com" autocomplete="email" required />
<p class="field-help">Sign in to download models and datasets.</p>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">Sign in</button>
<button type="button" class="btn btn-secondary">Create account</button>
</div>
</form>
</div>
</section>
</main>
</body>
</html>