Portfolio Design System
A comprehensive design system built with systematic tokens, reusable components, and accessibility-first principles. Demonstrates design systems thinking through deliberate color architecture, typography scale, spacing systems, and component composition—all documented with interactive examples and usage guidelines.
Overview
A comprehensive design system demonstrating systematic design thinking through deliberate token architecture, reusable components, and accessibility-first patterns. Built with modern technologies while maintaining design system portability and scalability.
Design Philosophy
Systematic Token Architecture
OKLCH color space for perceptually uniform hues, 4px base unit for consistent spacing rhythm, and Major Third (1.250) typography scale create mathematical harmony across all components.
Component Composition Patterns
Components built with functional composition—each accepts typed props, handles its own state, and composes with others. Astro Islands enable progressive enhancement while maintaining static-first performance.
Accessibility as Foundation
WCAG AA compliance through semantic HTML, ARIA patterns, keyboard navigation, and minimum 4.5:1 contrast ratios. Focus states use 2px outlines with 2px offset for visibility without compromising aesthetics.
Performance-Driven Decisions
Lazy-loaded components, optimized GSAP animations, and Astro's partial hydration strategy deliver 94+ Lighthouse scores. Design decisions prioritize perceived performance through skeleton states and instant feedback.
Methodology
- → Component-driven development with Astro Islands architecture
- → Type-safe props and interfaces with TypeScript strict mode
- → Utility-first CSS with Tailwind CSS v4
- → Semantic component library with daisyUI v5
- → High-performance animations with GSAP ScrollTrigger
- → Git-based version control with conventional commits
Impact Metrics
Design Tokens in Action
Design tokens translate design decisions into reusable values. These examples show how systematic tokens create consistency across the entire interface.
Semantic Color Architecture
Primary Palette
Semantic Feedback
4px Base Unit Spacing
All spacing follows a 4px base unit rhythm for visual harmony and consistency.
xs: 4px - Tight spacing, inline elementssm: 8px - Related elements, compact layoutsmd: 16px - Component padding, comfortable spacinglg: 24px - Section spacing, content blocksxl: 32px - Major section breaks2xl: 48px - Page-level spacingMajor Third Typography Scale (1.250)
Implementation Stack
Built with modern web technologies that enable component-based architecture, progressive enhancement, and design token portability. Technology choices prioritize developer experience while maintaining design system principles.
Design Architecture
- → W3C Design Tokens: Framework-agnostic token format
- → OKLCH Color Space: Perceptually uniform colors
- → 4px Base Unit: Mathematical spacing harmony
Component System
- → React 19: Typed components with props
- → Astro Islands: Partial hydration strategy
- → TypeScript: Type-safe design system
Visual System
- → Tailwind CSS v4: Utility-first styling
- → daisyUI v5: Semantic component classes
- → GSAP: Performance-optimized animations
Architecture
The portfolio site follows a modern component-based architecture with clear separation of concerns.
File Structure
src/
├── components/ # React components
│ ├── home/ # Home page components
│ ├── about/ # About page components
│ ├── case-studies/ # Case study components
│ ├── ui-design/ # UI design showcase components
│ ├── layout/ # Layout components (Header, Footer)
│ └── shared/ # Shared/reusable components
├── layouts/ # Astro layouts
│ ├── BaseLayout.astro
│ ├── DSLayout.astro
│ └── UIShowcaseLayout.astro
├── pages/ # Astro pages (file-based routing)
│ ├── index.astro
│ ├── about.astro
│ ├── design-systems/
│ └── ui-design/
├── styles/ # Global styles
│ └── global.css
└── design-systems/ # Design system documentation
├── _showcase/ # Showcase components
├── _template/ # Template design system
└── portfolio-site/ # This design systemComponent Patterns
Astro Islands
Static HTML by default, hydrate React components only where needed with client:load, client:idle, or client:visible directives.
<Header />
<HeroScroll client:load />
<WorkCards client:idle />
<Footer client:load />Typed Props
All React components use TypeScript interfaces for type-safe props.
interface DesignCalloutProps {
number: number;
title: string;
explanation: string;
children?: React.ReactNode;
}
export function DesignCallout({ number, title, explanation, children }: DesignCalloutProps) {
// Implementation
}GSAP Animations
ScrollTrigger for scroll-based animations with proper cleanup in useEffect.
useEffect(() => {
const ctx = gsap.context(() => {
gsap.fromTo(
elements,
{ opacity: 0, y: 20 },
{
opacity: 1,
y: 0,
stagger: 0.1,
scrollTrigger: {
trigger: containerRef.current,
start: "top 95%",
end: "top 25%",
scrub: true,
},
}
);
}, containerRef);
return () => ctx.revert();
}, []);Token Browser
Search, filter, and copy design tokens used throughout the portfolio site.
light-primaryoklch(37.45% 0.189 325.02)Primary brand color
light-primary-contentoklch(96% 0.001 286.375)Text on primary
light-secondaryoklch(53.92% 0.18 260)Secondary brand color
light-secondary-contentoklch(90.784% 0.032 241.36)Text on secondary
light-accentoklch(75.98% 0.204 56.72)Accent color
light-accent-contentoklch(15.196% 0.04 56.72)Text on accent
light-neutraloklch(65% 0.18 145)Neutral color
light-neutral-contentoklch(96% 0.001 286.375)Text on neutral
light-base-100oklch(96% 0.001 286.375)Primary background
light-base-200oklch(98% 0 0)Secondary background
light-base-300oklch(100% 0 0)Tertiary background
light-base-contentoklch(14% 0.005 285.823)Primary text
light-successoklch(64.8% 0.15 160)Success state
light-success-contentoklch(14% 0.005 285.823)Text on success
light-warningoklch(84.71% 0.199 83.87)Warning state
light-warning-contentoklch(14% 0.005 285.823)Text on warning
light-erroroklch(71.76% 0.221 22.18)Error state
light-error-contentoklch(14% 0.005 285.823)Text on error
light-infooklch(72.06% 0.191 231.6)Info state
light-info-contentoklch(14% 0.005 285.823)Text on info
dark-primaryoklch(55% 0.18 325.02)Primary brand color (lighter for dark)
dark-primary-contentoklch(96% 0.001 286.375)Text on primary
dark-secondaryoklch(68% 0.16 260)Secondary brand color (lighter for dark)
dark-secondary-contentoklch(14% 0.005 285.823)Text on secondary
dark-accentoklch(78% 0.16 56.72)Accent color (lighter for dark)
dark-accent-contentoklch(14% 0.005 285.823)Text on accent
dark-neutraloklch(70% 0.16 145)Neutral color (lighter for dark)
dark-neutral-contentoklch(14% 0.005 285.823)Text on neutral
dark-base-100oklch(14% 0.005 285.823)Primary background (dark)
dark-base-200oklch(21% 0.006 285.885)Secondary background (dark)
dark-base-300oklch(27% 0.006 286.033)Tertiary background (dark)
dark-base-contentoklch(96% 0.001 286.375)Primary text (light on dark)
dark-successoklch(68% 0.14 160)Success state
dark-success-contentoklch(14% 0.005 285.823)Text on success
dark-warningoklch(82% 0.16 83.87)Warning state
dark-warning-contentoklch(14% 0.005 285.823)Text on warning
dark-erroroklch(72% 0.18 22.18)Error state
dark-error-contentoklch(14% 0.005 285.823)Text on error
dark-infooklch(72% 0.15 231.6)Info state
dark-info-contentoklch(14% 0.005 285.823)Text on info
fontFamily-body'Inter', ui-sans-serif, system-ui, -apple-system, sans-serifPrimary typeface for body text
fontFamily-brand'Playfair Display', serifBrand typeface for logo and special headings
fontFamily-mono'IBM Plex Mono', monospaceMonospace font for code and technical content
fontSize-xs0.75rem12px
fontSize-sm0.875rem14px
fontSize-base1rem16px
fontSize-lg1.125rem18px
fontSize-xl1.25rem20px
fontSize-2xl1.5rem24px
fontSize-3xl1.875rem30px
fontSize-4xl2.25rem36px
fontSize-5xl3rem48px
fontSize-displayclamp(3rem, 10vw, 10rem)Responsive display size
lineHeight-tight1.25Tight line height for headings
lineHeight-normal1.5Normal line height for body
lineHeight-relaxed1.75Relaxed line height
fontWeight-light300Light weight
fontWeight-normal400Normal weight
fontWeight-medium500Medium weight
fontWeight-bold700Bold weight
fontWeight-black900Black weight
xs0.25rem4px
sm0.5rem8px
md1rem16px
lg1.5rem24px
xl2rem32px
2xl3rem48px
3xl4rem64px
4xl6rem96px
duration-fast150msQuick transitions
duration-normal300msStandard transitions
duration-slow500msSlower transitions
easing-defaultcubic-bezier(0.22, 0.9, 0.35, 1)Default easing curve
easing-smoothcubic-bezier(0.16, 0.84, 0.26, 1)Smooth easing for complex animations
Color System
OKLCH color palette designed for perceptual uniformity and accessibility. This site has both light and dark themes with optimized colors for each mode.
Why OKLCH?
- • Perceptually uniform: Equal numeric changes produce equal visual changes
- • Wide gamut: Access to more vibrant colors than RGB/HSL
- • Predictable: Adjusting lightness doesn't shift hue
- • Future-proof: Native browser support in modern browsers
primary
var(--portfolio-site-light-color-primary)oklch(37.45% 0.189 325.02)
primary-content
var(--portfolio-site-light-color-primary-content)oklch(96% 0.001 286.375)
secondary
var(--portfolio-site-light-color-secondary)oklch(53.92% 0.18 260)
secondary-content
var(--portfolio-site-light-color-secondary-content)oklch(90.784% 0.032 241.36)
accent
var(--portfolio-site-light-color-accent)oklch(75.98% 0.204 56.72)
accent-content
var(--portfolio-site-light-color-accent-content)oklch(15.196% 0.04 56.72)
neutral
var(--portfolio-site-light-color-neutral)oklch(65% 0.18 145)
neutral-content
var(--portfolio-site-light-color-neutral-content)oklch(96% 0.001 286.375)
base-100
var(--portfolio-site-light-color-base-100)oklch(96% 0.001 286.375)
base-200
var(--portfolio-site-light-color-base-200)oklch(98% 0 0)
base-300
var(--portfolio-site-light-color-base-300)oklch(100% 0 0)
base-content
var(--portfolio-site-light-color-base-content)oklch(14% 0.005 285.823)
success
var(--portfolio-site-light-color-success)oklch(64.8% 0.15 160)
success-content
var(--portfolio-site-light-color-success-content)oklch(14% 0.005 285.823)
warning
var(--portfolio-site-light-color-warning)oklch(84.71% 0.199 83.87)
warning-content
var(--portfolio-site-light-color-warning-content)oklch(14% 0.005 285.823)
error
var(--portfolio-site-light-color-error)oklch(71.76% 0.221 22.18)
error-content
var(--portfolio-site-light-color-error-content)oklch(14% 0.005 285.823)
info
var(--portfolio-site-light-color-info)oklch(72.06% 0.191 231.6)
info-content
var(--portfolio-site-light-color-info-content)oklch(14% 0.005 285.823)
WCAG Color Contrast Guidelines
WCAG AA (Minimum): 4.5:1 for normal text, 3:1 for large text (18pt+)
WCAG AAA (Enhanced): 7:1 for normal text, 4.5:1 for large text
✓ = Meets WCAG AA standard for normal text
Showing 20 of 20 colors
primary
var(--portfolio-site-dark-color-primary)oklch(55% 0.18 325.02)
primary-content
var(--portfolio-site-dark-color-primary-content)oklch(96% 0.001 286.375)
secondary
var(--portfolio-site-dark-color-secondary)oklch(68% 0.16 260)
secondary-content
var(--portfolio-site-dark-color-secondary-content)oklch(14% 0.005 285.823)
accent
var(--portfolio-site-dark-color-accent)oklch(78% 0.16 56.72)
accent-content
var(--portfolio-site-dark-color-accent-content)oklch(14% 0.005 285.823)
neutral
var(--portfolio-site-dark-color-neutral)oklch(70% 0.16 145)
neutral-content
var(--portfolio-site-dark-color-neutral-content)oklch(14% 0.005 285.823)
base-100
var(--portfolio-site-dark-color-base-100)oklch(14% 0.005 285.823)
base-200
var(--portfolio-site-dark-color-base-200)oklch(21% 0.006 285.885)
base-300
var(--portfolio-site-dark-color-base-300)oklch(27% 0.006 286.033)
base-content
var(--portfolio-site-dark-color-base-content)oklch(96% 0.001 286.375)
success
var(--portfolio-site-dark-color-success)oklch(68% 0.14 160)
success-content
var(--portfolio-site-dark-color-success-content)oklch(14% 0.005 285.823)
warning
var(--portfolio-site-dark-color-warning)oklch(82% 0.16 83.87)
warning-content
var(--portfolio-site-dark-color-warning-content)oklch(14% 0.005 285.823)
error
var(--portfolio-site-dark-color-error)oklch(72% 0.18 22.18)
error-content
var(--portfolio-site-dark-color-error-content)oklch(14% 0.005 285.823)
info
var(--portfolio-site-dark-color-info)oklch(72% 0.15 231.6)
info-content
var(--portfolio-site-dark-color-info-content)oklch(14% 0.005 285.823)
WCAG Color Contrast Guidelines
WCAG AA (Minimum): 4.5:1 for normal text, 3:1 for large text (18pt+)
WCAG AAA (Enhanced): 7:1 for normal text, 4.5:1 for large text
✓ = Meets WCAG AA standard for normal text
Showing 20 of 20 colors
Typography Scale
Three typeface system: Inter for body, Playfair Display for brand, IBM Plex Mono for code.
Inter
Body text and UI elements. Optimized for readability at all sizes.
Playfair Display
Logo and brand identity. Adds elegance and personality.
IBM Plex Mono
Code examples and technical content. Clear at small sizes.
Display
Large hero text with responsive scaling
var(--portfolio-site-font-Display)clamp(3rem, 10vw, 10rem)
1.25
700
Normal
'IBM Plex Mono', monospace
5xl
Page titles and major headings
var(--portfolio-site-font-5xl)3rem
1.25
700
Normal
'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif
4xl
Section headings
var(--portfolio-site-font-4xl)2.25rem
1.25
700
Normal
'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif
3xl
Subsection headings
var(--portfolio-site-font-3xl)1.875rem
1.25
700
Normal
'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif
2xl
Component titles
var(--portfolio-site-font-2xl)1.5rem
1.5
500
Normal
'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif
xl
Lead paragraphs
var(--portfolio-site-font-xl)1.25rem
1.5
400
Normal
'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif
lg
Large body text
var(--portfolio-site-font-lg)1.125rem
1.5
400
Normal
'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif
base
Default body text
var(--portfolio-site-font-base)1rem
1.5
400
Normal
'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif
sm
Small text, captions
var(--portfolio-site-font-sm)0.875rem
1.5
400
Normal
'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif
xs
Fine print, labels
var(--portfolio-site-font-xs)0.75rem
1.5
400
Normal
'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif
Showing 10 typography tokens
Spacing System
4px base unit spacing scale (inherited from Tailwind CSS defaults). Provides consistent rhythm across the interface.
Why a 4px Base Unit?
- • Scalability: Creates harmonious spacing that scales across all screen sizes
- • Consistency: Reduces decision-making with predictable increments (4, 8, 12, 16, 24...)
- • Alignment: Ensures pixel-perfect alignment on all display densities
- • Standards: Matches Tailwind CSS and modern design system conventions
Visual Spacing Scale
Layout & Grid
12-column responsive grid system with flexible layout primitives. Built with Tailwind CSS grid utilities and daisyUI container classes.
Breakpoints
Mobile-first responsive breakpoints for adaptive layouts
Mobile
Base<640px
SM
640px≥640px
MD
768px≥768px
LG
1024px≥1024px
XL
1280px≥1280px
2XL
1536px≥1536px
12-Column Grid System
Flexible grid with 24px gutters and responsive behavior
Full Width (12 columns)
Half Width (6 + 6 columns)
Thirds (4 + 4 + 4 columns)
Asymmetric (8 + 4 columns)
Layout Primitives
Reusable layout patterns for common use cases
Grid (2D Layouts)
<div class="template-grid"> <div class="template-col-12 template-col-md-3">...</div> <div class="template-col-12 template-col-md-3">...</div> <div class="template-col-12 template-col-md-3">...</div> <div class="template-col-12 template-col-md-3">...</div> </div>
Container Max-Widths
Responsive containers that adapt to viewport size
Motion & Animation
GSAP-powered animations with ScrollTrigger for performant, scroll-based interactions. CSS transitions for simple state changes.
Animation Principles
- • Purposeful: Animations guide attention and provide feedback
- • Performant: GPU-accelerated transforms and opacity only
- • Subtle: Don't distract from content or slow down interaction
- • Accessible: Respects
prefers-reduced-motion
Easing Functions
cubic-bezier(0.22, 0.9, 0.35, 1) Default easing cubic-bezier(0.16, 0.84, 0.26, 1) Smooth complex animations Duration Scale
Consistent timing creates predictable and comfortable interactions. Click the cards to see each duration in action.
Instant
100ms
Micro-interactions
Fast
200ms
Quick UI transitions
Normal
300ms
Standard duration
Slow
500ms
Emphasized transitions
Slower
800ms
Deliberate animations
Easing Functions
Easing creates natural, physics-based motion that feels organic. Click the cards to see how each easing curve affects motion.
Linear
cubic-bezier(0, 0, 1, 1)
Constant speed
Ease In
cubic-bezier(0.4, 0, 1, 1)
Slow start, fast end (exits)
Ease Out
cubic-bezier(0, 0, 0.2, 1)
Fast start, slow end (entrances)
Ease In Out
cubic-bezier(0.4, 0, 0.2, 1)
Slow start and end (movement)
Spring
cubic-bezier(0.34, 1.56, 0.64, 1)
Bouncy spring effect
Animation Examples
Click the cards to trigger animations (auto-animations play continuously)
Fade In
Smooth opacity transition from 0 to 1
Slide In Up
Element slides up from below with fade
Slide In Down
Element slides down from above with fade
Scale In
Element scales from 90% to 100% with fade
Spin
AutoContinuous 360° rotation - use for loading states
Pulse
AutoOpacity pulses between 100% and 50%
Bounce
AutoVertical bouncing motion
Shake
Horizontal shake - use for error feedback
Micro-interactions
Subtle feedback that makes interfaces feel responsive and alive
Button Hover
200ms ease-out on all properties
Card Elevation
Hover for elevation
300ms ease-in-out transform & shadow
Input Focus
200ms ease-out border & ring
Loading States
Animations that communicate progress and keep users informed
Spinner
Continuous rotation for loading
Dots
Pulsing dots with staggered delay
Progress Bar
Indeterminate progress indicator
Primitive Components
Foundation components built with daisyUI and custom styles. Live examples from the actual site.
Buttons
daisyUI button variants used throughout the site
Badges
Status indicators and labels
Cards
Container components for grouping content
Basic Card
A simple card with title and content.
Card with Shadow
Enhanced with shadow for depth.
Alerts
User feedback and system messages
Composite Components
Complex components built from daisyUI primitives. These combine multiple elements for common UI patterns.
Modal
Dialog overlays for focused interactions
Tabs
Organize content into switchable sections
Content for Tab 1. This could be a form, data table, or any other content.
Content for Tab 2. Tabs help organize complex interfaces.
Content for Tab 3. Use tabs to reduce cognitive load.
Collapse/Accordion
Expandable content sections
Content for the first section. Accordions progressively disclose information.
Content for the second section. Only one section open at a time.
Content for the third section. Reduces scrolling and information overload.