STWOF
Website Design System

Design
System.

The component system behind the Set The World On Fire website, organized the way it is actually built: small parts compose into larger ones. Tokens become atoms, atoms combine into molecules, molecules assemble into organisms, organisms fill templates, and templates render as live pages. One ground, one accent, square edges, mono labels.

Tokens
Atoms
Molecules
Organisms
Templates
Pages

A system, not a screen library.

STWOF builds revenue systems where every layer amplifies the next. The website is built the same way. Nothing here is a one-off; every page is assembled from a small, shared set of parts. Read it bottom-up: master the tokens and atoms and everything above them stays consistent for free.

TokensDecisions
The non-negotiables, expressed as CSS variables in ds.css: surfaces, ink, the one Ember accent, type, spacing, radius. Change a token, change everything downstream.
AtomsSingle elements
The smallest usable pieces, the mark, a button, a badge, an input, a label, an icon. They carry no layout of their own.
MoleculesSmall groups
A few atoms doing one job together, a feature card, a metric, a testimonial quote, a form field, a nav cluster.
OrganismsPage sections
Full, self-contained sections, the header, the hero, the system row, the stats band, the closing CTA, the footer.
TemplatesLayouts
The order and rhythm of organisms on a page, structure without final content. The skeleton a page is poured into.
PagesLive
A template filled with real copy and imagery, the shipped, running website. The proof the system holds.

Tokens.

The decisions every other layer inherits. They live as CSS custom properties in ds.css. Click any color to copy its variable.

Surfaces & ink
var(--void)
Void
#080808
Primary ground
var(--panel)
Panel
#0D0D0D
Raised surface
var(--panel-3)
Panel · 3
#161616
Hover · chip
var(--ink)
Ink
#F2F2F2
Primary text
var(--ink-dim)
Ink · dim
#9A9A9A
Secondary
var(--ink-faint)
Ink · faint
#808080
Labels · meta
var(--brand)
Ember
#DB262C
The one accent
var(--brand-deep)
Ember · deep
#9E1A1F
Pressed state
Type tokens
Aa
--font-display
Poppins · 600. Headlines, statements, metric values.
Aa
--font-body
Hanken Grotesk. Body copy, leads, buttons.
Aa
--font-mono
JetBrains Mono. Labels, eyebrows, meta.
DisplaySparks scatter. Systems blaze.clamp 40–76
SectionOne system. Zero gaps.clamp 30–54
BodyEvery layer feeds the next, so growth compounds.15–18
MonoWHAT WE DO · 0110–11

Atoms.

The smallest usable parts. Each one is a single element with no layout of its own, dropped into molecules and organisms wherever needed. Grouped here by the job they do.

Button.btn · .btn-primary / -secondary / -ghostPrimary is the only Ember element on most screens. Sizes: -sm / default / -lg.
<a class="btn btn-primary">Book a build call <span class="ar">→</span></a>
<a class="btn btn-secondary">See the system</a>
<a class="btn btn-ghost">Learn more</a>
Badge.badge · .badge.brand / .okMono status pill. Carries an optional leading dot.
DefaultAI citedQualifiedPerformance
<span class="badge brand"><span class="d"></span>AI cited</span>
<span class="badge ok"><span class="d"></span>Qualified</span>
Input field.lf-field · .lf-inputMono uppercase label with an Ember required mark, over a panel-2 input with a resting hairline border that flips to an Ember inset ring (and Void fill) on focus. Matches the contact form.
<div class="lf-field">
  <label>Work email <span class="req">*</span></label>
  <div class="lf-control">
    <input class="lf-input" type="email" placeholder="[email protected]" />
  </div>
</div>
Icon.icon-grid svg1.6px stroke, 24px grid, square joins. Line only, never filled.
Search
Analytics
Email
Capture
Automate
Route
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor"
     stroke-width="1.6">
  <circle cx="11" cy="11" r="6" /><path d="M20 20l-5-5" />
</svg>

Molecules.

A handful of atoms grouped to do one job. These are the reusable units a page is actually assembled from, the smallest thing worth naming and reusing.

Feature card.feature-cardIcon atom + heading + body. The repeating unit in feature rows.

You show up wherever they look

Search, AI answers, social, paid. You're there first, sending buyers somewhere built to win.

<div class="feature-card">
  <div class="ic"><svg>…</svg></div>
  <h4>You show up wherever they look</h4>
  <p>Search, AI answers, social, paid…</p>
</div>
Metric & stat.metric · .statDisplay-weight value with an Ember emphasis span, mono key beneath.
$32K+
Revenue preserved
~20 hrs
Returned every week

Manual follow-up handed to automation that never drops the ball.

<div class="metric">
  <div class="v"><em>$32K+</em></div>
  <div class="k">Revenue preserved</div>
</div>
Testimonial quote.qcard / figureEmber quote mark, display blockquote, role + mono note caption.
They rebuilt the whole pipeline and automated the busywork. I get about twenty hours back every week and nothing slips through anymore.
Operations-led service businessAutomation · CRM · pipeline
<figure class="qcard">
  <span class="qmark">“</span>
  <blockquote>They rebuilt the whole pipeline…</blockquote>
  <figcaption>
    <span class="qrole">Operations-led service business</span>
    <span class="qnote">Automation · CRM · pipeline</span>
  </figcaption>
