[object Object]

← back to Designer Wallcoverings

China Seas mailer: 9 houses in 3x3 grid (add Lee Jofa, Brunschwig & Fils, GP & J Baker) + crisp Big Caslon China Seas wordmark at bottom; fix mislabeled Brunschwig (was Kravet family lockup)

0088367cad94f6c105c3a6b648a13934f888560e · 2026-06-24 16:17:05 -0700 · Steve

Files touched

Diff

commit 0088367cad94f6c105c3a6b648a13934f888560e
Author: Steve <steve@designerwallcoverings.com>
Date:   Wed Jun 24 16:17:05 2026 -0700

    China Seas mailer: 9 houses in 3x3 grid (add Lee Jofa, Brunschwig & Fils, GP & J Baker) + crisp Big Caslon China Seas wordmark at bottom; fix mislabeled Brunschwig (was Kravet family lockup)
---
 mailers/assets/brunschwig-fils-wordmark.png | Bin 0 -> 47024 bytes
 mailers/assets/china-seas-clean.png         | Bin 0 -> 32233 bytes
 mailers/assets/upload-logos.js              |  67 ++++++++++++++++++++
 mailers/china-seas-launch.html              |  94 +++++++++++++++++-----------
 4 files changed, 126 insertions(+), 35 deletions(-)

diff --git a/mailers/assets/brunschwig-fils-wordmark.png b/mailers/assets/brunschwig-fils-wordmark.png
new file mode 100644
index 00000000..f744ee9b
Binary files /dev/null and b/mailers/assets/brunschwig-fils-wordmark.png differ
diff --git a/mailers/assets/china-seas-clean.png b/mailers/assets/china-seas-clean.png
new file mode 100644
index 00000000..d0f156f7
Binary files /dev/null and b/mailers/assets/china-seas-clean.png differ
diff --git a/mailers/assets/upload-logos.js b/mailers/assets/upload-logos.js
new file mode 100644
index 00000000..d9316229
--- /dev/null
+++ b/mailers/assets/upload-logos.js
@@ -0,0 +1,67 @@
+// Upload /tmp/cs-logos assets to Shopify Files (stagedUploadsCreate -> POST -> fileCreate -> poll READY)
+const fs = require('fs');
+const path = require('path');
+const DOMAIN = 'designer-laboratory-sandbox.myshopify.com';
+const API = '2024-10';
+const TOKEN = process.env.SHOPIFY_DRAFT_TOKEN;
+if (!TOKEN) { console.error('Missing SHOPIFY_DRAFT_TOKEN'); process.exit(1); }
+const DIR = '/tmp/cs-logos';
+const FILES = [
+  { file: 'china-seas-clean.png', mime: 'image/png' },
+  { file: 'lee-jofa.png',         mime: 'image/png' },
+  { file: 'brunschwig-fils.png',  mime: 'image/png' },
+  { file: 'gp-j-baker.png',       mime: 'image/png' },
+];
+async function gql(query, variables) {
+  const res = await fetch(`https://${DOMAIN}/admin/api/${API}/graphql.json`, {
+    method: 'POST',
+    headers: { 'X-Shopify-Access-Token': TOKEN, 'Content-Type': 'application/json' },
+    body: JSON.stringify({ query, variables }),
+  });
+  const j = await res.json();
+  if (j.errors) throw new Error('GraphQL errors: ' + JSON.stringify(j.errors));
+  return j.data;
+}
+async function stagedUpload(filename, mime, sizeBytes) {
+  const q = `mutation s($input:[StagedUploadInput!]!){stagedUploadsCreate(input:$input){stagedTargets{url resourceUrl parameters{name value}} userErrors{field message}}}`;
+  const d = await gql(q, { input: [{ resource: 'FILE', filename, mimeType: mime, httpMethod: 'POST', fileSize: String(sizeBytes) }]});
+  const ue = d.stagedUploadsCreate.userErrors; if (ue && ue.length) throw new Error(JSON.stringify(ue));
+  return d.stagedUploadsCreate.stagedTargets[0];
+}
+async function putBytes(target, buf, mime) {
+  const fd = new FormData();
+  for (const p of target.parameters) fd.append(p.name, p.value);
+  fd.append('file', new Blob([buf], { type: mime }));
+  const res = await fetch(target.url, { method: 'POST', body: fd });
+  if (!(res.status >= 200 && res.status < 300)) throw new Error(`PUT ${res.status}: ${(await res.text()).slice(0,200)}`);
+}
+async function fileCreate(resourceUrl, filename, alt) {
+  const q = `mutation f($files:[FileCreateInput!]!){fileCreate(files:$files){files{id fileStatus} userErrors{field message}}}`;
+  const d = await gql(q, { files: [{ originalSource: resourceUrl, contentType: 'IMAGE', alt, filename }]});
+  const ue = d.fileCreate.userErrors; if (ue && ue.length) throw new Error(JSON.stringify(ue));
+  return d.fileCreate.files[0];
+}
+async function poll(id) {
+  const q = `query($id:ID!){node(id:$id){... on MediaImage{id fileStatus image{url}}}}`;
+  for (let i = 0; i < 30; i++) {
+    const d = await gql(q, { id }); const n = d.node;
+    if (n && n.fileStatus === 'READY' && n.image && n.image.url) return n.image.url;
+    if (n && n.fileStatus === 'FAILED') throw new Error('FAILED ' + id);
+    await new Promise(r => setTimeout(r, 2000));
+  }
+  throw new Error('timeout ' + id);
+}
+(async () => {
+  const out = {};
+  for (const { file, mime } of FILES) {
+    const buf = fs.readFileSync(path.join(DIR, file));
+    const alt = file.replace(/\.[a-z]+$/i,'').replace(/-/g,' ') + ' logo';
+    process.stdout.write(`Uploading ${file} (${buf.length}B)... `);
+    const t = await stagedUpload(file, mime, buf.length);
+    await putBytes(t, buf, mime);
+    const c = await fileCreate(t.resourceUrl, file, alt);
+    out[file] = await poll(c.id);
+    console.log('READY');
+  }
+  console.log('\nRESULT_JSON ' + JSON.stringify(out, null, 2));
+})().catch(e => { console.error('FATAL', e.message); process.exit(1); });
diff --git a/mailers/china-seas-launch.html b/mailers/china-seas-launch.html
index 128555ca..bc6ebce1 100644
--- a/mailers/china-seas-launch.html
+++ b/mailers/china-seas-launch.html
@@ -177,46 +177,70 @@
     </td></tr>
 
     <!-- ============ HERITAGE-HOUSE LOGO STRIP (across the bottom) ============ -->
