Zen Garden is a web design aesthetic rooted in the philosophy and visual language of Japanese karesansui – the “dry landscape” rock gardens cultivated by Zen Buddhist monks since the Muromachi period (14th-16th century). Where most design systems seek to fill space, Zen Garden reverses the impulse: emptiness is the primary medium, and every element placed within it must justify its presence through purpose, proportion, or symbolic meaning. The result is an interface that feels less like a product and more like a contemplative space – quiet, unhurried, and deeply intentional.
The aesthetic draws on seven classical Zen principles that map directly to digital design decisions. Kanso (simplicity) strips interfaces to their essential elements. Fukinsei (asymmetry) creates visual tension through deliberate imbalance rather than rigid centering. Koko (austerity) favors restraint over abundance, choosing one perfectly placed element over ten adequate ones. Shizen (naturalness) ensures that nothing feels forced or artificial – layouts should appear effortless even when meticulously constructed. Yugen (subtlety) introduces depth through suggestion rather than explicitness, letting shadow, texture, and negative space imply what is not directly shown. Datsuzoku (freedom from habit) encourages moments of unexpected beauty – an asymmetric break in an otherwise orderly grid, a single accent of moss green against stone gray. Seijaku (tranquility) is the cumulative effect: a stillness that allows the user to focus, breathe, and engage with content without cognitive friction.
Visually, Zen Garden translates the physical materials of a karesansui into digital form. Raked gravel becomes fine-line SVG patterns that suggest flowing water. Moss becomes muted green accents placed sparingly against neutral ground. Stones become anchoring visual elements – images, cards, or typographic blocks – positioned with asymmetric precision against vast fields of whitespace. The palette is drawn entirely from nature: warm stone grays, sand, aged wood, bamboo green, and the deep near-black of wet river rock. Typography is thin, upright, and spacious, embodying the Japanese concept of “ma” – the meaningful pause between elements that gives each one room to resonate.
This is not minimalism for the sake of trend. It is minimalism as philosophy – the belief that reduction reveals essence, and that the space between things is as important as the things themselves.
The Zen Garden palette is drawn exclusively from the materials found in a traditional karesansui garden: raked white gravel, weathered granite, river stones, aged wood, moss, bamboo, and the occasional splash of plum blossom. Colors are desaturated, earthy, and tonal – they coexist without competing. The overall impression should be a quiet room with natural light filtering through shoji screens.
| Swatch | Hex | Role / Usage |
|---|---|---|
#F7F5F0 |
Raked Sand – primary background; warm off-white evoking dry garden gravel | |
#EDEBE5 |
Washed Stone – secondary background; card surfaces and alternating sections | |
#E0DDD5 |
Pale Clay – tertiary surface; subtle depth layering and inset panels | |
#C8C3B8 |
Dry Gravel – borders, dividers, and muted UI elements | |
#A39E93 |
Weathered Stone – secondary text, captions, and metadata | |
#8A8578 |
Aged Granite – icons, subtle labels, and placeholder text | |
#5C564B |
Dark Earth – primary text on light backgrounds; headings | |
#3A3630 |
Wet Rock – strong emphasis text and high-contrast elements | |
#2A2722 |
Charred Wood – deepest accent; footer backgrounds, overlays | |
#6B7F5E |
Temple Moss – primary accent; links, active states, and focal highlights | |
#8B9E7A |
Bamboo Leaf – secondary green accent; hover states and success indicators | |
#B8A088 |
Hinoki Wood – warm accent; callout backgrounds and decorative elements | |
#C4A882 |
Golden Sand – tertiary warm accent; highlights and selected states | |
#7A6E5D |
River Pebble – muted brown for secondary UI elements and tags | |
#4A5A42 |
Deep Moss – dark green for emphasis; footer accents and dark-mode elements |
:root {
/* Backgrounds */
--zen-bg-primary: #F7F5F0;
--zen-bg-secondary: #EDEBE5;
--zen-bg-tertiary: #E0DDD5;
/* Surfaces */
--zen-surface: #EDEBE5;
--zen-surface-raised: #F7F5F0;
--zen-surface-sunken: #E0DDD5;
/* Text */
--zen-text-primary: #3A3630;
--zen-text-secondary: #5C564B;
--zen-text-muted: #A39E93;
--zen-text-faint: #C8C3B8;
/* Borders */
--zen-border: #E0DDD5;
--zen-border-subtle: #EDEBE5;
--zen-border-strong: #C8C3B8;
/* Accents */
--zen-accent-moss: #6B7F5E;
--zen-accent-moss-light: #8B9E7A;
--zen-accent-wood: #B8A088;
--zen-accent-sand: #C4A882;
--zen-accent-pebble: #7A6E5D;
--zen-accent-deep-moss: #4A5A42;
/* Darks */
--zen-dark: #2A2722;
--zen-dark-soft: #3A3630;
/* Shadows */
--zen-shadow-sm: 0 1px 3px rgba(42, 39, 34, 0.04);
--zen-shadow-md: 0 2px 8px rgba(42, 39, 34, 0.06);
--zen-shadow-lg: 0 4px 16px rgba(42, 39, 34, 0.08);
/* Transitions */
--zen-transition-slow: 800ms cubic-bezier(0.25, 0.1, 0.25, 1);
--zen-transition-medium: 500ms cubic-bezier(0.25, 0.1, 0.25, 1);
--zen-transition-fast: 300ms cubic-bezier(0.25, 0.1, 0.25, 1);
/* Spacing */
--zen-space-xs: 0.5rem;
--zen-space-sm: 1rem;
--zen-space-md: 2rem;
--zen-space-lg: 4rem;
--zen-space-xl: 6rem;
--zen-space-2xl: 10rem;
}
Zen Garden typography is quiet, precise, and spacious. The goal is readability without visual noise – type should feel like calligraphy viewed from a distance: elegant, deliberate, and never rushed. Heading fonts lean toward thin, refined serifs or clean humanist sans-serifs that echo the restrained elegance of Japanese woodblock printing. Body text prioritizes generous line-height and moderate letter-spacing to create breathing room within paragraphs, embodying the principle of “ma” at the typographic level. Japanese-influenced fonts like the Zen family on Google Fonts and Noto Serif offer excellent bridges between Western and Japanese design sensibilities.
| Font | Style | Weight Range | Usage |
|---|---|---|---|
| Cormorant Garamond | Refined, high-contrast serif | 300-600 | Display headings, hero text, pull quotes |
| Noto Serif Display | Elegant transitional serif | 300-500 | Headings, section titles |
| Zen Old Mincho | Japanese-influenced traditional serif | 400-700 | Decorative headings, Japanese-flavored accents |
| Zen Kaku Gothic New | Clean Japanese gothic sans | 300-700 | Body text in Japanese-inspired contexts |
| Work Sans | Humanist sans-serif | 300-500 | Primary body text, UI elements |
| Inter | Neutral screen-optimized sans | 300-500 | Secondary body, labels, navigation |
| DM Sans | Clean geometric sans | 300-500 | Captions, metadata, small text |
| Zen Maru Gothic | Rounded Japanese gothic | 400-500 | Friendly accent text, tags |
| Heading Font | Body Font | Mood |
|---|---|---|
| Cormorant Garamond Light | Work Sans Light | Serene editorial – the canonical Zen Garden pairing |
| Noto Serif Display Light | Inter Regular | Refined simplicity – modern with classical undertones |
| Zen Old Mincho Regular | DM Sans Regular | Japanese-Western fusion – culturally rooted yet accessible |
| Cormorant Garamond Regular | Inter Light | Contemplative minimalism – elegant contrast with neutral body |
/* Import fonts */
@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,300;1,400&family=Work+Sans:wght@300;400;500&family=Inter:wght@300;400;500&family=Noto+Serif+Display:wght@300;400;500&display=swap');
/* Display / Hero headings -- thin, spacious, commanding through restraint */
h1 {
font-family: 'Cormorant Garamond', 'Noto Serif Display', serif;
font-weight: 300;
font-size: clamp(2.5rem, 6vw, 5rem);
line-height: 1.15;
letter-spacing: 0.02em;
color: var(--zen-text-primary);
}
/* Section headings */
h2 {
font-family: 'Cormorant Garamond', serif;
font-weight: 400;
font-size: clamp(1.75rem, 3.5vw, 2.75rem);
line-height: 1.2;
letter-spacing: 0.015em;
color: var(--zen-text-primary);
}
/* Subsection headings */
h3 {
font-family: 'Work Sans', sans-serif;
font-weight: 500;
font-size: clamp(1.125rem, 2vw, 1.5rem);
line-height: 1.3;
letter-spacing: 0.01em;
color: var(--zen-text-secondary);
}
/* Body text -- generous line-height for breathing room */
body {
font-family: 'Work Sans', 'Inter', sans-serif;
font-weight: 300;
font-size: 1rem;
line-height: 1.85;
color: var(--zen-text-secondary);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* Overline labels -- wide-tracked uppercase, very small */
.zen-label {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 0.7rem;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--zen-text-muted);
}
/* Pull quotes -- italic serif, contemplative */
.zen-quote {
font-family: 'Cormorant Garamond', serif;
font-weight: 300;
font-style: italic;
font-size: clamp(1.5rem, 3vw, 2.25rem);
line-height: 1.5;
color: var(--zen-accent-moss);
}
/* Fine parallel lines evoking raked gravel patterns */
.zen-raked-sand {
position: relative;
background: var(--zen-bg-primary);
}
.zen-raked-sand::after {
content: '';
position: absolute;
inset: 0;
opacity: 0.035;
background-image: repeating-linear-gradient(
0deg,
transparent,
transparent 11px,
#8A8578 11px,
#8A8578 12px
);
pointer-events: none;
}
/* Concentric circle variant -- water ripple around a stone */
.zen-ripple-pattern {
position: relative;
background: var(--zen-bg-primary);
}
.zen-ripple-pattern::after {
content: '';
position: absolute;
inset: 0;
opacity: 0.03;
background-image: repeating-radial-gradient(
circle at 50% 50%,
transparent 0px,
transparent 30px,
#8A8578 30px,
#8A8578 31px
);
pointer-events: none;
}
/* Cards inspired by smooth river stones: minimal, grounded, barely elevated */
.zen-card {
background: var(--zen-surface);
border: 1px solid var(--zen-border-subtle);
border-radius: 4px;
padding: 2.5rem;
transition: var(--zen-transition-medium);
transition-property: box-shadow, border-color;
}
.zen-card:hover {
border-color: var(--zen-border-strong);
box-shadow: var(--zen-shadow-md);
}
/* Accent card with moss-green left border */
.zen-card--accent {
border-left: 2px solid var(--zen-accent-moss);
border-radius: 0 4px 4px 0;
}
/* Minimal card -- no visible border, differentiated by background only */
.zen-card--minimal {
background: var(--zen-bg-secondary);
border: none;
border-radius: 2px;
padding: 2rem 2.5rem;
box-shadow: none;
}
.zen-card--minimal:hover {
background: var(--zen-surface-sunken);
}
/* Buttons: quiet, understated, action through restraint */
.zen-button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
background: var(--zen-text-primary);
color: var(--zen-bg-primary);
border: none;
border-radius: 2px;
padding: 14px 32px;
font-family: 'Work Sans', sans-serif;
font-weight: 400;
font-size: 0.85rem;
letter-spacing: 0.08em;
text-transform: uppercase;
cursor: pointer;
transition: var(--zen-transition-medium);
transition-property: opacity, transform;
}
.zen-button:hover {
opacity: 0.8;
transform: translateY(-1px);
}
/* Ghost button -- outline only */
.zen-button--ghost {
background: transparent;
color: var(--zen-text-primary);
border: 1px solid var(--zen-border-strong);
}
.zen-button--ghost:hover {
border-color: var(--zen-text-primary);
background: rgba(58, 54, 48, 0.03);
}
/* Moss accent button */
.zen-button--moss {
background: var(--zen-accent-moss);
color: #F7F5F0;
}
.zen-button--moss:hover {
background: var(--zen-accent-deep-moss);
opacity: 1;
}
/* Navigation: spare, floating, transparent until scrolled */
.zen-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
display: flex;
align-items: center;
justify-content: space-between;
padding: 1.5rem 3rem;
background: transparent;
transition: var(--zen-transition-medium);
transition-property: background, backdrop-filter, border-color;
border-bottom: 1px solid transparent;
}
.zen-nav--scrolled {
background: rgba(247, 245, 240, 0.85);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom-color: var(--zen-border-subtle);
}
.zen-nav-brand {
font-family: 'Cormorant Garamond', serif;
font-weight: 400;
font-size: 1.25rem;
letter-spacing: 0.06em;
color: var(--zen-text-primary);
text-decoration: none;
}
.zen-nav-links {
display: flex;
gap: 2.5rem;
list-style: none;
}
.zen-nav-links a {
color: var(--zen-text-muted);
text-decoration: none;
font-family: 'Inter', sans-serif;
font-size: 0.8rem;
font-weight: 400;
letter-spacing: 0.1em;
text-transform: uppercase;
transition: color var(--zen-transition-fast);
}
.zen-nav-links a:hover {
color: var(--zen-accent-moss);
}
.zen-nav-links a.active {
color: var(--zen-text-primary);
}
/* Hero: vast whitespace with a single, centered statement */
.zen-hero {
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
padding: 6rem 2rem;
position: relative;
overflow: hidden;
}
.zen-hero h1 {
font-family: 'Cormorant Garamond', serif;
font-weight: 300;
font-size: clamp(2.5rem, 7vw, 5.5rem);
line-height: 1.1;
letter-spacing: 0.02em;
color: var(--zen-text-primary);
max-width: 800px;
}
.zen-hero p {
font-family: 'Work Sans', sans-serif;
font-weight: 300;
font-size: 1.125rem;
line-height: 1.8;
color: var(--zen-text-muted);
max-width: 480px;
margin-top: 2rem;
}
/* Decorative enso circle behind hero text */
.zen-hero::before {
content: '';
position: absolute;
width: 400px;
height: 400px;
border: 1px solid var(--zen-border);
border-radius: 50%;
border-top-color: transparent;
transform: rotate(-25deg);
opacity: 0.25;
pointer-events: none;
}
/* Scroll indicator -- gentle downward arrow */
.zen-scroll-hint {
position: absolute;
bottom: 3rem;
width: 1px;
height: 40px;
background: linear-gradient(
180deg,
var(--zen-border-strong) 0%,
transparent 100%
);
animation: zen-drift 3s ease-in-out infinite;
}
@keyframes zen-drift {
0%, 100% { opacity: 0.3; transform: translateY(0); }
50% { opacity: 0.7; transform: translateY(8px); }
}
/* Subtle centered dividers -- like stepping stones between content */
.zen-divider {
border: none;
height: 1px;
max-width: 80px;
margin: var(--zen-space-xl) auto;
background: var(--zen-border-strong);
opacity: 0.5;
}
/* Three-dot divider -- like three stones in a garden */
.zen-divider--stones {
border: none;
height: auto;
text-align: center;
margin: var(--zen-space-xl) auto;
background: none;
}
.zen-divider--stones::before {
content: '';
display: inline-block;
width: 4px;
height: 4px;
border-radius: 50%;
background: var(--zen-border-strong);
box-shadow:
-20px 0 0 var(--zen-border-strong),
20px 0 0 var(--zen-border-strong);
opacity: 0.4;
}
/* Enso circle divider */
.zen-divider--enso {
border: none;
text-align: center;
margin: var(--zen-space-xl) auto;
}
.zen-divider--enso::before {
content: '';
display: inline-block;
width: 32px;
height: 32px;
border: 1.5px solid var(--zen-accent-moss);
border-radius: 50%;
border-top-color: transparent;
transform: rotate(-30deg);
opacity: 0.35;
}
/* Two-column layout with deliberate asymmetry */
.zen-split {
display: grid;
grid-template-columns: 5fr 7fr;
gap: var(--zen-space-lg);
align-items: center;
max-width: 1000px;
margin: 0 auto;
padding: var(--zen-space-xl) var(--zen-space-md);
}
/* Reversed split -- image left, text right */
.zen-split--reverse {
grid-template-columns: 7fr 5fr;
}
.zen-split-text {
padding: var(--zen-space-md) 0;
}
.zen-split-image {
overflow: hidden;
border-radius: 2px;
}
.zen-split-image img {
width: 100%;
height: auto;
display: block;
filter: saturate(0.6) contrast(0.95);
transition: filter var(--zen-transition-slow);
}
.zen-split-image:hover img {
filter: saturate(0.8) contrast(1);
}
@media (max-width: 768px) {
.zen-split,
.zen-split--reverse {
grid-template-columns: 1fr;
gap: var(--zen-space-md);
}
}
/* Elements fade in gently as they enter the viewport */
.zen-reveal {
opacity: 0;
transform: translateY(24px);
transition:
opacity 1s cubic-bezier(0.25, 0.1, 0.25, 1),
transform 1s cubic-bezier(0.25, 0.1, 0.25, 1);
}
.zen-reveal.visible {
opacity: 1;
transform: translateY(0);
}
/* Staggered delay for child elements */
.zen-reveal-group > *:nth-child(1) { transition-delay: 0ms; }
.zen-reveal-group > *:nth-child(2) { transition-delay: 150ms; }
.zen-reveal-group > *:nth-child(3) { transition-delay: 300ms; }
.zen-reveal-group > *:nth-child(4) { transition-delay: 450ms; }
| Aesthetic | Relationship to Zen Garden |
|---|---|
| Japandi | Closest relative; Japandi blends Japanese and Scandinavian design but is warmer and more furniture-focused; Zen Garden is more austere and whitespace-driven |
| Cyberminimalism | Shares the extreme whitespace and single-focus sections, but uses dark mode, gradients, and tech-forward typography; Zen Garden is natural and warm where Cyberminimalism is digital and cool |
| Flat Design | Both reject ornamentation and skeuomorphism; Flat Design is more geometric and UI-focused, while Zen Garden draws from nature and philosophy |
| Wabi-Sabi | The philosophical foundation of Zen Garden; Wabi-Sabi as a standalone aesthetic embraces imperfection and decay more explicitly, with rougher textures and visible aging |
| Earth Tones | Shares the natural, desaturated palette; Earth Tones is broader and more pattern-rich, while Zen Garden is more minimal and whitespace-dominant |
| Hygge | Both create calm, contemplative atmospheres; Hygge is warmer, cozier, and more textile-focused (wool, candles, warmth), while Zen Garden is cooler and more austere (stone, sand, stillness) |
| International Typographic Style | Shares the grid discipline and belief in whitespace as structure; Swiss Style is more geometric and systematic, while Zen Garden allows asymmetric organic compositions |
| Minimalism | The parent category; Zen Garden is a specific cultural expression of minimalism filtered through Japanese philosophy and karesansui garden design |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Zen Garden -- Template</title>
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,300;1,400&family=Work+Sans:wght@300;400;500&family=Inter:wght@300;400;500&display=swap" rel="stylesheet">
<style>
/* =====================================================
ZEN GARDEN -- CSS CUSTOM PROPERTIES
===================================================== */
:root {
/* Backgrounds */
--zen-bg-primary: #F7F5F0;
--zen-bg-secondary: #EDEBE5;
--zen-bg-tertiary: #E0DDD5;
/* Surfaces */
--zen-surface: #EDEBE5;
--zen-surface-sunken: #E0DDD5;
/* Text */
--zen-text-primary: #3A3630;
--zen-text-secondary: #5C564B;
--zen-text-muted: #A39E93;
--zen-text-faint: #C8C3B8;
/* Borders */
--zen-border: #E0DDD5;
--zen-border-subtle: #EDEBE5;
--zen-border-strong: #C8C3B8;
/* Accents */
--zen-accent-moss: #6B7F5E;
--zen-accent-moss-light: #8B9E7A;
--zen-accent-wood: #B8A088;
--zen-accent-sand: #C4A882;
--zen-accent-pebble: #7A6E5D;
--zen-accent-deep-moss: #4A5A42;
/* Darks */
--zen-dark: #2A2722;
--zen-dark-soft: #3A3630;
/* Shadows */
--zen-shadow-sm: 0 1px 3px rgba(42, 39, 34, 0.04);
--zen-shadow-md: 0 2px 8px rgba(42, 39, 34, 0.06);
/* Transitions */
--zen-transition-slow: 800ms cubic-bezier(0.25, 0.1, 0.25, 1);
--zen-transition-medium: 500ms cubic-bezier(0.25, 0.1, 0.25, 1);
--zen-transition-fast: 300ms cubic-bezier(0.25, 0.1, 0.25, 1);
}
/* =====================================================
RESET & BASE
===================================================== */
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
background: var(--zen-bg-primary);
color: var(--zen-text-secondary);
font-family: 'Work Sans', 'Inter', sans-serif;
font-weight: 300;
font-size: 1rem;
line-height: 1.85;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
img {
max-width: 100%;
height: auto;
display: block;
}
a {
color: var(--zen-accent-moss);
text-decoration: none;
transition: color var(--zen-transition-fast);
}
a:hover {
color: var(--zen-accent-deep-moss);
}
/* =====================================================
TYPOGRAPHY
===================================================== */
h1 {
font-family: 'Cormorant Garamond', serif;
font-weight: 300;
font-size: clamp(2.5rem, 6vw, 5rem);
line-height: 1.1;
letter-spacing: 0.02em;
color: var(--zen-text-primary);
}
h2 {
font-family: 'Cormorant Garamond', serif;
font-weight: 400;
font-size: clamp(1.75rem, 3.5vw, 2.75rem);
line-height: 1.2;
letter-spacing: 0.015em;
color: var(--zen-text-primary);
}
h3 {
font-family: 'Work Sans', sans-serif;
font-weight: 500;
font-size: 1.25rem;
line-height: 1.3;
color: var(--zen-text-secondary);
}
p {
max-width: 640px;
}
.label {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 0.7rem;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--zen-text-muted);
}
.quote {
font-family: 'Cormorant Garamond', serif;
font-weight: 300;
font-style: italic;
font-size: clamp(1.375rem, 3vw, 2rem);
line-height: 1.5;
color: var(--zen-accent-pebble);
max-width: 600px;
}
/* =====================================================
NAVIGATION
===================================================== */
nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
display: flex;
align-items: center;
justify-content: space-between;
padding: 1.5rem 3rem;
background: transparent;
transition: var(--zen-transition-medium);
transition-property: background, backdrop-filter, border-color;
border-bottom: 1px solid transparent;
}
nav.scrolled {
background: rgba(247, 245, 240, 0.88);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom-color: var(--zen-border-subtle);
}
.nav-brand {
font-family: 'Cormorant Garamond', serif;
font-weight: 400;
font-size: 1.25rem;
letter-spacing: 0.06em;
color: var(--zen-text-primary);
text-decoration: none;
}
.nav-links {
display: flex;
gap: 2.5rem;
list-style: none;
}
.nav-links a {
color: var(--zen-text-muted);
font-family: 'Inter', sans-serif;
font-size: 0.75rem;
font-weight: 400;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.nav-links a:hover {
color: var(--zen-accent-moss);
}
/* =====================================================
HERO
===================================================== */
.hero {
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
padding: 8rem 2rem 6rem;
position: relative;
overflow: hidden;
}
/* Enso circle decoration */
.hero::before {
content: '';
position: absolute;
width: 380px;
height: 380px;
border: 1px solid var(--zen-border-strong);
border-radius: 50%;
border-top-color: transparent;
transform: rotate(-25deg);
opacity: 0.18;
pointer-events: none;
}
.hero h1 {
position: relative;
z-index: 1;
}
.hero p {
margin-top: 2rem;
font-size: 1.1rem;
color: var(--zen-text-muted);
max-width: 460px;
position: relative;
z-index: 1;
}
.hero-cta {
display: inline-flex;
align-items: center;
gap: 0.5rem;
margin-top: 3rem;
padding: 14px 36px;
background: var(--zen-text-primary);
color: var(--zen-bg-primary);
border: none;
border-radius: 2px;
font-family: 'Work Sans', sans-serif;
font-weight: 400;
font-size: 0.8rem;
letter-spacing: 0.1em;
text-transform: uppercase;
text-decoration: none;
cursor: pointer;
transition: var(--zen-transition-medium);
transition-property: opacity, transform;
position: relative;
z-index: 1;
}
.hero-cta:hover {
opacity: 0.8;
transform: translateY(-1px);
color: var(--zen-bg-primary);
}
.scroll-hint {
position: absolute;
bottom: 3rem;
width: 1px;
height: 40px;
background: linear-gradient(
180deg,
var(--zen-border-strong) 0%,
transparent 100%
);
animation: drift 3s ease-in-out infinite;
}
@keyframes drift {
0%, 100% { opacity: 0.3; transform: translateY(0); }
50% { opacity: 0.6; transform: translateY(8px); }
}
/* =====================================================
SECTION CONTAINERS
===================================================== */
.section {
max-width: 1000px;
margin: 0 auto;
padding: 6rem 2rem;
}
.section--narrow {
max-width: 720px;
}
.section--wide {
max-width: 1100px;
}
.section-header {
text-align: center;
margin-bottom: 4rem;
}
.section-header .label {
display: block;
margin-bottom: 1rem;
}
.section-header p {
margin: 1.5rem auto 0;
text-align: center;
}
/* =====================================================
DIVIDERS
===================================================== */
.divider {
border: none;
height: 1px;
max-width: 80px;
margin: 6rem auto;
background: var(--zen-border-strong);
opacity: 0.4;
}
.divider--stones {
border: none;
height: auto;
text-align: center;
margin: 6rem auto;
background: none;
max-width: none;
}
.divider--stones::before {
content: '';
display: inline-block;
width: 4px;
height: 4px;
border-radius: 50%;
background: var(--zen-border-strong);
box-shadow:
-20px 0 0 var(--zen-border-strong),
20px 0 0 var(--zen-border-strong);
opacity: 0.4;
}
/* =====================================================
SPLIT LAYOUT
===================================================== */
.split {
display: grid;
grid-template-columns: 5fr 7fr;
gap: 4rem;
align-items: center;
max-width: 1000px;
margin: 0 auto;
padding: 6rem 2rem;
}
.split--reverse {
grid-template-columns: 7fr 5fr;
}
.split-image {
overflow: hidden;
border-radius: 2px;
background: var(--zen-bg-secondary);
aspect-ratio: 4 / 3;
display: flex;
align-items: center;
justify-content: center;
color: var(--zen-text-faint);
font-size: 0.8rem;
letter-spacing: 0.1em;
text-transform: uppercase;
}
/* =====================================================
CARDS
===================================================== */
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1.5rem;
max-width: 1000px;
margin: 0 auto;
}
.card {
background: var(--zen-surface);
border: 1px solid var(--zen-border-subtle);
border-radius: 4px;
padding: 2.5rem 2rem;
transition: var(--zen-transition-medium);
transition-property: border-color, box-shadow;
}
.card:hover {
border-color: var(--zen-border-strong);
box-shadow: var(--zen-shadow-md);
}
.card .label {
display: block;
margin-bottom: 0.75rem;
}
.card h3 {
margin-bottom: 1rem;
}
.card p {
font-size: 0.9rem;
line-height: 1.7;
color: var(--zen-text-muted);
}
/* =====================================================
QUOTE SECTION
===================================================== */
.quote-section {
text-align: center;
padding: 8rem 2rem;
background: var(--zen-bg-secondary);
}
.quote-section .quote {
margin: 0 auto;
}
.quote-section .attribution {
margin-top: 2rem;
font-family: 'Inter', sans-serif;
font-size: 0.75rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--zen-text-faint);
}
/* =====================================================
RAKED SAND BACKGROUND
===================================================== */
.raked-sand {
position: relative;
}
.raked-sand::after {
content: '';
position: absolute;
inset: 0;
opacity: 0.03;
background-image: repeating-linear-gradient(
0deg,
transparent,
transparent 11px,
#8A8578 11px,
#8A8578 12px
);
pointer-events: none;
}
/* =====================================================
FOOTER
===================================================== */
footer {
background: var(--zen-dark);
color: var(--zen-text-faint);
padding: 4rem 2rem;
text-align: center;
}
footer .nav-brand {
color: var(--zen-bg-secondary);
display: block;
margin-bottom: 1.5rem;
}
footer p {
font-size: 0.85rem;
line-height: 1.7;
max-width: 400px;
margin: 0 auto;
}
footer .footer-links {
display: flex;
justify-content: center;
gap: 2rem;
list-style: none;
margin-top: 2rem;
}
footer .footer-links a {
color: var(--zen-text-muted);
font-size: 0.75rem;
letter-spacing: 0.1em;
text-transform: uppercase;
}
footer .footer-links a:hover {
color: var(--zen-accent-moss-light);
}
footer .copyright {
margin-top: 3rem;
font-size: 0.7rem;
color: var(--zen-accent-pebble);
letter-spacing: 0.05em;
}
/* =====================================================
SCROLL REVEAL
===================================================== */
.reveal {
opacity: 0;
transform: translateY(20px);
transition:
opacity 1s cubic-bezier(0.25, 0.1, 0.25, 1),
transform 1s cubic-bezier(0.25, 0.1, 0.25, 1);
}
.reveal.visible {
opacity: 1;
transform: translateY(0);
}
/* =====================================================
RESPONSIVE
===================================================== */
@media (max-width: 768px) {
nav {
padding: 1.25rem 1.5rem;
}
.nav-links {
gap: 1.5rem;
}
.hero {
padding: 6rem 1.5rem 4rem;
}
.hero::before {
width: 260px;
height: 260px;
}
.split,
.split--reverse {
grid-template-columns: 1fr;
gap: 2rem;
padding: 4rem 1.5rem;
}
.cards {
grid-template-columns: 1fr;
}
.section {
padding: 4rem 1.5rem;
}
.divider,
.divider--stones {
margin: 4rem auto;
}
}
</style>
</head>
<body>
<!-- ========== NAVIGATION ========== -->
<nav id="navbar">
<a href="#" class="nav-brand">Zen Garden</a>
<ul class="nav-links">
<li><a href="#philosophy">Philosophy</a></li>
<li><a href="#principles">Principles</a></li>
<li><a href="#gallery">Gallery</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
<!-- ========== HERO ========== -->
<section class="hero raked-sand">
<h1>In stillness,<br>clarity arises</h1>
<p>A design philosophy rooted in Japanese Zen gardens -- where emptiness is meaningful, restraint is strength, and every element exists with intention.</p>
<a href="#philosophy" class="hero-cta">Begin the path</a>
<div class="scroll-hint"></div>
</section>
<!-- ========== PHILOSOPHY SECTION ========== -->
<hr class="divider">
<section id="philosophy" class="section section--narrow">
<div class="section-header reveal">
<span class="label">Philosophy</span>
<h2>The beauty of less</h2>
<p>In the tradition of karesansui, the dry landscape garden, we find that the most profound statements are made not by what is present, but by what is deliberately absent. Sand raked into flowing patterns becomes water. A single stone becomes a mountain. Space becomes meaning.</p>
</div>
</section>
<!-- ========== QUOTE ========== -->
<section class="quote-section">
<p class="quote reveal">"In the beginner's mind there are many possibilities, but in the expert's mind there are few."</p>
<p class="attribution reveal">Shunryu Suzuki</p>
</section>
<!-- ========== PRINCIPLES CARDS ========== -->
<hr class="divider--stones">
<section id="principles" class="section section--wide">
<div class="section-header reveal">
<span class="label">Seven Principles</span>
<h2>Foundations of Zen design</h2>
<p>Each principle from the karesansui tradition maps directly to a decision in digital design.</p>
</div>
<div class="cards">
<div class="card reveal">
<span class="label">01</span>
<h3>Kanso</h3>
<p>Simplicity. Eliminate clutter and strip every element to its essential purpose. What remains is what matters.</p>
</div>
<div class="card reveal">
<span class="label">02</span>
<h3>Fukinsei</h3>
<p>Asymmetry. Reject rigid mirror-balance in favor of organic, weighted compositions that feel alive.</p>
</div>
<div class="card reveal">
<span class="label">03</span>
<h3>Koko</h3>
<p>Austerity. Prefer one perfectly chosen element over many adequate ones. Scarcity creates value.</p>
</div>
<div class="card reveal">
<span class="label">04</span>
<h3>Shizen</h3>
<p>Naturalness. Nothing should feel forced. The best design appears effortless, as if it arranged itself.</p>
</div>
<div class="card reveal">
<span class="label">05</span>
<h3>Yugen</h3>
<p>Subtle profundity. Suggest rather than declare. Let shadow, space, and restraint communicate depth.</p>
</div>
<div class="card reveal">
<span class="label">06</span>
<h3>Seijaku</h3>
<p>Tranquility. The cumulative result of all principles -- a stillness that invites focus and contemplation.</p>
</div>
</div>
</section>
<!-- ========== SPLIT SECTION ========== -->
<hr class="divider">
<section id="gallery" class="split reveal">
<div class="split-text">
<span class="label">Practice</span>
<h2>Stone and space</h2>
<p>In a Zen garden, stones are placed first -- they anchor the composition. Everything else is defined by the relationship between solid and void. In digital design, your content is the stone. The whitespace around it determines its weight.</p>
</div>
<div class="split-image">
Stone Arrangement
</div>
</section>
<section class="split split--reverse reveal">
<div class="split-image">
Raked Gravel Patterns
</div>
<div class="split-text">
<span class="label">Texture</span>
<h2>Patterns in stillness</h2>
<p>Raked gravel represents flowing water without a single drop being present. In the same way, subtle CSS patterns and textures can evoke depth and movement without adding visual weight or distraction.</p>
</div>
</section>
<!-- ========== QUOTE ========== -->
<section class="quote-section raked-sand">
<p class="quote reveal">"The space between the notes is as important as the notes themselves."</p>
<p class="attribution reveal">Claude Debussy</p>
</section>
<!-- ========== CONTACT / CTA ========== -->
<hr class="divider--stones">
<section id="contact" class="section section--narrow" style="text-align: center;">
<div class="reveal">
<span class="label">Begin</span>
<h2>Walk the garden path</h2>
<p style="margin: 1.5rem auto 0;">Every journey toward simplicity begins with a single step. Let emptiness guide your next design.</p>
<a href="#" class="hero-cta" style="margin-top: 2.5rem;">Start your journey</a>
</div>
</section>
<!-- ========== FOOTER ========== -->
<footer>
<a href="#" class="nav-brand">Zen Garden</a>
<p>A contemplative approach to digital design, inspired by the karesansui gardens of Japan.</p>
<ul class="footer-links">
<li><a href="#philosophy">Philosophy</a></li>
<li><a href="#principles">Principles</a></li>
<li><a href="#gallery">Gallery</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
<p class="copyright">Designed with intention and restraint</p>
</footer>
<!-- ========== SCRIPTS ========== -->
<script>
/* Scroll-triggered nav background */
const navbar = document.getElementById('navbar');
window.addEventListener('scroll', () => {
navbar.classList.toggle('scrolled', window.scrollY > 60);
});
/* Scroll-triggered reveal */
const revealElements = document.querySelectorAll('.reveal');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, {
threshold: 0.15,
rootMargin: '0px 0px -40px 0px'
});
revealElements.forEach(el => observer.observe(el));
</script>
</body>
</html>
filter: saturate(0.5-0.7) on photography – this single CSS rule transforms ordinary stock photos into Zen-appropriate imagery by muting colors to match the desaturated paletteborder: 1px solid over box-shadow for card separation – shadows imply elevation and floating, which contradicts the grounded, earthbound quality of Zen Garden; borders feel more like the thin wooden frames of shoji screensIntersectionObserver with a threshold of 0.1-0.2 and a slow opacity transition (800-1200ms) so content appears gently, like mist clearing to reveal a stone