Series Build a Website from Scratch Bonus 3 / Bonus

Design Customization ―
How to Tweak Your Site, Your Way

A field guide for taking the finished café SOEL site and shaping it into something that's truly yours. We'll swap colors, change fonts, add a dark mode, restructure the layout, and even add a second page — one practical recipe at a time.

Quick Recap

📖 Quick Recap
  • Bonus 1 added CSS animations and prepared a fade-in-up class
  • Bonus 2 brought it to life with JavaScript: hamburger menu, ARIA updates, scroll-triggered animations
  • Across 10 main parts and 2 bonuses, café SOEL became a site that moves and communicates

Now that the foundation is solid, the rest is up to you. Maybe you'd like a different palette, a softer typeface, or a dark mode that's gentle on the eyes at night. This part is a collection of small recipes for those "I want to tweak this" moments.

Goals for This Part

🎯 Goals for This Part
  • Recolor the entire site by editing only the CSS variables in :root
  • Swap to a different Google Font and shift the whole tone of the site
  • Add an OS-driven dark mode without writing any JavaScript
  • Reshape the menu grid (3 columns, auto-responsive) and rework the gallery
  • Add a second page — a menu detail page — and learn how multi-page sites stay consistent

The Customization Mindset — Don't Rewrite Everything at Once

Before we dive in, one thing I want to share. The most common mistake I see beginners make is editing CSS in fifty places at once. A few hours later, they can't remember what the original looked like, and rolling back becomes painful.

café SOEL was built with that risk in mind. By the end of Part 7, all the colors and fonts live as variables under :root. To recolor or restyle, you mostly only touch :root — nothing else. I always tell my team: "Customize from variables first." That single habit prevents a surprising amount of breakage.

The fewer places you touch, the better customization goes. Edit from variables, and you won't break the site.

💡 KANON's Tip
Before any serious change, copy your style.css with a date in the name — something like style-backup-2026-04-25.css. I do this every single time I prepare a design proposal. Five seconds of effort, hours of safety.

Recipe 1 — Recolor the Entire Site

Color is the most visible part of an identity. Right now café SOEL leans warm beige and brown — natural, soft, and calm. To shift the mood entirely, you only need to rewrite the color block inside :root.

Option A — Forest Green & Gold (mature, evening café)

For a roaster or specialty coffee bar with an evening atmosphere. The wood warmth stays, but everything feels more refined.

css/style.css — replace the values inside :root
:root {
  /* Replace only these. Don't touch anything else. */
  --color-bg: #fafaf7;
  --color-bg-soft: #f1efe9;
  --color-bg-accent: #e8e4dc;
  --color-text: #1f2a26;
  --color-text-light: #5a665f;
  --color-text-muted: #8a9690;
  --color-accent: #2d4a3e;       /* deep green */
  --color-accent-light: #c9a96e; /* gold */
  --color-border: #dcd8d0;
  --color-white: #ffffff;
  --color-black: #0f1816;
}

Option B — Pink Beige & Bordeaux (feminine pastry shop)

A softer, slightly sweet palette suited for a patisserie or a café aimed at a feminine audience.

css/style.css — feminine palette
:root {
  --color-bg: #fffaf7;
  --color-bg-soft: #faeee6;
  --color-bg-accent: #f3dccd;
  --color-text: #3a2a2a;
  --color-text-light: #7a5d5d;
  --color-text-muted: #b09494;
  --color-accent: #8b2d3a;       /* bordeaux */
  --color-accent-light: #d8a5a5; /* dusty pink */
  --color-border: #ecd9d0;
  --color-white: #ffffff;
  --color-black: #2a1a1a;
}

Option C — Mono & Vivid Orange (urban roastery)

Whites, blacks, and a single bold accent. Great for specialty coffee shops or design-led studios.