-    <tr><td style="padding: 30px 14px 30px; border-top: 1px solid #e8e2d6;" align="center">
-      <p style="font-family: Helvetica, Arial, sans-serif; font-size: 10px; letter-spacing: 3px; text-transform: uppercase; color: #8d8478; margin: 0 0 20px;">The Houses We Carry</p>
-      <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0"><tr>
-        <td class="stack" width="16%" valign="middle" align="center" style="padding: 4px 5px;">
-          <a href="https://designerwallcoverings.com/collections/china-seas?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank" style="display:block; background-color:#16201b; border-radius:5px; padding:12px 7px;">
-            <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/china-seas.webp?v=1782330141" alt="China Seas" width="78" style="width:100%; max-width:78px; height:auto; margin:0 auto;">
-          </a>
-        </td>
-        <td class="stack" width="16%" valign="middle" align="center" style="padding: 4px 5px;">
-          <a href="https://designerwallcoverings.com/collections/quadrille-wallcoverings?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
-            <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/quadrille.png?v=1782330144" alt="Quadrille" width="80" style="width:100%; max-width:80px; height:auto; margin:0 auto;">
-          </a>
-        </td>
-        <td class="stack" width="16%" valign="middle" align="center" style="padding: 4px 5px;">
-          <a href="https://designerwallcoverings.com/collections/nina-campbell?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
-            <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/nina-campbell-shopify.jpg?v=1771978096" alt="Nina Campbell" width="66" style="width:100%; max-width:66px; height:auto; margin:0 auto;">
-          </a>
-        </td>
-        <td class="stack" width="16%" valign="middle" align="center" style="padding: 4px 5px;">
-          <a href="https://designerwallcoverings.com/collections/schumacher-wallpaper?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
-            <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/schumacher-shopify.png?v=1771978111" alt="Schumacher" width="72" style="width:100%; max-width:72px; height:auto; margin:0 auto;">
-          </a>
-        </td>
-        <td class="stack" width="16%" valign="middle" align="center" style="padding: 4px 5px;">
-          <a href="https://designerwallcoverings.com/collections/thibaut-wallcoverings?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
-            <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/thibaut.png?v=1771978235" alt="Thibaut" width="82" style="width:100%; max-width:82px; height:auto; margin:0 auto;">
-          </a>
-        </td>
-        <td class="stack" width="16%" valign="middle" align="center" style="padding: 4px 5px;">
-          <a href="https://designerwallcoverings.com/collections/cole-sons?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
-            <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/cole-son_3259d3af-8870-4ffe-aaaf-0288dea61a73.png?v=1782330147" alt="Cole &amp; Son" width="84" style="width:100%; max-width:84px; height:auto; margin:0 auto;">
-          </a>
-        </td>
-      </tr></table>
+    <tr><td style="padding: 32px 18px 30px; border-top: 1px solid #e8e2d6;" align="center">
+      <p style="font-family: Helvetica, Arial, sans-serif; font-size: 10px; letter-spacing: 3px; text-transform: uppercase; color: #8d8478; margin: 0 0 22px;">The Houses We Carry</p>
+      <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="max-width:460px; margin:0 auto;">
+        <!-- Row 1 -->
+        <tr>
+          <td width="33.33%" valign="middle" align="center" style="padding: 16px 8px;">
+            <a href="https://designerwallcoverings.com/collections/china-seas?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
+              <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/china-seas-clean.png?v=1782342754" alt="China Seas" width="100" style="width:100%; max-width:100px; height:auto; margin:0 auto;">
+            </a>
+          </td>
+          <td width="33.33%" valign="middle" align="center" style="padding: 16px 8px;">
+            <a href="https://designerwallcoverings.com/collections/quadrille-wallcoverings?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
+              <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/quadrille.png?v=1782330144" alt="Quadrille" width="84" style="width:100%; max-width:84px; height:auto; margin:0 auto;">
+            </a>
+          </td>
+          <td width="33.33%" valign="middle" align="center" style="padding: 16px 8px;">
+            <a href="https://designerwallcoverings.com/collections/schumacher-wallpaper?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
+              <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/schumacher-shopify.png?v=1771978111" alt="Schumacher" width="84" style="width:100%; max-width:84px; height:auto; margin:0 auto;">
+            </a>
+          </td>
+        </tr>
+        <!-- Row 2 -->
+        <tr>
+          <td width="33.33%" valign="middle" align="center" style="padding: 16px 8px;">
+            <a href="https://designerwallcoverings.com/collections/thibaut-wallcoverings?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
+              <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/thibaut.png?v=1771978235" alt="Thibaut" width="90" style="width:100%; max-width:90px; height:auto; margin:0 auto;">
+            </a>
+          </td>
+          <td width="33.33%" valign="middle" align="center" style="padding: 16px 8px;">
+            <a href="https://designerwallcoverings.com/collections/cole-sons?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
+              <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/cole-son_3259d3af-8870-4ffe-aaaf-0288dea61a73.png?v=1782330147" alt="Cole &amp; Son" width="90" style="width:100%; max-width:90px; height:auto; margin:0 auto;">
+            </a>
+          </td>
+          <td width="33.33%" valign="middle" align="center" style="padding: 16px 8px;">
+            <a href="https://designerwallcoverings.com/collections/nina-campbell?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
+              <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/nina-campbell-shopify.jpg?v=1771978096" alt="Nina Campbell" width="74" style="width:100%; max-width:74px; height:auto; margin:0 auto;">
+            </a>
+          </td>
+        </tr>
+        <!-- Row 3 -->
+        <tr>
+          <td width="33.33%" valign="middle" align="center" style="padding: 16px 8px;">
+            <a href="https://designerwallcoverings.com/collections/lee-jofa?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
+              <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/lee-jofa_3e998714-f3ba-4ccd-9c30-6e1903dddb00.png?v=1782342757" alt="Lee Jofa" width="86" style="width:100%; max-width:86px; height:auto; margin:0 auto;">
+            </a>
+          </td>
+          <td width="33.33%" valign="middle" align="center" style="padding: 16px 8px;">
+            <a href="https://designerwallcoverings.com/collections/brunschwig-fils?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
+              <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/brunschwig-fils_23ed9528-d7c5-420c-ae46-9530aaff134a.png?v=1782342984" alt="Brunschwig &amp; Fils" width="86" style="width:100%; max-width:86px; height:auto; margin:0 auto;">
+            </a>
+          </td>
+          <td width="33.33%" valign="middle" align="center" style="padding: 16px 8px;">
+            <a href="https://designerwallcoverings.com/collections/gp-j-baker?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
+              <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/gp-j-baker_b738318f-c145-484b-bd20-bd3328fefe96.png?v=1782342763" alt="GP &amp; J Baker" width="92" style="width:100%; max-width:92px; height:auto; margin:0 auto;">
+            </a>
+          </td>
+        </tr>
+      </table>
     </td></tr>
 
     <!-- ============ BOTTOM — CHINA SEAS LOGO ============ -->
     <tr><td align="center" style="padding: 32px 24px 34px; border-top: 1px solid #e8e2d6;">
       <a href="https://designerwallcoverings.com/collections/china-seas?utm_source=email&utm_medium=mailer&utm_campaign=china-seas-launch" target="_blank">
-        <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/cs-logo.png?v=1782333826" alt="China Seas" width="260" style="width:62%; max-width:260px; height:auto; margin:0 auto; display:block;">
+        <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/china-seas-clean.png?v=1782342754" alt="China Seas" width="300" style="width:68%; max-width:300px; height:auto; margin:0 auto; display:block;">
       </a>
     </td></tr>
 

← 3bf61e37 auto-save: 2026-06-24T15:58:04 (4 files) — shopify/scripts/c  ·  back to Designer Wallcoverings  ·  China Seas mailer: move Shop-by-Theme band to bottom on whit 1d619822 →