{
  "version": 3,
  "sources": ["/cdn/shop/t/20/assets/cf-club-hydrate.js?cfv=58"],
  "sourcesContent": ["/**\n * Re-applies Chubby Club prices when the HTML shell was served without the\n * signed-in customer (anonymous edge cache on home/collection).\n *\n * Price nodes opt in with data-cf-public-cents. SSR that already rendered\n * member/teaser markup is left alone.\n */\n(function cfClubHydrate() {\n  const NODES = () => document.querySelectorAll('[data-cf-public-cents]');\n\n  const formatMoney = (cents, format) => {\n    const value = (Number(cents) || 0) / 100;\n    const amount = value.toFixed(2);\n    const amountNoDecimals = String(Math.round(value));\n    const fmt = format || '${{amount}}';\n    return fmt\n      .replace(/\\{\\{\\s*amount_no_decimals\\s*\\}\\}/g, amountNoDecimals)\n      .replace(/\\{\\{\\s*amount_with_comma_separator\\s*\\}\\}/g, amount.replace('.', ','))\n      .replace(/\\{\\{\\s*amount\\s*\\}\\}/g, amount)\n      .replace(/\\{\\{\\s*amount_no_decimals_with_comma_separator\\s*\\}\\}/g, amountNoDecimals);\n  };\n\n  const roundOff = (base, percent, offFixed) => {\n    if (offFixed > 0) return Math.min(base, offFixed);\n    return Math.round((base * percent) / 100);\n  };\n\n  const memberMarkup = (ctx, nowMoney, wasMoney, saveMoney) => {\n    const logo = ctx.logo_url\n      ? `<span class=\"cf-club-mark\" aria-hidden=\"true\"><img class=\"cf-club-mark__img\" src=\"${ctx.logo_url}\" alt=\"\" width=\"20\" height=\"20\" loading=\"lazy\" decoding=\"async\"></span>`\n      : '';\n    const fullLabel = ctx.tier_label || 'Chubby Club Member';\n    const save = saveMoney ? `<span class=\"cf-club-price__inline-save\">Save ${saveMoney}</span>` : '';\n    return `<div class=\"cf-club-price cf-club-price--member cf-club-price--card\" data-cf-club-price data-cf-club-hydrated>\n      <span class=\"cf-club-price__inline\" data-cf-club-badge aria-label=\"${fullLabel}. Chubby Club Price ${nowMoney}.\">\n        <span class=\"cf-club-price__now price\" data-cf-price-now>${nowMoney}</span>\n        <s class=\"cf-club-price__was\">${wasMoney}</s>\n      </span>\n      <span class=\"cf-club-price__inline-label\">\n        <span class=\"cf-club-price__inline-brand\">\n          ${logo}\n          <span class=\"cf-club-price__inline-text\">Chubby Club Price</span>\n        </span>\n        ${save}\n      </span>\n    </div>`;\n  };\n\n  const teaserMarkup = (ctx, nowMoney, wasMoney) => {\n    const logo = ctx.logo_url\n      ? `<span class=\"cf-club-mark\" aria-hidden=\"true\"><img class=\"cf-club-mark__img\" src=\"${ctx.logo_url}\" alt=\"\" width=\"16\" height=\"16\" loading=\"lazy\" decoding=\"async\"></span>`\n      : '';\n    return `<div class=\"cf-club-price cf-club-price--teaser cf-club-price--card\" data-cf-club-price data-cf-club-hydrated>\n      <span class=\"cf-club-price__public price\" data-cf-price-now>${wasMoney}</span>\n      <span class=\"cf-club-price__plus-chip\" aria-label=\"Chubby Club PLUS price ${nowMoney}.\">\n        ${logo}\n        <span class=\"cf-club-price__plus-chip-label\">PLUS</span>\n        <span class=\"cf-club-price__plus-chip-price\">${nowMoney}</span>\n      </span>\n    </div>`;\n  };\n\n  const apply = (ctx) => {\n    if (!ctx?.enabled) return;\n\n    for (const node of NODES()) {\n      const existing = node.querySelector('[data-cf-club-price]');\n      // SSR already matches this session \u2014 leave it. Upgrade anonymous teaser\n      // shells when the fetch proves the shopper is a member.\n      if (existing?.hasAttribute('data-cf-club-hydrated')) continue;\n      if (ctx.member && existing?.classList.contains('cf-club-price--member')) continue;\n      if (!ctx.member && existing) continue;\n\n      const base = Number(node.getAttribute('data-cf-public-cents')) || 0;\n      if (base <= 0) continue;\n\n      const plusOff = Number(node.getAttribute('data-cf-plus-off')) || 0;\n      let mode = '';\n      let percent = 0;\n      let offFixed = 0;\n      let offerLabel = 'Chubby Club';\n\n      if (ctx.member) {\n        percent = Number(ctx.percent) || 0;\n        if (ctx.tier_key === 'cc-plus' && plusOff > 0) {\n          mode = 'member';\n          offFixed = plusOff;\n        } else if (percent > 0) {\n          mode = 'member';\n          if (plusOff > 0) {\n            const pctOff = Math.round((base * percent) / 100);\n            if (plusOff > pctOff) offFixed = plusOff;\n          }\n        }\n      } else if (ctx.show_teaser && !ctx.member) {\n        if (plusOff > 0) {\n          mode = 'teaser';\n          offFixed = plusOff;\n          offerLabel = 'Chubby Club PLUS';\n        } else if (Number(ctx.pct_member) > 0) {\n          mode = 'teaser';\n          percent = Number(ctx.pct_member);\n          offerLabel = 'Chubby Club PLUS';\n        }\n      }\n\n      if (!mode) continue;\n\n      const off = roundOff(base, percent, offFixed);\n      if (off <= 0) continue;\n\n      const now = Math.max(0, base - off);\n      const nowMoney = formatMoney(now, ctx.money_format);\n      const wasMoney = formatMoney(base, ctx.money_format);\n      const saveMoney = formatMoney(off, ctx.money_format);\n\n      node.innerHTML =\n        mode === 'member'\n          ? memberMarkup(ctx, nowMoney, wasMoney, saveMoney)\n          : teaserMarkup(ctx, nowMoney, wasMoney);\n    }\n  };\n\n  const parseContext = (html) => {\n    const doc = new DOMParser().parseFromString(html, 'text/html');\n    const el = doc.querySelector('#cf-club-context-data');\n    if (!el?.textContent) return null;\n    try {\n      return JSON.parse(el.textContent);\n    } catch {\n      return null;\n    }\n  };\n\n  const stickyEl = () => document.querySelector('[data-cf-club-sticky]');\n\n  const applySticky = (ctx) => {\n    const root = stickyEl();\n    if (!root || !ctx?.enabled) return;\n\n    let status = 'guest';\n    let heading = 'Chubby Club PLUS';\n    let body = 'Member prices on every drop';\n    let cta = 'Sign in to save';\n    let hint =\n      'How to unlock: sign in here \u2192 use the same phone as Chubby Club \u2192 Shopify won\u2019t ask for a phone at login, so add it at checkout, then prices sync.';\n    let href = ctx.login_url || '/account/login';\n    let external = false;\n\n    if (ctx.member) {\n      status = 'member';\n      heading = 'Chubby Club';\n      body =\n        ctx.tier_label && ctx.tier_label !== '-'\n          ? `Shopping as ${ctx.tier_label}`\n          : 'Shopping with member prices';\n      cta = '';\n      hint = '';\n      href = '';\n    } else if (ctx.signed_in) {\n      status = 'account';\n      heading = 'Upgrade to PLUS';\n      body = 'Deeper cuts on every order';\n      cta = 'Get PLUS';\n      hint =\n        'Already in Chubby Club? Your Shopify account phone must match. New accounts don\u2019t collect phone at sign-in \u2014 add it at checkout, then sign back in to sync pricing.';\n      href = ctx.plus_url || ctx.join_url || 'https://chubbyclub.com';\n      external = true;\n    }\n\n    if (root.getAttribute('data-cf-club-status') === status) return;\n\n    root.setAttribute('data-cf-club-status', status);\n    root.classList.remove('cf-club-sticky--guest', 'cf-club-sticky--account', 'cf-club-sticky--member');\n    root.classList.add(`cf-club-sticky--${status}`);\n\n    const headingEl = root.querySelector('[data-cf-sticky-heading]');\n    const bodyEl = root.querySelector('[data-cf-sticky-body]');\n    const ctaEl = root.querySelector('[data-cf-sticky-cta]');\n    const hintEl = root.querySelector('[data-cf-sticky-hint]');\n    const linkEl = root.querySelector('[data-cf-sticky-link]');\n\n    if (headingEl) headingEl.textContent = heading;\n    if (bodyEl) bodyEl.textContent = body;\n    if (ctaEl) ctaEl.textContent = cta ? `${cta} \u203A` : '';\n    if (hintEl) {\n      hintEl.textContent = hint;\n      hintEl.hidden = !hint;\n    }\n    if (linkEl && href) {\n      linkEl.setAttribute('href', href);\n      if (hint) linkEl.setAttribute('title', hint);\n      else linkEl.removeAttribute('title');\n      if (external) {\n        linkEl.setAttribute('target', '_blank');\n        linkEl.setAttribute('rel', 'noopener');\n      } else {\n        linkEl.removeAttribute('target');\n        linkEl.removeAttribute('rel');\n      }\n    }\n\n    // Member state is a non-link shell \u2014 rebuild if we hydrated into membership.\n    if (status === 'member' && linkEl) {\n      const logo = ctx.logo_url\n        ? `<span class=\"cf-club-mark cf-club-sticky__mark\" aria-hidden=\"true\"><img class=\"cf-club-mark__img\" src=\"${ctx.logo_url}\" alt=\"\" width=\"32\" height=\"32\" loading=\"lazy\" decoding=\"async\"></span>`\n        : '';\n      root.innerHTML = `<div class=\"cf-club-sticky__rail\"><span class=\"cf-club-sticky__lead\">${logo}<span class=\"cf-club-sticky__copy\"><span class=\"cf-club-sticky__heading\" data-cf-sticky-heading>${heading}</span><span class=\"cf-club-sticky__body\" data-cf-sticky-body>${body}</span></span></span></div>`;\n    }\n  };\n\n  const boot = async () => {\n    const needsPrices = NODES().length > 0;\n    const needsSticky = !!stickyEl();\n    if (!needsPrices && !needsSticky) return;\n\n    try {\n      const url = `${window.Shopify?.routes?.root || '/'}?sections=cf-club-context`;\n      const res = await fetch(url, { credentials: 'same-origin', headers: { Accept: 'application/json' } });\n      if (!res.ok) return;\n      const json = await res.json();\n      const html = json['cf-club-context'];\n      if (!html) return;\n      const ctx = parseContext(html);\n      if (!ctx) return;\n      if (needsPrices) apply(ctx);\n      if (needsSticky) applySticky(ctx);\n    } catch {\n      // Personalization is progressive; public price remains if this fails.\n    }\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', boot, { once: true });\n  } else {\n    boot();\n  }\n})();\n"],
  "mappings": "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",
  "names": []
}
