← back to Dw Signup Fulfillment
Guide designers from full application to account setup and email sign-in
01593e3a55af15d57ac40b43e89e85aa1a31a17c · 2026-09-04 23:04:42 -0700 · Steve Abrams
Files touched
A theme-proposals/designer-signin-tk11283/snippets/dw-signin-modal.liquidA theme-proposals/designer-signin-tk11283/snippets/dw-trade-apply.liquidA verification/tk11283/REVIEW.mdA verification/tk11283/approval-failure-reproduction.jsonA verification/tk11283/chrome-account-modal.pngA verification/tk11283/chrome-account-ready.pngA verification/tk11283/chrome-mobile-modal.pngA verification/tk11283/chrome-mobile-ready.pngA verification/tk11283/e2e-proof.jsonA verification/tk11283/journey.cjsA verification/tk11283/journey.jsonA verification/tk11283/live-read.jsonA verification/tk11283/live-snippets__dw-samples-banner.liquidA verification/tk11283/live-snippets__dw-signin-modal.liquidA verification/tk11283/live-snippets__dw-trade-apply.liquidA verification/tk11283/publish-theme.cjsA verification/tk11283/read-live.cjsA verification/tk11283/recordings/chrome/1c01e8532d6e06b087a1eb217eabdcb6.webmA verification/tk11283/recordings/chrome/9f2f793fd112a1d5e043d6a26a0dbf26.webmA verification/tk11283/recordings/chrome/a2d88778155f3f0de23998d72c823b9d.webmA verification/tk11283/recordings/chrome/fc95404fb32883e78896d007578c5075.webmA verification/tk11283/recordings/safari/page@0538ec3b68a8fca25c18a66abef4b23f.webmA verification/tk11283/recordings/safari/page@a75282272649003c309db0daf925c3d2.webmA verification/tk11283/safari-account-modal.pngA verification/tk11283/safari-account-ready.pngA verification/tk11283/safari-mobile-modal.pngA verification/tk11283/safari-mobile-ready.png
Diff
commit 01593e3a55af15d57ac40b43e89e85aa1a31a17c
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Sep 4 23:04:42 2026 -0700
Guide designers from full application to account setup and email sign-in
---
.../snippets/dw-signin-modal.liquid | 62 +++++
.../snippets/dw-trade-apply.liquid | 260 +++++++++++++++++++++
verification/tk11283/REVIEW.md | 43 ++++
.../tk11283/approval-failure-reproduction.json | 14 ++
verification/tk11283/chrome-account-modal.png | Bin 0 -> 132961 bytes
verification/tk11283/chrome-account-ready.png | Bin 0 -> 122620 bytes
verification/tk11283/chrome-mobile-modal.png | Bin 0 -> 67040 bytes
verification/tk11283/chrome-mobile-ready.png | Bin 0 -> 60284 bytes
verification/tk11283/e2e-proof.json | 251 ++++++++++++++++++++
verification/tk11283/journey.cjs | 111 +++++++++
verification/tk11283/journey.json | 142 +++++++++++
verification/tk11283/live-read.json | 69 ++++++
.../live-snippets__dw-samples-banner.liquid | 28 +++
.../tk11283/live-snippets__dw-signin-modal.liquid | 190 +++++++++++++++
.../tk11283/live-snippets__dw-trade-apply.liquid | 220 +++++++++++++++++
verification/tk11283/publish-theme.cjs | 62 +++++
verification/tk11283/read-live.cjs | 41 ++++
.../chrome/1c01e8532d6e06b087a1eb217eabdcb6.webm | Bin 0 -> 225722 bytes
.../chrome/9f2f793fd112a1d5e043d6a26a0dbf26.webm | Bin 0 -> 220513 bytes
.../chrome/a2d88778155f3f0de23998d72c823b9d.webm | Bin 0 -> 242034 bytes
.../chrome/fc95404fb32883e78896d007578c5075.webm | Bin 0 -> 230378 bytes
.../page@0538ec3b68a8fca25c18a66abef4b23f.webm | Bin 0 -> 240558 bytes
.../page@a75282272649003c309db0daf925c3d2.webm | Bin 0 -> 67684 bytes
verification/tk11283/safari-account-modal.png | Bin 0 -> 235876 bytes
verification/tk11283/safari-account-ready.png | Bin 0 -> 145707 bytes
verification/tk11283/safari-mobile-modal.png | Bin 0 -> 90315 bytes
verification/tk11283/safari-mobile-ready.png | Bin 0 -> 75688 bytes
27 files changed, 1493 insertions(+)
diff --git a/theme-proposals/designer-signin-tk11283/snippets/dw-signin-modal.liquid b/theme-proposals/designer-signin-tk11283/snippets/dw-signin-modal.liquid
new file mode 100644
index 0000000..0591c7a
--- /dev/null
+++ b/theme-proposals/designer-signin-tk11283/snippets/dw-signin-modal.liquid
@@ -0,0 +1,62 @@
+{%- comment -%} TK-11283: one complete designer application, then account setup and Shopify email-code sign-in. {%- endcomment -%}
+<style>
+ .dwsm-overlay{position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:99999;display:none;align-items:flex-start;justify-content:center;padding:5vh 16px;overflow-y:auto;font-family:var(--element-text-font-family--body,system-ui,sans-serif)}
+ .dwsm-overlay.dwsm-open{display:flex}.dwsm-card{box-sizing:border-box;width:100%;max-width:480px;background:#fff;color:#29251e;padding:40px 28px 28px;box-shadow:0 8px 44px rgba(0,0,0,.28);position:relative}
+ .dwsm-close{position:absolute;top:5px;right:8px;width:44px;height:44px;background:none;border:0;font-size:28px;cursor:pointer;color:#29251e}
+ .dwsm-card h2{font:400 28px/1.2 Georgia,serif;margin:0 0 14px;text-transform:none}.dwsm-card h3{font-family:inherit;font-weight:600;font-size:17px;line-height:1.4;margin:0 0 8px;text-transform:none}.dwsm-card p{font-size:14px;line-height:1.6;margin:8px 0 18px}
+ .dwsm-action{box-sizing:border-box;display:block;width:100%;padding:14px 18px;border:1px solid #29251e;background:#29251e;color:#fff!important;text-decoration:none;text-align:center;font-family:inherit;font-weight:600;font-size:14px;line-height:1.3;cursor:pointer;min-height:48px}
+ .dwsm-action--quiet{background:#fff;color:#29251e!important}.dwsm-section{border-top:1px solid #ddd4c8;margin-top:24px;padding-top:24px}.dwsm-card a:focus-visible,.dwsm-card button:focus-visible{outline:3px solid #9b703b;outline-offset:3px}
+</style>
+<div class="dwsm-overlay" id="dw-signin" data-dwsm-overlay>
+ <div class="dwsm-card" role="dialog" aria-modal="true" aria-labelledby="dwsmTitle" tabindex="-1">
+ <button class="dwsm-close" type="button" data-dwsm-close aria-label="Close">×</button>
+ {%- if customer -%}
+ <h2 id="dwsmTitle">Your account</h2>
+ <p>You’re signed in as {{ customer.email | escape }}.</p>
+ <a class="dwsm-action" href="{{ routes.account_url }}">View account & orders</a>
+ {%- if customer.tags contains 'trade_approved' -%}
+ <div class="dwsm-section"><h3>Your trade account is active</h3><p>Your unlimited complimentary samples apply automatically while you’re signed in.</p><a class="dwsm-action dwsm-action--quiet" href="{{ routes.all_products_collection_url }}">Start sourcing</a></div>
+ {%- else -%}
+ <div class="dwsm-section"><h3>Design professional?</h3><p>Complete the trade application using this account’s email. Trade benefits start after our team approves your application.</p><a class="dwsm-action dwsm-action--quiet" data-dwsm-designer href="/pages/trade-only-benefits#dwTradeApplication">Complete the designer application</a></div>
+ {%- endif -%}
+ {%- else -%}
+ <h2 id="dwsmTitle">Welcome back</h2>
+ <p>Retail customers and designers: sign in with your original account email to keep your orders and benefits together. No password needed.</p>
+ <a class="dwsm-action" data-dwsm-login="{{ routes.account_login_url }}" href="{{ routes.account_login_url }}">Sign in to your existing account</a>
+ <div class="dwsm-section">
+ <h3>New designer account</h3>
+ <p>Fill out the trade form. We’ll create or match your account, then guide you to sign in with an email code. Unlimited complimentary samples begin after approval.</p>
+ <a class="dwsm-action" data-dwsm-designer href="/pages/trade-only-benefits#dwTradeApplication">Complete the designer application</a>
+ </div>
+ <div class="dwsm-section">
+ <h3>New retail account</h3>
+ <p>Create your account and confirm your email for 3 lifetime complimentary samples. Sign in when shopping; your remaining allowance applies at checkout.</p>
+ <a class="dwsm-action dwsm-action--quiet" data-dwsm-login="{{ routes.account_login_url }}" href="{{ routes.account_login_url }}">Create a retail account</a>
+ </div>
+ {%- endif -%}
+ </div>
+</div>
+<script>
+(function(){
+ var overlay=document.getElementById('dw-signin');if(!overlay)return;
+ var card=overlay.querySelector('[role="dialog"]');var previousFocus;var previousOverflow='';
+ function open(trigger){if(overlay.classList.contains('dwsm-open'))return;previousFocus=trigger||document.activeElement;previousOverflow=document.body.style.overflow;overlay.classList.add('dwsm-open');document.body.style.overflow='hidden';overlay.querySelector('[data-dwsm-close]').focus();}
+ function close(){if(!overlay.classList.contains('dwsm-open'))return;overlay.classList.remove('dwsm-open');document.body.style.overflow=previousOverflow;if(previousFocus&&previousFocus.isConnected)previousFocus.focus();}
+ document.addEventListener('click',function(event){
+ var trigger=event.target.closest('[data-dw-signin],a[href="#dw-signin"],a[href$="#dw-signin"]');
+ if(trigger){event.preventDefault();open(trigger);return;}
+ if(event.target.closest('[data-dwsm-close]')||event.target===overlay){close();return;}
+ if(event.target.closest('[data-dwsm-designer]')){close();}
+ });
+ document.addEventListener('keydown',function(event){
+ if(!overlay.classList.contains('dwsm-open'))return;
+ if(event.key==='Escape'){event.preventDefault();close();return;}
+ if(event.key==='Tab'){
+ var items=Array.from(card.querySelectorAll('a[href],button:not([disabled]),[tabindex="0"]'));var first=items[0];var last=items[items.length-1];
+ if(event.shiftKey&&(document.activeElement===first||!card.contains(document.activeElement))){event.preventDefault();last.focus();}
+ else if(!event.shiftKey&&(document.activeElement===last||!card.contains(document.activeElement))){event.preventDefault();first.focus();}
+ }
+ });
+ if(window.location.hash==='#dw-signin')open();
+})();
+</script>
diff --git a/theme-proposals/designer-signin-tk11283/snippets/dw-trade-apply.liquid b/theme-proposals/designer-signin-tk11283/snippets/dw-trade-apply.liquid
new file mode 100644
index 0000000..6cd4c28
--- /dev/null
+++ b/theme-proposals/designer-signin-tk11283/snippets/dw-trade-apply.liquid
@@ -0,0 +1,260 @@
+{%- comment -%} DW-TRADE-APPLY v1 — benefits-first trade application and existing-account entry. {%- endcomment -%}
+<!-- DW-TRADE-APPLY v1 -->
+{%- assign dw_trade_is_approved = false -%}
+{%- if customer and customer.tags contains 'trade_approved' -%}{%- assign dw_trade_is_approved = true -%}{%- endif -%}
+{%- assign dw_room_day = 'now' | date: '%j' | plus: 0 | modulo: 4 -%}
+{%- case dw_room_day -%}
+ {%- when 0 -%}
+ {%- assign dw_room_url = 'https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Dig-4350115_room_setting_9dfcbae3-3159-41ad-959b-6999c665fc90.jpg?v=1756872231' -%}
+ {%- assign dw_room_alt = 'DW Bespoke DIG wallcovering in a vintage-inspired lounge' -%}
+ {%- when 1 -%}
+ {%- assign dw_room_url = 'https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Dig-74757_room_setting.jpg?v=1756870908' -%}
+ {%- assign dw_room_alt = 'DW Bespoke DIG floral wallcovering in a colorful sitting room' -%}
+ {%- when 2 -%}
+ {%- assign dw_room_url = 'https://cdn.shopify.com/s/files/1/0015/4117/7456/products/Dig-7320421_room_settingVeriPeri.jpg?v=1756707586' -%}
+ {%- assign dw_room_alt = 'DW Bespoke DIG botanical lattice wallcovering in a dining room' -%}
+ {%- else -%}
+ {%- assign dw_room_url = 'https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/Dig-540002-roomsetting_62674c3c-b59d-4d36-aa8a-b7a696cbbb51.jpg?v=1774040040' -%}
+ {%- assign dw_room_alt = 'DW Bespoke DIG harlequin wallcovering in a collected powder room' -%}
+{%- endcase -%}
+{%- capture dw_existing_login_url -%}{{ routes.account_login_url }}{% if routes.account_login_url contains '?' %}&{% else %}?{% endif %}return_url={{ request.path | url_encode }}{%- endcapture -%}
+<main class="dw-ta" aria-labelledby="dwTaTitle">
+ <section class="dw-ta-hero">
+ <div class="dw-ta-hero__media" role="img" aria-label="{{ dw_room_alt | escape }}" data-dw-daily-room="{{ dw_room_day }}" style="--dw-ta-room:url('{{ dw_room_url }}')"></div>
+ <div class="dw-ta-hero__copy">
+ <p class="dw-ta-eyebrow">Designer Wallcoverings · Trade program</p>
+ <h1 id="dwTaTitle">A better way to source the wall.</h1>
+ <p class="dw-ta-deck">For interior designers, architects, hospitality teams, and qualified design professionals. Apply once for a project-ready account with unlimited complimentary samples.</p>
+ <div class="dw-ta-actions">
+ <a class="dw-ta-button dw-ta-button--dark" href="#dwTradeApplication">Apply for trade</a>
+ {%- if customer -%}
+ <a class="dw-ta-button dw-ta-button--quiet" href="{{ routes.account_url }}">View my account</a>
+ {%- else -%}
+ <a class="dw-ta-button dw-ta-button--quiet" href="{{ dw_existing_login_url }}" data-dw-returning>Existing account sign in</a>
+ {%- endif -%}
+ </div>
+ <p class="dw-ta-note">Already shopped with us? Sign in with the same email to retain your account and order history—do not create a second account.</p>
+ </div>
+ </section>
+
+ <section class="dw-ta-benefits" aria-labelledby="dwTaBenefits">
+ <div class="dw-ta-heading">
+ <p class="dw-ta-eyebrow">Trade privileges</p>
+ <h2 id="dwTaBenefits">Made for material decisions.</h2>
+ </div>
+ <div class="dw-ta-benefit-grid">
+ <article><span>01</span><h3>Unlimited samples</h3><p>Approved designers receive complimentary sample pricing automatically while signed in.</p></article>
+ <article><span>02</span><h3>Project sourcing</h3><p>Bring us a reference, performance brief, or hard-to-find pattern. Our specialists help narrow the field.</p></article>
+ <article><span>03</span><h3>Residential + contract</h3><p>Source decorative collections alongside Type II, acoustic, hospitality, and commercial surfaces.</p></article>
+ <article><span>04</span><h3>A real design desk</h3><p>Get support from people who understand repeats, grounds, yardage, lead times, and installation.</p></article>
+ </div>
+ </section>
+
+ <section class="dw-ta-apply" id="dwTradeApplication" aria-labelledby="dwTaApplyTitle">
+ <aside class="dw-ta-apply__intro">
+ <p class="dw-ta-eyebrow">Trade application</p>
+ <h2 id="dwTaApplyTitle">Tell us about your practice.</h2>
+ <p>Complete the form below. We’ll create your account or match your existing account, then you can sign in with a code sent to your email.</p>
+ <ol class="dw-ta-steps" aria-label="Designer account steps"><li>Complete your trade application</li><li>Create or match your account</li><li>Sign in with your email code</li></ol>
+ <p>Our team reviews your application. Trade benefits and unlimited complimentary samples begin after approval.</p>
+ <div class="dw-ta-existing">
+ <strong>Existing customer?</strong>
+ <span>Use your original email so your orders and account stay together.</span>
+ {%- if customer -%}
+ <a href="{{ routes.account_url }}">View your existing account ›</a>
+ {%- else -%}
+ <a href="{{ dw_existing_login_url }}" data-dw-returning>Sign in to your existing account ›</a>
+ {%- endif -%}
+ </div>
+ </aside>
+
+ <div class="dw-ta-form-wrap">
+ {%- if dw_trade_is_approved -%}
+ <div class="dw-ta-approved" role="status">
+ <p class="dw-ta-eyebrow">Trade account active</p>
+ <h3>You’re already approved.</h3>
+ <p>Your unlimited complimentary sample benefit applies automatically while you are signed in.</p>
+ <a class="dw-ta-button dw-ta-button--dark" href="{{ routes.all_products_collection_url }}">Start sourcing</a>
+ </div>
+ {%- else -%}
+ <form class="dw-ta-form" id="dwTradeForm" data-customer-email="{{ customer.email | escape }}" novalidate>
+ <div class="dw-ta-field dw-ta-field--wide">
+ <label for="dwTaName">Your name <span aria-hidden="true">*</span></label>
+ <input id="dwTaName" name="contact_name" type="text" autocomplete="name" required>
+ </div>
+ <div class="dw-ta-field">
+ <label for="dwTaEmail">Work email <span aria-hidden="true">*</span></label>
+ <input id="dwTaEmail" name="email" type="email" autocomplete="email" value="{{ customer.email | escape }}" required>
+ </div>
+ <div class="dw-ta-field">
+ <label for="dwTaPhone">Phone <span aria-hidden="true">*</span></label>
+ <input id="dwTaPhone" name="phone" type="tel" autocomplete="tel" required>
+ </div>
+ <div class="dw-ta-field dw-ta-field--wide">
+ <label for="dwTaBusiness">Studio or business name <span aria-hidden="true">*</span></label>
+ <input id="dwTaBusiness" name="business_name" type="text" autocomplete="organization" required>
+ </div>
+ <div class="dw-ta-field">
+ <label for="dwTaRole">Professional role <span aria-hidden="true">*</span></label>
+ <select id="dwTaRole" name="professional_role" required>
+ <option value="">Select one</option><option>Interior designer</option><option>Architect</option><option>Hospitality / contract</option><option>Set decorator</option><option>Purchasing agent</option><option>Installer / workroom</option><option>Other design professional</option>
+ </select>
+ </div>
+ <div class="dw-ta-field">
+ <label for="dwTaWebsite">Website or portfolio</label>
+ <input id="dwTaWebsite" name="website" type="url" autocomplete="url" placeholder="https://">
+ </div>
+ <div class="dw-ta-field">
+ <label for="dwTaLocation">City + state <span aria-hidden="true">*</span></label>
+ <input id="dwTaLocation" name="location" type="text" autocomplete="address-level2" required>
+ </div>
+ <div class="dw-ta-field">
+ <label for="dwTaCredential">Resale certificate / license</label>
+ <input id="dwTaCredential" name="resale_cert" type="text">
+ </div>
+ <div class="dw-ta-field dw-ta-field--wide">
+ <label for="dwTaProjects">What kinds of projects are you sourcing?</label>
+ <textarea id="dwTaProjects" name="project_types" rows="3" placeholder="Residential, hospitality, workplace…"></textarea>
+ </div>
+ <div class="dw-ta-field dw-ta-field--wide dw-ta-consent">
+ <label><input name="terms_acknowledged" type="checkbox" value="yes" required> <span>I certify that I am applying on behalf of a design-related business and agree to the <a href="/pages/privacy-policy">privacy policy</a>.</span></label>
+ </div>
+ <div class="dw-ta-field dw-ta-field--wide dw-ta-consent dw-ta-sms-consent">
+ <label for="dwTaSmsConsent">
+ <input id="dwTaSmsConsent" name="sms_marketing_consent" type="checkbox" value="yes">
+ <span>Yes, I agree to receive recurring automated promotional and personalized marketing text messages from Designer Wallcoverings at the mobile number provided. Consent is not a condition of purchase. Message frequency varies. Message and data rates may apply. Reply STOP to opt out or HELP for help. We honor opt-out requests and applicable Do Not Call requests; if you add this number to a Do Not Call list, please also reply STOP or <a href="/pages/contact-us">contact us</a> so we can promptly update our records. See our <a href="/pages/sms-terms">SMS Terms</a> and <a href="/pages/privacy-policy">Privacy Policy</a>.</span>
+ </label>
+ <p class="dw-ta-consent-note">Leave this box unchecked if you do not want marketing texts. We may still contact you about this application or transactions where permitted by law.</p>
+ <details class="dw-ta-sms-terms" id="dwSmsTerms">
+ <summary>SMS Terms</summary>
+ <p>You must be at least 18 and the account holder or authorized user of the mobile number. Message frequency varies; message and data rates may apply. Carriers are not liable for delayed or undelivered messages. Reply STOP to opt out or HELP for help. After STOP, we may send one confirmation. Opting out of marketing does not prevent permitted non-marketing messages about an application, order, account, appointment, or other transaction. Tell us before changing or transferring your number. We honor valid consent withdrawals and applicable Do Not Call requests; if you add your number to a Do Not Call list after opting in, please also reply STOP or <a href="/pages/contact-us">contact us</a> so we can promptly update our records. This notice does not limit our responsibility to honor applicable law or a valid opt-out request.</p>
+ </details>
+ </div>
+ <div class="dw-ta-submit dw-ta-field--wide">
+ <button class="dw-ta-button dw-ta-button--dark" type="submit">Submit application & set up account</button>
+ <p id="dwTradeStatus" class="dw-ta-status" aria-live="polite"></p>
+ </div>
+ </form>
+ <section id="dwTradeNext" class="dw-ta-approved" aria-labelledby="dwTradeNextTitle" tabindex="-1" hidden>
+ <p class="dw-ta-eyebrow">Application received</p>
+ <h3 id="dwTradeNextTitle"></h3>
+ <p id="dwTradeAccountMessage"></p>
+ <p>Trade approval is still pending. We’ll email you when your trade benefits and unlimited complimentary samples are active.</p>
+ <a id="dwTradeLogin" class="dw-ta-button dw-ta-button--dark" href="{{ routes.account_login_url }}" referrerpolicy="no-referrer">Sign in with your email code</a>
+ <p>Need help? <a href="tel:+18883734564">Call (888) 373-4564</a>.</p>
+ </section>
+ {%- endif -%}
+ </div>
+ </section>
+</main>
+
+{%- unless customer -%}
+ <dialog class="dw-returning" id="dwReturningDialog" aria-labelledby="dwReturningTitle">
+ <button class="dw-returning__close" type="button" aria-label="Close returning client sign in" data-dw-returning-close>×</button>
+ <div class="dw-returning__room" role="img" aria-label="{{ dw_room_alt | escape }}" style="--dw-ta-room:url('{{ dw_room_url }}')"></div>
+ <div class="dw-returning__body">
+ <p class="dw-ta-eyebrow">Returning client</p>
+ <h2 id="dwReturningTitle">Welcome back.</h2>
+ <p>Use the email from your original Designer Wallcoverings account. Shopify will securely reconnect you—there is no new account to create.</p>
+ <ul>
+ <li>Your past orders stay with you</li>
+ <li>Your retail sample balance is preserved</li>
+ <li>Approved trade privileges remain attached</li>
+ </ul>
+ <a class="dw-ta-button dw-ta-button--dark" href="{{ dw_existing_login_url }}">Continue to secure sign in</a>
+ <button class="dw-returning__new" type="button" data-dw-returning-close>New to DW? Return to the application</button>
+ </div>
+ </dialog>
+{%- endunless -%}
+
+<style>
+ .dw-ta{--ta-ink:#181713;--ta-paper:#f3efe7;--ta-line:#d8d0c4;--ta-bronze:#795833;margin-top:16px;color:var(--ta-ink);background:#fff;font-family:var(--element-text-font-family--body,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif)}
+ .dw-ta *{box-sizing:border-box}.visual-search-clickable{display:none!important}.dw-ta-hero{display:grid;grid-template-columns:minmax(0,1.08fr) minmax(420px,.92fr);min-height:690px;background:var(--ta-paper)}
+ .dw-ta-hero__media{min-height:620px;background-image:linear-gradient(0deg,rgba(20,18,14,.12),rgba(20,18,14,.02)),var(--dw-ta-room);background-position:center;background-size:cover;background-repeat:no-repeat}
+ .dw-ta-hero__copy{display:flex;flex-direction:column;justify-content:center;padding:clamp(48px,7vw,108px)}
+ .dw-ta-eyebrow{margin:0 0 18px;color:var(--ta-bronze);font-size:11px;font-weight:700;letter-spacing:.18em;text-transform:uppercase}
+ .dw-ta h1,.dw-ta h2,.dw-ta h3{font-family:var(--element-text-font-family--heading,Georgia,serif);font-weight:400;text-transform:none}.dw-ta h1{max-width:640px;margin:0;font-size:clamp(48px,5.7vw,82px);line-height:.98;letter-spacing:-.035em}.dw-ta-deck{max-width:600px;margin:28px 0 0;font-size:clamp(17px,1.4vw,20px);line-height:1.65;color:#504c45}
+ .dw-ta-actions{display:flex;flex-wrap:wrap;gap:12px;margin-top:34px}.dw-ta-button{display:inline-flex;min-height:50px;align-items:center;justify-content:center;border:1px solid var(--ta-ink);padding:13px 24px;background:transparent;color:var(--ta-ink);font:700 11px/1.2 var(--element-text-font-family--body,sans-serif);letter-spacing:.12em;text-decoration:none;text-transform:uppercase;cursor:pointer}.dw-ta-button--dark{background:var(--ta-ink);color:#fff}.dw-ta-button--quiet{background:transparent}.dw-ta-note{max-width:570px;margin:18px 0 0;font-size:13px;line-height:1.55;color:#6d675e}
+ .dw-ta-benefits{padding:clamp(72px,9vw,128px) clamp(24px,7vw,110px)}.dw-ta-heading{max-width:700px;margin-bottom:52px}.dw-ta-heading h2,.dw-ta-apply__intro h2{font-size:clamp(38px,4.3vw,62px);line-height:1.04;margin:0}.dw-ta-benefit-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(22px,3vw,46px)}.dw-ta-benefit-grid article{border-top:1px solid var(--ta-line);padding-top:20px}.dw-ta-benefit-grid article>span{color:var(--ta-bronze);font-size:11px;letter-spacing:.15em}.dw-ta-benefit-grid h3{font-size:24px;line-height:1.15;margin:17px 0 12px}.dw-ta-benefit-grid p{margin:0;color:#625d55;line-height:1.65}
+ .dw-ta-apply{display:grid;grid-template-columns:minmax(300px,.75fr) minmax(0,1.25fr);gap:clamp(42px,8vw,130px);padding:clamp(70px,9vw,130px) clamp(24px,7vw,110px);background:var(--ta-paper)}.dw-ta-apply__intro>p:not(.dw-ta-eyebrow){max-width:480px;color:#5c574f;line-height:1.7}.dw-ta-existing{margin-top:40px;padding-top:25px;border-top:1px solid var(--ta-line)}.dw-ta-existing strong,.dw-ta-existing span,.dw-ta-existing a{display:block}.dw-ta-existing span{margin:8px 0 12px;color:#5c574f;line-height:1.55}.dw-ta-existing a{color:var(--ta-ink);font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;text-underline-offset:4px}
+ .dw-ta-form{display:grid;grid-template-columns:1fr 1fr;gap:22px 18px}.dw-ta-field--wide{grid-column:1/-1}.dw-ta-field label{display:block;margin-bottom:8px;font-size:12px;font-weight:700;letter-spacing:.06em}.dw-ta-field input,.dw-ta-field select,.dw-ta-field textarea{width:100%;min-height:50px;border:1px solid #aaa194;border-radius:0;background:#fff;color:var(--ta-ink);padding:12px 13px;font:16px/1.4 inherit}.dw-ta .selected-text{color:#5f5f5f}.dw-ta-field textarea{resize:vertical}.dw-ta-field input:focus,.dw-ta-field select:focus,.dw-ta-field textarea:focus{outline:3px solid rgba(121,88,51,.25);border-color:var(--ta-bronze)}.dw-ta-consent label{display:flex;gap:10px;font-weight:400;letter-spacing:0;line-height:1.5}.dw-ta-consent input{width:18px;min-height:18px;margin-top:2px;flex:0 0 auto}.dw-ta-consent a{color:inherit}.dw-ta-sms-consent{padding-top:20px;border-top:1px solid var(--ta-line)}.dw-ta-consent-note{margin:8px 0 0 28px;color:#6d675e;font-size:12px;line-height:1.5}.dw-ta-sms-terms{margin:14px 0 0 28px;color:#5c574f;font-size:12px;line-height:1.55}.dw-ta-sms-terms summary{cursor:pointer;font-weight:700;text-decoration:underline;text-underline-offset:3px}.dw-ta-sms-terms p{margin:10px 0 0}.dw-ta-submit{display:flex;align-items:center;gap:18px;flex-wrap:wrap}.dw-ta-status{margin:0;font-size:14px}.dw-ta-status[data-state="error"]{color:#982b23}.dw-ta-status[data-state="success"]{color:#32613d}.dw-ta-approved{padding:clamp(36px,6vw,72px);background:#fff;border:1px solid var(--ta-line)}.dw-ta-approved h3{font-size:38px;margin:0 0 14px}.dw-ta-approved p:not(.dw-ta-eyebrow){line-height:1.65;margin-bottom:25px}
+ .dw-ta a:focus-visible,.dw-ta button:focus-visible{outline:3px solid #bd8950;outline-offset:3px}
+ .dw-ta [hidden]{display:none!important}.dw-ta-steps{padding-left:24px;line-height:1.7;color:#504c45}.dw-ta-steps li{padding:4px 0}.dw-ta-approved{overflow-wrap:anywhere}
+ .dw-returning{--ta-ink:#181713;--ta-paper:#f3efe7;width:min(920px,calc(100vw - 32px));max-width:none;padding:0;border:0;background:var(--ta-paper);color:var(--ta-ink);box-shadow:0 30px 90px rgba(0,0,0,.32)}.dw-returning::backdrop{background:rgba(14,13,11,.68);backdrop-filter:blur(4px)}.dw-returning[open]{display:grid;grid-template-columns:1fr 1fr}.dw-returning__room{min-height:620px;background-image:linear-gradient(0deg,rgba(20,18,14,.08),rgba(20,18,14,.02)),var(--dw-ta-room);background-position:center;background-size:cover}.dw-returning__body{display:flex;flex-direction:column;justify-content:center;padding:clamp(38px,6vw,72px)}.dw-returning h2{margin:0 0 18px;font:400 clamp(44px,5vw,68px)/1 var(--element-text-font-family--heading,Georgia,serif);letter-spacing:-.03em}.dw-returning__body>p:not(.dw-ta-eyebrow){color:#575149;line-height:1.65}.dw-returning ul{margin:18px 0 28px;padding:0;list-style:none}.dw-returning li{padding:11px 0;border-top:1px solid #d3cabd;font-size:14px}.dw-returning li::before{content:'✓';margin-right:10px;color:#795833;font-weight:700}.dw-returning__close{position:absolute;top:14px;right:16px;width:44px;height:44px;border:0;background:rgba(255,255,255,.9);color:#181713;font-size:28px;line-height:1;cursor:pointer}.dw-returning__new{margin-top:16px;border:0;background:none;text-decoration:underline;text-underline-offset:4px;cursor:pointer;color:#4d4841}.dw-returning a:focus-visible,.dw-returning button:focus-visible{outline:3px solid #bd8950;outline-offset:3px}
+ @media(max-width:900px){.dw-ta-hero{grid-template-columns:1fr}.dw-ta-hero__media{min-height:52vh}.dw-ta-benefit-grid{grid-template-columns:1fr 1fr}.dw-ta-apply{grid-template-columns:1fr}}
+ @media(max-width:700px){.dw-returning[open]{display:block}.dw-returning__room{min-height:250px}.dw-returning__body{padding:34px 24px 38px}.dw-returning .dw-ta-button{width:100%}}
+ @media(max-width:560px){.dw-ta-hero__media{min-height:420px}.dw-ta-hero__copy{padding:48px 22px 62px}.dw-ta-actions{display:grid}.dw-ta-button{width:100%}.dw-ta-benefit-grid,.dw-ta-form{grid-template-columns:1fr}.dw-ta-field--wide{grid-column:auto}.dw-ta-submit{display:block}.dw-ta-status{margin-top:14px}.dw-ta-apply{padding-left:22px;padding-right:22px}}
+ @media(prefers-reduced-motion:reduce){.dw-ta *{scroll-behavior:auto!important;transition:none!important}}
+</style>
+
+<script>
+ document.querySelectorAll('a.logo-link').forEach(function(link){
+ if(!link.getAttribute('aria-label')) link.setAttribute('aria-label','Designer Wallcoverings home');
+ });
+ (function(){
+ var dialog=document.getElementById('dwReturningDialog');
+ if(!dialog)return;
+ document.querySelectorAll('[data-dw-returning]').forEach(function(link){link.addEventListener('click',function(event){event.preventDefault();dialog.showModal();});});
+ dialog.querySelectorAll('[data-dw-returning-close]').forEach(function(button){button.addEventListener('click',function(){dialog.close();});});
+ dialog.addEventListener('click',function(event){if(event.target===dialog)dialog.close();});
+ })();
+</script>
+
+{%- unless dw_trade_is_approved -%}
+<script>
+ (function(){
+ var form=document.getElementById('dwTradeForm');
+ var status=document.getElementById('dwTradeStatus');
+ if(!form||!status)return;
+ var submitting=false;
+ var submitted=false;
+ form.addEventListener('submit',async function(event){
+ event.preventDefault();
+ if(submitting||submitted)return;
+ status.removeAttribute('data-state');
+ if(!form.checkValidity()){form.reportValidity();status.textContent='Please complete the required fields.';status.dataset.state='error';return;}
+ var button=form.querySelector('button[type="submit"]');
+ var data=Object.fromEntries(new FormData(form).entries());
+ var smsConsent=form.querySelector('#dwTaSmsConsent');
+ data.sms_marketing_consent=Boolean(smsConsent&&smsConsent.checked);
+ data.sms_consent_disclosure_version='dw-sms-v2-2026-08-28';
+ data.sms_consent_captured_at=new Date().toISOString();
+ data.sms_consent_source=window.location.href;
+ submitting=true;button.disabled=true;button.textContent='Setting up your account…';status.textContent='Securely sending your application…';
+ try{
+ var response=await fetch('https://signup.designerwallcoverings.com/trade/apply',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(data)});
+ var result=await response.json().catch(function(){return {};});
+ if(response.status===429)throw new Error('Too many attempts. Please wait before trying again, or call (888) 373-4564. Your form is still here.');
+ if(!response.ok||result.ok!==true||!result.id||result.status!=='pending')throw new Error('We could not confirm your application. Your details are still here. Please call (888) 373-4564 for help before submitting again.');
+ submitted=true;
+ var submittedEmail=String(data.email||'').trim().toLowerCase();
+ var signedInEmail=(form.dataset.customerEmail||'').trim().toLowerCase();
+ var alreadySignedIn=signedInEmail!==''&&signedInEmail===submittedEmail;
+ var title=document.getElementById('dwTradeNextTitle');
+ var message=document.getElementById('dwTradeAccountMessage');
+ var login=document.getElementById('dwTradeLogin');
+ if(result.linked===true){
+ title.textContent=alreadySignedIn?'Your account is ready. You’re signed in.':'Your account is ready. Next, sign in.';
+ message.textContent=alreadySignedIn?'Your application is attached to the account you’re using.':'We created or matched the account for '+submittedEmail+'. Continue below to receive your one-time sign-in code. No password needed.';
+ }else{
+ title.textContent='Application saved. Account setup needs one more step.';
+ message.textContent='We saved your application, but could not confirm the account connection. Sign in with '+submittedEmail+' to create or access your account. Our team can finish connecting it; you do not need to submit another application.';
+ }
+ if(alreadySignedIn&&result.linked===true){
+ login.href='/collections/all';login.textContent='Continue browsing';
+ }else{
+ var loginUrl=new URL('/customer_authentication/login',window.location.origin);
+ loginUrl.searchParams.set('return_to','/collections/all');
+ loginUrl.searchParams.set('login_hint',submittedEmail);
+ login.href=loginUrl.toString();login.textContent='Sign in with your email code';
+ }
+ status.textContent='Application received.';status.dataset.state='success';
+ form.hidden=true;
+ var next=document.getElementById('dwTradeNext');next.hidden=false;next.focus();
+ }catch(error){status.textContent=error.message==='Failed to fetch'?'Connection interrupted. Your details are still here. Call (888) 373-4564 if you’re unsure whether your application arrived.':(error.message||'Please try again or call (888) 373-4564.');status.dataset.state='error';button.disabled=false;button.textContent='Submit application & set up account';}
+ finally{submitting=false;}
+ });
+ })();
+</script>
+{%- endunless -%}
+<!-- /DW-TRADE-APPLY -->
diff --git a/verification/tk11283/REVIEW.md b/verification/tk11283/REVIEW.md
new file mode 100644
index 0000000..0ce764c
--- /dev/null
+++ b/verification/tk11283/REVIEW.md
@@ -0,0 +1,43 @@
+# Shopify account review — TK-11283
+
+Reviewed September 4, 2026 Pacific. Store: Designer Wallcoverings. User’s clarified designer journey: **complete the form → create/match account → email-code sign-in**.
+
+## Findings and changes
+
+| Priority | Finding | Evidence / disposition |
+|---|---|---|
+| High | Old account popup accepts JSON error responses as success, including HTTP 429, and says the account is ready. | Reproduced against live page JavaScript with an intercepted response; no application submitted. Proposal removes the abbreviated popup form and routes designers to the complete application. |
+| High | Main trade application stops at a receipt message without the account/login next step. | Live `dw-trade-apply.liquid` backed up. Proposal checks HTTP status, `ok`, application ID, pending status, and `linked`; then offers same-email Shopify sign-in. |
+| High, separate backend defect | `trade.approve()` records `approved` even when entitlement tagging, rep metadata and email calls return failure. | Isolated VM reproduction: injected Shopify 500 and email 503 still returned approved and persisted approved. See `approval-failure-reproduction.json`. No production failure incidence is asserted. Requires a separate service fix, persisted entitlement verification and retry-safe notification handling. |
+| Medium | Retail popup promises an emailed discount code, although current source uses email confirmation and an automatic discount. | Proposal describes create account → confirm email → sign in; removes coupon promise. The active Function source now requires `verified-sample` for retail, so August 31 checkout proof predates the September 2 verification change and cannot certify today’s retail checkout. |
+| Medium | Signed-in retail banner shows a free-sample balance even without checking the `verified-sample` entitlement. | Live `dw-samples-banner.liquid` checks customer presence and approval tag, but not retail verification. Follow-up: show “Confirm your email to unlock samples” until verified. |
+| Medium | Designer welcome email implies login activates benefits immediately; moderation actually controls approval. Approved email gives no clickable sign-in link. | `lib/email.js` designer welcome/approved templates. Recorded for follow-up; this theme-only change makes the on-page approval boundary explicit. |
+| Medium | Retail welcome verification and Shopify’s authentication code are separate emails/actions. New designer customer creation can also trigger the retail welcome webhook. | Account creation webhook and trade application code have separate notification paths. Current delivery/timing not re-exercised. Clarify lifecycle messaging and test one new designer and one retail account. |
+| Low | Popup’s “Continue with Google” opens a second Shopify provider-selection screen. | Followed live. Google is available on Shopify, but popup button does not itself initiate Google login. Proposal uses accurate account actions. |
+
+## Intended customer experiences
+
+- **New designer:** complete name, work email, phone, business, professional role, location and required certification; optional marketing-text checkbox stays unchecked. Submission creates or matches the account through the existing signup service. Confirmed account connection shows the email-code login step. Benefits remain pending until approved.
+- **Returning designer:** sign in with original email. Approved signed-in designers see active trade benefits and “Start sourcing”; they do not reapply.
+- **Existing retail customer becoming a designer:** full application uses the original email; a matching authenticated account proceeds directly to browsing.
+- **Retail:** create/sign in, confirm the separate welcome email, then shop with the same email. Three lifetime sample allowance is represented in the Function source and order ledger. A current live checkout test remains necessary for complete assurance.
+- **Failures:** no false account-created success; keep form values; human-readable retry/support instructions. If the application is saved but account linkage failed, say so and offer sign-in without asking for another application.
+
+## Evidence and limits
+
+`live-read.json` verifies the current main theme, NEW_CUSTOMER_ACCOUNTS mode, live signup health, active sample discounts and subscribed customer/order webhook topics. Source backups have SHA-256 fingerprints. `journey.cjs` renders the exact proposed Liquid for anonymous, signed-in and approved fixtures; browser submissions are intercepted to prevent customer creation or outbound email. Screenshots and recordings accompany results in `journey.json` when all checks pass.
+
+Live hosted Shopify email-code entry is reviewed separately. No new account, customer tag change, trade approval, verification email, order or purchase is authorized by the fixture test. The earlier August 31 authenticated checkout evidence is historical and explicitly not represented as a fresh production test. This review cannot certify delivery of every benefit until those actual account/checkout boundaries and the approval failure defect are resolved.
+
+## Deployment scope and rollback
+
+Only `snippets/dw-trade-apply.liquid` and `snippets/dw-signin-modal.liquid` are proposed for main theme `145121607731`. `publish-theme.cjs` defaults to read-only preflight, checks the exact main theme and baseline asset hashes, and stops on concurrent edits. Explicit `--apply` is required to publish; `--rollback` restores the two exact baseline values only if current values match this proposal. The service, discount Function, emails and customer records are outside this publication.
+
+## Decision review
+
+DTD selected the single full form and truthful account/login sequence: Codex and Qwen voted A (2/2 valid, 2/6 available); Claude, Grok, Kimi and Muse abstained/unavailable under the zero-cost run. Mandatory Codex adversarial debate: **KEEP**. Main challenge: an application receipt must not be mistaken for successful account linkage or trade approval. The implementation checks those separately. Full run: `/tmp/dtd-tk11283-signin`.
+
+## References
+
+- [Shopify sign-in redirects and email prefill](https://shopify.dev/docs/storefronts/themes/sign-in): `login_hint` prepopulates email; `/customer_authentication/login` with relative `return_to` returns to the storefront.
+- [Shopify customer-account sign-in options](https://help.shopify.com/en/manual/customers/customer-accounts/sign-in-options): passwordless email-code authentication.
diff --git a/verification/tk11283/approval-failure-reproduction.json b/verification/tk11283/approval-failure-reproduction.json
new file mode 100644
index 0000000..e72bcdf
--- /dev/null
+++ b/verification/tk11283/approval-failure-reproduction.json
@@ -0,0 +1,14 @@
+{
+ "environment": "isolated VM, filesystem and Shopify/email stubs only",
+ "injected": {
+ "tagWrite": 500,
+ "metafieldWrite": 500,
+ "email": 503
+ },
+ "returned": {
+ "ok": true,
+ "status": "approved"
+ },
+ "persistedStatus": "approved",
+ "emailAttempts": 2
+}
diff --git a/verification/tk11283/chrome-account-modal.png b/verification/tk11283/chrome-account-modal.png
new file mode 100644
index 0000000..3d81443
Binary files /dev/null and b/verification/tk11283/chrome-account-modal.png differ
diff --git a/verification/tk11283/chrome-account-ready.png b/verification/tk11283/chrome-account-ready.png
new file mode 100644
index 0000000..190d89d
Binary files /dev/null and b/verification/tk11283/chrome-account-ready.png differ
diff --git a/verification/tk11283/chrome-mobile-modal.png b/verification/tk11283/chrome-mobile-modal.png
new file mode 100644
index 0000000..dca4f3a
Binary files /dev/null and b/verification/tk11283/chrome-mobile-modal.png differ
diff --git a/verification/tk11283/chrome-mobile-ready.png b/verification/tk11283/chrome-mobile-ready.png
new file mode 100644
index 0000000..a9296eb
Binary files /dev/null and b/verification/tk11283/chrome-mobile-ready.png differ
diff --git a/verification/tk11283/e2e-proof.json b/verification/tk11283/e2e-proof.json
new file mode 100644
index 0000000..4bcbbc2
--- /dev/null
+++ b/verification/tk11283/e2e-proof.json
@@ -0,0 +1,251 @@
+{
+ "intent": "Designer full form → create/match Shopify account → email-code login, preserving returning and approved customers",
+ "riskTier": "R4 publication; R3 account boundary",
+ "timestamp": "2026-09-05T06:04:42.735Z",
+ "environment": "Local exact Liquid proposal + live read-only Shopify sign-in handoff",
+ "staged": [
+ {
+ "key": "snippets/dw-trade-apply.liquid",
+ "sha256": "b9b5d438726345dfcc1020dbbfa0bef2a95865ba4b9394df372fb89329e9404e"
+ },
+ {
+ "key": "snippets/dw-signin-modal.liquid",
+ "sha256": "42e67a0e45ca602a2e23fd482ac2ecaefc17ab458d6440d9bfe4a206332999a0"
+ }
+ ],
+ "preconditions": {
+ "timestamp": "2026-09-05T05:38:32.101Z",
+ "theme": {
+ "id": 145121607731,
+ "name": "carnegie-color-swatch",
+ "role": "main"
+ },
+ "assets": [
+ {
+ "key": "snippets/dw-signin-modal.liquid",
+ "filename": "live-snippets__dw-signin-modal.liquid",
+ "updated_at": "2026-09-03T11:43:06-07:00",
+ "sha256": "6108eff129c244b9c96b831e14479b5626b26a8ce32a4b3d79fca36ee560f3a6"
+ },
+ {
+ "key": "snippets/dw-trade-apply.liquid",
+ "filename": "live-snippets__dw-trade-apply.liquid",
+ "updated_at": "2026-08-28T08:35:15-07:00",
+ "sha256": "131779ee00631e2c050fb825f3c38827553386d9ed52211d039eebdd012b05bb"
+ },
+ {
+ "key": "snippets/dw-samples-banner.liquid",
+ "filename": "live-snippets__dw-samples-banner.liquid",
+ "updated_at": "2026-08-31T11:01:14-07:00",
+ "sha256": "63ce9238f4e625707abefd26ce5d8cebf7ea11639843f4ff24fccdd7f80dd785"
+ }
+ ],
+ "health": {
+ "ok": true,
+ "service": "dw-signup-fulfillment",
+ "dry_run": false
+ },
+ "account": {
+ "customerAccountsV2": {
+ "customerAccountsVersion": "NEW_CUSTOMER_ACCOUNTS",
+ "url": "https://shopify.com/1541177456/account"
+ }
+ },
+ "discounts": [
+ {
+ "discount": {
+ "title": "DW Free Samples (auto)",
+ "status": "ACTIVE",
+ "appDiscountType": {
+ "functionId": "01a0475d-d202-743e-bdc8-7a659f6ff512"
+ }
+ }
+ },
+ {
+ "discount": {
+ "title": "DW Free Samples",
+ "status": "ACTIVE",
+ "appDiscountType": {
+ "functionId": "01a0475d-d202-743e-bdc8-7a659f6ff512"
+ }
+ }
+ }
+ ],
+ "webhooks": [
+ {
+ "topic": "CUSTOMERS_CREATE",
+ "origin": "https://signup.designerwallcoverings.com"
+ },
+ {
+ "topic": "ORDERS_PAID",
+ "origin": "https://signup.designerwallcoverings.com"
+ }
+ ]
+ },
+ "commands": [
+ "node verification/tk11283/read-live.cjs",
+ "node verification/tk11283/journey.cjs",
+ "node verification/tk11283/publish-theme.cjs --check",
+ "chrome_devtools new_page/evaluate on live email-prefilled Shopify sign-in"
+ ],
+ "assertions": [
+ {
+ "name": "chrome modal",
+ "verdict": "PASS",
+ "detail": "Full-form designer entry; retail/existing sign-in; focus trap and focus restoration."
+ },
+ {
+ "name": "chrome required fields",
+ "verdict": "PASS",
+ "detail": "Empty form blocked; full professional fields required; optional SMS remains unchecked."
+ },
+ {
+ "name": "chrome rate",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "chrome server",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "chrome invalid",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "chrome network",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "chrome account and login",
+ "verdict": "PASS",
+ "detail": "Confirmed pending/linked result gives encoded same-email sign-in; repeat submit suppressed."
+ },
+ {
+ "name": "chrome unlinked",
+ "verdict": "PASS",
+ "detail": "Saved application does not falsely claim the account is connected."
+ },
+ {
+ "name": "chrome signed in",
+ "verdict": "PASS",
+ "detail": "Same-email existing account continues browsing without redundant login."
+ },
+ {
+ "name": "chrome different email",
+ "verdict": "PASS",
+ "detail": "Does not assume another email belongs to the currently signed-in account."
+ },
+ {
+ "name": "chrome approved",
+ "verdict": "PASS",
+ "detail": "Approved designers see active benefits and sourcing, with no repeat application."
+ },
+ {
+ "name": "chrome mobile",
+ "verdict": "PASS",
+ "detail": "390px layout has no horizontal overflow; primary sign-in CTA visible."
+ },
+ {
+ "name": "chrome scripts",
+ "verdict": "PASS",
+ "detail": "No page JavaScript errors."
+ },
+ {
+ "name": "safari modal",
+ "verdict": "PASS",
+ "detail": "Full-form designer entry; retail/existing sign-in; focus trap and focus restoration."
+ },
+ {
+ "name": "safari required fields",
+ "verdict": "PASS",
+ "detail": "Empty form blocked; full professional fields required; optional SMS remains unchecked."
+ },
+ {
+ "name": "safari rate",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "safari server",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "safari invalid",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "safari network",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "safari account and login",
+ "verdict": "PASS",
+ "detail": "Confirmed pending/linked result gives encoded same-email sign-in; repeat submit suppressed."
+ },
+ {
+ "name": "safari unlinked",
+ "verdict": "PASS",
+ "detail": "Saved application does not falsely claim the account is connected."
+ },
+ {
+ "name": "safari signed in",
+ "verdict": "PASS",
+ "detail": "Same-email existing account continues browsing without redundant login."
+ },
+ {
+ "name": "safari different email",
+ "verdict": "PASS",
+ "detail": "Does not assume another email belongs to the currently signed-in account."
+ },
+ {
+ "name": "safari approved",
+ "verdict": "PASS",
+ "detail": "Approved designers see active benefits and sourcing, with no repeat application."
+ },
+ {
+ "name": "safari mobile",
+ "verdict": "PASS",
+ "detail": "390px layout has no horizontal overflow; primary sign-in CTA visible."
+ },
+ {
+ "name": "safari scripts",
+ "verdict": "PASS",
+ "detail": "No page JavaScript errors."
+ }
+ ],
+ "hostedHandoff": {
+ "verdict": "PASS",
+ "emailPrefill": "audit@example.invalid",
+ "origin": "https://shopify.com",
+ "path": "/authentication/1541177456/login",
+ "submitted": false
+ },
+ "independentReview": {
+ "agent": "review_designer_flow",
+ "verdict": "SHIP IT for two snippets",
+ "correlationId": "action-mtnz4d4s-31969-789c3v",
+ "minorFix": "Invalid CSS font shorthand corrected; Safari trigger focus restoration corrected and retested"
+ },
+ "criticalUntested": [
+ {
+ "boundary": "Production customer creation, OTP completion, persisted account/session and current checkout",
+ "verdict": "SKIP",
+ "reason": "No new customer records, notification emails, account approval or order submitted during review; historical proof is not a current test"
+ }
+ ],
+ "sideEffects": {
+ "customerRecords": 0,
+ "emails": 0,
+ "orders": 0
+ },
+ "cleanup": "Only controlled local fixtures; isolated review browser context retained. Stalled installer stopped.",
+ "rollback": "Exact two-asset baseline captured; publish script guards hashes and auto-restores its own writes on failed publication.",
+ "verdict": "PARTIAL: proposed theme behavior passes; full production account/benefit delivery not re-exercised"
+}
diff --git a/verification/tk11283/journey.cjs b/verification/tk11283/journey.cjs
new file mode 100644
index 0000000..1aaefa5
--- /dev/null
+++ b/verification/tk11283/journey.cjs
@@ -0,0 +1,111 @@
+'use strict';
+const fs=require('node:fs');
+const path=require('node:path');
+const http=require('node:http');
+const assert=require('node:assert/strict');
+const {Liquid}=require('/private/tmp/dw-signin-review/node_modules/liquidjs');
+const {chromium}=require('/Users/macstudio3/Projects/Designer-Wallcoverings/node_modules/playwright');
+const {webkit}=require('/Users/macstudio3/.npm-global/lib/node_modules/playwright');
+const engine=new Liquid();
+const proposal=path.resolve(__dirname,'../../theme-proposals/designer-signin-tk11283/snippets');
+const checks=[];
+function pass(name,detail){checks.push({name,verdict:'PASS',detail});console.log('PASS '+name);}
+const routes={account_url:'/account',account_login_url:'/customer_authentication/redirect?locale=en',all_products_collection_url:'/collections/all'};
+async function render(persona){
+ const customer=persona==='signedin'?{email:'audit@example.invalid',tags:[]}:persona==='approved'?{email:'audit@example.invalid',tags:['trade_approved']}:null;
+ const data={customer,routes,request:{path:'/pages/trade-only-benefits'}};
+ const trade=await engine.parseAndRender(fs.readFileSync(path.join(proposal,'dw-trade-apply.liquid'),'utf8'),data);
+ const modal=await engine.parseAndRender(fs.readFileSync(path.join(proposal,'dw-signin-modal.liquid'),'utf8'),data);
+ return '<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><style>body{margin:0}button,input,select,textarea{font-family:inherit}a{color:inherit}</style></head><body><button data-dw-signin>Account</button>'+trade+modal+'</body></html>';
+}
+async function fill(page,email='audit@example.invalid'){
+ await page.locator('[name=contact_name]').fill('DW Audit');
+ await page.locator('#dwTaEmail').fill(email);
+ await page.locator('#dwTaPhone').fill('202-555-0100');
+ await page.locator('#dwTaBusiness').fill('Intercepted Test Studio');
+ await page.locator('#dwTaRole').selectOption({label:'Interior designer'});
+ await page.locator('#dwTaWebsite').fill('https://example.invalid');
+ await page.locator('#dwTaLocation').fill('Los Angeles, CA');
+ await page.locator('[name=terms_acknowledged]').check();
+}
+async function main(){
+ const pages={};for(const persona of ['anon','signedin','approved'])pages[persona]=await render(persona);
+ const server=http.createServer((req,res)=>{res.setHeader('content-type','text/html');res.end(pages[new URL(req.url,'http://localhost').searchParams.get('persona')||'anon']);});
+ await new Promise(resolve=>server.listen(0,'127.0.0.1',resolve));
+ const origin='http://127.0.0.1:'+server.address().port;
+ try{
+ for(const [name,driver] of [['chrome',chromium],['safari',webkit]]){
+ const browser=await driver.launch({headless:true});
+ const ctx=await browser.newContext({viewport:{width:1280,height:900},recordVideo:{dir:path.join(__dirname,'recordings',name)}});
+ let mode='linked',calls=[];
+ await ctx.route('**/*',async route=>{
+ const req=route.request();
+ if(req.url().includes('signup.designerwallcoverings.com/trade/apply')){
+ calls.push(JSON.parse(req.postData()));
+ if(mode==='network')return route.abort('failed');
+ const status=mode==='rate'?429:mode==='server'?500:200;
+ const body=mode==='invalid'?{}:status!==200?{ok:false,error:'rate_limited'}:{ok:true,id:'TRADE-AUDIT-INTERCEPTED',status:'pending',linked:mode!=='unlinked'};
+ return route.fulfill({status,contentType:'application/json',body:JSON.stringify(body)});
+ }
+ if(!['GET','HEAD'].includes(req.method()))throw new Error('Blocked unexpected mutation '+req.method());
+ if(new URL(req.url()).origin!==origin)return route.abort();
+ return route.continue();
+ });
+ const page=await ctx.newPage();const errors=[];page.on('pageerror',e=>errors.push(e.message));
+ const go=async(persona='anon')=>{await page.goto(origin+'/pages/trade-only-benefits?persona='+persona);};
+ const shot=async(file)=>{await page.screenshot({path:path.join(__dirname,name+'-'+file+'.png'),fullPage:false});};
+ try{
+ await go();
+ await page.locator('[data-dw-signin]').click();
+ assert(await page.locator('#dw-signin').evaluate(x=>x.classList.contains('dwsm-open')));
+ assert.equal(await page.locator('#dw-signin form').count(),0);
+ assert.equal(await page.locator('[data-dwsm-designer]').getAttribute('href'),'/pages/trade-only-benefits#dwTradeApplication');
+ assert.equal(await page.locator('[data-dwsm-login]').count(),2);
+ await page.keyboard.press('Shift+Tab');
+ assert(await page.locator('[data-dwsm-login]').last().evaluate(x=>x===document.activeElement));
+ await page.keyboard.press('Tab');
+ assert(await page.locator('[data-dwsm-close]').evaluate(x=>x===document.activeElement));
+ await shot('account-modal');
+ await page.keyboard.press('Escape');
+ assert(await page.locator('[data-dw-signin]').evaluate(x=>x===document.activeElement));
+ pass(name+' modal','Full-form designer entry; retail/existing sign-in; focus trap and focus restoration.');
+ await page.locator('[data-dw-signin]').click();await page.locator('[data-dwsm-designer]').click();
+ assert(!await page.locator('#dw-signin').evaluate(x=>x.classList.contains('dwsm-open')));
+ const submit=()=>page.locator('#dwTradeForm button[type=submit]').click();
+ await submit();assert.equal(calls.length,0);assert.match(await page.locator('#dwTradeStatus').innerText(),/required/);
+ await fill(page);assert.equal(await page.locator('#dwTaSmsConsent').isChecked(),false);
+ pass(name+' required fields','Empty form blocked; full professional fields required; optional SMS remains unchecked.');
+ for(const failure of ['rate','server','invalid','network']){
+ mode=failure;await submit();await page.waitForFunction(()=>document.getElementById('dwTradeStatus').dataset.state==='error');
+ assert.equal(await page.locator('#dwTaEmail').inputValue(),'audit@example.invalid');
+ assert(await page.locator('#dwTradeNext').isHidden());
+ assert(await page.locator('#dwTradeForm button').isEnabled());
+ pass(name+' '+failure,'No false success; form values retained and error displayed.');
+ }
+ mode='linked';await submit();await page.locator('#dwTradeNext').waitFor({state:'visible'});
+ assert.match(await page.locator('#dwTradeNextTitle').innerText(),/account is ready/);
+ const link=new URL(await page.locator('#dwTradeLogin').getAttribute('href'));
+ assert.equal(link.pathname,'/customer_authentication/login');assert.equal(link.searchParams.get('login_hint'),'audit@example.invalid');assert.equal(link.searchParams.get('return_to'),'/collections/all');
+ assert.match(await page.locator('#dwTradeNext').innerText(),/approval is still pending/);
+ const n=calls.length;await page.locator('#dwTradeForm').evaluate(f=>f.dispatchEvent(new Event('submit',{cancelable:true})));assert.equal(calls.length,n);
+ assert.equal(calls.at(-1).sms_marketing_consent,false);
+ await shot('account-ready');pass(name+' account and login','Confirmed pending/linked result gives encoded same-email sign-in; repeat submit suppressed.');
+ await go();await fill(page);mode='unlinked';await submit();await page.locator('#dwTradeNext').waitFor({state:'visible'});
+ assert.match(await page.locator('#dwTradeNextTitle').innerText(),/needs one more step/);assert.match(await page.locator('#dwTradeAccountMessage').innerText(),/could not confirm/);
+ pass(name+' unlinked','Saved application does not falsely claim the account is connected.');
+ await go('signedin');await fill(page);mode='linked';await submit();await page.locator('#dwTradeNext').waitFor({state:'visible'});
+ assert.equal(await page.locator('#dwTradeLogin').getAttribute('href'),'/collections/all');pass(name+' signed in','Same-email existing account continues browsing without redundant login.');
+ await go('signedin');await fill(page,'another@example.invalid');await submit();await page.locator('#dwTradeNext').waitFor({state:'visible'});
+ assert.match(await page.locator('#dwTradeLogin').getAttribute('href'),/another%40example.invalid/);pass(name+' different email','Does not assume another email belongs to the currently signed-in account.');
+ await go('approved');assert.equal(await page.locator('#dwTradeForm').count(),0);await page.locator('[data-dw-signin]').click();assert.equal(await page.locator('[data-dwsm-designer]').count(),0);pass(name+' approved','Approved designers see active benefits and sourcing, with no repeat application.');
+ await page.setViewportSize({width:390,height:844});await go();await page.locator('[data-dw-signin]').click();await shot('mobile-modal');
+ assert(await page.locator('.dwsm-card').evaluate(x=>x.getBoundingClientRect().width<=window.innerWidth));
+ await page.keyboard.press('Escape');await fill(page);await submit();await page.locator('#dwTradeNext').waitFor({state:'visible'});await shot('mobile-ready');
+ assert(await page.evaluate(()=>document.documentElement.scrollWidth<=window.innerWidth+1));pass(name+' mobile','390px layout has no horizontal overflow; primary sign-in CTA visible.');
+ assert.deepEqual(errors,[]);pass(name+' scripts','No page JavaScript errors.');
+ }finally{await ctx.close();await browser.close();}
+ }
+ }finally{await new Promise(resolve=>server.close(resolve));}
+ fs.writeFileSync(path.join(__dirname,'journey.json'),JSON.stringify({timestamp:new Date().toISOString(),environment:'Local Liquid-rendered proposal; all signup submissions intercepted',checks,externalWrites:0,verdict:'PASS',limitations:['Shopify OTP completion and live account creation are not performed by this fixture test.','Cloud browser not run; zero-cost policy.']},null,2)+'\n');
+}
+main().catch(e=>{console.error(e.stack);process.exitCode=1;});
diff --git a/verification/tk11283/journey.json b/verification/tk11283/journey.json
new file mode 100644
index 0000000..5e631b5
--- /dev/null
+++ b/verification/tk11283/journey.json
@@ -0,0 +1,142 @@
+{
+ "timestamp": "2026-09-05T06:03:24.417Z",
+ "environment": "Local Liquid-rendered proposal; all signup submissions intercepted",
+ "checks": [
+ {
+ "name": "chrome modal",
+ "verdict": "PASS",
+ "detail": "Full-form designer entry; retail/existing sign-in; focus trap and focus restoration."
+ },
+ {
+ "name": "chrome required fields",
+ "verdict": "PASS",
+ "detail": "Empty form blocked; full professional fields required; optional SMS remains unchecked."
+ },
+ {
+ "name": "chrome rate",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "chrome server",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "chrome invalid",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "chrome network",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "chrome account and login",
+ "verdict": "PASS",
+ "detail": "Confirmed pending/linked result gives encoded same-email sign-in; repeat submit suppressed."
+ },
+ {
+ "name": "chrome unlinked",
+ "verdict": "PASS",
+ "detail": "Saved application does not falsely claim the account is connected."
+ },
+ {
+ "name": "chrome signed in",
+ "verdict": "PASS",
+ "detail": "Same-email existing account continues browsing without redundant login."
+ },
+ {
+ "name": "chrome different email",
+ "verdict": "PASS",
+ "detail": "Does not assume another email belongs to the currently signed-in account."
+ },
+ {
+ "name": "chrome approved",
+ "verdict": "PASS",
+ "detail": "Approved designers see active benefits and sourcing, with no repeat application."
+ },
+ {
+ "name": "chrome mobile",
+ "verdict": "PASS",
+ "detail": "390px layout has no horizontal overflow; primary sign-in CTA visible."
+ },
+ {
+ "name": "chrome scripts",
+ "verdict": "PASS",
+ "detail": "No page JavaScript errors."
+ },
+ {
+ "name": "safari modal",
+ "verdict": "PASS",
+ "detail": "Full-form designer entry; retail/existing sign-in; focus trap and focus restoration."
+ },
+ {
+ "name": "safari required fields",
+ "verdict": "PASS",
+ "detail": "Empty form blocked; full professional fields required; optional SMS remains unchecked."
+ },
+ {
+ "name": "safari rate",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "safari server",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "safari invalid",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "safari network",
+ "verdict": "PASS",
+ "detail": "No false success; form values retained and error displayed."
+ },
+ {
+ "name": "safari account and login",
+ "verdict": "PASS",
+ "detail": "Confirmed pending/linked result gives encoded same-email sign-in; repeat submit suppressed."
+ },
+ {
+ "name": "safari unlinked",
+ "verdict": "PASS",
+ "detail": "Saved application does not falsely claim the account is connected."
+ },
+ {
+ "name": "safari signed in",
+ "verdict": "PASS",
+ "detail": "Same-email existing account continues browsing without redundant login."
+ },
+ {
+ "name": "safari different email",
+ "verdict": "PASS",
+ "detail": "Does not assume another email belongs to the currently signed-in account."
+ },
+ {
+ "name": "safari approved",
+ "verdict": "PASS",
+ "detail": "Approved designers see active benefits and sourcing, with no repeat application."
+ },
+ {
+ "name": "safari mobile",
+ "verdict": "PASS",
+ "detail": "390px layout has no horizontal overflow; primary sign-in CTA visible."
+ },
+ {
+ "name": "safari scripts",
+ "verdict": "PASS",
+ "detail": "No page JavaScript errors."
+ }
+ ],
+ "externalWrites": 0,
+ "verdict": "PASS",
+ "limitations": [
+ "Shopify OTP completion and live account creation are not performed by this fixture test.",
+ "Cloud browser not run; zero-cost policy."
+ ]
+}
diff --git a/verification/tk11283/live-read.json b/verification/tk11283/live-read.json
new file mode 100644
index 0000000..b92e8cc
--- /dev/null
+++ b/verification/tk11283/live-read.json
@@ -0,0 +1,69 @@
+{
+ "timestamp": "2026-09-05T05:38:32.101Z",
+ "theme": {
+ "id": 145121607731,
+ "name": "carnegie-color-swatch",
+ "role": "main"
+ },
+ "assets": [
+ {
+ "key": "snippets/dw-signin-modal.liquid",
+ "filename": "live-snippets__dw-signin-modal.liquid",
+ "updated_at": "2026-09-03T11:43:06-07:00",
+ "sha256": "6108eff129c244b9c96b831e14479b5626b26a8ce32a4b3d79fca36ee560f3a6"
+ },
+ {
+ "key": "snippets/dw-trade-apply.liquid",
+ "filename": "live-snippets__dw-trade-apply.liquid",
+ "updated_at": "2026-08-28T08:35:15-07:00",
+ "sha256": "131779ee00631e2c050fb825f3c38827553386d9ed52211d039eebdd012b05bb"
+ },
+ {
+ "key": "snippets/dw-samples-banner.liquid",
+ "filename": "live-snippets__dw-samples-banner.liquid",
+ "updated_at": "2026-08-31T11:01:14-07:00",
+ "sha256": "63ce9238f4e625707abefd26ce5d8cebf7ea11639843f4ff24fccdd7f80dd785"
+ }
+ ],
+ "health": {
+ "ok": true,
+ "service": "dw-signup-fulfillment",
+ "dry_run": false
+ },
+ "account": {
+ "customerAccountsV2": {
+ "customerAccountsVersion": "NEW_CUSTOMER_ACCOUNTS",
+ "url": "https://shopify.com/1541177456/account"
+ }
+ },
+ "discounts": [
+ {
+ "discount": {
+ "title": "DW Free Samples (auto)",
+ "status": "ACTIVE",
+ "appDiscountType": {
+ "functionId": "01a0475d-d202-743e-bdc8-7a659f6ff512"
+ }
+ }
+ },
+ {
+ "discount": {
+ "title": "DW Free Samples",
+ "status": "ACTIVE",
+ "appDiscountType": {
+ "functionId": "01a0475d-d202-743e-bdc8-7a659f6ff512"
+ }
+ }
+ }
+ ],
+ "webhooks": [
+ {
+ "topic": "CUSTOMERS_CREATE",
+ "origin": "https://signup.designerwallcoverings.com"
+ },
+ {
+ "topic": "ORDERS_PAID",
+ "origin": "https://signup.designerwallcoverings.com"
+ }
+ ]
+}
diff --git a/verification/tk11283/live-snippets__dw-samples-banner.liquid b/verification/tk11283/live-snippets__dw-samples-banner.liquid
new file mode 100644
index 0000000..719b7ac
--- /dev/null
+++ b/verification/tk11283/live-snippets__dw-samples-banner.liquid
@@ -0,0 +1,28 @@
+{%- comment -%} DW-SAMPLES-BANNER v1 — lifetime retail allowance + approved-trade entitlement. {%- endcomment -%}
+<!-- DW-SAMPLES-BANNER v1 -->
+{%- assign dw_is_trade = false -%}
+{%- if customer and customer.tags contains 'trade_approved' -%}{%- assign dw_is_trade = true -%}{%- endif -%}
+{%- assign dw_samples_used = customer.metafields.custom.free_samples_used.value | default: 0 | plus: 0 -%}
+{%- assign dw_samples_remaining = 3 | minus: dw_samples_used -%}
+{%- if dw_samples_remaining < 0 -%}{%- assign dw_samples_remaining = 0 -%}{%- endif -%}
+{%- assign dw_login_separator = '?' -%}
+{%- if routes.account_login_url contains '?' -%}{%- assign dw_login_separator = '&' -%}{%- endif -%}
+<style>
+ .dw-sample-banner{position:relative;z-index:60;background:#1a1714;color:#faf7f2;font-family:-apple-system,'Inter',system-ui,sans-serif;font-size:13px;line-height:1.4;letter-spacing:.02em;padding:11px 20px;text-align:center;border-bottom:1px solid #2b2620}
+ .dw-sample-banner a.dw-sb-cta{color:#faf7f2;text-decoration:underline;text-underline-offset:2px;font-weight:600;white-space:nowrap}
+ .dw-sample-banner a.dw-sb-cta:hover{color:#e7c9a6}
+ .dw-sample-banner .dw-sb-lead{text-transform:uppercase;letter-spacing:.14em;font-size:11px;font-weight:600;color:#b8865c;margin-right:8px}
+ .dw-sample-banner .dw-sb-msg{display:inline}.dw-sample-banner .dw-sb-sub{opacity:.72;font-size:11px;margin-left:6px}
+ .dw-sample-banner .dw-sb-sub a.dw-sb-cta{font-weight:500}
+ @media(max-width:600px){.dw-sample-banner{font-size:12px;padding:10px 14px}.dw-sample-banner .dw-sb-lead,.dw-sample-banner .dw-sb-sub{display:block;margin:2px 0 0}}
+</style>
+<div class="dw-sample-banner" id="dwSampleBanner" role="region" aria-label="Complimentary samples offer">
+ {%- if dw_is_trade -%}
+ <span class="dw-sb-lead">Approved Trade</span><span class="dw-sb-msg">Your samples are complimentary with no limit. <a class="dw-sb-cta" href="{{ routes.all_products_collection_url }}">Choose samples ›</a></span>
+ {%- elsif customer -%}
+ <span class="dw-sb-lead">Your Account</span><span class="dw-sb-msg">You have {{ dw_samples_remaining }} of 3 lifetime complimentary samples remaining — applied automatically at checkout. <a class="dw-sb-cta" href="{{ routes.all_products_collection_url }}">Choose samples ›</a> <span class="dw-sb-sub">Design professional? <a class="dw-sb-cta" href="/pages/trade-only-benefits">Apply for unlimited samples ›</a></span></span>
+ {%- else -%}
+ <span class="dw-sb-lead">Complimentary Samples</span><span class="dw-sb-msg"><a class="dw-sb-cta" href="{{ routes.account_login_url }}{{ dw_login_separator }}return_url={{ routes.all_products_collection_url | url_encode }}">Existing customer? Sign in. New here? Create an account.</a> Retail accounts receive 3 lifetime complimentary samples. <span class="dw-sb-sub">Approved design professionals receive unlimited samples. <a class="dw-sb-cta" href="/pages/trade-only-benefits">Trade Sign In ›</a></span></span>
+ {%- endif -%}
+</div>
+<!-- /DW-SAMPLES-BANNER -->
diff --git a/verification/tk11283/live-snippets__dw-signin-modal.liquid b/verification/tk11283/live-snippets__dw-signin-modal.liquid
new file mode 100644
index 0000000..a92c473
--- /dev/null
+++ b/verification/tk11283/live-snippets__dw-signin-modal.liquid
@@ -0,0 +1,190 @@
+{% comment %} DW sign-in popup — returning clients sign in first (passwordless, email-code); new visitors choose Retail (emailed code for 3 free samples) or Professional (moderated Apply for Trade). dw_trade flag consumed in templates/customers/account.liquid. {% endcomment %}
+<style>
+ .dwsm-overlay{position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:99999;display:none;align-items:flex-start;justify-content:center;padding:6vh 16px;overflow-y:auto;font-family:Lora,serif;}
+ .dwsm-overlay.dwsm-open{display:flex;}
+ .dwsm-card{width:100%;max-width:460px;background:#fff;border:1px solid #e4e4e4;border-radius:4px;padding:40px 40px 40px;box-shadow:0 8px 44px rgba(0,0,0,.28);position:relative;}
+ .dwsm-close{position:absolute;top:12px;right:16px;background:none;border:none;font-size:28px;line-height:1;color:#999;cursor:pointer;}
+ .dwsm-close:hover{color:#000;}
+ .dwsm-offer{text-align:center;margin:0 0 20px;}
+ .dwsm-offer h2{font-weight:400;font-size:1.55rem;color:#000;margin:0 0 4px;letter-spacing:.02em;}
+ .dwsm-offer p{font-size:.86rem;color:#787878;margin:0;}
+ .dwsm-toggle{display:flex;gap:10px;margin:0 0 24px;}
+ .dwsm-opt{flex:1;text-align:center;border:1px solid #e4e4e4;border-radius:4px;padding:13px 8px;cursor:pointer;transition:all .15s ease;background:#fff;}
+ .dwsm-opt:hover{border-color:#b08212;}
+ .dwsm-opt.active{border-color:#b08212;background:#faf6ec;box-shadow:0 0 0 1px #b08212;}
+ .dwsm-opt .t{display:block;font-size:.8rem;text-transform:uppercase;letter-spacing:.06em;color:#444;margin-bottom:3px;}
+ .dwsm-opt .s{display:block;font-size:.92rem;color:#b08212;}
+ .dwsm-gbtn{display:flex;align-items:center;justify-content:center;gap:10px;width:100%;padding:12px 20px;background:#fff;border:1px solid #dadce0;border-radius:3px;cursor:pointer;font-family:Lora,serif;font-size:.92rem;color:#3c4043;margin-bottom:18px;}
+ .dwsm-gbtn:hover{background:#f7f8f8;}
+ .dwsm-div{display:flex;align-items:center;gap:14px;margin:0 0 18px;}
+ .dwsm-div span{font-size:.72rem;color:#999;text-transform:uppercase;letter-spacing:.1em;}
+ .dwsm-div i{flex:1;height:1px;background:#e4e4e4;}
+ .dwsm-field{margin-bottom:16px;}
+ .dwsm-field label{display:block;font-size:.76rem;text-transform:uppercase;letter-spacing:.03em;color:#444;margin-bottom:6px;}
+ .dwsm-field input{width:100%;padding:12px 14px;border:1px solid #e4e4e4;border-radius:3px;font-family:Lora,serif;font-size:.95rem;color:#444;box-sizing:border-box;}
+ .dwsm-field input:focus{outline:none;border-color:#b08212;box-shadow:0 0 0 1px #b08212;}
+ .dwsm-overlay input.dwsm-submit{width:100%;padding:14px;background:#000 !important;color:#fff !important;border:none !important;border-radius:3px;font-family:Lora,serif;font-size:.9rem;text-transform:uppercase;letter-spacing:.05em;cursor:pointer;}
+ .dwsm-overlay input.dwsm-submit:hover{background:#262626 !important;}
+ .dwsm-err{background:#fef2f2;border:1px solid #fca5a5;color:#991b1b;font-size:.85rem;padding:10px 14px;border-radius:3px;margin-bottom:16px;text-align:center;}
+ .dwsm-return{margin:0 0 8px;}
+ .dwsm-return h2{font-weight:400;font-size:1.55rem;color:#000;margin:0 0 14px;letter-spacing:.02em;text-align:center;}
+ .dwsm-return-cap{font-size:.82rem;color:#787878;margin:2px 0 0;text-align:center;}
+ .dwsm-newdiv{display:flex;align-items:center;gap:14px;margin:22px 0 20px;}
+ .dwsm-newdiv span{font-size:.72rem;color:#999;text-transform:uppercase;letter-spacing:.1em;white-space:nowrap;}
+ .dwsm-newdiv i{flex:1;height:1px;background:#e4e4e4;}
+ .dwsm-foot{text-align:center;margin-top:20px;padding-top:16px;border-top:1px solid #e4e4e4;font-size:.85rem;color:#787878;}
+ .dwsm-foot a{color:#b08212;text-decoration:none;}
+ .dwsm-foot a:hover{text-decoration:underline;}
+</style>
+
+<div class="dwsm-overlay" id="dw-signin" data-dwsm-overlay>
+ <div class="dwsm-card" role="dialog" aria-modal="true" aria-label="Sign in">
+ <button class="dwsm-close" type="button" data-dwsm-close aria-label="Close">×</button>
+
+ {%- comment -%} (0) RETURNING SIGN-IN — first and most prominent. Passwordless: email -> 6-digit code. {%- endcomment -%}
+ {%- unless customer -%}
+ <div class="dwsm-return">
+ <h2>Welcome back</h2>
+ <input type="button" class="dwsm-submit" data-dwsm-login="{{ routes.account_login_url }}" value="Sign In" style="margin-bottom:12px;">
+ <button type="button" class="dwsm-gbtn" data-dwsm-login="{{ routes.account_login_url }}">
+ <svg width="18" height="18" viewBox="0 0 18 18" aria-hidden="true"><path fill="#4285F4" d="M17.64 9.2c0-.64-.06-1.25-.16-1.84H9v3.48h4.84a4.14 4.14 0 0 1-1.8 2.72v2.26h2.92c1.7-1.57 2.68-3.88 2.68-6.62z"/><path fill="#34A853" d="M9 18c2.43 0 4.47-.8 5.96-2.18l-2.92-2.26c-.81.54-1.84.86-3.04.86-2.34 0-4.32-1.58-5.03-3.7H.96v2.33A9 9 0 0 0 9 18z"/><path fill="#FBBC05" d="M3.97 10.72a5.4 5.4 0 0 1 0-3.44V4.95H.96a9 9 0 0 0 0 8.1l3.01-2.33z"/><path fill="#EA4335" d="M9 3.58c1.32 0 2.5.45 3.44 1.35l2.58-2.58C13.47.9 11.43 0 9 0A9 9 0 0 0 .96 4.95l3.01 2.33C4.68 5.16 6.66 3.58 9 3.58z"/></svg>
+ Continue with Google
+ </button>
+ <p class="dwsm-return-cap">Returning customer? Just enter your email — no password needed.</p>
+ </div>
+
+ <div class="dwsm-newdiv"><i></i><span>New to Designer Wallcoverings?</span><i></i></div>
+
+ <div class="dwsm-offer">
+ <h2>Free Samples, On Us</h2>
+ <p>Sign in — we'll email you a code for 3 free samples.</p>
+ </div>
+
+ <div class="dwsm-toggle">
+ <div class="dwsm-opt active" data-dwsm-type="retail" role="button" tabindex="0">
+ <span class="t">Retail</span><span class="s">code for 3 free</span>
+ </div>
+ <div class="dwsm-opt" data-dwsm-type="professional" role="button" tabindex="0">
+ <span class="t">Professional</span><span class="s">apply for trade</span>
+ </div>
+ </div>
+
+ {%- comment -%} Google sign-up offered up front; deep-links to the hosted portal's native Google. {%- endcomment -%}
+ <div data-dwsm-google>
+ <button type="button" class="dwsm-gbtn" data-dwsm-login="{{ routes.account_login_url }}">
+ <svg width="18" height="18" viewBox="0 0 18 18" aria-hidden="true"><path fill="#4285F4" d="M17.64 9.2c0-.64-.06-1.25-.16-1.84H9v3.48h4.84a4.14 4.14 0 0 1-1.8 2.72v2.26h2.92c1.7-1.57 2.68-3.88 2.68-6.62z"/><path fill="#34A853" d="M9 18c2.43 0 4.47-.8 5.96-2.18l-2.92-2.26c-.81.54-1.84.86-3.04.86-2.34 0-4.32-1.58-5.03-3.7H.96v2.33A9 9 0 0 0 9 18z"/><path fill="#FBBC05" d="M3.97 10.72a5.4 5.4 0 0 1 0-3.44V4.95H.96a9 9 0 0 0 0 8.1l3.01-2.33z"/><path fill="#EA4335" d="M9 3.58c1.32 0 2.5.45 3.44 1.35l2.58-2.58C13.47.9 11.43 0 9 0A9 9 0 0 0 .96 4.95l3.01 2.33C4.68 5.16 6.66 3.58 9 3.58z"/></svg>
+ Continue with Google
+ </button>
+ <div class="dwsm-div"><i></i><span>or</span><i></i></div>
+ </div>
+
+ {%- endunless -%}
+ {%- if customer -%}
+ <div class="dwsm-return">
+ <h2>Apply for Trade Pricing</h2>
+ <p class="dwsm-return-cap">You're signed in — submit your business details and our team will review your trade account.</p>
+ </div>
+ {%- endif -%}
+ {%- comment -%} Moderated trade application — shown when "Professional" is selected. {%- endcomment -%}
+ <form class="dwsm-trade" data-dwsm-trade style="display:{% if customer %}block{% else %}none{% endif %};" novalidate>
+ <div class="dwsm-field">
+ <label>Business name</label>
+ <input type="text" name="business_name" autocomplete="organization" value="{{ customer.default_address.company }}" required>
+ </div>
+ <div class="dwsm-field">
+ <label>Work email</label>
+ <input type="email" name="email" autocomplete="email" value="{{ customer.email }}" required>
+ </div>
+ <div class="dwsm-field">
+ <label>Resale / business license #</label>
+ <input type="text" name="resale_cert">
+ </div>
+ <input type="button" class="dwsm-submit" data-dwsm-trade-submit value="Apply for Trade">
+ <p class="dwsm-trade-note" style="font-size:.78rem;color:#787878;margin:12px 0 0;text-align:center;">
+ Trade applications are reviewed by our team. We'll email you once approved.
+ </p>
+ </form>
+
+ {%- unless customer -%}
+ <div data-dwsm-retail>
+ <input type="button" class="dwsm-submit" data-dwsm-login="{{ routes.account_login_url }}" value="Sign In / Create Account">
+
+ <div class="dwsm-foot">
+ New to Designer Wallcoverings? <a href="{{ routes.account_register_url }}">Create account</a>
+ </div>
+ </div>
+ {%- endunless -%}
+ </div>
+</div>
+
+<script>
+(function(){
+ var overlay=document.getElementById('dw-signin');
+ if(!overlay) return;
+ var TRADE_APPLY_URL = 'https://signup.designerwallcoverings.com/trade/apply'; // fulfillment service public URL
+ // TK-11185: account exists at apply-time (server-side find-or-create) — route the
+ // applicant into New Customer Accounts OTP sign-in instead of a dead-end message.
+ var DWSM_ACCOUNT_LOGIN_URL = '/account';
+ var DWSM_LOGGED_IN = {% if customer %}true{% else %}false{% endif %};
+ function renderTradeSuccess(f, emailv){
+ if(DWSM_LOGGED_IN){
+ f.innerHTML='<div style="text-align:center;padding:12px 4px;color:#333;"><p style="margin:0 0 8px;font-weight:600;">Application received.</p><p style="margin:0;color:#555;">You\'re signed in. We\'ll email you the moment your trade pricing is approved.</p></div>';
+ return;
+ }
+ var esc=(emailv||'').replace(/</g,'<');
+ f.innerHTML='<div style="text-align:center;padding:12px 4px;color:#333;">'+
+ '<p style="margin:0 0 8px;font-weight:600;">Application received — your account is set up.</p>'+
+ '<p style="margin:0 0 14px;color:#555;">Sign in with <strong>'+esc+'</strong> to finish. We send a one-time code to your email \u2014 no password needed. You\'ll get trade pricing the moment we approve you.</p>'+
+ '<a href="'+DWSM_ACCOUNT_LOGIN_URL+'" style="display:inline-block;padding:11px 22px;background:#111;color:#fff;text-decoration:none;border-radius:2px;font:600 14px/1 system-ui,sans-serif;letter-spacing:.02em;">Sign in to your account</a>'+
+ '</div>';
+ }
+ function open(){overlay.classList.add('dwsm-open');document.body.style.overflow='hidden';}
+ function close(){overlay.classList.remove('dwsm-open');document.body.style.overflow='';}
+ function persistTrade(){
+ var proEl=overlay.querySelector('[data-dwsm-type="professional"]');
+ var pro=proEl&&proEl.classList.contains('active');
+ try{pro?sessionStorage.setItem('dw_trade','1'):sessionStorage.removeItem('dw_trade');}catch(e){}
+ }
+ document.addEventListener('click',function(e){
+ var t=e.target.closest('[data-dw-signin], a[href="#dw-signin"], a[href$="#dw-signin"]');
+ if(t){e.preventDefault();open();return;}
+ var login=e.target.closest('[data-dwsm-login]');
+ if(login){e.preventDefault();persistTrade();window.location.href=login.getAttribute('data-dwsm-login');return;}
+ if(e.target.closest('[data-dwsm-close]')||e.target===overlay){close();}
+ });
+ document.addEventListener('keydown',function(e){if(e.key==='Escape')close();});
+ var opts=overlay.querySelectorAll('[data-dwsm-type]');
+ var retailBox=overlay.querySelector('[data-dwsm-retail]');
+ var googleBox=overlay.querySelector('[data-dwsm-google]');
+ var tradeForm=overlay.querySelector('[data-dwsm-trade]');
+ function setType(type){
+ opts.forEach(function(o){o.classList.toggle('active',o.getAttribute('data-dwsm-type')===type);});
+ var pro=(type==='professional');
+ if(retailBox) retailBox.style.display=pro?'none':'';
+ if(googleBox) googleBox.style.display=pro?'none':'';
+ if(tradeForm) tradeForm.style.display=pro?'block':'none';
+ try{pro?sessionStorage.setItem('dw_trade','1'):sessionStorage.removeItem('dw_trade');}catch(e){}
+ }
+ // Moderated trade application submit -> POST /trade/apply on the fulfillment service.
+ overlay.addEventListener('click',function(e){
+ if(!e.target.closest('[data-dwsm-trade-submit]')) return;
+ e.preventDefault();
+ var f=tradeForm; if(!f) return;
+ var body={
+ business_name:(f.business_name.value||'').trim(),
+ email:(f.email.value||'').trim(),
+ resale_cert:(f.resale_cert.value||'').trim()
+ };
+ if(!body.email||!body.business_name){alert('Business name and work email are required.');return;}
+ fetch(TRADE_APPLY_URL,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(body)})
+ .then(function(r){return r.json();})
+ .then(function(){renderTradeSuccess(f, body.email);})
+ .catch(function(){alert('Sorry, something went wrong. Please try again.');});
+ });
+ opts.forEach(function(o){
+ o.addEventListener('click',function(){setType(o.getAttribute('data-dwsm-type'));});
+ o.addEventListener('keydown',function(e){if(e.key==='Enter'||e.key===' '){e.preventDefault();setType(o.getAttribute('data-dwsm-type'));}});
+ });
+ if(window.location.hash==='#dw-signin'){open();}
+})();
+</script>
diff --git a/verification/tk11283/live-snippets__dw-trade-apply.liquid b/verification/tk11283/live-snippets__dw-trade-apply.liquid
new file mode 100644
index 0000000..30dafd8
--- /dev/null
+++ b/verification/tk11283/live-snippets__dw-trade-apply.liquid
@@ -0,0 +1,220 @@
+{%- comment -%} DW-TRADE-APPLY v1 — benefits-first trade application and existing-account entry. {%- endcomment -%}
+<!-- DW-TRADE-APPLY v1 -->
+{%- assign dw_trade_is_approved = false -%}
+{%- if customer and customer.tags contains 'trade_approved' -%}{%- assign dw_trade_is_approved = true -%}{%- endif -%}
+{%- assign dw_room_day = 'now' | date: '%j' | plus: 0 | modulo: 4 -%}
+{%- case dw_room_day -%}
+ {%- when 0 -%}
+ {%- assign dw_room_url = 'https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Dig-4350115_room_setting_9dfcbae3-3159-41ad-959b-6999c665fc90.jpg?v=1756872231' -%}
+ {%- assign dw_room_alt = 'DW Bespoke DIG wallcovering in a vintage-inspired lounge' -%}
+ {%- when 1 -%}
+ {%- assign dw_room_url = 'https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Dig-74757_room_setting.jpg?v=1756870908' -%}
+ {%- assign dw_room_alt = 'DW Bespoke DIG floral wallcovering in a colorful sitting room' -%}
+ {%- when 2 -%}
+ {%- assign dw_room_url = 'https://cdn.shopify.com/s/files/1/0015/4117/7456/products/Dig-7320421_room_settingVeriPeri.jpg?v=1756707586' -%}
+ {%- assign dw_room_alt = 'DW Bespoke DIG botanical lattice wallcovering in a dining room' -%}
+ {%- else -%}
+ {%- assign dw_room_url = 'https://cdn.shopify.com/s/files/1/0015/4117/7456/collections/Dig-540002-roomsetting_62674c3c-b59d-4d36-aa8a-b7a696cbbb51.jpg?v=1774040040' -%}
+ {%- assign dw_room_alt = 'DW Bespoke DIG harlequin wallcovering in a collected powder room' -%}
+{%- endcase -%}
+{%- capture dw_existing_login_url -%}{{ routes.account_login_url }}{% if routes.account_login_url contains '?' %}&{% else %}?{% endif %}return_url={{ request.path | url_encode }}{%- endcapture -%}
+<main class="dw-ta" aria-labelledby="dwTaTitle">
+ <section class="dw-ta-hero">
+ <div class="dw-ta-hero__media" role="img" aria-label="{{ dw_room_alt | escape }}" data-dw-daily-room="{{ dw_room_day }}" style="--dw-ta-room:url('{{ dw_room_url }}')"></div>
+ <div class="dw-ta-hero__copy">
+ <p class="dw-ta-eyebrow">Designer Wallcoverings · Trade program</p>
+ <h1 id="dwTaTitle">A better way to source the wall.</h1>
+ <p class="dw-ta-deck">For interior designers, architects, hospitality teams, and qualified design professionals. Apply once for a project-ready account with unlimited complimentary samples.</p>
+ <div class="dw-ta-actions">
+ <a class="dw-ta-button dw-ta-button--dark" href="#dwTradeApplication">Apply for trade</a>
+ {%- if customer -%}
+ <a class="dw-ta-button dw-ta-button--quiet" href="{{ routes.account_url }}">View my account</a>
+ {%- else -%}
+ <a class="dw-ta-button dw-ta-button--quiet" href="{{ dw_existing_login_url }}" data-dw-returning>Existing account sign in</a>
+ {%- endif -%}
+ </div>
+ <p class="dw-ta-note">Already shopped with us? Sign in with the same email to retain your account and order history—do not create a second account.</p>
+ </div>
+ </section>
+
+ <section class="dw-ta-benefits" aria-labelledby="dwTaBenefits">
+ <div class="dw-ta-heading">
+ <p class="dw-ta-eyebrow">Trade privileges</p>
+ <h2 id="dwTaBenefits">Made for material decisions.</h2>
+ </div>
+ <div class="dw-ta-benefit-grid">
+ <article><span>01</span><h3>Unlimited samples</h3><p>Approved designers receive complimentary sample pricing automatically while signed in.</p></article>
+ <article><span>02</span><h3>Project sourcing</h3><p>Bring us a reference, performance brief, or hard-to-find pattern. Our specialists help narrow the field.</p></article>
+ <article><span>03</span><h3>Residential + contract</h3><p>Source decorative collections alongside Type II, acoustic, hospitality, and commercial surfaces.</p></article>
+ <article><span>04</span><h3>A real design desk</h3><p>Get support from people who understand repeats, grounds, yardage, lead times, and installation.</p></article>
+ </div>
+ </section>
+
+ <section class="dw-ta-apply" id="dwTradeApplication" aria-labelledby="dwTaApplyTitle">
+ <aside class="dw-ta-apply__intro">
+ <p class="dw-ta-eyebrow">Trade application</p>
+ <h2 id="dwTaApplyTitle">Tell us about your practice.</h2>
+ <p>Applications are reviewed by our team. Approval activates your trade experience and unlimited complimentary samples.</p>
+ <div class="dw-ta-existing">
+ <strong>Existing customer?</strong>
+ <span>Use your original email so your orders and account stay together.</span>
+ {%- if customer -%}
+ <a href="{{ routes.account_url }}">View your existing account ›</a>
+ {%- else -%}
+ <a href="{{ dw_existing_login_url }}" data-dw-returning>Sign in to your existing account ›</a>
+ {%- endif -%}
+ </div>
+ </aside>
+
+ <div class="dw-ta-form-wrap">
+ {%- if dw_trade_is_approved -%}
+ <div class="dw-ta-approved" role="status">
+ <p class="dw-ta-eyebrow">Trade account active</p>
+ <h3>You’re already approved.</h3>
+ <p>Your unlimited complimentary sample benefit applies automatically while you are signed in.</p>
+ <a class="dw-ta-button dw-ta-button--dark" href="{{ routes.all_products_collection_url }}">Start sourcing</a>
+ </div>
+ {%- else -%}
+ <form class="dw-ta-form" id="dwTradeForm" novalidate>
+ <div class="dw-ta-field dw-ta-field--wide">
+ <label for="dwTaName">Your name <span aria-hidden="true">*</span></label>
+ <input id="dwTaName" name="contact_name" type="text" autocomplete="name" required>
+ </div>
+ <div class="dw-ta-field">
+ <label for="dwTaEmail">Work email <span aria-hidden="true">*</span></label>
+ <input id="dwTaEmail" name="email" type="email" autocomplete="email" value="{{ customer.email | escape }}" required>
+ </div>
+ <div class="dw-ta-field">
+ <label for="dwTaPhone">Phone <span aria-hidden="true">*</span></label>
+ <input id="dwTaPhone" name="phone" type="tel" autocomplete="tel" required>
+ </div>
+ <div class="dw-ta-field dw-ta-field--wide">
+ <label for="dwTaBusiness">Studio or business name <span aria-hidden="true">*</span></label>
+ <input id="dwTaBusiness" name="business_name" type="text" autocomplete="organization" required>
+ </div>
+ <div class="dw-ta-field">
+ <label for="dwTaRole">Professional role <span aria-hidden="true">*</span></label>
+ <select id="dwTaRole" name="professional_role" required>
+ <option value="">Select one</option><option>Interior designer</option><option>Architect</option><option>Hospitality / contract</option><option>Set decorator</option><option>Purchasing agent</option><option>Installer / workroom</option><option>Other design professional</option>
+ </select>
+ </div>
+ <div class="dw-ta-field">
+ <label for="dwTaWebsite">Website or portfolio</label>
+ <input id="dwTaWebsite" name="website" type="url" autocomplete="url" placeholder="https://">
+ </div>
+ <div class="dw-ta-field">
+ <label for="dwTaLocation">City + state <span aria-hidden="true">*</span></label>
+ <input id="dwTaLocation" name="location" type="text" autocomplete="address-level2" required>
+ </div>
+ <div class="dw-ta-field">
+ <label for="dwTaCredential">Resale certificate / license</label>
+ <input id="dwTaCredential" name="resale_cert" type="text">
+ </div>
+ <div class="dw-ta-field dw-ta-field--wide">
+ <label for="dwTaProjects">What kinds of projects are you sourcing?</label>
+ <textarea id="dwTaProjects" name="project_types" rows="3" placeholder="Residential, hospitality, workplace…"></textarea>
+ </div>
+ <div class="dw-ta-field dw-ta-field--wide dw-ta-consent">
+ <label><input name="terms_acknowledged" type="checkbox" value="yes" required> <span>I certify that I am applying on behalf of a design-related business and agree to the <a href="/pages/privacy-policy">privacy policy</a>.</span></label>
+ </div>
+ <div class="dw-ta-field dw-ta-field--wide dw-ta-consent dw-ta-sms-consent">
+ <label for="dwTaSmsConsent">
+ <input id="dwTaSmsConsent" name="sms_marketing_consent" type="checkbox" value="yes">
+ <span>Yes, I agree to receive recurring automated promotional and personalized marketing text messages from Designer Wallcoverings at the mobile number provided. Consent is not a condition of purchase. Message frequency varies. Message and data rates may apply. Reply STOP to opt out or HELP for help. We honor opt-out requests and applicable Do Not Call requests; if you add this number to a Do Not Call list, please also reply STOP or <a href="/pages/contact-us">contact us</a> so we can promptly update our records. See our <a href="/pages/sms-terms">SMS Terms</a> and <a href="/pages/privacy-policy">Privacy Policy</a>.</span>
+ </label>
+ <p class="dw-ta-consent-note">Leave this box unchecked if you do not want marketing texts. We may still contact you about this application or transactions where permitted by law.</p>
+ <details class="dw-ta-sms-terms" id="dwSmsTerms">
+ <summary>SMS Terms</summary>
+ <p>You must be at least 18 and the account holder or authorized user of the mobile number. Message frequency varies; message and data rates may apply. Carriers are not liable for delayed or undelivered messages. Reply STOP to opt out or HELP for help. After STOP, we may send one confirmation. Opting out of marketing does not prevent permitted non-marketing messages about an application, order, account, appointment, or other transaction. Tell us before changing or transferring your number. We honor valid consent withdrawals and applicable Do Not Call requests; if you add your number to a Do Not Call list after opting in, please also reply STOP or <a href="/pages/contact-us">contact us</a> so we can promptly update our records. This notice does not limit our responsibility to honor applicable law or a valid opt-out request.</p>
+ </details>
+ </div>
+ <div class="dw-ta-submit dw-ta-field--wide">
+ <button class="dw-ta-button dw-ta-button--dark" type="submit">Submit application</button>
+ <p id="dwTradeStatus" class="dw-ta-status" aria-live="polite"></p>
+ </div>
+ </form>
+ {%- endif -%}
+ </div>
+ </section>
+</main>
+
+{%- unless customer -%}
+ <dialog class="dw-returning" id="dwReturningDialog" aria-labelledby="dwReturningTitle">
+ <button class="dw-returning__close" type="button" aria-label="Close returning client sign in" data-dw-returning-close>×</button>
+ <div class="dw-returning__room" role="img" aria-label="{{ dw_room_alt | escape }}" style="--dw-ta-room:url('{{ dw_room_url }}')"></div>
+ <div class="dw-returning__body">
+ <p class="dw-ta-eyebrow">Returning client</p>
+ <h2 id="dwReturningTitle">Welcome back.</h2>
+ <p>Use the email from your original Designer Wallcoverings account. Shopify will securely reconnect you—there is no new account to create.</p>
+ <ul>
+ <li>Your past orders stay with you</li>
+ <li>Your retail sample balance is preserved</li>
+ <li>Approved trade privileges remain attached</li>
+ </ul>
+ <a class="dw-ta-button dw-ta-button--dark" href="{{ dw_existing_login_url }}">Continue to secure sign in</a>
+ <button class="dw-returning__new" type="button" data-dw-returning-close>New to DW? Return to the application</button>
+ </div>
+ </dialog>
+{%- endunless -%}
+
+<style>
+ .dw-ta{--ta-ink:#181713;--ta-paper:#f3efe7;--ta-line:#d8d0c4;--ta-bronze:#795833;margin-top:16px;color:var(--ta-ink);background:#fff;font-family:var(--element-text-font-family--body,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif)}
+ .dw-ta *{box-sizing:border-box}.visual-search-clickable{display:none!important}.dw-ta-hero{display:grid;grid-template-columns:minmax(0,1.08fr) minmax(420px,.92fr);min-height:690px;background:var(--ta-paper)}
+ .dw-ta-hero__media{min-height:620px;background-image:linear-gradient(0deg,rgba(20,18,14,.12),rgba(20,18,14,.02)),var(--dw-ta-room);background-position:center;background-size:cover;background-repeat:no-repeat}
+ .dw-ta-hero__copy{display:flex;flex-direction:column;justify-content:center;padding:clamp(48px,7vw,108px)}
+ .dw-ta-eyebrow{margin:0 0 18px;color:var(--ta-bronze);font-size:11px;font-weight:700;letter-spacing:.18em;text-transform:uppercase}
+ .dw-ta h1,.dw-ta h2,.dw-ta h3{font-family:var(--element-text-font-family--heading,Georgia,serif);font-weight:400;text-transform:none}.dw-ta h1{max-width:640px;margin:0;font-size:clamp(48px,5.7vw,82px);line-height:.98;letter-spacing:-.035em}.dw-ta-deck{max-width:600px;margin:28px 0 0;font-size:clamp(17px,1.4vw,20px);line-height:1.65;color:#504c45}
+ .dw-ta-actions{display:flex;flex-wrap:wrap;gap:12px;margin-top:34px}.dw-ta-button{display:inline-flex;min-height:50px;align-items:center;justify-content:center;border:1px solid var(--ta-ink);padding:13px 24px;background:transparent;color:var(--ta-ink);font:700 11px/1.2 var(--element-text-font-family--body,sans-serif);letter-spacing:.12em;text-decoration:none;text-transform:uppercase;cursor:pointer}.dw-ta-button--dark{background:var(--ta-ink);color:#fff}.dw-ta-button--quiet{background:transparent}.dw-ta-note{max-width:570px;margin:18px 0 0;font-size:13px;line-height:1.55;color:#6d675e}
+ .dw-ta-benefits{padding:clamp(72px,9vw,128px) clamp(24px,7vw,110px)}.dw-ta-heading{max-width:700px;margin-bottom:52px}.dw-ta-heading h2,.dw-ta-apply__intro h2{font-size:clamp(38px,4.3vw,62px);line-height:1.04;margin:0}.dw-ta-benefit-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(22px,3vw,46px)}.dw-ta-benefit-grid article{border-top:1px solid var(--ta-line);padding-top:20px}.dw-ta-benefit-grid article>span{color:var(--ta-bronze);font-size:11px;letter-spacing:.15em}.dw-ta-benefit-grid h3{font-size:24px;line-height:1.15;margin:17px 0 12px}.dw-ta-benefit-grid p{margin:0;color:#625d55;line-height:1.65}
+ .dw-ta-apply{display:grid;grid-template-columns:minmax(300px,.75fr) minmax(0,1.25fr);gap:clamp(42px,8vw,130px);padding:clamp(70px,9vw,130px) clamp(24px,7vw,110px);background:var(--ta-paper)}.dw-ta-apply__intro>p:not(.dw-ta-eyebrow){max-width:480px;color:#5c574f;line-height:1.7}.dw-ta-existing{margin-top:40px;padding-top:25px;border-top:1px solid var(--ta-line)}.dw-ta-existing strong,.dw-ta-existing span,.dw-ta-existing a{display:block}.dw-ta-existing span{margin:8px 0 12px;color:#5c574f;line-height:1.55}.dw-ta-existing a{color:var(--ta-ink);font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;text-underline-offset:4px}
+ .dw-ta-form{display:grid;grid-template-columns:1fr 1fr;gap:22px 18px}.dw-ta-field--wide{grid-column:1/-1}.dw-ta-field label{display:block;margin-bottom:8px;font-size:12px;font-weight:700;letter-spacing:.06em}.dw-ta-field input,.dw-ta-field select,.dw-ta-field textarea{width:100%;min-height:50px;border:1px solid #aaa194;border-radius:0;background:#fff;color:var(--ta-ink);padding:12px 13px;font:16px/1.4 inherit}.dw-ta .selected-text{color:#5f5f5f}.dw-ta-field textarea{resize:vertical}.dw-ta-field input:focus,.dw-ta-field select:focus,.dw-ta-field textarea:focus{outline:3px solid rgba(121,88,51,.25);border-color:var(--ta-bronze)}.dw-ta-consent label{display:flex;gap:10px;font-weight:400;letter-spacing:0;line-height:1.5}.dw-ta-consent input{width:18px;min-height:18px;margin-top:2px;flex:0 0 auto}.dw-ta-consent a{color:inherit}.dw-ta-sms-consent{padding-top:20px;border-top:1px solid var(--ta-line)}.dw-ta-consent-note{margin:8px 0 0 28px;color:#6d675e;font-size:12px;line-height:1.5}.dw-ta-sms-terms{margin:14px 0 0 28px;color:#5c574f;font-size:12px;line-height:1.55}.dw-ta-sms-terms summary{cursor:pointer;font-weight:700;text-decoration:underline;text-underline-offset:3px}.dw-ta-sms-terms p{margin:10px 0 0}.dw-ta-submit{display:flex;align-items:center;gap:18px;flex-wrap:wrap}.dw-ta-status{margin:0;font-size:14px}.dw-ta-status[data-state="error"]{color:#982b23}.dw-ta-status[data-state="success"]{color:#32613d}.dw-ta-approved{padding:clamp(36px,6vw,72px);background:#fff;border:1px solid var(--ta-line)}.dw-ta-approved h3{font-size:38px;margin:0 0 14px}.dw-ta-approved p:not(.dw-ta-eyebrow){line-height:1.65;margin-bottom:25px}
+ .dw-ta a:focus-visible,.dw-ta button:focus-visible{outline:3px solid #bd8950;outline-offset:3px}
+ .dw-returning{--ta-ink:#181713;--ta-paper:#f3efe7;width:min(920px,calc(100vw - 32px));max-width:none;padding:0;border:0;background:var(--ta-paper);color:var(--ta-ink);box-shadow:0 30px 90px rgba(0,0,0,.32)}.dw-returning::backdrop{background:rgba(14,13,11,.68);backdrop-filter:blur(4px)}.dw-returning[open]{display:grid;grid-template-columns:1fr 1fr}.dw-returning__room{min-height:620px;background-image:linear-gradient(0deg,rgba(20,18,14,.08),rgba(20,18,14,.02)),var(--dw-ta-room);background-position:center;background-size:cover}.dw-returning__body{display:flex;flex-direction:column;justify-content:center;padding:clamp(38px,6vw,72px)}.dw-returning h2{margin:0 0 18px;font:400 clamp(44px,5vw,68px)/1 var(--element-text-font-family--heading,Georgia,serif);letter-spacing:-.03em}.dw-returning__body>p:not(.dw-ta-eyebrow){color:#575149;line-height:1.65}.dw-returning ul{margin:18px 0 28px;padding:0;list-style:none}.dw-returning li{padding:11px 0;border-top:1px solid #d3cabd;font-size:14px}.dw-returning li::before{content:'✓';margin-right:10px;color:#795833;font-weight:700}.dw-returning__close{position:absolute;top:14px;right:16px;width:44px;height:44px;border:0;background:rgba(255,255,255,.9);color:#181713;font-size:28px;line-height:1;cursor:pointer}.dw-returning__new{margin-top:16px;border:0;background:none;text-decoration:underline;text-underline-offset:4px;cursor:pointer;color:#4d4841}.dw-returning a:focus-visible,.dw-returning button:focus-visible{outline:3px solid #bd8950;outline-offset:3px}
+ @media(max-width:900px){.dw-ta-hero{grid-template-columns:1fr}.dw-ta-hero__media{min-height:52vh}.dw-ta-benefit-grid{grid-template-columns:1fr 1fr}.dw-ta-apply{grid-template-columns:1fr}}
+ @media(max-width:700px){.dw-returning[open]{display:block}.dw-returning__room{min-height:250px}.dw-returning__body{padding:34px 24px 38px}.dw-returning .dw-ta-button{width:100%}}
+ @media(max-width:560px){.dw-ta-hero__media{min-height:420px}.dw-ta-hero__copy{padding:48px 22px 62px}.dw-ta-actions{display:grid}.dw-ta-button{width:100%}.dw-ta-benefit-grid,.dw-ta-form{grid-template-columns:1fr}.dw-ta-field--wide{grid-column:auto}.dw-ta-submit{display:block}.dw-ta-status{margin-top:14px}.dw-ta-apply{padding-left:22px;padding-right:22px}}
+ @media(prefers-reduced-motion:reduce){.dw-ta *{scroll-behavior:auto!important;transition:none!important}}
+</style>
+
+<script>
+ document.querySelectorAll('a.logo-link').forEach(function(link){
+ if(!link.getAttribute('aria-label')) link.setAttribute('aria-label','Designer Wallcoverings home');
+ });
+ (function(){
+ var dialog=document.getElementById('dwReturningDialog');
+ if(!dialog)return;
+ document.querySelectorAll('[data-dw-returning]').forEach(function(link){link.addEventListener('click',function(event){event.preventDefault();dialog.showModal();});});
+ dialog.querySelectorAll('[data-dw-returning-close]').forEach(function(button){button.addEventListener('click',function(){dialog.close();});});
+ dialog.addEventListener('click',function(event){if(event.target===dialog)dialog.close();});
+ })();
+</script>
+
+{%- unless dw_trade_is_approved -%}
+<script>
+ (function(){
+ var form=document.getElementById('dwTradeForm');
+ var status=document.getElementById('dwTradeStatus');
+ if(!form||!status)return;
+ form.addEventListener('submit',async function(event){
+ event.preventDefault();
+ status.removeAttribute('data-state');
+ if(!form.checkValidity()){form.reportValidity();status.textContent='Please complete the required fields.';status.dataset.state='error';return;}
+ var button=form.querySelector('button[type="submit"]');
+ var data=Object.fromEntries(new FormData(form).entries());
+ var smsConsent=form.querySelector('#dwTaSmsConsent');
+ data.sms_marketing_consent=Boolean(smsConsent&&smsConsent.checked);
+ data.sms_consent_disclosure_version='dw-sms-v2-2026-08-28';
+ data.sms_consent_captured_at=new Date().toISOString();
+ data.sms_consent_source=window.location.href;
+ button.disabled=true;button.textContent='Submitting…';status.textContent='Securely sending your application…';
+ try{
+ var response=await fetch('https://signup.designerwallcoverings.com/trade/apply',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(data)});
+ var result=await response.json().catch(function(){return {};});
+ if(!response.ok)throw new Error(result.error||'Application could not be submitted.');
+ form.reset();status.textContent='Application received. Our trade team will review it and follow up by email.';status.dataset.state='success';button.textContent='Application received';
+ }catch(error){status.textContent=error.message||'Please try again or call (888) 373-4564.';status.dataset.state='error';button.disabled=false;button.textContent='Submit application';}
+ });
+ })();
+</script>
+{%- endunless -%}
+<!-- /DW-TRADE-APPLY -->
diff --git a/verification/tk11283/publish-theme.cjs b/verification/tk11283/publish-theme.cjs
new file mode 100644
index 0000000..cf4aff8
--- /dev/null
+++ b/verification/tk11283/publish-theme.cjs
@@ -0,0 +1,62 @@
+'use strict';
+// Exactly two reviewed theme assets, with optimistic concurrency and rollback.
+// Default is a read-only preflight; live mutation requires explicit --apply/--rollback.
+const fs=require('node:fs'),path=require('node:path'),crypto=require('node:crypto');
+const config=require('../../lib/config');
+const baseline=JSON.parse(fs.readFileSync(path.join(__dirname,'live-read.json'),'utf8'));
+const allowed=['snippets/dw-trade-apply.liquid','snippets/dw-signin-modal.liquid'];
+const sha=s=>crypto.createHash('sha256').update(s).digest('hex');
+async function main(){
+ const mode=process.argv[2]||'--check';
+ if(!['--check','--apply','--rollback'].includes(mode))throw new Error('Unknown mode');
+ if(mode==='--apply'){
+ const proof=JSON.parse(fs.readFileSync(path.join(__dirname,'journey.json'),'utf8'));
+ if(proof.verdict!=='PASS'||!proof.checks.some(x=>x.name==='safari scripts'))throw new Error('Chrome and Safari evidence required');
+ }
+ const env=fs.readFileSync(path.join(require('node:os').homedir(),'Projects/secrets-manager/.env'),'utf8');
+ const token=env.match(/^SHOPIFY_THEME_TOKEN=(.*)$/m)?.[1].replace(/^["']|["']$/g,'').trim();
+ if(!token)throw new Error('No theme credential');
+ async function request(method,endpoint,body){
+ if(method!=='GET'&&method!=='PUT')throw new Error('Forbidden verb');
+ const r=await fetch(`https://${config.SHOP_DOMAIN}/admin/api/2026-07${endpoint}`,{method,headers:{'X-Shopify-Access-Token':token,'Content-Type':'application/json'},body:body?JSON.stringify(body):undefined});
+ if(!r.ok)throw new Error(`Shopify HTTP ${r.status}`);return r.json();
+ }
+ const themes=await request('GET','/themes.json');
+ if(themes.themes.find(t=>t.role==='main')?.id!==baseline.theme.id)throw new Error('Live theme changed; stop for review');
+ const endpoint=`/themes/${baseline.theme.id}/assets.json`;
+ async function read(key){return(await request('GET',endpoint+'?asset[key]='+encodeURIComponent(key))).asset.value;}
+ const items=[];
+ for(const key of allowed){
+ const meta=baseline.assets.find(x=>x.key===key);
+ const old=fs.readFileSync(path.join(__dirname,meta.filename),'utf8');
+ const next=fs.readFileSync(path.resolve(__dirname,'../../theme-proposals/designer-signin-tk11283',key),'utf8');
+ if(sha(old)!==meta.sha256)throw new Error('Baseline backup changed');
+ const current=await read(key);
+ const expected=mode==='--rollback'?next:old;
+ if(sha(current)!==sha(expected))throw new Error('Concurrent theme change at '+key+'; stopped');
+ items.push({key,old,next,before:sha(current),after:sha(mode==='--rollback'?old:next)});
+ }
+ if(mode==='--check'){console.log(JSON.stringify({mode,theme:baseline.theme.id,assets:items.map(({key,before,after})=>({key,before,after}))},null,2));return;}
+ const attempted=[];
+ try{
+ for(const item of items){
+ // Recheck each asset immediately before its write.
+ if(sha(await read(item.key))!==item.before)throw new Error('Concurrent edit before write: '+item.key);
+ attempted.push(item);
+ await request('PUT',endpoint,{asset:{key:item.key,value:mode==='--rollback'?item.old:item.next}});
+ if(sha(await read(item.key))!==item.after)throw new Error('Post-write parity failed: '+item.key);
+ }
+ }catch(error){
+ // Restore only a value still equal to this run's proposed value.
+ for(const item of attempted.reverse()){
+ const current=sha(await read(item.key));
+ if(current===item.after)await request('PUT',endpoint,{asset:{key:item.key,value:mode==='--rollback'?item.next:item.old}});
+ else if(current!==item.before)throw new Error('Concurrent change prevents safe automatic rollback: '+item.key);
+ }
+ throw error;
+ }
+ const evidence={timestamp:new Date().toISOString(),mode,theme:baseline.theme.id,assets:items.map(({key,before,after})=>({key,before,after})),verdict:'PASS'};
+ fs.writeFileSync(path.join(__dirname,mode==='--apply'?'publish.json':'rollback.json'),JSON.stringify(evidence,null,2)+'\n');
+ console.log(JSON.stringify(evidence,null,2));
+}
+main().catch(e=>{console.error(e.message);process.exitCode=1;});
diff --git a/verification/tk11283/read-live.cjs b/verification/tk11283/read-live.cjs
new file mode 100644
index 0000000..efc29d5
--- /dev/null
+++ b/verification/tk11283/read-live.cjs
@@ -0,0 +1,41 @@
+'use strict';
+// Read-only Shopify review; never submits a customer, order, email or theme write.
+const fs = require('node:fs');
+const path = require('node:path');
+const config = require('../../lib/config');
+const dir = __dirname;
+function envKey(key) {
+ const source = fs.readFileSync(path.join(require('node:os').homedir(), 'Projects/secrets-manager/.env'), 'utf8');
+ return source.match(new RegExp('^' + key + '=(.*)$', 'm'))?.[1].replace(/^["']|["']$/g, '').trim();
+}
+async function main() {
+ const token = envKey('SHOPIFY_THEME_TOKEN');
+ if (!token) throw new Error('Theme read credential unavailable');
+ async function get(endpoint) {
+ const response = await fetch(`https://${config.SHOP_DOMAIN}/admin/api/2026-07${endpoint}`, {headers:{'X-Shopify-Access-Token':token}});
+ if (!response.ok) throw new Error(`Theme read HTTP ${response.status}`);
+ return response.json();
+ }
+ const themes = await get('/themes.json');
+ const main = themes.themes.find(t=>t.role==='main');
+ if (!main) throw new Error('No main theme');
+ const keys = ['snippets/dw-signin-modal.liquid', 'snippets/dw-trade-apply.liquid', 'snippets/dw-samples-banner.liquid'];
+ const assets = [];
+ for (const key of keys) {
+ const result = await get(`/themes/${main.id}/assets.json?asset[key]=${encodeURIComponent(key)}`);
+ const value = result.asset.value;
+ const filename = `live-${key.replaceAll('/','__')}`;
+ fs.writeFileSync(path.join(dir, filename), value);
+ assets.push({key,filename,updated_at:result.asset.updated_at,sha256:require('node:crypto').createHash('sha256').update(value).digest('hex')});
+ }
+ const query = `query ReviewSignIn { shop { customerAccountsV2 { customerAccountsVersion url } } discountNodes(first:20,query:"title:DW Free Samples") { nodes { discount { ... on DiscountAutomaticApp { title status appDiscountType { functionId } } } } } webhookSubscriptions(first:50) { nodes { topic uri } } }`;
+ const response = await fetch(`https://${config.SHOP_DOMAIN}/admin/api/2026-07/graphql.json`, {method:'POST',headers:{'Content-Type':'application/json','X-Shopify-Access-Token':config.SHOPIFY_FULFILLMENT_TOKEN},body:JSON.stringify({query})});
+ const result = await response.json();
+ // Do not persist webhook credential-bearing URIs.
+ const webhooks = result.data?.webhookSubscriptions?.nodes?.map(x=>({topic:x.topic,origin:new URL(x.uri).origin}));
+ const health = await fetch('https://signup.designerwallcoverings.com/healthz').then(r=>r.json());
+ const evidence = {timestamp:new Date().toISOString(),theme:{id:main.id,name:main.name,role:main.role},assets,health,account:result.data?.shop,discounts:result.data?.discountNodes?.nodes,webhooks,errors:result.errors?.map(x=>x.message)};
+ fs.writeFileSync(path.join(dir,'live-read.json'),JSON.stringify(evidence,null,2)+'\n');
+ console.log(JSON.stringify(evidence,null,2));
+}
+main().catch(e=>{console.error(e.message);process.exitCode=1;});
diff --git a/verification/tk11283/recordings/chrome/1c01e8532d6e06b087a1eb217eabdcb6.webm b/verification/tk11283/recordings/chrome/1c01e8532d6e06b087a1eb217eabdcb6.webm
new file mode 100644
index 0000000..5f414ae
Binary files /dev/null and b/verification/tk11283/recordings/chrome/1c01e8532d6e06b087a1eb217eabdcb6.webm differ
diff --git a/verification/tk11283/recordings/chrome/9f2f793fd112a1d5e043d6a26a0dbf26.webm b/verification/tk11283/recordings/chrome/9f2f793fd112a1d5e043d6a26a0dbf26.webm
new file mode 100644
index 0000000..7ddc734
Binary files /dev/null and b/verification/tk11283/recordings/chrome/9f2f793fd112a1d5e043d6a26a0dbf26.webm differ
diff --git a/verification/tk11283/recordings/chrome/a2d88778155f3f0de23998d72c823b9d.webm b/verification/tk11283/recordings/chrome/a2d88778155f3f0de23998d72c823b9d.webm
new file mode 100644
index 0000000..1543915
Binary files /dev/null and b/verification/tk11283/recordings/chrome/a2d88778155f3f0de23998d72c823b9d.webm differ
diff --git a/verification/tk11283/recordings/chrome/fc95404fb32883e78896d007578c5075.webm b/verification/tk11283/recordings/chrome/fc95404fb32883e78896d007578c5075.webm
new file mode 100644
index 0000000..8df29c6
Binary files /dev/null and b/verification/tk11283/recordings/chrome/fc95404fb32883e78896d007578c5075.webm differ
diff --git a/verification/tk11283/recordings/safari/page@0538ec3b68a8fca25c18a66abef4b23f.webm b/verification/tk11283/recordings/safari/page@0538ec3b68a8fca25c18a66abef4b23f.webm
new file mode 100644
index 0000000..fa6bad4
Binary files /dev/null and b/verification/tk11283/recordings/safari/page@0538ec3b68a8fca25c18a66abef4b23f.webm differ
diff --git a/verification/tk11283/recordings/safari/page@a75282272649003c309db0daf925c3d2.webm b/verification/tk11283/recordings/safari/page@a75282272649003c309db0daf925c3d2.webm
new file mode 100644
index 0000000..a19c0a8
Binary files /dev/null and b/verification/tk11283/recordings/safari/page@a75282272649003c309db0daf925c3d2.webm differ
diff --git a/verification/tk11283/safari-account-modal.png b/verification/tk11283/safari-account-modal.png
new file mode 100644
index 0000000..401b804
Binary files /dev/null and b/verification/tk11283/safari-account-modal.png differ
diff --git a/verification/tk11283/safari-account-ready.png b/verification/tk11283/safari-account-ready.png
new file mode 100644
index 0000000..39232d8
Binary files /dev/null and b/verification/tk11283/safari-account-ready.png differ
diff --git a/verification/tk11283/safari-mobile-modal.png b/verification/tk11283/safari-mobile-modal.png
new file mode 100644
index 0000000..fff99be
Binary files /dev/null and b/verification/tk11283/safari-mobile-modal.png differ
diff --git a/verification/tk11283/safari-mobile-ready.png b/verification/tk11283/safari-mobile-ready.png
new file mode 100644
index 0000000..8744b3b
Binary files /dev/null and b/verification/tk11283/safari-mobile-ready.png differ
← 1944da5 retail-webhook: close double-fire race — in-process in-fligh
·
back to Dw Signup Fulfillment
·
auto-data-snapshot: 2026-09-04T23:09:55 (1 data files) — ver 45fc36e →