css/style.css — mono + accent palette
:root {
  --color-bg: #ffffff;
  --color-bg-soft: #f5f5f5;
  --color-bg-accent: #e8e8e8;
  --color-text: #1a1a1a;
  --color-text-light: #555555;
  --color-text-muted: #999999;
  --color-accent: #ff5722;       /* vivid orange */
  --color-accent-light: #ffab8a;
  --color-border: #dddddd;
  --color-white: #ffffff;
  --color-black: #000000;
}
▶ Live Demo — Three Palette Previews
Forest & Gold
#2d4a3e / #c9a96e
Pink & Bordeaux
#8b2d3a / #d8a5a5
Mono & Orange
#ff5722 / #1a1a1a
📌 Remember This
I think of palettes in three layers: base, secondary, accent. Roughly 70% base (backgrounds), 25% secondary (text and structural elements), 5% accent. café SOEL's variables follow exactly this split — --color-bg for base, --color-text for secondary, --color-accent for the highlight.
⚠️ Common Mistake
Push the accent color too vivid and body text becomes hard to read. Aim for a contrast ratio of at least 4.5:1 between text and background. WebAIM Contrast Checker is the tool I reach for.

Recipe 2 — Swap the Fonts

After color, type is the next biggest lever. café SOEL uses Cormorant Garamond for display and Noto Sans JP for body. Swap those two and the whole "voice" of the site changes.

Step 1 — Pick a new pairing on Google Fonts

Visit Google Fonts and find a duo you like. If you're stuck, here are three pairings I reach for often.

1

Classic & elegant — Playfair Display × Noto Sans JP

An expressive serif that reads luxurious. Great for fashion, beauty, or a higher-end café feel. Body stays grounded with Noto Sans JP.

2

Modern & sharp — Inter × Noto Sans JP

Inter is a contemporary sans-serif that pairs perfectly with minimalist, design-led brands. Crisp and clean.

3

Handwritten & warm — Caveat × Zen Maru Gothic

For a chalkboard, hand-lettered feel. Best used for headlines and accents only — full body text in handwriting becomes hard to read.

Step 2 — Swap the link tag in HTML

Let's try Playfair Display + Noto Sans JP. Generate the embed code on Google Fonts and replace the existing font link in index.html.

index.html — replace the font link inside <head>
<!-- Replace the existing Cormorant Garamond link with Playfair Display -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;600;700&family=Playfair+Display:wght@400;600;700&display=swap" rel="stylesheet">

Step 3 — Update the CSS variables

Then rewrite the font variables in :root. Every element using var(--font-display) updates automatically.

css/style.css — update font variables
:root {
  /* Replace the existing font variables */
  --font-display: 'Playfair Display', Georgia, serif;
  --font-body: 'Noto Sans JP', -apple-system, sans-serif;
}
💡 KANON's Tip
Two typefaces are usually enough — one for display, one for body. Three or more, and the page starts to feel restless. If I add a third, it's only for numerals or English captions, never for full paragraphs.
📌 Remember This
Only request the font weights you actually use. Loading 100 through 900 of every family will balloon your page weight. café SOEL only needs 400, 600, and 700 — three weights cover almost every project I work on.

Recipe 3 — Add Dark Mode

Looking at a café site at night, a bright white background can feel harsh. Let's make the site follow the OS dark-mode setting automatically — no JavaScript required, just one CSS media query.

The key is prefers-color-scheme, a media feature that lets you ask, "is the user requesting dark mode?"

css/style.css — add dark mode variables
/* ===== Bonus 3: Dark Mode ===== */
@media (prefers-color-scheme: dark) {
  :root {
    --color-bg: #1a1a1a;
    --color-bg-soft: #222222;
    --color-bg-accent: #2a2a2a;
    --color-text: #e8e4df;
    --color-text-light: #b0aca7;
    --color-text-muted: #7a7670;
    --color-accent: #c4a882;       /* lighter for contrast */
    --color-accent-light: #e8d2a8;
    --color-border: #333333;
    --color-white: #1a1a1a;       /* inverted */
    --color-black: #e8e4df;       /* inverted */
  }
}

That's it. Because café SOEL never hard-codes color values — every color goes through a variable — flipping the palette comes down to a single media query.

▶ Live Demo — Light vs Dark

Concept

A quiet pause in shifting light. café SOEL is a calm space wrapped in natural light and the warmth of wood.

Concept

A quiet pause in shifting light. café SOEL is a calm space wrapped in natural light and the warmth of wood.

One more touch for images

Bright photos on a dark layout can feel a little loud. A subtle filter calms them down.

