Hero
Heroes invert: an ink block with white type, an amber-accented display line, and at most two actions. The dot-grid texture at 8% opacity is the only decoration allowed on top.
Recipe
import { Button } from '@elirobinson/react/components/atoms/Button';
import { Eyebrow } from '@elirobinson/react/components/atoms/Eyebrow';
export function Hero() {
return (
<section className="hero">
<Eyebrow className="hero__eyebrow">Builder. Consultant. Founder.</Eyebrow>
<h1 className="hero__title">
Practical tech, honestly built<span className="hero__dot">.</span>
</h1>
<p className="hero__lead">
I'm Eli Robinson — I build software, teach AI, and create resources for coaches.
</p>
<div className="hero__actions">
<Button variant="accent" size="lg">
See the work
</Button>
<Button variant="ghost" size="lg" className="hero__ghost">
Get in touch
</Button>
</div>
</section>
);
}.hero {
background: var(--bg-inverse);
color: var(--fg-inverse);
padding: var(--space-13) var(--gutter);
/* 8% white dots — the one sanctioned texture */
background-image: radial-gradient(oklch(100% 0 0 / 0.08) 1px, transparent 1px);
background-size: 24px 24px;
}
.hero__eyebrow {
color: var(--signal-400);
}
.hero__title {
font-family: var(--font-display);
font-weight: var(--fw-semibold);
font-size: clamp(48px, 7vw, var(--fs-8xl));
line-height: var(--lh-tight);
letter-spacing: var(--tr-tight);
margin: var(--space-4) 0 var(--space-5);
max-width: 14em;
}
.hero__dot {
color: var(--accent);
}
.hero__lead {
font-size: var(--fs-xl);
line-height: var(--lh-relaxed);
color: var(--ink-300);
max-width: var(--container-md);
margin: 0 0 var(--space-7);
}
.hero__actions {
display: flex;
gap: var(--space-4);
}Rules
- Display type uses
clamp()so the headline survives translation and narrow screens. - The period is part of the sentence — end the display line with an amber dot, the wordmark's signature move.
- Two actions maximum: one accent, one quiet. Never two ambers.
- No gradients, no imagery meshes. If the hero needs an image, it's a real photograph — warm, slightly desaturated — in a 16:10 block beside the copy on a 7–5 split, not behind it.
- Light-hero variant: same structure on
--bgwith--fgtype; keep the amber dot.