Duotone is a graphic design technique that reduces an image or composition to just two colors, mapping one to the shadows and another to the highlights. Rooted in the economics of print production – where two-ink halftone processes could create striking, cost-effective reproductions – duotone has evolved from a practical printing constraint into a deliberate, high-impact aesthetic choice. The technique gained modern digital prominence through Spotify’s 2015 rebrand (designed by Collins), which applied bold, two-color overlays to artist photography and made the effect synonymous with contemporary music culture. In web and UI design, Duotone translates to dramatic color-washed imagery, high-contrast photography treatments, bold two-color palettes that unify disparate visual content under a single cohesive brand mood, and a graphic boldness that immediately commands attention. The power of duotone lies in subtraction: by removing color complexity, you amplify visual impact, create instant brand recognition, and force the viewer to engage with shape, contrast, and composition rather than photographic detail.
| Color Name | Hex | Role / Usage |
|---|---|---|
| Midnight Indigo | #1A0533 |
Primary dark / shadow mapping color |
| Electric Coral | #FF6B6B |
Primary light / highlight mapping color |
| Deep Navy | #0D1B3E |
Dark background, shadow tone alternative |
| Vivid Magenta | #E91E8C |
Bright highlight, accent, CTA emphasis |
| Ocean Teal | #0A7E8C |
Cool shadow tone for sophisticated palettes |
| Sunlit Gold | #FFB347 |
Warm highlight, optimistic energy |
| Royal Purple | #6B2FA0 |
Rich shadow, creative and luxurious feel |
| Hot Pink | #FF3CAC |
Vibrant highlight, energetic and youthful |
| Charcoal Slate | #2D2D3A |
Neutral dark for UI surfaces and panels |
| Bone White | #F5F0EB |
Light background, text on dark surfaces |
| Pure White | #FFFFFF |
Maximum highlight, text, chrome elements |
| Near Black | #0A0A12 |
Deepest background, footer, modal overlays |
| Muted Lavender | #8B7FA8 |
Secondary text, captions, subtle UI elements |
| Soft Coral Tint | #FFD4D4 |
Light accent, hover states, subtle highlights |
:root {
/* Primary duotone pair (Dark + Light) */
--duo-shadow: #1a0533;
--duo-highlight: #ff6b6b;
/* Alternative duotone pairs */
--duo-pair2-shadow: #0d1b3e;
--duo-pair2-highlight: #e91e8c;
--duo-pair3-shadow: #0a7e8c;
--duo-pair3-highlight: #ffb347;
--duo-pair4-shadow: #6b2fa0;
--duo-pair4-highlight: #ff3cac;
/* Neutral foundations */
--duo-bg-dark: #0a0a12;
--duo-bg-surface: #2d2d3a;
--duo-bg-light: #f5f0eb;
--duo-white: #ffffff;
/* Text */
--duo-text-on-dark: #f5f0eb;
--duo-text-on-light: #1a0533;
--duo-text-muted: #8b7fa8;
/* Gradients */
--duo-gradient-primary: linear-gradient(135deg, #1a0533 0%, #ff6b6b 100%);
--duo-gradient-vivid: linear-gradient(135deg, #0d1b3e 0%, #e91e8c 100%);
--duo-gradient-warm: linear-gradient(135deg, #6b2fa0 0%, #ffb347 100%);
--duo-gradient-cool: linear-gradient(135deg, #0a7e8c 0%, #ff6b6b 100%);
/* Overlays */
--duo-overlay-shadow: rgba(26, 5, 51, 0.85);
--duo-overlay-highlight: rgba(255, 107, 107, 0.6);
}
Duotone typography is:
| Font | Style | Best For |
|---|---|---|
| Space Grotesk | Geometric, contemporary | Headlines, hero text, strong display |
| Sora | Geometric, clean | Headlines, subheadings, modern feel |
| Inter | Neutral, highly legible | Body text, UI elements, versatile |
| Manrope | Geometric, friendly | Subheadings, body, approachable tone |
| DM Sans | Geometric, low contrast | Body text, labels, clean reading |
| Plus Jakarta Sans | Modern geometric | Headlines, subheadings, premium feel |
| Archivo Black | Ultra bold display | Large hero headlines, maximum impact |
| Bebas Neue | Condensed, tall display | Poster-style headlines, all-caps titles |
| Work Sans | Geometric, workmanlike | Body text, paragraphs, utility text |
| Albert Sans | Geometric, contemporary | Navigation, labels, small text |
| Heading Font | Body Font | Character |
|---|---|---|
| Archivo Black (400) | Inter (400) | Maximum graphic impact, clean body |
| Bebas Neue (400) | DM Sans (400) | Poster-bold headlines, elegant body |
| Space Grotesk (700) | Manrope (400) | Contemporary, geometric harmony |
| Sora (800) | Work Sans (400) | Modern boldness, readable body |
| Plus Jakarta Sans (800) | Albert Sans (400) | Premium, polished, startup aesthetic |
/* Import fonts */
@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;700&family=Inter:wght@400;500;600&display=swap');
/* Headings */
h1, h2, h3, h4, h5, h6 {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
color: var(--duo-text-on-dark);
text-transform: uppercase;
letter-spacing: 0.02em;
line-height: 1.1;
}
/* Display / Hero text with duotone gradient */
.duo-display {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(3rem, 8vw, 7rem);
font-weight: 700;
text-transform: uppercase;
letter-spacing: -0.02em;
line-height: 0.95;
background: var(--duo-gradient-primary);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* Solid color heading */
.duo-heading-highlight {
font-family: 'Space Grotesk', sans-serif;
color: var(--duo-highlight);
}
/* Body text */
body {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 1rem;
line-height: 1.7;
color: var(--duo-text-on-dark);
}
/* Muted label */
.duo-label {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.75rem;
font-weight: 500;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--duo-text-muted);
}
/* Large stat number */
.duo-stat-number {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(3rem, 6vw, 5rem);
font-weight: 700;
color: var(--duo-highlight);
line-height: 1;
}
clamp() for mobile readability.duo-card {
background: var(--duo-bg-surface);
border: 1px solid rgba(255, 107, 107, 0.1);
border-radius: 8px;
padding: 32px;
position: relative;
overflow: hidden;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.duo-card:hover {
transform: translateY(-4px);
box-shadow: 0 20px 40px rgba(26, 5, 51, 0.4);
}
/* Accent gradient bar at top */
.duo-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: var(--duo-gradient-primary);
}
.duo-card__title {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 1.15rem;
color: var(--duo-highlight);
margin-bottom: 12px;
}
.duo-card__text {
color: var(--duo-text-muted);
font-size: 0.95rem;
line-height: 1.6;
}
/* Card grid layout */
.duo-card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 24px;
}
.duo-button {
display: inline-flex;
align-items: center;
justify-content: center;
background: var(--duo-highlight);
color: var(--duo-shadow);
border: none;
border-radius: 6px;
padding: 14px 36px;
font-family: 'Space Grotesk', sans-serif;
font-size: 0.9rem;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
cursor: pointer;
transition: all 0.25s ease;
text-decoration: none;
}
.duo-button:hover {
background: var(--duo-white);
color: var(--duo-shadow);
box-shadow: 0 8px 24px rgba(255, 107, 107, 0.3);
}
/* Outline variant */
.duo-button--outline {
background: transparent;
color: var(--duo-highlight);
border: 2px solid var(--duo-highlight);
}
.duo-button--outline:hover {
background: var(--duo-highlight);
color: var(--duo-shadow);
}
/* Gradient variant */
.duo-button--gradient {
background: var(--duo-gradient-primary);
color: var(--duo-white);
border: none;
}
.duo-button--gradient:hover {
filter: brightness(1.15);
box-shadow: 0 8px 24px rgba(26, 5, 51, 0.4);
}
.duo-nav {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
padding: 20px 40px;
position: relative;
z-index: 10;
}
.duo-nav__logo {
font-family: 'Space Grotesk', sans-serif;
font-size: 1.4rem;
font-weight: 700;
color: var(--duo-highlight);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.duo-nav__links {
display: flex;
gap: 32px;
list-style: none;
margin: 0;
padding: 0;
}
.duo-nav__links a {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.9rem;
color: var(--duo-text-muted);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.04em;
transition: color 0.2s ease;
}
.duo-nav__links a:hover {
color: var(--duo-highlight);
}
.duo-nav__links a.active {
color: var(--duo-highlight);
}
.duo-hero {
position: relative;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
padding: 80px 40px;
overflow: hidden;
}
/* Background image (set via inline style or additional class) */
.duo-hero__image {
position: absolute;
inset: 0;
background-size: cover;
background-position: center;
filter: grayscale(100%) contrast(1.2);
z-index: 1;
}
/* Duotone color overlay using blend modes */
.duo-hero__overlay {
position: absolute;
inset: 0;
background: var(--duo-gradient-primary);
mix-blend-mode: color;
z-index: 2;
}
/* Darkening layer for text legibility */
.duo-hero__darken {
position: absolute;
inset: 0;
background: rgba(26, 5, 51, 0.3);
z-index: 3;
}
.duo-hero__content {
position: relative;
z-index: 5;
max-width: 800px;
}
.duo-hero__content h1 {
font-size: clamp(3rem, 8vw, 6.5rem);
margin-bottom: 1.5rem;
color: var(--duo-white);
letter-spacing: -0.02em;
}
.duo-hero__content p {
font-size: 1.15rem;
color: rgba(245, 240, 235, 0.8);
margin-bottom: 2.5rem;
max-width: 560px;
margin-left: auto;
margin-right: auto;
}
@media (max-width: 768px) {
.duo-hero { min-height: auto; padding: 80px 20px; }
}
This technique uses CSS mix-blend-mode to create a duotone effect on any image without SVG filters. It layers a gradient over a grayscale image.
/* Container for the duotone effect */
.duo-image-wrapper {
position: relative;
overflow: hidden;
border-radius: 8px;
}
/* The image itself, converted to grayscale and boosted contrast */
.duo-image-wrapper img {
display: block;
width: 100%;
height: auto;
filter: grayscale(100%) contrast(1.1);
}
/* Color overlay that creates the duotone effect */
.duo-image-wrapper::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg, var(--duo-shadow) 0%, var(--duo-highlight) 100%);
mix-blend-mode: color;
pointer-events: none;
}
/* Alternative: single-color tint using multiply */
.duo-image-wrapper--multiply::after {
background: var(--duo-highlight);
mix-blend-mode: multiply;
}
/* Alternative: using screen blend for lighter effect */
.duo-image-wrapper--screen::after {
background: var(--duo-shadow);
mix-blend-mode: screen;
}
/* Hover reveal: show original image on hover */
.duo-image-wrapper--reveal img {
transition: filter 0.4s ease;
}
.duo-image-wrapper--reveal:hover img {
filter: grayscale(0%) contrast(1);
}
.duo-image-wrapper--reveal::after {
transition: opacity 0.4s ease;
}
.duo-image-wrapper--reveal:hover::after {
opacity: 0;
}
This technique uses inline SVG filters with feComponentTransfer to create a true duotone mapping. This is the most accurate duotone method and mirrors how print duotone works – mapping the grayscale range to two specific colors.
<!-- Define the SVG filter (place once in the HTML, hidden) -->
<svg style="display: none;">
<defs>
<!-- Duotone: Midnight Indigo (#1A0533) to Electric Coral (#FF6B6B) -->
<filter id="duotone-indigo-coral">
<!-- Step 1: Convert to grayscale using luminance values -->
<feColorMatrix type="matrix"
values="0.33 0.33 0.33 0 0
0.33 0.33 0.33 0 0
0.33 0.33 0.33 0 0
0 0 0 1 0" />
<!-- Step 2: Map grayscale to two-color range -->
<!-- Shadow: #1A0533 = rgb(26,5,51) => 0.102, 0.020, 0.200 -->
<!-- Highlight: #FF6B6B = rgb(255,107,107) => 1.000, 0.420, 0.420 -->
<feComponentTransfer color-interpolation-filters="sRGB">
<feFuncR type="table" tableValues="0.102 1.000" />
<feFuncG type="table" tableValues="0.020 0.420" />
<feFuncB type="table" tableValues="0.200 0.420" />
</feComponentTransfer>
</filter>
<!-- Duotone: Deep Navy (#0D1B3E) to Vivid Magenta (#E91E8C) -->
<filter id="duotone-navy-magenta">
<feColorMatrix type="matrix"
values="0.33 0.33 0.33 0 0
0.33 0.33 0.33 0 0
0.33 0.33 0.33 0 0
0 0 0 1 0" />
<feComponentTransfer color-interpolation-filters="sRGB">
<feFuncR type="table" tableValues="0.051 0.914" />
<feFuncG type="table" tableValues="0.106 0.118" />
<feFuncB type="table" tableValues="0.243 0.549" />
</feComponentTransfer>
</filter>
<!-- Duotone: Royal Purple (#6B2FA0) to Sunlit Gold (#FFB347) -->
<filter id="duotone-purple-gold">
<feColorMatrix type="matrix"
values="0.33 0.33 0.33 0 0
0.33 0.33 0.33 0 0
0.33 0.33 0.33 0 0
0 0 0 1 0" />
<feComponentTransfer color-interpolation-filters="sRGB">
<feFuncR type="table" tableValues="0.420 1.000" />
<feFuncG type="table" tableValues="0.184 0.702" />
<feFuncB type="table" tableValues="0.627 0.278" />
</feComponentTransfer>
</filter>
</defs>
</svg>
/* Apply SVG filter to images via CSS */
.duo-filter-indigo-coral {
filter: url(#duotone-indigo-coral);
}
.duo-filter-navy-magenta {
filter: url(#duotone-navy-magenta);
}
.duo-filter-purple-gold {
filter: url(#duotone-purple-gold);
}
/* Hover to reveal original */
.duo-filter-reveal {
transition: filter 0.4s ease;
}
.duo-filter-reveal:hover {
filter: none;
}
/* Gradient text using the duotone palette */
.duo-gradient-text {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
text-transform: uppercase;
background: var(--duo-gradient-primary);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* Animated gradient text */
.duo-gradient-text--animated {
background-size: 200% 200%;
animation: duo-text-shift 4s ease infinite;
}
@keyframes duo-text-shift {
0%, 100% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
}
.duo-divider {
border: none;
height: 3px;
background: var(--duo-gradient-primary);
margin: 60px auto;
max-width: 1200px;
}
/* Thin centered accent line */
.duo-divider--accent {
max-width: 80px;
height: 4px;
border-radius: 2px;
background: var(--duo-highlight);
margin: 32px auto;
}
A nod to the print origins of duotone, this creates a halftone dot texture using radial gradients.
.duo-halftone {
position: relative;
}
.duo-halftone::after {
content: '';
position: absolute;
inset: 0;
background-image: radial-gradient(
circle,
var(--duo-shadow) 1px,
transparent 1px
);
background-size: 6px 6px;
opacity: 0.15;
pointer-events: none;
mix-blend-mode: multiply;
}
/* Larger dot pattern for more visible texture */
.duo-halftone--large::after {
background-image: radial-gradient(
circle,
var(--duo-shadow) 2px,
transparent 2px
);
background-size: 10px 10px;
opacity: 0.1;
}
Since duotone is defined by its color pair, switching palettes is as simple as overriding two custom properties. This allows a single page to support multiple duotone moods.
/* Default: Indigo + Coral */
:root {
--duo-shadow: #1a0533;
--duo-highlight: #ff6b6b;
}
/* Pair 2: Navy + Magenta */
[data-duo-theme="navy-magenta"] {
--duo-shadow: #0d1b3e;
--duo-highlight: #e91e8c;
--duo-gradient-primary: linear-gradient(135deg, #0d1b3e 0%, #e91e8c 100%);
}
/* Pair 3: Purple + Gold */
[data-duo-theme="purple-gold"] {
--duo-shadow: #6b2fa0;
--duo-highlight: #ffb347;
--duo-gradient-primary: linear-gradient(135deg, #6b2fa0 0%, #ffb347 100%);
}
/* Pair 4: Teal + Coral */
[data-duo-theme="teal-coral"] {
--duo-shadow: #0a7e8c;
--duo-highlight: #ff6b6b;
--duo-gradient-primary: linear-gradient(135deg, #0a7e8c 0%, #ff6b6b 100%);
}
/* Pair 5: Charcoal + Electric Blue */
[data-duo-theme="charcoal-blue"] {
--duo-shadow: #1a1a2e;
--duo-highlight: #00d4ff;
--duo-gradient-primary: linear-gradient(135deg, #1a1a2e 0%, #00d4ff 100%);
}
mix-blend-mode: color) or SVG filters (feComponentTransfer) for scalable, resolution-independent effectsmix-blend-mode without a grayscale base – the image must be desaturated first for a true duotone| Aesthetic | Relationship to Duotone |
|---|---|
| Monochrome | Shares the limited palette philosophy; Monochrome uses one color plus black/white, Duotone uses exactly two |
| Gradient Design | Both rely on color transitions; Gradient design uses full spectrum, Duotone limits to a two-color gradient |
| Swiss/International | Shares clean grids and typographic boldness; Swiss design is color-neutral, Duotone is color-forward |
| Pop Art | Both use bold, limited color for graphic punch; Pop Art is playful and referential, Duotone is more refined |
| Risograph | Both reference limited-color print processes; Risograph embraces misregistration and texture, Duotone is clean and precise |
| Brutalist Web | Both favor bold visual impact; Brutalist is deliberately raw and chaotic, Duotone is controlled and polished |
| Minimal | Shares the principle of reduction; Minimalism reduces everything, Duotone specifically reduces color while amplifying it |
| Vaporwave | Both use color-processed imagery; Vaporwave is nostalgic and ironic with pastels, Duotone is contemporary and sincere |
| Editorial | Both favor strong typography and image treatment; Editorial uses full photography, Duotone transforms it |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Duotone Page</title>
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<style>
:root {
--duo-shadow: #1a0533;
--duo-highlight: #ff6b6b;
--duo-bg-dark: #0a0a12;
--duo-bg-surface: #2d2d3a;
--duo-bg-light: #f5f0eb;
--duo-white: #ffffff;
--duo-text-on-dark: #f5f0eb;
--duo-text-muted: #8b7fa8;
--duo-gradient-primary: linear-gradient(135deg, #1a0533 0%, #ff6b6b 100%);
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: var(--duo-bg-dark);
color: var(--duo-text-on-dark);
font-family: 'Inter', sans-serif;
font-size: 1rem;
line-height: 1.7;
}
h1, h2, h3 {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.02em;
line-height: 1.1;
}
/* ---------- SVG Duotone Filters ---------- */
.svg-filters { display: none; }
/* ---------- Navigation ---------- */
nav {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
padding: 20px 40px;
position: relative;
z-index: 10;
}
nav a.logo {
font-family: 'Space Grotesk', sans-serif;
font-size: 1.3rem;
font-weight: 700;
color: var(--duo-highlight);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.04em;
}
nav ul { display: flex; gap: 28px; list-style: none; }
nav ul a {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.9rem;
color: var(--duo-text-muted);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.04em;
transition: color 0.2s ease;
}
nav ul a:hover { color: var(--duo-highlight); }
/* ---------- Hero ---------- */
.hero {
position: relative;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
min-height: 92vh;
padding: 80px 40px;
overflow: hidden;
background: var(--duo-bg-dark);
}
/* Abstract duotone background using layered gradients */
.hero::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 80% 60% at 30% 40%, rgba(26, 5, 51, 0.9) 0%, transparent 70%),
radial-gradient(ellipse 70% 50% at 70% 60%, rgba(255, 107, 107, 0.4) 0%, transparent 70%),
radial-gradient(ellipse 90% 70% at 50% 50%, rgba(26, 5, 51, 0.6) 0%, transparent 80%);
z-index: 1;
}
/* Halftone texture overlay */
.hero::after {
content: '';
position: absolute;
inset: 0;
background-image: radial-gradient(circle, var(--duo-shadow) 1px, transparent 1px);
background-size: 8px 8px;
opacity: 0.08;
pointer-events: none;
z-index: 2;
}
.hero-content {
position: relative;
z-index: 5;
max-width: 800px;
}
.hero h1 {
font-size: clamp(3rem, 8vw, 6.5rem);
margin-bottom: 1.5rem;
color: var(--duo-white);
letter-spacing: -0.02em;
}
.hero h1 span {
background: var(--duo-gradient-primary);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.hero p {
font-size: 1.15rem;
color: rgba(245, 240, 235, 0.7);
margin-bottom: 2.5rem;
max-width: 540px;
margin-left: auto;
margin-right: auto;
}
.btn {
display: inline-block;
background: var(--duo-highlight);
color: var(--duo-shadow);
border: none;
border-radius: 6px;
padding: 14px 36px;
font-family: 'Space Grotesk', sans-serif;
font-size: 0.9rem;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
text-decoration: none;
cursor: pointer;
transition: all 0.25s ease;
}
.btn:hover {
background: var(--duo-white);
box-shadow: 0 8px 24px rgba(255, 107, 107, 0.3);
}
.btn--outline {
background: transparent;
color: var(--duo-highlight);
border: 2px solid var(--duo-highlight);
margin-left: 12px;
}
.btn--outline:hover {
background: var(--duo-highlight);
color: var(--duo-shadow);
}
/* ---------- Divider ---------- */
.divider {
border: none;
height: 3px;
background: var(--duo-gradient-primary);
max-width: 1200px;
margin: 0 auto;
}
/* ---------- Gallery (Duotone Images) ---------- */
.gallery {
padding: 80px 40px;
background: var(--duo-shadow);
}
.gallery h2 {
text-align: center;
font-size: 1.8rem;
color: var(--duo-highlight);
margin-bottom: 48px;
}
.gallery-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 20px;
max-width: 1200px;
margin: 0 auto;
}
.gallery-item {
position: relative;
overflow: hidden;
border-radius: 8px;
aspect-ratio: 4 / 3;
background: var(--duo-bg-surface);
}
.gallery-item img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
filter: url(#duotone-filter);
transition: filter 0.4s ease;
}
.gallery-item:hover img {
filter: none;
}
.gallery-item__label {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 16px 20px;
background: linear-gradient(transparent, rgba(10, 10, 18, 0.8));
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 0.85rem;
color: var(--duo-white);
text-transform: uppercase;
letter-spacing: 0.04em;
transform: translateY(100%);
transition: transform 0.3s ease;
}
.gallery-item:hover .gallery-item__label {
transform: translateY(0);
}
/* Placeholder gradient for demo (replaces actual images) */
.gallery-placeholder {
width: 100%;
height: 100%;
background: linear-gradient(135deg, var(--duo-shadow), var(--duo-highlight));
opacity: 0.7;
}
/* ---------- Features ---------- */
.features {
padding: 80px 40px;
background: var(--duo-bg-dark);
}
.features h2 {
text-align: center;
font-size: 1.8rem;
color: var(--duo-white);
margin-bottom: 12px;
}
.features .subtitle {
text-align: center;
color: var(--duo-text-muted);
margin-bottom: 48px;
font-size: 1rem;
}
.features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 24px;
max-width: 1200px;
margin: 0 auto;
}
.feature {
background: var(--duo-bg-surface);
border: 1px solid rgba(255, 107, 107, 0.08);
border-radius: 8px;
padding: 32px;
position: relative;
overflow: hidden;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.feature::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: var(--duo-gradient-primary);
}
.feature:hover {
transform: translateY(-4px);
box-shadow: 0 16px 32px rgba(26, 5, 51, 0.4);
}
.feature-icon {
width: 48px;
height: 48px;
border-radius: 12px;
background: var(--duo-gradient-primary);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.4rem;
margin-bottom: 20px;
}
.feature h3 {
font-size: 1.1rem;
color: var(--duo-highlight);
margin-bottom: 12px;
}
.feature p {
color: var(--duo-text-muted);
font-size: 0.95rem;
line-height: 1.6;
}
/* ---------- Stats ---------- */
.stats {
padding: 60px 40px;
background: var(--duo-shadow);
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 40px;
max-width: 1000px;
margin: 0 auto;
text-align: center;
}
.stat-number {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(2.5rem, 5vw, 3.5rem);
font-weight: 700;
color: var(--duo-highlight);
line-height: 1;
margin-bottom: 8px;
}
.stat-label {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.75rem;
font-weight: 500;
color: var(--duo-text-muted);
text-transform: uppercase;
letter-spacing: 0.12em;
}
/* ---------- CTA ---------- */
.cta {
text-align: center;
padding: 80px 40px;
background: var(--duo-bg-dark);
position: relative;
overflow: hidden;
}
/* Gradient glow behind CTA */
.cta::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 600px;
height: 400px;
background: radial-gradient(ellipse, rgba(255, 107, 107, 0.15) 0%, transparent 70%);
pointer-events: none;
}
.cta h2 {
font-size: clamp(1.8rem, 4vw, 2.5rem);
color: var(--duo-white);
margin-bottom: 1rem;
position: relative;
}
.cta p {
color: var(--duo-text-muted);
margin-bottom: 2rem;
max-width: 480px;
margin-left: auto;
margin-right: auto;
position: relative;
}
/* ---------- Footer ---------- */
footer {
background: #06060c;
text-align: center;
padding: 30px 40px;
color: var(--duo-text-muted);
font-size: 0.85rem;
border-top: 1px solid rgba(255, 107, 107, 0.08);
}
footer a {
color: var(--duo-highlight);
text-decoration: none;
}
/* ---------- Responsive ---------- */
@media (max-width: 768px) {
nav { padding: 16px 20px; }
nav ul { gap: 16px; }
.hero { min-height: auto; padding: 60px 20px; }
.gallery { padding: 60px 20px; }
.features { padding: 60px 20px; }
.stats { padding: 40px 20px; }
.cta { padding: 60px 20px; }
}
</style>
</head>
<body>
<!-- SVG Duotone Filter Definition -->
<svg class="svg-filters">
<defs>
<filter id="duotone-filter">
<feColorMatrix type="matrix"
values="0.33 0.33 0.33 0 0
0.33 0.33 0.33 0 0
0.33 0.33 0.33 0 0
0 0 0 1 0" />
<feComponentTransfer color-interpolation-filters="sRGB">
<feFuncR type="table" tableValues="0.102 1.000" />
<feFuncG type="table" tableValues="0.020 0.420" />
<feFuncB type="table" tableValues="0.200 0.420" />
</feComponentTransfer>
</filter>
</defs>
</svg>
<nav>
<a href="#" class="logo">Chromatic</a>
<ul>
<li><a href="#">Work</a></li>
<li><a href="#">Studio</a></li>
<li><a href="#">Process</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<section class="hero">
<div class="hero-content">
<h1>Two Colors.<br><span>Infinite Impact.</span></h1>
<p>Strip away the noise. Reduce to two tones. Watch everything come alive with bold, graphic clarity.</p>
<a href="#" class="btn">Explore</a>
<a href="#" class="btn btn--outline">Learn More</a>
</div>
</section>
<hr class="divider">
<section class="gallery">
<h2>Selected Work</h2>
<div class="gallery-grid">
<div class="gallery-item">
<div class="gallery-placeholder"></div>
<div class="gallery-item__label">Brand Identity</div>
</div>
<div class="gallery-item">
<div class="gallery-placeholder" style="background: linear-gradient(225deg, var(--duo-shadow), var(--duo-highlight));"></div>
<div class="gallery-item__label">Editorial Design</div>
</div>
<div class="gallery-item">
<div class="gallery-placeholder" style="background: linear-gradient(45deg, var(--duo-shadow), var(--duo-highlight));"></div>
<div class="gallery-item__label">Campaign Art</div>
</div>
</div>
</section>
<section class="features">
<h2>Our Process</h2>
<p class="subtitle">Every project follows the same disciplined approach to color and contrast.</p>
<div class="features-grid">
<div class="feature">
<div class="feature-icon">01</div>
<h3>Distill</h3>
<p>We analyze your visual content and identify the two colors that best express your brand's emotional core and tonal range.</p>
</div>
<div class="feature">
<div class="feature-icon">02</div>
<h3>Transform</h3>
<p>Every image is processed through our duotone pipeline, mapping shadows and highlights to your chosen palette with precision.</p>
</div>
<div class="feature">
<div class="feature-icon">03</div>
<h3>Unify</h3>
<p>Disparate photography, illustration, and graphic elements merge into one cohesive visual language through shared color constraint.</p>
</div>
</div>
</section>
<section class="stats">
<div class="stats-grid">
<div>
<div class="stat-number">2</div>
<div class="stat-label">Colors. That's It.</div>
</div>
<div>
<div class="stat-number">147</div>
<div class="stat-label">Projects Delivered</div>
</div>
<div>
<div class="stat-number">98%</div>
<div class="stat-label">Brand Recall Rate</div>
</div>
<div>
<div class="stat-number">3.2s</div>
<div class="stat-label">Avg. Attention Hold</div>
</div>
</div>
</section>
<hr class="divider">
<section class="cta">
<h2>Ready to Reduce, Amplify, and Stand Out?</h2>
<p>Two colors is all it takes to make an unforgettable impression. Let's find yours.</p>
<a href="#" class="btn">Start a Project</a>
</section>
<footer>
<p>Chromatic Studio — Bold design through disciplined color. <a href="#">hello@chromatic.studio</a></p>
</footer>
</body>
</html>