Sealed by default
Security is a visible boundary
Passwords appear at the signing edge, secret warnings are direct, and the header continuously says “sealed.”
ExtractedPortable reference · repository extraction
A restrained, security-oriented design system for trustworthy websites and applications— shaped by a dark “wizard gate,” a warm parchment counterpart, quiet gold actions, and technical clarity at consequential boundaries.
01 · Foundations
Gandalf’s source avoids the visual noise of generic crypto products. It uses dense but calm surfaces, serif moments for identity and value, monospace for addresses and hashes, and color chiefly for action, ledger identity, and explicit state.
Sealed by default
Passwords appear at the signing edge, secret warnings are direct, and the header continuously says “sealed.”
ExtractedWarm restraint
Gold marks the sigil, primary action, focus, selection, and high-value identity cues.
ExtractedTechnical honesty
Inputs, outputs, fees, network, destination, hashes, reservations, and node reasons remain inspectable.
ExtractedUse warm neutrals, compact hierarchy, explicit state labels, and plain security language. Keep addresses, amounts, and hashes stable with monospace or tabular numerals.
Add neon gradients, speculative market imagery, anonymous “web3” styling, or color-only status. Avoid making a dangerous action look routine.
Theme and density are independent axes. Light and dark change semantic color; comfortable and compact change rhythm, padding, and information density. Components, states, accessibility rules, and token names remain the same.
Clear public narrative
Use generous rhythm, readable line length, proof-oriented cards, and one obvious next action.
<html data-theme="light" data-density="comfortable"> <!-- website -->
<html data-theme="dark" data-density="compact"> <!-- extension or dense app -->
The repository supplies paired values, not mathematically generated scales. The primitive layer therefore keeps named pairs rather than inventing numbered ramps.
Ledger colors are semantic identities, not product status. The five avatar colors come from the local DiceBear generator and never leave the device.
| Purpose token | Light / parchment | Dark / gate | Origin |
|---|---|---|---|
| #f7f5ee | #101713 | --bg | |
| #fffdf6 | #18211b | --panel | |
| #fffdf6 | #1e2921 | Normalized panel role | |
| #f4f0e3 | #1e2921 | --panel-2 | |
| #1d2420 | #f5f1e6 | --ink | |
| #465048 | #c4ccc6 | Derived missing tier | |
| #6b7268 | #9aa89e | --muted | |
| #eeeade | #222d27 | Derived missing tier | |
| #e2ddcc | #2a3730 | --line | |
| #aaa38f | #526158 | Derived missing tier | |
| #8a6d1f | #d7bd76 | --gold | |
| #fdf9ec | #171307 | --gold-ink | |
| #8a6d1f | #d7bd76 | --focus | |
| #1e7a3e | #8fd4a0 | --ok | |
| #8a6410 | #e5c06b | --warn | |
| #b3261e | #ff9b90 | --danger | |
| #2b5f8a | #8fb8d8 | --info | |
| rgba(0, 0, 0, .45) | .sheet-veil | ||
| #f4f0e3 | #101713 | Preview / technical surfaces | |
Primary surface
Primary surface
| Pair | Light | Dark | Decision |
|---|---|---|---|
| Primary text / canvas | 14.52:1 | 16.12:1 | Preserved |
| Muted text / surface | 4.88:1 | 6.66:1 | Preserved; light has narrow AA margin |
| Brand text / surface | 4.81:1 | 8.98:1+ | Preserved |
| Primary button ink / brand | 4.65:1 | 10.09:1 | Preserved; light has narrow AA margin |
| Light ledger glyph source ink | 2.87–3.88:1 | — | Use --color-ledger-glyph-ink (#fdf9ec), yielding 4.54–6.13:1 |
| Dark danger toast source white ink | — | 2.58:1 | Use #171307 through --toast-danger-ink |
Serif · Georgia 500
Your path is set.
Sans · Inter → system UI
Review transfer
Gandalf uses the operating system’s sans when Inter is unavailable; no web font is loaded.
Mono · system monospace
addr_test1vzg6…9nq4
| Token | Value | Production use |
|---|---|---|
| --text-2xs | 10px | I/O tags, compact word indexes |
| --text-xs | 11px | Eyebrows, chips, mono metadata |
| --text-sm | 12px | Fine print, notices, small actions |
| --text-md | 13.5px | Rows, fields, form labels |
| --text-base | 14px | Header and primary button text |
| --text-lg | 15.5px | Setup method serif title |
| --text-xl | 19px | Transfer result title |
| --text-2xl | 22px | Setup success title |
| --text-3xl | 28px | Balance amount and large sigil |
| --text-4xl | 34px | Transfer result mark |
| Line height | 1.15 / 1.45 / 1.55 / 1.7 | Display / notices / body / addresses |
| Letter spacing | .02 / .06 / .08 / .14em | Mono / units / tags / eyebrows |
| Foundation | Decision | Provenance |
|---|---|---|
| Borders | 1px default; 2px emphasis or security edge | Extracted |
| Focus | 2px gold box-shadow ring; never remove without replacement | Extracted |
| Disabled | 50% opacity; 55% for reserved/struck data | Extracted |
| Popup container | 380 × 600px; minimum document width 320px | Extracted |
| Reference container | 80rem max; 68ch reading measure | Recommended |
| Breakpoints | 640px mobile; 960px tablet; 1200px wide | Recommended; production has none |
| Motion | 120 / 180 / 260ms, standard ease | Recommended; production defines no transitions |
| Toast duration | 2600ms | Extracted from main.tsx |
| Reduced motion | Suppress animation and transition | Extracted and preserved |
| Touch target | 44px portable minimum; source is 30 / 38 / 40px | Accessibility correction |
02 · Core components
Every specimen consumes component or semantic tokens. Static modifier classes expose states that normally appear through interaction, and unsupported production patterns are visibly labeled.
Vault summary
| Asset | State | Balance |
|---|---|---|
| UNIT | synced | 3.4200 |
| ASSET | pending | 0.0150 |
03 · Website templates
These dependency-free templates use only classes and tokens from this CSS file. Download either HTML file, place it beside gandalf-design-system.css, and open it directly in a browser.
No npm, framework, bundler, web font, CDN, or JavaScript dependency. The reference and both starter templates remain fully responsive.
An evidence-led information architecture with a compact identity header, clear positioning, two primary actions, a proof band, and inspectable case-study cards—composed entirely with Gandalf tokens.
Senior Software Engineer · Technical Lead
Hands-on architecture and implementation for distributed systems where correctness, security, and operational reliability matter.
Selected work
A clear problem, the decisions made, and the resulting operational outcome.
System boundaries, measurable guarantees, and lessons from delivery.
A practical experiment with explicit constraints and human oversight.
<!doctype html>
<html lang="en" data-theme="light">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Your Name · Portfolio</title>
<link rel="stylesheet" href="gandalf-design-system.css">
</head>
<body>
<div class="template-page template-page--standalone">
<header class="template-site-header">
<nav class="template-site-nav" aria-label="Primary">
<a class="template-site-brand" href="#top">
<span class="sigil" aria-hidden="true">YN</span>
<span>Your Name</span>
</a>
<ul class="template-nav-links">
<li><a href="#work">Work</a></li>
<li><a href="#about">About</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
</header>
<main id="top">
<section class="template-hero">
<div>
<p class="eyebrow">Your role · Your location</p>
<h3>A clear statement of the value you <em>deliver.</em></h3>
<p class="template-lead">A concise, evidence-led introduction.</p>
<div class="hero__actions">
<a class="button button--primary" href="#work">View work</a>
<a class="button" href="#contact">Contact</a>
</div>
</div>
<aside class="template-profile-card">
<div class="template-profile-mark" aria-hidden="true">YN</div>
<strong>Your Name</strong>
<p>One sentence of professional context.</p>
</aside>
</section>
<section class="template-content-section" id="work">
<p class="eyebrow">Selected work</p>
<h3>Evidence, not adjectives.</h3>
<div class="template-card-grid">
<article class="template-card"><h3>Case study</h3><p>Problem, decision, and measurable outcome.</p></article>
<article class="template-card"><h3>Case study</h3><p>Problem, decision, and measurable outcome.</p></article>
</div>
</section>
</main>
</div>
</body>
</html>
A compact technical-product layout for infrastructure, developer tooling, security products, or any service that benefits from evidence-first communication.
Infrastructure · Clearly bounded
Make consequential systems legible with stable contracts, inspectable state, and explicit failure modes.
Live system boundary
Platform
Version boundaries before implementations.
Never hide pending, partial, or rejected outcomes.
Make the secure path the shortest path.
<!doctype html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Northstar · Product</title>
<link rel="stylesheet" href="gandalf-design-system.css">
</head>
<body>
<div class="template-page template-page--standalone">
<header class="template-site-header">
<nav class="template-site-nav" aria-label="Primary">
<a class="template-site-brand" href="#top"><span class="sigil" aria-hidden="true">N</span><span>Northstar</span></a>
<ul class="template-nav-links"><li><a href="#platform">Platform</a></li><li><a href="#security">Security</a></li><li><a href="#docs">Docs</a></li></ul>
</nav>
</header>
<main id="top">
<section class="template-hero">
<div>
<span class="status status--success">All systems operational</span>
<p class="eyebrow template-kicker">Infrastructure · Clearly bounded</p>
<h3>Infrastructure you can <em>explain.</em></h3>
<p class="template-lead">One precise sentence about your product and its guarantees.</p>
<div class="hero__actions"><a class="button button--primary" href="#docs">Read the docs</a><a class="button" href="#platform">View platform</a></div>
</div>
<div class="template-product-visual">
<p class="eyebrow">Live system boundary</p>
<div class="template-system-row"><span class="status status--success">API</span><span>Requests validated</span><small>32ms</small></div>
<div class="template-system-row"><span class="status status--warning">Queue</span><span>Awaiting confirmation</span><small>2 jobs</small></div>
</div>
</section>
<section class="template-content-section" id="platform">
<p class="eyebrow">Platform</p><h3>Small surface. Strong guarantees.</h3>
<div class="template-card-grid"><article class="template-card"><h3>Stable contracts</h3><p>Version boundaries before implementations.</p></article><article class="template-card"><h3>Visible state</h3><p>Never hide incomplete outcomes.</p></article></div>
</section>
</main>
</div>
</body>
</html>
04 · Product recipe
Gandalf is generic; this recipe shows its source product application. The patterns are limited to journeys implemented in the repository: account selection, synchronization, receive, UTXO visibility, compose/review/sign/result, status tracking, setup/import, password unsealing, and encrypted backup.
Primary network · Development
3.4200000000 UNIT
Bitcoin · Devnet
0.01500000 BTC
net1vzg6dy37v04myw48k9v2c5e9yx9nq4net1v zg6dy 37v04 myw48 k9v2c 5e9yx 9nq4
Review carefully
a78f2c1e90b4… : 10.0150tb1p9s…x2cz0.0010tb1qx7…d92j0.01392 accounts · vault 9d7ac103
Give the cause, retain user input when safe, and offer recovery.
Name the unreachable service; do not imply that no account activity exists.
State both expected and selected networks before any action.
Show a text label, submission hash, node acceptance, and next sync.
Show the block reference when available; color is supplementary.
Quote the node reason, release inputs, and provide edit-and-retry.
05 · Implementation guidance
Import the CSS, set one theme attribute at the application root, and consume semantic or component tokens. Primitive values are for theme definitions and auditing—not routine component authoring.
my-site/
├── index.html
└── gandalf-design-system.css
<!doctype html>
<html lang="en" data-theme="light">
<head>
<meta charset="utf-8">
<meta name="viewport"
content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="gandalf-design-system.css">
</head>
<body>
<button class="button button--primary">
Continue
</button>
</body>
</html>
<link rel="stylesheet" href="gandalf-design-system.css">
<article class="card">
<p class="eyebrow">Primary network · Development</p>
<button class="button button--primary">
Review transfer
</button>
</article>
.account-summary {
color: var(--color-text-primary);
background: var(--card-bg);
border: var(--border-thin)
solid var(--card-border);
border-radius: var(--radius-card);
}
.account-summary__action {
color: var(--button-primary-ink);
background: var(--button-primary-bg);
}
<html>...</html> <!-- light root -->
<html data-theme="dark">...</html>
// System preference
const dark = matchMedia(
'(prefers-color-scheme: dark)'
).matches
document.documentElement.dataset.theme =
dark ? 'dark' : 'light'
This direct-upload approach needs no build output or large media pipeline. Keep both named files available for downloads and publish a copy of the reference as index.html.
deploy_dir="$(mktemp -d)"
cp index.html "$deploy_dir/index.html"
cp gandalf-design-system.css "$deploy_dir/gandalf-design-system.css"
npx --yes wrangler pages deploy "$deploy_dir" \
--project-name=gandalf-system \
--branch=main \
--commit-dirty=true
First deploy
Wrangler creates or updates the static project and provides a public pages.dev address.
After domain purchase
Add the apex domain and optional www domain under Cloudflare Pages → Custom domains.
Public CSS
Once deployed, applications can link to https://YOUR-DOMAIN/gandalf-design-system.css.
gandalf-system; attach gandalfsystem.com after registration and the first deployment.| Original source | Normalized token | Decision |
|---|---|---|
| --bg | --color-canvas | Direct semantic rename |
| --bg-glow | --color-canvas-glow + page gradient | Split color from gradient composition |
| --panel | --color-surface / --card-bg | Direct semantic and component aliases |
| --panel-2 | --color-surface-inset / --field-bg | Direct semantic and component aliases |
| --line | --color-border-default | Direct; subtle/strong tiers derived |
| --ink | --color-text-primary | Direct; secondary tier derived |
| --muted | --color-text-muted | Direct |
| --gold | --color-action-primary / --color-focus | Role-specific aliases |
| --gold-ink | --color-action-primary-ink | Direct |
| --ok | --color-success | Purpose rename |
| --warn | --color-warning | Purpose rename |
| --danger | --color-danger | Direct |
| --info | --color-information | Purpose rename |
| Primary identity accent | --color-ledger-primary | Neutral reusable identity role |
| --lg-bitcoin | --color-ledger-bitcoin | Expanded abbreviation |
| --lg-cardano | --color-ledger-cardano | Expanded abbreviation |
| --lg-xrpl | --color-ledger-xrpl | Expanded abbreviation |
| --lg-stellar | --color-ledger-stellar | Expanded abbreviation |
| --focus: 0 0 0 2px | --shadow-focus | Preserved geometry; semantic focus color |
| #fff / #111 in QR | --color-qr-bg / --color-qr-ink | Technical fixed pair |
| rgba(0,0,0,.45) | --color-overlay / --color-scrim | Direct from sheet veil |
| Error toast #fff on dark danger | --toast-danger-ink | Theme-aware AA correction |
| 30 / 38 / 40px controls | --source-* plus --control-target | Preserved audit values; portable target corrected to 44px |
Agree on semantic contracts such as canvas, surface, text, border, action, status, focus, and control geometry. Let each product map its own primitives into those contracts.
Do not exchange page-specific classes between products. Shared packages should expose tokens and low-level components, never selectors named after one route, screen, or application.
/* Shared contract */
--shared-color-surface: var(--color-surface);
--shared-color-action-primary: var(--color-action-primary);
--shared-control-radius: var(--radius-control);
/* Gandalf keeps product identity */
--shared-network-primary: var(--color-ledger-primary);
--shared-security-boundary: var(--security-border);
Extracted Colors, type, spacing, radii, borders, popup shell, fields, buttons, cards, rows, status, setup, receive, send, signing, and security language.
Derived Secondary text, subtle/strong borders, semantic selection, and explicit elevation levels needed for a complete portable layer.
A11y fix 44px targets, light ledger glyph ink, and dark danger-toast ink.
Recommended Tabs, breadcrumbs, pagination, switch, tooltip, skeleton, table, dropdown, dialog, desktop sidebar, and mobile nav.
Stay informed
Get occasional notes about new tokens, components, accessibility work, and releases.