</figure>
Nav cluster.hnav · .demo-navLabel links, dim until hover.
<nav class="hnav">
  <a href="#system">System</a>
  <a href="#who">Who it's for</a>
</nav>
Comparison row.cmp-list liPaired without/with rows. Ember check vs faint cross.
×Leads arrive and quietly disappear, untracked.
Every lead captured, tracked, and accounted for.
<ul class="cmp-list">
  <li><span class="mk-i">✓</span>Every lead captured and tracked.</li>
</ul>
FAQ item.faq detailsNative disclosure. Display question, ± toggle.
What do you actually get?
One revenue system: a custom site that ranks and converts, lead capture wired in, a CRM that tracks every opportunity, and automated follow-up, built to run as a single loop.
Why a system instead of just a website?
Because a single piece plateaus. The same pieces, wired together, stop adding up and start multiplying.
<details>
  <summary>
    <span class="q">What do you actually get?</span>
    <span class="ix"></span></summary>
  <div class="a">One revenue system…</div>
</details>

Organisms.

Full page sections, assembled from molecules and atoms. Each one below is a live, faithful recreation of a real homepage section, idealized to the system. Open the page to see it in its shipped context.

Hero · .heroOpen page ↗

Sparks scatter. Systems blaze.

Get found by the right buyers. Get chosen the moment they land. Close the loop before a competitor can reply. Growth stops being a grind and starts compounding.

Get found01
Get chosen02
Close the loop03
System row · #systemOpen page ↗
The system

One system. Zero gaps.

your-business.com#1
competitor-a.com
competitor-b.com

Show up wherever they look

Search, AI answers, social, paid. You're there first, sending buyers somewhere built to win.

New lead captured
Qualified · routedlive
Nothing waits

Every visit becomes opportunity

No lead goes untracked. A bot qualifies and routes them while they're still warm.

Revenue without the chase

Automated follow-up reaches out in minutes. You close while the interest is hot.

Stats band · #resultsOpen page ↗
Days
From handshake to live

A sharp custom site goes up fast, so it starts building trust right away.

~20 hrs
Returned every week

Manual follow-up handed to automation that never drops the ball.

$0
To get started

A custom site can launch with nothing upfront, so the system proves itself first.

Comparison · #changeOpen page ↗
Without a system
  • ×Leads arrive and quietly disappear, untracked.
  • ×Follow-up waits on you, and often never happens.
  • ×A dozen tools that don't talk to each other.
With your system
  • Every lead captured, tracked, and accounted for.
  • Follow-up fires in minutes, automatically.
  • One platform: site, CRM, and automation as one.
Closing CTA · #startOpen page ↗

Stop choosing between growing the business and running it.

The system gets architected, built, and run for you, so getting found, getting chosen, and closing the loop stop depending on you remembering to.

Footer · .site-footOpen page ↗
STWOF

Revenue systems that get your business found and chosen, then close the loop, built and run so growth compounds without the chaos.

© 2026 Set The World On Fire LLCSystems, not deliverables.

Templates.

The order and rhythm of organisms, structure before content. Each page in the site is one of these skeletons. The homepage is a long single-column scroll; legal and contact share a tighter masthead-and-body frame.

Homepage · long scroll
01Header.site-header
02Hero.hero
03Intro statement.intro-statement
04System row#system
05Testimonial.tfire
06Who it's for#who
07Stats band#results
08Comparison#change
09Proof + FAQ#proof · #faq
10Closing CTA#start
11Footer.site-foot
Contact & legal · masthead + body
01Header.site-header
02Masthead.legal-hero
03Body / form.wrap2
04Footer.site-foot
Shared frame rules

Every template opens with the sticky header and closes with the four-column footer. Content lives inside .wrap2 (max 1440px). Sections alternate Void and Panel grounds; Ember appears at most once per viewport.

Pages.

Templates filled with real copy and imagery, the shipped site. These are live captures of the running pages; open any one to interact with it.

stwof.comOpen ↗
Homepage
HomepageThe full revenue-system narrative: hero, system, proof, comparison, FAQ, CTA.
stwof.com/contactOpen ↗
Contact
ContactMasthead over the booking form, built on the shared frame.

Working rules.

How to extend the system without breaking it. When in doubt, compose existing parts before inventing new ones.

Naming

Atoms and molecules use flat, semantic class names (.btn, .feature-card). Organisms are page sections keyed by id. No utility soup.

Compose first

Need something new? Combine atoms into a molecule before writing fresh CSS. Most “new” components are an existing card with different content.

One accent

Ember marks a single priority per view. Active state, primary action, or the emphasized word, never more than one at a time.

Square edges

Radius is 0 everywhere except the logomark. Don't reintroduce rounding on cards, buttons, or inputs.

Responsive

Layouts collapse to a single column under 780px; the header nav hides under 980px. Type scales with clamp().

Accessibility

Ink-on-Void clears AA. Keep focus rings (the Ember inset on inputs), real <button>/<a> elements, and visible labels.