Interior — Hero Landing
A warm, editorial hero for a fictional interior design studio: a full-bleed room photograph anchors a serif studio name and tagline, paired with a book-a-consultation call to action. A featured-projects strip lets visitors flip between rooms, swapping the backdrop and caption with a soft crossfade, while a thin awards line and a sticky top bar reinforce the calm, high-touch brand. Muted clay, walnut and sage tones with generous whitespace keep the focus on the space itself.
MCP
Code
:root {
--bg: #f6f2ec;
--paper: #fbf9f5;
--ink: #2c2620;
--ink-2: #5a5147;
--muted: #8a8175;
--clay: #b08968;
--clay-d: #8c6a4f;
--walnut: #5c4433;
--sage: #9caf88;
--line: rgba(44, 38, 32, 0.12);
--white: #fff;
--r-sm: 4px;
--r-md: 8px;
--r-lg: 14px;
--shadow: 0 18px 50px -24px rgba(44, 38, 32, 0.55);
}
* {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
margin: 0;
font-family: "Inter", system-ui, sans-serif;
font-size: 16px;
line-height: 1.5;
color: var(--ink);
background: var(--bg);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
h1,
h2 {
font-family: "Cormorant Garamond", Georgia, serif;
font-weight: 500;
margin: 0;
letter-spacing: 0.01em;
}
a {
color: inherit;
}
.skip-link {
position: absolute;
left: -999px;
top: 0;
background: var(--ink);
color: var(--paper);
padding: 10px 16px;
border-radius: var(--r-md);
z-index: 100;
}
.skip-link:focus {
left: 16px;
top: 16px;
}
:focus-visible {
outline: 2px solid var(--clay-d);
outline-offset: 3px;
border-radius: var(--r-sm);
}
/* ---------- Topbar ---------- */
.topbar {
position: fixed;
inset: 0 0 auto 0;
z-index: 50;
transition: background 0.35s ease, box-shadow 0.35s ease, border-color 0.35s ease;
border-bottom: 1px solid transparent;
}
.topbar__inner {
max-width: 1180px;
margin: 0 auto;
padding: 20px clamp(18px, 5vw, 48px);
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
transition: padding 0.35s ease;
}
.topbar.is-stuck {
background: rgba(251, 249, 245, 0.9);
backdrop-filter: blur(10px);
border-bottom-color: var(--line);
box-shadow: 0 8px 24px -20px rgba(44, 38, 32, 0.6);
}
.topbar.is-stuck .topbar__inner {
padding-top: 12px;
padding-bottom: 12px;
}
.topbar.is-stuck .wordmark,
.topbar.is-stuck .nav a {
color: var(--ink);
}
.wordmark {
display: inline-flex;
align-items: center;
gap: 12px;
text-decoration: none;
color: var(--paper);
transition: color 0.35s ease;
}
.wordmark__mark {
display: grid;
place-items: center;
width: 38px;
height: 38px;
border: 1px solid currentColor;
border-radius: 50%;
font-family: "Cormorant Garamond", serif;
font-size: 1rem;
letter-spacing: 0.02em;
}
.wordmark__name {
font-family: "Cormorant Garamond", serif;
font-size: 1.32rem;
letter-spacing: 0.04em;
}
.nav {
display: flex;
align-items: center;
gap: 8px;
}
.nav a {
color: var(--paper);
text-decoration: none;
font-size: 0.82rem;
font-weight: 500;
letter-spacing: 0.04em;
text-transform: uppercase;
padding: 8px 12px;
border-radius: var(--r-sm);
transition: color 0.2s ease, background 0.2s ease;
}
.nav a:not(.nav__cta):hover {
color: var(--clay);
}
.nav__cta {
border: 1px solid currentColor;
border-radius: 999px;
}
.nav__cta:hover {
background: var(--clay);
border-color: var(--clay);
color: var(--white) !important;
}
/* ---------- Hero ---------- */
.hero {
position: relative;
min-height: 100vh;
display: flex;
align-items: flex-end;
overflow: hidden;
padding: 140px clamp(18px, 5vw, 48px) clamp(40px, 7vh, 72px);
}
.hero__media {
position: absolute;
inset: 0;
background-size: cover;
background-position: center;
transform: scale(1.04);
transition: opacity 0.6s ease, transform 8s ease-out;
will-change: opacity, transform;
}
.hero__media.is-fading {
opacity: 0;
}
.hero__scrim {
position: absolute;
inset: 0;
background:
linear-gradient(180deg, rgba(28, 23, 18, 0.5) 0%, rgba(28, 23, 18, 0) 34%),
linear-gradient(0deg, rgba(28, 23, 18, 0.78) 0%, rgba(28, 23, 18, 0.15) 52%, rgba(28, 23, 18, 0) 78%);
}
.hero__content {
position: relative;
z-index: 2;
max-width: 1180px;
width: 100%;
margin: 0 auto;
color: var(--paper);
}
.eyebrow {
display: inline-flex;
align-items: center;
gap: 10px;
margin: 0 0 18px;
font-size: 0.76rem;
letter-spacing: 0.18em;
text-transform: uppercase;
font-weight: 600;
color: #efe7db;
}
.eyebrow__dot {
width: 7px;
height: 7px;
border-radius: 50%;
background: var(--sage);
box-shadow: 0 0 0 4px rgba(156, 175, 136, 0.28);
}
.hero__title {
font-size: clamp(2.7rem, 8vw, 5.4rem);
line-height: 1.02;
max-width: 14ch;
text-shadow: 0 2px 30px rgba(0, 0, 0, 0.28);
}
.hero__tagline {
margin: 22px 0 0;
max-width: 46ch;
font-size: clamp(1rem, 2.2vw, 1.16rem);
color: #eee6da;
line-height: 1.6;
}
.hero__actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 14px;
margin-top: 32px;
}
.btn {
display: inline-flex;
align-items: center;
gap: 8px;
font: inherit;
font-size: 0.9rem;
font-weight: 600;
letter-spacing: 0.02em;
padding: 14px 26px;
border-radius: 999px;
border: 1px solid transparent;
cursor: pointer;
text-decoration: none;
transition: transform 0.18s ease, background 0.2s ease, color 0.2s ease, box-shadow 0.2s ease;
}
.btn:active {
transform: translateY(1px) scale(0.99);
}
.btn--primary {
background: var(--clay);
color: var(--white);
box-shadow: 0 12px 28px -14px rgba(140, 106, 79, 0.9);
}
.btn--primary:hover {
background: var(--clay-d);
transform: translateY(-2px);
box-shadow: 0 18px 34px -16px rgba(140, 106, 79, 0.95);
}
.btn--ghost {
color: var(--paper);
border-color: rgba(251, 249, 245, 0.5);
}
.btn--ghost:hover {
border-color: var(--paper);
background: rgba(251, 249, 245, 0.1);
}
.hero__caption {
margin: 44px 0 0;
padding-top: 18px;
border-top: 1px solid rgba(251, 249, 245, 0.28);
max-width: 320px;
}
.hero__caption figcaption {
display: flex;
flex-direction: column;
gap: 3px;
}
.hero__caption-title {
font-family: "Cormorant Garamond", serif;
font-size: 1.4rem;
}
.hero__caption-meta {
font-size: 0.78rem;
letter-spacing: 0.06em;
text-transform: uppercase;
color: #d9cfbf;
}
/* ---------- Featured ---------- */
.featured {
max-width: 1180px;
margin: 0 auto;
padding: clamp(56px, 9vw, 96px) clamp(18px, 5vw, 48px);
}
.featured__head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 16px;
flex-wrap: wrap;
margin-bottom: 34px;
}
.section-title {
font-size: clamp(1.9rem, 4vw, 2.8rem);
color: var(--walnut);
}
.section-note {
margin: 0;
color: var(--muted);
font-size: 0.9rem;
}
.strip {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: clamp(14px, 2vw, 24px);
}
.card {
position: relative;
display: flex;
flex-direction: column;
gap: 0;
text-align: left;
padding: 0;
border: 1px solid var(--line);
border-radius: var(--r-lg);
background: var(--paper);
cursor: pointer;
overflow: hidden;
font: inherit;
color: var(--ink);
transition: transform 0.2s ease, box-shadow 0.25s ease, border-color 0.25s ease;
}
.card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow);
border-color: rgba(176, 137, 104, 0.5);
}
.card__thumb {
display: block;
aspect-ratio: 4 / 3;
background-image: var(--img);
background-size: cover;
background-position: center;
transition: transform 0.5s ease;
}
.card:hover .card__thumb {
transform: scale(1.05);
}
.card__body {
display: flex;
flex-direction: column;
gap: 4px;
padding: 16px 18px 20px;
}
.card__badge {
align-self: flex-start;
font-size: 0.66rem;
letter-spacing: 0.12em;
text-transform: uppercase;
font-weight: 700;
color: var(--clay-d);
background: rgba(176, 137, 104, 0.14);
padding: 4px 9px;
border-radius: 999px;
margin-bottom: 4px;
}
.card__title {
font-family: "Cormorant Garamond", serif;
font-size: 1.5rem;
color: var(--walnut);
line-height: 1.1;
}
.card__meta {
font-size: 0.78rem;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--muted);
}
.card::after {
content: "";
position: absolute;
left: 18px;
right: 18px;
bottom: 0;
height: 2px;
background: var(--clay);
transform: scaleX(0);
transform-origin: left;
transition: transform 0.3s ease;
}
.card[aria-selected="true"] {
border-color: var(--clay);
}
.card[aria-selected="true"]::after {
transform: scaleX(1);
}
.card[aria-selected="true"] .card__badge {
background: var(--sage);
color: var(--walnut);
}
/* ---------- Awards ---------- */
.awards {
border-top: 1px solid var(--line);
background: var(--paper);
}
.awards {
max-width: 100%;
}
.awards__title {
max-width: 1180px;
margin: 0 auto;
padding: clamp(48px, 7vw, 72px) clamp(18px, 5vw, 48px) 0;
}
.awards__line {
max-width: 1180px;
margin: 22px auto 0;
padding: 0 clamp(18px, 5vw, 48px) clamp(56px, 8vw, 88px);
list-style: none;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
gap: 0;
}
.awards__line li {
padding: 20px 24px 20px 0;
border-top: 1px solid var(--line);
font-size: 0.94rem;
color: var(--ink-2);
display: flex;
align-items: baseline;
gap: 12px;
}
.awards__year {
font-family: "Cormorant Garamond", serif;
font-size: 1.3rem;
color: var(--clay-d);
min-width: 3.2ch;
}
/* ---------- Toast ---------- */
.toast {
position: fixed;
left: 50%;
bottom: 28px;
transform: translate(-50%, 24px);
background: var(--ink);
color: var(--paper);
padding: 13px 22px;
border-radius: 999px;
font-size: 0.88rem;
font-weight: 500;
box-shadow: 0 18px 40px -16px rgba(0, 0, 0, 0.6);
opacity: 0;
pointer-events: none;
transition: opacity 0.3s ease, transform 0.3s ease;
z-index: 80;
max-width: calc(100vw - 40px);
text-align: center;
}
.toast.is-visible {
opacity: 1;
transform: translate(-50%, 0);
}
/* ---------- Responsive ---------- */
@media (max-width: 820px) {
.strip {
grid-template-columns: 1fr;
}
}
@media (max-width: 520px) {
.nav a:not(.nav__cta) {
display: none;
}
.wordmark__name {
font-size: 1.14rem;
}
.hero {
padding-top: 120px;
min-height: 92vh;
}
.hero__title {
font-size: clamp(2.3rem, 12vw, 3rem);
}
.hero__actions {
gap: 10px;
}
.btn {
padding: 13px 20px;
flex: 1 1 auto;
justify-content: center;
}
.hero__caption {
margin-top: 32px;
}
.featured__head {
margin-bottom: 24px;
}
.awards__line li {
padding-right: 0;
}
}
@media (prefers-reduced-motion: reduce) {
* {
scroll-behavior: auto !important;
transition-duration: 0.01ms !important;
}
.hero__media {
transform: none;
}
}(function () {
"use strict";
var heroMedia = document.getElementById("heroMedia");
var heroLocation = document.getElementById("heroLocation");
var heroTagline = document.getElementById("heroTagline");
var heroCaption = document.getElementById("heroCaption");
var strip = document.getElementById("strip");
var topbar = document.getElementById("topbar");
var toastEl = document.getElementById("toast");
var cards = Array.prototype.slice.call(strip.querySelectorAll(".card"));
var toastTimer;
function toast(msg) {
toastEl.textContent = msg;
toastEl.classList.add("is-visible");
clearTimeout(toastTimer);
toastTimer = setTimeout(function () {
toastEl.classList.remove("is-visible");
}, 2800);
}
/* Preload hero images so switching never flashes */
cards.forEach(function (card) {
var img = new Image();
img.src = card.getAttribute("data-img");
});
var current = -1;
function setHeroBackground(url) {
heroMedia.style.backgroundImage = "url('" + url + "')";
}
function selectProject(index, opts) {
opts = opts || {};
if (index === current) return;
var card = cards[index];
if (!card) return;
current = index;
/* Update tabs */
cards.forEach(function (c, i) {
var active = i === index;
c.setAttribute("aria-selected", active ? "true" : "false");
c.tabIndex = active ? 0 : -1;
});
/* Crossfade the hero backdrop */
var url = card.getAttribute("data-img");
var reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
if (opts.instant || reduce) {
setHeroBackground(url);
} else {
heroMedia.classList.add("is-fading");
setTimeout(function () {
setHeroBackground(url);
requestAnimationFrame(function () {
heroMedia.classList.remove("is-fading");
});
}, 300);
}
/* Swap copy */
heroLocation.textContent = card.getAttribute("data-location");
heroTagline.textContent = card.getAttribute("data-tagline");
heroCaption.querySelector(".hero__caption-title").textContent =
card.getAttribute("data-title");
heroCaption.querySelector(".hero__caption-meta").textContent =
card.getAttribute("data-meta");
if (opts.focus) card.focus();
}
/* Click + keyboard on the project strip (roving tabindex) */
cards.forEach(function (card, i) {
card.addEventListener("click", function () {
selectProject(i);
});
});
strip.addEventListener("keydown", function (e) {
var next = null;
if (e.key === "ArrowRight" || e.key === "ArrowDown") {
next = (current + 1) % cards.length;
} else if (e.key === "ArrowLeft" || e.key === "ArrowUp") {
next = (current - 1 + cards.length) % cards.length;
} else if (e.key === "Home") {
next = 0;
} else if (e.key === "End") {
next = cards.length - 1;
}
if (next !== null) {
e.preventDefault();
selectProject(next, { focus: true });
}
});
/* Book-a-consultation CTAs */
document.querySelectorAll("[data-book]").forEach(function (el) {
el.addEventListener("click", function (e) {
if (el.tagName === "A") e.preventDefault();
toast("Thank you — we'll email you within one business day to schedule your consultation.");
});
});
/* Sticky topbar reacts to scroll */
function onScroll() {
if (window.scrollY > 40) topbar.classList.add("is-stuck");
else topbar.classList.remove("is-stuck");
}
window.addEventListener("scroll", onScroll, { passive: true });
onScroll();
/* Init on first project */
selectProject(0, { instant: true });
})();<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Marrow & Oak — Interior Design Studio</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@400;500;600&family=Inter:wght@400;500;600;700;800&display=swap"
rel="stylesheet"
/>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<header class="topbar" id="topbar">
<div class="topbar__inner">
<a class="wordmark" href="#main" aria-label="Marrow and Oak, home">
<span class="wordmark__mark" aria-hidden="true">M&O</span>
<span class="wordmark__name">Marrow & Oak</span>
</a>
<nav class="nav" aria-label="Primary">
<a href="#projects">Projects</a>
<a href="#approach">Approach</a>
<a href="#awards">Studio</a>
<a class="nav__cta" href="#book" data-book>Book</a>
</nav>
</div>
</header>
<main id="main">
<section class="hero" aria-labelledby="hero-title">
<div class="hero__media" id="heroMedia" aria-hidden="true">
<div class="hero__scrim"></div>
</div>
<div class="hero__content">
<p class="eyebrow">
<span class="eyebrow__dot" aria-hidden="true"></span>
Interior design studio · <span id="heroLocation">Portland, Oregon</span>
</p>
<h1 class="hero__title" id="hero-title">Rooms that hold<br />a quiet kind of light</h1>
<p class="hero__tagline" id="heroTagline">
We shape warm, lived-in interiors — from first sketch to the last linen —
for people who want a home that ages beautifully.
</p>
<div class="hero__actions">
<button class="btn btn--primary" type="button" data-book>Book a consultation</button>
<a class="btn btn--ghost" href="#projects">View our work <span aria-hidden="true">→</span></a>
</div>
<figure class="hero__caption" id="heroCaption">
<figcaption>
<span class="hero__caption-title">Alder House</span>
<span class="hero__caption-meta">Living room · Restoration · 2025</span>
</figcaption>
</figure>
</div>
</section>
<section class="featured" id="projects" aria-labelledby="featured-title">
<div class="featured__head">
<h2 class="section-title" id="featured-title">Featured projects</h2>
<p class="section-note">Select a room to preview it above.</p>
</div>
<div class="strip" role="tablist" aria-label="Featured projects" id="strip">
<button class="card" role="tab" aria-selected="true" data-index="0"
data-location="Portland, Oregon"
data-title="Alder House"
data-meta="Living room · Restoration · 2025"
data-tagline="We shape warm, lived-in interiors — from first sketch to the last linen — for people who want a home that ages beautifully."
data-img="https://images.unsplash.com/photo-1618221195710-dd6b41faaea6?auto=format&fit=crop&w=1600&q=70">
<span class="card__thumb" style="--img:url('https://images.unsplash.com/photo-1618221195710-dd6b41faaea6?auto=format&fit=crop&w=600&q=60')"></span>
<span class="card__body">
<span class="card__badge">Restoration</span>
<span class="card__title">Alder House</span>
<span class="card__meta">Living room · 2025</span>
</span>
</button>
<button class="card" role="tab" aria-selected="false" tabindex="-1" data-index="1"
data-location="Hood River, Oregon"
data-title="Fern Cottage"
data-meta="Kitchen · New build · 2024"
data-tagline="A working kitchen built around slow mornings — warm oak, honed stone, and a window that follows the sun."
data-img="https://images.unsplash.com/photo-1556911220-bff31c812dba?auto=format&fit=crop&w=1600&q=70">
<span class="card__thumb" style="--img:url('https://images.unsplash.com/photo-1556911220-bff31c812dba?auto=format&fit=crop&w=600&q=60')"></span>
<span class="card__body">
<span class="card__badge">New build</span>
<span class="card__title">Fern Cottage</span>
<span class="card__meta">Kitchen · 2024</span>
</span>
</button>
<button class="card" role="tab" aria-selected="false" tabindex="-1" data-index="2"
data-location="Astoria, Oregon"
data-title="Marsh Loft"
data-meta="Bedroom · Full renovation · 2025"
data-tagline="A restful loft under the eaves — soft plaster, sage linens, and morning light off the river."
data-img="https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?auto=format&fit=crop&w=1600&q=70">
<span class="card__thumb" style="--img:url('https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?auto=format&fit=crop&w=600&q=60')"></span>
<span class="card__body">
<span class="card__badge">Renovation</span>
<span class="card__title">Marsh Loft</span>
<span class="card__meta">Bedroom · 2025</span>
</span>
</button>
</div>
</section>
<section class="awards" id="awards" aria-labelledby="awards-title">
<h2 class="section-title awards__title" id="awards-title">Recognition</h2>
<ul class="awards__line" aria-label="Awards and press">
<li><span class="awards__year">2025</span> Dwelling Journal · Studio of the Year</li>
<li><span class="awards__year">2024</span> Interior Guild · Best Restoration</li>
<li><span class="awards__year">2024</span> North Home Awards · Finalist</li>
<li><span class="awards__year">2023</span> Cedar Prize · Emerging Practice</li>
</ul>
</section>
</main>
<div class="toast" id="toast" role="status" aria-live="polite"></div>
<script src="script.js"></script>
</body>
</html>A full-bleed hero landing for Marrow & Oak, a fictional interior design studio. A room photograph fills the viewport behind a soft vertical scrim, over which sit a Cormorant Garamond studio name, a one-line tagline, and a primary “Book a consultation” button alongside a quieter “View our work” link. A sticky top bar carries the wordmark and a compact nav that condenses on scroll.
Below the fold copy, a featured-projects strip presents three signature rooms as selectable thumbnails. Choosing one crossfades the hero backdrop, updates the eyebrow location and the caption, and animates an active underline — all without leaving the page. Keyboard arrows move between projects, and a thin awards line credits fictional honors from design publications.
Interactions are vanilla JS: a toast() helper confirms the consultation request, the project switcher preloads images to avoid flashes, and the sticky bar reacts to scroll position. Everything is responsive down to ~360px, honors reduced-motion preferences, and keeps AA contrast against the imagery via the scrim.