[object Object]

← 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

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 &amp; 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> &nbsp;/&nbsp; <a href="/#catalog">${esc(p.series)}</a> &nbsp;/&nbsp; ${esc(p.color||p.title)}</div>
+    <div class="crumbs"><a href="https://www.designerwallcoverings.com">Designer Wallcoverings</a> &nbsp;/&nbsp; <a href="/">Artmura</a> &nbsp;/&nbsp; <a href="/#catalog">${esc(p.series)}</a> &nbsp;/&nbsp; ${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 →