Section 08 · Components

Buttons.

Four variants. Three sizes. One destructive flavour. That's the whole inventory — anything else is a link, an icon button, or a misuse of attention.

Variants

primaryneon fill · dark label · glow shadow one per visible region
ghosttransparent · line-2 border · fg label secondary actions
linkno border · no fill · fg-dim → fg on hover cancel · close · tertiary
destructivetransparent · danger border + label delete · disconnect · revoke
One primary per region. A region is a card, a modal, a panel, an empty state. The hero CTA is primary; the "Read the docs" beside it is ghost. Two primaries side-by-side never.

Sizes

Icon buttons

Square, equal padding, 32px / 36px / 40px. Always a title or aria-label.

States

Do / Don't

● Do
One primary, one ghost. Clear hierarchy of consequence.
● Don't
Two primaries make both feel mandatory. Decision paralysis.
● Do
Destructive is ghost-shaped — not red-filled. Filling it makes accidental clicks twice as costly.
● Don't
Red fill draws the eye. Reserve red for "this happened" not "do this."

Spec

button.css.btn-primary {
  background: var(--vp-color-neon);
  color: "#06140d";
  border: 1px solid var(--vp-color-neon);
  border-radius: var(--vp-radius-md);
  padding: 9px 16px;
  font: 600 13.5px/1 var(--vp-font-body);
  box-shadow: 0 0 0 1px var(--vp-color-neon), 0 6px 20px -6px var(--vp-color-neon-glow);
  transition: background var(--vp-dur-fast) var(--vp-ease-standard);
}
.btn-primary:hover { background: var(--vp-color-neon-lime); }
.btn-ghost {
  background: transparent;
  color: var(--vp-color-fg);
  border: 1px solid var(--vp-color-line-2);
}
.btn-ghost:hover { background: var(--vp-color-bg-2); }