css/style.css — image adjustments in dark mode
@media (prefers-color-scheme: dark) {
  .hero-image img,
  .gallery-item img,
  .menu-card-image img {
    filter: brightness(0.85);
  }

  /* If your logo is dark, invert it */
  .logo img {
    filter: brightness(0) invert(1);
  }
}
⚠️ Common Mistake
Pure black background with pure white text creates a contrast that's actually tiring to read. I aim for an off-black background like #1a1a1a and a creamy off-white text like #e8e4df. Easier on the eyes for long reads.

Recipe 4 — Layout Variations

"What if I want three columns instead of two?" "What if my gallery should look more like a photo book?" Both are simple changes once you're comfortable with Grid.

Three-column menu

café SOEL ships with two columns. To switch to three, the only line that needs to change is grid-template-columns on .menu-grid.

css/style.css — three-column menu
.menu-grid {
  display: grid;
  /* From 2 columns to 3 */
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
  max-width: var(--container-width);
  margin: 0 auto;
}

@media (max-width: 900px) {
  .menu-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 600px) {
  .menu-grid {
    grid-template-columns: 1fr;
  }
}

Three on desktop, two on tablet, one on mobile. Once you can decide "how many columns at each breakpoint?" you can build almost any grid layout.

▶ Live Demo — Three-Column Menu
Hand Drip
¥550
🥛
Café Latte
¥600
🍰
Cake
¥650

Auto-responsive grid

Here's a more advanced trick I use constantly in my own work. repeat(auto-fit, minmax(...)) lets the grid decide the column count based on available width — without writing any media queries.

css/style.css — auto-responsive grid
.menu-grid {
  display: grid;
  /* Each column at least 260px wide; fit as many as possible */
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 24px;
}

Even three-column gallery

The default gallery uses an asymmetric "one large, two small" layout. Switching to three even columns gives a quieter, more photo-book feel.

css/style.css — three even columns
.gallery-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
}

/* Reset the "large" item back to a single cell */
.gallery-item--large {
  grid-row: auto;
  grid-column: auto;
}

@media (max-width: 900px) {
  .gallery-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 600px) {
  .gallery-grid {
    grid-template-columns: 1fr;
  }
}
🔰 Beginner's Note
The original grid-row: 1 / 3; tells the item to span from row 1 to (but not including) row 3 — two rows tall. Setting it to auto drops it back to a normal single cell.

Recipe 5 — Add a Second Page

So far we've stayed inside one page. As the site grows — a detailed menu, a news page, an "about" page — you'll need to add new HTML files. Let's build a menu detail page, menu.html, as an example.

Step 1 — Plan the file structure

📁 Folder structure with the new page
my-website/
├── index.html        ← top page
├── menu.html         ← new menu detail page
├── css/
│   └── style.css     ← shared CSS
├── img/
│   └── ...
└── js/
    └── main.js
    

The important point: both pages load the same style.css. Sharing one stylesheet keeps the design consistent across the whole site and saves you from duplicating styles.

Step 2 — Create menu.html

Duplicate index.html, rename the copy to menu.html, and rewrite the body for the new page. The <head> structure carries over nicely.

menu.html — the skeleton
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Menu — café SOEL</title>
  <meta name="description" content="Full menu detail page for café SOEL.">

  <!-- Reuse the shared CSS, fonts, and JS -->
  <link rel="icon" href="img/favicon.svg" type="image/svg+xml">
  <link rel="stylesheet" href="css/style.css">
  <script src="js/main.js" defer></script>
</head>
<body>

  <header class="header">
    <!-- Same header markup as index.html -->
  </header>

  <main>
    <section class="section">
      <div class="section-header">
        <span class="section-label">Menu Detail</span>
        <h1 class="section-heading">The Full Menu</h1>
        <p class="section-desc">A seasonally rotating selection — please enjoy.</p>
      </div>

      <!-- Place menu cards here -->
    </section>
  </main>

  <footer class="footer">
    <!-- Same footer as index.html -->
  </footer>

</body>
</html>

Step 3 — Update navigation links

Now the most important step: rewrite the navigation links on both pages so they jump to the right place.

