µMode CSS @microdom
Hero · full bleed

Chrome calls it 'wasted bytes'.
The industry calls it 'best practice'.

~90% of the code content websites ship every day is useless to the reader — and everyone pays for it anyway.

View MoreGitHub
<section µ-hero="full" >
  <img src="files/hero-v1.jpg" alt="" loading="lazy">
  <div>
    <header>
      <small>Hero · full bleed</small>
      <h1>Chrome calls it 'wasted bytes'.
      The industry calls it 'best practice'.</h1>
      <p>~90% of the code content websites ship every day is useless to the reader — and everyone pays for it anyway.</p>
    </header>
    <div µ-flex>
      <a href="#" role="button">Get started</a>
      <a href="#" role="button">Learn more</a>
    </div>
  </div>
</section>
/* A direct > img child turns the hero into a full-bleed cover. */
[µ-hero] {
  position: relative; isolation: isolate; overflow: hidden;
  max-width: var(--max-width); margin: 1.5rem auto;
  padding: clamp(2rem, 5vw, 4rem);
  border: 1px solid var(--color-border); border-radius: var(--radius);
  background: var(--card-grad);

  & > img { position: absolute; inset: 0; z-index: -2;
    width: 100%; height: 100%; object-fit: cover; }
  &:has(> img)::after { content: ""; position: absolute; inset: 0;
    z-index: -1; background: linear-gradient(90deg, rgba(7,9,13,.86), rgba(7,9,13,.45)); }
  &:has(> img) h1 { -webkit-text-fill-color: #fff; color: #fff; background: none; }
}
/* full-bleed variant breaks the max-width, re-centres the inner column */
[µ-hero~="full"] {
  max-width: 100%;
  & > div { max-width: var(--max-width); margin: 0 auto; }
}
Analytics preview
By the numbers · Critical Insights

A silent killer of page visibility

Residual code launches a dual-front assault : Inflates page weight with useless data and completely hijacks the browser's Main Thread.
Worse yet, the dead JS code triggers an automatic blind spot for AI search engines.

~2%

The words you came for

Share of a median page's transfer that is actual readable content. The rest is structure — and machinery.

251KB

Shipped, never executed

JavaScript the median page downloads, parses and compiles that never runs. Chrome's own audit calls it "wasted bytes".

0%

JavaScript run by AI crawlers

GPTBot, ClaudeBot and Perplexity execute none. Content rendered client-side simply doesn't exist for them.

+32%

Bounce at 3 seconds

How much the probability of abandonment grows when load time goes from 1 to 3 seconds. People don't wait.

<section µ-grid="2-col content reverse">
  <figure><img src="files/content-v4-left-image.jpg?v=83" alt="Analytics preview"></figure>
  <div>
    <header><small>By the numbers</small><h2>A silent killer of page visibility</h2></header>
    <p>Residual code launches a dual-front assault…</p>
    <div µ-grid="2-col stats">
      <div><b>~2<span>%</span></b><h3>The words you came for</h3><p></p></div>
      <div><b>251<span>KB</span></b><h3>Shipped, never executed</h3><p></p></div>
      <div></div>
    </div>
  </div>
</section>
/* 2-col from mode.css; "content" adds the split rhythm, "reverse" floats
   the media into the first column, "stats" styles the number sub-grid.  */
[µ-grid~="content"] {
  align-items: center; gap: clamp(1.5rem, 5vw, 3rem);
  & > figure img, & > img { width: 100%; border-radius: var(--radius);
    border: 1px solid var(--color-border); }
  & header small { display: block; font-family: var(--font-mono);
    letter-spacing: .18em; text-transform: uppercase; color: var(--steel); }
}
@media (min-width: 640px) {
  [µ-grid~="content"][µ-grid~="reverse"] > figure { order: -1; }
}
[µ-grid~="stats"] b {
  display: block; font-family: var(--font-mono); font-weight: 700;
  font-size: clamp(2rem, 5vw, 3rem); line-height: 1;
  background: linear-gradient(120deg, var(--ember-2), var(--color-accent));
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
Good to know

Questions, answered

Whether you're evaluating Mode CSS, comparing approaches, or simply wondering why things work differently here, these are the questions we hear most often.

Why would a content site need zero JavaScript?

Because content doesn't react. Reactivity machinery makes sense for apps with live, changing state — shipped to a page of text, it's cost without function. Even this accordion is a native <details> element: interaction, zero scripts.1

Does clean HTML really matter to AI?

More than ranking ever did. AI crawlers execute no JavaScript, so whatever sits in your initial HTML is the entirety of what they can read — and cite. If your content renders client-side, you're not ranked lower. You're absent.2

Isn't this already solved by SSR frameworks?

They bolt server-rendered HTML onto the same machinery: the bundle still ships, hydration still runs, the class soup still buries the content. The simpler fix isn't rendering the framework earlier — it's not needing one for pages that never change.3

What do the extra kilobytes actually cost?

A chronic tax collected on every visit: up to 350 ms of CPU per 100 KB of JS on a mid-range phone, drained batteries, readers who bounce at second three, AI tokens burned on markup — and about half of that JavaScript never even runs.4

<section µ-faq>
<header><small>Good to know</small><h2>Questions, answered</h2></header>
<details open>
  <summary>Why would a content site need zero JavaScript?</summary>
  <p>Because content doesn't react…</p>
</details>
<!-- … 3 more … -->
</section>
/* Pure native <details>/<summary> — the ::after marker flips +/– on [open]. */
[µ-faq] {
  max-width: 780px; margin-inline: auto;
  & details { border: 1px solid var(--color-border); border-radius: var(--radius);
    background: var(--card-grad); padding: 1rem 1.2rem;
    & p { margin: 0; color: var(--color-muted); }
  }
  & summary { cursor: pointer; font-weight: 600; color: var(--heading);
    list-style: none; display: flex; align-items: center; gap: 1rem;
    &::after { content: "+"; margin-left: auto;
      color: var(--ember-2); font-weight: 700; font-size: 1.4rem; }
  }
  & details[open] summary { color: var(--ember-2); margin-bottom: .7rem;
    &::after { content: "\2013"; }
  }
}
Sources
  1. Google V8 team: each additional 100 KB of JavaScript adds roughly 150–350 ms of processing time on a mid-range mobile device.
  2. HTTP Archive, Web Almanac 2025 (JavaScript & Page Weight chapters): the median mobile page ships 646 KB of JavaScript, of which 251 KB never executes on the page that loads it — flagged by Lighthouse as "wasted bytes".
  3. Vercel × MERJ crawler studies, 2024–2026: analysis of 500M+ GPTBot fetches found zero JavaScript execution; ClaudeBot, PerplexityBot and other major AI crawlers likewise render no JS. Google Gemini, riding Googlebot's infrastructure, is the one exception.
  4. Google/SOASTA mobile research, 2017: as page load time grows from 1 s to 3 s, the probability of a bounce increases 32%.
Microdom · templating

Unbundle your website

Plain HTML templating with Mode CSS.
No JS build step, no dead classes.
Fully redable for bots and hummans

Get startedRead the Docs
Design Principles

The mental model

Everything you style lives in one of three attribute layers. Master these and you know the whole library.

LayerRoleExample
1 · Structure A bare attribute that establishes a layout. <section µ-grid>
2 · Modifier Space-separated tokens that mutate the structure. µ-grid="3-col cards"
3 · Semantic A domain attribute describing what the element is. µ-pricing

Compose, don't customize — The one-naming pattern

Attribute values name the thing, never a CSS property. If a value reads like a Tailwind utility, it's wrong.

ExampleWhy
✓ doµ-grid="pricing"Describes the block.
✗ don'tµ-grid="centered"That's a property, not a thing.
✗ don'tµ-text-blueUtility class in disguise.

µ Template Mode

Clean markup, real cascading styles. Content, layout and hierarchy in plain sight — readable by humans, parseable by AI.

Gallery · The crew

Meet the people

Lorem ipsum dolor sit amet consectetur adipiscing elit tortor eu egestas morbi sem vulputate etiam facilisis pellentesque ut quis.

Team photo 1
Team photo 2
Team panorama
<section>
  <header>
  <small>Gallery · The crew</small>
  <h2>Meet the people</h2>
  </header>
  <div µ-grid="mosaic gallery">
    <figure><img src="files/01-meet-our-team-v6.jpg?v=83" alt="Team photo 1"></figure>
    <figure><img src="files/02-meet-our-team-v6.jpg?v=83" alt="Team photo 2"></figure>
    <figure><img src="files/03-meet-our-team-v6.jpg?v=83" alt="Team panorama"></figure>
  </div>
</section>
[µ-grid~="gallery"] {
  display: grid; gap: 1.1rem; margin-block: 1.5rem var(--spacing);
  & figure { margin: 0; border: 1px solid var(--color-border);
    border-radius: var(--radius); overflow: hidden; position: relative;
    transition: transform .18s ease, box-shadow .18s ease; }
  & figure img { display: block; width: 100%; height: 100%;
    object-fit: cover; transition: transform .35s ease; }
  & figure:hover { transform: translateY(-3px); border-color: var(--steel); }
  & figure:hover img { transform: scale(1.06); }
}
/* mosaic: the first tile spans 2x2, the rest fill densely around it */
[µ-grid~="mosaic"] {
  grid-template-columns: repeat(3, 1fr); grid-auto-rows: 1fr; grid-auto-flow: dense;
  & figure:first-child { grid-column: span 2; grid-row: span 2; }
}
Shop · Featured picks

Explore our latest product drop

Lorem ipsum dolor sit amet consectetur adipiscing elit tortor eu egestas morbi sem vulputate etiam facilisis pellentesque ut quis.

Cotton Tee$49.00

Cotton Tee

Lorem ipsum dolor sit amet conse bolli tetur adipiscing elit tortor eu.

Buy now Add to cart
Zip-Up Hoodie$199.00

Zip-Up Hoodie

Lorem ipsum dolor sit amet conse bolli tetur adipiscing elit tortor eu.

Buy now Add to cart
Knit Beanie$49.00

Knit Beanie

Lorem ipsum dolor sit amet conse bolli tetur adipiscing elit tortor eu.

Buy now Add to cart
<section>
  <header>
    <small>Shop · Featured picks</small>
    <h2>Explore our latest product drop</h2>
  </header>
  <div µ-grid="3-col products centered">
    <article>
      <figure>
        <img src="files/tshirt-ecommerce-card.jpg?v=83" alt="Cotton Tee">
        <b>$49.00</b>
      </figure>
      <h3>Cotton Tee</h3>
      <p>Lorem ipsum…</p>
      <a href="#" role="button">Buy now</a>
      <a href="#" role="button">Add to cart</a>
    </article>
    <!-- … 5 more products … -->
  </div>
</section>
[µ-grid~="products"] {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 2rem;
  & article { display: flex; flex-direction: column; gap: .55rem;
    background: var(--card-grad); border: 1px solid var(--color-border);
    border-radius: var(--radius); overflow: hidden; padding: 0 1.25rem 1.25rem; }
  & figure { position: relative; margin: 0 -1.25rem 1rem; aspect-ratio: 4 / 3; overflow: hidden; }
  /* price as a bare <b> badge over the image */
  & figure b { position: absolute; top: .75rem; right: .75rem;
    font-family: var(--font-mono); padding: .32rem .7rem; border-radius: 999px;
    background: linear-gradient(135deg, var(--ember-2), var(--color-accent));
    color: var(--color-accent-text); }
  & a[role="button"] { width: 100%; }
}
/* centered: card becomes a 2-col grid so the two buttons sit side by side */
[µ-grid~="centered"] {
  & article { display: grid; grid-template-columns: 1fr 1fr;
    text-align: center; gap: .6rem; }
  & figure, & h3, & p { grid-column: 1 / -1; }
  & a[role="button"] { width: auto; }
}
Featured story

Stories & Insights

Marketing analytics on a desk
Strategy

Tuning your ad campaigns for a higher ROAS

Lorem ipsum dolor sit amet consectetur adipiscing elit justo quis odio sit sit ac porttitor sit males dolor sit consectur dolor.

By Sharon Green · Jun 11, 2026
<section µ-blog>
  <header>
    <small>Featured story</small>
    <h2>Stories &amp; Insights</h2>
  </header>
  <article>
    <img src="files/02-blog-images.jpg?v=83" alt="Marketing analytics on a desk">
    <div>
      <small>Strategy</small>
      <h3><a href="#">Tuning your ad campaigns for a higher ROAS</a></h3>
      <p>Lorem ipsum…</p>
      <footer>
        <img src="files/sohphie-moore-team-member-avatar-picture.jpeg" alt="">
        <span>By <b>Sharon Green</b> · Jun 11, 2026</span>
      </footer>
    </div>
  </article>
</section>
/* Standalone [µ-blog] with no grid → one wide article (image | copy). */
[µ-blog] article {
  border: 1px solid var(--color-border); border-radius: var(--radius);
  background: var(--card-grad); overflow: hidden;
  display: grid; grid-template-columns: 1fr; gap: 0; padding: 0;
  & > img { width: 100%; min-height: 240px; object-fit: cover; }
  & > div { display: flex; flex-direction: column; padding: clamp(1.2rem, 3vw, 2rem); }
  & footer { display: flex; align-items: center; gap: .6rem; margin-top: auto; }
  & footer img { width: 34px; height: 34px; border-radius: 50%; object-fit: cover; }
}
@media (min-width: 768px) {
  [µ-blog] > article { grid-template-columns: 1.15fr .85fr; }
  [µ-blog] > article > img { grid-row: 1 / 99; }
}
Browse

Fresh off the blog

Strategy · Jun 11, 2026

Squeeze more ROAS from every ad dollar

Lorem ipsum dolor sit amet consectetur adipiscing elit justo quis odio sit sit ac porttitor sit males dolor sit consectur dolor.

Playbook · Jan 16, 2026

Assemble a growth stack that scales

Lorem ipsum dolor sit amet consectetur adipiscing elit justo quis odio sit sit ac porttitor sit males dolor sit consectur dolor.

<section µ-grid="3-col blog">
  <header>
    <small>Browse</small>
    <h2>Fresh off the blog</h2>
  </header>
  <nav>
    <a href="#" aria-current="true">All</a>
    <a href="#">Growth</a></nav>
  <article>
    <img src="files/01-blog-images.jpg?v=83" alt="">
    <small>Playbook · Jan 20, 2026</small>
    <h3><a href="#">Why retention beats acquisition every time</a></h3>
    <p>Lorem ipsum…</p>
  </article>
  <!-- … 5 more articles … -->
</section>
/* 3-col from mode.css; "blog" skins the cards + filter nav. */
[µ-grid~="blog"] {
  & > header { grid-column: 1 / -1; }
  & article { border: 1px solid var(--color-border); border-radius: var(--radius);
    background: var(--card-grad); overflow: hidden;
    display: flex; flex-direction: column; }
  & article small { font-family: var(--font-mono); text-transform: uppercase;
    letter-spacing: .07em; color: var(--steel); }
  /* card image bleeds to the card edges */
  & article > img { margin: calc(var(--spacing) * -1) calc(var(--spacing) * -1) var(--spacing);
    width: calc(100% + (var(--spacing) * 2)); aspect-ratio: 16 / 9; object-fit: cover; }
  & nav { display: flex; flex-wrap: wrap; gap: .5rem; grid-column: 1 / -1; }
  & nav a[aria-current="true"] { color: var(--ember-2);
    border-color: color-mix(in srgb, var(--color-accent) 45%, transparent); }
}
On the 'gram · Latest shots

Follow along on Instagram

Lorem ipsum dolor sit amet consectetur adipiscing elit tortor eu egestas morbi sem vulputate etiam facilisis pellentesque ut quis.

Instagram photo 1
Instagram photo 2
Instagram photo 3
Instagram photo 4

Follow us

<section>
  <header>
    <small>On the 'gram · Latest shots</small>
    <h2>Follow along on <a href="https://www.instagram.com/">Instagram</a></h2>
  </header>
  <div µ-grid="4-col gallery">
    <figure>
      <img src="files/01-instagram-image.jpg?v=83" alt="Instagram photo 1">
    </figure>
    <!-- … 7 more … -->
  </div>
  <p µ-flex>
    <a href="http://instagram.com" role="button">Follow us</a>
  </p>
</section>
/* Same [µ-grid~="gallery"] tiles; the "4-col" token (from mode.css)
   just sets four fixed tracks that collapse on small screens.*/
[µ-grid~="gallery"] {
  display: grid; gap: 1.1rem; margin-block: 1.5rem var(--spacing);
  & figure { border: 1px solid var(--color-border); border-radius: var(--radius);
    overflow: hidden; position: relative; transition: transform .18s ease; }
  & figure img { width: 100%; height: 100%; object-fit: cover;
    transition: transform .35s ease; }
  & figure:hover img { transform: scale(1.06); }
}
/* an inline <a> inside a gallery heading gets the accent treatment */
section > header h2 a { color: var(--steel); text-underline-offset: 4px; }