Resonant Stark is a purpose-driven minimalism with emotional subtlety – ultra-clean layouts where every element earns its place, with warmth injected through micro-interactions and tonal shifts. It draws from the lineage of Swiss/International design and Japanese Ma (negative space philosophy) but rejects the coldness often associated with minimalism. The defining quality is resonance: a sense that the sparse visual field vibrates with intention, that the whitespace is not empty but charged. Ultra-thin typography floats in vast fields of near-white, borders dissolve to single pixels or vanish entirely, and color appears only as a whisper – a muted terracotta link, a sage hover state. Movement is the emotional medium: elements fade in on scroll with glacial smoothness, letter-spacing expands imperceptibly on hover, opacity shifts hint at depth beneath the surface. The result is design that feels like a held breath – still, precise, and quietly alive.
The Resonant Stark palette is defined by extreme restraint – near-whites and warm grays dominate, with color appearing only as a momentary accent:
Based on characteristic Resonant Stark visual compositions:
| Role | Color | Hex |
|---|---|---|
| Background Primary | Warm White | #FAFAFA |
| Background Alt | Cream White | #F5F5F0 |
| Background Subtle | Warm Snow | #F0EEEB |
| Surface | Light Warm Gray | #E8E4E0 |
| Surface Muted | Mid Warm Gray | #D4D0CC |
| Border Subtle | Pale Gray | #D0CCC8 |
| Text Primary | Near Black | #1A1A18 |
| Text Secondary | Dark Warm Gray | #6A6864 |
| Text Tertiary | Mid Gray | #9A9894 |
| Accent Warm | Muted Terracotta | #C4836A |
| Accent Cool | Sage Green | #8BA888 |
| Accent Neutral | Warm Clay | #A08060 |
| Hover Glow | Faded Terracotta | #C4836A20 |
| Gradient Start | Warm White | #FAFAFA |
| Gradient End | Cream | #F5F5F0 |
| Focus Ring | Light Terracotta | #C4836A40 |
:root {
/* Backgrounds */
--stark-bg-primary: #FAFAFA;
--stark-bg-alt: #F5F5F0;
--stark-bg-subtle: #F0EEEB;
--stark-bg-surface: #E8E4E0;
--stark-bg-muted: #D4D0CC;
/* Text */
--stark-text-primary: #1A1A18;
--stark-text-secondary: #6A6864;
--stark-text-tertiary: #9A9894;
--stark-text-faint: #B8B4B0;
/* Accent -- Terracotta (swap for project-specific accent) */
--stark-accent: #C4836A;
--stark-accent-hover: #B07058;
--stark-accent-faded: rgba(196, 131, 106, 0.12);
--stark-accent-glow: rgba(196, 131, 106, 0.06);
/* Alternate accent -- Sage */
--stark-accent-sage: #8BA888;
--stark-accent-sage-hover: #7A9A78;
--stark-accent-sage-faded: rgba(139, 168, 136, 0.12);
/* Borders */
--stark-border: #E8E4E0;
--stark-border-faint: #F0EEEB;
--stark-border-visible: #D0CCC8;
/* Shadows */
--stark-shadow-subtle: rgba(26, 26, 24, 0.04);
--stark-shadow-medium: rgba(26, 26, 24, 0.08);
/* Transitions */
--stark-transition-fast: 0.3s ease;
--stark-transition-base: 0.5s ease;
--stark-transition-slow: 0.8s ease;
--stark-transition-glacial: 1.2s ease;
/* Spacing scale */
--stark-space-xs: 0.5rem;
--stark-space-sm: 1rem;
--stark-space-md: 2rem;
--stark-space-lg: 4rem;
--stark-space-xl: 8rem;
--stark-space-2xl: 12rem;
/* Functional mappings */
--stark-bg-page: var(--stark-bg-primary);
--stark-bg-section: var(--stark-bg-alt);
--stark-text-heading: var(--stark-text-primary);
--stark-text-body: var(--stark-text-secondary);
--stark-accent-primary: var(--stark-accent);
--stark-border-default: var(--stark-border);
}
Resonant Stark typography relies on extreme thinness at large scale – the contradiction between fragility and monumentality creates visual tension:
| Font | Style | Usage |
|---|---|---|
| Inter | Geometric sans-serif (Thin 100, Light 300) | Primary choice – excellent thin weights, wide character set, clean geometry |
| Outfit | Geometric sans with warmth (Thin 100, Light 300) | Slightly softer than Inter, warmer curves at thin weights |
| Instrument Sans | Contemporary sans (Regular 400) | Body text alternative with humanist touches |
| Sora | Geometric sans (Thin 100, ExtraLight 200, Light 300) | Excellent ultra-thin display font with distinctive character |
| Jost | Futura-inspired geometric (Thin 100, Light 300) | Classic geometric proportions, beautiful at large thin sizes |
| Work Sans | Humanist sans (Thin 100, ExtraLight 200, Light 300) | Warmth in thin weights, good for accessible thin typography |
| Libre Franklin | Franklin Gothic revival (Thin 100, ExtraLight 200) | Traditional American sans proportions, stable at thin weights |
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400&display=swap');
/* Body -- light weight, generous spacing */
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
font-weight: 300;
font-size: 17px;
line-height: 1.8;
letter-spacing: 0.01em;
color: var(--stark-text-secondary);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* Display heading -- ultra-thin, monumental */
h1 {
font-weight: 100;
font-size: clamp(3rem, 8vw, 7rem);
line-height: 1.1;
letter-spacing: -0.02em;
color: var(--stark-text-primary);
margin-bottom: var(--stark-space-lg);
}
/* Section heading -- thin, wide-tracked */
h2 {
font-weight: 200;
font-size: clamp(1.8rem, 4vw, 3rem);
line-height: 1.2;
letter-spacing: 0.04em;
color: var(--stark-text-primary);
margin-bottom: var(--stark-space-md);
}
/* Subsection heading */
h3 {
font-weight: 300;
font-size: clamp(1.2rem, 2.5vw, 1.6rem);
line-height: 1.4;
letter-spacing: 0.03em;
color: var(--stark-text-primary);
margin-bottom: var(--stark-space-sm);
}
/* Label text -- uppercase, wide tracking */
.stark-label {
font-weight: 300;
font-size: 0.75rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--stark-text-tertiary);
}
/* Body text -- light, readable */
p {
font-weight: 300;
font-size: 1.0625rem;
line-height: 1.8;
color: var(--stark-text-secondary);
max-width: 38em;
margin-bottom: 1.5em;
}
/* Lead paragraph -- slightly larger, thinner */
.stark-lead {
font-weight: 200;
font-size: 1.25rem;
line-height: 1.9;
color: var(--stark-text-secondary);
max-width: 32em;
}
/* Link -- accent color, understated underline */
a {
color: var(--stark-accent);
text-decoration: none;
border-bottom: 0.5px solid var(--stark-accent-faded);
transition: border-color var(--stark-transition-base),
color var(--stark-transition-fast);
}
a:hover {
color: var(--stark-accent-hover);
border-bottom-color: var(--stark-accent);
}
The defining element of Resonant Stark – whitespace is not absence but the dominant design material:
Subtle hover and focus effects that create the “resonance” quality – the sense that the interface responds to attention:
Content emerges into view with restrained, purposeful animations:
Text itself becomes a visual element through scale and spacing:
When structural lines appear at all, they are whisper-thin:
/* Card or content block with subtle hover response */
.stark-card {
padding: var(--stark-space-lg);
opacity: 0.85;
transform: translateY(0);
transition:
opacity var(--stark-transition-base),
transform var(--stark-transition-base),
box-shadow var(--stark-transition-base);
}
.stark-card:hover {
opacity: 1;
transform: translateY(-3px);
box-shadow: 0 8px 40px var(--stark-shadow-subtle);
}
/* Elements start hidden and animate in when scrolled into view */
.stark-reveal {
opacity: 0;
transform: translateY(24px);
transition:
opacity var(--stark-transition-slow),
transform var(--stark-transition-slow);
}
.stark-reveal.is-visible {
opacity: 1;
transform: translateY(0);
}
/* Staggered children */
.stark-reveal-group .stark-reveal:nth-child(1) { transition-delay: 0s; }
.stark-reveal-group .stark-reveal:nth-child(2) { transition-delay: 0.12s; }
.stark-reveal-group .stark-reveal:nth-child(3) { transition-delay: 0.24s; }
.stark-reveal-group .stark-reveal:nth-child(4) { transition-delay: 0.36s; }
.stark-reveal-group .stark-reveal:nth-child(5) { transition-delay: 0.48s; }
/* Respect reduced motion preference */
@media (prefers-reduced-motion: reduce) {
.stark-reveal {
opacity: 1;
transform: none;
transition: none;
}
}
/* Intersection Observer for scroll-triggered reveals */
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add('is-visible');
observer.unobserve(entry.target);
}
});
},
{ threshold: 0.15, rootMargin: '0px 0px -40px 0px' }
);
document.querySelectorAll('.stark-reveal').forEach((el) => {
observer.observe(el);
});
/* Navigation or heading with expanding letter-spacing on hover */
.stark-nav-link {
font-weight: 200;
font-size: 0.8rem;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--stark-text-tertiary);
text-decoration: none;
border: none;
transition:
letter-spacing var(--stark-transition-base),
color var(--stark-transition-fast);
}
.stark-nav-link:hover {
letter-spacing: 0.16em;
color: var(--stark-text-primary);
}
.stark-nav-link:focus-visible {
outline: 1px solid var(--stark-accent-faded);
outline-offset: 8px;
}
/* Link with animated underline that grows from left on hover */
.stark-link {
color: var(--stark-text-secondary);
text-decoration: none;
position: relative;
transition: color var(--stark-transition-fast);
}
.stark-link::after {
content: '';
position: absolute;
bottom: -2px;
left: 0;
width: 0;
height: 0.5px;
background: var(--stark-accent);
transition: width var(--stark-transition-base);
}
.stark-link:hover {
color: var(--stark-accent);
}
.stark-link:hover::after {
width: 100%;
}
/* Barely perceptible gradient that creates subtle depth */
.stark-gradient-bg {
background: linear-gradient(
180deg,
var(--stark-bg-primary) 0%,
var(--stark-bg-alt) 50%,
var(--stark-bg-primary) 100%
);
}
/* Radial glow -- extremely subtle warmth behind content */
.stark-glow {
background: radial-gradient(
ellipse 60% 50% at 50% 40%,
var(--stark-accent-glow) 0%,
transparent 70%
);
}
/* Section divider gradient -- horizontal fade line */
.stark-divider {
height: 0.5px;
border: none;
background: linear-gradient(
90deg,
transparent 0%,
var(--stark-border-visible) 20%,
var(--stark-border-visible) 80%,
transparent 100%
);
margin: var(--stark-space-xl) auto;
max-width: 40%;
}
/* Section spacing for the breath-filled layout */
.stark-section {
padding: var(--stark-space-xl) var(--stark-space-md);
max-width: 1200px;
margin: 0 auto;
}
/* Hero section -- full viewport with bottom-weighted content */
.stark-hero {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: flex-end;
padding-bottom: var(--stark-space-xl);
padding-left: var(--stark-space-lg);
padding-right: var(--stark-space-lg);
}
/* Content block with breathing room */
.stark-content {
max-width: 36em;
margin-left: 10%;
padding: var(--stark-space-lg) 0;
}
/* Wide spacing between grid items */
.stark-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: var(--stark-space-lg);
padding: var(--stark-space-lg) 0;
}
/* Single-pixel border card */
.stark-bordered {
border: 0.5px solid var(--stark-border);
padding: var(--stark-space-lg);
transition: border-color var(--stark-transition-base);
}
.stark-bordered:hover {
border-color: var(--stark-border-visible);
}
/* Partial horizontal divider */
.stark-rule {
width: 40px;
height: 0.5px;
background: var(--stark-border-visible);
border: none;
margin: var(--stark-space-lg) 0;
}
/* Vertical thin line accent */
.stark-vertical-accent {
border-left: 0.5px solid var(--stark-accent-faded);
padding-left: var(--stark-space-md);
}
/* Resonant Stark button -- barely there until hovered */
.stark-button {
display: inline-block;
padding: 0.75rem 2.5rem;
font-family: inherit;
font-weight: 300;
font-size: 0.8rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--stark-text-secondary);
background: transparent;
border: 0.5px solid var(--stark-border-visible);
cursor: pointer;
transition:
color var(--stark-transition-fast),
border-color var(--stark-transition-base),
background var(--stark-transition-base),
letter-spacing var(--stark-transition-base);
}
.stark-button:hover {
color: var(--stark-accent);
border-color: var(--stark-accent);
background: var(--stark-accent-glow);
letter-spacing: 0.14em;
}
.stark-button:active {
background: var(--stark-accent-faded);
}
.stark-button:focus-visible {
outline: 1px solid var(--stark-accent-faded);
outline-offset: 4px;
}
/* Large numeral as decorative anchor */
.stark-stat-number {
font-weight: 100;
font-size: clamp(4rem, 10vw, 8rem);
line-height: 1;
color: var(--stark-text-primary);
letter-spacing: -0.03em;
opacity: 0.9;
}
.stark-stat-label {
font-weight: 300;
font-size: 0.75rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--stark-text-tertiary);
margin-top: var(--stark-space-xs);
}
/* Images blend into the whitespace rather than demanding attention */
.stark-image {
width: 100%;
display: block;
filter: grayscale(0.3) brightness(1.05) contrast(0.95);
opacity: 0.9;
transition:
filter var(--stark-transition-slow),
opacity var(--stark-transition-slow);
}
.stark-image:hover {
filter: grayscale(0) brightness(1) contrast(1);
opacity: 1;
}
/* Image with vast surrounding whitespace */
.stark-image-container {
padding: var(--stark-space-xl) var(--stark-space-lg);
max-width: 800px;
margin: 0 auto;
}
| Physical / Design Reference | Web Equivalent |
|---|---|
| Matte white museum wall | Near-white background (#FAFAFA) with no texture, gradient, or pattern; content floats on pure surface |
| Thin pencil line on paper | 0.5px borders in #E8E4E0 or #D4D0CC; barely visible structural lines that suggest rather than define |
| Natural linen or cotton | Warm off-white backgrounds (#F5F5F0) with optional subtle noise texture at 1-2% opacity |
| Japanese Ma (negative space) | Vast padding and margin (8-16rem between sections); whitespace as active design element |
| Gallery exhibition labels | Small uppercase text (0.75rem, 300 weight, 0.12em tracking) in tertiary gray for metadata and captions |
| Frosted glass panel | Background with backdrop-filter: blur(20px) and near-white semi-transparent fill for overlay elements |
| Hairline metal wire | Single-pixel accent lines in muted terracotta or sage; architectural rather than decorative |
| Warm halogen gallery light | Subtle radial gradient glow (radial-gradient) in faint accent color behind focal content |
| Pressed letterpress impression | Text in near-black (#1A1A18) at thin weight that feels subtly pressed into the white surface |
| Silk ribbon bookmark | Accent color (#C4836A) used as a single thin vertical or horizontal line marking a focal point |
When creating or sourcing imagery for a Resonant Stark styled site:
| Aesthetic | Relationship to Resonant Stark |
|---|---|
| Minimalism | Direct ancestor; Resonant Stark adds emotional warmth and micro-interaction to minimalism’s structural restraint |
| Flat Design | Shares rejection of ornamentation and skeuomorphism, but Resonant Stark uses depth through subtle shadow and animation rather than pure flatness |
| Japandi | Parallel philosophy combining Japanese Ma (negative space) with Scandinavian warmth; Resonant Stark is the digital expression |
| Swiss/International | Shares grid discipline and typographic focus, but Resonant Stark softens the rationalism with warm tones and organic animation |
| Wabi-sabi | Both find beauty in restraint and imperfection; Resonant Stark allows slight asymmetry and organic warmth within its precision |
| Kinfolk | Shares warm minimalist photography and generous whitespace, but Resonant Stark is more architecturally rigorous |
-webkit-font-smoothing: antialiased and -moz-osx-font-smoothing: grayscale to prevent thin type from appearing jagged. Test at multiple screen densities; thin fonts can vanish on low-DPI displays.prefers-reduced-motion – the scroll and hover animations are central to the aesthetic, but accessibility requires honoring motion preferences. All animations must have reduced-motion fallbacks that show content immediately.font-display: swap, preload critical fonts, and ensure 60fps transitions.<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Resonant Stark</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400&display=swap" rel="stylesheet">
<style>
:root {
--stark-bg-primary: #FAFAFA;
--stark-bg-alt: #F5F5F0;
--stark-bg-subtle: #F0EEEB;
--stark-bg-surface: #E8E4E0;
--stark-text-primary: #1A1A18;
--stark-text-secondary: #6A6864;
--stark-text-tertiary: #9A9894;
--stark-text-faint: #B8B4B0;
--stark-accent: #C4836A;
--stark-accent-hover: #B07058;
--stark-accent-faded: rgba(196, 131, 106, 0.12);
--stark-accent-glow: rgba(196, 131, 106, 0.06);
--stark-border: #E8E4E0;
--stark-border-visible: #D0CCC8;
--stark-shadow-subtle: rgba(26, 26, 24, 0.04);
--stark-transition-fast: 0.3s ease;
--stark-transition-base: 0.5s ease;
--stark-transition-slow: 0.8s ease;
--stark-space-xs: 0.5rem;
--stark-space-sm: 1rem;
--stark-space-md: 2rem;
--stark-space-lg: 4rem;
--stark-space-xl: 8rem;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: var(--stark-bg-primary);
color: var(--stark-text-secondary);
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
font-weight: 300;
font-size: 17px;
line-height: 1.8;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
overflow-x: hidden;
}
/* Navigation -- minimal, vast space */
nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--stark-space-md) var(--stark-space-lg);
max-width: 1400px;
margin: 0 auto;
}
.nav-logo {
font-weight: 200;
font-size: 0.85rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--stark-text-primary);
}
.nav-links {
display: flex;
gap: var(--stark-space-md);
list-style: none;
}
.nav-links a {
font-weight: 300;
font-size: 0.75rem;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--stark-text-tertiary);
text-decoration: none;
border: none;
transition:
letter-spacing var(--stark-transition-base),
color var(--stark-transition-fast);
}
.nav-links a:hover {
letter-spacing: 0.14em;
color: var(--stark-text-primary);
}
/* Hero -- full viewport, content at bottom */
.hero {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: flex-end;
padding: 0 var(--stark-space-lg) var(--stark-space-xl);
max-width: 1400px;
margin: 0 auto;
}
.hero h1 {
font-weight: 100;
font-size: clamp(3.5rem, 8vw, 7rem);
line-height: 1.08;
letter-spacing: -0.02em;
color: var(--stark-text-primary);
max-width: 12em;
margin-bottom: var(--stark-space-md);
}
.hero p {
font-weight: 300;
font-size: 1.1rem;
line-height: 1.9;
color: var(--stark-text-tertiary);
max-width: 30em;
margin-bottom: var(--stark-space-lg);
}
/* Divider -- partial width gradient line */
.divider {
height: 0.5px;
border: none;
background: linear-gradient(
90deg,
transparent 0%,
var(--stark-border-visible) 20%,
var(--stark-border-visible) 80%,
transparent 100%
);
max-width: 30%;
margin: var(--stark-space-xl) auto;
}
/* Section -- vast padding */
.section {
padding: var(--stark-space-xl) var(--stark-space-lg);
max-width: 1400px;
margin: 0 auto;
}
.section-label {
font-weight: 300;
font-size: 0.7rem;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--stark-text-faint);
margin-bottom: var(--stark-space-lg);
}
.section h2 {
font-weight: 200;
font-size: clamp(2rem, 4.5vw, 3.2rem);
line-height: 1.2;
letter-spacing: 0.02em;
color: var(--stark-text-primary);
max-width: 16em;
margin-bottom: var(--stark-space-md);
}
.section p {
font-weight: 300;
font-size: 1.0625rem;
line-height: 1.85;
color: var(--stark-text-secondary);
max-width: 36em;
}
/* Card grid */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: var(--stark-space-lg);
padding: var(--stark-space-lg) 0;
}
.card {
padding: var(--stark-space-lg);
border: 0.5px solid var(--stark-border);
opacity: 0.8;
transform: translateY(0);
transition:
opacity var(--stark-transition-base),
transform var(--stark-transition-base),
border-color var(--stark-transition-base);
}
.card:hover {
opacity: 1;
transform: translateY(-3px);
border-color: var(--stark-border-visible);
}
.card-number {
font-weight: 100;
font-size: 3.5rem;
line-height: 1;
color: var(--stark-text-faint);
margin-bottom: var(--stark-space-sm);
transition: color var(--stark-transition-base);
}
.card:hover .card-number {
color: var(--stark-accent);
}
.card h3 {
font-weight: 300;
font-size: 1.1rem;
letter-spacing: 0.02em;
color: var(--stark-text-primary);
margin-bottom: var(--stark-space-xs);
}
.card p {
font-size: 0.9rem;
line-height: 1.7;
color: var(--stark-text-tertiary);
max-width: none;
}
/* Feature section with offset layout */
.feature {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--stark-space-xl);
align-items: center;
padding: var(--stark-space-xl) 0;
}
.feature-text {
padding-right: var(--stark-space-lg);
}
.feature-visual {
aspect-ratio: 4 / 3;
background: linear-gradient(
135deg,
var(--stark-bg-alt) 0%,
var(--stark-bg-subtle) 100%
);
display: flex;
align-items: center;
justify-content: center;
}
.feature-visual span {
font-weight: 100;
font-size: 5rem;
color: var(--stark-text-faint);
opacity: 0.4;
}
/* Accent link */
.accent-link {
display: inline-block;
font-weight: 300;
font-size: 0.8rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--stark-accent);
text-decoration: none;
border: none;
position: relative;
margin-top: var(--stark-space-md);
transition: letter-spacing var(--stark-transition-base);
}
.accent-link::after {
content: '';
position: absolute;
bottom: -4px;
left: 0;
width: 0;
height: 0.5px;
background: var(--stark-accent);
transition: width var(--stark-transition-base);
}
.accent-link:hover {
letter-spacing: 0.14em;
}
.accent-link:hover::after {
width: 100%;
}
/* Footer -- minimal */
footer {
padding: var(--stark-space-xl) var(--stark-space-lg) var(--stark-space-lg);
max-width: 1400px;
margin: 0 auto;
display: flex;
justify-content: space-between;
align-items: flex-end;
border-top: 0.5px solid var(--stark-border);
}
footer p {
font-size: 0.75rem;
color: var(--stark-text-faint);
max-width: none;
}
/* Scroll reveal animations */
.reveal {
opacity: 0;
transform: translateY(24px);
transition:
opacity 0.8s ease,
transform 0.8s ease;
}
.reveal.is-visible {
opacity: 1;
transform: translateY(0);
}
.reveal-delay-1 { transition-delay: 0.1s; }
.reveal-delay-2 { transition-delay: 0.2s; }
.reveal-delay-3 { transition-delay: 0.3s; }
/* Subtle background gradient for sections */
.bg-gradient {
background: linear-gradient(
180deg,
var(--stark-bg-primary) 0%,
var(--stark-bg-alt) 50%,
var(--stark-bg-primary) 100%
);
}
/* Button */
.stark-button {
display: inline-block;
padding: 0.8rem 2.8rem;
font-family: inherit;
font-weight: 300;
font-size: 0.75rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--stark-text-secondary);
background: transparent;
border: 0.5px solid var(--stark-border-visible);
cursor: pointer;
text-decoration: none;
transition:
color var(--stark-transition-fast),
border-color var(--stark-transition-base),
background var(--stark-transition-base),
letter-spacing var(--stark-transition-base);
}
.stark-button:hover {
color: var(--stark-accent);
border-color: var(--stark-accent);
background: var(--stark-accent-glow);
letter-spacing: 0.14em;
}
/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
.reveal {
opacity: 1;
transform: none;
transition: none;
}
*, *::before, *::after {
transition-duration: 0.01ms !important;
animation-duration: 0.01ms !important;
}
}
/* Responsive */
@media (max-width: 768px) {
nav { padding: var(--stark-space-sm) var(--stark-space-md); }
.hero { padding: 0 var(--stark-space-md) var(--stark-space-lg); }
.section { padding: var(--stark-space-lg) var(--stark-space-md); }
.feature { grid-template-columns: 1fr; gap: var(--stark-space-lg); }
.feature-text { padding-right: 0; }
footer { flex-direction: column; gap: var(--stark-space-sm); align-items: flex-start; }
}
</style>
</head>
<body>
<nav>
<span class="nav-logo">Resonant</span>
<ul class="nav-links">
<li><a href="#work">Work</a></li>
<li><a href="#about">About</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
<section class="hero">
<h1 class="reveal">Clarity with feeling</h1>
<p class="reveal reveal-delay-1">Purpose-driven minimalism where every element earns its place. Warmth lives in the whitespace, emotion in the quiet transitions between stillness and response.</p>
<div class="reveal reveal-delay-2">
<a href="#work" class="accent-link">Explore</a>
</div>
</section>
<hr class="divider">
<section class="section" id="work">
<span class="section-label reveal">Selected Work</span>
<h2 class="reveal">Designed to resonate,<br>built to endure</h2>
<div class="card-grid">
<div class="card reveal">
<div class="card-number">01</div>
<h3>Spatial Awareness</h3>
<p>Understanding that what you remove matters more than what you add. Emptiness as the primary compositional tool.</p>
</div>
<div class="card reveal reveal-delay-1">
<div class="card-number">02</div>
<h3>Emotional Precision</h3>
<p>Micro-interactions that reward attention. A shift in opacity, an expanding letter, a color that appears only when you look.</p>
</div>
<div class="card reveal reveal-delay-2">
<div class="card-number">03</div>
<h3>Tonal Warmth</h3>
<p>Near-whites that lean cream rather than blue. Grays with warmth underneath. A palette that feels human despite its restraint.</p>
</div>
</div>
</section>
<section class="section bg-gradient">
<div class="feature">
<div class="feature-text reveal">
<span class="section-label">Approach</span>
<h2>Less, but with intention</h2>
<p>Every element is questioned. Does it serve purpose? Does it earn its space? The result is not absence but presence -- each remaining element amplified by the silence surrounding it.</p>
<a href="#" class="accent-link">Read more</a>
</div>
<div class="feature-visual reveal reveal-delay-1">
<span>—</span>
</div>
</div>
</section>
<hr class="divider">
<section class="section" id="about">
<span class="section-label reveal">About</span>
<h2 class="reveal">Stillness is not<br>the absence of life</h2>
<p class="reveal reveal-delay-1">Resonant Stark finds the space between austerity and emotion. It is the held breath before speaking, the pause that gives weight to what follows. Design that trusts silence.</p>
<div class="reveal reveal-delay-2" style="margin-top: var(--stark-space-lg);">
<a href="#contact" class="stark-button">Get in touch</a>
</div>
</section>
<footer>
<p>© 2026 Resonant Stark</p>
<p>Purpose-driven minimalism</p>
</footer>
<script>
// Scroll-triggered reveal animation
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add('is-visible');
observer.unobserve(entry.target);
}
});
},
{ threshold: 0.15, rootMargin: '0px 0px -40px 0px' }
);
document.querySelectorAll('.reveal').forEach((el) => {
observer.observe(el);
});
</script>
</body>
</html>