index.html — adjust nav links
<ul class="nav-list">
  <li><a href="#concept" class="nav-link">Concept</a></li>

  <!-- Was #menu (in-page anchor). Now points to a separate file -->
  <li><a href="menu.html" class="nav-link">Menu</a></li>

  <li><a href="#gallery" class="nav-link">Gallery</a></li>
  <li><a href="#access" class="nav-link">Access</a></li>
</ul>

From menu.html, jumping back to anchors on the top page uses the format filename#anchor.

menu.html — adjust nav links
<ul class="nav-list">
  <!-- Cross-page anchors use "filename#anchor" -->
  <li><a href="index.html#concept" class="nav-link">Concept</a></li>
  <li><a href="menu.html" class="nav-link">Menu</a></li>
  <li><a href="index.html#gallery" class="nav-link">Gallery</a></li>
  <li><a href="index.html#access" class="nav-link">Access</a></li>
</ul>

Step 4 — Add a breadcrumb for context

Once a site has more than one page, visitors need to know "where am I?" A simple breadcrumb does the job.

menu.html — breadcrumb markup
<nav class="breadcrumb" aria-label="Breadcrumb">
  <ol>
    <li><a href="index.html">Home</a></li>
    <li aria-current="page">Menu</li>
  </ol>
</nav>
css/style.css — breadcrumb styling
.breadcrumb {
  max-width: var(--container-width);
  margin: 0 auto;
  padding: 100px var(--container-padding) 20px;
  font-size: 13px;
  color: var(--color-text-muted);
}

.breadcrumb ol {
  display: flex;
  gap: 8px;
}

.breadcrumb li:not(:last-child)::after {
  content: '/';
  margin-left: 8px;
  color: var(--color-text-muted);
}

.breadcrumb a:hover {
  color: var(--color-accent);
}
📌 Remember This
Adding aria-current="page" to the current breadcrumb item tells assistive technology which page is active. The accessibility habits from Part 9 keep paying off as your site grows.
⚠️ Common Mistake
A frequent slip: copying <title> and meta description from the home page to the new page and forgetting to update them. Each page deserves its own title and description — both for search engines and for the human glancing at their browser tab.

Growing Your Site, One Step at a Time

What we covered are five common "I want to tweak this" moments — color, type, dark mode, layout, and adding a page. Mix and match these axes and café SOEL becomes something distinctly yours.

The key is not to chase perfection. Change just the colors first. Try a new font. Compare side by side. When I prepare design proposals, I usually start by laying out five color palettes next to each other before touching anything else. Small steps, often.

A site isn't finished when you ship it. It's something you grow. The more time you spend on it, the more it starts to look like you.

And one more thing. As you customize, things will go wrong. Layouts will break, colors will look off. That's not failure — that's the moment you learn the most. Treat the 10 main parts and 3 bonus parts as a map. When something gets confusing, come back and find your bearings. The map will be here.

One Last Word

That's a wrap on the "Build a Website from Scratch" series — 10 main parts and 3 bonus parts. Thank you for sticking with it.

From "Hello World!" in Part 1, through HTML, CSS, responsive design, SEO, accessibility, deployment, animation, JavaScript, and now customization. You're now someone who can build a website from zero, ship it to the world, and keep growing it from there.

Use café SOEL as a starting point — for your own café, your portfolio, a fan site for something you love. Wherever you take it, the next site is yours to shape. I'm looking forward to seeing more thoughtful sites out in the world.

👀 Final Demo
Compare your customized version with the original demo. The same structure can wear so many different faces — that's what makes web design endlessly interesting.
See the final demo →

What You Learned

  • Customize from variables first. Editing properties directly across the codebase makes it almost impossible to roll back
  • Think of palettes in three layers — base, secondary, accent — to keep colors balanced
  • Swap fonts by replacing the Google Fonts <link> and updating two CSS variables. The whole site updates at once
  • @media (prefers-color-scheme: dark) delivers an OS-driven dark mode without any JavaScript
  • Layout changes start and end with grid-template-columns. repeat(auto-fit, minmax(...)) gives you responsive grids without media queries
  • For a second page, share one stylesheet, fix the navigation links, and give each page its own title and description
  • A site is never really finished — it grows. Use this map you've built and keep shaping the site into something that's yours