Design System
The tokens and components behind this site, rendered from the real stylesheet.
This page uses css/styles.css directly. Nothing here is a screenshot or a separate design file. If it looks wrong here, it looks wrong in production. See the Brand Identity page for the thinking behind these choices.
Color
Four colors, used the same way everywhere. Ink and Cloud carry the page. Navy is the one accent, spent on the thing that matters. Skylight only shows up when Navy would disappear against a dark surface.
--color-ink#000000 · 19.4:1Primary text, dark surfaces.
--color-ink-dimInk @ 78% · 11.3:1Secondary body copy.
--color-mutedInk @ 70% · 8.3:1Meta lines.
--color-bg#F5F6F5 · CloudPage background, not white.
--color-surface#FFFFFFCards, sitting a step above Cloud.
--color-accent#25476B · Navy · 8.8:1The one accent. Links, labels, the thing that changed.
--color-dark-accent#A8C0DA · Skylight · 11.2:1 on InkNavy's job, but on a dark band.
--color-borderInk @ 10%Hairlines between sections.
Typography
Poppins Bold
--font-headingHeadings, wordmark weight
Poppins Light
--font-labelEyebrows, labels, quiet text
Poppins Regular
--font-bodyBody copy, 400
Lora Italic
--font-quotePull-quotes, tagline
Brand Marks
A Navy square holding a white T: the spine and one bar, equal weight, fused into a single shape. Nothing else. The mark carries its own background, so it reads the same on a light nav or a dark one.
24pxFavicon
34pxNav
64pxHero
Tyler Quackenbush
.hero__wordmarkName lockup
Mark Process
Two rectangles, equal thickness, fused where they meet: a spine and a bar. That's the whole mark, a sideways T, for Tyler. No illustrated icon, no gradient, no third color standing in for detail the shape doesn't need.
White on Navy, because the mark carries its own background and has to read at 16 pixels as clearly as it does at billboard scale. Equal stroke weight on both bars keeps it looking like a built shape instead of a hand-drawn flourish. Centered exactly, not eyeballed, the same discipline this site asks of a sentence, applied to a rectangle.
Spacing & Radius
--radius-sm4px--radius-md8px--radius-lg12px--radius-xl16px--radius-pill999px--section-padding-xclamp(24px, 6vw, 96px)--section-padding-yclamp(56px, 9vh, 100px)--content-max-width1120pxTwo breakpoints do almost all the work: 780px collapses multi-column grids to one and swaps the nav to its mobile dropdown, 700px (occasionally 600px, where a component needs the extra room) handles the smaller stuff, like case-study stat grids.
Buttons
View markup
Cards & Tiles
Stat card
Stat card
Used across case studies (.cs-stat) and the homepage results band (.results-band__stat).
Pill-shaped, --color-surface fill (.tag-list__item). Competencies, skills, anything that's a flat list of nouns.
01
Process card
White surface, numbered label, used for the Approach page's three-step grid.
Callout Bands
Full-bleed dark sections break up the page rhythm: --color-ink background, Skylight for the eyebrow label and any number that needs to stand out, everything else in white or a Cloud-tinted rgba for body text.
Sample · Band Label
Heading stays white
Body copy on a dark band, used on the homepage results band and the Approach page's principles band.
States & Feedback
Every interactive element (.btn, .site-nav__link, .work-list__link, .cs-next__link, .cta-band__link) pairs :hover with :focus-visible so keyboard users get the same feedback as mouse users. The stat counter ([data-count-to]) respects prefers-reduced-motion and jumps straight to the final value rather than animating for users who've opted out.
Accessibility
Built to WCAG 2.1 AA, verified by the numbers above rather than assumed. Every text/background pairing on this site clears 4.5:1 for normal text, most clear AAA's 7:1. The one color that sat close to a floor, muted meta text, was widened from an original 4.6:1 (too close to the 4.5:1 line for comfort) to 8.3:1.
Focus
Native browser outline, never suppressed. No custom focus ring anywhere on the site, because the default already works and a hand-rolled one is one more thing to get wrong.
aria-current
The active nav link gets an aria-current="page" attribute alongside its visual active state, so screen reader users get the same "you are here" signal sighted users get from the underline.
Touch targets
The mobile hamburger is 44×44px, and each nav row's tap target spans the full row, not just the text. An earlier version left dead space that looked clickable and wasn't.
Reduced motion
The stat counter checks prefers-reduced-motion and jumps straight to the final number instead of animating.
Future Components
Not yet built, but the visual language already implies these if they're ever needed: a form/input pattern (this site has no forms yet: contact is mailto-only, deliberately, to avoid collecting data this site has no server to handle securely), a loading/skeleton state for the stat counter's pre-animation moment, and a toast/inline-confirmation pattern for a future "copy to clipboard" affordance on the microcopy specimens.