{
  "version": 3,
  "sources": ["/cdn/shop/t/3/assets/yt-bundle-pdp.js?rnd=1787737561568"],
  "sourcesContent": ["/**\n * yt-bundle-pdp.js \u2014 controller for sections/yt-bundle-pdp.liquid (the\n * bundle-world clone of the formula PDP).\n *\n * There is no minted variant: the blend arrives in sessionStorage under\n * `yt_blend_summary`, written by yt-byo.js at submit:\n *   { name, mode: 'sub'|'onetime', prices: {sub, one_time}, fee,\n *     ingredients: [{name, slug, dose_num, dose_unit}],\n *     bundle: { items: [{variant_id, quantity, selling_plan_30d, \u2026}],\n *               properties: {...} },\n *     spoon_variant_id, formula_id, at }\n *\n * This controller hydrates every dynamic node the legacy section fills\n * from metafields, then runs the same interactions: offer selection,\n * sticky bar, breakdown, and the two CTAs \u2014 which add the COMPONENT\n * lines (plus the free weighing spoon, deduped to one per cart) and go\n * to /cart or /checkout. Cold visits (no stored blend) bounce to the\n * builder, preserving the parent PDP's old redirect behaviour.\n */\n(function () {\n  'use strict';\n\n  /* Tin-name cap \u2014 see formulator/src/formula/name.ts and migration 168. */\n  var TIN_NAME_MAX = 22;\n  var STORAGE_KEY = 'yt_blend_summary';\n  var BUILDER_URL = '/pages/build-your-own';\n\n  function money(n) {\n    return '\u00A3' + (Math.round(Number(n) * 100) / 100).toFixed(2);\n  }\n  function esc(s) {\n    return String(s == null ? '' : s).replace(/[&<>\"']/g, function (c) {\n      return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c];\n    });\n  }\n\n  function validPayload(p) {\n    return p && p.bundle && Array.isArray(p.bundle.items) && p.bundle.items.length > 0;\n  }\n\n  async function boot() {\n    var root = document.querySelector('[data-yt-bundle-pdp]');\n    if (!root) return;\n\n    var payload = null;\n    try { payload = JSON.parse(sessionStorage.getItem(STORAGE_KEY) || 'null'); } catch (_e) {}\n\n    // SHAREABLE LINKS: ?blend=<formula id> is the page's real identity.\n    // sessionStorage is only the fast path for the customer who just\n    // submitted \u2014 anyone else (or any other device) hydrates from the\n    // formulator via the App Proxy. A fetched payload is cached back so\n    // refreshes are instant.\n    var urlId = new URLSearchParams(window.location.search).get('blend');\n    // Refetch when the stored payload predates 90-day commissioning (no\n    // items_90d) \u2014 otherwise a stale fast-path hides the default offer.\n    var storageStale = validPayload(payload) &&\n      (!(payload.bundle.items_90d && payload.bundle.items_90d.length) || !payload.nutrition);\n    if (urlId && /^[0-9a-f-]{36}$/i.test(urlId) && (!validPayload(payload) || payload.formula_id !== urlId || storageStale)) {\n      try {\n        // 2026-09-02: the section kicks this fetch off inline at parse time\n        // (window.__ytPdpPrefetch) so it isn't gated on the deferred bundle.\n        var pre = window.__ytPdpPrefetch;\n        var res = (pre && pre.id === urlId && pre.p)\n          ? await pre.p\n          : await fetch('/apps/yutrients/formula/' + encodeURIComponent(urlId) + '/pdp', {\n              credentials: 'same-origin',\n              headers: { Accept: 'application/json' },\n            });\n        window.__ytPdpPrefetch = null;\n        if (res.ok) {\n          var fetched = await res.json();\n          if (validPayload(fetched)) {\n            payload = fetched;\n            try { sessionStorage.setItem(STORAGE_KEY, JSON.stringify(fetched)); } catch (_e) {}\n          }\n        }\n      } catch (_e) { /* fall through to storage / redirect */ }\n    }\n\n    if (!validPayload(payload)) {\n      // No blend in hand \u2014 this page has nothing to show; go build one.\n      window.location.replace(BUILDER_URL);\n      return;\n    }\n    // Make THIS url shareable even when we arrived via sessionStorage.\n    if (payload.formula_id && urlId !== payload.formula_id) {\n      try {\n        var u = new URL(window.location.href);\n        u.searchParams.set('blend', payload.formula_id);\n        window.history.replaceState({}, '', u.toString());\n      } catch (_e) {}\n    }\n\n    // The engraving/rename overlay that used to live here is removed: no\n    // customer names a tin any more (founder, 28 Sep 2026). The server\n    // refuses customer renames (formulator src/account/engrave.ts).\n\n    var name = payload.name || 'My Formula';\n    var prices = payload.prices || {};\n    var subPrice = Number(prices.sub) || 0;\n    var oneTimePrice = Number(prices.one_time) || Math.round(subPrice * 1.25 * 100) / 100;\n    var fee = payload.fee == null ? 15 : Number(payload.fee); // 0 is REAL (base blends have no fee line)\n    var baseBlock = payload.base || null;\n    var ings = Array.isArray(payload.ingredients) ? payload.ingredients : [];\n    var editUrl = BUILDER_URL + (payload.formula_id ? '?stack=' + encodeURIComponent(payload.formula_id) : '');\n\n    // \u2500\u2500 static text hydration \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    document.title = name + ' \u2014 Yutrients';\n    root.querySelectorAll('.yt-formula-pdp__tin-overlay-text--dynamic').forEach(function (el) {\n      el.textContent = name;\n    });\n    root.querySelectorAll('[data-yt-bundle-ingcount]').forEach(function (el) {\n      el.textContent = String(ings.length);\n    });\n    // Any heading that renders the blend name (title node classes vary by\n    // theme revision \u2014 cover the known ones).\n    root.querySelectorAll('.yt-formula-pdp__title, [data-yt-formula-title]').forEach(function (el) {\n      el.textContent = name;\n    });\n    // The H1 is \"<name> <suffix span>\" \u2014 replace only the leading text\n    // node so the '- Your Made-to-Order\u2026' suffix keeps its own styling.\n    var h1 = root.querySelector('.yt-formula-pdp__desc-title');\n    if (h1 && h1.firstChild && h1.firstChild.nodeType === 3) {\n      h1.firstChild.textContent = name + ' ';\n    }\n    root.querySelectorAll('.yt-formula-pdp__edit-pill, .yt-formula-pdp__add-more, .yt-formula-pdp__cta-helper').forEach(function (a) {\n      a.setAttribute('href', editUrl);\n    });\n\n    // Founder 2026-08-28: a CUSTOM-named base blend titles as\n    // \"<Name> - <the base landing page's headline>\" (\"Jeff - Fall asleep\n    // faster. Wake up properly rested.\"). Default-named blends (base name\n    // or My formula) keep the standard title. The headline's source of\n    // truth is the landing page itself (theme-editor editable), so we read\n    // its server-rendered H1 rather than duplicating the copy anywhere.\n    function applyBaseTitle(currentName) {\n      if (!baseBlock || !baseBlock.slug || !currentName) return;\n      var trimmed = String(currentName).trim();\n      var isDefault =\n        /^my formula$/i.test(trimmed) ||\n        trimmed.toLowerCase() === String(baseBlock.name || '').trim().toLowerCase();\n      if (isDefault) return;\n      fetch('/products/base-' + encodeURIComponent(baseBlock.slug), { credentials: 'same-origin' })\n        .then(function (r) { return r.ok ? r.text() : null; })\n        .then(function (html) {\n          if (!html) return;\n          var doc = new DOMParser().parseFromString(html, 'text/html');\n          var srcEl = doc.querySelector('.yt-formula-pdp__desc-title');\n          var headline = srcEl ? srcEl.textContent.trim() : '';\n          if (!headline) return;\n          var h1c = root.querySelector('.yt-formula-pdp__desc-title');\n          if (h1c) {\n            h1c.textContent = '';\n            h1c.appendChild(document.createTextNode(trimmed + ' '));\n            var span = document.createElement('span');\n            span.className = 'yt-formula-pdp__desc-title-suffix';\n            span.textContent = '- ' + headline;\n            h1c.appendChild(span);\n          }\n          document.title = trimmed + ' - ' + headline + ' \u2014 Yutrients';\n        })\n        .catch(function () { /* title nicety \u2014 never block the page */ });\n    }\n    applyBaseTitle(name);\n\n    // Stale links still carrying ?engrave=1 (the retired naming overlay)\n    // just get the param tidied off the URL.\n    try {\n      var eu = new URL(window.location.href);\n      if (eu.searchParams.has('engrave')) {\n        eu.searchParams.delete('engrave');\n        window.history.replaceState({}, '', eu.toString());\n      }\n    } catch (_e) {}\n\n    // \u2500\u2500 offer cards \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    var perDaySub = subPrice / 30;\n    var has90 = !!(payload.bundle.items_90d && payload.bundle.items_90d.length && payload.bundle.bundle_key_90d &&\n      payload.bundle.items_90d.every(function (i) { return i.variant_id; }) &&\n      payload.bundle.items_90d.some(function (i) { return i.selling_plan_90d; }));\n    var monthly90 = Math.round(oneTimePrice * 0.7 * 100) / 100;\n    var quarter90 = Math.round(monthly90 * 3 * 100) / 100;\n    var card3mo = root.querySelector('[data-yt-plan=\"3mo\"]');\n    var sticky3moOpt = root.querySelector('[data-yt-sticky-option=\"3mo\"]');\n    if (!has90) {\n      if (card3mo) card3mo.style.display = 'none';\n      if (sticky3moOpt) sticky3moOpt.style.display = 'none';\n    } else if (card3mo) {\n      var p3 = card3mo.querySelector('.yt-formula-pdp__offer-price');\n      if (p3) p3.innerHTML = esc(money(monthly90)) + '<span class=\"yt-formula-pdp__offer-price-unit\">/mo</span>';\n      var serving3 = card3mo.querySelector('.yt-formula-pdp__offer-serving');\n      if (serving3) serving3.textContent = money(monthly90 / 30) + ' GBP / SERVING';\n      var meta3 = card3mo.querySelector('.yt-formula-pdp__offer-meta');\n      if (meta3) meta3.innerHTML = '<span>' + esc(money(quarter90)) + ' GBP every 90 days &middot; delivered monthly</span>';\n    }\n    var card1mo = root.querySelector('[data-yt-plan=\"1mo\"]');\n    if (card1mo) {\n      var p = card1mo.querySelector('.yt-formula-pdp__offer-price');\n      if (p) p.innerHTML = esc(money(subPrice)) + '<span class=\"yt-formula-pdp__offer-price-unit\">/mo</span>';\n      var meta = card1mo.querySelector('.yt-formula-pdp__offer-meta');\n      if (meta) meta.innerHTML =\n        '<span>' + esc(money(subPrice)) + ' GBP every 30 days</span>' +\n        '<span class=\"yt-formula-pdp__offer-serving\">' + esc(money(perDaySub)) + ' GBP / SERVING</span>';\n    }\n    var cardOne = root.querySelector('[data-yt-plan=\"onetime\"]');\n    if (cardOne) {\n      var link = cardOne.querySelector('[data-yt-onetime-link]');\n      if (link) link.textContent = 'One Time Purchase ' + money(oneTimePrice);\n      var op = cardOne.querySelector('.yt-formula-pdp__offer-price--onetime');\n      if (op) op.textContent = money(oneTimePrice);\n    }\n\n    // \u2500\u2500 YOUR BLEND rows \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    var list = root.querySelector('.yt-formula-pdp__stack-list');\n    if (list) {\n      ings.forEach(function (ing) {\n        if (ing.dose_num == null && ing.amount_mg != null) {\n          // bn_cfu probiotics: the number is billions of CFU (checked before\n          // the sub-1mg \u00B5g fallback, which would turn 0.5 into \"500\u00B5g\").\n          var isCfu = String(ing.unit || '').toLowerCase() === 'bn_cfu';\n          var isMcg = !isCfu && (ing.unit === 'mcg' || (ing.unit == null && ing.amount_mg > 0 && ing.amount_mg < 1));\n          ing.dose_num = String(isMcg ? Math.round(ing.amount_mg * 1000) : ing.amount_mg);\n          ing.dose_unit = isCfu ? ' bn CFU' : isMcg ? '\u00B5g' : 'mg';\n        }\n      });\n      list.innerHTML = ings.map(function (ing) {\n        return (\n          '<li class=\"yt-formula-pdp__stack-row\">' +\n            '<div class=\"yt-formula-pdp__stack-thumb\" aria-hidden=\"true\" data-yt-ing-slug=\"' + esc(ing.slug || '') + '\" data-yt-ing-name=\"' + esc(ing.name) + '\">' +\n              '<span class=\"yt-formula-pdp__stack-thumb-img\"></span>' +\n            '</div>' +\n            '<div class=\"yt-formula-pdp__stack-body\">' +\n              '<span class=\"yt-formula-pdp__stack-name\">' + esc(ing.name) + '</span>' +\n            '</div>' +\n            '<span class=\"yt-formula-pdp__stack-figures\">' +\n              '<span class=\"yt-formula-pdp__stack-price\" data-yt-share=\"' + esc(ing.share || 0) + '\"></span>' +\n              '<span class=\"yt-formula-pdp__stack-dose\">' + esc(ing.dose_num) +\n                '<span class=\"yt-formula-pdp__stack-unit\">' + esc(ing.dose_unit) + ' /day</span>' +\n              '</span>' +\n            '</span>' +\n          '</li>'\n        );\n      }).join('');\n      // B5: base as the FIRST row \u2014 inserted AFTER innerHTML so it survives\n      // the rows render (2026-08-27 regression: it was wiped before).\n      if (baseBlock) {\n      // B5: the base is the TOP ROW of the blend list \u2014 one locked line at\n      // its own price (per-selection basis), linking to its PDP; the add-on\n      // rows with their \u00A3 shares follow.\n      var baseRow = document.createElement('li');\n      baseRow.className = 'yt-formula-pdp__stack-row yt-formula-pdp__stack-row--base';\n      baseRow.style.borderBottom = '2px solid #1c1c1c';\n      // Same column anatomy as the add-on rows (price + dose slots) so the\n      // base price LINES UP with the other figures (founder 2026-08-27).\n      baseRow.innerHTML =\n        '<div class=\"yt-formula-pdp__stack-thumb\" aria-hidden=\"true\"><span class=\"yt-formula-pdp__stack-thumb-img\" style=\"display:inline-flex;width:100%;height:100%;align-items:center;justify-content:center;background:var(--yt-tint-blue,#e9f6ff);border-radius:10px;font-family:var(--yt-font-heading,Oswald,sans-serif);font-size:13px;\">BASE</span></div>' +\n        '<div class=\"yt-formula-pdp__stack-body\">' +\n          '<a href=\"/products/base-' + esc(baseBlock.slug) + '\" style=\"text-decoration:none;color:inherit;\">' +\n            '<span class=\"yt-formula-pdp__stack-name\" style=\"font-weight:700;\">' + esc(baseBlock.name) + '</span>' +\n          '</a>' +\n          '<span style=\"display:block;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:#555;\">Base &middot; ' + esc(baseBlock.n_ingredients) + ' ingredients</span>' +\n        '</div>' +\n        '<span class=\"yt-formula-pdp__stack-figures\">' +\n          '<span class=\"yt-formula-pdp__stack-price\" data-yt-base-price></span>' +\n          '<span class=\"yt-formula-pdp__stack-dose\">' + esc(baseBlock.n_ingredients) +\n            '<span class=\"yt-formula-pdp__stack-unit\">ingredients</span>' +\n          '</span>' +\n        '</span>';\n      if (list.firstChild) list.insertBefore(baseRow, list.firstChild);\n      else list.appendChild(baseRow);\n    }\n      // Ingredient photos \u2014 same technique as the legacy PDP: every\n      // catalogue ingredient is a product whose handle equals the slug.\n      list.querySelectorAll('[data-yt-ing-slug]').forEach(function (thumb) {\n        var slug = thumb.getAttribute('data-yt-ing-slug');\n        if (!slug) return;\n        var baked = (window.__ytIngredientImages || {})[slug];\n        if (baked) {\n          var bs = thumb.querySelector('.yt-formula-pdp__stack-thumb-img');\n          if (bs) bs.style.backgroundImage = 'url(' + baked + ')';\n          return;\n        }\n        fetch('/products/' + encodeURIComponent(slug) + '.js')\n          .then(function (r) { return r.ok ? r.json() : null; })\n          .then(function (prod) {\n            var img = prod && (prod.featured_image || (prod.images && prod.images[0]));\n            if (!img) return;\n            var span = thumb.querySelector('.yt-formula-pdp__stack-thumb-img');\n            if (span) span.style.backgroundImage = 'url(' + img + ')';\n          })\n          .catch(function () {});\n      });\n    }\n\n    // \u2500\u2500 EDITABLE BLEND (founder 2026-08-28): the fee-carrying custom\n    // blend gets the base-landing treatment \u2014 dose steppers + remove on\n    // every row, an upsell carousel, live re-pricing, and ADD TO CART\n    // forks a fresh formula when anything changed (always-fresh rule,\n    // same name). Base blends are untouched here \u2014 they live on their\n    // landing pages now. `ensureBlendCurrent` is hoisted (var) so\n    // addAndGo can always await it.\n    var ensureBlendCurrent = async function () {};\n    var blendDirty = false;\n    if (!baseBlock && list && payload.formula_id && ings.length) {\n      (function () {\n        // Lucas, 29 Sep 2026: L-theanine and FISH-OIL omega-3 are not\n        // recommended anywhere any more. The algal omega-3 takes the\n        // omega-3 slot; both remain buildable in the builder.\n        var UPSELL_DEFAULTS = [\n          'creatine', 'magnesium-glycinate', 'omega-3-total-omega-3-fatty-acids-11-6-dha-3-epa',\n          'vitamin-d3', 'ashwagandha', 'collagen-type-i-bovine-hydrolysed',\n          'coq10', 'turmeric-curcumin', 'zinc', 'vitamin-b12-2', 'lion-s-mane',\n          'vitamin-c-ascorbic-acid', 'hyaluronic-acid', 'vitamin-b7-biotin',\n        ];\n        var catRows = null, catBySlug = null, catById = null, P = null;\n        var lines = null; // [{ingredient_id, amount_mg}] \u2014 the editable truth\n        var photoCache = {};\n\n        function doseDisp(mg, unit) {\n          if (String(unit || '').toLowerCase() === 'bn_cfu') return (Math.round(mg * 100) / 100) + ' bn CFU';\n          if (unit === 'mcg' || (mg > 0 && mg < 1)) return Math.round(mg * 1000) + '\u00B5g';\n          var v = Math.round(mg * 100) / 100;\n          if (v >= 1000 && v % 100 === 0) return (v / 1000) + 'g';\n          return (Number.isInteger(v) ? v : v.toFixed(2)) + 'mg';\n        }\n        function round2(n) { return Math.round(n * 100) / 100; }\n        function computeOffers() {\n          var total = P.base;\n          lines.forEach(function (l) {\n            var c = catById[l.ingredient_id];\n            if (!c || c.raw_cost_per_mg == null) return;\n            total += Number(c.price_fee || 0) + Number(c.price_multiple || 0) * Number(c.raw_cost_per_mg) * l.amount_mg;\n          });\n          total -= P.taperGbp * Math.max(0, lines.length - P.taperAfter);\n          var sub = round2(Math.max(P.floor, total));\n          var ot = round2(sub * P.oneTimeMult);\n          var m90 = Math.max(round2(ot * P.bundleMult), P.prepaidFloor);\n          return { sub: sub, one_time: ot, m90: m90 };\n        }\n        function applyPrices() {\n          var pr = computeOffers();\n          subPrice = pr.sub; oneTimePrice = pr.one_time;\n          monthly90 = pr.m90; quarter90 = round2(pr.m90 * 3); perDaySub = pr.sub / 30;\n          var c3 = root.querySelector('[data-yt-plan=\"3mo\"]');\n          if (c3) {\n            var p3b = c3.querySelector('.yt-formula-pdp__offer-price');\n            if (p3b) p3b.innerHTML = esc(money(monthly90)) + '<span class=\"yt-formula-pdp__offer-price-unit\">/mo</span>';\n            var s3 = c3.querySelector('.yt-formula-pdp__offer-serving');\n            if (s3) s3.textContent = money(monthly90 / 30) + ' GBP / SERVING';\n            var m3 = c3.querySelector('.yt-formula-pdp__offer-meta');\n            if (m3) m3.innerHTML = '<span>' + esc(money(quarter90)) + ' GBP every 90 days &middot; delivered monthly</span>';\n          }\n          var c1 = root.querySelector('[data-yt-plan=\"1mo\"]');\n          if (c1) {\n            var p1b = c1.querySelector('.yt-formula-pdp__offer-price');\n            if (p1b) p1b.innerHTML = esc(money(subPrice)) + '<span class=\"yt-formula-pdp__offer-price-unit\">/mo</span>';\n            var m1 = c1.querySelector('.yt-formula-pdp__offer-meta');\n            if (m1) m1.innerHTML = '<span>' + esc(money(subPrice)) + ' GBP every 30 days</span>' +\n              '<span class=\"yt-formula-pdp__offer-serving\">' + esc(money(perDaySub)) + ' GBP / SERVING</span>';\n          }\n          var cOne = root.querySelector('[data-yt-plan=\"onetime\"]');\n          if (cOne) {\n            var lk = cOne.querySelector('[data-yt-onetime-link]');\n            if (lk) lk.textContent = 'One Time Purchase ' + money(oneTimePrice);\n            var op2 = cOne.querySelector('.yt-formula-pdp__offer-price--onetime');\n            if (op2) op2.textContent = money(oneTimePrice);\n          }\n          paintLinePrices();\n          renderSelection();\n        }\n        // Founder 2026-09-03 (\"lots of reasonable products, not one big\n        // expensive one\"): every row shows ITS OWN price at the selected\n        // plan, computed from the catalogue \u2014 on first paint and after every\n        // edit, never hidden. The closing totals row rides with it.\n        function paintLinePrices() {\n          if (!lines || !catById) return;\n          var lineBasis = selected === 'onetime' ? P.oneTimeMult : selected === '3mo' ? P.oneTimeMult * P.bundleMult : 1;\n          list.querySelectorAll('[data-yt-blend-row]').forEach(function (row) {\n            var c = catById[row.getAttribute('data-yt-blend-row')];\n            var l = lines.find(function (x) { return x.ingredient_id === row.getAttribute('data-yt-blend-row'); });\n            var pe = row.querySelector('[data-yt-line-price]');\n            if (!c || !l || !pe || c.raw_cost_per_mg == null) return;\n            var lp = round2((Number(c.price_fee || 0) + Number(c.price_multiple || 0) * Number(c.raw_cost_per_mg) * l.amount_mg) * lineBasis);\n            pe.textContent = money(lp) + (selected === 'onetime' ? '' : '/mo');\n          });\n          renderStackTotal(lines.length, selected === 'onetime' ? oneTimePrice : selected === '3mo' ? monthly90 : subPrice, selected === 'onetime');\n        }\n        function setPhoto(rowThumb, slug) {\n          var span = rowThumb.querySelector('.yt-formula-pdp__stack-thumb-img');\n          if (!span) return;\n          if (!photoCache[slug] && (window.__ytIngredientImages || {})[slug]) photoCache[slug] = window.__ytIngredientImages[slug];\n          if (photoCache[slug]) { span.style.backgroundImage = 'url(' + photoCache[slug] + ')'; return; }\n          fetch('/products/' + encodeURIComponent(slug) + '.js')\n            .then(function (r) { return r.ok ? r.json() : null; })\n            .then(function (prod) {\n              var img = prod && (prod.featured_image || (prod.images && prod.images[0]));\n              if (!img) return;\n              photoCache[slug] = img;\n              span.style.backgroundImage = 'url(' + img + ')';\n            })\n            .catch(function () {});\n        }\n        function renderEditableRows() {\n          list.innerHTML = lines.map(function (l) {\n            var c = catById[l.ingredient_id];\n            if (!c) return '';\n            var min = Number(c.min_dose_mg) || Number(c.dose_step_mg) || 1;\n            var max = Number(c.max_dose_mg) || min;\n            return (\n              '<li class=\"yt-formula-pdp__stack-row\" data-yt-blend-row=\"' + esc(c.id) + '\">' +\n                '<div class=\"yt-formula-pdp__stack-thumb\" aria-hidden=\"true\" data-yt-ing-slug=\"' + esc(c.slug) + '\">' +\n                  '<span class=\"yt-formula-pdp__stack-thumb-img\"></span>' +\n                '</div>' +\n                '<div class=\"yt-formula-pdp__stack-body\">' +\n                  '<span class=\"yt-formula-pdp__stack-name\">' + esc(c.name) + '</span>' +\n                  '<span class=\"yt-formula-pdp__stack-lineprice\" data-yt-line-price></span>' +\n                '</div>' +\n                '<span class=\"yt-formula-pdp__stack-figures\" style=\"display:inline-flex;align-items:center;gap:8px;\">' +\n                  '<span class=\"yt-base-landing__step\">' +\n                    '<button type=\"button\" class=\"yt-base-landing__step-btn\" data-yt-step=\"-1\" aria-label=\"Decrease dose\"' + (l.amount_mg <= min ? ' disabled' : '') + '>&minus;</button>' +\n                    '<span class=\"yt-base-landing__step-val\">' + esc(doseDisp(l.amount_mg, c.unit)) + '</span>' +\n                    '<button type=\"button\" class=\"yt-base-landing__step-btn\" data-yt-step=\"1\" aria-label=\"Increase dose\"' + (l.amount_mg >= max ? ' disabled' : '') + '>+</button>' +\n                  '</span>' +\n                  '<button type=\"button\" class=\"yt-base-landing__row-remove\" data-yt-blend-remove aria-label=\"Remove ' + esc(c.name) + '\">&times;</button>' +\n                '</span>' +\n              '</li>'\n            );\n          }).join('');\n          list.querySelectorAll('[data-yt-blend-row]').forEach(function (row) {\n            var id = row.getAttribute('data-yt-blend-row');\n            var line = lines.find(function (l) { return l.ingredient_id === id; });\n            var c = catById[id];\n            if (!line || !c) return;\n            setPhoto(row.querySelector('[data-yt-ing-slug]'), c.slug);\n            row.querySelectorAll('[data-yt-step]').forEach(function (btn) {\n              btn.addEventListener('click', function () {\n                var step = Number(c.dose_step_mg) || 1;\n                var min = Number(c.min_dose_mg) || step;\n                var max = Number(c.max_dose_mg) || min;\n                var next = line.amount_mg + step * Number(btn.getAttribute('data-yt-step'));\n                if (next < min) next = min;\n                if (next > max) next = max;\n                if (next === line.amount_mg) return;\n                line.amount_mg = next;\n                blendDirty = true;\n                refresh();\n              });\n            });\n            var rm = row.querySelector('[data-yt-blend-remove]');\n            if (rm) rm.addEventListener('click', function () {\n              if (lines.length <= 1) return; // a blend keeps at least one line\n              lines = lines.filter(function (l) { return l.ingredient_id !== id; });\n              blendDirty = true;\n              refresh();\n            });\n          });\n        }\n        var carouselEl = null;\n        function renderUpsellCards() {\n          if (!carouselEl) return;\n          var grid = carouselEl.querySelector('[data-yt-blend-upsell-grid]');\n          var present = {};\n          lines.forEach(function (l) { var c = catById[l.ingredient_id]; if (c) present[c.slug] = true; });\n          var picks = [];\n          UPSELL_DEFAULTS.forEach(function (s) {\n            var c = catBySlug[s];\n            if (!c || present[s] || c.raw_cost_per_mg == null) return;\n            if (picks.length < 10) picks.push(c);\n          });\n          grid.innerHTML = picks.map(function (c) {\n            var priceSub = Number(c.price_fee || 0) + Number(c.price_multiple || 0) * Number(c.raw_cost_per_mg) * Number(c.default_dose_mg);\n            var basis = selected === 'onetime' ? P.oneTimeMult : selected === '3mo' ? 0.875 : 1;\n            return '<div class=\"yt-base-landing__card\" data-yt-blend-card=\"' + esc(c.id) + '\">' +\n              '<img class=\"yt-base-landing__card-img\" alt=\"' + esc(c.name) + '\" loading=\"lazy\">' +\n              '<span class=\"yt-base-landing__card-top\"><span class=\"yt-base-landing__card-price\">+' + esc(money(round2(priceSub * basis))) + (selected === 'onetime' ? '' : '/mo') + '</span></span>' +\n              '<div class=\"yt-base-landing__card-body\">' +\n                '<span class=\"yt-base-landing__card-name\">' + esc(c.name) + '</span>' +\n                '<span class=\"yt-base-landing__card-dose\">' + esc(doseDisp(Number(c.default_dose_mg), c.unit)) + ' daily</span>' +\n                '<button type=\"button\" class=\"yt-base-landing__card-add\">ADD</button>' +\n              '</div>' +\n            '</div>';\n          }).join('');\n          grid.querySelectorAll('[data-yt-blend-card]').forEach(function (card) {\n            var id = card.getAttribute('data-yt-blend-card');\n            var c = catById[id];\n            if (!c) return;\n            var img = card.querySelector('img');\n            if (!photoCache[c.slug] && (window.__ytIngredientImages || {})[c.slug]) photoCache[c.slug] = window.__ytIngredientImages[c.slug];\n            if (photoCache[c.slug]) img.src = photoCache[c.slug];\n            else {\n              fetch('/products/' + encodeURIComponent(c.slug) + '.js')\n                .then(function (r) { return r.ok ? r.json() : null; })\n                .then(function (prod) {\n                  var im = prod && (prod.featured_image || (prod.images && prod.images[0]));\n                  if (im) { photoCache[c.slug] = im; img.src = im; }\n                })\n                .catch(function () {});\n            }\n            card.querySelector('.yt-base-landing__card-add').addEventListener('click', function () {\n              lines.push({ ingredient_id: c.id, amount_mg: Number(c.default_dose_mg) });\n              blendDirty = true;\n              if (window.ytTrack) { try { ytTrack('blend_pdp_upsell_added', { ingredient: c.name }); } catch (_e) {} }\n              refresh();\n            });\n          });\n        }\n        function refresh() {\n          renderEditableRows();\n          renderUpsellCards();\n          applyPrices();\n        }\n\n        ensureBlendCurrent = async function () {\n          if (!blendDirty || !lines) return;\n          var res = await fetch('/apps/yutrients/formula/submit', {\n            method: 'POST',\n            credentials: 'same-origin',\n            headers: {\n              'Content-Type': 'application/json',\n              'Idempotency-Key': (window.crypto && crypto.randomUUID) ? crypto.randomUUID() : String(Date.now()) + Math.random(),\n            },\n            body: JSON.stringify({\n              stack: {\n                stack_name: (payload.name || 'My formula').slice(0, TIN_NAME_MAX),\n                primary_goals: [],\n                ingredients: lines.map(function (l) { return { ingredient_id: l.ingredient_id, amount_mg: l.amount_mg }; }),\n              },\n            }),\n          });\n          if (!res.ok) {\n            var detail = 'Something went wrong updating your blend \u2014 please try again.';\n            try {\n              var err = await res.json();\n              if (err && err.error) detail = (err.error.details && err.error.details.message_for_human) || err.error.message || detail;\n            } catch (_e) {}\n            throw new Error(detail);\n          }\n          var out = await res.json();\n          if (!out.formula_id) throw new Error('Something went wrong updating your blend \u2014 please try again.');\n          var pdpRes = await fetch('/apps/yutrients/formula/' + encodeURIComponent(out.formula_id) + '/pdp', {\n            credentials: 'same-origin', headers: { Accept: 'application/json' },\n          });\n          if (!pdpRes.ok) throw new Error('Something went wrong preparing your order \u2014 please try again.');\n          var fresh = await pdpRes.json();\n          if (!fresh.bundle || !fresh.bundle.items || !fresh.bundle.items.length) {\n            throw new Error('Something went wrong preparing your order \u2014 please try again.');\n          }\n          payload = fresh;\n          has90 = !!(payload.bundle.items_90d && payload.bundle.items_90d.length && payload.bundle.bundle_key_90d &&\n            payload.bundle.items_90d.every(function (i) { return i.variant_id; }) &&\n            payload.bundle.items_90d.some(function (i) { return i.selling_plan_90d; }));\n          blendDirty = false;\n          try {\n            var u = new URL(window.location.href);\n            u.searchParams.set('blend', out.formula_id);\n            window.history.replaceState({}, '', u.toString());\n          } catch (_e) {}\n        };\n\n        fetch('/apps/yutrients/catalogue', { credentials: 'same-origin', headers: { Accept: 'application/json' } })\n          .then(function (r) { return r.ok ? r.json() : null; })\n          .then(function (cat) {\n            if (!cat || !Array.isArray(cat.ingredients)) return;\n            catRows = cat.ingredients;\n            catBySlug = {}; catById = {};\n            catRows.forEach(function (c) { catBySlug[c.slug] = c; catById[c.id] = c; });\n            var pr = (cat.pricing || {});\n            P = {\n              floor: Number.isFinite(Number(pr.variant_floor)) ? Number(pr.variant_floor) : 50,\n              oneTimeMult: Number(pr.one_time_multiplier) > 0 ? Number(pr.one_time_multiplier) : 1.25,\n              bundleMult: Number(pr.bundle_multiplier) > 0 ? Number(pr.bundle_multiplier) : 0.7,\n              prepaidFloor: Number.isFinite(Number(pr.prepaid_floor)) ? Number(pr.prepaid_floor) : 45,\n              base: Number.isFinite(Number(pr.base)) ? Number(pr.base) : 11 / 0.37,\n              taperAfter: Number.isFinite(Number(pr.taper_after)) ? Number(pr.taper_after) : 15,\n              taperGbp: Number.isFinite(Number(pr.taper_gbp)) ? Number(pr.taper_gbp) : 0,\n            };\n            // Every line must map to a live catalogue row (by slug) or we\n            // can't rebuild the formula faithfully \u2014 leave read-only then.\n            var mapped = [];\n            for (var i = 0; i < ings.length; i += 1) {\n              var c = catBySlug[ings[i].slug];\n              // /pdp serves DISPLAY doses (dose_num in the shown unit) \u2014\n              // canonical mg = \u00F71000 for \u00B5g rows.\n              var rawDose = Number(ings[i].amount_mg != null ? ings[i].amount_mg : ings[i].dose_num);\n              var mg = ings[i].dose_unit === '\u00B5g' ? rawDose / 1000 : rawDose;\n              if (!c || !isFinite(mg) || mg <= 0) return;\n              mapped.push({ ingredient_id: c.id, amount_mg: mg });\n            }\n            lines = mapped;\n            // Upsell carousel after the blend list (same design as the\n            // base landing pages).\n            carouselEl = document.createElement('div');\n            carouselEl.className = 'yt-base-landing__upsells';\n            carouselEl.innerHTML =\n              '<h2 class=\"yt-formula-pdp__caps yt-base-landing__upsell-heading\">MAKE IT YOURS \u2014 POPULAR ADD-ONS</h2>' +\n              '<p class=\"yt-base-landing__upsell-sub\">Blended into the same scoop \u2014 no extra tubs, no extra tins.</p>' +\n              '<div class=\"yt-base-landing__upsell-carousel\">' +\n                '<button type=\"button\" class=\"yt-base-landing__upsell-arrow yt-base-landing__upsell-arrow--prev\" data-yt-blend-upsell-prev aria-label=\"Previous add-ons\">&#8249;</button>' +\n                '<div class=\"yt-base-landing__upsell-grid\" data-yt-blend-upsell-grid tabindex=\"0\" role=\"group\" aria-label=\"Popular add-ons\"></div>' +\n                '<button type=\"button\" class=\"yt-base-landing__upsell-arrow yt-base-landing__upsell-arrow--next\" data-yt-blend-upsell-next aria-label=\"More add-ons\">&#8250;</button>' +\n              '</div>';\n            list.parentNode.insertBefore(carouselEl, list.nextSibling);\n            var grid = carouselEl.querySelector('[data-yt-blend-upsell-grid]');\n            carouselEl.querySelector('[data-yt-blend-upsell-prev]').addEventListener('click', function () {\n              var card = grid.querySelector('.yt-base-landing__card');\n              grid.scrollBy({ left: -((card ? card.getBoundingClientRect().width : 200) + 12) * 1.5, behavior: 'smooth' });\n            });\n            carouselEl.querySelector('[data-yt-blend-upsell-next]').addEventListener('click', function () {\n              var card = grid.querySelector('.yt-base-landing__card');\n              grid.scrollBy({ left: ((card ? card.getBoundingClientRect().width : 200) + 12) * 1.5, behavior: 'smooth' });\n            });\n            renderEditableRows();\n            renderUpsellCards();\n            // First paint keeps the server-priced offers; only the per-line\n            // prices and totals row are painted here (no re-pricing).\n            paintLinePrices();\n          })\n          .catch(function () { /* editing is an enhancement \u2014 page stays read-only */ });\n      })();\n    }\n\n    // \u2500\u2500 Nutritional Information accordion (leaflet-exact, founder spec:\n    // panel name | typical per daily dose | %NRV \u2014 combined base + add-ons,\n    // served pre-ordered by /formula/:id/pdp) \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    if (list && payload.nutrition && payload.nutrition.length) {\n      var nutriRows = payload.nutrition.map(function (r) {\n        return '<tr>' +\n          '<td>' + esc(r.panel_name) + '</td>' +\n          '<td class=\"yt-blend-nutri__num\">' + esc(r.dose_display || '') + '</td>' +\n          '<td class=\"yt-blend-nutri__num\">' + (r.nrv_pct != null ? esc(String(r.nrv_pct)) + '%' : '&ndash;') + '</td>' +\n        '</tr>';\n      }).join('');\n      var acc = document.createElement('div');\n      acc.className = 'yt-blend-nutri';\n      acc.innerHTML =\n        '<style>' +\n          '.yt-blend-nutri{margin:16px 0 4px;font-family:var(--yt-font-body,Quicksand,sans-serif);}' +\n          '.yt-blend-nutri__toggle{width:100%;display:flex;justify-content:space-between;align-items:center;background:none;border:1.5px solid #3c3c3b;border-radius:10px;padding:13px 16px;font-family:var(--yt-font-heading,Oswald,sans-serif);font-weight:500;font-size:13px;letter-spacing:.08em;text-transform:uppercase;cursor:pointer;color:#3c3c3b;}' +\n          '.yt-blend-nutri__toggle:after{content:\"+\";font-size:18px;line-height:1;}' +\n          '.yt-blend-nutri.is-open .yt-blend-nutri__toggle:after{content:\"\\\\2212\";}' +\n          '.yt-blend-nutri__panel{display:none;overflow-x:auto;}' +\n          '.yt-blend-nutri.is-open .yt-blend-nutri__panel{display:block;}' +\n          '.yt-blend-nutri table{width:100%;border-collapse:collapse;margin-top:10px;font-size:13px;}' +\n          '.yt-blend-nutri th,.yt-blend-nutri td{border:1px solid #3c3c3b;padding:6px 10px;text-align:left;}' +\n          '.yt-blend-nutri th:nth-child(2),.yt-blend-nutri td:nth-child(2){width:130px;}' +\n          '.yt-blend-nutri th:nth-child(3),.yt-blend-nutri td:nth-child(3){width:78px;}' +\n          '.yt-blend-nutri th{font-size:11px;text-transform:uppercase;letter-spacing:.05em;vertical-align:bottom;}' +\n          '.yt-blend-nutri__num{text-align:right !important;white-space:nowrap;}' +\n        '</style>' +\n        '<button type=\"button\" class=\"yt-blend-nutri__toggle\" aria-expanded=\"false\">See full nutritional information</button>' +\n        '<div class=\"yt-blend-nutri__panel\">' +\n          '<table>' +\n            '<thead><tr><th>Nutritional information</th><th class=\"yt-blend-nutri__num\">Typical per daily dose</th><th class=\"yt-blend-nutri__num\">% NRV</th></tr></thead>' +\n            '<tbody>' + nutriRows + '</tbody>' +\n          '</table>' +\n        '</div>';\n      var listWrap = list.closest('section, div') || list.parentElement;\n      if (listWrap && listWrap.parentElement) listWrap.parentElement.insertBefore(acc, listWrap.nextSibling);\n      var nutriToggle = acc.querySelector('.yt-blend-nutri__toggle');\n      nutriToggle.addEventListener('click', function () {\n        var open = acc.classList.toggle('is-open');\n        nutriToggle.setAttribute('aria-expanded', String(open));\n      });\n    }\n\n    // \u2500\u2500 stack total row (founder 2026-09-03) \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    // Under the ingredient list: \"N products \u00B7 \u00A3X/mo \u00B7 \u00A3Y a day\" \u2014 the\n    // blend read as a shelf of reasonably priced things, not one big price.\n    function renderStackTotal(count, total, isOne) {\n      if (!list) return;\n      var n = Number(count) + (baseBlock ? 1 : 0);\n      var row = list.querySelector('.yt-formula-pdp__stack-total');\n      if (!row) {\n        row = document.createElement('li');\n        row.className = 'yt-formula-pdp__stack-total';\n        list.appendChild(row);\n      } else if (row !== list.lastElementChild) {\n        list.appendChild(row);\n      }\n      var perDay = Math.round((Number(total) / 30) * 100) / 100;\n      row.innerHTML =\n        '<span class=\"yt-formula-pdp__stack-total-count\">' + n + ' product' + (n === 1 ? '' : 's') + ', one scoop</span>' +\n        '<span class=\"yt-formula-pdp__stack-total-figures\">' +\n          '<span class=\"yt-formula-pdp__stack-total-price\">' + esc(money(Number(total))) + (isOne ? '' : '/mo') + '</span>' +\n          '<span class=\"yt-formula-pdp__stack-total-day\">' + esc(money(perDay)) + ' a day</span>' +\n        '</span>';\n    }\n\n    // \u2500\u2500 selection + breakdown + sticky \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    // Legacy default: 90-Day (best value) when available.\n    var selected = payload.mode === 'onetime' ? 'onetime' : '1mo'; // 30-day default (founder 2026-09-01)\n    var offers = Array.from(root.querySelectorAll('[data-yt-plan]'));\n    var stickyTitle = root.querySelector('[data-yt-sticky-title]');\n    var stickySub = root.querySelector('[data-yt-sticky-sub]');\n    var stickyPill = root.querySelector('[data-yt-sticky-pill]');\n    var stickyMenu = root.querySelector('[data-yt-sticky-menu]');\n\n    function renderBreakdown() {\n      var bd = root.querySelector('[data-yt-breakdown]');\n      if (!bd) return;\n      var isOne = selected === 'onetime';\n      var is90 = selected === '3mo';\n      var total = isOne ? oneTimePrice : is90 ? monthly90 : subPrice;\n      // Fee at the selected basis: \u00A315 sub / \u00A318.75 one-time / \u00A313.13 90-day\n      // monthly (18.75 \u00D7 0.7) \u2014 lockstep with the ladder.\n      var feeShown = isOne\n        ? Math.round(fee * 1.25 * 100) / 100\n        : is90\n          ? Math.round(fee * 1.25 * 0.7 * 100) / 100\n          : fee;\n      var feeEl = bd.querySelector('[data-yt-blend-fee]');\n      var totalEl = bd.querySelector('[data-yt-breakdown-total]');\n      if (feeEl) feeEl.textContent = money(feeShown);\n      // B5: no fee line on base blends \u2014 hide the whole row; the base's own\n      // per-basis price fills the top row instead.\n      if (feeEl && fee === 0) {\n        var feeLine = feeEl.closest('li, .yt-formula-pdp__breakdown-row, div');\n        if (feeLine) feeLine.style.display = 'none';\n      }\n      var basePart = 0;\n      if (baseBlock) {\n        basePart = isOne ? Number(baseBlock.prices.one_time)\n          : is90 ? Number(baseBlock.prices.monthly_90d)\n          : Number(baseBlock.prices.sub);\n        var bp = root.querySelector('[data-yt-base-price]');\n        if (bp) bp.textContent = money(basePart);\n      }\n      if (totalEl) totalEl.innerHTML = esc(money(total)) +\n        (isOne ? '' : '<span class=\"yt-formula-pdp__total-unit\">/mo</span>');\n      renderStackTotal(ings.length, total, isOne);\n      // Per-ingredient \u00A3 shares \u2014 rescaled proportionally to the selected\n      // offer's (price \u2212 fee) pool, exactly like the legacy PDP.\n      var spans = Array.from(root.querySelectorAll('[data-yt-share]'));\n      if (!spans.length) return;\n      var base = spans.map(function (sp) { return Number(sp.getAttribute('data-yt-share')) || 0; });\n      var sum = base.reduce(function (a, b) { return a + b; }, 0);\n      var pool = Math.max(0, Math.round((total - feeShown - basePart) * 100) / 100);\n      if (sum <= 0) return;\n      var acc = 0;\n      spans.forEach(function (sp, i) {\n        var v = i === spans.length - 1\n          ? Math.round((pool - acc) * 100) / 100\n          : Math.round((base[i] / sum) * pool * 100) / 100;\n        acc = Math.round((acc + v) * 100) / 100;\n        sp.textContent = money(v);\n      });\n    }\n\n    function renderSelection() {\n      offers.forEach(function (label) {\n        var match = label.getAttribute('data-yt-plan') === selected;\n        label.classList.toggle('yt-formula-pdp__offer--selected', match);\n        var radio = label.querySelector('input[type=\"radio\"]');\n        if (radio) radio.checked = match;\n      });\n      // Founder 2026-08-31: one line \u2014 the selected plan's price (the\n      // plan-name line is gone to shorten the bar; the caret still opens\n      // the plan menu, and the offer cards above name the plans).\n      if (stickyTitle) {\n        // Founder 2026-09-03: the per-day figure rides beside the price.\n        var stickyTotal = selected === 'onetime' ? oneTimePrice : selected === '3mo' ? monthly90 : subPrice;\n        stickyTitle.innerHTML = (selected === 'onetime' ? esc(money(oneTimePrice)) : esc(money(stickyTotal)) + '/mo') +\n          '<span class=\"yt-formula-pdp__stickybar-day\">' + esc(money(Math.round((stickyTotal / 30) * 100) / 100)) + ' a day</span>';\n      }\n      if (stickySub) stickySub.remove();\n      renderBreakdown();\n    }\n\n    offers.forEach(function (label) {\n      label.addEventListener('click', function () {\n        selected = label.getAttribute('data-yt-plan') || '1mo';\n        renderSelection();\n      });\n    });\n    // Underlined \"One Time Purchase \u00A3X\" reveal \u2014 same one-shot treatment\n    // as legacy: reveal the bubble (CSS keys off .is-revealed on the\n    // offers wrap) and select it.\n    var offersWrap = root.querySelector('[data-yt-offers]');\n    var onetimeLink = root.querySelector('[data-yt-onetime-link]');\n    if (onetimeLink && offersWrap) {\n      onetimeLink.addEventListener('click', function () {\n        offersWrap.classList.add('is-revealed');\n        selected = 'onetime';\n        renderSelection();\n      });\n    }\n    if (selected === 'onetime' && offersWrap) offersWrap.classList.add('is-revealed');\n    if (stickyPill && stickyMenu) {\n      stickyPill.addEventListener('click', function () {\n        var open = stickyMenu.hidden;\n        stickyMenu.hidden = !open;\n        stickyPill.setAttribute('aria-expanded', String(open));\n      });\n      stickyMenu.querySelectorAll('[data-yt-sticky-option]').forEach(function (opt) {\n        opt.addEventListener('click', function () {\n          selected = opt.getAttribute('data-yt-sticky-option') || '1mo';\n          stickyMenu.hidden = true;\n          stickyPill.setAttribute('aria-expanded', 'false');\n          renderSelection();\n        });\n      });\n    }\n\n    // \u2500\u2500 CTAs: add the component lines (+ free spoon, one per cart) \u2500\u2500\u2500\u2500\n    var errorEl = root.querySelector('[data-yt-formula-error]');\n    var busy = false;\n    function showError(msg) {\n      if (!errorEl) return;\n      errorEl.textContent = msg;\n      errorEl.hidden = false;\n    }\n\n    async function addAndGo(dest) {\n      if (busy) return;\n      busy = true;\n      if (errorEl) errorEl.hidden = true;\n      root.querySelectorAll('[data-yt-formula-addbasket], [data-yt-formula-checkout], [data-yt-sticky-addbasket]')\n        .forEach(function (b) { b.disabled = true; });\n      try {\n        // Edited custom blend \u2192 fork a fresh formula first (same name) so\n        // the cart lines match what's on screen.\n        await ensureBlendCurrent();\n        // Three purchase modes, three DISTINCT group keys (intake\n        // partitions pots by key; the drawer groups cards by it):\n        //   1mo    \u2192 the registered 30-day set + its rb key\n        //   3mo    \u2192 the registered 90-day TWIN set + its own rb key\n        //   onetime\u2192 the 30-day set, plan-less, key + ':ot' (#1116-proven)\n        var isOneTime = selected === 'onetime';\n        var is90Add = selected === '3mo' && has90;\n        var props = payload.bundle.properties || {};\n        if (is90Add) {\n          props = Object.assign({}, props, { _rc_bundle: payload.bundle.bundle_key_90d });\n        } else if (isOneTime && props._rc_bundle) {\n          props = Object.assign({}, props, { _rc_bundle: props._rc_bundle + ':ot' });\n        }\n        var sourceItems = is90Add ? payload.bundle.items_90d : payload.bundle.items;\n        var items = sourceItems.map(function (i) {\n          var line = {\n            id: Number(i.variant_id),\n            quantity: i.quantity || 1,\n            properties: props,\n          };\n          if (is90Add && i.selling_plan_90d) line.selling_plan = Number(i.selling_plan_90d);\n          else if (!is90Add && !isOneTime && i.selling_plan_30d) line.selling_plan = Number(i.selling_plan_30d);\n          return line;\n        });\n        // (The free weighing spoon arrives as one of payload.bundle.items \u2014\n        // the formulator includes it in the registered bundle, so it groups\n        // under the tin like the fee. No separate push needed.)\n        // Shopify PREPENDS new lines \u2014 submit reversed so the cart displays\n        // in payload order: base first, add-ons, then fee/spoon (founder\n        // 2026-08-27).\n        var res = await fetch('/cart/add.js', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n          credentials: 'same-origin',\n          body: JSON.stringify({ items: items.slice().reverse() }),\n        });\n        if (!res.ok) {\n          var detail = 'Something went wrong adding your blend \u2014 please try again.';\n          try {\n            var err = await res.json();\n            if (err && (err.description || err.message)) detail = err.description || err.message;\n          } catch (_e) {}\n          throw new Error(detail);\n        }\n        if (dest === '/cart' && window.__ytCartDrawer) {\n          // Side cart, not the full page (founder 2026-08-26).\n          await window.__ytCartDrawer.open();\n          busy = false;\n          root.querySelectorAll('[data-yt-formula-addbasket], [data-yt-formula-checkout], [data-yt-sticky-addbasket]')\n            .forEach(function (b) { b.disabled = false; });\n          return;\n        }\n        window.location.assign(dest);\n      } catch (e) {\n        showError(e && e.message ? e.message : 'Something went wrong \u2014 please try again.');\n        busy = false;\n        root.querySelectorAll('[data-yt-formula-addbasket], [data-yt-formula-checkout], [data-yt-sticky-addbasket]')\n          .forEach(function (b) { b.disabled = false; });\n      }\n    }\n\n    root.querySelectorAll('[data-yt-formula-addbasket], [data-yt-sticky-addbasket]').forEach(function (b) {\n      b.addEventListener('click', function () { addAndGo('/cart'); });\n    });\n    root.querySelectorAll('[data-yt-formula-checkout]').forEach(function (b) {\n      b.addEventListener('click', function () { addAndGo('/checkout'); });\n    });\n\n    renderSelection();\n    root.removeAttribute('data-yt-hydrating');\n    if (window.ytTrack) { try { ytTrack('blend_pdp_viewed', { has_base: !!baseBlock }); } catch (_e) {} }\n  }\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);\n  else boot();\n})();\n"],
  "mappings": "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",
  "names": ["res", "u", "c", "acc"]
}
