How I Actually Built This Portfolio

Intro

This site didn’t fall from the sky. I built it. From scratch. With too much coffee and not enough sleep.

The goal wasn’t perfection (gross) — it was me. A mix of code, art, and just enough chaos to keep it interesting. If it feels warm, earthy, and a little stubborn, that’s intentional.

Colors: The Mood Board That Stuck

I didn’t chase trends — I picked colors that felt right. Browns, corals, creams… like a fancy café menu but for CSS variables. Light mode? Cozy. Dark mode? Still cozy, just moodier.

I basically curated a palette that makes sense whether you’re scrolling at 10 AM or 2 AM.

Primary Color Palette

Here's the actual color palette I implemented in my CSS:

Base Colors (CSS Variables)

--saddle: #7A5B4C
Deep brown for primary elements
--star-dust: #C0C0C0
Light gray for borders and subtle elements
--coral-tree: #E79B8C
Warm coral for accents and highlights
--woodsmoke: #1A1A1A
Deep charcoal for text and dark elements

Earthy Artistic Palette

For a more sophisticated and artistic feel, I created a secondary palette with nature-inspired names:

--milk-chocolate: #7C4A2D
Rich brown for headers and buttons
--metallic-bronze: #C49B6A
Warm bronze for highlights and interactions
--laurel-green: #B0C4AC
Soft sage for borders and subtle accents
--cookies-cream: #EDE1D2
Warm cream for primary backgrounds
--coconut: #F6F0E9
Light cream for secondary backgrounds
--palm-oil: #4D200E
Deep brown for hover states

Dark Mode Palette

The dark mode implementation uses carefully selected colors that maintain the warm, earthy feel while providing excellent contrast and readability:

--primary-bg: #1A1A1A
Dark primary background
--secondary-bg: #232323
Dark secondary background
--accent-bg: #3A3A3A
Dark accent background
--header-color: #F8F8F8
Light headers in dark mode

Layout & Inspiration

Instagram gave me the idea: clean, card-based, image-friendly. But unlike Instagram, you actually leave my site with knowledge, not a dopamine hangover.

The rules I followed:

  • Hierarchy: Headlines pop, text breathes.
  • Cards everywhere: Projects, blogs, gallery — neat little boxes.
  • Animations: Subtle, not “Las Vegas billboard.”
  • Responsive: It works on your grandma’s phone.

Tech Stack

Kept it modern but lightweight:

  • HTML + CSS (with variables galore)
  • Vanilla JS (no frameworks because I like pain)
  • Bootstrap 5 (for the grid, not the bloat)
  • AOS (scroll magic without writing 500 lines of keyframes)

CSS lives in tidy little modules: base, typography, layout, components… so I don’t lose my mind later.

CSS Architecture

I organized the CSS using a modular approach with separate files for different concerns:

File Structure:

css/
├── main.css              # Main entry point with imports
├── modules/
│   ├── base.css          # CSS variables and global styles
│   ├── typography.css    # Font definitions and text styles
│   ├── layout.css        # Grid and layout utilities
│   ├── components.css    # Reusable component styles
│   ├── sections.css      # Page section styles
│   ├── blog.css          # Blog-specific styles
│   ├── dark-theme.css    # Dark mode overrides
│   ├── animations.css    # Keyframes and transitions
│   └── responsive.css    # Media queries and mobile styles

CSS Variables Implementation

The color system is implemented using CSS custom properties, making theme switching seamless:

CSS Variables Definition:

:root {
    /* Base Colors */
    --saddle: #7A5B4C;
    --star-dust: #C0C0C0;
    --coral-tree: #E79B8C;
    --woodsmoke: #1A1A1A;
    
    /* Earthy Artistic Palette */
    --milk-chocolate: #7C4A2D;
    --metallic-bronze: #C49B6A;
    --laurel-green: #B0C4AC;
    --cookies-cream: #EDE1D2;
    --coconut: #F6F0E9;
    --palm-oil: #4D200E;
    
    /* Semantic Usage */
    --primary-bg: var(--cookies-cream);
    --secondary-bg: var(--coconut);
    --header-color: var(--milk-chocolate);
    --text-color: var(--deepwood-shade);
    --accent-color: var(--coral-tree);
}

Dark Mode Implementation

The dark mode uses a data attribute approach for clean theme switching:

Dark Theme CSS:

[data-theme="dark"] {
    --primary-bg: #1A1A1A;
    --secondary-bg: #232323;
    --card-bg: rgba(255, 255, 255, 0.03);
    --header-color: #F8F8F8;
    --text-color: rgba(255, 255, 255, 0.9);
    --border-color: rgba(255, 255, 255, 0.1);
}

Features I Actually Cared About

  • Dark mode toggle that remembers your vibe
  • Scroll-triggered animations (because stillness is boring)
  • Projects + art in one home, but they don’t fight
  • Accessible navigation (keyboard warriors, you’re welcome)
  • Gallery with lightbox, because clicking images should feel good

Performance Optimizations

To ensure fast loading and smooth user experience, I implemented several optimizations:

  • CSS Organization: Modular CSS with selective imports to reduce bundle size
  • Image Optimization: Proper sizing and lazy loading for gallery images
  • Font Loading: Google Fonts with display=swap for better performance
  • Minimal Dependencies: Only essential external libraries (Bootstrap, AOS, Font Awesome)
  • Efficient Animations: CSS transforms and opacity for smooth 60fps animations

The “Oh No” Moments

Biggest challenge? Making my art and projects coexist without looking like step-siblings. Solved it by:

  • Same color palette everywhere
  • One unified nav bar
  • Consistent card system

Accessibility Considerations

Accessibility was a priority throughout the development process:

  • Semantic HTML: Proper heading hierarchy and landmark elements
  • ARIA Labels: Descriptive labels for interactive elements
  • Color Contrast: WCAG AA compliant color combinations
  • Keyboard Navigation: Full keyboard accessibility for all interactive elements
  • Screen Reader Support: Proper alt text and descriptive content

What’s Next

  • Adding filters for projects (because not everything belongs in one bucket)
  • Expanding the blog (a.k.a. more yapping)
  • Gallery upgrades (collections, deeper views)
  • Maybe PWA stuff if I feel like playing with offline mode

Wrap-Up

This portfolio is basically a sandbox where my code and art hang out. It’s systematic but not sterile, creative but not chaotic. Every decision — from the coral accent to the scroll animations — was just me saying: yeah, that feels right.

If you walk away thinking, “This feels like the person who made it” … mission accomplished.