← back to Dw Vendor Mailer
Real hosted logos (re-uploaded to Shopify Files), remove $4.25 sample price, reduce image padding
638751149863de0e530973ee766923f6a5c25d18 · 2026-09-09 12:12:50 -0700 · Steve Abrams
Files touched
M build.pyA logo-urls.jsonM mailer.htmlA upload_logos.mjs
Diff
commit 638751149863de0e530973ee766923f6a5c25d18
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Sep 9 12:12:50 2026 -0700
Real hosted logos (re-uploaded to Shopify Files), remove $4.25 sample price, reduce image padding
---
build.py | 34 +++++-----
logo-urls.json | 7 +++
mailer.html | 188 +++++++++++++++++++++++++++----------------------------
upload_logos.mjs | 58 +++++++++++++++++
4 files changed, 179 insertions(+), 108 deletions(-)
diff --git a/build.py b/build.py
index a418f56..babe979 100644
--- a/build.py
+++ b/build.py
@@ -33,7 +33,8 @@ VENDORS = [
},
{
"name": "Thibaut",
- "logo": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/thibaut.png?v=1771978235",
+ "logo": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/thibaut.png?v=1788980975",
+ "logo_w": 250,
"tagline": "American heritage prints & grounds.",
"collection": "thibaut-wallcoverings",
"products": [
@@ -49,7 +50,8 @@ VENDORS = [
},
{
"name": "Cole & Son",
- "logo": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/cole-son.png?v=1771978045",
+ "logo": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/cole-son.png?v=1788980977",
+ "logo_w": 190,
"tagline": "Iconic British archive & botanicals.",
"collection": "cole-and-son",
"products": [
@@ -65,7 +67,8 @@ VENDORS = [
},
{
"name": "Brunschwig & Fils",
- "logo": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/brunschwig-fils.png?v=1771979287",
+ "logo": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/brunschwig-fils.png?v=1788980979",
+ "logo_w": 150,
"tagline": "Timeless texture & French elegance.",
"collection": "brunschwig-fils",
"products": [
@@ -81,7 +84,8 @@ VENDORS = [
},
{
"name": "Designers Guild",
- "logo": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/designers-guild.webp?v=1771978051",
+ "logo": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/designers-guild.png?v=1788980984",
+ "logo_w": 300,
"tagline": "Colour-led damasks & florals.",
"collection": "designers-guild-wallpaper",
# Outlook-safe: DG's catalog is ~99% WebP; these 3 are the JPG-imaged patterns.
@@ -96,7 +100,8 @@ VENDORS = [
},
{
"name": "Osborne & Little",
- "logo": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/osborne-little-shopify.png?v=1771978100",
+ "logo": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/osborne-little-shopify.png?v=1788980982",
+ "logo_w": 100,
"tagline": "London design house — pattern & stripe.",
"collection": "osborne-little",
"products": [
@@ -123,10 +128,10 @@ SANS = "-apple-system, 'Helvetica Neue', Arial, sans-serif"
def product_cell(name, handle, img):
url = f"{STORE}/products/{handle}"
name_e = html.escape(name)
- return f""" <td width="130" valign="top" style="padding:6px;">
+ return f""" <td width="132" valign="top" style="padding:2px;">
<a href="{url}" target="_blank" style="text-decoration:none;color:{INK};">
- <img src="{img}" width="118" alt="{name_e}" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid {LINE};border-radius:3px;background:#fff;">
- <div style="font-family:{SANS};font-size:11px;line-height:1.35;color:{INK};padding:7px 2px 0;">{name_e}</div>
+ <img src="{img}" width="128" alt="{name_e}" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid {LINE};border-radius:3px;background:#fff;">
+ <div style="font-family:{SANS};font-size:11px;line-height:1.3;color:{INK};padding:5px 2px 0;">{name_e}</div>
</a>
</td>"""
@@ -137,24 +142,25 @@ def vendor_block(v):
header = (f'<div style="font-family:{SERIF};font-weight:600;font-size:30px;'
f'letter-spacing:.3px;color:{INK};">{html.escape(v["wordmark"])}</div>')
else:
+ w = v.get("logo_w", 200)
header = (f'<img src="{v["logo"]}" alt="{html.escape(v["name"])}" '
- f'height="42" style="display:inline-block;height:42px;max-height:42px;width:auto;border:0;">')
+ f'width="{w}" style="display:inline-block;width:{w}px;max-width:82%;height:auto;border:0;">')
cells = "\n".join(product_cell(*p) for p in v["products"])
coll = f"{STORE}/collections/{v['collection']}"
tagline = html.escape(v.get("tagline", ""))
return f"""
<!-- {html.escape(v['name'])} -->
- <tr><td style="padding:26px 24px 4px;text-align:center;">
+ <tr><td style="padding:16px 24px 4px;text-align:center;">
{header}
<div style="font-family:{SANS};font-size:12px;color:{MUTED};padding-top:6px;">{tagline}</div>
</td></tr>
- <tr><td style="padding:8px 18px 0;">
+ <tr><td style="padding:6px 10px 0;">
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%"><tr>
{cells}
</tr></table>
</td></tr>
<tr><td style="padding:12px 24px 6px;text-align:center;">
- <div style="font-family:{SANS};font-size:12px;color:{MUTED};padding-bottom:12px;">Order any as a <strong style="color:{INK};">$4.25 sample</strong>.</div>
+ <div style="font-family:{SANS};font-size:12px;color:{MUTED};padding-bottom:12px;">Order any pattern as a <strong style="color:{INK};">sample</strong>.</div>
<a href="{coll}" target="_blank" style="display:inline-block;font-family:{SANS};font-size:12px;letter-spacing:1.2px;text-transform:uppercase;color:{INK};text-decoration:none;border:1px solid {INK};padding:10px 26px;border-radius:2px;">Shop {html.escape(v['name'])} →</a>
</td></tr>
<tr><td style="padding:22px 24px 0;"><div style="border-top:1px solid {LINE};font-size:0;line-height:0;"> </div></td></tr>"""
@@ -166,7 +172,7 @@ def build():
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>New — Houses We Represent</title></head>
<body style="margin:0;padding:0;background:{CREAM};">
-<div style="display:none;max-height:0;overflow:hidden;opacity:0;">Six ateliers we represent — Phillipe Romano, Thibaut, Cole & Son, Brunschwig & Fils, Designers Guild & Osborne & Little. Order any pattern as a $4.25 sample.</div>
+<div style="display:none;max-height:0;overflow:hidden;opacity:0;">Six ateliers we represent — Phillipe Romano, Thibaut, Cole & Son, Brunschwig & Fils, Designers Guild & Osborne & Little. Order any pattern as a sample.</div>
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="background:{CREAM};">
<tr><td align="center" style="padding:24px 12px;">
<table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0" style="width:600px;max-width:600px;background:#ffffff;border:1px solid {LINE};">
@@ -177,7 +183,7 @@ def build():
</td></tr>
<tr><td style="padding:6px 24px 4px;text-align:center;">
<div style="font-family:{SERIF};font-size:32px;line-height:1.15;color:{INK};">The Houses We Represent</div>
- <div style="font-family:{SANS};font-size:13px;line-height:1.55;color:{MUTED};padding:10px 20px 0;">Six ateliers, on our shelves. A few new arrivals from each — order any pattern as a <strong style="color:{INK};">$4.25 sample</strong>, shipped to your studio the same week.</div>
+ <div style="font-family:{SANS};font-size:13px;line-height:1.55;color:{MUTED};padding:10px 20px 0;">Six ateliers, on our shelves. A few new arrivals from each — order any pattern as a <strong style="color:{INK};">sample</strong>, shipped to your studio the same week.</div>
</td></tr>
<tr><td style="padding:18px 24px 0;"><div style="border-top:2px solid {INK};font-size:0;line-height:0;"> </div></td></tr>
{rows}
diff --git a/logo-urls.json b/logo-urls.json
new file mode 100644
index 0000000..282bd61
--- /dev/null
+++ b/logo-urls.json
@@ -0,0 +1,7 @@
+{
+ "thibaut.png": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/thibaut.png?v=1788980975",
+ "cole-son.png": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/cole-son.png?v=1788980977",
+ "brunschwig-fils.png": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/brunschwig-fils.png?v=1788980979",
+ "osborne-little-shopify.png": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/osborne-little-shopify.png?v=1788980982",
+ "designers-guild.png": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/designers-guild.png?v=1788980984"
+}
\ No newline at end of file
diff --git a/mailer.html b/mailer.html
index edfcd60..fe6e613 100644
--- a/mailer.html
+++ b/mailer.html
@@ -2,7 +2,7 @@
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>New — Houses We Represent</title></head>
<body style="margin:0;padding:0;background:#f7f5f2;">
-<div style="display:none;max-height:0;overflow:hidden;opacity:0;">Six ateliers we represent — Phillipe Romano, Thibaut, Cole & Son, Brunschwig & Fils, Designers Guild & Osborne & Little. Order any pattern as a $4.25 sample.</div>
+<div style="display:none;max-height:0;overflow:hidden;opacity:0;">Six ateliers we represent — Phillipe Romano, Thibaut, Cole & Son, Brunschwig & Fils, Designers Guild & Osborne & Little. Order any pattern as a sample.</div>
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="background:#f7f5f2;">
<tr><td align="center" style="padding:24px 12px;">
<table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0" style="width:600px;max-width:600px;background:#ffffff;border:1px solid #e7e2db;">
@@ -13,229 +13,229 @@
</td></tr>
<tr><td style="padding:6px 24px 4px;text-align:center;">
<div style="font-family:'Playfair Display', Georgia, 'Times New Roman', serif;font-size:32px;line-height:1.15;color:#221f1c;">The Houses We Represent</div>
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:13px;line-height:1.55;color:#8a8178;padding:10px 20px 0;">Six ateliers, on our shelves. A few new arrivals from each — order any pattern as a <strong style="color:#221f1c;">$4.25 sample</strong>, shipped to your studio the same week.</div>
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:13px;line-height:1.55;color:#8a8178;padding:10px 20px 0;">Six ateliers, on our shelves. A few new arrivals from each — order any pattern as a <strong style="color:#221f1c;">sample</strong>, shipped to your studio the same week.</div>
</td></tr>
<tr><td style="padding:18px 24px 0;"><div style="border-top:2px solid #221f1c;font-size:0;line-height:0;"> </div></td></tr>
<!-- Phillipe Romano -->
- <tr><td style="padding:26px 24px 4px;text-align:center;">
+ <tr><td style="padding:16px 24px 4px;text-align:center;">
<div style="font-family:'Playfair Display', Georgia, 'Times New Roman', serif;font-weight:600;font-size:30px;letter-spacing:.3px;color:#221f1c;">Phillipe Romano</div>
<div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-top:6px;">From our own atelier — Milano metallics & grasscloth.</div>
</td></tr>
- <tr><td style="padding:8px 18px 0;">
+ <tr><td style="padding:6px 10px 0;">
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%"><tr>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/regalita-nera-black-wallcovering-phillipe-romano" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/MI739_MI739_MI739.jpg?v=1775512460" width="118" alt="Regalita Nera — Black" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Regalita Nera — Black</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/MI739_MI739_MI739.jpg?v=1775512460" width="128" alt="Regalita Nera — Black" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Regalita Nera — Black</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/regalita-rossa-red-wallcovering-phillipe-romano" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/MI738_MI738_MI738.jpg?v=1775512459" width="118" alt="Regalita Rossa — Red" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Regalita Rossa — Red</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/MI738_MI738_MI738.jpg?v=1775512459" width="128" alt="Regalita Rossa — Red" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Regalita Rossa — Red</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/regalita-dorata-gold-wallcovering-phillipe-romano" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/MI737_MI737_MI737.jpg?v=1775512459" width="118" alt="Regalita Dorata — Gold" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Regalita Dorata — Gold</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/MI737_MI737_MI737.jpg?v=1775512459" width="128" alt="Regalita Dorata — Gold" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Regalita Dorata — Gold</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/regalita-bronzo-bronze-wallcovering-phillipe-romano" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/MI736_MI736_MI736.jpg?v=1775512459" width="118" alt="Regalita Bronzo — Bronze" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Regalita Bronzo — Bronze</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/MI736_MI736_MI736.jpg?v=1775512459" width="128" alt="Regalita Bronzo — Bronze" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Regalita Bronzo — Bronze</div>
</a>
</td>
</tr></table>
</td></tr>
<tr><td style="padding:12px 24px 6px;text-align:center;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-bottom:12px;">Order any as a <strong style="color:#221f1c;">$4.25 sample</strong>.</div>
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-bottom:12px;">Order any pattern as a <strong style="color:#221f1c;">sample</strong>.</div>
<a href="https://designerwallcoverings.com/collections/phillipe-romano" target="_blank" style="display:inline-block;font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;letter-spacing:1.2px;text-transform:uppercase;color:#221f1c;text-decoration:none;border:1px solid #221f1c;padding:10px 26px;border-radius:2px;">Shop Phillipe Romano →</a>
</td></tr>
<tr><td style="padding:22px 24px 0;"><div style="border-top:1px solid #e7e2db;font-size:0;line-height:0;"> </div></td></tr>
<!-- Thibaut -->
- <tr><td style="padding:26px 24px 4px;text-align:center;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/thibaut.png?v=1771978235" alt="Thibaut" height="42" style="display:inline-block;height:42px;max-height:42px;width:auto;border:0;">
+ <tr><td style="padding:16px 24px 4px;text-align:center;">
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/thibaut.png?v=1788980975" alt="Thibaut" width="250" style="display:inline-block;width:250px;max-width:82%;height:auto;border:0;">
<div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-top:6px;">American heritage prints & grounds.</div>
</td></tr>
- <tr><td style="padding:8px 18px 0;">
+ <tr><td style="padding:6px 10px 0;">
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%"><tr>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/onda-pearl-and-silver-dwtt-73419" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT7900_ee1a8674-8c14-4d27-85ee-af82dcbed06c.jpg?v=1782268872" width="118" alt="Onda — Pearl & Silver" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Onda — Pearl & Silver</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT7900_ee1a8674-8c14-4d27-85ee-af82dcbed06c.jpg?v=1782268872" width="128" alt="Onda — Pearl & Silver" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Onda — Pearl & Silver</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/gibson-navy-dwtt-73418" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT78793_995d5590-271c-4116-8877-814c9e53bb9a.jpg?v=1782268867" width="118" alt="Gibson — Navy" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Gibson — Navy</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT78793_995d5590-271c-4116-8877-814c9e53bb9a.jpg?v=1782268867" width="128" alt="Gibson — Navy" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Gibson — Navy</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/gibson-blue-dwtt-73417" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT78792.jpg?v=1782268864" width="118" alt="Gibson — Blue" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Gibson — Blue</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT78792.jpg?v=1782268864" width="128" alt="Gibson — Blue" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Gibson — Blue</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/gibson-grey-dwtt-73416" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT78791_a79740f1-bead-4cd2-943f-18286bfa06d4.jpg?v=1782261625" width="118" alt="Gibson — Grey" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Gibson — Grey</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT78791_a79740f1-bead-4cd2-943f-18286bfa06d4.jpg?v=1782261625" width="128" alt="Gibson — Grey" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Gibson — Grey</div>
</a>
</td>
</tr></table>
</td></tr>
<tr><td style="padding:12px 24px 6px;text-align:center;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-bottom:12px;">Order any as a <strong style="color:#221f1c;">$4.25 sample</strong>.</div>
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-bottom:12px;">Order any pattern as a <strong style="color:#221f1c;">sample</strong>.</div>
<a href="https://designerwallcoverings.com/collections/thibaut-wallcoverings" target="_blank" style="display:inline-block;font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;letter-spacing:1.2px;text-transform:uppercase;color:#221f1c;text-decoration:none;border:1px solid #221f1c;padding:10px 26px;border-radius:2px;">Shop Thibaut →</a>
</td></tr>
<tr><td style="padding:22px 24px 0;"><div style="border-top:1px solid #e7e2db;font-size:0;line-height:0;"> </div></td></tr>
<!-- Cole & Son -->
- <tr><td style="padding:26px 24px 4px;text-align:center;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/cole-son.png?v=1771978045" alt="Cole & Son" height="42" style="display:inline-block;height:42px;max-height:42px;width:auto;border:0;">
+ <tr><td style="padding:16px 24px 4px;text-align:center;">
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/cole-son.png?v=1788980977" alt="Cole & Son" width="190" style="display:inline-block;width:190px;max-width:82%;height:auto;border:0;">
<div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-top:6px;">Iconic British archive & botanicals.</div>
</td></tr>
- <tr><td style="padding:8px 18px 0;">
+ <tr><td style="padding:6px 10px 0;">
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%"><tr>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/palm-jungle-olive-green-on-white-cole-son-contemporary-restyled-botanical-floral-wallcovering" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PalmJungle_Image_Flatshot_Item_95-1001.jpg?v=1779809928" width="118" alt="Palm Jungle — Olive/White" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Palm Jungle — Olive/White</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PalmJungle_Image_Flatshot_Item_95-1001.jpg?v=1779809928" width="128" alt="Palm Jungle — Olive/White" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Palm Jungle — Olive/White</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/seasonal-woods-silk-platinum-cole-son" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/seasonal-woods-silk-platinum-cole-son-37235620446259.jpg?v=1785462973" width="118" alt="Seasonal Woods — Platinum" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Seasonal Woods — Platinum</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/seasonal-woods-silk-platinum-cole-son-37235620446259.jpg?v=1785462973" width="128" alt="Seasonal Woods — Platinum" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Seasonal Woods — Platinum</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/verdure-tapestry-silk-pts-l-cole-son" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/verdure-tapestry-silk-pts-l-cole-son-37223445364787.jpg?v=1785464400" width="118" alt="Verdure Tapestry — Silk" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Verdure Tapestry — Silk</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/verdure-tapestry-silk-pts-l-cole-son-37223445364787.jpg?v=1785464400" width="128" alt="Verdure Tapestry — Silk" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Verdure Tapestry — Silk</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/protea-garden-silk-olvgrn-tngrn-wht-cole-son" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/119_10045_CS_dab7e6e6-dd85-439c-8a7e-52c91452a607.jpg?v=1776794876" width="118" alt="Protea Garden — Silk" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Protea Garden — Silk</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/119_10045_CS_dab7e6e6-dd85-439c-8a7e-52c91452a607.jpg?v=1776794876" width="128" alt="Protea Garden — Silk" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Protea Garden — Silk</div>
</a>
</td>
</tr></table>
</td></tr>
<tr><td style="padding:12px 24px 6px;text-align:center;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-bottom:12px;">Order any as a <strong style="color:#221f1c;">$4.25 sample</strong>.</div>
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-bottom:12px;">Order any pattern as a <strong style="color:#221f1c;">sample</strong>.</div>
<a href="https://designerwallcoverings.com/collections/cole-and-son" target="_blank" style="display:inline-block;font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;letter-spacing:1.2px;text-transform:uppercase;color:#221f1c;text-decoration:none;border:1px solid #221f1c;padding:10px 26px;border-radius:2px;">Shop Cole & Son →</a>
</td></tr>
<tr><td style="padding:22px 24px 0;"><div style="border-top:1px solid #e7e2db;font-size:0;line-height:0;"> </div></td></tr>
<!-- Brunschwig & Fils -->
- <tr><td style="padding:26px 24px 4px;text-align:center;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/brunschwig-fils.png?v=1771979287" alt="Brunschwig & Fils" height="42" style="display:inline-block;height:42px;max-height:42px;width:auto;border:0;">
+ <tr><td style="padding:16px 24px 4px;text-align:center;">
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/brunschwig-fils.png?v=1788980979" alt="Brunschwig & Fils" width="150" style="display:inline-block;width:150px;max-width:82%;height:auto;border:0;">
<div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-top:6px;">Timeless texture & French elegance.</div>
</td></tr>
- <tr><td style="padding:8px 18px 0;">
+ <tr><td style="padding:6px 10px 0;">
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%"><tr>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/yasu-silver-brunschwig-fils" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/P8015111_11_926bf78a-0113-4b3d-a601-d75cad06b09c.jpg?v=1777019993" width="118" alt="Yasu — Silver" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Yasu — Silver</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/P8015111_11_926bf78a-0113-4b3d-a601-d75cad06b09c.jpg?v=1777019993" width="128" alt="Yasu — Silver" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Yasu — Silver</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/aya-silver-brunschwig-fils" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/P8015110_11_d7f516c7-b57d-46e0-af8a-a2b65ba5848c.jpg?v=1776818900" width="118" alt="Aya — Silver" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Aya — Silver</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/P8015110_11_d7f516c7-b57d-46e0-af8a-a2b65ba5848c.jpg?v=1776818900" width="128" alt="Aya — Silver" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Aya — Silver</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/haizu-silver-brunschwig-fils" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/P8015109_11_107b9977-9cb8-45c1-89c2-d3c128ab661a.jpg?v=1776795793" width="118" alt="Haizu — Silver" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Haizu — Silver</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/P8015109_11_107b9977-9cb8-45c1-89c2-d3c128ab661a.jpg?v=1776795793" width="128" alt="Haizu — Silver" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Haizu — Silver</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/kashmiri-sapphire-blue-wallcovering-brunschwig-fils" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/kashmiri-sapphire-blue-wallcovering-brunschwig-fils-37155195748403.jpg?v=1785456694" width="118" alt="Kashmiri — Sapphire/Blue" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Kashmiri — Sapphire/Blue</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/kashmiri-sapphire-blue-wallcovering-brunschwig-fils-37155195748403.jpg?v=1785456694" width="128" alt="Kashmiri — Sapphire/Blue" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Kashmiri — Sapphire/Blue</div>
</a>
</td>
</tr></table>
</td></tr>
<tr><td style="padding:12px 24px 6px;text-align:center;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-bottom:12px;">Order any as a <strong style="color:#221f1c;">$4.25 sample</strong>.</div>
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-bottom:12px;">Order any pattern as a <strong style="color:#221f1c;">sample</strong>.</div>
<a href="https://designerwallcoverings.com/collections/brunschwig-fils" target="_blank" style="display:inline-block;font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;letter-spacing:1.2px;text-transform:uppercase;color:#221f1c;text-decoration:none;border:1px solid #221f1c;padding:10px 26px;border-radius:2px;">Shop Brunschwig & Fils →</a>
</td></tr>
<tr><td style="padding:22px 24px 0;"><div style="border-top:1px solid #e7e2db;font-size:0;line-height:0;"> </div></td></tr>
<!-- Designers Guild -->
- <tr><td style="padding:26px 24px 4px;text-align:center;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/designers-guild.webp?v=1771978051" alt="Designers Guild" height="42" style="display:inline-block;height:42px;max-height:42px;width:auto;border:0;">
+ <tr><td style="padding:16px 24px 4px;text-align:center;">
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/designers-guild.png?v=1788980984" alt="Designers Guild" width="300" style="display:inline-block;width:300px;max-width:82%;height:auto;border:0;">
<div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-top:6px;">Colour-led damasks & florals.</div>
</td></tr>
- <tr><td style="padding:8px 18px 0;">
+ <tr><td style="padding:6px 10px 0;">
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%"><tr>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/eur-90365-designer-wallcoverings-los-angeles" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/96434.jpg?v=1782461438" width="118" alt="Surimono Watercolour — Rose" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Surimono Watercolour — Rose</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/96434.jpg?v=1782461438" width="128" alt="Surimono Watercolour — Rose" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Surimono Watercolour — Rose</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/eur-80735-pdg1050-designer-wallcoverings-los-angeles" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/91544.jpg?v=1782461419" width="118" alt="Emilie Botanical — Platinum" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Emilie Botanical — Platinum</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/91544.jpg?v=1782461419" width="128" alt="Emilie Botanical — Platinum" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Emilie Botanical — Platinum</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/eur-80706-pdg1036-designer-wallcoverings-los-angeles" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/82097.jpg?v=1782461625" width="118" alt="Angelique Damask — Blue" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Angelique Damask — Blue</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/82097.jpg?v=1782461625" width="128" alt="Angelique Damask — Blue" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Angelique Damask — Blue</div>
</a>
</td>
</tr></table>
</td></tr>
<tr><td style="padding:12px 24px 6px;text-align:center;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-bottom:12px;">Order any as a <strong style="color:#221f1c;">$4.25 sample</strong>.</div>
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-bottom:12px;">Order any pattern as a <strong style="color:#221f1c;">sample</strong>.</div>
<a href="https://designerwallcoverings.com/collections/designers-guild-wallpaper" target="_blank" style="display:inline-block;font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;letter-spacing:1.2px;text-transform:uppercase;color:#221f1c;text-decoration:none;border:1px solid #221f1c;padding:10px 26px;border-radius:2px;">Shop Designers Guild →</a>
</td></tr>
<tr><td style="padding:22px 24px 0;"><div style="border-top:1px solid #e7e2db;font-size:0;line-height:0;"> </div></td></tr>
<!-- Osborne & Little -->
- <tr><td style="padding:26px 24px 4px;text-align:center;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/osborne-little-shopify.png?v=1771978100" alt="Osborne & Little" height="42" style="display:inline-block;height:42px;max-height:42px;width:auto;border:0;">
+ <tr><td style="padding:16px 24px 4px;text-align:center;">
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/osborne-little-shopify.png?v=1788980982" alt="Osborne & Little" width="100" style="display:inline-block;width:100px;max-width:82%;height:auto;border:0;">
<div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-top:6px;">London design house — pattern & stripe.</div>
</td></tr>
- <tr><td style="padding:8px 18px 0;">
+ <tr><td style="padding:6px 10px 0;">
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%"><tr>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/fitzroy-white-stone-osborne-little" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/W6295-06.jpg?v=1781902811" width="118" alt="Fitzroy — White/Stone" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Fitzroy — White/Stone</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/W6295-06.jpg?v=1781902811" width="128" alt="Fitzroy — White/Stone" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Fitzroy — White/Stone</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/karabali-teal-russet-osborne-little" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/NCW4597-04.jpg?v=1781902807" width="118" alt="Karabali — Teal/Russet" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Karabali — Teal/Russet</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/NCW4597-04.jpg?v=1781902807" width="128" alt="Karabali — Teal/Russet" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Karabali — Teal/Russet</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/bramante-stripe-wallcovering-osborne-little" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/bramante-stripe.jpg?v=1760735635" width="118" alt="Bramante Stripe" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Bramante Stripe</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/bramante-stripe.jpg?v=1760735635" width="128" alt="Bramante Stripe" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Bramante Stripe</div>
</a>
</td>
- <td width="130" valign="top" style="padding:6px;">
+ <td width="132" valign="top" style="padding:2px;">
<a href="https://designerwallcoverings.com/products/eur-71338-designer-wallcoverings-los-angeles" target="_blank" style="text-decoration:none;color:#221f1c;">
- <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/cw5410-09.jpg?v=1782461570" width="118" alt="Quartz" style="display:block;width:118px;height:118px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.35;color:#221f1c;padding:7px 2px 0;">Quartz</div>
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/cw5410-09.jpg?v=1782461570" width="128" alt="Quartz" style="display:block;width:128px;height:128px;object-fit:cover;border:1px solid #e7e2db;border-radius:3px;background:#fff;">
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:11px;line-height:1.3;color:#221f1c;padding:5px 2px 0;">Quartz</div>
</a>
</td>
</tr></table>
</td></tr>
<tr><td style="padding:12px 24px 6px;text-align:center;">
- <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-bottom:12px;">Order any as a <strong style="color:#221f1c;">$4.25 sample</strong>.</div>
+ <div style="font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;color:#8a8178;padding-bottom:12px;">Order any pattern as a <strong style="color:#221f1c;">sample</strong>.</div>
<a href="https://designerwallcoverings.com/collections/osborne-little" target="_blank" style="display:inline-block;font-family:-apple-system, 'Helvetica Neue', Arial, sans-serif;font-size:12px;letter-spacing:1.2px;text-transform:uppercase;color:#221f1c;text-decoration:none;border:1px solid #221f1c;padding:10px 26px;border-radius:2px;">Shop Osborne & Little →</a>
</td></tr>
<tr><td style="padding:22px 24px 0;"><div style="border-top:1px solid #e7e2db;font-size:0;line-height:0;"> </div></td></tr>
diff --git a/upload_logos.mjs b/upload_logos.mjs
new file mode 100644
index 0000000..a385180
--- /dev/null
+++ b/upload_logos.mjs
@@ -0,0 +1,58 @@
+import fs from 'node:fs';
+import path from 'node:path';
+
+const env = fs.readFileSync(path.join(process.env.HOME,'Projects/secrets-manager/.env'),'utf8');
+const g = k => (env.match(new RegExp('^'+k+'=(.*)$','m'))||[])[1]?.trim().replace(/^["']|["']$/g,'');
+const TOKEN = g('SHOPIFY_FULL_ACCESS_TOKEN') || g('SHOPIFY_ADMIN_TOKEN');
+const SHOP = 'designer-laboratory-sandbox.myshopify.com';
+const API = '2024-10';
+const GQL = `https://${SHOP}/admin/api/${API}/graphql.json`;
+const H = { 'X-Shopify-Access-Token': TOKEN, 'Content-Type':'application/json' };
+
+const files = ['thibaut.png','cole-son.png','brunschwig-fils.png','osborne-little-shopify.png','designers-guild.png']
+ .map(f => path.join('/tmp/dwlogos', f));
+
+async function gql(query, variables){
+ const r = await fetch(GQL,{method:'POST',headers:H,body:JSON.stringify({query,variables})});
+ const j = await r.json();
+ if(j.errors) throw new Error(JSON.stringify(j.errors));
+ return j.data;
+}
+
+async function uploadOne(fp){
+ const filename = path.basename(fp);
+ // 1) staged target
+ const d1 = await gql(`mutation($input:[StagedUploadInput!]!){stagedUploadsCreate(input:$input){stagedTargets{url resourceUrl parameters{name value}} userErrors{field message}}}`,
+ {input:[{filename, mimeType:'image/png', resource:'FILE', httpMethod:'POST'}]});
+ const t = d1.stagedUploadsCreate.stagedTargets[0];
+ if(!t) throw new Error('no staged target: '+JSON.stringify(d1));
+ // 2) upload to staged url (multipart)
+ const form = new FormData();
+ for(const p of t.parameters) form.append(p.name, p.value);
+ form.append('file', new Blob([fs.readFileSync(fp)],{type:'image/png'}), filename);
+ const up = await fetch(t.url,{method:'POST',body:form});
+ if(!(up.status>=200 && up.status<300)) throw new Error('staged upload failed '+up.status+' '+await up.text());
+ // 3) fileCreate
+ const d2 = await gql(`mutation($files:[FileCreateInput!]!){fileCreate(files:$files){files{id fileStatus alt} userErrors{field message}}}`,
+ {files:[{originalSource:t.resourceUrl, contentType:'IMAGE', alt:filename.replace('.png','')}]});
+ const errs = d2.fileCreate.userErrors;
+ if(errs && errs.length) throw new Error('fileCreate: '+JSON.stringify(errs));
+ const id = d2.fileCreate.files[0].id;
+ // 4) poll for READY url
+ for(let i=0;i<20;i++){
+ await new Promise(r=>setTimeout(r,1500));
+ const d3 = await gql(`query($id:ID!){node(id:$id){... on MediaImage{fileStatus image{url}}}}`,{id});
+ const n = d3.node;
+ if(n && n.fileStatus==='READY' && n.image && n.image.url) return {filename, url:n.image.url};
+ if(n && n.fileStatus==='FAILED') throw new Error('file processing FAILED');
+ }
+ throw new Error('timeout waiting for READY: '+filename);
+}
+
+const out={};
+for(const fp of files){
+ try{ const r=await uploadOne(fp); out[r.filename]=r.url; console.log('✓',r.filename,'->',r.url); }
+ catch(e){ console.error('✗',path.basename(fp),e.message); }
+}
+fs.writeFileSync('logo-urls.json', JSON.stringify(out,null,2));
+console.log('\nsaved logo-urls.json');
← e9cab77 Keep cc_finish.py (code-exchange+draft); CC API app rejects
·
back to Dw Vendor Mailer
·
Center captions, dedupe colorways->distinct patterns (newest 754d65c →