← back to Dw Yolo Loop
Artmura landing: re-skin as Designer Wallcoverings house brand (not vendor-branded)
702c6d2f9441f54c3abd2ee3a909debbbb1d3442 · 2026-06-12 11:29:16 -0700 · Steve Abrams
- Corner wordmark + nav + footer now = Designer Wallcoverings; Artmura demoted to a featured collection ('A Designer Wallcoverings Collection')
- Chrome driven from site.config.js house{} block + nav[] → /api/config; template stays reusable (build-line.js emits the same house block for any line)
- Stripped dead newwall.com product_url from API payload (zero vendor refs server-side)
- DW house font (Lora); rel=canonical → live DW search
- deploy-landing.sh reuses existing pm2 port (no nginx/certbot churn on redeploy)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Files touched
M artmura-site/build-line.jsM artmura-site/deploy-landing.shM artmura-site/public/index.htmlM artmura-site/public/product.htmlM artmura-site/public/styles.cssM artmura-site/server.jsM artmura-site/site.config.js
Diff
commit 702c6d2f9441f54c3abd2ee3a909debbbb1d3442
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Jun 12 11:29:16 2026 -0700
Artmura landing: re-skin as Designer Wallcoverings house brand (not vendor-branded)
- Corner wordmark + nav + footer now = Designer Wallcoverings; Artmura demoted to a featured collection ('A Designer Wallcoverings Collection')
- Chrome driven from site.config.js house{} block + nav[] → /api/config; template stays reusable (build-line.js emits the same house block for any line)
- Stripped dead newwall.com product_url from API payload (zero vendor refs server-side)
- DW house font (Lora); rel=canonical → live DW search
- deploy-landing.sh reuses existing pm2 port (no nginx/certbot churn on redeploy)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---
artmura-site/build-line.js | 20 +++++++++++---
artmura-site/deploy-landing.sh | 8 ++++--
artmura-site/public/index.html | 58 ++++++++++++++++++++++++++--------------
artmura-site/public/product.html | 15 ++++++-----
artmura-site/public/styles.css | 13 +++++----
artmura-site/server.js | 9 +++++--
artmura-site/site.config.js | 24 +++++++++++++----
7 files changed, 103 insertions(+), 44 deletions(-)
diff --git a/artmura-site/build-line.js b/artmura-site/build-line.js
index 89b296e..32afc2b 100644
--- a/artmura-site/build-line.js
+++ b/artmura-site/build-line.js
@@ -92,9 +92,23 @@ async function metafields(pid) {
console.log(` → lines/${slug}.json (${products.length}) lines/${slug}-handles.json`);
console.log(`\nPaste into site.config.js:\n`);
console.log(` ${slug}: {
- vendor: '${VENDOR}', title: '${VENDOR} — Designer Wallcoverings',
- wordmark: '${VENDOR}', kicker: 'Designer Wallcoverings', tagline: '${VENDOR} collection.',
- booksHeading: '${VENDOR}', metaDescription: '${VENDOR} wallcoverings at Designer Wallcoverings.',
+ // HOUSE brand — always Designer Wallcoverings (the property identity)
+ house: 'Designer Wallcoverings',
+ houseUrl: 'https://www.designerwallcoverings.com',
+ houseTagline: 'Designer Wallcoverings & Fabrics · To the Trade',
+ nav: [
+ { label: 'All Wallcoverings', href: 'https://www.designerwallcoverings.com/collections/all' },
+ { label: 'The Collection', href: '#catalog' },
+ { label: 'Trade', href: 'https://www.designerwallcoverings.com/pages/trade-program' },
+ { label: 'Shop ↗', href: 'https://www.designerwallcoverings.com/search?q=${encodeURIComponent(VENDOR)}' },
+ ],
+ // LINE being featured (a collection DW carries — NOT the property brand)
+ vendor: '${VENDOR}', line: '${VENDOR}',
+ title: '${VENDOR} Wallcoverings | Designer Wallcoverings',
+ wordmark: 'Designer Wallcoverings',
+ eyebrow: 'A Designer Wallcoverings Collection',
+ kicker: 'Designer Wallcoverings', tagline: 'The ${VENDOR} collection — curated by Designer Wallcoverings.',
+ booksHeading: '${VENDOR}', metaDescription: 'The ${VENDOR} collection at Designer Wallcoverings.',
dataFile: 'artmura-site/lines/${slug}.json',
colorsFile: 'artmura-site/lines/${slug}-colors.json', // optional: run extract_colors variant
imagePrefix: '', localImages: false, // uses Shopify CDN urls directly
diff --git a/artmura-site/deploy-landing.sh b/artmura-site/deploy-landing.sh
index 43452b5..fa9dd57 100755
--- a/artmura-site/deploy-landing.sh
+++ b/artmura-site/deploy-landing.sh
@@ -8,8 +8,12 @@ APP="/root/Projects/artmura-site"
DOMAIN="artmura.designerwallcoverings.com"
REPO="$(cd "$(dirname "$0")/.." && pwd)"
-echo "→ finding a free port on the host"
-PORT=$(ssh "$KAM" 'for p in 9931 9932 9933 9934 9935 9936 9937 9938 9939; do ss -ltn | grep -q ":$p " || { echo $p; break; }; done')
+echo "→ resolving port (reuse if already deployed, else pick a free one)"
+PORT=$(ssh "$KAM" '
+ cur=$(pm2 jlist 2>/dev/null | node -e "try{const a=JSON.parse(require(\"fs\").readFileSync(0));const p=a.find(x=>x.name===\"artmura-site\");process.stdout.write(String((p&&p.pm2_env&&p.pm2_env.env&&p.pm2_env.env.PORT)||\"\"))}catch(e){}" 2>/dev/null)
+ if [ -n "$cur" ]; then echo "$cur"; else
+ for p in 9931 9932 9933 9934 9935 9936 9937 9938 9939; do ss -ltn | grep -q ":$p " || { echo $p; break; }; done
+ fi')
[ -z "$PORT" ] && { echo "no free port found"; exit 1; }
echo " using port $PORT"
diff --git a/artmura-site/public/index.html b/artmura-site/public/index.html
index 3036845..1197c21 100644
--- a/artmura-site/public/index.html
+++ b/artmura-site/public/index.html
@@ -3,33 +3,30 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
-<title>Artmura — Italian Non-Woven Wallcoverings</title>
-<meta name="description" content="Artmura: architectural, hand-finished non-woven wallcoverings made in Italy. 161 designs across the Opera and La Scala Milano collections, sold by the yard.">
-<meta name="robots" content="noindex"><!-- staging preview: do not index until launch -->
+<title>Artmura Wallcoverings | Designer Wallcoverings</title>
+<meta name="description" content="The Artmura collection at Designer Wallcoverings — architectural, hand-finished Italian non-woven wallcoverings. 161 designs across Opera & La Scala Milano, sold by the yard, to the trade.">
<meta property="og:type" content="website">
-<meta property="og:title" content="Artmura — Italian Non-Woven Wallcoverings">
-<meta property="og:description" content="Architectural, hand-finished wallcoverings made in Italy.">
+<meta property="og:title" content="Artmura Wallcoverings | Designer Wallcoverings">
+<meta property="og:description" content="The Artmura collection, curated by Designer Wallcoverings.">
<meta name="theme-color" content="#f6f2ec">
+<link rel="canonical" href="https://www.designerwallcoverings.com/search?q=Artmura">
<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:ital,wght@0,400;0,500;0,600;1,400;1,500&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
+<link href="https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400;0,500;0,600;1,400;1,500&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/styles.css">
</head>
<body>
-<div class="corner ul on-hero" id="cUL"><span class="wordmark">Artmura<span class="dot">.</span></span></div>
-<nav class="corner ur on-hero" id="cUR">
- <a href="#collections">Collections</a>
- <a href="#catalog">Catalog</a>
- <a href="#" id="navTrade">Trade</a>
-</nav>
+<a class="corner ul on-hero wordmark" id="cUL" href="https://www.designerwallcoverings.com">Designer Wallcoverings</a>
+<nav class="corner ur on-hero" id="cUR"></nav>
<!-- HERO -->
<header class="hero" id="hero">
<div class="hero-inner">
- <div class="hero-kicker">Made in Italy · Non-Woven Wallcoverings</div>
- <h1>Artmura</h1>
- <div class="sub">Architectural surfaces, hand-finished.</div>
+ <div class="hero-eyebrow" id="heroEyebrow">A Designer Wallcoverings Collection</div>
+ <h1 id="heroH1">Artmura</h1>
+ <div class="sub" id="heroSub">Architectural surfaces, hand-finished — curated by Designer Wallcoverings.</div>
+ <div class="hero-kicker" id="heroKicker">Made in Italy · Non-Woven Wallcoverings</div>
</div>
<a class="enter" href="#catalog">Explore the Collection</a>
</header>
@@ -44,7 +41,7 @@
<!-- CONTROLS -->
<div class="controls" id="catalog">
<div class="controls-in">
- <a href="#" class="bar-wm">Artmura<span class="dot">.</span></a>
+ <a href="https://www.designerwallcoverings.com" class="bar-wm">Designer Wallcoverings</a>
<div class="count"><b id="cnt">—</b> wallcoverings</div>
<div class="ctl">
<label for="pattern">Pattern</label>
@@ -80,10 +77,11 @@
<footer>
<div class="foot-in">
<div>
- <div class="wm">Artmura<span style="color:var(--gold)">.</span></div>
- <div style="margin-top:8px">Italian non-woven wallcoverings · Residential grade</div>
+ <a class="wm" href="https://www.designerwallcoverings.com">Designer Wallcoverings</a>
+ <div style="margin-top:8px">Designer Wallcoverings & Fabrics · To the Trade</div>
+ <div style="margin-top:4px;opacity:.8">The Artmura Collection — one of 200+ lines we carry.</div>
</div>
- <div class="gate">Italian non-woven wallcoverings, sold by the yard. Order a sample before specifying.</div>
+ <div class="gate">Architectural Italian non-woven wallcoverings, sold by the yard at Designer Wallcoverings. Order a sample before specifying. <a href="https://www.designerwallcoverings.com" style="color:var(--gold)">designerwallcoverings.com →</a></div>
</div>
</footer>
@@ -184,10 +182,30 @@ function fillPatterns(facets){
// hide hero corners + show bar wordmark once scrolled into catalog
addEventListener('scroll',()=>{document.body.classList.toggle('scrolled',scrollY>innerHeight*0.82);});
+// render house chrome (wordmark + nav + hero text) from config → template stays line-agnostic
+function applyConfig(cfg){
+ if(cfg.house){ $('#cUL').textContent=cfg.house; if(cfg.houseUrl)$('#cUL').href=cfg.houseUrl; }
+ if(cfg.nav&&cfg.nav.length){
+ $('#cUR').innerHTML=cfg.nav.map(n=>{
+ const ext=/^https?:/.test(n.href);
+ return `<a href="${n.href}"${ext?' target="_blank" rel="noopener"':''}>${n.label}</a>`;
+ }).join('');
+ }
+ if(cfg.eyebrow) $('#heroEyebrow').textContent=cfg.eyebrow;
+ if(cfg.line) $('#heroH1').textContent=cfg.line;
+ if(cfg.tagline) $('#heroSub').textContent=cfg.tagline;
+ if(cfg.kicker) $('#heroKicker').textContent=cfg.kicker;
+ if(cfg.title) document.title=cfg.title;
+}
+
(async()=>{
const savedSort=localStorage.getItem(LS.sort); if(savedSort)$('#sort').value=savedSort;
const savedDens=localStorage.getItem(LS.dens)||'4'; $('#density').value=savedDens; applyDensity(savedDens);
- const [pd,fc]=await Promise.all([fetch('/api/products').then(r=>r.json()),fetch('/api/facets').then(r=>r.json())]);
+ const [cfg,pd,fc]=await Promise.all([
+ fetch('/api/config').then(r=>r.json()),
+ fetch('/api/products').then(r=>r.json()),
+ fetch('/api/facets').then(r=>r.json())]);
+ applyConfig(cfg);
ALL=pd.products; FACETS=fc; startHero(ALL); chips(fc); colorbar(fc); fillPatterns(fc); render();
})();
</script>
diff --git a/artmura-site/public/product.html b/artmura-site/public/product.html
index 6fda7dc..2322a36 100644
--- a/artmura-site/public/product.html
+++ b/artmura-site/public/product.html
@@ -3,18 +3,19 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
-<title>Artmura — Wallcovering</title>
+<title>Artmura Wallcovering | Designer Wallcoverings</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:ital,wght@0,400;0,500;0,600;1,400;1,500&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
+<link href="https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400;0,500;0,600;1,400;1,500&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/styles.css">
</head>
<body>
-<div class="corner ul"><a href="/" class="wordmark">Artmura<span class="dot">.</span></a></div>
+<a class="corner ul wordmark" href="https://www.designerwallcoverings.com">Designer Wallcoverings</a>
<nav class="corner ur">
- <a href="/#collections">Collections</a>
- <a href="/#catalog">Catalog</a>
+ <a href="/">The Collection</a>
+ <a href="https://www.designerwallcoverings.com/collections/all" target="_blank" rel="noopener">All Wallcoverings</a>
+ <a href="https://www.designerwallcoverings.com/pages/trade-program" target="_blank" rel="noopener">Trade</a>
</nav>
<main class="pdp" id="pdp"><div class="crumbs">Loading…</div></main>
@@ -31,12 +32,12 @@ function specRow(k,v){return v?`<div class="row"><span class="k">${k}</span><spa
const r=await fetch('/api/product/'+handle);
if(!r.ok){document.getElementById('pdp').innerHTML='<div class="crumbs"><a href="/">← Back</a></div><h1 style="font-family:var(--serif)">Not found</h1>';return;}
const p=await r.json();
- document.title=`${p.title} — Artmura`;
+ document.title=`${p.color||p.title} · Artmura | Designer Wallcoverings`;
const imgs=p.images.length?p.images:[p.swatch].filter(Boolean);
const main=imgs[0];
document.getElementById('pdp').innerHTML=`
- <div class="crumbs"><a href="/">Artmura</a> / <a href="/#catalog">${esc(p.series)}</a> / ${esc(p.color||p.title)}</div>
+ <div class="crumbs"><a href="https://www.designerwallcoverings.com">Designer Wallcoverings</a> / <a href="/">Artmura</a> / <a href="/#catalog">${esc(p.series)}</a> / ${esc(p.color||p.title)}</div>
<div class="pdp-top">
<div class="gallery">
<div class="main" id="main" style="background-image:url('${main}')"></div>
diff --git a/artmura-site/public/styles.css b/artmura-site/public/styles.css
index a280627..35e16ca 100644
--- a/artmura-site/public/styles.css
+++ b/artmura-site/public/styles.css
@@ -1,4 +1,5 @@
-/* Artmura — editorial Italian luxury. Warm neutrals, serif display, clean specs. */
+/* Designer Wallcoverings vendor-landing — editorial luxury house chrome over a featured line.
+ Warm neutrals, Lora serif display (DW house font), clean specs. */
:root{
--bg:#f6f2ec; /* warm cream */
--paper:#fffdf9;
@@ -10,7 +11,7 @@
--gold:#a98c54;
--cols:4;
--maxw:1320px;
- --serif:"Cormorant Garamond",Georgia,serif;
+ --serif:"Lora",Georgia,serif;
--sans:"Inter","Helvetica Neue",Arial,sans-serif;
}
*{box-sizing:border-box}
@@ -24,8 +25,8 @@ img{display:block;max-width:100%}
.corner{position:fixed;top:0;z-index:40;padding:22px 26px;display:flex;align-items:center;gap:18px}
.corner.ul{left:0}
.corner.ur{right:0;gap:22px}
-.wordmark{font-family:var(--serif);font-weight:600;letter-spacing:.34em;font-size:20px;
- text-transform:uppercase;color:var(--ink)}
+.wordmark{font-family:var(--serif);font-weight:600;letter-spacing:.2em;font-size:16px;
+ text-transform:uppercase;color:var(--ink);white-space:nowrap}
.on-hero .wordmark{text-shadow:0 1px 18px rgba(0,0,0,.55),0 0 2px rgba(0,0,0,.4)}
.on-hero.ur a{text-shadow:0 1px 14px rgba(0,0,0,.5)}
.wordmark .dot{color:var(--gold)}
@@ -48,7 +49,9 @@ img{display:block;max-width:100%}
linear-gradient(180deg, rgba(18,14,10,.64) 0%, rgba(18,14,10,.30) 30%, rgba(18,14,10,.26) 58%, rgba(18,14,10,.68) 100%)}
.hero-inner{position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;
align-items:center;justify-content:center;text-align:center;color:#fff;padding:0 24px}
-.hero-kicker{font-size:11px;letter-spacing:.42em;text-transform:uppercase;opacity:.86;margin-bottom:18px}
+.hero-eyebrow{font-size:11px;letter-spacing:.4em;text-transform:uppercase;opacity:.92;margin-bottom:20px;
+ padding-bottom:14px;border-bottom:1px solid rgba(255,255,255,.4)}
+.hero-kicker{font-size:10.5px;letter-spacing:.4em;text-transform:uppercase;opacity:.8;margin-top:18px}
.hero h1{font-family:var(--serif);font-weight:500;font-size:clamp(52px,9vw,118px);line-height:.96;
margin:0;letter-spacing:.02em;text-shadow:0 2px 30px rgba(0,0,0,.45)}
.hero .sub{font-family:var(--serif);font-style:italic;font-size:clamp(18px,2.4vw,27px);
diff --git a/artmura-site/server.js b/artmura-site/server.js
index 12d10b6..f99b5b1 100644
--- a/artmura-site/server.js
+++ b/artmura-site/server.js
@@ -62,7 +62,7 @@ function load() {
origin: r.origin,
sold_by: r.sold_by,
body_html: r.body_html,
- product_url: r.product_url,
+ // (vendor's own product_url intentionally NOT exposed — this landing links only to the DW store)
swatch: imgs[0] || null, // flat pattern swatch
room: imgs[1] || imgs[0] || null, // styled room shot when present
images: imgs,
@@ -75,7 +75,12 @@ load();
// --- API ---
app.get('/api/config', (_req, res) => res.json({
- vendor: CFG.vendor, wordmark: CFG.wordmark, kicker: CFG.kicker, tagline: CFG.tagline,
+ // house identity (Designer Wallcoverings) — drives the corner wordmark + nav + footer
+ house: CFG.house || CFG.vendor, houseUrl: CFG.houseUrl || CFG.storeBase,
+ houseTagline: CFG.houseTagline || '', nav: CFG.nav || [],
+ // featured line
+ vendor: CFG.vendor, line: CFG.line || CFG.vendor, wordmark: CFG.wordmark,
+ eyebrow: CFG.eyebrow || '', kicker: CFG.kicker, tagline: CFG.tagline,
booksHeading: CFG.booksHeading, title: CFG.title, metaDescription: CFG.metaDescription,
storeBase: CFG.storeBase, palette: CFG.palette,
}));
diff --git a/artmura-site/site.config.js b/artmura-site/site.config.js
index cf3b1b4..a4733c7 100644
--- a/artmura-site/site.config.js
+++ b/artmura-site/site.config.js
@@ -5,13 +5,27 @@
*/
module.exports = {
artmura: {
- vendor: 'Artmura',
- title: 'Artmura — Italian Non-Woven Wallcoverings',
- wordmark: 'Artmura',
+ // --- HOUSE brand (the property identity — always Designer Wallcoverings) ---
+ house: 'Designer Wallcoverings',
+ houseUrl: 'https://www.designerwallcoverings.com',
+ houseTagline: 'Designer Wallcoverings & Fabrics · To the Trade',
+ // top-right nav — all links point into the live DW store, never the vendor
+ nav: [
+ { label: 'All Wallcoverings', href: 'https://www.designerwallcoverings.com/collections/all' },
+ { label: 'The Collection', href: '#catalog' },
+ { label: 'Trade', href: 'https://www.designerwallcoverings.com/pages/trade-program' },
+ { label: 'Shop ↗', href: 'https://www.designerwallcoverings.com/search?q=Artmura' },
+ ],
+ // --- LINE being featured (a collection DW carries, not the property brand) ---
+ vendor: 'Artmura', // maker name (used in spec rows / schema brand)
+ line: 'Artmura', // collection name shown in the hero
+ title: 'Artmura Wallcoverings | Designer Wallcoverings',
+ wordmark: 'Designer Wallcoverings', // corner wordmark = HOUSE, not the line
+ eyebrow: 'A Designer Wallcoverings Collection',
kicker: 'Made in Italy · Non-Woven Wallcoverings',
- tagline: 'Architectural surfaces, hand-finished.',
+ tagline: 'Architectural surfaces, hand-finished — curated by Designer Wallcoverings.',
booksHeading: 'Opera & La Scala Milano',
- metaDescription: 'Artmura: architectural, hand-finished non-woven wallcoverings made in Italy. 161 designs across the Opera and La Scala Milano collections.',
+ metaDescription: 'The Artmura collection at Designer Wallcoverings — architectural, hand-finished Italian non-woven wallcoverings. 161 designs across Opera & La Scala Milano, sold by the yard, to the trade.',
dataFile: 'scripts/artmura-onboard/data/artmura.json',
colorsFile: 'scripts/artmura-onboard/data/artmura-colors.json',
imagePrefix: '.newwall-ref/artmura/images',
← 6d72771 Artmura deploy: auto-pick free port on Kamatera (:9920 taken
·
back to Dw Yolo Loop
·
Artmura landing: Shop links now land on the real /collection 700117a →