← back to Dw Fleet Registry
live-data boards: scrape theme tokens from served CSS + embed real hero photos (download same-origin so Figma capture serializes them); validate hero URLs vs 404s
41cdb66eb28b41509c67e8391dd1d0a7f1869fbc · 2026-06-01 12:59:37 -0700 · Steve Abrams
Files touched
M .gitignoreM brand/asseeninhotels.htmlM brand/bleachfriendly.htmlM brand/build-themes.mjsA brand/corkwallcovering.htmlM brand/etciemurals.htmlA brand/grassclothwallpaper.htmlA brand/linenwallpaper.htmlA brand/silkwallpaper.html
Diff
commit 41cdb66eb28b41509c67e8391dd1d0a7f1869fbc
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Mon Jun 1 12:59:37 2026 -0700
live-data boards: scrape theme tokens from served CSS + embed real hero photos (download same-origin so Figma capture serializes them); validate hero URLs vs 404s
---
.gitignore | 1 +
brand/asseeninhotels.html | 7 ++--
brand/bleachfriendly.html | 7 ++--
brand/build-themes.mjs | 81 +++++++++++++++++++++++++++++++++++++-----
brand/corkwallcovering.html | 62 ++++++++++++++++++++++++++++++++
brand/etciemurals.html | 7 ++--
brand/grassclothwallpaper.html | 62 ++++++++++++++++++++++++++++++++
brand/linenwallpaper.html | 62 ++++++++++++++++++++++++++++++++
brand/silkwallpaper.html | 62 ++++++++++++++++++++++++++++++++
9 files changed, 334 insertions(+), 17 deletions(-)
diff --git a/.gitignore b/.gitignore
index 1924158..58de67d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@ tmp/
dist/
build/
.next/
+brand/heroes/
diff --git a/brand/asseeninhotels.html b/brand/asseeninhotels.html
index c7df84e..49efc47 100644
--- a/brand/asseeninhotels.html
+++ b/brand/asseeninhotels.html
@@ -4,7 +4,7 @@
<link href="https://fonts.googleapis.com/css2?family=Bodoni+Moda:ital,opsz,wght@0,6..96,400;0,6..96,500;1,6..96,400&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
<script src="https://mcp.figma.com/mcp/html-to-design/capture.js" async></script>
<style>
-:root{--ink:#f2ecd8;--bg:#0d0b06;--paper:#0d0b06;--accent:#b08923;--accent-deep:#7f6319;--rule:#d8caa0;
+:root{--ink:#f2ecd8;--bg:#f7f3e8;--paper:#f7f3e8;--accent:#b08923;--accent-deep:#7f6319;--rule:#d8caa0;
--serif:'Bodoni Moda',Didot,'Times New Roman',serif;--sans:'Inter',system-ui,sans-serif;--muted:rgba(255,255,255,.45)}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-smoothing:antialiased}
@@ -40,6 +40,7 @@ body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-
<div class="mono">DW</div>
<h1 class="wordmark">As Seen In<br><span class="thin">Hotels</span></h1>
<p class="tagline">Wallcoverings seen in the world's finest hotels.</p><div class="hairline"></div></section>
+
<div class="row">
<div class="panel"><div class="eyebrow">Type Scale · Bodoni Moda</div>
<div class="tr"><span class="tt">Display</span><span class="d">Aa</span><span class="cap">Bodoni Moda</span></div>
@@ -52,10 +53,10 @@ body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-
<div class="s"><div class="c" style="background:#f2ecd8"></div><div class="m"><div class="n">Ink</div><div class="x">#F2ECD8</div></div></div>
<div class="s"><div class="c" style="background:#b08923"></div><div class="m"><div class="n">Accent</div><div class="x">#B08923</div></div></div>
<div class="s"><div class="c" style="background:#7f6319"></div><div class="m"><div class="n">Accent deep</div><div class="x">#7F6319</div></div></div>
-<div class="s"><div class="c" style="background:#0d0b06"></div><div class="m"><div class="n">Ground</div><div class="x">#0D0B06</div></div></div>
+<div class="s"><div class="c" style="background:#f7f3e8"></div><div class="m"><div class="n">Ground</div><div class="x">#F7F3E8</div></div></div>
<div class="s"><div class="c" style="background:#f7f3e8"></div><div class="m"><div class="n">Light</div><div class="x">#F7F3E8</div></div></div>
<div class="s"><div class="c" style="background:#f6c031"></div><div class="m"><div class="n">Accent tint</div><div class="x">#F6C031</div></div></div>
</div></div></div>
-<div class="strip"><div class="tile" style="background:#f2ecd8;color:#0d0b06">hospitality</div><div class="tile" style="background:#b08923;color:#0d0b06">hotel</div><div class="tile" style="background:#7f6319;color:#0d0b06">contract</div><div class="tile" style="background:#584512;color:#0d0b06">commercial</div></div>
+<div class="strip"><div class="tile" style="background:#f2ecd8;color:#f7f3e8">hospitality</div><div class="tile" style="background:#b08923;color:#f7f3e8">hotel</div><div class="tile" style="background:#7f6319;color:#f7f3e8">contract</div><div class="tile" style="background:#584512;color:#f7f3e8">commercial</div></div>
<div class="ft"><div class="l">As Seen In Hotels</div><div class="r">DW hybrid brand · shared skeleton · per-site theme from style guide · gilt/bodoni</div></div>
</div></body></html>
\ No newline at end of file
diff --git a/brand/bleachfriendly.html b/brand/bleachfriendly.html
index 747f01a..2d8ae57 100644
--- a/brand/bleachfriendly.html
+++ b/brand/bleachfriendly.html
@@ -4,7 +4,7 @@
<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">
<script src="https://mcp.figma.com/mcp/html-to-design/capture.js" async></script>
<style>
-:root{--ink:#e6eef0;--bg:#0a1113;--paper:#0a1113;--accent:#2a7d8a;--accent-deep:#1e5a63;--rule:#bdcdd0;
+:root{--ink:#e6eef0;--bg:#f0f4f5;--paper:#f0f4f5;--accent:#2a7d8a;--accent-deep:#1e5a63;--rule:#bdcdd0;
--serif:'Cormorant Garamond',Georgia,serif;--sans:'Inter',system-ui,sans-serif;--muted:rgba(255,255,255,.45)}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-smoothing:antialiased}
@@ -40,6 +40,7 @@ body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-
<div class="mono">DW</div>
<h1 class="wordmark">Bleach<br><span class="thin">Friendly</span></h1>
<p class="tagline">Bleach-cleanable performance wallcoverings.</p><div class="hairline"></div></section>
+
<div class="row">
<div class="panel"><div class="eyebrow">Type Scale · Cormorant Garamond</div>
<div class="tr"><span class="tt">Display</span><span class="d">Aa</span><span class="cap">Cormorant Garamond</span></div>
@@ -52,10 +53,10 @@ body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-
<div class="s"><div class="c" style="background:#e6eef0"></div><div class="m"><div class="n">Ink</div><div class="x">#E6EEF0</div></div></div>
<div class="s"><div class="c" style="background:#2a7d8a"></div><div class="m"><div class="n">Accent</div><div class="x">#2A7D8A</div></div></div>
<div class="s"><div class="c" style="background:#1e5a63"></div><div class="m"><div class="n">Accent deep</div><div class="x">#1E5A63</div></div></div>
-<div class="s"><div class="c" style="background:#0a1113"></div><div class="m"><div class="n">Ground</div><div class="x">#0A1113</div></div></div>
+<div class="s"><div class="c" style="background:#f0f4f5"></div><div class="m"><div class="n">Ground</div><div class="x">#F0F4F5</div></div></div>
<div class="s"><div class="c" style="background:#f0f4f5"></div><div class="m"><div class="n">Light</div><div class="x">#F0F4F5</div></div></div>
<div class="s"><div class="c" style="background:#3bafc1"></div><div class="m"><div class="n">Accent tint</div><div class="x">#3BAFC1</div></div></div>
</div></div></div>
-<div class="strip"><div class="tile" style="background:#e6eef0;color:#0a1113">vinyl</div><div class="tile" style="background:#2a7d8a;color:#0a1113">upholstery</div><div class="tile" style="background:#1e5a63;color:#0a1113">contract</div><div class="tile" style="background:#153f45;color:#0a1113">commercial</div><div class="tile" style="background:#f0f4f5;color:#e6eef0">performance</div></div>
+<div class="strip"><div class="tile" style="background:#e6eef0;color:#0a1113">vinyl</div><div class="tile" style="background:#2a7d8a;color:#e6eef0">upholstery</div><div class="tile" style="background:#1e5a63;color:#e6eef0">contract</div><div class="tile" style="background:#153f45;color:#e6eef0">commercial</div><div class="tile" style="background:#f0f4f5;color:#0a1113">performance</div></div>
<div class="ft"><div class="l">Bleach Friendly</div><div class="r">DW hybrid brand · shared skeleton · per-site theme from style guide · coastal/cormorant</div></div>
</div></body></html>
\ No newline at end of file
diff --git a/brand/build-themes.mjs b/brand/build-themes.mjs
index 9b556e4..7192f78 100644
--- a/brand/build-themes.mjs
+++ b/brand/build-themes.mjs
@@ -11,8 +11,18 @@ import path from 'node:path';
const SITES_DIR = path.join(os.homedir(), 'Projects', 'dw-domain-fleet', 'sites');
const OUT = path.dirname(new URL(import.meta.url).pathname);
-// 3 deliberately distinct style guides (palette + font spread).
-const CHOSEN = ['asseeninhotels', 'bleachfriendly', 'etciemurals'];
+// 3 distinct materials that have REAL hero imagery live (manifest sites have none).
+const CHOSEN = ['silkwallpaper', 'corkwallcovering', 'linenwallpaper'];
+const PROJECTS = path.join(os.homedir(), 'Projects');
+
+// Resolve a site's config from manifest JSON, else local site.config.json, else a stub.
+function resolveSite(slug) {
+ const mf = path.join(SITES_DIR, slug + '.json');
+ if (fs.existsSync(mf)) return JSON.parse(fs.readFileSync(mf, 'utf8'));
+ const lc = path.join(PROJECTS, slug, 'site.config.json');
+ if (fs.existsSync(lc)) return JSON.parse(fs.readFileSync(lc, 'utf8'));
+ return { slug, domain: slug + '.com', siteName: slug };
+}
const FONT_FAMILY = {
cormorant: { name: 'Cormorant Garamond', css: "'Cormorant Garamond',Georgia,serif", g: 'Cormorant+Garamond:ital,wght@0,400;0,500;0,600;1,400' },
@@ -31,7 +41,46 @@ function darken(hex, amt = 0.32) {
}
const esc = s => String(s || '').replace(/&/g, '&').replace(/</g, '<');
-function board(site) {
+const LIVE = process.argv.includes('--live');
+
+// Fetch a site live and pull (a) theme tokens straight from its served CSS, and
+// (b) its real hero image (og:image) — so the board reflects the LIVE site, not a snapshot.
+async function fetchLive(domain) {
+ const out = { cssVars: {}, hero: null };
+ try {
+ const ctrl = new AbortController();
+ const t = setTimeout(() => ctrl.abort(), 7000);
+ const r = await fetch('https://' + domain + '/', { signal: ctrl.signal, headers: { 'User-Agent': 'dw-brand-build/1.0' } });
+ clearTimeout(t);
+ const html = (await r.text()).slice(0, 120000);
+ const nearWB = hex => { const h = hex.replace('#', ''); const f = h.length === 3 ? h.split('').map(c => c + c).join('') : h; if (f.length !== 6) return false; const n = parseInt(f, 16), r = n >> 16 & 255, g = n >> 8 & 255, b = n & 255; const mx = Math.max(r, g, b), mn = Math.min(r, g, b); return (mx > 238 && mn > 238) || (mx < 26); };
+ for (const v of ['accent', 'bg', 'ink', 'bgLight', 'rule']) {
+ // grab ALL definitions; for `accent` skip near-white/near-black (those are text/bg vars, not the brand accent)
+ const re = new RegExp('--' + v + '\\s*:\\s*(#[0-9a-fA-F]{3,8}|rgb[^;]+)', 'ig');
+ let m, picked = null;
+ while ((m = re.exec(html))) { const val = m[1].trim(); if (v === 'accent' && val.startsWith('#') && nearWB(val)) continue; picked = val; if (v === 'accent') break; }
+ if (picked) out.cssVars[v] = picked;
+ }
+ const og = html.match(/<meta[^>]+property=["']og:image["'][^>]+content=["']([^"']+)["']/i)
+ || html.match(/<meta[^>]+content=["']([^"']+)["'][^>]+property=["']og:image["']/i);
+ if (og) out.hero = og[1];
+ else { const img = html.match(/<img[^>]+src=["']([^"']+\.(?:jpg|jpeg|png|webp|avif)[^"']*)["']/i); if (img) out.hero = img[1]; }
+ if (out.hero && out.hero.startsWith('/')) out.hero = 'https://' + domain + out.hero;
+ // validate the hero actually returns a real image (sites often point og:image at a 404)
+ if (out.hero) {
+ try {
+ const ic = new AbortController(); const it = setTimeout(() => ic.abort(), 6000);
+ const ir = await fetch(out.hero, { signal: ic.signal, headers: { 'User-Agent': 'dw-brand-build/1.0' } });
+ clearTimeout(it);
+ const ct = ir.headers.get('content-type') || '';
+ if (!ir.ok || !/^image\//i.test(ct)) out.hero = null;
+ } catch { out.hero = null; }
+ }
+ } catch { /* offline — fall back to manifest */ }
+ return out;
+}
+
+function board(site, heroImage) {
const t = site.theme || {};
const font = FONT_FAMILY[t.font] || FONT_FAMILY.cormorant;
const ink = t.ink || '#f0ede6', bg = t.bg || '#0e0e0c', accent = t.accent || '#a8884a';
@@ -89,6 +138,7 @@ body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-
<div class="mono">DW</div>
<h1 class="wordmark">${esc(wTop)}${wBot ? `<br><span class="thin">${esc(wBot)}</span>` : ''}</h1>
<p class="tagline">${esc(tagline)}</p><div class="hairline"></div></section>
+${heroImage ? `<div style="position:relative;border-bottom:1px solid var(--rule);background:#0a0a0a"><img src="${heroImage}" alt="" style="display:block;width:100%;height:320px;object-fit:cover"><div style="position:absolute;left:110px;bottom:18px;font-size:10px;letter-spacing:.28em;text-transform:uppercase;color:#fff;background:rgba(0,0,0,.5);padding:5px 12px;border-radius:3px;font-family:var(--sans)">Live hero · ${esc(site.domain || site.slug)}</div></div>` : ''}
<div class="row">
<div class="panel"><div class="eyebrow">Type Scale · ${esc(font.name)}</div>
<div class="tr"><span class="tt">Display</span><span class="d">Aa</span><span class="cap">${esc(font.name)}</span></div>
@@ -116,10 +166,25 @@ body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-
}
for (const slug of CHOSEN) {
- const file = path.join(SITES_DIR, slug + '.json');
- if (!fs.existsSync(file)) { console.error('skip (no manifest):', slug); continue; }
- const site = JSON.parse(fs.readFileSync(file, 'utf8'));
- const html = board(site);
+ const site = resolveSite(slug);
+ let hero = null, srcNote = 'config snapshot';
+ if (LIVE) {
+ const live = await fetchLive(site.domain || slug);
+ // download the live hero same-origin (the Figma capture can't pull cross-origin images)
+ if (live.hero) {
+ try {
+ const r = await fetch(live.hero, { headers: { 'User-Agent': 'dw-brand-build/1.0' } });
+ const buf = Buffer.from(await r.arrayBuffer());
+ const ext = (live.hero.match(/\.(jpg|jpeg|png|webp|avif)/i)?.[1] || 'jpg').toLowerCase();
+ fs.mkdirSync(path.join(OUT, 'heroes'), { recursive: true });
+ fs.writeFileSync(path.join(OUT, 'heroes', slug + '.' + ext), buf);
+ hero = 'heroes/' + slug + '.' + ext;
+ } catch { hero = null; }
+ }
+ // override theme tokens with whatever the LIVE site actually serves
+ if (Object.keys(live.cssVars).length) { site.theme = { ...(site.theme || {}), ...live.cssVars }; srcNote = 'LIVE css: ' + Object.keys(live.cssVars).join(','); }
+ }
+ const html = board(site, hero);
fs.writeFileSync(path.join(OUT, slug + '.html'), html);
- console.log(`wrote ${slug}.html (accent ${site.theme?.accent}, font ${site.theme?.font})`);
+ console.log(`wrote ${slug}.html (accent ${site.theme?.accent}, font ${site.theme?.font}) — ${srcNote}${hero ? ' · hero✓' : (LIVE ? ' · no hero' : '')}`);
}
diff --git a/brand/corkwallcovering.html b/brand/corkwallcovering.html
new file mode 100644
index 0000000..d511da4
--- /dev/null
+++ b/brand/corkwallcovering.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8">
+<title>Cork Wallcovering — brand board</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&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
+<script src="https://mcp.figma.com/mcp/html-to-design/capture.js" async></script>
+<style>
+:root{--ink:#f0ede6;--bg:#1a1410;--paper:#1a1410;--accent:#FF4F00;--accent-deep:#b83900;--rule:rgba(255,255,255,.12);
+--serif:'Cormorant Garamond',Georgia,serif;--sans:'Inter',system-ui,sans-serif;--muted:rgba(255,255,255,.45)}
+*{box-sizing:border-box;margin:0;padding:0}
+body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-smoothing:antialiased}
+.board{width:1456px;margin:0 auto;background:var(--bg)}
+.hero{padding:92px 110px 78px;border-bottom:1px solid var(--rule);position:relative}
+.mono{font-family:var(--serif);font-weight:500;font-size:28px;letter-spacing:.2em;color:var(--accent);margin-bottom:48px;text-transform:uppercase}
+.wordmark{font-family:var(--serif);font-weight:500;font-size:88px;line-height:1.0;letter-spacing:.03em;text-transform:uppercase}
+.wordmark .thin{font-weight:400;color:var(--accent)}
+.tagline{font-family:var(--serif);font-style:italic;font-size:28px;color:var(--muted);margin-top:24px}
+.hairline{width:120px;height:1px;background:var(--accent);margin-top:36px}
+.badge{position:absolute;top:92px;right:110px;font-size:11px;letter-spacing:.3em;color:var(--muted);text-transform:uppercase}
+.row{display:grid;grid-template-columns:1fr 1fr}
+.panel{padding:58px 110px}.panel+.panel{border-left:1px solid var(--rule)}
+.eyebrow{font-size:11px;letter-spacing:.28em;text-transform:uppercase;color:var(--accent);margin-bottom:30px;font-weight:600}
+.tr{display:flex;align-items:baseline;gap:18px;padding:13px 0;border-bottom:1px solid var(--rule)}.tr:last-child{border-bottom:0}
+.tt{font-size:10px;letter-spacing:.1em;color:var(--muted);width:90px;flex-shrink:0;text-transform:uppercase}
+.d{font-family:var(--serif);font-weight:500;font-size:48px;line-height:1}
+.h1{font-family:var(--serif);font-weight:500;font-size:32px}
+.h2{font-family:var(--serif);font-weight:600;font-size:22px;letter-spacing:.03em;text-transform:uppercase}
+.bd{font-family:var(--sans);font-size:16px;line-height:1.5;color:var(--ink);opacity:.82}
+.cap{font-family:var(--sans);font-weight:500;font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--muted)}
+.sw{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
+.s{border-radius:8px;overflow:hidden;border:1px solid var(--rule)}.s .c{height:88px}.s .m{padding:10px 12px}
+.s .n{font-size:12px;font-weight:600}.s .x{font-size:10px;color:var(--muted);letter-spacing:.06em;margin-top:2px}
+.strip{display:flex;border-top:1px solid var(--rule)}
+.tile{flex:1;height:132px;display:flex;align-items:center;justify-content:center;font-family:var(--serif);font-weight:500;font-size:18px;letter-spacing:.14em;text-transform:uppercase}
+.tile+.tile{border-left:1px solid var(--rule)}
+.ft{padding:26px 110px;display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--rule)}
+.ft .l{font-family:var(--serif);font-size:16px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent)}
+.ft .r{font-size:11px;color:var(--muted)}
+</style></head><body><div class="board">
+<section class="hero"><div class="badge">DW fleet · corkwallcovering.com</div>
+<div class="mono">DW</div>
+<h1 class="wordmark">Cork<br><span class="thin">Wallcovering</span></h1>
+<p class="tagline">Pure-cork wallcoverings.</p><div class="hairline"></div></section>
+<div style="position:relative;border-bottom:1px solid var(--rule);background:#0a0a0a"><img src="heroes/corkwallcovering.jpg" alt="" style="display:block;width:100%;height:320px;object-fit:cover"><div style="position:absolute;left:110px;bottom:18px;font-size:10px;letter-spacing:.28em;text-transform:uppercase;color:#fff;background:rgba(0,0,0,.5);padding:5px 12px;border-radius:3px;font-family:var(--sans)">Live hero · corkwallcovering.com</div></div>
+<div class="row">
+<div class="panel"><div class="eyebrow">Type Scale · Cormorant Garamond</div>
+<div class="tr"><span class="tt">Display</span><span class="d">Aa</span><span class="cap">Cormorant Garamond</span></div>
+<div class="tr"><span class="tt">H1 · 32</span><span class="h1">Hand-crafted, to order</span></div>
+<div class="tr"><span class="tt">H2 · 22</span><span class="h2">The Collection</span></div>
+<div class="tr"><span class="tt">Body · 16</span><span class="bd">Free memo samples, expert trade service, hand-holding on every order.</span></div>
+<div class="tr"><span class="tt">Caption</span><span class="cap">Free memo samples · Trade pricing</span></div></div>
+<div class="panel"><div class="eyebrow">Palette · </div>
+<div class="sw">
+<div class="s"><div class="c" style="background:#f0ede6"></div><div class="m"><div class="n">Ink</div><div class="x">#F0EDE6</div></div></div>
+<div class="s"><div class="c" style="background:#FF4F00"></div><div class="m"><div class="n">Accent</div><div class="x">#FF4F00</div></div></div>
+<div class="s"><div class="c" style="background:#b83900"></div><div class="m"><div class="n">Accent deep</div><div class="x">#B83900</div></div></div>
+<div class="s"><div class="c" style="background:#1a1410"></div><div class="m"><div class="n">Ground</div><div class="x">#1A1410</div></div></div>
+<div class="s"><div class="c" style="background:#f3f1ea"></div><div class="m"><div class="n">Light</div><div class="x">#F3F1EA</div></div></div>
+<div class="s"><div class="c" style="background:#1656f00"></div><div class="m"><div class="n">Accent tint</div><div class="x">#1656F00</div></div></div>
+</div></div></div>
+<div class="strip"><div class="tile" style="background:#f0ede6;color:#1a1410">Silk</div><div class="tile" style="background:#FF4F00;color:#1a1410">Grasscloth</div><div class="tile" style="background:#b83900;color:#1a1410">Cork</div><div class="tile" style="background:#802800;color:#1a1410">Linen</div></div>
+<div class="ft"><div class="l">Cork Wallcovering</div><div class="r">DW hybrid brand · shared skeleton · per-site theme from style guide · /</div></div>
+</div></body></html>
\ No newline at end of file
diff --git a/brand/etciemurals.html b/brand/etciemurals.html
index f9604d9..d09b453 100644
--- a/brand/etciemurals.html
+++ b/brand/etciemurals.html
@@ -4,7 +4,7 @@
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,500;0,600;1,400&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
<script src="https://mcp.figma.com/mcp/html-to-design/capture.js" async></script>
<style>
-:root{--ink:#ece4ee;--bg:#0e0a10;--paper:#0e0a10;--accent:#6a3a7a;--accent-deep:#4c2a58;--rule:#cdc1d0;
+:root{--ink:#ece4ee;--bg:#f3eff3;--paper:#f3eff3;--accent:#6a3a7a;--accent-deep:#4c2a58;--rule:#cdc1d0;
--serif:'Playfair Display',Georgia,serif;--sans:'Inter',system-ui,sans-serif;--muted:rgba(255,255,255,.45)}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-smoothing:antialiased}
@@ -40,6 +40,7 @@ body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-
<div class="mono">DW</div>
<h1 class="wordmark">Et Cie<br><span class="thin">Murals</span></h1>
<p class="tagline">Statement murals for interiors.</p><div class="hairline"></div></section>
+
<div class="row">
<div class="panel"><div class="eyebrow">Type Scale · Playfair Display</div>
<div class="tr"><span class="tt">Display</span><span class="d">Aa</span><span class="cap">Playfair Display</span></div>
@@ -52,10 +53,10 @@ body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-
<div class="s"><div class="c" style="background:#ece4ee"></div><div class="m"><div class="n">Ink</div><div class="x">#ECE4EE</div></div></div>
<div class="s"><div class="c" style="background:#6a3a7a"></div><div class="m"><div class="n">Accent</div><div class="x">#6A3A7A</div></div></div>
<div class="s"><div class="c" style="background:#4c2a58"></div><div class="m"><div class="n">Accent deep</div><div class="x">#4C2A58</div></div></div>
-<div class="s"><div class="c" style="background:#0e0a10"></div><div class="m"><div class="n">Ground</div><div class="x">#0E0A10</div></div></div>
+<div class="s"><div class="c" style="background:#f3eff3"></div><div class="m"><div class="n">Ground</div><div class="x">#F3EFF3</div></div></div>
<div class="s"><div class="c" style="background:#f3eff3"></div><div class="m"><div class="n">Light</div><div class="x">#F3EFF3</div></div></div>
<div class="s"><div class="c" style="background:#9451ab"></div><div class="m"><div class="n">Accent tint</div><div class="x">#9451AB</div></div></div>
</div></div></div>
-<div class="strip"><div class="tile" style="background:#ece4ee;color:#0e0a10">mural</div><div class="tile" style="background:#6a3a7a;color:#0e0a10">scenic</div><div class="tile" style="background:#4c2a58;color:#0e0a10">panoramic</div></div>
+<div class="strip"><div class="tile" style="background:#ece4ee;color:#f3eff3">mural</div><div class="tile" style="background:#6a3a7a;color:#f3eff3">scenic</div><div class="tile" style="background:#4c2a58;color:#f3eff3">panoramic</div></div>
<div class="ft"><div class="l">Et Cie Murals</div><div class="r">DW hybrid brand · shared skeleton · per-site theme from style guide · plum/playfair</div></div>
</div></body></html>
\ No newline at end of file
diff --git a/brand/grassclothwallpaper.html b/brand/grassclothwallpaper.html
new file mode 100644
index 0000000..ba690d9
--- /dev/null
+++ b/brand/grassclothwallpaper.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8">
+<title>grassclothwallpaper — brand board</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&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
+<script src="https://mcp.figma.com/mcp/html-to-design/capture.js" async></script>
+<style>
+:root{--ink:#0a0a0a;--bg:#ffffff;--paper:#ffffff;--accent:#c14a2e;--accent-deep:#8b3521;--rule:rgba(255,255,255,.12);
+--serif:'Cormorant Garamond',Georgia,serif;--sans:'Inter',system-ui,sans-serif;--muted:rgba(255,255,255,.45)}
+*{box-sizing:border-box;margin:0;padding:0}
+body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-smoothing:antialiased}
+.board{width:1456px;margin:0 auto;background:var(--bg)}
+.hero{padding:92px 110px 78px;border-bottom:1px solid var(--rule);position:relative}
+.mono{font-family:var(--serif);font-weight:500;font-size:28px;letter-spacing:.2em;color:var(--accent);margin-bottom:48px;text-transform:uppercase}
+.wordmark{font-family:var(--serif);font-weight:500;font-size:88px;line-height:1.0;letter-spacing:.03em;text-transform:uppercase}
+.wordmark .thin{font-weight:400;color:var(--accent)}
+.tagline{font-family:var(--serif);font-style:italic;font-size:28px;color:var(--muted);margin-top:24px}
+.hairline{width:120px;height:1px;background:var(--accent);margin-top:36px}
+.badge{position:absolute;top:92px;right:110px;font-size:11px;letter-spacing:.3em;color:var(--muted);text-transform:uppercase}
+.row{display:grid;grid-template-columns:1fr 1fr}
+.panel{padding:58px 110px}.panel+.panel{border-left:1px solid var(--rule)}
+.eyebrow{font-size:11px;letter-spacing:.28em;text-transform:uppercase;color:var(--accent);margin-bottom:30px;font-weight:600}
+.tr{display:flex;align-items:baseline;gap:18px;padding:13px 0;border-bottom:1px solid var(--rule)}.tr:last-child{border-bottom:0}
+.tt{font-size:10px;letter-spacing:.1em;color:var(--muted);width:90px;flex-shrink:0;text-transform:uppercase}
+.d{font-family:var(--serif);font-weight:500;font-size:48px;line-height:1}
+.h1{font-family:var(--serif);font-weight:500;font-size:32px}
+.h2{font-family:var(--serif);font-weight:600;font-size:22px;letter-spacing:.03em;text-transform:uppercase}
+.bd{font-family:var(--sans);font-size:16px;line-height:1.5;color:var(--ink);opacity:.82}
+.cap{font-family:var(--sans);font-weight:500;font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--muted)}
+.sw{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
+.s{border-radius:8px;overflow:hidden;border:1px solid var(--rule)}.s .c{height:88px}.s .m{padding:10px 12px}
+.s .n{font-size:12px;font-weight:600}.s .x{font-size:10px;color:var(--muted);letter-spacing:.06em;margin-top:2px}
+.strip{display:flex;border-top:1px solid var(--rule)}
+.tile{flex:1;height:132px;display:flex;align-items:center;justify-content:center;font-family:var(--serif);font-weight:500;font-size:18px;letter-spacing:.14em;text-transform:uppercase}
+.tile+.tile{border-left:1px solid var(--rule)}
+.ft{padding:26px 110px;display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--rule)}
+.ft .l{font-family:var(--serif);font-size:16px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent)}
+.ft .r{font-size:11px;color:var(--muted)}
+</style></head><body><div class="board">
+<section class="hero"><div class="badge">DW fleet · grassclothwallpaper.com</div>
+<div class="mono">DW</div>
+<h1 class="wordmark">grassclothwallpaper</h1>
+<p class="tagline">Designer wallcoverings for discerning walls.</p><div class="hairline"></div></section>
+<div style="height:320px;background:#0a0a0a url('https://grassclothwallpaper.com/og-image.jpg') center/cover no-repeat;border-bottom:1px solid var(--rule);position:relative"><div style="position:absolute;left:110px;bottom:18px;font-size:10px;letter-spacing:.28em;text-transform:uppercase;color:#fff;background:rgba(0,0,0,.5);padding:5px 12px;border-radius:3px;font-family:var(--sans)">Live hero · grassclothwallpaper.com</div></div>
+<div class="row">
+<div class="panel"><div class="eyebrow">Type Scale · Cormorant Garamond</div>
+<div class="tr"><span class="tt">Display</span><span class="d">Aa</span><span class="cap">Cormorant Garamond</span></div>
+<div class="tr"><span class="tt">H1 · 32</span><span class="h1">Hand-crafted, to order</span></div>
+<div class="tr"><span class="tt">H2 · 22</span><span class="h2">The Collection</span></div>
+<div class="tr"><span class="tt">Body · 16</span><span class="bd">Free memo samples, expert trade service, hand-holding on every order.</span></div>
+<div class="tr"><span class="tt">Caption</span><span class="cap">Free memo samples · Trade pricing</span></div></div>
+<div class="panel"><div class="eyebrow">Palette · </div>
+<div class="sw">
+<div class="s"><div class="c" style="background:#0a0a0a"></div><div class="m"><div class="n">Ink</div><div class="x">#0A0A0A</div></div></div>
+<div class="s"><div class="c" style="background:#c14a2e"></div><div class="m"><div class="n">Accent</div><div class="x">#C14A2E</div></div></div>
+<div class="s"><div class="c" style="background:#8b3521"></div><div class="m"><div class="n">Accent deep</div><div class="x">#8B3521</div></div></div>
+<div class="s"><div class="c" style="background:#ffffff"></div><div class="m"><div class="n">Ground</div><div class="x">#FFFFFF</div></div></div>
+<div class="s"><div class="c" style="background:#f3f1ea"></div><div class="m"><div class="n">Light</div><div class="x">#F3F1EA</div></div></div>
+<div class="s"><div class="c" style="background:#10e6840"></div><div class="m"><div class="n">Accent tint</div><div class="x">#10E6840</div></div></div>
+</div></div></div>
+<div class="strip"><div class="tile" style="background:#0a0a0a;color:#ffffff">Silk</div><div class="tile" style="background:#c14a2e;color:#ffffff">Grasscloth</div><div class="tile" style="background:#8b3521;color:#ffffff">Cork</div><div class="tile" style="background:#612517;color:#ffffff">Linen</div></div>
+<div class="ft"><div class="l">grassclothwallpaper</div><div class="r">DW hybrid brand · shared skeleton · per-site theme from style guide · /</div></div>
+</div></body></html>
\ No newline at end of file
diff --git a/brand/linenwallpaper.html b/brand/linenwallpaper.html
new file mode 100644
index 0000000..398a28f
--- /dev/null
+++ b/brand/linenwallpaper.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8">
+<title>linenwallpaper — brand board</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&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
+<script src="https://mcp.figma.com/mcp/html-to-design/capture.js" async></script>
+<style>
+:root{--ink:#f0ede6;--bg:#2C1F0F;--paper:#2C1F0F;--accent:#9B7B4F;--accent-deep:#705939;--rule:rgba(255,255,255,.12);
+--serif:'Cormorant Garamond',Georgia,serif;--sans:'Inter',system-ui,sans-serif;--muted:rgba(255,255,255,.45)}
+*{box-sizing:border-box;margin:0;padding:0}
+body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-smoothing:antialiased}
+.board{width:1456px;margin:0 auto;background:var(--bg)}
+.hero{padding:92px 110px 78px;border-bottom:1px solid var(--rule);position:relative}
+.mono{font-family:var(--serif);font-weight:500;font-size:28px;letter-spacing:.2em;color:var(--accent);margin-bottom:48px;text-transform:uppercase}
+.wordmark{font-family:var(--serif);font-weight:500;font-size:88px;line-height:1.0;letter-spacing:.03em;text-transform:uppercase}
+.wordmark .thin{font-weight:400;color:var(--accent)}
+.tagline{font-family:var(--serif);font-style:italic;font-size:28px;color:var(--muted);margin-top:24px}
+.hairline{width:120px;height:1px;background:var(--accent);margin-top:36px}
+.badge{position:absolute;top:92px;right:110px;font-size:11px;letter-spacing:.3em;color:var(--muted);text-transform:uppercase}
+.row{display:grid;grid-template-columns:1fr 1fr}
+.panel{padding:58px 110px}.panel+.panel{border-left:1px solid var(--rule)}
+.eyebrow{font-size:11px;letter-spacing:.28em;text-transform:uppercase;color:var(--accent);margin-bottom:30px;font-weight:600}
+.tr{display:flex;align-items:baseline;gap:18px;padding:13px 0;border-bottom:1px solid var(--rule)}.tr:last-child{border-bottom:0}
+.tt{font-size:10px;letter-spacing:.1em;color:var(--muted);width:90px;flex-shrink:0;text-transform:uppercase}
+.d{font-family:var(--serif);font-weight:500;font-size:48px;line-height:1}
+.h1{font-family:var(--serif);font-weight:500;font-size:32px}
+.h2{font-family:var(--serif);font-weight:600;font-size:22px;letter-spacing:.03em;text-transform:uppercase}
+.bd{font-family:var(--sans);font-size:16px;line-height:1.5;color:var(--ink);opacity:.82}
+.cap{font-family:var(--sans);font-weight:500;font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--muted)}
+.sw{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
+.s{border-radius:8px;overflow:hidden;border:1px solid var(--rule)}.s .c{height:88px}.s .m{padding:10px 12px}
+.s .n{font-size:12px;font-weight:600}.s .x{font-size:10px;color:var(--muted);letter-spacing:.06em;margin-top:2px}
+.strip{display:flex;border-top:1px solid var(--rule)}
+.tile{flex:1;height:132px;display:flex;align-items:center;justify-content:center;font-family:var(--serif);font-weight:500;font-size:18px;letter-spacing:.14em;text-transform:uppercase}
+.tile+.tile{border-left:1px solid var(--rule)}
+.ft{padding:26px 110px;display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--rule)}
+.ft .l{font-family:var(--serif);font-size:16px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent)}
+.ft .r{font-size:11px;color:var(--muted)}
+</style></head><body><div class="board">
+<section class="hero"><div class="badge">DW fleet · linenwallpaper.com</div>
+<div class="mono">DW</div>
+<h1 class="wordmark">linenwallpaper</h1>
+<p class="tagline">Pure linen, woven texture, quiet rooms.</p><div class="hairline"></div></section>
+<div style="position:relative;border-bottom:1px solid var(--rule);background:#0a0a0a"><img src="heroes/linenwallpaper.jpg" alt="" style="display:block;width:100%;height:320px;object-fit:cover"><div style="position:absolute;left:110px;bottom:18px;font-size:10px;letter-spacing:.28em;text-transform:uppercase;color:#fff;background:rgba(0,0,0,.5);padding:5px 12px;border-radius:3px;font-family:var(--sans)">Live hero · linenwallpaper.com</div></div>
+<div class="row">
+<div class="panel"><div class="eyebrow">Type Scale · Cormorant Garamond</div>
+<div class="tr"><span class="tt">Display</span><span class="d">Aa</span><span class="cap">Cormorant Garamond</span></div>
+<div class="tr"><span class="tt">H1 · 32</span><span class="h1">Hand-crafted, to order</span></div>
+<div class="tr"><span class="tt">H2 · 22</span><span class="h2">The Collection</span></div>
+<div class="tr"><span class="tt">Body · 16</span><span class="bd">Free memo samples, expert trade service, hand-holding on every order.</span></div>
+<div class="tr"><span class="tt">Caption</span><span class="cap">Free memo samples · Trade pricing</span></div></div>
+<div class="panel"><div class="eyebrow">Palette · </div>
+<div class="sw">
+<div class="s"><div class="c" style="background:#f0ede6"></div><div class="m"><div class="n">Ink</div><div class="x">#F0EDE6</div></div></div>
+<div class="s"><div class="c" style="background:#9B7B4F"></div><div class="m"><div class="n">Accent</div><div class="x">#9B7B4F</div></div></div>
+<div class="s"><div class="c" style="background:#705939"></div><div class="m"><div class="n">Accent deep</div><div class="x">#705939</div></div></div>
+<div class="s"><div class="c" style="background:#2C1F0F"></div><div class="m"><div class="n">Ground</div><div class="x">#2C1F0F</div></div></div>
+<div class="s"><div class="c" style="background:#f3f1ea"></div><div class="m"><div class="n">Light</div><div class="x">#F3F1EA</div></div></div>
+<div class="s"><div class="c" style="background:#d9ac6f"></div><div class="m"><div class="n">Accent tint</div><div class="x">#D9AC6F</div></div></div>
+</div></div></div>
+<div class="strip"><div class="tile" style="background:#f0ede6;color:#2C1F0F">Silk</div><div class="tile" style="background:#9B7B4F;color:#2C1F0F">Grasscloth</div><div class="tile" style="background:#705939;color:#2C1F0F">Cork</div><div class="tile" style="background:#4e3e28;color:#2C1F0F">Linen</div></div>
+<div class="ft"><div class="l">linenwallpaper</div><div class="r">DW hybrid brand · shared skeleton · per-site theme from style guide · /</div></div>
+</div></body></html>
\ No newline at end of file
diff --git a/brand/silkwallpaper.html b/brand/silkwallpaper.html
new file mode 100644
index 0000000..02ad23d
--- /dev/null
+++ b/brand/silkwallpaper.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8">
+<title>silkwallpaper — brand board</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&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
+<script src="https://mcp.figma.com/mcp/html-to-design/capture.js" async></script>
+<style>
+:root{--ink:#f0ede6;--bg:#FFF;--paper:#FFF;--accent:#c8a878;--accent-deep:#907956;--rule:rgba(255,255,255,.12);
+--serif:'Cormorant Garamond',Georgia,serif;--sans:'Inter',system-ui,sans-serif;--muted:rgba(255,255,255,.45)}
+*{box-sizing:border-box;margin:0;padding:0}
+body{background:var(--bg);font-family:var(--sans);color:var(--ink);-webkit-font-smoothing:antialiased}
+.board{width:1456px;margin:0 auto;background:var(--bg)}
+.hero{padding:92px 110px 78px;border-bottom:1px solid var(--rule);position:relative}
+.mono{font-family:var(--serif);font-weight:500;font-size:28px;letter-spacing:.2em;color:var(--accent);margin-bottom:48px;text-transform:uppercase}
+.wordmark{font-family:var(--serif);font-weight:500;font-size:88px;line-height:1.0;letter-spacing:.03em;text-transform:uppercase}
+.wordmark .thin{font-weight:400;color:var(--accent)}
+.tagline{font-family:var(--serif);font-style:italic;font-size:28px;color:var(--muted);margin-top:24px}
+.hairline{width:120px;height:1px;background:var(--accent);margin-top:36px}
+.badge{position:absolute;top:92px;right:110px;font-size:11px;letter-spacing:.3em;color:var(--muted);text-transform:uppercase}
+.row{display:grid;grid-template-columns:1fr 1fr}
+.panel{padding:58px 110px}.panel+.panel{border-left:1px solid var(--rule)}
+.eyebrow{font-size:11px;letter-spacing:.28em;text-transform:uppercase;color:var(--accent);margin-bottom:30px;font-weight:600}
+.tr{display:flex;align-items:baseline;gap:18px;padding:13px 0;border-bottom:1px solid var(--rule)}.tr:last-child{border-bottom:0}
+.tt{font-size:10px;letter-spacing:.1em;color:var(--muted);width:90px;flex-shrink:0;text-transform:uppercase}
+.d{font-family:var(--serif);font-weight:500;font-size:48px;line-height:1}
+.h1{font-family:var(--serif);font-weight:500;font-size:32px}
+.h2{font-family:var(--serif);font-weight:600;font-size:22px;letter-spacing:.03em;text-transform:uppercase}
+.bd{font-family:var(--sans);font-size:16px;line-height:1.5;color:var(--ink);opacity:.82}
+.cap{font-family:var(--sans);font-weight:500;font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--muted)}
+.sw{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
+.s{border-radius:8px;overflow:hidden;border:1px solid var(--rule)}.s .c{height:88px}.s .m{padding:10px 12px}
+.s .n{font-size:12px;font-weight:600}.s .x{font-size:10px;color:var(--muted);letter-spacing:.06em;margin-top:2px}
+.strip{display:flex;border-top:1px solid var(--rule)}
+.tile{flex:1;height:132px;display:flex;align-items:center;justify-content:center;font-family:var(--serif);font-weight:500;font-size:18px;letter-spacing:.14em;text-transform:uppercase}
+.tile+.tile{border-left:1px solid var(--rule)}
+.ft{padding:26px 110px;display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--rule)}
+.ft .l{font-family:var(--serif);font-size:16px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent)}
+.ft .r{font-size:11px;color:var(--muted)}
+</style></head><body><div class="board">
+<section class="hero"><div class="badge">DW fleet · silkwallpaper.com</div>
+<div class="mono">DW</div>
+<h1 class="wordmark">silkwallpaper</h1>
+<p class="tagline">Pure silk, on the wall.</p><div class="hairline"></div></section>
+<div style="position:relative;border-bottom:1px solid var(--rule);background:#0a0a0a"><img src="heroes/silkwallpaper.jpg" alt="" style="display:block;width:100%;height:320px;object-fit:cover"><div style="position:absolute;left:110px;bottom:18px;font-size:10px;letter-spacing:.28em;text-transform:uppercase;color:#fff;background:rgba(0,0,0,.5);padding:5px 12px;border-radius:3px;font-family:var(--sans)">Live hero · silkwallpaper.com</div></div>
+<div class="row">
+<div class="panel"><div class="eyebrow">Type Scale · Cormorant Garamond</div>
+<div class="tr"><span class="tt">Display</span><span class="d">Aa</span><span class="cap">Cormorant Garamond</span></div>
+<div class="tr"><span class="tt">H1 · 32</span><span class="h1">Hand-crafted, to order</span></div>
+<div class="tr"><span class="tt">H2 · 22</span><span class="h2">The Collection</span></div>
+<div class="tr"><span class="tt">Body · 16</span><span class="bd">Free memo samples, expert trade service, hand-holding on every order.</span></div>
+<div class="tr"><span class="tt">Caption</span><span class="cap">Free memo samples · Trade pricing</span></div></div>
+<div class="panel"><div class="eyebrow">Palette · </div>
+<div class="sw">
+<div class="s"><div class="c" style="background:#f0ede6"></div><div class="m"><div class="n">Ink</div><div class="x">#F0EDE6</div></div></div>
+<div class="s"><div class="c" style="background:#c8a878"></div><div class="m"><div class="n">Accent</div><div class="x">#C8A878</div></div></div>
+<div class="s"><div class="c" style="background:#907956"></div><div class="m"><div class="n">Accent deep</div><div class="x">#907956</div></div></div>
+<div class="s"><div class="c" style="background:#FFF"></div><div class="m"><div class="n">Ground</div><div class="x">#FFF</div></div></div>
+<div class="s"><div class="c" style="background:#f3f1ea"></div><div class="m"><div class="n">Light</div><div class="x">#F3F1EA</div></div></div>
+<div class="s"><div class="c" style="background:#118eba8"></div><div class="m"><div class="n">Accent tint</div><div class="x">#118EBA8</div></div></div>
+</div></div></div>
+<div class="strip"><div class="tile" style="background:#f0ede6;color:#FFF">Silk</div><div class="tile" style="background:#c8a878;color:#FFF">Grasscloth</div><div class="tile" style="background:#907956;color:#FFF">Cork</div><div class="tile" style="background:#64543c;color:#FFF">Linen</div></div>
+<div class="ft"><div class="l">silkwallpaper</div><div class="r">DW hybrid brand · shared skeleton · per-site theme from style guide · /</div></div>
+</div></body></html>
\ No newline at end of file
← bf16606 live fleet viewer (:9774) — 119 cards, live og:image thumbs
·
back to Dw Fleet Registry
·
read-only template-drift audit: 37 mapped sites vs assigned 8886e66 →