{
  "version": 3,
  "sources": ["/cdn/shop/t/80/assets/saffron-carousel.js?cb=20260717b"],
  "sourcesContent": ["/* ============================================================================\n   saffron-carousel.js \u2014 Saffron LP hero carousel driver.\n   Ported from reports/saffron-hero-carousel/rounds/round-10-dynamic/carousel-dynamic.html\n   (approved v4.2 \"dynamic\" build). Two responsibilities:\n     1) DYNAMIC ANCHOR ENGINE \u2014 swaps slide-1 scene photo + all 4 tweet bodies per\n        token chosen from ?utm_content. NAMESPACED: token = <block>-<variant>\n        (tweet-A6, review-b2, person-studio, ugc-maren-3, cr-mood-1 \u2026). One flat\n        MAP keyed by the FULL token. Empty/unknown/unfilled token \u2192 DEFAULT (A6),\n        so a live hero is NEVER blank.\n     2) SLIDER UX \u2014 matches the lander's existing .b02g slider exactly: tap the\n        visible slide \u2192 next (F2 tap/swipe discrimination, 10px), horizontal swipe,\n        clickable dots. Own classes (.swc-*) so the legacy .b02g code no-ops.\n   Scene image URLs come from the liquid-rendered JSON (#swc-scene-urls) so they\n   resolve through the Shopify CDN (asset_url). All fonts system, no external reqs.\n\n   \u2500\u2500 HISTORY \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   2026-07-15 round-11: refactored flat A1\u2013A6 map \u2192 namespaced <block>-<variant>\n     token map under the whole launch-plan (HERO-MAP-LAUNCHPLAN-SPEC.md \u00A74/\u00A77).\n     tweet-A1\u2026A6 render EXACTLY as before (back-compat). All other launch-plan\n     tokens exist as EMPTY content SLOTS (owner fills copy/images separately).\n   ============================================================================ */\n(function () {\n  'use strict';\n\n  var root = document.querySelector('.swc');\n  if (!root) return;\n\n  /* -- scene URLs injected by liquid (asset_url per image key) -------------\n     Keyed by IMAGE key (A1\u2026A6 today). A MAP entry's `image` field is a key\n     INTO this object. To add a new image set for a new block: (1) upload the\n     asset to the theme, (2) add a key\u2192asset_url line to #swc-scene-urls in\n     page.saffron-lp.liquid, (3) reference that key from the slot's `image`. */\n  var SCENE_URLS = {};\n  try {\n    var tag = document.getElementById('swc-scene-urls');\n    if (tag) SCENE_URLS = JSON.parse(tag.textContent || '{}');\n  } catch (e) { SCENE_URLS = {}; }\n\n  /* UGC slide-4 \"Lower-third XL\" quotes \u2014 per creator, verbatim short form (Alex\n     2026-07-17). Shared across a creator's 5 variants; name comes from c.attrib. */\n  var UGC_S4 = {\n    maren:  { quote: \"It\u2019s literally just saffron, glycerin, and water.\" },\n    taylor: { quote: \"Just saffron, glycerin and water, no sugar, no alcohol.\" }\n  };\n\n  /* ==========================================================================\n     CONTENT MAP \u2014 ONE object, keyed by the FULL utm_content token.\n     \u250C\u2500 HOW THE OWNER FILLS A CONTENT SLOT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n     \u2502 1. Find the token key below (e.g. 'review-b2'). Every launch-plan ad    \u2502\n     \u2502    has exactly one key here; the comment names the ad file it matches.  \u2502\n     \u2502 2. Replace its `SLOT('\u2026')` value with a filled object shaped like the   \u2502\n     \u2502    tweet-A* entries above:                                              \u2502\n     \u2502        'review-b2': {                                                   \u2502\n     \u2502          filled: true,                                                  \u2502\n     \u2502          pos:    '50% 40%',           // object-position of slide-1 img \u2502\n     \u2502          slide1: \"\u2026\",                 // slide-1 body (hero, matches ad)\u2502\n     \u2502          slide2: \"\u2026\",                 // slide-2 body                   \u2502\n     \u2502          slide3: \"\u2026\",                 // slide-3 body                   \u2502\n     \u2502          slide4: '\u2026 <span class=\"swc-price\">$39.99</span> \u2026',           \u2502\n     \u2502          image:  'A6'                 // key into SCENE_URLS (liquid)   \u2502\n     \u2502        },                                                               \u2502\n     \u2502 3. For a NEW image (not A1\u2013A6): add it to #swc-scene-urls in the liquid \u2502\n     \u2502    first, then use that key in `image`.                                 \u2502\n     \u2502 4. Only `slide4` may contain HTML (the price <span>); slide1\u20133 are text.\u2502\n     \u2502 Until `filled:true`, the slot falls back to DEFAULT (A6) at render time \u2502\n     \u2502 \u2014 so an unfilled token is safe on live (never a blank hero).            \u2502\n     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n     `SLOT(note)` returns an unfilled placeholder. `note` is just documentation\n     of which ad this token belongs to; it never renders.\n     ========================================================================== */\n  function SLOT(note) {\n    return { filled: false, note: note, pos: '50% 40%',\n             slide1: '', slide2: '', slide3: '', slide4: '', image: null };\n  }\n\n  var MAP = {\n\n    /* ===== C1 static \u00B7 adset-tweets \u2014 BUILT / LIVE (do not alter: back-compat)\n       token tweet-A{N}  \u2190  tweet-A{N}-danielacastro1-{1x1,9x16}.png ============ */\n    'tweet-A1': {\n      filled: true, image: 'A1', pos: '50% 40%', aiMark: true,\n      h1: \"Saffron drops for showing up at the dinner table\",\n      slide1: \"my husband said i seemed more like myself at dinner last night. didn't realize i'd gone somewhere. been taking the saffron drops about three weeks now, so. maybe.\",\n      slide2: \"a month ago at that same dinner i just stared at my plate. he was talking and i was somewhere behind glass. guess i had gone somewhere, i just didn't clock it.\",\n      slide3: \"started putting the saffron drops in my morning coffee. wasn't expecting anything. three weeks in i was actually listening at dinner, not nodding on autopilot.\",\n      slide4: 'not saying it goes like this for everyone. it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i\\'ve already grabbed a second.'\n    },\n    'tweet-A2': {\n      filled: true, image: 'A2', pos: '50% 40%', aiMark: true,\n      h1: \"Saffron drops for when the little things pile up\",\n      slide1: \"the little things were getting to me. dropped a fork this morning and just laughed instead of losing it. felt nice not being so on edge over nothing.\",\n      slide2: \"the little stuff used to wreck me. drop a fork in the morning and that was it, on edge the whole day over nothing.\",\n      slide3: \"started dropping saffron in my coffee each morning. no big deal. at some point i dropped that same fork and just laughed.\",\n      slide4: 'everyone\\'s different, but this is calmer for me. <span class=\"swc-price\">$39.99</span> a bottle, 10% off on subscription, and i already grabbed the second.'\n    },\n    'tweet-A3': {\n      filled: true, image: 'A3', pos: '62% 22%', aiMark: true,\n      h1: \"Saffron drops that support a calm morning*\",\n      slide1: \"cried at a paper towel commercial last week, which, ok. been a bit steadier since i started these saffron drops. not magic but my mornings feel calmer.\",\n      slide2: \"a month ago i cried at a paper towel commercial. a commercial. and that was a regular tuesday, not even a bad day.\",\n      slide3: \"i put these saffron drops in my morning coffee. not magic, i know. but my mornings feel steadier than they were.\",\n      slide4: 'won\\'t land the same for everyone, sure. it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i\\'m already grabbing a second.'\n    },\n    'tweet-A4': {\n      filled: true, image: 'A4', pos: '50% 40%', aiMark: true,\n      h1: \"Saffron drops that support your everyday balance*\",\n      slide1: \"all i wanted this season was a few even days in a row. got three this week. taking a little saffron each morning with my coffee, who knows, but i'll take it.\",\n      slide2: \"all season i just wanted a couple of even days in a row. but it'd go: one okay day, then back to running on empty by noon.\",\n      slide3: \"started adding a little saffron to my morning coffee. who knows what did it. but this week i got three even days.\",\n      slide4: 'wouldn\\'t call it dramatic, but i\\'ll take it. <span class=\"swc-price\">$39.99</span> a bottle, 10% off on subscription, already grabbed a second so i don\\'t run out.'\n    },\n    'tweet-A5': {\n      filled: true, image: 'A5', pos: '50% 40%', aiMark: true,\n      h1: \"Saffron drops that support a steady mood*\",\n      slide1: \"54 and i just wanted to feel like me again. was skeptical about a tiny bottle of drops. month in, my mood feels a bit steadier. not dramatic but i'll take it.\",\n      slide2: \"i'm 54. for half a year i wasn't quite myself, and i looked at that tiny bottle of drops with pure skepticism.\",\n      slide3: \"put it in my coffee to prove it wouldn't work. a month in my mood feels a bit steadier. admitting it quietly.\",\n      slide4: 'nothing dramatic, but i\\'ll take it. <span class=\"swc-price\">$39.99</span> a bottle, 10% off on subscription, and yeah, i\\'m already grabbing a second.'\n    },\n    'tweet-A6': {\n      filled: true, image: 'A6', pos: '50% 40%', aiMark: true,\n      h1: \"Saffron drops that support your everyday calm*\",\n      slide1: \"update: it's been 6 weeks. i cleaned my apartment, called my mom back, and didn't cry at work once. saffron is insane.\",\n      slide2: \"six weeks ago the apartment was a mess, i hadn't called my mom back in weeks, and i cried in the work bathroom more than i'd like to admit.\",\n      slide3: \"nothing heroic. saffron in my coffee every morning, that's it. not magic, but around week three i stopped snapping over little things.\",\n      slide4: 'not saying it goes this way for everyone. it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i\\'ve already grabbed a second. that\\'s the whole story.'\n    },\n\n    /* ===== C1 static \u00B7 adset-review-card \u2014 EMPTY SLOTS (block: review)\n       token review-b{N}  \u2190  saffron-review-b{N}-{1x1,9x16}.png\n       Note (spec \u00A75.1): texts are the same 6 voices as tweet-A1\u2026A6, FORM = review-card.\n       Owner: decide b\u2194A pairing, then fill each slot (reuse tweet copy or adapt). ==== */\n    /* form:'reviewcard' \u2192 slide 1 = light whn-1 testimonial card (no bg photo).\n       headline+body = VERBATIM from the shipped saffron-review-b{N} creative\n       (SoT: reports/voronka-B-creative-copy/build/rc-b{N}-*.html). Slides 2-4 =\n       shared angle-neutral Daniela story (problem\u2192solution\u2192offer), glass form. */\n    'review-b1': {\n      filled: true, form: 'reviewcard', aiMark: false,\n      h1: \"Saffron drops that support a calm start to the day*\",\n      headline: \"Stopped snapping at 7am\",\n      slide1: \"I started the drops back in March, mostly so my daughter would quit nagging me about it. I'm still not a morning person and the coffee comes first. <b>But somewhere along the way I stopped snapping at the dog by 7am.</b> I'll take it.\",\n      slide2: \"for a while there i wasn't really myself. short with the people i love, running on empty by mid-afternoon, snapping over stuff that didn't deserve it.\",\n      slide3: \"nothing fancy. saffron drops in my coffee every morning, that's the whole ritual. few weeks in, the little stuff just stopped getting to me the way it used to.\",\n      slide4: 'might not go this way for you, i don\\'t know. all i know is it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i already ordered my second.'\n    },\n    'review-b2': {\n      filled: true, form: 'reviewcard', aiMark: false,\n      h1: \"Saffron drops for the small, ordinary moments\",\n      headline: \"Feel like me again\",\n      slide1: \"For about a year I kept telling my husband I just didn't feel like myself. I've been on the saffron drops since spring, and a few weeks in I caught myself humming while I unloaded the dishwasher. Small thing. <b>But it felt like me.</b>\",\n      slide2: \"for a while there i wasn't really myself. short with the people i love, running on empty by mid-afternoon, snapping over stuff that didn't deserve it.\",\n      slide3: \"nothing fancy. saffron drops in my coffee every morning, that's the whole ritual. few weeks in, the little stuff just stopped getting to me the way it used to.\",\n      slide4: 'might not go this way for you, i don\\'t know. all i know is it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i already ordered my second.'\n    },\n    'review-b3': {\n      filled: true, form: 'reviewcard', aiMark: false,\n      h1: \"Saffron drops for the skeptics\",\n      headline: \"I was a skeptic\",\n      slide1: \"Honestly, I figured this was one more bottle that does nothing. I keep them by the kettle so I actually remember. It's not magic.\",\n      // b3 keeps its skeptic register through the tail (bespoke, not the shared confessional one)\n      slide2: \"i'll be honest, i figured it was one more bottle that does nothing. kept it by the kettle mostly so i wouldn't forget i'd paid for it.\",\n      slide3: \"few weeks of dropping it in my morning coffee and i quietly stopped waiting for it to not work. not magic. that's about as far as i'll go admitting it.\",\n      slide4: 'might not go this way for you, i don\\'t know. all i know is it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i already ordered my second.'\n    },\n    'review-b4': {\n      filled: true, form: 'reviewcard', aiMark: false,\n      h1: \"Saffron drops for your evening wind-down\",\n      headline: \"Quieter by 5pm\",\n      slide1: \"My head used to get loud around 5pm, every little thing stacking up while I made dinner. Two months in, <b>I can chop an onion without feeling like the whole house is bearing down on me.</b>\",\n      slide2: \"for a while there i wasn't really myself. short with the people i love, running on empty by mid-afternoon, snapping over stuff that didn't deserve it.\",\n      slide3: \"nothing fancy. saffron drops in my coffee every morning, that's the whole ritual. few weeks in, the little stuff just stopped getting to me the way it used to.\",\n      slide4: 'might not go this way for you, i don\\'t know. all i know is it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i already ordered my second.'\n    },\n    'review-b5': {\n      filled: true, form: 'reviewcard', aiMark: false,\n      h1: \"Saffron drops for the long phone calls\",\n      headline: \"Kept my cool\",\n      slide1: \"I'm 54 and this season has been a lot. A friend swears by the drops, so I caved. Took three weeks to notice anything. <b>But this Tuesday I got through a long call with my mom and stayed calm.</b>\",\n      slide2: \"for a while there i wasn't really myself. short with the people i love, running on empty by mid-afternoon, snapping over stuff that didn't deserve it.\",\n      slide3: \"nothing fancy. saffron drops in my coffee every morning, that's the whole ritual. few weeks in, the little stuff just stopped getting to me the way it used to.\",\n      slide4: 'might not go this way for you, i don\\'t know. all i know is it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i already ordered my second.'\n    },\n    'review-b6': {\n      filled: true, form: 'reviewcard', aiMark: false,\n      h1: \"Saffron drops that support your everyday calm*\",\n      headline: \"Saffron is insane\",\n      slide1: \"Update: it's been 6 weeks. I cleaned my apartment, called my mom back, and <b>didn't cry at work once.</b>\",\n      slide2: \"for a while there i wasn't really myself. short with the people i love, running on empty by mid-afternoon, snapping over stuff that didn't deserve it.\",\n      slide3: \"nothing fancy. saffron drops in my coffee every morning, that's the whole ritual. few weeks in, the little stuff just stopped getting to me the way it used to.\",\n      slide4: 'might not go this way for you, i don\\'t know. all i know is it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i already ordered my second.'\n    },\n\n    /* ===== C1 static \u00B7 adset-person-review \u2014 EMPTY SLOTS (block: person)\n       token person-{photo}  \u2190  personreview-A6-daniela-{photo}-{1x1,9x16}.png\n       Note (spec \u00A75.2): fixed A6 text, hero swaps the DANIELA PHOTO to match the ad.\n       Owner: set `image` to a per-photo SCENE_URLS key (add 5 keys to liquid). ==== */\n    /* form:'review' \u2192 slide 1 renders the review-card overlay. All 5 share the\n       FIXED A6 review text (headline + body, SoT = shipped person-review creative);\n       only the DANIELA PHOTO varies (this adset tests the IMAGE). Slides 2-4 =\n       the A6 story in the glass tweet form (Alex 2026-07-16: \"continue A6\"). */\n    'person-studio': {\n      filled: true, form: 'person', image: 'person-studio', pos: '50% 16%', aiMark: false,\n      h1: \"Saffron drops that support your everyday calm*\",\n      headline: \"Saffron is insane.\",\n      slide1: \"It\u2019s been 6 weeks. I cleaned my apartment, called my mom back, and <b>didn\u2019t cry at work once.</b>\",\n      slide2: \"six weeks ago the apartment was a mess, i hadn't called my mom back in weeks, and i cried in the work bathroom more than i'd like to admit.\",\n      slide3: \"nothing heroic. saffron in my coffee every morning, that's it. not magic, but around week three i stopped snapping over little things.\",\n      slide4: 'might not go this way for you, i don\\'t know. all i know is it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i already ordered my second. that\\'s the whole story.'\n    },\n    'person-seated': {\n      filled: true, form: 'person', image: 'person-seated', pos: '50% 6%', aiMark: false,\n      h1: \"Saffron drops that support your everyday calm*\",\n      headline: \"Saffron is insane.\",\n      slide1: \"It\u2019s been 6 weeks. I cleaned my apartment, called my mom back, and <b>didn\u2019t cry at work once.</b>\",\n      slide2: \"six weeks ago the apartment was a mess, i hadn't called my mom back in weeks, and i cried in the work bathroom more than i'd like to admit.\",\n      slide3: \"nothing heroic. saffron in my coffee every morning, that's it. not magic, but around week three i stopped snapping over little things.\",\n      slide4: 'might not go this way for you, i don\\'t know. all i know is it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i already ordered my second. that\\'s the whole story.'\n    },\n    'person-coatgold': {\n      filled: true, form: 'person', image: 'person-coatgold', pos: '52% 2%', aiMark: false,\n      h1: \"Saffron drops that support your everyday calm*\",\n      headline: \"Saffron is insane.\",\n      slide1: \"It\u2019s been 6 weeks. I cleaned my apartment, called my mom back, and <b>didn\u2019t cry at work once.</b>\",\n      slide2: \"six weeks ago the apartment was a mess, i hadn't called my mom back in weeks, and i cried in the work bathroom more than i'd like to admit.\",\n      slide3: \"nothing heroic. saffron in my coffee every morning, that's it. not magic, but around week three i stopped snapping over little things.\",\n      slide4: 'might not go this way for you, i don\\'t know. all i know is it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i already ordered my second. that\\'s the whole story.'\n    },\n    'person-forestred': {\n      filled: true, form: 'person', image: 'person-forestred', pos: '54% 4%', aiMark: false,\n      h1: \"Saffron drops that support your everyday calm*\",\n      headline: \"Saffron is insane.\",\n      slide1: \"It\u2019s been 6 weeks. I cleaned my apartment, called my mom back, and <b>didn\u2019t cry at work once.</b>\",\n      slide2: \"six weeks ago the apartment was a mess, i hadn't called my mom back in weeks, and i cried in the work bathroom more than i'd like to admit.\",\n      slide3: \"nothing heroic. saffron in my coffee every morning, that's it. not magic, but around week three i stopped snapping over little things.\",\n      slide4: 'might not go this way for you, i don\\'t know. all i know is it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i already ordered my second. that\\'s the whole story.'\n    },\n    'person-autumndandelion': {\n      filled: true, form: 'person', image: 'person-autumndandelion', pos: '50% 4%', aiMark: false,\n      h1: \"Saffron drops that support your everyday calm*\",\n      headline: \"Saffron is insane.\",\n      slide1: \"It\u2019s been 6 weeks. I cleaned my apartment, called my mom back, and <b>didn\u2019t cry at work once.</b>\",\n      slide2: \"six weeks ago the apartment was a mess, i hadn't called my mom back in weeks, and i cried in the work bathroom more than i'd like to admit.\",\n      slide3: \"nothing heroic. saffron in my coffee every morning, that's it. not magic, but around week three i stopped snapping over little things.\",\n      slide4: 'might not go this way for you, i don\\'t know. all i know is it\\'s <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and i already ordered my second. that\\'s the whole story.'\n    },\n\n    /* ===== C2 paid-ugc \u00B7 adset-maren \u2014 BUILT (block: ugc, form:'ugc')\n       token ugc-maren-{N}  \u2190  \"Saffron HOOK {N} (Maren Carpenter).MOV\"\n       FORM = lower-third quote over a real creator video frame (slides 1-3);\n       slide 4 = product+offer glass card (as live). Content locked by Alex 2026-07-17.\n       slide1 = VERBATIM on-screen/spoken HOOK of variant N (per-variant, own frame).\n       slide2/3/4 = per-CREATOR (shared across the 5 Maren variants). aiMark:false\n       (real footage). image = SCENE_URLS key of the slide-1 hook frame (hN); image2/\n       image3 = slide-2/3 per-creator frames (assets pending \u2192 keys reserved). ======= */\n    'ugc-maren-1': {\n      filled: true, form: 'ugc', creator: 'maren', aiMark: false, attrib: 'Maren',\n      image: 'ugc-maren-1', image2: 'ugc-maren-s2', image3: 'ugc-maren-s3', image4: 'ugc-maren-s4',\n      pos: '50% 22%', pos2: '50% 40%', pos3: '50% 40%', pos4: '50% 82%',\n      slide1: \"Because I have little kids, I've basically accepted that being drained by the evening was just kinda my lot in life. But it turns out my fatigue...\",\n      slide2: \"I'm the one making the grocery list, folding laundry, cleaning the house.\",\n      slide3: \"So I started adding a couple drops of this to my coffee each morning because it was such an easy habit to keep.\",\n      slide4: 'It\\'s literally just saffron, glycerin, and water. <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and I already grabbed a second.'\n    },\n    'ugc-maren-2': {\n      filled: true, form: 'ugc', creator: 'maren', aiMark: false, attrib: 'Maren',\n      image: 'ugc-maren-2', image2: 'ugc-maren-s2', image3: 'ugc-maren-s3', image4: 'ugc-maren-s4',\n      pos: '50% 22%', pos2: '50% 40%', pos3: '50% 40%', pos4: '50% 82%',\n      slide1: \"Did you see the video of a woman who said she started putting saffron in her coffee and stopped feeling wiped out by 5pm? I thought she was exaggerating, but turns out she wasn't.\",\n      slide2: \"I'm the one making the grocery list, folding laundry, cleaning the house.\",\n      slide3: \"So I started adding a couple drops of this to my coffee each morning because it was such an easy habit to keep.\",\n      slide4: 'It\\'s literally just saffron, glycerin, and water. <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and I already grabbed a second.'\n    },\n    'ugc-maren-3': {\n      filled: true, form: 'ugc', creator: 'maren', aiMark: false, attrib: 'Maren',\n      image: 'ugc-maren-3', image2: 'ugc-maren-s2', image3: 'ugc-maren-s3', image4: 'ugc-maren-s4',\n      pos: '50% 22%', pos2: '50% 40%', pos3: '50% 40%', pos4: '50% 82%',\n      slide1: \"Why are we putting the most expensive spice in the world in a coffee? Of course I had to find out.\",\n      slide2: \"I'm the one making the grocery list, folding laundry, cleaning the house.\",\n      slide3: \"So I started adding a couple drops of this to my coffee each morning because it was such an easy habit to keep.\",\n      slide4: 'It\\'s literally just saffron, glycerin, and water. <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and I already grabbed a second.'\n    },\n    'ugc-maren-4': {\n      filled: true, form: 'ugc', creator: 'maren', aiMark: false, attrib: 'Maren',\n      image: 'ugc-maren-4', image2: 'ugc-maren-s2', image3: 'ugc-maren-s3', image4: 'ugc-maren-s4',\n      pos: '50% 22%', pos2: '50% 40%', pos3: '50% 40%', pos4: '50% 82%',\n      slide1: \"So you're telling me that putting a couple drops of this in my coffee every morning will help me feel more like myself and less like this.\",\n      slide2: \"I'm the one making the grocery list, folding laundry, cleaning the house.\",\n      slide3: \"So I started adding a couple drops of this to my coffee each morning because it was such an easy habit to keep.\",\n      slide4: 'It\\'s literally just saffron, glycerin, and water. <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and I already grabbed a second.'\n    },\n    'ugc-maren-5': {\n      filled: true, form: 'ugc', creator: 'maren', aiMark: false, attrib: 'Maren',\n      image: 'ugc-maren-5', image2: 'ugc-maren-s2', image3: 'ugc-maren-s3', image4: 'ugc-maren-s4',\n      pos: '50% 22%', pos2: '50% 40%', pos3: '50% 40%', pos4: '50% 82%',\n      slide1: \"I saw this comment that said, 'don't try this \u2014 unless you want to feel like yourself again.' So naturally I ordered it.\",\n      slide2: \"I'm the one making the grocery list, folding laundry, cleaning the house.\",\n      slide3: \"So I started adding a couple drops of this to my coffee each morning because it was such an easy habit to keep.\",\n      slide4: 'It\\'s literally just saffron, glycerin, and water. <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and I already grabbed a second.'\n    },\n\n    /* ===== C2 paid-ugc \u00B7 adset-taylor \u2014 BUILT (block: ugc, form:'ugc')\n       token ugc-taylor-{N}  \u2190  \"Saffron HOOK {N} (Taylor Wysong).MOV\" ============ */\n    'ugc-taylor-1': {\n      filled: true, form: 'ugc', creator: 'taylor', aiMark: false, attrib: 'Taylor',\n      image: 'ugc-taylor-1', image2: 'ugc-taylor-s2', image3: 'ugc-taylor-s3', image4: 'ugc-taylor-s4',\n      pos: '50% 20%', pos2: '50% 32%', pos3: '50% 36%', pos4: '50% 48%',\n      slide1: \"I tried so many things that did nothing. I basically stopped hoping. This one surprised me.\",\n      /* per-token override of the taylor creator-default slide2 (below) \u2014 hook/slide1\n         is near-identical to the shared quote, so this token uses her HOOK5 @0:00\n         verbatim line instead. Do not change wording (verbatim quote). Alex 2026-07-17. */\n      slide2: \"I'd almost given up on finding a supplement that actually does something.\",\n      slide3: \"Then about two weeks later, I realized I wasn't dragging in the afternoon like I normally was.\",\n      slide4: 'Just saffron, glycerin and water, no sugar, no alcohol. <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and I already grabbed a second.'\n    },\n    'ugc-taylor-2': {\n      filled: true, form: 'ugc', creator: 'taylor', aiMark: false, attrib: 'Taylor',\n      image: 'ugc-taylor-2', image2: 'ugc-taylor-s2', image3: 'ugc-taylor-s3', image4: 'ugc-taylor-s4',\n      pos: '50% 20%', pos2: '50% 32%', pos3: '50% 36%', pos4: '50% 48%',\n      slide1: \"I used to scroll right past these little drops for women. Then I actually tried it, and now I get it.\",\n      slide2: \"I tried so many things that did nothing. I basically stopped hoping.\",\n      slide3: \"Then about two weeks later, I realized I wasn't dragging in the afternoon like I normally was.\",\n      slide4: 'Just saffron, glycerin and water, no sugar, no alcohol. <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and I already grabbed a second.'\n    },\n    'ugc-taylor-3': {\n      filled: true, form: 'ugc', creator: 'taylor', aiMark: false, attrib: 'Taylor',\n      image: 'ugc-taylor-3', image2: 'ugc-taylor-s2', image3: 'ugc-taylor-s3', image4: 'ugc-taylor-s4',\n      pos: '50% 20%', pos2: '50% 32%', pos3: '50% 36%', pos4: '50% 48%',\n      slide1: \"I'm the type who quits everything after three days. This one's still on my counter a month later.\",\n      slide2: \"I tried so many things that did nothing. I basically stopped hoping.\",\n      slide3: \"Then about two weeks later, I realized I wasn't dragging in the afternoon like I normally was.\",\n      slide4: 'Just saffron, glycerin and water, no sugar, no alcohol. <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and I already grabbed a second.'\n    },\n    'ugc-taylor-4': {\n      filled: true, form: 'ugc', creator: 'taylor', aiMark: false, attrib: 'Taylor',\n      image: 'ugc-taylor-4', image2: 'ugc-taylor-s2', image3: 'ugc-taylor-s3', image4: 'ugc-taylor-s4',\n      pos: '50% 20%', pos2: '50% 32%', pos3: '50% 36%', pos4: '50% 48%',\n      slide1: \"A friend kept telling me to try it, so I finally did.\",\n      slide2: \"I tried so many things that did nothing. I basically stopped hoping.\",\n      slide3: \"Then about two weeks later, I realized I wasn't dragging in the afternoon like I normally was.\",\n      slide4: 'Just saffron, glycerin and water, no sugar, no alcohol. <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and I already grabbed a second.'\n    },\n    'ugc-taylor-5': {\n      filled: true, form: 'ugc', creator: 'taylor', aiMark: false, attrib: 'Taylor',\n      image: 'ugc-taylor-5', image2: 'ugc-taylor-s2', image3: 'ugc-taylor-s3', image4: 'ugc-taylor-s4',\n      pos: '50% 20%', pos2: '50% 32%', pos3: '50% 36%', pos4: '50% 48%',\n      slide1: \"I'd almost given up on finding a supplement that actually does something, but this one caught me off guard.\",\n      slide2: \"I tried so many things that did nothing. I basically stopped hoping.\",\n      slide3: \"Then about two weeks later, I realized I wasn't dragging in the afternoon like I normally was.\",\n      slide4: 'Just saffron, glycerin and water, no sugar, no alcohol. <span class=\"swc-price\">$39.99</span> a bottle, 10% off if you subscribe, and I already grabbed a second.'\n    },\n\n    /* ===== C3 creators \u00B7 adset-01-mood \u2014 EMPTY SLOTS (block: creator, angle mood)\n       token cr-mood-{n}  \u2190  files in adset (alphabetical order = n; see table).\n       Note (spec \u00A75.3, OPEN): creator-angle hero form undecided. ================= */\n    'cr-mood-1': SLOT('C3 mood \u00B7 MOOD__authority-RN__stephanie-rn-08__7623__v1__norm.mp4'),\n    'cr-mood-2': SLOT('C3 mood \u00B7 MOOD__burnt-out-mom__4pretty0chaotic5__7641.mp4'),\n    'cr-mood-3': SLOT('C3 mood \u00B7 MOOD__natural-no-pharma__4pretty0chaotic5__7647778.mp4'),\n    'cr-mood-4': SLOT('C3 mood \u00B7 MOOD__peer-rec__jenniferryals__7587__v2__norm.mp4'),\n    'cr-mood-5': SLOT('C3 mood \u00B7 MOOD__product-demo__saffron-drops-4oz__v1__norm.mp4'),\n    'cr-mood-6': SLOT('C3 mood \u00B7 MOOD__single-parent__fromthemudque__7619008.mp4'),\n    'cr-mood-7': SLOT('C3 mood \u00B7 MOOD__single-parent__fromthemudque__7625479.mp4'),\n\n    /* ===== C3 creators \u00B7 adset-02-ingredient \u2014 EMPTY SLOTS (angle ingredient)\n       token cr-ingredient-{n}. \u26A0 adset carries _FLAG-embedded-claims.txt ========= */\n    'cr-ingredient-1': SLOT('C3 ingredient \u00B7 INGRED__busy-mom__v2__norm.mp4'),\n    'cr-ingredient-2': SLOT('C3 ingredient \u00B7 INGRED__reviewer__shumaila-danish__7589__v1__norm.mp4'),\n    'cr-ingredient-3': SLOT('C3 ingredient \u00B7 INGRED__taste-demo__bmarieromero23__7627__v1__norm.mp4'),\n    'cr-ingredient-4': SLOT('C3 ingredient \u00B7 INGRED__wellness-savvy__kwateena__7636.mp4'),\n    'cr-ingredient-5': SLOT('C3 ingredient \u00B7 INGRED__wellness-savvy__kwateena__7652__faster-intro__norm.mp4'),\n\n    /* ===== C3 creators \u00B7 adset-03-calm \u2014 EMPTY SLOTS (angle calm)\n       token cr-calm-{n}. \u26A0 adset carries _FLAG.txt ============================== */\n    'cr-calm-1': SLOT('C3 calm \u00B7 CALM__authority-ND__linda-wells-nd__7615__v1__norm.mp4'),\n    'cr-calm-2': SLOT('C3 calm \u00B7 CALM__mud__7635498__v2__norm.mp4'),\n    'cr-calm-3': SLOT('C3 calm \u00B7 CALM__overwhelmed-parent__creativeparenting75__7645.mp4'),\n    'cr-calm-4': SLOT('C3 calm \u00B7 CALM__single-parent__fromthemudque__7619928.mp4'),\n    'cr-calm-5': SLOT('C3 calm \u00B7 CALM__single-parent__fromthemudque__7620246.mp4'),\n    'cr-calm-6': SLOT('C3 calm \u00B7 CALM__woman-40plus__blessed-with-makeup__7643__v2__norm.mp4'),\n\n    /* ===== C3 creators \u00B7 adset-04-consistency \u2014 EMPTY SLOTS (angle consistency)\n       token cr-consistency-{n}. ================================================= */\n    'cr-consistency-1': SLOT('C3 consistency \u00B7 CONSIST__mud__7623764__v2__norm.mp4'),\n    'cr-consistency-2': SLOT('C3 consistency \u00B7 CONSIST__single-parent__fromthemudque__7619542.mp4'),\n    'cr-consistency-3': SLOT('C3 consistency \u00B7 CONSIST__single-parent__fromthemudque__7621004__v1__norm.mp4'),\n    'cr-consistency-4': SLOT('C3 consistency \u00B7 CONSIST__single-parent__fromthemudque__7621009.mp4'),\n\n    /* ===== C3 creators \u00B7 adset-05-beauty-glow \u2014 EMPTY SLOTS (angle beauty)\n       token cr-beauty-{n}  (adset dir = beauty-glow; token block = beauty per \u00A77) = */\n    'cr-beauty-1': SLOT('C3 beauty \u00B7 BEAUTY__lifestyle-woman__schneidertails__jb.MOV'),\n    'cr-beauty-2': SLOT('C3 beauty \u00B7 BEAUTY__mom__sidehustlemama33__jb.MOV'),\n    'cr-beauty-3': SLOT('C3 beauty \u00B7 BEAUTY__wellness-woman__carolarrospide__jb.MOV')\n\n  };\n\n  /* Global fallback. Unknown/empty/unfilled token resolves here so live is never\n     blank. Changing the visible default also needs the liquid defaults updated\n     (#swc-s1-photo src + #swc-s1..s4-body) \u2014 3 places, see CONTENT-SUBSTITUTION-SPEC. */\n  var DEFAULT = 'tweet-A6';\n  var OFFER_LONG_LINES = 4;\n\n  /* -- STRICT token match: utm_content \u2192 a MAP key, or null on NO hit ---------\n     1) exact token match (the run-spec sets utm_content = the token verbatim);\n     2) delimited-substring match (token embedded in a longer utm string);\n     3) legacy bare tweet anchor a1..a6 (pre-namespace URLs) \u2192 tweet-A{n};\n     otherwise null (NO fallback). Empty/unknown utm returns null so the H1 keeps\n     its static liquid default (SEO / no-JS) instead of adopting DEFAULT's h1. */\n  var KEYS = Object.keys(MAP);\n  function matchToken(raw) {\n    if (!raw) return null;\n    var s = String(raw).toLowerCase().trim();\n    if (!s) return null;\n    var i, k;\n    for (i = 0; i < KEYS.length; i++) {              // 1) exact\n      if (KEYS[i].toLowerCase() === s) return KEYS[i];\n    }\n    for (i = 0; i < KEYS.length; i++) {              // 2) delimited substring\n      k = KEYS[i].toLowerCase().replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n      if (new RegExp('(^|[^a-z0-9])' + k + '([^a-z0-9]|$)').test(s)) return KEYS[i];\n    }\n    var m = /(^|[^a-z0-9])a([1-6])([^a-z0-9]|$)/.exec(s);  // 3) legacy bare anchor\n    if (m && MAP['tweet-A' + m[2]]) return 'tweet-A' + m[2];\n    return null;                                     // no match\n  }\n  /* -- token resolver WITH fallback: matchToken() or DEFAULT (tweet-A6). Used for\n     the slide/scene/marker so a live hero is NEVER blank on empty/unknown utm. */\n  function resolveToken(raw) { return matchToken(raw) || DEFAULT; }\n  function getUtm() {\n    try {\n      return new URLSearchParams(window.location.search).get('utm_content');\n    } catch (e) {\n      var m = /[?&]utm_content=([^&#]*)/i.exec(window.location.search || '');\n      return m ? decodeURIComponent(m[1].replace(/\\+/g, ' ')) : null;\n    }\n  }\n\n  /* -- measure the slide-4 offer copy \u2192 apply the .swc-offer--long degradation\n     when it wraps to OFFER_LONG_LINES+ (keeps the bottle full-size). Slide 4 is\n     normally display:none, and getBoundingClientRect on a hidden node returns 0,\n     so we temporarily block+hidden it (no paint happens mid-function) to measure\n     at its real width. Also re-run on resize (orientation change). ------------ */\n  function measureOffer() {\n    var b4 = document.getElementById('swc-s4-body');\n    if (!b4) return;\n    var card4 = b4.closest('.swc-card');\n    if (!card4) return;\n    card4.classList.remove('swc-offer--long');\n    var hidden = !card4.classList.contains('is-active');\n    var prevD, prevV;\n    if (hidden) {\n      prevD = card4.style.display; prevV = card4.style.visibility;\n      card4.style.visibility = 'hidden'; card4.style.display = 'block';\n    }\n    var lh = parseFloat(getComputedStyle(b4).lineHeight) || 20;\n    var lines = Math.round(b4.getBoundingClientRect().height / lh);\n    if (hidden) { card4.style.display = prevD; card4.style.visibility = prevV; }\n    card4.classList.toggle('swc-offer--long', lines >= OFFER_LONG_LINES);\n  }\n\n  /* -- apply token: swap slide-1 scene + all 4 tweet bodies ----------------\n     Unfilled slot (or unknown token) \u2192 render DEFAULT content, so the hero is\n     never blank on live. Only fully-`filled` slots render their own content. */\n  function apply(token, matchedKey) {\n    var c = MAP[token];\n\n    /* H1 message-match \u2014 swap #swc-h1 ONLY on an EXPLICIT utm hit (matchedKey,\n       from the STRICT matcher) to a FILLED slot that declares an h1. Empty or\n       unknown utm \u2192 matchedKey is null \u2192 leave the static liquid <h1> default\n       (\"\u2026calm and your everyday balance*\"), so SEO/no-JS and the render agree\n       (no adopting DEFAULT tweet-A6's h1 on a non-match). An explicit hit to an\n       unfilled slot (e.g. ugc-*) also keeps the default (no h1 field). */\n    var h1el = document.getElementById('swc-h1');\n    if (h1el && matchedKey) {\n      var mc = MAP[matchedKey];\n      if (mc && mc.filled && mc.h1) h1el.textContent = mc.h1;\n    }\n\n    if (!c || !c.filled) c = MAP[DEFAULT];\n\n    /* slide-1 FORM switch \u2014 3 forms, matched to the ad creative the click came from:\n         'tweet'      \u2192 glass tweet over the photo (default; live A1\u2013A6)\n         'person'     \u2192 full-bleed Daniela portrait + review overlay (person-review ads)\n         'reviewcard' \u2192 light testimonial card on a sky bg (review-card / whn-1 ads)\n       Slides 2\u20134 always stay the glass tweet form. CSS keys off the root class. */\n    var form = c.form || 'tweet';\n    root.classList.toggle('swc-s1-person', form === 'person');\n    root.classList.toggle('swc-s1-reviewcard', form === 'reviewcard');\n    /* 'ugc' \u2192 lower-third quote band over a real creator video frame on slides 1-3\n       (per-variant hook on s1, per-creator quotes on s2/s3); slide 4 stays the\n       product+offer glass card. CSS keys off .swc-s1-ugc. Real footage \u2192 AI marks\n       hidden by CSS; JS swaps s2/s3 photos + fills the three lower-third bands. */\n    root.classList.toggle('swc-s1-ugc', form === 'ugc');\n\n    /* slide-1 AI-imagery \"*\" marker (.swc-ai-mark--s1) \u2014 PER-TOKEN flag, NOT by\n       form: form\u2260photo-provenance (e.g. all 5 person-* slide-1 photos are REAL,\n       not AI-generated \u2192 false, confirmed by Alex 2026-07-17; review-* have no\n       photo \u2192 false; all tweet-* scenes are AI \u2192 true). `c` is already the\n       DEFAULT fallback here, so an unfilled slot / unknown token \u2192 tweet-A6\n       (aiMark:true) \u2192 shown. Slides 2-3 markers stay static in markup (shared\n       AI Daniela scenes \u2192 always shown, even for person-* variants). */\n    root.classList.toggle('swc-ai-hide-s1', !c.aiMark);\n\n    /* slide-1 background photo \u2014 used by tweet + person (reviewcard hides it via CSS,\n       card sits on a sky gradient). */\n    var img = document.getElementById('swc-s1-photo');\n    if (img) {\n      var url = SCENE_URLS[c.image] || SCENE_URLS[MAP[DEFAULT].image];\n      if (url) img.src = url;\n      img.style.objectPosition = c.pos || '50% 40%';\n    }\n\n    /* person-form slide-1 fields (headline + body may carry <b>) */\n    var pHl = document.getElementById('swc-s1-headline');\n    if (pHl) pHl.textContent = (form === 'person') ? (c.headline || '') : '';\n    var pB = document.getElementById('swc-s1-rvbody');\n    if (pB) pB.innerHTML = (form === 'person') ? (c.slide1 || '') : '';\n\n    /* reviewcard-form slide-1 fields (label + name static in markup; headline+body swap) */\n    var rcHl = document.getElementById('swc-s1-rc-h');\n    if (rcHl) rcHl.textContent = (form === 'reviewcard') ? (c.headline || '') : '';\n    var rcB = document.getElementById('swc-s1-rc-b');\n    if (rcB) rcB.innerHTML = (form === 'reviewcard') ? (c.slide1 || '') : '';\n\n    /* tweet-form slide-1 body (only for tweet blocks; blank in person/reviewcard) */\n    var b1 = document.getElementById('swc-s1-body'); if (b1) b1.textContent = (form === 'tweet') ? c.slide1 : '';\n    var b2 = document.getElementById('swc-s2-body'); if (b2) b2.textContent = c.slide2;\n    var b3 = document.getElementById('swc-s3-body'); if (b3) b3.textContent = c.slide3;\n    var b4 = document.getElementById('swc-s4-body');\n    if (b4) {\n      b4.innerHTML = c.slide4; // has <span class=\"swc-price\">\n      measureOffer();\n    }\n\n    /* UGC form: swap the per-slide background photos (s1 hook frame set above via\n       #swc-s1-photo; s2/s3 are per-creator frames) and fill the three lower-third\n       quote bands (slide 4 stays the glass product card, body already set above).\n       Quote wrapped in curly quotes; attribution = \"\u2014 <name>\" (name only). */\n    if (form === 'ugc') {\n      var s2img = document.getElementById('swc-s2-photo');\n      var s3img = document.getElementById('swc-s3-photo');\n      if (s2img && SCENE_URLS[c.image2]) { s2img.src = SCENE_URLS[c.image2]; s2img.style.objectPosition = c.pos2 || '50% 40%'; }\n      if (s3img && SCENE_URLS[c.image3]) { s3img.src = SCENE_URLS[c.image3]; s3img.style.objectPosition = c.pos3 || '50% 40%'; }\n      /* slide 4 (Alex 2026-07-17, \"Lower-third XL\"): the CREATOR FRAME holding the\n         bottle \u2014 not the live bottle render, not the glass tweet card. Full-bleed\n         photo + a \"lower-third XL\" panel at the bottom (dark gradient \u2192 white quote,\n         \"\u2014 Name\", price line, subscribe line, green CTA). pos4 keeps the head\n         un-cropped and the bottle label above the panel. The glass .swc-tw card, its\n         avatar / X-logo / counters / verified are all hidden by CSS in the ugc form.\n         Structure/CSS ported from ugc-frames/slide4-picker.html \u00A71. */\n      var s4img = document.getElementById('swc-s4-photo');\n      if (s4img && SCENE_URLS[c.image4]) { s4img.src = SCENE_URLS[c.image4]; s4img.style.objectPosition = c.pos4 || '50% 12%'; }\n      var attribLine = c.attrib ? ('\u2014 ' + c.attrib) : '';\n      setLowerThird('swc-s1-lt', c.slide1, attribLine);\n      setLowerThird('swc-s2-lt', c.slide2, attribLine);\n      setLowerThird('swc-s3-lt', c.slide3, attribLine);\n\n      /* slide-4 lower-third XL panel \u2014 per-creator quote (verbatim, short form) +\n         name only. Price / subscribe line / CTA are static in the markup. */\n      var s4q = document.getElementById('swc-s4x-q');\n      var s4a = document.getElementById('swc-s4x-a');\n      var ugcS4 = UGC_S4[c.creator] || {};\n      if (s4q) s4q.textContent = ugcS4.quote ? ('\u201C' + ugcS4.quote + '\u201D') : '';\n      if (s4a) s4a.textContent = attribLine;\n    }\n  }\n\n  /* fill one lower-third band: #<pfx>-q = curly-quoted quote, #<pfx>-a = attribution */\n  function setLowerThird(pfx, quote, attribLine) {\n    var q = document.getElementById(pfx + '-q');\n    var a = document.getElementById(pfx + '-a');\n    if (q) q.textContent = quote ? ('\u201C' + quote + '\u201D') : '';\n    if (a) a.textContent = attribLine || '';\n  }\n\n  /* -- slider mechanics \u2014 mirrors the lander's .b02g slider UX ------------ */\n  var slides = Array.prototype.slice.call(root.querySelectorAll('.swc-card'));\n  var dots = Array.prototype.slice.call(root.querySelectorAll('.swc-dots button'));\n  var N = slides.length;\n  var current = 1;\n\n  function show(n) {\n    if (n < 1) n = N; if (n > N) n = 1;\n    current = n;\n    slides.forEach(function (s) {\n      s.classList.toggle('is-active', s.getAttribute('data-slide') === String(n));\n    });\n    // per-card dots: mark the matching index in the active card's dot row\n    root.querySelectorAll('.swc-dots').forEach(function (row) {\n      var bs = row.querySelectorAll('button');\n      for (var i = 0; i < bs.length; i++) {\n        bs[i].classList.toggle('on', (i + 1) === n);\n      }\n    });\n    // IG-style counter (mobile): current slide number (\"n/4\"); total is static in markup\n    var cc = document.getElementById('swc-count-cur');\n    if (cc) cc.textContent = n;\n  }\n\n  // tap on visible slide \u2192 next (F2), with tap/swipe discrimination + control guard\n  slides.forEach(function (s) {\n    var dx = 0, dy = 0, moved = false;\n    s.addEventListener('pointerdown', function (e) { dx = e.clientX; dy = e.clientY; moved = false; });\n    s.addEventListener('pointermove', function (e) {\n      if (Math.abs(e.clientX - dx) > 10 || Math.abs(e.clientY - dy) > 10) moved = true;\n    });\n    s.addEventListener('click', function (e) {\n      if (moved) return;                                                    // was a swipe/drag, not a tap\n      if (e.target.closest('a,button,input,label,[role=\"button\"]')) return; // let real controls work\n      show(current % N + 1);\n    });\n  });\n\n  // horizontal swipe on the stage \u2192 prev / next\n  (function () {\n    var stage = root.querySelector('.swc-stage');\n    if (!stage) return;\n    var sx = 0, sy = 0, tracking = false;\n    stage.addEventListener('pointerdown', function (e) { sx = e.clientX; sy = e.clientY; tracking = true; });\n    stage.addEventListener('pointerup', function (e) {\n      if (!tracking) return; tracking = false;\n      var adx = e.clientX - sx, ady = e.clientY - sy;\n      if (Math.abs(adx) > 40 && Math.abs(adx) > Math.abs(ady)) {\n        show(adx < 0 ? current % N + 1 : (current + N - 2) % N + 1);\n      }\n    });\n    stage.addEventListener('pointercancel', function () { tracking = false; });\n  })();\n\n  // IG-style side arrows \u2192 prev / next (siblings of the cards, not inside them,\n  // so the per-card tap-to-advance handler never fires for an arrow click)\n  var prevBtn = root.querySelector('.swc-arrow--prev');\n  var nextBtn = root.querySelector('.swc-arrow--next');\n  if (prevBtn) prevBtn.addEventListener('click', function (e) {\n    e.stopPropagation(); show((current + N - 2) % N + 1);\n  });\n  if (nextBtn) nextBtn.addEventListener('click', function (e) {\n    e.stopPropagation(); show(current % N + 1);\n  });\n\n  // clickable dots\n  dots.forEach(function (b) {\n    b.addEventListener('click', function (e) {\n      e.stopPropagation();\n      var idx = Number(b.getAttribute('data-slide'));\n      if (idx) show(idx);\n    });\n  });\n\n  // green CTA(s) \u2192 scroll to the offer/package selector (no cart mutation; the real\n  // Add-to-Cart button lives under the slider and is untouched). Both the glass\n  // tweet-card CTA and the ugc lower-third-XL CTA share this behavior.\n  root.querySelectorAll('.swc-cta').forEach(function (ctaBtn) {\n    ctaBtn.addEventListener('click', function (e) {\n      e.preventDefault(); e.stopPropagation();\n      var target = document.querySelector('.b02f-packs') || document.getElementById('offer');\n      if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    });\n  });\n\n  // re-measure the offer degradation on resize / orientation change\n  var _rt;\n  window.addEventListener('resize', function () { clearTimeout(_rt); _rt = setTimeout(measureOffer, 200); });\n\n  /* -- init: apply token, then show slide 1 ------------------------------ */\n  var rawUtm = getUtm();\n  var matchedKey = matchToken(rawUtm);           // explicit hit (or null) \u2192 gates H1\n  apply(matchedKey || DEFAULT, matchedKey);      // slides/marker use the fallback token\n  show(1);\n\n  /* -- DECODE-GATED reveal (anti-FOUC) ----------------------------------------\n     apply() has just swapped #swc-s1-photo.src to the utm_content variant, but the\n     browser still paints the server-rendered DEFAULT (tweet-A6) bitmap until the new\n     one decodes. Adding .swc-ready synchronously here would fade the stage IN while\n     the OLD bitmap is still shown \u2192 a visible flash of A6, then a swap. So gate the\n     reveal on the variant photo's decode() (fallback: load/error), hard-capped at\n     1000ms (< the 1.4s CSS keyframe fallback in saffron-carousel.css:29) so a slow or\n     failed decode can never leave the hero stuck hidden. reveal() is idempotent.\n     \u26A0\uFE0F Paired with the head-inline preload in templates/page.saffron-lp.liquid\n     (\"anti-FOUC variant preload\"), which starts the variant download during HTML\n     parse \u2192 it is usually cached by here \u2192 decode resolves in-frame \u2192 no flash.\n     Organic / no-utm: img.src == the server-rendered A6 \u2192 already decoded \u2192 instant. */\n  var _revealed = false;\n  function reveal() { if (_revealed) return; _revealed = true; root.classList.add('swc-ready'); }\n  var s1img = document.getElementById('swc-s1-photo');\n  if (s1img && s1img.decode) {\n    s1img.decode().then(reveal).catch(reveal);\n  } else if (s1img) {\n    if (s1img.complete) reveal();\n    else { s1img.addEventListener('load', reveal); s1img.addEventListener('error', reveal); }\n  } else {\n    reveal();\n  }\n  setTimeout(reveal, 1000);   // hard cap < the 1.4s CSS keyframe fallback\n})();\n"],
  "mappings": "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",
  "names": ["matchedKey"]
}
