← back to Dw Marketing Reels
TK-10427: stage all-3 Collection Films (Majilite smart-collection create cmd + 3-card paste), gated
5b2c0d34034a944b100d90e793e037d0625dd782 · 2026-08-31 10:01:59 -0700 · Steve Abrams
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Files touched
A storefront/staged-tk10427/CREATE-majilite-collection.shA storefront/staged-tk10427/PATH-B-paste-3card.liquid
Diff
commit 5b2c0d34034a944b100d90e793e037d0625dd782
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Mon Aug 31 10:01:59 2026 -0700
TK-10427: stage all-3 Collection Films (Majilite smart-collection create cmd + 3-card paste), gated
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
.../staged-tk10427/CREATE-majilite-collection.sh | 89 +++++++++++++++++++++
.../staged-tk10427/PATH-B-paste-3card.liquid | 93 ++++++++++++++++++++++
2 files changed, 182 insertions(+)
diff --git a/storefront/staged-tk10427/CREATE-majilite-collection.sh b/storefront/staged-tk10427/CREATE-majilite-collection.sh
new file mode 100755
index 0000000..824fcaa
--- /dev/null
+++ b/storefront/staged-tk10427/CREATE-majilite-collection.sh
@@ -0,0 +1,89 @@
+#!/usr/bin/env bash
+# ==========================================================================
+# TK-10427 — Majilite smart collection CREATE + PUBLISH (GATED)
+# STAGED ONLY. Do NOT run without Steve's go — this creates a customer-facing
+# collection on the LIVE production DW Shopify store and publishes it to the
+# Online Store sales channel.
+#
+# WHY: the 3-card Collection Films section's Majilite card links to
+# /collections/majilite (hardcoded in the held card, dw-collection-films.liquid:89).
+# That handle 404s today (verified 2026-08-31: smart=0 custom=0 at BOTH
+# /collections/majilite and /collections/majilite-metallics). This creates it so
+# the 3rd card resolves. HANDLE = "majilite" (matches the card's hardcoded href).
+#
+# RULE: a smart collection, title "Majilite Metallics", single rule
+# vendor = 'Majilite' → captures ALL 160 ACTIVE Majilite products
+# (dry-run verified: 161 total / 160 active / 1 archived / 0 draft; the 1
+# archived product is auto-excluded from the storefront).
+# "Majilite" is the real customer-facing brand — NOT a private-label upstream
+# to hide (leak-scanner: no hit; vendor_registry: no PL mapping). Safe.
+#
+# ORDER: this MUST run + verify BEFORE the 3-card section goes live, or the
+# 3rd card links to a 404.
+#
+# ROLLBACK (fully reversible; deleting a collection does NOT delete products):
+# COLLECTION_ID from step 1's output, then:
+# curl -s -X DELETE "https://$DOMAIN/admin/api/$VER/smart_collections/$COLLECTION_ID.json" \
+# -H "X-Shopify-Access-Token: $ADMIN"
+# ==========================================================================
+set -euo pipefail
+
+DOMAIN="designer-laboratory-sandbox.myshopify.com"
+VER="2024-10"
+HANDLE="majilite"
+TITLE="Majilite Metallics"
+
+# ADMIN token …7d19 has write_products (covers collections). FULL_ACCESS …2ea5 is a superset fallback.
+ADMIN="$(grep -E '^SHOPIFY_ADMIN_TOKEN=' "$HOME/Projects/secrets-manager/.env" | head -1 | cut -d= -f2-)"
+
+echo "== 0. PRE-FLIGHT: confirm handle is still free (should print smart:0 custom:0) =="
+curl -s -H "X-Shopify-Access-Token: $ADMIN" \
+ "https://$DOMAIN/admin/api/$VER/smart_collections.json?handle=$HANDLE" \
+ | python3 -c "import sys,json;print(' smart:',len(json.load(sys.stdin).get('smart_collections',[])))"
+curl -s -H "X-Shopify-Access-Token: $ADMIN" \
+ "https://$DOMAIN/admin/api/$VER/custom_collections.json?handle=$HANDLE" \
+ | python3 -c "import sys,json;print(' custom:',len(json.load(sys.stdin).get('custom_collections',[])))"
+
+echo "== 1. CREATE the smart collection (published to Online Store) =="
+# published=true + published_scope=web => published to the Online Store sales channel.
+# disjunctive=false (single rule anyway). Rule: vendor equals Majilite.
+cat > /tmp/tk10427_majilite_body.json <<JSON
+{
+ "smart_collection": {
+ "title": "$TITLE",
+ "handle": "$HANDLE",
+ "published": true,
+ "published_scope": "web",
+ "disjunctive": false,
+ "rules": [
+ { "column": "vendor", "relation": "equals", "condition": "Majilite" }
+ ]
+ }
+}
+JSON
+
+RESP="$(curl -s -X POST "https://$DOMAIN/admin/api/$VER/smart_collections.json" \
+ -H "X-Shopify-Access-Token: $ADMIN" \
+ -H "Content-Type: application/json" \
+ --data-binary @/tmp/tk10427_majilite_body.json)"
+echo "$RESP" | python3 -c "import sys,json;c=json.load(sys.stdin).get('smart_collection',{});print(' created id:',c.get('id'),'| handle:',c.get('handle'),'| published_at:',c.get('published_at'))"
+COLLECTION_ID="$(echo "$RESP" | python3 -c "import sys,json;print(json.load(sys.stdin).get('smart_collection',{}).get('id',''))")"
+echo " >>> COLLECTION_ID=$COLLECTION_ID (save this for rollback)"
+
+echo "== 2. VERIFY capture count (expect ~160 active) =="
+sleep 3 # give the smart-collection rule a moment to populate
+curl -s -H "X-Shopify-Access-Token: $ADMIN" \
+ "https://$DOMAIN/admin/api/$VER/collections/$COLLECTION_ID/products.json?limit=250&fields=id" \
+ | python3 -c "import sys,json;n=len(json.load(sys.stdin).get('products',[]));print(' collection products (page1, cap 250):',n)"
+curl -s -H "X-Shopify-Access-Token: $ADMIN" \
+ "https://$DOMAIN/admin/api/$VER/collections/$COLLECTION_ID.json" \
+ | python3 -c "import sys,json;c=json.load(sys.stdin).get('collection',{});print(' title:',c.get('title'),'| handle:',c.get('handle'),'| published:',bool(c.get('published_at')))"
+
+echo "== 3. VERIFY storefront-visible (front-door products.json for the handle) =="
+echo " (public storefront may take a moment to reflect; re-run if 404 on first try)"
+curl -s "https://designerwallcoverings.com/collections/$HANDLE/products.json?limit=1" \
+ | python3 -c "import sys,json;d=json.load(sys.stdin);print(' storefront products.json OK, first:',(d.get('products') or [{}])[0].get('handle','(none yet)'))" 2>/dev/null \
+ || echo " (storefront not yet reflecting — Online-Store publish can lag a minute)"
+
+echo "DONE. If products=~160 and published=True → paste PATH-B-paste-3card.liquid in the theme editor."
+echo "ROLLBACK: curl -s -X DELETE \"https://$DOMAIN/admin/api/$VER/smart_collections/$COLLECTION_ID.json\" -H \"X-Shopify-Access-Token: \$ADMIN\""
diff --git a/storefront/staged-tk10427/PATH-B-paste-3card.liquid b/storefront/staged-tk10427/PATH-B-paste-3card.liquid
new file mode 100644
index 0000000..7803857
--- /dev/null
+++ b/storefront/staged-tk10427/PATH-B-paste-3card.liquid
@@ -0,0 +1,93 @@
+{%- comment -%}
+ DW Collection Films — homepage video band featuring the flip-book lookbooks.
+ Paste into: Online Store → Themes → Customize → Add section → Custom Liquid.
+ Self-contained (scoped styles). Videos + posters are served from marketing.designerwallcoverings.com.
+ Shop links are same-domain (relative), so they resolve on the live store.
+
+ TK-10427 ALL-3 version: Maya Romanoff + Glitter Walls + Majilite Metallics.
+ PREREQUISITE: the /collections/majilite collection MUST exist + be published
+ BEFORE this paste goes live (run CREATE-majilite-collection.sh first) or the
+ 3rd card links to a 404.
+{%- endcomment -%}
+
+<style>
+ .dwcf { max-width: 1280px; margin: 0 auto; padding: 56px 20px; font-family: inherit; }
+ .dwcf__head { text-align: center; margin-bottom: 34px; }
+ .dwcf__eyebrow { font-size: 12px; letter-spacing: .28em; text-transform: uppercase; color: #9a8f80; margin: 0 0 10px; }
+ .dwcf__title { font-size: clamp(26px, 4vw, 40px); font-weight: 400; letter-spacing: .01em; margin: 0; color: #1a1a1a; }
+ /* auto-fit + centered so the grid stays balanced at 2 OR 3 cards (no orphan column when a card is held) */
+ .dwcf__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 384px)); justify-content: center; gap: 24px; margin-top: 34px; }
+ @media (max-width: 680px){ .dwcf__grid { grid-template-columns: minmax(0, 420px); } }
+ .dwcf__card { position: relative; border-radius: 6px; overflow: hidden; background: #efe9df; box-shadow: 0 1px 0 rgba(0,0,0,.06); }
+ .dwcf__vidwrap { position: relative; aspect-ratio: 16/9; background:#000; }
+ .dwcf__vidwrap video { position:absolute; inset:0; width:100%; height:100%; object-fit: cover; display:block; }
+ .dwcf__play { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; cursor:pointer; background: linear-gradient(180deg, rgba(0,0,0,.05), rgba(0,0,0,.35)); transition: opacity .25s; border:0; padding:0; width:100%; }
+ .dwcf__play:focus-visible { outline: 3px solid #fff; outline-offset: -3px; }
+ .dwcf__play svg { width:64px; height:64px; filter: drop-shadow(0 2px 8px rgba(0,0,0,.4)); }
+ .dwcf__meta { padding: 18px 20px 22px; }
+ .dwcf__name { font-size: 20px; margin: 0 0 4px; color:#1a1a1a; }
+ .dwcf__sub { font-size: 13px; color:#8a8072; margin: 0 0 14px; letter-spacing:.02em; }
+ .dwcf__cta { display:inline-block; font-size: 12px; letter-spacing:.16em; text-transform:uppercase; color:#1a1a1a; text-decoration:none; border-bottom:1px solid #1a1a1a; padding-bottom:2px; }
+ .dwcf__cta:hover { color:#7a6f5f; border-color:#7a6f5f; }
+</style>
+
+<section class="dwcf">
+ <div class="dwcf__head">
+ <p class="dwcf__eyebrow">Collection Films</p>
+ <h2 class="dwcf__title">Leaf Through Our Lookbooks</h2>
+ </div>
+ <div class="dwcf__grid">
+
+ <div class="dwcf__card">
+ <div class="dwcf__vidwrap">
+ <video preload="none" playsinline controls
+ poster="https://marketing.designerwallcoverings.com/public/collections/maya-romanoff-poster.jpg">
+ <source src="https://marketing.designerwallcoverings.com/reels/maya-romanoff-flipbook.mp4" type="video/mp4">
+ </video>
+ <button type="button" class="dwcf__play" onclick="var v=this.previousElementSibling; v.play(); this.style.display='none';" aria-label="Play video">
+ <svg viewBox="0 0 64 64" fill="none" aria-hidden="true"><circle cx="32" cy="32" r="31" fill="rgba(255,255,255,.92)"/><path d="M26 20l20 12-20 12z" fill="#1a1a1a"/></svg>
+ </button>
+ </div>
+ <div class="dwcf__meta">
+ <h3 class="dwcf__name">Maya Romanoff</h3>
+ <p class="dwcf__sub">A Study in Materials — beadwork, marquetry, metallic luster & natural fiber</p>
+ <a class="dwcf__cta" href="/collections/maya-romanoff">Shop the Collection</a>
+ </div>
+ </div>
+
+ <div class="dwcf__card">
+ <div class="dwcf__vidwrap">
+ <video preload="none" playsinline controls
+ poster="https://marketing.designerwallcoverings.com/public/collections/glitter-walls-poster.jpg">
+ <source src="https://marketing.designerwallcoverings.com/reels/glitter-walls-flipbook.mp4" type="video/mp4">
+ </video>
+ <button type="button" class="dwcf__play" onclick="var v=this.previousElementSibling; v.play(); this.style.display='none';" aria-label="Play video">
+ <svg viewBox="0 0 64 64" fill="none" aria-hidden="true"><circle cx="32" cy="32" r="31" fill="rgba(255,255,255,.92)"/><path d="M26 20l20 12-20 12z" fill="#1a1a1a"/></svg>
+ </button>
+ </div>
+ <div class="dwcf__meta">
+ <h3 class="dwcf__name">Glitter Walls</h3>
+ <p class="dwcf__sub">Bring the Sparkle Home — sequins & glass beads in gold, silver, black & jewel tones</p>
+ <a class="dwcf__cta" href="/collections/glitter-walls">Shop the Collection</a>
+ </div>
+ </div>
+
+ <div class="dwcf__card">
+ <div class="dwcf__vidwrap">
+ <video preload="none" playsinline controls
+ poster="https://marketing.designerwallcoverings.com/public/collections/majilite-metallics-poster.jpg">
+ <source src="https://marketing.designerwallcoverings.com/reels/majilite-metallics-flipbook.mp4" type="video/mp4">
+ </video>
+ <button type="button" class="dwcf__play" onclick="var v=this.previousElementSibling; v.play(); this.style.display='none';" aria-label="Play video">
+ <svg viewBox="0 0 64 64" fill="none" aria-hidden="true"><circle cx="32" cy="32" r="31" fill="rgba(255,255,255,.92)"/><path d="M26 20l20 12-20 12z" fill="#1a1a1a"/></svg>
+ </button>
+ </div>
+ <div class="dwcf__meta">
+ <h3 class="dwcf__name">Majilite Metallics</h3>
+ <p class="dwcf__sub">A Colorway Story in Four Metals — faux-leather metallics on walls & furniture</p>
+ <a class="dwcf__cta" href="/collections/majilite">Shop the Collection</a>
+ </div>
+ </div>
+
+ </div>
+</section>
← 3f14cc3 TK-10427: stage 2-card Collection Films ship artifacts (Path
·
back to Dw Marketing Reels
·
auto-data-snapshot: 2026-09-01T07:13:20 (3 data files) — dat 5b23029 →