Design System
Tokens, components, and interaction patterns that unify every experience across this portfolio. This is the single source of truth — every value documented here is the actual value used in production.
Color Palette
Typography
Font Families
Google Sans
400 · 900The quick brown fox jumps over the lazy dog
Primary typeface — headings, body, UI · Google Sans
Type Scale
h1Page Title
h2Section Heading
h3Sub-section Label
h4Card Title
bodyBody text used for descriptions and content blocks across the portfolio.
captionLabels, tags, metadata
overlineSECTION LABEL
Spacing & Layout
Spacing Scale
2px4px8px12px16px24px32px48px64pxContainer
Section Spacing
mt-14 (56px)mt-8 (32px)mb-10 (40px)gap-3 or gap-460ms incrementspt-20 pb-16Pill Button
rounded-fullpx-3 py-1scale-95Brand Pill
Hover to see --brand-color glow effect. Border, background, and text shift toward the brand color on hover.
Tag Pill
border-[#c7cad8]/1560%Ghost & Link
Form Elements
ring-1 ring-emerald-400/20border-emerald-400/30rgba(199,202,216,0.05)rgba(199,202,216,0.1)8pxCards & Containers
Case Study Card
Card Title
Description text with up to two lines of content before truncating
Company Nameborder-[#c7cad8]/10border-[#c7cad8]/20translateY(-2px) scale(1.02)gradient sweep on ::beforeList Item
Product Name↗
Platform or description
Glass Card
Glassmorphic overlay
Used for sticky headers, modals, and overlays. Blur + semi-transparent background.
rgba(11,13,20,0.85)backdrop-filter: blur(12px)rgba(199,202,216,0.08)Icons & Iconography
Stroke-based, rounded caps/joins1.2 – 1.5currentColor (adaptive)10px14px16–19pxAnimation & Motion
Fade Up (Entrance)
Staggered entrance with 60ms delay increments
0.55scubic-bezier(0.16, 1, 0.3, 1)translateY(10px) → 0animation: none; opacity: 1Ping (Availability)
1.8s infinitebox-shadow pulse 2.8sMarquee (Auto-scroll)
28s linear infinitehover: animation-play-state: pausedlinear-gradient transparencyTick (Clock Colon)
opacity 1→0.15 ease-in-out 1s infiniteBorder Trace (Card Hover)
Hover the card below to see the gradient border sweep
Hover me
Gradient border trace
border-trace 0.6s ease-outlinear-gradient masked to borderAI Chat
Floating Button
46px circlergba(199,202,216,0.07)rgba(199,202,216,0.16)2.6s ease-out infinite2.6s ease-out 1.1s infinitefixed, bottom-right, inside max-w-2xlChat Window
min(340px, calc(100vw - 48px))440px#12141E16px0 8px 40px rgba(0,0,0,0.5)translateY(10px) scale(0.97) → identity, 0.2s easeMessage Bubbles
rgba(199,202,216,0.1)rgba(199,202,216,0.05)11px 11px 3px 11px11px 11px 11px 3px12px / line-height 1.5584%Typing Indicator
5px circlesrgba(199,202,216,0.45)chat-dot-bounce 1.2s ease-in-out infinite0s, 0.2s, 0.4stranslateY(-5px) at 30%Streaming & Features
The chat assistant uses Server-Sent Events (SSE) to stream responses from GPT-4o-mini in real time. Messages persist to sessionStorage so conversation history survives page navigations within a session.
Assistant responses support inline **bold** text and auto-linked route references — typing /sun-moon renders as a clickable link to the case study.
gpt-4o-mini0.65350SSE streamingsessionStorage16px (prevents iOS zoom)Enter to send, Esc to closeAccessibility
Color Contrast
Focus States
Tab through these elements to see focus indicators
ring-2 ring-emerald-400/50focus-visible (keyboard only)Reduced Motion
Every animation in this system respects prefers-reduced-motion: reduce. When enabled, all CSS animations resolve to their final state instantly and transitions are disabled.
14+ reduced-motion media queries across the stylesheet covering: fade-up, ping, marquee, gradient-breathe, tick, border-trace, cursor particles, changelog scroll, lightbox transitions, and availability glow.
Keyboard Navigation
Semantic Conventions
<button> for actions, never <div><a> for navigation, <Link> for routesaria-label on all icon-only buttonsaria-hidden on purely visual elementsDescriptive alt text, '' for decorativecursor: none disabled on touch devices