arrange: spacing scale + hero rhythm + opening beat

Targeted pass per impeccable:arrange — no markup changes, just sharper
spatial intent in the editorial base:

- New semantic spacing scale (--space-2xs through --space-3xl) at
  the top of :root. Subsequent rules pull from this scale instead of
  inline clamp() values; the scattered numbers stay only where they
  are type-specific (card padding, etc.).
- Hero internal rhythm rebalanced. Tagline keeps its generous gap
  (--space-xl), but bio now sits TIGHT against it (--space-sm) so
  they read as one thought, while the social rail jumps to
  --space-xl from the bio so it reads as a separate action layer.
  Previous mid-range 1.5/1.5/2rem values made everything feel
  equally connected.
- Opening beat: first .section after the hero (and the first child
  of <main>) gets --space-3xl top margin instead of --space-2xl, so
  the page actually breathes after the name before the masthead
  cadence settles in.
- Section masthead tightened: head gap nudged up, title weight
  350 -> 420 with a touch tighter tracking so Projects / Clients
  carry their poster weight.
- Marker bar pads asymmetrically now (--space-lg top, --space-md
  bottom) — typographic line of muted caps sits closer to the rule
  than to the page top, intentional.
This commit is contained in:
Joel Brock
2026-05-18 09:42:01 -07:00
parent 4ac4a9c3bb
commit aabd08371c

View File

@@ -37,6 +37,16 @@ a { color: inherit; text-decoration: none; }
--radius: 14px; --radius: 14px;
--ease: cubic-bezier(0.22, 1, 0.36, 1); --ease: cubic-bezier(0.22, 1, 0.36, 1);
--ease-strong: cubic-bezier(0.16, 1, 0.30, 1); --ease-strong: cubic-bezier(0.16, 1, 0.30, 1);
/* spacing scale — semantic, fluid. Use these instead of ad-hoc clamps. */
--space-2xs: 0.25rem;
--space-xs: 0.5rem;
--space-sm: 0.75rem;
--space-md: 1rem;
--space-lg: clamp(1.25rem, 1rem + 0.8vw, 1.75rem);
--space-xl: clamp(2rem, 1.5rem + 1.4vw, 3rem);
--space-2xl: clamp(3rem, 2rem + 3vw, 5rem);
--space-3xl: clamp(4.5rem, 3rem + 5vw, 7.5rem);
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
@@ -85,7 +95,7 @@ body::before {
/* ───── marker bar ───── */ /* ───── marker bar ───── */
.marker { .marker {
display: flex; align-items: center; gap: 1rem; display: flex; align-items: center; gap: 1rem;
padding: 1.25rem 0; padding: var(--space-lg) 0 var(--space-md);
border-bottom: 1px solid var(--rule); border-bottom: 1px solid var(--rule);
font: 500 var(--fs-mini)/1 var(--mono); font: 500 var(--fs-mini)/1 var(--mono);
text-transform: uppercase; text-transform: uppercase;
@@ -149,7 +159,7 @@ body::before {
opacity: 0.95; opacity: 0.95;
} }
.hero__tagline { .hero__tagline {
margin-top: clamp(1.5rem, 3vw, 2.25rem); margin-top: var(--space-xl);
font-family: var(--display); font-family: var(--display);
font-style: italic; font-style: italic;
font-weight: 400; font-weight: 400;
@@ -162,14 +172,15 @@ body::before {
} }
.hero__tagline span { color: var(--accent); padding: 0 0.2em; } .hero__tagline span { color: var(--accent); padding: 0 0.2em; }
.hero__bio { .hero__bio {
margin-top: 1.5rem; /* paired with tagline — tight gap so they read as one thought */
margin-top: var(--space-sm);
max-width: 48ch; max-width: 48ch;
color: var(--muted); color: var(--muted);
font-size: var(--fs-md); font-size: var(--fs-md);
} }
/* ───── social rail ───── */ /* ───── social rail — separated from the bio so it reads as the action layer ───── */
.social { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 2rem; } .social { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: var(--space-xl); }
.social a { .social a {
display: inline-flex; align-items: center; gap: 8px; display: inline-flex; align-items: center; gap: 8px;
padding: 9px 16px; padding: 9px 16px;
@@ -185,7 +196,11 @@ body::before {
.social svg { width: 16px; height: 16px; } .social svg { width: 16px; height: 16px; }
/* ───── sections ───── */ /* ───── sections ───── */
.section { margin-top: clamp(4rem, 7vw, 6rem); } .section { margin-top: var(--space-2xl); }
/* opening beat — first section after the hero gets extra air, then the
rhythm settles into the regular cadence */
.hero + .section,
main > .section:first-child { margin-top: var(--space-3xl); }
.section--headless { .section--headless {
/* nest visually under the previous section instead of starting a new one */ /* nest visually under the previous section instead of starting a new one */
margin-top: clamp(2.75rem, 5vw, 4.5rem); margin-top: clamp(2.75rem, 5vw, 4.5rem);
@@ -197,13 +212,13 @@ body::before {
.section__head { .section__head {
display: grid; display: grid;
grid-template-columns: auto 1fr; grid-template-columns: auto 1fr;
gap: clamp(1rem, 2.5vw, 2rem); gap: clamp(1.25rem, 3vw, 2.5rem);
align-items: end; align-items: end;
padding-bottom: 1rem; padding-bottom: var(--space-md);
margin-bottom: clamp(1.5rem, 3vw, 2.25rem); margin-bottom: var(--space-xl);
border-bottom: 2px solid var(--ink); border-bottom: 2px solid var(--ink);
} }
.section__numwrap { display: flex; flex-direction: column; gap: 0.2rem; align-self: end; } .section__numwrap { display: flex; flex-direction: column; gap: var(--space-2xs); align-self: end; }
.section__numwrap small { .section__numwrap small {
font-family: var(--display); font-family: var(--display);
font-size: var(--fs-md); font-size: var(--fs-md);
@@ -230,11 +245,11 @@ body::before {
} }
.section__title { .section__title {
font-family: var(--display); font-family: var(--display);
font-weight: 350; font-weight: 420;
font-variation-settings: "opsz" 144, "SOFT" 30; font-variation-settings: "opsz" 144, "SOFT" 30;
font-size: var(--fs-xl); font-size: var(--fs-xl);
line-height: 0.95; line-height: 0.95;
letter-spacing: -0.025em; letter-spacing: -0.028em;
color: var(--ink); color: var(--ink);
} }
.section__kicker { .section__kicker {