← 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
A mailers/assets/brunschwig-fils-wordmark.pngA mailers/assets/china-seas-clean.pngA mailers/assets/upload-logos.jsM mailers/china-seas-launch.html
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 & 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 & 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 & 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 & 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 →