{
  "version": 3,
  "sources": ["/cdn/shop/t/22/assets/tee-cart-drawer-edit.js?pawuni_v=20260706-drawer-edit-1"],
  "sourcesContent": ["/*\n * Pawuni \u2014 TeeInBlue in-drawer Edit (mini-cart / slide cart).\n *\n * WHY: TeeInBlue's app-v1.js only auto-runs its cart-edit scan on product and\n * /cart pages (Lighthouse gate, per TeeInBlue docs). The mini-cart drawer opens\n * on ANY page, and its `.tee-edit-customization[data-customization-id]` slots\n * (rendered by sections/header.liquid + assets/mini-cart-drawer.js) stay empty\n * off product/cart pages -> the theme fallback \"Edit\" showed and routed to /cart.\n *\n * FIX (verified live): seeding `window.teeinblueShopConfig` with the FULL store\n * config BEFORE app-v1.js inits + dispatching `teeinblue-event-page-changed` after\n * the drawer renders makes TeeInBlue inject its real edit/preview buttons into the\n * drawer, and clicking one opens the TeeInBlue editor IN PLACE (`.tee-edit-popup`).\n * We then close the drawer so the popup isn't hidden under the fixed drawer.\n *\n * The FULL config matters for LAYOUT: seeding only `show_edit_button` still injects\n * but the editor renders TeeInBlue's compact/mobile layout instead of the wide\n * gallery+form layout the /cart page shows. So we grab the real, fresh config the\n * app embed already prints inline on /cart (`window.teeinblueShopConfig = {...}`,\n * valid JSON after the spread), fetched once per page and cached, so the drawer\n * editor matches the /cart editor without hardcoding ~200 settings that would drift.\n *\n * Isolated layer: does NOT modify mini-cart-drawer.js, only acts when the drawer\n * holds a customized line with an empty tee slot, and never overwrites a config\n * TeeInBlue already populated (product/cart pages). If anything fails, the drawer\n * keeps its existing route-to-/cart?pawuni_edit_customization_id fallback.\n */\n(function () {\n  'use strict';\n\n  var DRAWER = '[data-cart-form=\"mini-cart\"]';\n  var EDIT_SLOT = DRAWER + ' .tee-edit-customization[data-customization-id]';\n  var EDIT_BTN =\n    DRAWER + ' .tee-edit-customization button, ' +\n    DRAWER + ' .tee-edit-customization a, ' +\n    DRAWER + ' .tee-edit-customization [role=\"button\"]';\n  var TEE_POPUP = '.tee-edit-popup';\n\n  // Fallback flags if the /cart config fetch fails \u2014 enough to inject (compact layout).\n  var TEE_CART_CONFIG_FALLBACK = { show_edit_button: true, show_preview_button: true };\n\n  // Pull the real store config the app embed prints inline on /cart. It's written\n  // as `window.teeinblueShopConfig = { ...{\"<valid JSON>\"}, ... }`; we extract the\n  // brace-balanced object (JSON-parseable) so the drawer editor matches /cart.\n  function extractCartConfig(html) {\n    var marker = html.indexOf('teeinblueShopConfig');\n    if (marker < 0) return null;\n    var spread = html.indexOf('...{', marker);\n    var start = html.indexOf('{', spread >= 0 ? spread + 3 : marker);\n    if (start < 0) return null;\n    var depth = 0, inStr = false, esc = false;\n    for (var j = start; j < html.length; j++) {\n      var c = html[j];\n      if (inStr) {\n        if (esc) esc = false;\n        else if (c === '\\\\') esc = true;\n        else if (c === '\"') inStr = false;\n      } else if (c === '\"') inStr = true;\n      else if (c === '{') depth++;\n      else if (c === '}') {\n        depth--;\n        if (depth === 0) {\n          try { return JSON.parse(html.slice(start, j + 1)); } catch (e) { return null; }\n        }\n      }\n    }\n    return null;\n  }\n\n  var fullConfigPromise = null;\n  function fetchFullCartConfig() {\n    if (fullConfigPromise) return fullConfigPromise;\n    fullConfigPromise = fetch('/cart', { credentials: 'same-origin' })\n      .then(function (res) { return res.text(); })\n      .then(function (html) { return extractCartConfig(html); })\n      .catch(function () { return null; });\n    return fullConfigPromise;\n  }\n\n  function seedConfig(full) {\n    var existing = window.teeinblueShopConfig || {};\n    // Never clobber a config TeeInBlue already populated (product/cart pages).\n    if (Object.keys(existing).length > 20) return;\n    var cfg = full ? Object.assign({}, full) : Object.assign({}, TEE_CART_CONFIG_FALLBACK);\n    cfg.show_edit_button = true;\n    cfg.show_preview_button = true;\n    window.teeinblueShopConfig = cfg;\n  }\n\n  function ensureAppV1(onReady) {\n    var existing = document.querySelector('script[src*=\"sdk.teeinblue.com/shopify/app-v1.js\"]');\n    if (existing) {\n      if (window.TEEINBLUE_APP) { onReady(); return; }\n      existing.addEventListener('load', onReady, { once: true });\n      window.setTimeout(onReady, 3000);\n      return;\n    }\n    var async = document.querySelector('script[src*=\"sdk.teeinblue.com/async.js\"]');\n    if (!async || !async.src) { onReady(); return; }\n    try {\n      var url = new URL(async.src, window.location.origin);\n      var token = url.searchParams.get('token');\n      var shop = url.searchParams.get('shop');\n      if (!token || !shop) { onReady(); return; }\n      var script = document.createElement('script');\n      script.src = 'https://sdk.teeinblue.com/shopify/app-v1.js?token=' +\n        encodeURIComponent(token) + '&shop=' + encodeURIComponent(shop);\n      script.defer = true;\n      script.addEventListener('load', onReady, { once: true });\n      script.addEventListener('error', onReady, { once: true });\n      document.head.appendChild(script);\n      window.setTimeout(onReady, 4000);\n    } catch (error) {\n      onReady();\n    }\n  }\n\n  function hasEmptyEditSlot() {\n    var slots = document.querySelectorAll(EDIT_SLOT);\n    for (var i = 0; i < slots.length; i++) {\n      if (!slots[i].children.length) return true;\n    }\n    return false;\n  }\n\n  function dispatchPageChanged() {\n    document.dispatchEvent(new CustomEvent('teeinblue-event-page-changed'));\n  }\n\n  var priming = false;\n\n  // The mini-cart drawer only opens on desktop (>=799px, matches\n  // mini-cart-drawer.js canOpenMiniCartDrawer). Priming fetches /cart + loads\n  // TeeInBlue's app-v1.js, so gate it here to avoid that work on mobile \u2014 where\n  // the drawer (and its in-place editor) can never open anyway.\n  function canDrawerOpen() {\n    return window.matchMedia('(min-width: 799px)').matches;\n  }\n\n  // Called after each drawer render. Seeds the (full) config, loads app-v1.js if\n  // needed, and nudges TeeInBlue to (re-)inject into the freshly rendered slots.\n  function primeDrawerEdit() {\n    if (priming) return;\n    if (!canDrawerOpen()) return; // drawer is desktop-only; skip on mobile\n    if (!document.querySelector(EDIT_SLOT)) return; // no customized line in the drawer\n    if (!hasEmptyEditSlot()) return; // TeeInBlue already injected\n\n    priming = true;\n    fetchFullCartConfig().then(function (full) {\n      seedConfig(full);\n      ensureAppV1(function () {\n        dispatchPageChanged();\n        [400, 1000, 2200].forEach(function (delay) {\n          window.setTimeout(function () { if (hasEmptyEditSlot()) dispatchPageChanged(); }, delay);\n        });\n        window.setTimeout(function () { priming = false; }, 2600);\n      });\n    });\n  }\n\n  // TeeInBlue's editor (.tee-edit-popup) opens under the fixed drawer; close the\n  // drawer so it's fully visible. Same outcome as being on the /cart page.\n  function closeDrawer() {\n    if (!document.body || !document.body.classList.contains('pawuni-mini-cart-open')) return;\n    var api = window.PawuniMiniCartDrawer;\n    if (api && typeof api.close === 'function') { api.close(); return; }\n    document.body.classList.remove('pawuni-mini-cart-open');\n    var active = document.querySelectorAll('.cart-container.active_link');\n    for (var i = 0; i < active.length; i++) active[i].classList.remove('active_link');\n  }\n\n  // .tee-edit-popup is a fixed-position modal, so offsetParent is null even when\n  // shown \u2014 check size + computed style instead.\n  function isVisible(el) {\n    if (!el) return false;\n    var rect = el.getBoundingClientRect();\n    if (rect.width < 100 || rect.height < 100) return false;\n    var style = window.getComputedStyle(el);\n    return style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0';\n  }\n\n  function watchForPopupThenCloseDrawer() {\n    var tries = 0;\n    var timer = window.setInterval(function () {\n      tries++;\n      if (isVisible(document.querySelector(TEE_POPUP))) { closeDrawer(); window.clearInterval(timer); return; }\n      if (tries > 25) window.clearInterval(timer);\n    }, 100);\n  }\n\n  ['pawuni:mini-cart-refreshed', 'pawuni:mini-cart-opened'].forEach(function (name) {\n    document.addEventListener(name, primeDrawerEdit);\n  });\n\n  // When a real (TeeInBlue-injected) edit button in the drawer is clicked, wait for\n  // the editor popup and close the drawer. The theme fallback link keeps its own\n  // /cart route, so this only affects the in-place path.\n  document.addEventListener('click', function (event) {\n    if (!event.target || !event.target.closest) return;\n    if (!event.target.closest(EDIT_BTN)) return;\n    watchForPopupThenCloseDrawer();\n  }, true);\n\n  // Warm the config fetch early so the first edit click is instant \u2014 desktop only\n  // (primeDrawerEdit still fetches on demand if the viewport grows past 799px later).\n  if (canDrawerOpen() && document.querySelector(EDIT_SLOT)) fetchFullCartConfig();\n\n  // If the drawer is already open at script load (rare), prime once.\n  if (document.body && document.body.classList.contains('pawuni-mini-cart-open')) primeDrawerEdit();\n})();\n"],
  "mappings": "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",
  "names": []
}
