Reference
Design System
A complete reference for the visual and interactive language of this portfolio. Covers color tokens, typography, spacing, layout, components, motion, and breakpoints.
01 — Color
02 — Typography
Display font
Syne
Used for all headings, the navbar logo, tags, and numerals. Weight 700 and 800.
Body font
DM Sans
Used for all body text, meta, descriptions. Weights 400 and 500.
Selected Work
03 — Spacing
Base unit is 4px. All spacing values are multiples of 4. The scale below lists every value used across the site, with its primary context.
04 — Layout
1200px
Applied via .container, centers content on wide viewports
0 56px → 0 24px (≤768px)
Horizontal breathing room on either side of the content column
72px (--nav-h)
Fixed. Used as offset token for page header top padding
72px 1fr 380px
Number · info · image. Collapses to 56px 1fr on mobile, image hidden
72px 1fr
Number · body. Body is 1fr 420px, collapses to 1fr at ≤1024px
1.2fr 1fr gap 100px
Bio · details. Collapses to 1fr at ≤1024px
160px 1fr gap 40px
Period · role/company/desc. Collapses to 1fr at ≤768px
repeat(auto-fill, minmax(170px, 1fr)) gap 2px
Auto-responsive tile grid
100px 0 → 64px 0 (≤768px)
Vertical rhythm for all .section blocks
gap: 2px
Used between grid tiles throughout the site to create a subtle seam, not a gutter
05 — Components
Selected Work
::before pseudo: 32×1px --muted line
color --muted · background --surface · padding 5px 12px · border-radius 2px
.wip-dot: 7px circle --accent · animation wip-pulse 1.8s infinite (opacity 1→0.25→1)
border-bottom 2px --accent · padding-bottom 4px
hover: color --accent · gap grows 10px→18px (transition .25s ease-out)
hover: background --text · color --bg (transition .2s ease)
color --muted on default · color --text on hover · color --text + active underline on active page
Used between project cards, experience items, contact rows, footer
Hover: grayscale(0%) + scale(1.06)
filter transition: 0.45s ease-out
transform transition: 0.55s ease-out
.proj-card:hover img → filter grayscale(0%) · transform scale(1.06)
.link-hover state: 44×44px · background --accent · transition .2s ease-out
Triggered on: a, button, .proj-card, .feat-card, .skill, .contact-row
06 — Motion
Fade up (scroll)
opacity 0→1 + translateY 36px→0
transition: .7s ease-out
delay: i × 0.08s (max 5 items)
Applied via .fade-up class + IntersectionObserver. Triggers once when element enters viewport at threshold 0.08.
Name marquee
translateX(−50%) → translateX(0%)
timing: linear, infinite loop
Herman: 8s · Brenn: 14s · Svendsen: 7s
Each name is duplicated. At −50% the second copy is visible; at 0% the first copy is visible. Seamless because both copies are identical.
Navbar scroll
background + backdrop-filter + box-shadow
transition: .35s ease
Activates .scrolled class when window.scrollY > 16px. Adds rgba background with blur(20px) frosted glass effect.
Nav underline
width 0→100%
transition: .25s ease-out
2px --accent line grows from left on hover and stays at 100% on .active page link.
Carousel crossfade
opacity 0→1
transition: .6s ease
interval: 3000–3500ms
Images stacked absolutely, crossfade via opacity. mix-blend-mode: multiply keeps light backgrounds transparent. Pauses on hover.
WIP dot pulse
opacity 1→0.25→1
animation: 1.8s ease-in-out infinite
7px --accent circle. Softly pulses to indicate an ongoing or live project state.
Contact row hover
padding-left 0→20px
transition: .25s ease-out
arrow: translate(10px, −10px)
Row slides right and the arrow moves diagonally up-right on hover. Value text transitions to --accent.
07 — Breakpoints
Responsive type: clamp() values