AESTHETIC homegithub

Seventeen primitives. Each class opens its rendered specimen and the canonical markup — what you see is what you ship.

CLASS ROLE SINCE
.ae-screen / .ae-bar / .ae-stage viewport shell: chrome bars, centered stage 2.0
.ae-wide screen modifier: the 68rem measure for catalog shapes 2.3
.ae-stage-scroll inner scroll for long documents — this very page 2.0
.ae-view one screenful, quiet entrance on remount 2.0
.ae-nav + .ae-nav-ind view switcher, sliding ink underline 2.1
.ae-row-link whole-row links; the cursor never strobes 2.1
.ae-chrome / .ae-foot the 13px chrome register; hairline footer 2.1
.ae-icon Lucide at 1.5px stroke, riding with text 2.1
.ae-mode sun/moon rotate-crossfade toggle 2.1
.ae-panel soft depth for dense content, radius 0 2.1
.ae-name / .ae-lede the name, never large; the argument, plainly 1.0
.ae-group / .ae-h a section and its muted heading 1.0
.ae-item / .ae-dim medium ink / muted ink 1.0
.ae-accent THE accent: one per view 1.0
.ae-label / .ae-input fields as lines, not boxes 1.0
.ae-button / .ae-button-quiet solid ink primary, hairline secondary 2.2
.ae-send label resolves to “Sent ✓”, exactly once 2.2

.AE-SCREEN / .AE-BAR / .AE-STAGE

One viewport, never scrolling: a bar, a centered stage, a bar. Add .ae-wide to the screen for the 68rem catalog measure.

NAMEnav · mode
the stage — one view, centered
chromelinks
<div class="ae-screen">
  <header class="ae-bar">
    <a class="ae-name" href="/">NAME</a>
    <nav class="ae-nav">…</nav>
    <button class="ae-mode">…</button>
  </header>
  <main class="ae-stage">
    <div class="ae-view">…one screenful…</div>
  </main>
  <footer class="ae-bar">…</footer>
</div>

.AE-STAGE-SCROLL

For genuinely long documents: the document scrolls inside the stage, the chrome stays put, the page itself never scrolls.

Legal pages, changelogs, long-form prose — the screen law holds, the inner column moves. This box scrolls; the bars around this page do not. The chrome register keeps utility text at 13px while content stays at the one size. Scroll on: nothing above or below this column will move, which is the entire point.

<main class="ae-stage ae-stage-scroll">
  <article>…the long document…</article>
</main>

.AE-NAV + .AE-NAV-IND + .AE-VIEW

Quiet words with a sliding ink underline. Views remount on swap and replay their entrance.

<nav class="ae-nav">
  <button aria-current="page">work</button>
  <button>writing</button>
  <button>contact</button>
  <span class="ae-nav-ind"></span>
</nav>
// the site positions the indicator
// (left/width) on view change

.AE-ROW-LINK

In lists, the whole row is the link — the cursor never strobes across dead bands between rows.

A project that matters — and its quiet description Another worth reading — hover anywhere on the row
<a class="ae-row-link" href="…">
  <span class="ae-item">A project that matters</span>
  <span class="ae-dim">— and its description</span>
</a>

.AE-CHROME / .AE-FOOT

The one sanctioned second size: 13px, muted ink, for footers, utility links, and metadata.

v2.3.1 · MIT githubnpm
<footer class="ae-foot">
  <span>v2.3.1 · MIT</span>
  <span class="ae-foot-links">
    <a href="…">github</a><a href="…">npm</a>
  </span>
</footer>

.AE-ICON / .AE-MODE

Lucide, inlined as SVG symbols: 1.5px stroke, round caps, sized to ride with text. The mode toggle rotate-crossfades sun and moon.

Icons ride with text , and the toggle is live:

<button class="ae-mode" aria-label="toggle color mode">
  <svg class="ae-icon ae-sun">…sun…</svg>
  <svg class="ae-icon ae-moon">…moon…</svg>
</button>
// toggle .dark/.light on the root;
// pin style.colorScheme to match

.AE-PANEL

Soft depth for genuinely dense content: light shadow in light mode, wash in dark, radius 0. Forms on a stage stay naked.

Dense content lives here

and earns its quiet lift off the surface.

<div class="ae-panel">
  …dense content…
</div>

THE REGISTERS

Hierarchy is ink and weight, never scale. Faint ink is decoration only — placeholders and resting underlines.

THE NAME

The lede: the page's whole argument, plainly.

An item that matters

supporting matter, muted

The one accent per view.

<p class="ae-name">THE NAME</p>
<p class="ae-lede">The argument, plainly.</p>
<p class="ae-item">An item that matters</p>
<p class="ae-dim">supporting matter</p>
<span class="ae-accent">one accent</span>

.AE-LABEL / .AE-INPUT

A line, not a box. Placeholders are decorative supplements to always-visible labels.

<label class="ae-label" for="name">Name</label>
<input class="ae-input" id="name" type="text">

<textarea class="ae-input"></textarea>

.AE-BUTTON / .AE-SEND

Contained ink shapes with a small press — links navigate, buttons act. The send moment resolves exactly once; success persists and the control disables.

<button class="ae-button ae-send">
  <span class="ae-send-label">Send message</span>
  <span class="ae-send-done" aria-hidden="true">
    Sent <svg class="ae-icon">…check…</svg>
  </span>
</button>
// on success: add .is-sent, set disabled