Building this website
A small subset of the system and design choices that support this website. The true source of truth is maintained in CLAUDE.md — setting context and mitigating drift.
Typography
A role-based type scale, all set in font-normal. Volume comes from size, never weight — bold belongs on labels, not headlines.
Content dictates form
text-displayHero headlines only
Content dictates form
text-h1Page-level headings
Content dictates form
text-h2Section headings, pull quotes, stats
Content dictates form
text-h3Sub-section headings within a section
Content dictates form
text-body-biggestCard titles, sub-headings, overview prose
In order to create the universal, you must pay very great attention to the specific.
text-body-bigPrimary prose, bio copy
In order to create the universal, you must pay very great attention to the specific.
text-body-smallSecondary prose, links, nav, badges
Design Systems · 2024 · Lead Designer
text-smallCaptions only
Role · Team · Local Time
text-smallFooter headers, TOC title, metadata field labels
Icons
Lucide. Stroke weight scales inversely with size — bolder for UI, lighter for decorative.
Size
size={20} strokeWidth={2}UI icons at body-small scale — buttons, inputs, nav, inline links
size={24} strokeWidth={2}Inline with body-small text, standalone icons
size={32} strokeWidth={1.5}Decorative / card icon
size={48} strokeWidth={1.5}Large decorative icon — stat cards, hero accents
Color
Color inherits from adjacent text — never set explicitly when an icon sits next to a word.
Color
Two layers — atomic raw values, semantic roles. Components only ever reference roles, so a retheme is a token swap, never a markup edit.
Neutral Scale · Atomic
neutral-000#FFFFFF→ bg-secondary, text-inverseneutral-050#fafaf9→ bgneutral-100#f5f5f4→ border-subtleneutral-200#e7e5e4→ bg-tertiary, borderneutral-300#d6d3d1→ border-strong, text-placeholderneutral-400#a8a29eneutral-500#78716c→ text-tertiaryneutral-600#57534e→ text-secondaryneutral-700#44403cneutral-800#292524neutral-900#1c1917→ bg-inverse, text-primaryneutral-950#0c0a09Primary · Atomic
Brand pink. Used for inline emphasis in case-study prose, callout numbers, and stat metrics.
primary#DA007BText · Semantic
text-text-primary#1c1917text-text-secondary#57534etext-text-tertiary#78716ctext-text-placeholder#d6d3d1text-text-disabled#d6d3d1text-text-inverse#FFFFFFtext-text-link#085fa0text-text-link-hover#064b7dtext-text-on-brand#FFFFFFBackground · Semantic
bg-bg#fafaf9bg-bg-secondary#FFFFFFbg-bg-tertiary#e7e5e4bg-bg-inverse#1c1917bg-bg-brand#EAF4F4Border · Semantic
border-border-subtle#f5f5f4border-border#e7e5e4border-border-strong#d6d3d1border-border-focus#000ECDHighlights · Application
Riley is an experience strategist, interaction designer and designer engineer based in Brooklyn, NY.
Gradient · Semantic
Two gradients. red→pink for hero copy and testimonial quotes; pink→orange for decorative use only — Footer wordmark, Nav logo dot, About glow.
from-gradient-red to-gradient-pink#f02065 → #d5189bfrom-gradient-red from-[22%] to-gradient-orange#f02065 → #ff7700Inline text highlights
from-gradient-red to-gradient-pink — the only gradient used as a text highlight. See components/Hero.tsx and components/TestimonialCarousel.tsx.
Spacing
4px base unit. Every gap on the site is a step on this ladder.
Scale
px
Semantic role on this site
14px
Inline link inner gap (gap-1); footer column gap (gap-1)
1.56px
Tag inner padding vertical (py-1.5); metadata cell gap (gap-1.5)
28px
Button icon gap (gap-2); nav links row gap (gap-2)
2.510px
Nav logo gap (gap-2.5); Tag horizontal padding (px-2.5); TOC item padding horizontal
312px
Filter Pill (small) / Tab / Segmented Control segment horizontal padding (px-3)
416px
Filter Pill (default) horizontal padding (px-4); Button icon gap row spacer
624px
Button horizontal padding (px-6)
728px
Callout card vertical padding (py-7)
832px
Two-column gap, section inner gap (gap-8); small vertical spacer (h-8)
1040px
Horizontal page padding desktop (px-10); callout horizontal padding (px-10)
1248px
Medium vertical spacer before images (h-12); hero bottom padding (pb-12)
1664px
Hero top padding (pt-16); cover image bottom padding (pb-16)
2080px
3-column body section vertical padding (py-20)
2496px
Between subsections (h-24); next section bottom padding (pb-24)
Radius
Three radii do the work — a subset of Tailwind's default scale. Soft but precise: enough rounding to feel approachable, never so much that the geometry goes soft.
Class
Value
Use
rounded-sm4px
Cards, callout cards, image blocks, cover image, InlineCode chip, Segmented Control segments (primary use)
rounded-md8px
Button (primary + outline); Segmented Control container
rounded-full9999px
IconButton, Filter Pill, Tag, Carousel Dot, nav logo dot
Shadow
Reserved for media excerpts and elements that obviously float above the page. One shadow does the work — shadow-sm — for controlled, subtle emphasis.

Motion
Two duration budgets. 150ms for color, 200ms for transform — color shifts feel snappiest fast and definite; transforms feel more intentional with slightly more travel time.
Page entry
animate-fade-in-up0.55s ease-out · fires on scroll
Hover lift
duration-200200ms · transform
Arrow rotate
transition-transform150ms · rotate-45° on group-hover
Hero stagger delays are hand-tuned per page — picked by eye for each page's pacing, not derived from a shared scale.