Textured Minimalism is a refined design philosophy that bridges the gap between stark, clinical minimalism and the warmth of the physical world. Where conventional minimalism strips interfaces down to flat colors and geometric precision, Textured Minimalism reintroduces the tactile qualities of natural surfaces – linen weave, concrete grain, handmade paper fiber, plaster finish, raw cotton canvas – into sparse, carefully composed layouts. The result is digital design that feels quietly human: restrained in structure but rich in surface detail.
The aesthetic emerged as a reaction to the homogenization of flat design and corporate minimalism in the 2010s and 2020s. Designers began recognizing that “less is more” need not mean “less is sterile.” By layering subtle material textures beneath clean typographic hierarchies and generous whitespace, Textured Minimalism achieves a visual warmth that flat minimalism cannot. A single linen-grain background does what no amount of solid #FAFAFA can: it makes a screen feel like a physical object, something you could almost touch.
The color world of Textured Minimalism is drawn from natural materials themselves. Warm whites recall cotton rag paper. Soft beiges and oat tones echo unfinished wood and raw canvas. Cool concrete grays and warm stone taupes ground the palette without introducing harshness. Accents are muted and earthy – dusty sage, clay terracotta, oxidized copper – never saturated or synthetic. The palette exists in the narrow tonal range between “barely there” and “quietly present,” demanding attention through subtlety rather than contrast.
Typography in this aesthetic favors humanist and transitional typefaces that carry a sense of craft without ornament. Serifs with slight brush influence serve as display faces, while clean sans-serifs with generous proportions handle body text. Weight usage trends toward light and regular – nothing shouts, everything breathes. Letter-spacing is considered, line-heights are generous, and the relationship between text and surrounding whitespace is as important as the text itself.
Textured Minimalism is particularly well-suited to editorial platforms, artisan brand identities, portfolio sites, wellness and lifestyle products, and any context where conveying authenticity, craftsmanship, and quiet sophistication matters more than visual spectacle. It rewards slow looking and careful attention – a digital expression of the belief that beauty lives in the details of simple things.
The Textured Minimalism palette is drawn directly from the natural materials that inspire its surface treatments. Colors feel like they were mixed from earth, stone, plant matter, and raw textile – never from a digital color picker. The palette is tonal and layered, with most colors sitting within a narrow range of low saturation and medium-to-high lightness. Contrast is deliberate but gentle, achieved through warm-cool interplay and tonal stepping rather than dramatic value differences.
| Swatch | Hex | Role / Usage |
|---|---|---|
#FAF7F2 |
Cotton White – primary page background, the warm base of all layouts | |
#F3EDE4 |
Linen Cream – card surfaces, elevated containers, secondary background | |
#E8E0D4 |
Raw Canvas – tertiary surface, sidebar backgrounds, input fields | |
#D5CCC0 |
Sandstone – borders, dividers, subtle structural lines | |
#B8AFA4 |
Warm Stone – secondary text, captions, metadata, placeholder text | |
#9C9488 |
Weathered Taupe – icons, muted UI elements, inactive states | |
#6B6359 |
Driftwood – primary body text on light backgrounds | |
#3D3833 |
Charcoal Bark – headings, high-emphasis text, primary text | |
#2A2622 |
Deep Umber – maximum contrast text, logo marks, dark accents | |
#8B9A7E |
Dried Sage – primary accent, links, active states, success indicators | |
#C4A882 |
Clay Terracotta – warm accent, call-to-action highlights, hover states | |
#A3998E |
Concrete Gray – neutral accent, tags, badges, secondary buttons | |
#B5A089 |
Oxidized Copper – decorative accent, special elements, subtle emphasis | |
#7A8B72 |
Moss – secondary green accent, footer elements, environmental tones | |
#C9B9A8 |
Parchment – hover backgrounds, selected states, soft highlights |
:root {
/* Backgrounds */
--tm-bg-primary: #FAF7F2;
--tm-bg-surface: #F3EDE4;
--tm-bg-surface-alt: #E8E0D4;
--tm-bg-hover: #C9B9A8;
/* Borders */
--tm-border: #D5CCC0;
--tm-border-light: rgba(213, 204, 192, 0.5);
/* Text */
--tm-text-primary: #3D3833;
--tm-text-body: #6B6359;
--tm-text-secondary: #9C9488;
--tm-text-muted: #B8AFA4;
--tm-text-heading: #2A2622;
/* Accents */
--tm-accent-sage: #8B9A7E;
--tm-accent-clay: #C4A882;
--tm-accent-concrete: #A3998E;
--tm-accent-copper: #B5A089;
--tm-accent-moss: #7A8B72;
--tm-accent-parchment: #C9B9A8;
/* Shadows (warm-toned) */
--tm-shadow-sm: 0 1px 3px rgba(61, 56, 51, 0.04);
--tm-shadow-md: 0 2px 8px rgba(61, 56, 51, 0.06);
--tm-shadow-lg: 0 4px 16px rgba(61, 56, 51, 0.08);
/* Radius */
--tm-radius-sm: 3px;
--tm-radius-md: 6px;
--tm-radius-lg: 10px;
/* Transitions */
--tm-transition: 0.3s ease;
--tm-transition-slow: 0.5s ease;
}
Textured Minimalism typography blends the warmth of humanist and transitional serifs with the clarity of clean sans-serifs. Typefaces should feel handcrafted yet precise – as though they were designed for a thoughtfully printed book rather than a screen. Weight usage is restrained: light and regular weights dominate, with medium reserved for emphasis. Bold is rarely used. The overall typographic voice is quiet confidence: readable, refined, and unhurried.
| Font | Category | Weights | Usage |
|---|---|---|---|
| Lora | Serif | 400, 500, 600; italic | Display headings, editorial titles, pull quotes |
| Source Serif 4 | Serif | 300, 400, 500 | Alternative headings, long-form article titles |
| Inter | Sans-Serif | 300, 400, 500 | Body text, UI elements, navigation |
| Work Sans | Sans-Serif | 300, 400, 500 | Alternative body text, captions, labels |
| Cormorant Garamond | Serif | 300, 400, 500; italic | Decorative quotes, accent text, hero statements |
| Manrope | Sans-Serif | 300, 400, 500 | Small text, metadata, tags, system elements |
| Pairing Name | Heading Font | Body Font | Character |
|---|---|---|---|
| Editorial Craft | Lora (400) | Inter (400) | Classic editorial warmth meets modern clarity |
| Paper & Ink | Cormorant Garamond (300) | Work Sans (400) | Elegant, literary, refined contrast |
| Studio Clean | Source Serif 4 (400) | Manrope (400) | Contemporary serif with geometric sans body |
| Quiet Authority | Lora (500) | Work Sans (300) | Subtle weight contrast, understated hierarchy |
@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,300;1,400&family=Inter:wght@300;400;500&family=Lora:ital,wght@0,400;0,500;0,600;1,400&family=Manrope:wght@300;400;500&family=Source+Serif+4:wght@300;400;500&family=Work+Sans:wght@300;400;500&display=swap');
body {
font-family: 'Inter', 'Work Sans', system-ui, sans-serif;
font-weight: 400;
font-size: 1rem;
line-height: 1.75;
color: var(--tm-text-body);
-webkit-font-smoothing: antialiased;
}
h1, h2, h3, h4 {
font-family: 'Lora', 'Source Serif 4', Georgia, serif;
font-weight: 400;
line-height: 1.3;
color: var(--tm-text-heading);
}
h1 {
font-size: 2.5rem;
letter-spacing: -0.01em;
line-height: 1.2;
}
h2 {
font-size: 1.75rem;
letter-spacing: 0.005em;
}
h3 {
font-size: 1.25rem;
letter-spacing: 0.01em;
}
h4 {
font-family: 'Manrope', 'Work Sans', sans-serif;
font-weight: 500;
font-size: 0.85rem;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--tm-text-secondary);
}
blockquote {
font-family: 'Cormorant Garamond', Georgia, serif;
font-weight: 300;
font-style: italic;
font-size: 1.35rem;
line-height: 1.6;
color: var(--tm-text-primary);
}
.label, .caption {
font-family: 'Manrope', sans-serif;
font-size: 0.75rem;
font-weight: 500;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--tm-text-secondary);
}
p {
max-width: 38em;
margin-bottom: 1.5em;
}
/* Subtle linen weave applied as a pseudo-element overlay */
.linen-texture {
position: relative;
}
.linen-texture::after {
content: '';
position: absolute;
inset: 0;
opacity: 0.035;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Crect width='8' height='1' y='0' fill='%236B6359' opacity='0.3'/%3E%3Crect width='1' height='8' x='0' fill='%236B6359' opacity='0.3'/%3E%3Crect width='8' height='1' y='4' fill='%236B6359' opacity='0.15'/%3E%3Crect width='1' height='8' x='4' fill='%236B6359' opacity='0.15'/%3E%3C/svg%3E");
background-size: 8px 8px;
pointer-events: none;
border-radius: inherit;
}
/* SVG-based paper grain noise texture */
.paper-grain {
position: relative;
}
.paper-grain::after {
content: '';
position: absolute;
inset: 0;
opacity: 0.4;
pointer-events: none;
border-radius: inherit;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='grain'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23grain)' opacity='0.06'/%3E%3C/svg%3E");
background-size: 256px 256px;
}
/* Alternative: inline SVG filter for full-coverage grain */
.paper-grain-filter {
position: relative;
isolation: isolate;
}
.paper-grain-filter::before {
content: '';
position: absolute;
inset: 0;
pointer-events: none;
border-radius: inherit;
filter: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.7' numOctaves='4'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3C/svg%3E#n");
opacity: 0.05;
mix-blend-mode: multiply;
}
/* Simulated concrete / plaster surface */
.concrete-surface {
background-color: #E8E0D4;
position: relative;
}
.concrete-surface::after {
content: '';
position: absolute;
inset: 0;
opacity: 0.03;
background-image:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6'%3E%3Crect width='1' height='1' x='2' y='1' fill='%236B6359' opacity='0.6'/%3E%3Crect width='1' height='1' x='5' y='4' fill='%236B6359' opacity='0.3'/%3E%3Crect width='1' height='1' x='0' y='3' fill='%236B6359' opacity='0.4'/%3E%3Crect width='1' height='1' x='3' y='5' fill='%236B6359' opacity='0.5'/%3E%3C/svg%3E"),
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10'%3E%3Crect width='1' height='1' x='7' y='2' fill='%239C9488' opacity='0.4'/%3E%3Crect width='1' height='1' x='1' y='8' fill='%239C9488' opacity='0.3'/%3E%3Crect width='2' height='1' x='4' y='6' fill='%239C9488' opacity='0.2'/%3E%3C/svg%3E");
background-size: 6px 6px, 10px 10px;
pointer-events: none;
border-radius: inherit;
}
/* Textured Minimalism card -- subtle surface with grain */
.tm-card {
background: var(--tm-bg-surface);
border: 1px solid var(--tm-border-light);
border-radius: var(--tm-radius-lg);
padding: 2rem 2.25rem;
position: relative;
box-shadow: var(--tm-shadow-sm);
transition:
box-shadow var(--tm-transition),
transform var(--tm-transition);
overflow: hidden;
}
/* Paper grain overlay on card */
.tm-card::after {
content: '';
position: absolute;
inset: 0;
opacity: 0.03;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6'%3E%3Crect width='1' height='1' x='1' y='0' fill='%236B6359' opacity='0.5'/%3E%3Crect width='1' height='1' x='4' y='3' fill='%236B6359' opacity='0.3'/%3E%3Crect width='1' height='1' x='0' y='5' fill='%236B6359' opacity='0.4'/%3E%3C/svg%3E");
background-size: 6px 6px;
pointer-events: none;
border-radius: inherit;
}
/* Hover: gentle lift, slightly deeper shadow */
.tm-card:hover {
box-shadow: var(--tm-shadow-md);
transform: translateY(-1px);
}
.tm-card h3 {
font-family: 'Lora', serif;
font-weight: 400;
font-size: 1.2rem;
margin-bottom: 0.75rem;
color: var(--tm-text-heading);
}
.tm-card p {
font-size: 0.95rem;
color: var(--tm-text-body);
line-height: 1.7;
margin-bottom: 0;
}
/* Primary button -- warm, understated, textured */
.tm-btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.7rem 1.8rem;
background: var(--tm-text-primary);
color: var(--tm-bg-primary);
border: none;
border-radius: var(--tm-radius-md);
font-family: 'Manrope', 'Work Sans', sans-serif;
font-weight: 500;
font-size: 0.85rem;
letter-spacing: 0.06em;
text-transform: uppercase;
cursor: pointer;
transition:
background var(--tm-transition),
box-shadow var(--tm-transition);
}
.tm-btn:hover {
background: var(--tm-text-heading);
box-shadow: var(--tm-shadow-md);
}
.tm-btn:active {
transform: scale(0.98);
transition-duration: 0.1s;
}
/* Secondary button -- outlined, minimal */
.tm-btn-secondary {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.65rem 1.75rem;
background: transparent;
color: var(--tm-text-body);
border: 1px solid var(--tm-border);
border-radius: var(--tm-radius-md);
font-family: 'Manrope', 'Work Sans', sans-serif;
font-weight: 500;
font-size: 0.85rem;
letter-spacing: 0.06em;
text-transform: uppercase;
cursor: pointer;
transition:
border-color var(--tm-transition),
background var(--tm-transition),
color var(--tm-transition);
}
.tm-btn-secondary:hover {
border-color: var(--tm-accent-sage);
color: var(--tm-text-primary);
background: rgba(139, 154, 126, 0.06);
}
/* Ghost / text button */
.tm-btn-ghost {
display: inline-flex;
align-items: center;
gap: 0.4rem;
padding: 0.5rem 1rem;
background: transparent;
color: var(--tm-accent-sage);
border: none;
font-family: 'Manrope', 'Work Sans', sans-serif;
font-weight: 500;
font-size: 0.85rem;
letter-spacing: 0.04em;
cursor: pointer;
transition: color var(--tm-transition);
}
.tm-btn-ghost:hover {
color: var(--tm-text-primary);
}
/* Textured minimalist sticky navigation */
.tm-nav {
position: sticky;
top: 0;
z-index: 100;
background: rgba(250, 247, 242, 0.92);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid var(--tm-border-light);
padding: 0.9rem 2rem;
display: flex;
align-items: center;
justify-content: space-between;
transition: box-shadow var(--tm-transition);
}
/* Scrolled state -- subtle shadow appears */
.tm-nav--scrolled {
box-shadow: 0 1px 8px rgba(61, 56, 51, 0.06);
}
.tm-nav-brand {
font-family: 'Lora', serif;
font-weight: 500;
font-size: 1.15rem;
color: var(--tm-text-heading);
text-decoration: none;
letter-spacing: 0.01em;
}
.tm-nav-links {
display: flex;
gap: 0.25rem;
list-style: none;
margin: 0;
padding: 0;
}
.tm-nav-links a {
color: var(--tm-text-secondary);
text-decoration: none;
font-family: 'Manrope', sans-serif;
font-weight: 500;
font-size: 0.85rem;
letter-spacing: 0.04em;
padding: 0.4rem 0.9rem;
border-radius: var(--tm-radius-sm);
transition:
color var(--tm-transition),
background var(--tm-transition);
}
.tm-nav-links a:hover {
color: var(--tm-text-primary);
background: rgba(61, 56, 51, 0.04);
}
.tm-nav-links a.active {
color: var(--tm-accent-sage);
background: rgba(139, 154, 126, 0.08);
}
/* Textured hero with layered grain backgrounds */
.tm-hero {
position: relative;
background: var(--tm-bg-surface);
border-radius: var(--tm-radius-lg);
border: 1px solid var(--tm-border-light);
padding: 5rem 3rem;
margin-bottom: 3rem;
overflow: hidden;
text-align: left;
}
/* Linen texture overlay on hero */
.tm-hero::before {
content: '';
position: absolute;
inset: 0;
opacity: 0.04;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Crect width='8' height='1' y='0' fill='%236B6359' opacity='0.3'/%3E%3Crect width='1' height='8' x='0' fill='%236B6359' opacity='0.3'/%3E%3Crect width='8' height='1' y='4' fill='%236B6359' opacity='0.15'/%3E%3Crect width='1' height='8' x='4' fill='%236B6359' opacity='0.15'/%3E%3C/svg%3E");
background-size: 8px 8px;
pointer-events: none;
}
/* Warm gradient wash */
.tm-hero::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(
160deg,
rgba(196, 168, 130, 0.04) 0%,
transparent 50%,
rgba(139, 154, 126, 0.03) 100%
);
pointer-events: none;
}
.tm-hero > * {
position: relative;
z-index: 1;
}
.tm-hero h1 {
font-family: 'Lora', serif;
font-weight: 400;
font-size: 3rem;
line-height: 1.15;
letter-spacing: -0.015em;
color: var(--tm-text-heading);
max-width: 16em;
margin-bottom: 1.25rem;
}
.tm-hero p {
font-size: 1.1rem;
line-height: 1.8;
color: var(--tm-text-body);
max-width: 32em;
margin-bottom: 2rem;
}
.tm-hero .label {
font-family: 'Manrope', sans-serif;
font-size: 0.75rem;
font-weight: 500;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--tm-accent-sage);
margin-bottom: 1rem;
display: block;
}
/* Fading horizontal divider */
.tm-divider {
border: none;
height: 1px;
background: linear-gradient(
to right,
transparent 0%,
var(--tm-border) 25%,
var(--tm-border) 75%,
transparent 100%
);
margin: 4rem auto;
max-width: 60%;
}
/* Decorative dot divider */
.tm-divider-dot {
border: none;
height: auto;
text-align: center;
margin: 4rem auto;
}
.tm-divider-dot::before {
content: '\00B7\2003\00B7\2003\00B7';
font-size: 1.5rem;
color: var(--tm-text-muted);
letter-spacing: 0.3em;
}
/* Textured minimalist input */
.tm-input {
width: 100%;
padding: 0.75rem 1rem;
background: var(--tm-bg-primary);
border: 1px solid var(--tm-border);
border-radius: var(--tm-radius-md);
font-family: 'Inter', 'Work Sans', sans-serif;
font-size: 0.95rem;
color: var(--tm-text-primary);
outline: none;
transition:
border-color var(--tm-transition),
box-shadow var(--tm-transition);
}
.tm-input::placeholder {
color: var(--tm-text-muted);
letter-spacing: 0.01em;
}
.tm-input:focus {
border-color: var(--tm-accent-sage);
box-shadow: 0 0 0 3px rgba(139, 154, 126, 0.1);
}
:root {
--tm-bg-primary: #FAF7F2;
--tm-bg-surface: #F3EDE4;
--tm-bg-surface-alt: #E8E0D4;
--tm-bg-hover: #C9B9A8;
--tm-border: #D5CCC0;
--tm-border-light: rgba(213, 204, 192, 0.5);
--tm-text-primary: #3D3833;
--tm-text-body: #6B6359;
--tm-text-secondary: #9C9488;
--tm-text-muted: #B8AFA4;
--tm-text-heading: #2A2622;
--tm-accent-sage: #8B9A7E;
--tm-accent-clay: #C4A882;
--tm-accent-concrete: #A3998E;
--tm-accent-copper: #B5A089;
--tm-accent-moss: #7A8B72;
--tm-accent-parchment: #C9B9A8;
--tm-shadow-sm: 0 1px 3px rgba(61, 56, 51, 0.04);
--tm-shadow-md: 0 2px 8px rgba(61, 56, 51, 0.06);
--tm-shadow-lg: 0 4px 16px rgba(61, 56, 51, 0.08);
--tm-radius-sm: 3px;
--tm-radius-md: 6px;
--tm-radius-lg: 10px;
--tm-transition: 0.3s ease;
--tm-transition-slow: 0.5s ease;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', 'Work Sans', system-ui, sans-serif;
font-size: 1rem;
line-height: 1.75;
color: var(--tm-text-body);
background-color: var(--tm-bg-primary);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
h1, h2, h3 {
font-family: 'Lora', 'Source Serif 4', Georgia, serif;
font-weight: 400;
color: var(--tm-text-heading);
line-height: 1.3;
}
h1 { font-size: 2.5rem; letter-spacing: -0.01em; }
h2 { font-size: 1.75rem; letter-spacing: 0.005em; }
h3 { font-size: 1.25rem; letter-spacing: 0.01em; }
a {
color: var(--tm-accent-sage);
text-decoration: underline;
text-decoration-color: rgba(139, 154, 126, 0.3);
text-underline-offset: 3px;
transition: color 0.2s ease, text-decoration-color 0.2s ease;
}
a:hover {
color: var(--tm-text-primary);
text-decoration-color: var(--tm-text-primary);
}
.container {
max-width: 1100px;
margin: 0 auto;
padding: 0 2rem;
}
.content-width {
max-width: 720px;
}
section {
padding: 5rem 0;
}
rgba(61, 56, 51, ...)) instead of default black or cool-gray shadows – warm shadows maintain the organic quality of the aesthetic#FFFFFF) or pure black (#000000) anywhere in the palette – they break the warm, organic tonal range and create jarring contrast| Aesthetic | Relationship |
|---|---|
| Japandi | Shares warm neutrals, natural materials, and restrained composition; Japandi adds Japanese cultural motifs and Scandinavian functionalism, while Textured Minimalism focuses purely on surface texture within minimal layouts |
| Wabi-Sabi | Philosophical cousin – both embrace imperfection and natural materiality; Wabi-Sabi is broader and more philosophical, while Textured Minimalism is a specific visual approach to digital design |
| Earth Tones | Overlapping color palette territory; Earth Tones is a broader color-first approach that can be maximalist, while Textured Minimalism is layout-first and always sparse |
| Scandinavian Design | Shares the clean, functional minimalism and light color palette; Scandinavian Design tends toward pure flat surfaces, while Textured Minimalism deliberately reintroduces surface detail |
| Flat Design | Textured Minimalism is a direct evolution – it keeps flat design’s simplicity and rejection of skeuomorphism but adds the warmth and tactility that flat design intentionally removed |
| Craftcore | Both value handmade quality and natural materials; Craftcore embraces visible craft ornamentation and maximalist warmth, while Textured Minimalism uses craft references only through subtle surface treatment |
| Light Skeuomorphism | Both reference physical materials in digital design; Light Skeuomorphism uses recognizable object metaphors (buttons that look like buttons), while Textured Minimalism references raw material surfaces without object mimicry |
| Hygge | Shares the warm, cozy, human-centered feel; Hygge tends toward softer edges, rounder forms, and more visible comfort elements, while Textured Minimalism maintains sharper editorial restraint |
| Cyberminimalism | Opposite end of the minimalist spectrum – Cyberminimalism is cold, flat, and technology-forward; Textured Minimalism is warm, tactile, and material-forward |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Textured Minimalism</title>
<!-- Google Fonts -->
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;1,300;1,400&family=Inter:wght@300;400;500&family=Lora:ital,wght@0,400;0,500;1,400&family=Manrope:wght@300;400;500&family=Work+Sans:wght@300;400;500&display=swap" rel="stylesheet">
<style>
/* ========================================
CSS Custom Properties
======================================== */
:root {
/* Backgrounds */
--tm-bg-primary: #FAF7F2;
--tm-bg-surface: #F3EDE4;
--tm-bg-surface-alt: #E8E0D4;
--tm-bg-hover: #C9B9A8;
/* Borders */
--tm-border: #D5CCC0;
--tm-border-light: rgba(213, 204, 192, 0.5);
/* Text */
--tm-text-primary: #3D3833;
--tm-text-body: #6B6359;
--tm-text-secondary: #9C9488;
--tm-text-muted: #B8AFA4;
--tm-text-heading: #2A2622;
/* Accents */
--tm-accent-sage: #8B9A7E;
--tm-accent-clay: #C4A882;
--tm-accent-concrete: #A3998E;
--tm-accent-copper: #B5A089;
--tm-accent-moss: #7A8B72;
--tm-accent-parchment: #C9B9A8;
/* Shadows */
--tm-shadow-sm: 0 1px 3px rgba(61, 56, 51, 0.04);
--tm-shadow-md: 0 2px 8px rgba(61, 56, 51, 0.06);
--tm-shadow-lg: 0 4px 16px rgba(61, 56, 51, 0.08);
/* Radius */
--tm-radius-sm: 3px;
--tm-radius-md: 6px;
--tm-radius-lg: 10px;
/* Transitions */
--tm-transition: 0.3s ease;
--tm-transition-slow: 0.5s ease;
}
/* ========================================
Reset & Base
======================================== */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', 'Work Sans', system-ui, sans-serif;
font-size: 16px;
line-height: 1.75;
color: var(--tm-text-body);
background-color: var(--tm-bg-primary);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
position: relative;
}
/* ========================================
Global Paper Grain Overlay
======================================== */
body::after {
content: '';
position: fixed;
inset: 0;
z-index: 9999;
opacity: 0.4;
pointer-events: none;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='grain'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23grain)' opacity='0.06'/%3E%3C/svg%3E");
background-size: 256px 256px;
}
/* ========================================
Typography
======================================== */
h1, h2, h3 {
font-family: 'Lora', 'Cormorant Garamond', Georgia, serif;
font-weight: 400;
color: var(--tm-text-heading);
line-height: 1.3;
}
h1 { font-size: 2.75rem; letter-spacing: -0.015em; line-height: 1.15; }
h2 { font-size: 1.75rem; letter-spacing: 0.005em; }
h3 { font-size: 1.25rem; letter-spacing: 0.01em; }
h4 {
font-family: 'Manrope', 'Work Sans', sans-serif;
font-weight: 500;
font-size: 0.75rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--tm-text-secondary);
}
p {
max-width: 38em;
margin-bottom: 1.5em;
}
a {
color: var(--tm-accent-sage);
text-decoration: underline;
text-decoration-color: rgba(139, 154, 126, 0.3);
text-underline-offset: 3px;
transition: color 0.2s ease, text-decoration-color 0.2s ease;
}
a:hover {
color: var(--tm-text-primary);
text-decoration-color: var(--tm-text-primary);
}
blockquote {
font-family: 'Cormorant Garamond', Georgia, serif;
font-weight: 300;
font-style: italic;
font-size: 1.4rem;
line-height: 1.6;
color: var(--tm-text-primary);
border-left: 2px solid var(--tm-accent-parchment);
padding-left: 1.5rem;
margin: 2rem 0;
max-width: 32em;
}
.label {
font-family: 'Manrope', sans-serif;
font-size: 0.72rem;
font-weight: 500;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--tm-text-secondary);
}
/* ========================================
Layout
======================================== */
.container {
max-width: 1100px;
margin: 0 auto;
padding: 0 2rem;
}
.content-width {
max-width: 720px;
}
/* ========================================
Navigation
======================================== */
.tm-nav {
position: sticky;
top: 0;
z-index: 100;
background: rgba(250, 247, 242, 0.92);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid var(--tm-border-light);
padding: 0.9rem 2rem;
display: flex;
align-items: center;
justify-content: space-between;
}
.tm-nav-brand {
font-family: 'Lora', serif;
font-weight: 500;
font-size: 1.15rem;
color: var(--tm-text-heading);
text-decoration: none;
}
.tm-nav-brand:hover {
text-decoration: none;
}
.tm-nav-links {
display: flex;
gap: 0.25rem;
list-style: none;
}
.tm-nav-links a {
color: var(--tm-text-secondary);
text-decoration: none;
font-family: 'Manrope', sans-serif;
font-weight: 500;
font-size: 0.82rem;
letter-spacing: 0.04em;
padding: 0.4rem 0.9rem;
border-radius: var(--tm-radius-sm);
transition: color var(--tm-transition), background var(--tm-transition);
}
.tm-nav-links a:hover {
color: var(--tm-text-primary);
background: rgba(61, 56, 51, 0.04);
}
.tm-nav-links a.active {
color: var(--tm-accent-sage);
background: rgba(139, 154, 126, 0.08);
}
/* ========================================
Hero Section
======================================== */
.tm-hero {
position: relative;
background: var(--tm-bg-surface);
border-bottom: 1px solid var(--tm-border-light);
padding: 6rem 0 5rem;
overflow: hidden;
}
/* Linen texture overlay on hero */
.tm-hero::before {
content: '';
position: absolute;
inset: 0;
opacity: 0.04;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Crect width='8' height='1' y='0' fill='%236B6359' opacity='0.3'/%3E%3Crect width='1' height='8' x='0' fill='%236B6359' opacity='0.3'/%3E%3Crect width='8' height='1' y='4' fill='%236B6359' opacity='0.15'/%3E%3Crect width='1' height='8' x='4' fill='%236B6359' opacity='0.15'/%3E%3C/svg%3E");
background-size: 8px 8px;
pointer-events: none;
}
/* Warm gradient wash */
.tm-hero::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(
160deg,
rgba(196, 168, 130, 0.04) 0%,
transparent 50%,
rgba(139, 154, 126, 0.03) 100%
);
pointer-events: none;
}
.tm-hero > .container > * {
position: relative;
z-index: 1;
}
.tm-hero h1 {
font-size: 3rem;
max-width: 14em;
margin-bottom: 1.25rem;
}
.tm-hero p {
font-size: 1.1rem;
line-height: 1.8;
color: var(--tm-text-body);
max-width: 32em;
margin-bottom: 2rem;
}
.tm-hero .label {
display: block;
margin-bottom: 1rem;
color: var(--tm-accent-sage);
}
/* ========================================
Section Styles
======================================== */
.tm-section {
padding: 5rem 0;
}
.tm-section--alt {
background: var(--tm-bg-surface);
position: relative;
}
.tm-section--alt::before {
content: '';
position: absolute;
inset: 0;
opacity: 0.025;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6'%3E%3Crect width='1' height='1' x='2' y='1' fill='%236B6359' opacity='0.6'/%3E%3Crect width='1' height='1' x='5' y='4' fill='%236B6359' opacity='0.3'/%3E%3Crect width='1' height='1' x='0' y='3' fill='%236B6359' opacity='0.4'/%3E%3Crect width='1' height='1' x='3' y='5' fill='%236B6359' opacity='0.5'/%3E%3C/svg%3E");
background-size: 6px 6px;
pointer-events: none;
}
.tm-section h2 {
margin-bottom: 1rem;
}
.tm-section > .container > .label {
display: block;
margin-bottom: 0.75rem;
}
.tm-section-intro {
font-size: 1.05rem;
color: var(--tm-text-body);
margin-bottom: 3rem;
max-width: 36em;
}
/* ========================================
Dividers
======================================== */
.tm-divider {
border: none;
height: 1px;
background: linear-gradient(
to right,
transparent 0%,
var(--tm-border) 25%,
var(--tm-border) 75%,
transparent 100%
);
margin: 0 auto;
max-width: 60%;
}
.tm-divider-dot {
border: none;
text-align: center;
margin: 4rem auto;
}
.tm-divider-dot::before {
content: '\00B7\2003\00B7\2003\00B7';
font-size: 1.5rem;
color: var(--tm-text-muted);
}
/* ========================================
Cards Grid
======================================== */
.tm-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1.75rem;
}
.tm-card {
background: var(--tm-bg-surface);
border: 1px solid var(--tm-border-light);
border-radius: var(--tm-radius-lg);
padding: 2rem 2.25rem;
position: relative;
box-shadow: var(--tm-shadow-sm);
transition:
box-shadow var(--tm-transition),
transform var(--tm-transition);
overflow: hidden;
}
.tm-card::after {
content: '';
position: absolute;
inset: 0;
opacity: 0.03;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6'%3E%3Crect width='1' height='1' x='1' y='0' fill='%236B6359' opacity='0.5'/%3E%3Crect width='1' height='1' x='4' y='3' fill='%236B6359' opacity='0.3'/%3E%3Crect width='1' height='1' x='0' y='5' fill='%236B6359' opacity='0.4'/%3E%3C/svg%3E");
background-size: 6px 6px;
pointer-events: none;
border-radius: inherit;
}
.tm-card:hover {
box-shadow: var(--tm-shadow-md);
transform: translateY(-1px);
}
.tm-card .label {
display: block;
margin-bottom: 0.75rem;
}
.tm-card h3 {
font-family: 'Lora', serif;
font-weight: 400;
font-size: 1.2rem;
margin-bottom: 0.75rem;
color: var(--tm-text-heading);
}
.tm-card p {
font-size: 0.95rem;
color: var(--tm-text-body);
line-height: 1.7;
margin-bottom: 0;
}
/* ========================================
Buttons
======================================== */
.tm-btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.7rem 1.8rem;
background: var(--tm-text-primary);
color: var(--tm-bg-primary);
border: none;
border-radius: var(--tm-radius-md);
font-family: 'Manrope', 'Work Sans', sans-serif;
font-weight: 500;
font-size: 0.82rem;
letter-spacing: 0.06em;
text-transform: uppercase;
text-decoration: none;
cursor: pointer;
transition:
background var(--tm-transition),
box-shadow var(--tm-transition);
}
.tm-btn:hover {
background: var(--tm-text-heading);
box-shadow: var(--tm-shadow-md);
color: var(--tm-bg-primary);
text-decoration: none;
}
.tm-btn-secondary {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.65rem 1.75rem;
background: transparent;
color: var(--tm-text-body);
border: 1px solid var(--tm-border);
border-radius: var(--tm-radius-md);
font-family: 'Manrope', 'Work Sans', sans-serif;
font-weight: 500;
font-size: 0.82rem;
letter-spacing: 0.06em;
text-transform: uppercase;
text-decoration: none;
cursor: pointer;
transition:
border-color var(--tm-transition),
background var(--tm-transition),
color var(--tm-transition);
}
.tm-btn-secondary:hover {
border-color: var(--tm-accent-sage);
color: var(--tm-text-primary);
background: rgba(139, 154, 126, 0.06);
text-decoration: none;
}
/* ========================================
Feature (Two-Column Split)
======================================== */
.tm-feature {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 3rem;
align-items: center;
}
.tm-feature-image {
width: 100%;
aspect-ratio: 4 / 3;
background: var(--tm-bg-surface-alt);
border-radius: var(--tm-radius-lg);
border: 1px solid var(--tm-border-light);
position: relative;
overflow: hidden;
}
/* Linen texture inside image placeholder */
.tm-feature-image::after {
content: '';
position: absolute;
inset: 0;
opacity: 0.05;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Crect width='8' height='1' y='0' fill='%236B6359' opacity='0.3'/%3E%3Crect width='1' height='8' x='0' fill='%236B6359' opacity='0.3'/%3E%3Crect width='8' height='1' y='4' fill='%236B6359' opacity='0.15'/%3E%3Crect width='1' height='8' x='4' fill='%236B6359' opacity='0.15'/%3E%3C/svg%3E");
background-size: 8px 8px;
pointer-events: none;
}
.tm-feature-content h2 {
margin-bottom: 1rem;
}
.tm-feature-content p {
margin-bottom: 1.75rem;
}
/* ========================================
Testimonial / Quote Block
======================================== */
.tm-quote-block {
background: var(--tm-bg-surface);
border-radius: var(--tm-radius-lg);
border: 1px solid var(--tm-border-light);
padding: 3rem 3rem 2.5rem;
position: relative;
overflow: hidden;
}
.tm-quote-block::before {
content: '';
position: absolute;
inset: 0;
opacity: 0.03;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6'%3E%3Crect width='1' height='1' x='1' y='0' fill='%236B6359' opacity='0.5'/%3E%3Crect width='1' height='1' x='4' y='3' fill='%236B6359' opacity='0.3'/%3E%3Crect width='1' height='1' x='0' y='5' fill='%236B6359' opacity='0.4'/%3E%3C/svg%3E");
background-size: 6px 6px;
pointer-events: none;
}
.tm-quote-block blockquote {
border-left: none;
padding-left: 0;
position: relative;
z-index: 1;
}
.tm-quote-block .tm-quote-author {
font-family: 'Manrope', sans-serif;
font-size: 0.8rem;
font-weight: 500;
letter-spacing: 0.04em;
color: var(--tm-text-secondary);
margin-top: 1.25rem;
position: relative;
z-index: 1;
}
/* ========================================
Input Fields
======================================== */
.tm-input {
width: 100%;
padding: 0.75rem 1rem;
background: var(--tm-bg-primary);
border: 1px solid var(--tm-border);
border-radius: var(--tm-radius-md);
font-family: 'Inter', sans-serif;
font-size: 0.95rem;
color: var(--tm-text-primary);
outline: none;
transition:
border-color var(--tm-transition),
box-shadow var(--tm-transition);
}
.tm-input::placeholder {
color: var(--tm-text-muted);
}
.tm-input:focus {
border-color: var(--tm-accent-sage);
box-shadow: 0 0 0 3px rgba(139, 154, 126, 0.1);
}
/* ========================================
Newsletter Section
======================================== */
.tm-newsletter {
display: flex;
gap: 0.75rem;
max-width: 480px;
}
.tm-newsletter .tm-input {
flex: 1;
}
/* ========================================
Footer
======================================== */
.tm-footer {
border-top: 1px solid var(--tm-border-light);
padding: 3rem 0;
color: var(--tm-text-secondary);
font-size: 0.85rem;
}
.tm-footer-inner {
display: flex;
justify-content: space-between;
align-items: center;
}
.tm-footer a {
color: var(--tm-text-secondary);
text-decoration: none;
transition: color var(--tm-transition);
}
.tm-footer a:hover {
color: var(--tm-text-primary);
}
.tm-footer-links {
display: flex;
gap: 1.5rem;
list-style: none;
}
/* ========================================
Responsive
======================================== */
@media (max-width: 768px) {
.tm-hero h1 {
font-size: 2.25rem;
}
.tm-feature {
grid-template-columns: 1fr;
gap: 2rem;
}
.tm-grid {
grid-template-columns: 1fr;
}
.tm-nav-links {
display: none; /* Simplify for mobile; implement hamburger menu as needed */
}
.tm-footer-inner {
flex-direction: column;
gap: 1rem;
text-align: center;
}
}
</style>
</head>
<body>
<!-- ===== Navigation ===== -->
<nav class="tm-nav">
<a href="#" class="tm-nav-brand">Atelier</a>
<ul class="tm-nav-links">
<li><a href="#" class="active">Work</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Journal</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<!-- ===== Hero ===== -->
<section class="tm-hero">
<div class="container">
<span class="label">Design Studio</span>
<h1>Objects made with care, surfaces shaped by hand</h1>
<p>
We believe that thoughtful design begins with honest materials.
Every project starts with texture, with touch, with the quiet
details that make a surface feel alive beneath your fingertips.
</p>
<div style="display: flex; gap: 1rem; flex-wrap: wrap;">
<a href="#" class="tm-btn">View Our Work</a>
<a href="#" class="tm-btn-secondary">Read the Journal</a>
</div>
</div>
</section>
<!-- ===== Cards Section ===== -->
<section class="tm-section">
<div class="container">
<span class="label">Selected Projects</span>
<h2>Recent work</h2>
<p class="tm-section-intro">
A curated selection of projects where material honesty and
restrained composition guided every decision.
</p>
<div class="tm-grid">
<article class="tm-card">
<span class="label">Branding</span>
<h3>Millbrook Ceramics</h3>
<p>
Identity and packaging for a handmade pottery studio.
Raw clay textures and warm earth tones define every touchpoint,
from the embossed business cards to the linen-wrapped catalog.
</p>
</article>
<article class="tm-card">
<span class="label">Editorial</span>
<h3>Grain & Light</h3>
<p>
Art direction for a quarterly journal exploring the intersection
of architecture and natural materials. Paper stock selection
was as important as the photography.
</p>
</article>
<article class="tm-card">
<span class="label">Digital</span>
<h3>Linen & Thread</h3>
<p>
E-commerce experience for a sustainable textile brand.
The interface feels like browsing a curated showroom --
sparse, warm, and deliberately paced.
</p>
</article>
</div>
</div>
</section>
<!-- ===== Divider ===== -->
<hr class="tm-divider">
<!-- ===== Feature Section ===== -->
<section class="tm-section">
<div class="container">
<div class="tm-feature">
<div class="tm-feature-image" role="img" aria-label="Architectural concrete wall with natural light"></div>
<div class="tm-feature-content">
<span class="label">Our Approach</span>
<h2>Surfaces tell stories</h2>
<p>
We start every project by asking what the surface should feel like,
not just what it should look like. The grain of paper, the weave of
linen, the aggregate in concrete -- these micro-details communicate
authenticity before a single word is read.
</p>
<a href="#" class="tm-btn-secondary">Learn More</a>
</div>
</div>
</div>
</section>
<!-- ===== Quote Section ===== -->
<section class="tm-section tm-section--alt">
<div class="container">
<div class="tm-quote-block">
<blockquote>
“The most profound design decisions are the ones nobody
notices consciously -- the warmth of an off-white that is not
quite white, the weight of paper that feels right in the hand,
the texture that makes a screen feel less like a screen.”
</blockquote>
<div class="tm-quote-author">
-- Studio Atelier, Design Principles
</div>
</div>
</div>
</section>
<!-- ===== Dot Divider ===== -->
<hr class="tm-divider-dot">
<!-- ===== Newsletter Section ===== -->
<section class="tm-section">
<div class="container">
<span class="label">Stay Connected</span>
<h2>The Texture Journal</h2>
<p class="tm-section-intro">
Monthly reflections on material culture, honest design, and the
quiet details that matter. No noise, no clutter -- just substance.
</p>
<div class="tm-newsletter">
<input type="email" class="tm-input" placeholder="your@email.com">
<button class="tm-btn">Subscribe</button>
</div>
</div>
</section>
<!-- ===== Footer ===== -->
<footer class="tm-footer">
<div class="container">
<div class="tm-footer-inner">
<span>© 2026 Atelier Studio. Crafted with care.</span>
<ul class="tm-footer-links">
<li><a href="#">Privacy</a></li>
<li><a href="#">Terms</a></li>
<li><a href="#">Instagram</a></li>
</ul>
</div>
</div>
</footer>
</body>
</html>
@media (-webkit-min-device-pixel-ratio: 2)) to adjust opacity per screen density::before or ::after pseudo-elements with pointer-events: none and position: absolute; inset: 0 to prevent them from interfering with content interaction or layout flowprefers-reduced-motion fallback – while Textured Minimalism uses minimal animation, ensure that all transitions respect the user’s motion preferences by wrapping transition declarations in @media (prefers-reduced-motion: no-preference) { } blocks--tm-text-secondary should only be used for non-essential metadata, never for primary content