← back to Linenwallpaper
apply R1+R2+R4 hero standing rules — strip Loma Studio, lowercase serif wordmark below photo, add data-hero-mode huge default + four-square hydration
b827970a75a1c817c5fdd1d7873f5c783c0f701b · 2026-05-10 08:53:34 -0700 · Steve
Files touched
M public/index.htmlM server.jsM site.config.json
Diff
commit b827970a75a1c817c5fdd1d7873f5c783c0f701b
Author: Steve <steve@designerwallcoverings.com>
Date: Sun May 10 08:53:34 2026 -0700
apply R1+R2+R4 hero standing rules — strip Loma Studio, lowercase serif wordmark below photo, add data-hero-mode huge default + four-square hydration
---
public/index.html | 140 +++++++++++++++++++++++++++++++++++++++++++-----------
server.js | 2 +-
site.config.json | 2 +-
3 files changed, 114 insertions(+), 30 deletions(-)
diff --git a/public/index.html b/public/index.html
index 662240d..e71902c 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,6 +1,8 @@
<!doctype html>
-<html lang="en">
+<html lang="en" data-hero-mode="huge">
<head>
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg">
+
<meta charset="utf-8">
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-DKS5X482LQ"></script>
@@ -12,8 +14,8 @@
</script>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-<title>Loma Studio — Soft as linen. Made slowly.</title>
-<meta name="description" content="Loma Studio is a curated atelier dedicated entirely to linen. We do one thing — and we do it carefully.">
+<title>linenwallpaper — curated wallcoverings, real samples ship free.</title>
+<meta name="description" content="linenwallpaper — a curated wallcovering atelier. Free memo samples. Trade service.">
<meta name="theme-color" content="#F2EDE2">
<link rel="canonical" href="https://linenwallpaper.com/">
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;1,400&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
@@ -22,14 +24,14 @@
{
"@context": "https://schema.org",
"@type": "Organization",
- "name": "Loma Studio",
+ "name": "linenwallpaper",
"url": "https://linenwallpaper.com/",
"email": "info@linenwallpaper.com"
}
</script>
<script src="/zd-loader.js" defer></script>
<style>
-/* Loma Studio · Loewe template — soft cream paper + sienna accent, hand-craft restraint */
+/* linenwallpaper · Loewe template — soft cream paper + sienna accent, hand-craft restraint */
:root {
--bg: #F2EDE2;
--paper: #2C1F0F;
@@ -60,13 +62,25 @@ header { position:fixed; top:0; left:0; right:0; display:flex; justify-content:s
.h-link:hover { opacity:0.7 }
.h-icon { width:18px; height:18px; stroke:currentColor; fill:none; stroke-width:1.5 }
-/* ===== Cinema hero ===== */
-.cinema { position:relative; height:100vh; width:100%; overflow:hidden }
+/* ===== Cinema hero (R2: huge full-bleed photo + top-bar logo + below-photo wordmark) ===== */
+.cinema { position:relative; min-height:clamp(560px, 90vh, 1080px); width:100%; overflow:hidden }
.cinema-bg { position:absolute; inset:0; background-size:cover; background-position:center; background-image:url('/hero-bg.jpg') }
-.cinema-bg::after { content:""; position:absolute; inset:0; background:linear-gradient(180deg, rgba(0,0,0,0.35) 0%, rgba(0,0,0,0) 30%, rgba(0,0,0,0) 60%, rgba(0,0,0,0.75) 100%) }
+.cinema-bg::after { content:""; position:absolute; inset:0; background:linear-gradient(180deg, rgba(0,0,0,0.20) 0%, rgba(0,0,0,0) 35%, rgba(0,0,0,0) 65%, rgba(0,0,0,0.55) 100%) }
+/* Hero-mode hooks (R4): both modes share the same min-height — CLS-free */
+[data-hero-mode="four-square"] .cinema-bg { display:none }
+[data-hero-mode="four-square"] .cinema-grid { display:grid; grid-template-columns:1fr 1fr; grid-template-rows:1fr 1fr; position:absolute; inset:0 }
+[data-hero-mode="four-square"] .cinema-grid .cell { background-size:cover; background-position:center; border:1px solid rgba(0,0,0,0.4) }
+.cinema-grid { display:none }
+.cinema-logo { position:absolute; top:22px; left:32px; font-family: ui-serif, Georgia, serif; font-size:18px; font-weight:500; letter-spacing:0.02em; color:#fff; text-decoration:none; z-index:6; text-shadow:0 1px 4px rgba(0,0,0,0.5) }
+/* Below-photo wordmark (R2): brand display lives below the hero, not painted on it */
+.hero-wordmark-block { position:relative; padding:38px 32px 24px; text-align:center; background:var(--bg) }
+.hero-wordmark { font-family: ui-serif, Georgia, 'Cormorant Garamond', serif; font-weight:400; font-size:clamp(48px, 9vw, 128px); letter-spacing:-0.01em; line-height:1; color:var(--paper); margin:0; text-transform:none }
+.hero-wordmark-sub { display:block; font-family:'Playfair Display', Georgia, serif; font-style:italic; font-weight:400; font-size:clamp(13px, 1.4vw, 17px); letter-spacing:0.04em; text-transform:none; margin-top:14px; color:var(--muted) }
+@media (max-width:760px) { .hero-wordmark { font-size:clamp(32px, 12vw, 64px) } }
.corner-mark { position:absolute; top:24px; left:32px; font-size:11px; font-weight:700; letter-spacing:0.32em; text-transform:uppercase; color:#fff; text-shadow:0 1px 3px rgba(0,0,0,0.55), 0 0 1px rgba(0,0,0,0.4); z-index:5 }
.corner-mark::before { content:"◆ "; margin-right:6px }
-.center-mark { position:absolute; top:clamp(80px,12vh,140px); left:50%; transform:translateX(-50%); font-size:clamp(28px,4vw,56px); font-weight:500; letter-spacing:0.18em; text-transform:uppercase; text-align:center; color:#fff; text-shadow:0 2px 8px rgba(0,0,0,0.65), 0 0 1px rgba(0,0,0,0.5); z-index:5 }
+/* center-mark deprecated 2026-05-10 per R2 — hidden */
+.center-mark { display:none !important; position:absolute; top:clamp(80px,12vh,140px); left:50%; transform:translateX(-50%); font-size:clamp(28px,4vw,56px); font-weight:500; letter-spacing:0.18em; text-transform:uppercase; text-align:center; color:#fff; text-shadow:0 2px 8px rgba(0,0,0,0.65), 0 0 1px rgba(0,0,0,0.5); z-index:5 }
.center-mark .tm { font-size:14px; vertical-align:super; opacity:0.7; margin-left:0.2em }
.center-mark .sub { display:block; font-family:'Playfair Display', Georgia, serif; font-style:italic; font-weight:400; font-size:0.4em; letter-spacing:0.04em; text-transform:none; margin-top:14px; opacity:0.85 }
.meta-line { position:absolute; bottom:32px; left:32px; font-size:10px; letter-spacing:0.28em; text-transform:uppercase; font-weight:700; color:#fff; z-index:5; opacity:0.85 }
@@ -162,14 +176,14 @@ textarea:focus-visible,
<meta property="og:type" content="website">
<meta property="og:url" content="https://linenwallpaper.com/">
-<meta property="og:title" content="Linen Wallpaper">
-<meta property="og:description" content="Linen Wallpaper — Linen-textured wallcoverings — quiet, natural fiber.">
+<meta property="og:title" content="linenwallpaper — curated wallcoverings, real samples ship free.">
+<meta property="og:description" content="linenwallpaper — a curated wallcovering atelier. Free memo samples. Trade service.">
<meta property="og:image" content="https://linenwallpaper.com/hero-bg.jpg">
-<meta property="og:site_name" content="Linen Wallpaper">
+<meta property="og:site_name" content="linenwallpaper">
<meta property="article:publisher" content="https://www.facebook.com/SteveAbramsDesigns.DesignerWallcoverings">
<meta name="twitter:card" content="summary_large_image">
-<meta name="twitter:title" content="Linen Wallpaper">
-<meta name="twitter:description" content="Linen Wallpaper — Linen-textured wallcoverings — quiet, natural fiber.">
+<meta name="twitter:title" content="linenwallpaper — curated wallcoverings, real samples ship free.">
+<meta name="twitter:description" content="linenwallpaper — a curated wallcovering atelier. Free memo samples. Trade service.">
<meta name="twitter:image" content="https://linenwallpaper.com/hero-bg.jpg">
<!-- graphics-loop pass 13: footer + fb -->
</head>
@@ -335,24 +349,37 @@ textarea:focus-visible,
}
</style>
+<style id="ns-gold-kill">
+ /* novasuede: kill gold-solid fills, off-white instead. Edge color stays gold. */
+ .new-badge, .new-arrivals-pill,
+ .color-filter-btn.active, .drapery-btn,
+ .sample-btn-chip, .cb-cta {
+ background: #f5f1e8 !important;
+ color: #0a0a0a !important;
+ border-color: #f5f1e8 !important;
+ }
+ .new-badge:hover, .new-arrivals-pill:hover,
+ .color-filter-btn.active:hover, .drapery-btn:hover,
+ .sample-btn-chip:hover, .cb-cta:hover {
+ background: #fff !important;
+ color: #0a0a0a !important;
+ }
+ </style>
<header class="ns-header">
- <a href="#home" class="ns-brand" aria-label="Loma Studio home">
+ <a href="/" class="ns-brand" aria-label="Home">
<span class="ns-dot"></span>
- <span class="ns-name">Loma Studio</span>
+ <span class="ns-name">linenwallpaper</span>
</a>
<nav class="ns-nav" id="nsPrimaryNav" aria-label="Primary">
- <a href="#home">Home</a>
- <a href="#colors">Colors</a>
- <a href="#specifications">Specifications</a>
- <a href="fire-ratings.html">Fire Ratings</a>
- <a href="faq.html">FAQ</a>
- <a href="about.html">About</a>
+ <a href="/">Home</a>
+ <a href="/about">About</a>
<button type="button" onclick="nsContactOpen()">Contact</button>
</nav>
<button type="button" class="mobile-toggle" aria-label="Toggle menu" aria-controls="nsPrimaryNav" aria-expanded="false" onclick="nsToggleNav(this)">
<span></span><span></span><span></span>
</button>
</header>
+
<div class="ns-modal" id="nsContactModal" role="dialog" aria-modal="true" aria-labelledby="nsContactTitle" onclick="if(event.target===this)nsContactClose()">
<div class="ns-modal-card">
<button type="button" class="close-x" onclick="nsContactClose()" aria-label="Close">×</button>
@@ -361,7 +388,7 @@ textarea:focus-visible,
<div class="ns-actions">
<a class="ns-action" href="#contact" onclick="nsContactClose()"><span class="ico">📋</span><div class="txt"><b>Get a Quote</b><span>Project specs → priced estimate</span></div></a>
<a class="ns-action" href="#contact" onclick="nsContactClose();openModal();"><span class="ico">📦</span><div class="txt"><b>Order a Sample</b><span>Free swatch to your shop</span></div></a>
- <a class="ns-action" href="mailto:info@novasuede.com?subject=Novasuede%20inquiry"><span class="ico">✉️</span><div class="txt"><b>Email Us</b><span>info@novasuede.com · Designer Wallcoverings</span></div></a>
+ <a class="ns-action" href="mailto:info@linenwallpaper.com?subject=linenwallpaper%20inquiry"><span class="ico">✉️</span><div class="txt"><b>Email Us</b><span>info@linenwallpaper.com</span></div></a>
<a class="ns-action" href="tel:888-373-4564"><span class="ico">📞</span><div class="txt"><b>Call Us</b><span>(888) 373-4564 · M–F, 9–5 PT</span></div></a>
</div>
</div>
@@ -380,18 +407,31 @@ textarea:focus-visible,
+
+
+
+
+
+
+
+
<header>
<button class="h-link" onclick="dwmOpen('Contact')" aria-label="Contact"><svg class="h-icon" viewBox="0 0 24 24"><path d="M3 7h18M3 12h18M3 17h18"/></svg><span>Contact</span></button>
<button class="theme-toggle" id="theme-toggle" aria-label="Theme toggle">☾</button>
</header>
-<section class="cinema">
+<section class="cinema" id="hero">
+ <a class="cinema-logo" href="/" aria-label="linenwallpaper home">linenwallpaper</a>
<div class="cinema-bg" id="heroBg"></div>
+ <div class="cinema-grid" id="heroGrid" aria-hidden="true"></div>
<div class="corner-mark">Natural Fiber</div>
- <div class="center-mark">Linen Wallpaper</div>
<div class="meta-line">Linen · Natural · Woven<span class="num" id="heroNum"></span></div>
<a class="enter" href="#shop">Enter <svg viewBox="0 0 24 12" fill="none" stroke="currentColor" stroke-width="1.4"><path d="M0 6h22M16 1l6 5-6 5"/></svg></a>
</section>
+<div class="hero-wordmark-block">
+ <h1 class="hero-wordmark">linenwallpaper</h1>
+ <span class="hero-wordmark-sub" id="heroWordmarkSub"></span>
+</div>
<section class="section" id="ideas">
@@ -449,8 +489,8 @@ textarea:focus-visible,
<footer>
<div class="footer-grid">
<div>
- <div class="footer-brand">Linen Wallpaper</div>
- <p class="footer-text">Linen Wallpaper is a specialty linen archive within the Designer Wallcoverings family. Real samples ship free.</p>
+ <div class="footer-brand">linenwallpaper</div>
+ <p class="footer-text">linenwallpaper — real samples ship free.</p>
<p class="footer-text" style="margin-top:14px;font-size:11px;letter-spacing:0.18em;text-transform:uppercase;font-weight:600;color:var(--paper);opacity:0.7"><a href="/about" style="color:inherit;text-decoration:none;border-bottom:1px solid var(--accent)">About →</a></p>
</div>
<div class="footer-col">
@@ -466,7 +506,7 @@ textarea:focus-visible,
</div>
<!-- mini-constellation: every storefront shows its position in the family -->
<div class="footer-bottom">
- <span>linenwallpaper.com · Loma Studio</span>
+ <span>linenwallpaper.com · linenwallpaper</span>
<span><a href="mailto:info@linenwallpaper.com" style="color:var(--paper);text-decoration:none;border-bottom:1px solid var(--accent);padding-bottom:1px">info@linenwallpaper.com</a></span>
<span id="footerStat"></span>
</div>
@@ -792,6 +832,7 @@ loadGridPage();
function dwmOpen(name, opts){
document.getElementById('dwm' + name).classList.add('open');
document.body.style.overflow = 'hidden';
+ try { if (typeof gtag === 'function') gtag('event', 'modal_open', { modal_name: name, sku: (opts && opts.sku) || '' }); } catch(_){}
if (name === 'Sample' && opts) {
document.getElementById('dwmSamplePreview').style.display = 'flex';
document.getElementById('dwmSampleImg').src = opts.image_url || '';
@@ -822,6 +863,12 @@ loadGridPage();
const r = await fetch('/api/send-' + kind, { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(data) });
if (!r.ok) throw new Error('HTTP '+r.status);
const j = await r.json();
+ try {
+ if (typeof gtag === 'function') {
+ if (kind === 'sample') gtag('event', 'memo_request', { sku: data.sku || '', title: data.title || '' });
+ else gtag('event', 'lead', { form_type: kind });
+ }
+ } catch(_){}
status.textContent = kind === 'sample' ? 'Sample request sent — ships within 3–5 business days' : 'Inquiry sent — we respond within 1 business day';
status.className = 'dwm-status ok';
btn.textContent = 'Sent ✓';
@@ -941,5 +988,42 @@ loadGridPage();
})();
</script>
+<script>
+/* R4 — Alternating hero modes (huge / four-square). Server-side default is huge (HTML attr).
+ Client-only flip starts on visit 2. Both modes share the same .cinema min-height (CLS-free).
+ Crawlers without JS always see huge. */
+(function(){
+ try {
+ var k='dw-hero-mode';
+ var prev=parseInt(localStorage.getItem(k)||'0',10);
+ var next=(prev+1)%2;
+ localStorage.setItem(k,String(next));
+ if (prev>0) {
+ var mode = next===0 ? 'huge' : 'four-square';
+ document.documentElement.dataset.heroMode = mode;
+ if (mode === 'four-square') {
+ fetch('/api/products?limit=4&page=1').then(r=>r.ok?r.json():null).then(j=>{
+ if (!j || !j.items || j.items.length < 4) {
+ document.documentElement.dataset.heroMode = 'huge';
+ console.warn('dw-hero-stale: insufficient items for four-square, falling back to huge');
+ return;
+ }
+ var grid = document.getElementById('heroGrid');
+ if (!grid) return;
+ j.items.slice(0,4).forEach(function(it){
+ var d = document.createElement('div');
+ d.className = 'cell';
+ var img = (it.image_url || it.image || '/hero-bg.jpg');
+ d.style.backgroundImage = "url('" + img + "')";
+ grid.appendChild(d);
+ });
+ }).catch(function(){
+ document.documentElement.dataset.heroMode = 'huge';
+ });
+ }
+ }
+ } catch(e) { /* no-op: keep server default */ }
+})();
+</script>
</body>
</html>
diff --git a/server.js b/server.js
index 9382be5..8516d27 100644
--- a/server.js
+++ b/server.js
@@ -88,7 +88,7 @@ function sortProducts(list, mode) {
app.use(helmet({ contentSecurityPolicy: false }));
app.use(express.json({ limit: '256kb' }));
// Universal contact module — modals, /api/send-inquiry, /api/send-sample, /zd-loader.js
-require('./_universal-contact')(app, { siteName: "Linen Wallpaper", zdColor: "#a89060", zdPosition: 'right' });
+require('./_universal-contact')(app, { siteName: "linenwallpaper", zdColor: "#a89060", zdPosition: 'right' });
require('./_universal-auth')(app, { siteName: "linenwallpaper" });
app.use(express.static(path.join(__dirname, 'public')));
diff --git a/site.config.json b/site.config.json
index 20d8f10..b11dbfa 100644
--- a/site.config.json
+++ b/site.config.json
@@ -1,6 +1,6 @@
{
"slug": "linenwallpaper",
- "siteName": "Linen Wallpaper",
+ "siteName": "linenwallpaper",
"domain": "linenwallpaper.com",
"nicheKeyword": "linen",
"tagline": "Pure linen, woven texture, quiet rooms.",
← 6b7d7bb graphic-loop pass 13: real footer brand + Facebook link + OG
·
back to Linenwallpaper
·
sort-skill canonical: add light-dark/dark-light/wheel + help f16a1d4 →