{
  "version": 3,
  "sources": ["/cdn/shop/t/302/assets/routine-builder.js?cb=13626"],
  "sourcesContent": ["/**\n * Routine Builder - Standalone skincare routine section\n * Independent of quiz system - products configured via Shopify theme customizer\n * Updated with new UI/UX styling - Feb 2026\n */\n\n(function() {\n  'use strict';\n\n  // ============================================\n  // CLOSE ROUTINE BUILDER\n  // ============================================\n\n  /**\n   * Close the routine builder overlay and return to previous page\n   */\n  window.closeRoutineBuilder = function() {\n    // Navigate immediately. (The old version faded the full-page overlay to\n    // opacity 0 first, briefly exposing a blank page before navigating \u2014 which\n    // read as broken.) Go back within the site, otherwise home.\n    if (document.referrer && document.referrer.indexOf(window.location.hostname) !== -1) {\n      window.history.back();\n    } else {\n      window.location.href = '/';\n    }\n  };\n\n  // ============================================\n  // CONFIGURATION\n  // ============================================\n  // Same carousel as the routine landing pages (assets/routine-page-products.js):\n  // 4 cards across on desktop, 3 on tablet, one centred card with a peek of the\n  // next on mobile. Kept byte-for-byte in step with that component so the two\n  // surfaces stay visually identical.\n  const SLICK_CONFIG = {\n    dots: false,\n    infinite: false,\n    speed: 300,\n    slidesToShow: 4,\n    slidesToScroll: 1,\n    arrows: true,\n    prevArrow: window.arrows ? window.arrows.icon_prev : '',\n    nextArrow: window.arrows ? window.arrows.icon_next : '',\n    swipeToSlide: true,\n    responsive: [\n      {\n        breakpoint: 990,\n        settings: {\n          slidesToShow: 3,\n          slidesToScroll: 1,\n          arrows: true\n        }\n      },\n      {\n        breakpoint: 750,\n        settings: {\n          slidesToShow: 1,\n          slidesToScroll: 1,\n          arrows: false,\n          centerMode: true,\n          centerPadding: '24px'\n        }\n      }\n    ]\n  };\n\n  // ============================================\n  // UTILITY FUNCTIONS\n  // ============================================\n\n  /**\n   * Debounce function to limit execution rate\n   */\n  function debounce(func, wait) {\n    let timeout;\n    return function executedFunction(...args) {\n      const later = () => {\n        clearTimeout(timeout);\n        func(...args);\n      };\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n    };\n  }\n\n  // ============================================\n  // SLIDER INITIALIZATION\n  // ============================================\n\n  // The component hides each grid (opacity: 0) until Slick initialises. If Slick\n  // never arrives, that used to mean every step stayed permanently blank while\n  // this function retried forever. Give up after a bounded number of tries and\n  // reveal the cards as a plain stack \u2014 a scrollable list of products beats an\n  // empty page.\n  var slickTries = 0;\n  var SLICK_MAX_TRIES = 12; // ~6s at 500ms\n\n  function revealGridsWithoutSlick() {\n    document.querySelectorAll('.rp-product-grid').forEach(function (grid) {\n      if (!grid.classList.contains('slick-initialized')) {\n        grid.classList.add('rp-grid-visible');\n      }\n    });\n  }\n\n  function initializeSliders() {\n    if (typeof $ === 'undefined' || typeof $.fn.slick === 'undefined') {\n      if (++slickTries > SLICK_MAX_TRIES) {\n        console.warn('[ROUTINE-BUILDER] Slick unavailable after ' + slickTries + ' tries; showing products unpaginated');\n        revealGridsWithoutSlick();\n        return;\n      }\n      setTimeout(initializeSliders, 500);\n      return;\n    }\n\n    $('.rp-product-grid').not('.slick-initialized').each(function() {\n      const $slider = $(this);\n\n      // Only initialize visible sliders\n      if ($slider.is(':visible') && $slider.children('label').length > 0) {\n        $slider.slick(SLICK_CONFIG);\n      }\n    });\n  }\n\n  // ============================================\n  // AM/PM TOGGLE\n  // ============================================\n\n  window.toggleDayNight = function(button, timeOfDay, stepName) {\n    if (button.classList.contains('disabled')) return;\n\n    const parent = button.closest('.accordion-custom-item');\n    const amBtn = parent.querySelector('.am-btn');\n    const pmBtn = parent.querySelector('.pm-btn');\n    const amProducts = parent.querySelector('.' + stepName + '-am-products');\n    const pmProducts = parent.querySelector('.' + stepName + '-pm-products');\n\n    // Toggle button active states\n    if (timeOfDay === 'am') {\n      amBtn.classList.add('active');\n      amBtn.setAttribute('aria-pressed', 'true');\n      pmBtn.classList.remove('active');\n      pmBtn.setAttribute('aria-pressed', 'false');\n      if (amProducts) {\n        amProducts.style.display = 'block';\n        // Reinitialize slick if needed\n        if (!$(amProducts).hasClass('slick-initialized') && $(amProducts).children('label').length > 0) {\n          $(amProducts).slick(SLICK_CONFIG);\n        } else if ($(amProducts).hasClass('slick-initialized')) {\n          $(amProducts).slick('setPosition');\n        }\n      }\n      if (pmProducts) pmProducts.style.display = 'none';\n    } else {\n      pmBtn.classList.add('active');\n      pmBtn.setAttribute('aria-pressed', 'true');\n      amBtn.classList.remove('active');\n      amBtn.setAttribute('aria-pressed', 'false');\n      if (pmProducts) {\n        pmProducts.style.display = 'block';\n        // Reinitialize slick if needed\n        if (!$(pmProducts).hasClass('slick-initialized') && $(pmProducts).children('label').length > 0) {\n          $(pmProducts).slick(SLICK_CONFIG);\n        } else if ($(pmProducts).hasClass('slick-initialized')) {\n          $(pmProducts).slick('setPosition');\n        }\n      }\n      if (amProducts) amProducts.style.display = 'none';\n    }\n  };\n\n  // ============================================\n  // PRODUCT SELECTION & QUANTITY\n  // ============================================\n\n  // Clear any other product chosen in the same carousel (one per step). Scoped\n  // to the grid rather than the whole step so a Day/Night step can still hold\n  // one morning and one evening product.\n  function deselectSiblingsInStep(checkbox) {\n    const grid = checkbox.closest('.rp-product-grid');\n    if (!grid) return;\n    grid.querySelectorAll('input.custom-input:checked').forEach(function (other) {\n      if (other === checkbox) return;\n      other.checked = false;\n      const card = other.closest('label');\n      if (!card) return;\n      const qty = card.querySelector('.quantity-selector, .ebc-quantity-selector, .product-quantity-selector');\n      if (qty) qty.style.display = 'none';\n      const qtyInput = card.querySelector('.quantity-input');\n      if (qtyInput) qtyInput.value = 1;\n    });\n  }\n\n  function handleProductSelection(checkbox) {\n    const card = checkbox.closest('label');\n    // Support both old and new class names\n    const quantitySelector = card.querySelector('.quantity-selector, .ebc-quantity-selector, .product-quantity-selector');\n    const closeBtn = card.querySelector('.closebtn, .ebc-remove-btn, .product-remove-btn');\n    const addBtn = card.querySelector('.ebc-add-btn, .add-btn');\n\n    if (checkbox.checked) {\n      // One product per step. This page used to allow stacking \u2014 four cleansers\n      // in step 1, the badge climbing to 4 \u2014 while the results page enforced one\n      // with identical-looking cards. Picking a product now replaces whatever\n      // was chosen in that step.\n      deselectSiblingsInStep(checkbox);\n\n      if (quantitySelector) quantitySelector.style.display = 'flex';\n      if (closeBtn) closeBtn.style.display = 'flex';\n      if (addBtn) {\n        addBtn.classList.add('added');\n        const addText = addBtn.querySelector('.add-text, .add-btn-text');\n        if (addText) addText.textContent = 'Added';\n      }\n    } else {\n      if (quantitySelector) quantitySelector.style.display = 'none';\n      if (closeBtn) closeBtn.style.display = 'none';\n      if (addBtn) {\n        addBtn.classList.remove('added');\n        const addText = addBtn.querySelector('.add-text, .add-btn-text');\n        if (addText) addText.textContent = 'Add to Bag';\n      }\n      // Reset quantity to 1\n      const qtyInput = card.querySelector('.quantity-input');\n      if (qtyInput) qtyInput.value = 1;\n    }\n\n    updateTotals();\n    syncStepCollapse(checkbox);\n  }\n\n  function handleQuantityChange(button, increment) {\n    const card = button.closest('label');\n    const input = card.querySelector('.quantity-input');\n    if (!input) return;\n\n    let value = parseInt(input.value) || 1;\n    value = increment ? value + 1 : Math.max(1, value - 1);\n    input.value = value;\n\n    updateTotals();\n  }\n\n  function handleCloseButton(closeBtn) {\n    const card = closeBtn.closest('label');\n    const checkbox = card.querySelector('.custom-input');\n    if (checkbox) {\n      checkbox.checked = false;\n      handleProductSelection(checkbox);\n    }\n  }\n\n  // ============================================\n  // STEP NAVIGATION HIGHLIGHTING\n  // ============================================\n\n  function updateStepNavigation(activeStepIndex) {\n    // Update sidebar step nav items\n    document.querySelectorAll('.ebc-step-nav__item').forEach((item, index) => {\n      if (index + 1 === activeStepIndex) {\n        item.classList.add('is-active', 'active-step');\n      } else {\n        item.classList.remove('is-active', 'active-step');\n      }\n    });\n\n    // Update mobile step tabs\n    document.querySelectorAll('.mobile-step-tab').forEach((tab, index) => {\n      if (index + 1 === activeStepIndex) {\n        tab.classList.add('is-active', 'active');\n        tab.setAttribute('aria-current', 'step');\n      } else {\n        tab.classList.remove('is-active', 'active');\n        tab.removeAttribute('aria-current');\n      }\n    });\n  }\n\n  // ============================================\n  // TOTALS CALCULATION\n  // ============================================\n\n  function updateTotals() {\n    let total = 0;\n    const stepCounts = {};\n    const selectedProducts = [];\n    const seenVariants = {};\n\n    // Find all checked products\n    document.querySelectorAll('.custom-input:checked').forEach(checkbox => {\n      const variantId = checkbox.value;\n      // Slick duplicates slides for looping; count each variant only once.\n      if (seenVariants[variantId]) { return; }\n      seenVariants[variantId] = true;\n      const card = checkbox.closest('label');\n      const priceAttr = checkbox.getAttribute('product-price');\n      const qtyInput = card.querySelector('.quantity-input');\n      const quantity = parseInt(qtyInput?.value) || 1;\n\n      // product-price is integer cents (B2). Parse and accumulate cents.\n      let priceCents = 0;\n      if (priceAttr) {\n        priceCents = parseInt(priceAttr.replace(/[^0-9]/g, ''), 10) || 0;\n      }\n\n      total += priceCents * quantity;\n\n      // Track step counts\n      const stepContainer = checkbox.closest('.accordion-custom');\n      if (stepContainer) {\n        const stepIndex = Array.from(document.querySelectorAll('.accordion-custom')).indexOf(stepContainer) + 1;\n        stepCounts[stepIndex] = (stepCounts[stepIndex] || 0) + quantity;\n      }\n\n      // Track for cart.\n      selectedProducts.push({\n        id: variantId,\n        quantity: quantity,\n        priceCents: priceCents\n      });\n    });\n\n    // Totals: the plain subtotal. There is no automatic bundle discount any more.\n    const totalText = window.SkinExp.formatMoneyFromCents(total);\n    const summaryTotal = document.querySelector('.custom-total');\n    if (summaryTotal) summaryTotal.textContent = totalText;\n    const mobileTotal = document.getElementById('mobileBarTotal');\n    if (mobileTotal) mobileTotal.textContent = 'Total: ' + totalText;\n\n    // Update step counts in sidebar\n    document.querySelectorAll('[class*=\"itemcount\"]').forEach(el => {\n      const match = el.className.match(/itemcount(\\d+)/);\n      if (match) {\n        const stepNum = parseInt(match[1]);\n        const count = stepCounts[stepNum] || 0;\n        el.textContent = count;\n        // Use success token for active, light gray for inactive (matching theme)\n        el.style.backgroundColor = count > 0 ? 'var(--se-success)' : '#e5e7eb';\n        el.style.color = count > 0 ? '#fff' : '#6b7280';\n        el.style.padding = '4px 12px';\n        el.style.borderRadius = '9999px';\n        el.style.fontSize = '12px';\n        el.style.fontWeight = '700';\n      }\n    });\n\n    // Update button state\n    const addToCartBtn = document.getElementById('routineBuilderAddToCart');\n    const mobileAddToCartBtn = document.getElementById('mobileAddToCart');\n    const hasProducts = selectedProducts.length > 0;\n\n    // The hint under the total used to keep saying \"Please select product(s) to\n    // proceed.\" while the total showed $168.00 \u2014 telling shoppers to do the\n    // thing they had already done.\n    const hint = document.querySelector('.ebc-bundle-summary__hint');\n    if (hint) {\n      const count = selectedProducts.reduce(function (n, p) { return n + (parseInt(p.quantity, 10) || 1); }, 0);\n      hint.textContent = hasProducts\n        ? (count === 1 ? '1 product in your routine.' : count + ' products in your routine.')\n        : 'Please select product(s) to proceed.';\n    }\n\n    if (addToCartBtn) {\n      addToCartBtn.style.backgroundColor = hasProducts ? 'var(--se-ink)' : '#ccc';\n      addToCartBtn.style.color = hasProducts ? '#fff' : '#000';\n      addToCartBtn.disabled = !hasProducts;\n      addToCartBtn.setAttribute('aria-disabled', String(!hasProducts));\n    }\n    if (mobileAddToCartBtn) {\n      // Dark ink (literal, to avoid a var() cascade quirk on this element) so the\n      // button is visible on the white mobile bar (was #fff = invisible on white).\n      mobileAddToCartBtn.style.setProperty('background-color', hasProducts ? '#1a1a1a' : '#cccccc', 'important');\n      mobileAddToCartBtn.style.color = hasProducts ? '#fff' : '#666';\n      mobileAddToCartBtn.disabled = !hasProducts;\n      mobileAddToCartBtn.setAttribute('aria-disabled', String(!hasProducts));\n    }\n\n    // Store selected products for cart submission\n    window.routineBuilderSelectedProducts = selectedProducts;\n\n    // Persist selections so a page refresh doesn't wipe the shopper's choices.\n    try { localStorage.setItem(ROUTINE_SELECTIONS_KEY, JSON.stringify(selectedProducts)); } catch (e) {}\n  }\n\n  // Each brand or category builder (a collection template) keeps its own saved\n  // picks, so choosing SkinCeuticals products never overwrites the main\n  // builder's. The page builder has no data-storage-key and keeps the old key.\n  var ROUTINE_SELECTIONS_KEY = (function () {\n    var overlay = document.getElementById('routineBuilderOverlay');\n    var key = overlay && overlay.getAttribute('data-storage-key');\n    return key || 'ebcRoutineBuilderSelections';\n  })();\n\n  // Re-check the products the shopper had selected before the last refresh.\n  function restoreRoutineSelections() {\n    var saved;\n    try { saved = JSON.parse(localStorage.getItem(ROUTINE_SELECTIONS_KEY) || '[]'); } catch (e) { return; }\n    if (!Array.isArray(saved) || !saved.length) return;\n    var byId = {};\n    saved.forEach(function (p) { if (p && p.id) { byId[String(p.id)] = parseInt(p.quantity, 10) || 1; } });\n    var restored = 0;\n    document.querySelectorAll('input.custom-input').forEach(function (cb) {\n      if (Object.prototype.hasOwnProperty.call(byId, String(cb.value))) {\n        cb.checked = true;\n        var card = cb.closest('label');\n        var qi = card && card.querySelector('.quantity-input');\n        if (qi) { qi.value = byId[String(cb.value)]; }\n        restored++;\n      }\n    });\n    if (restored) { updateTotals(); }\n    return restored;\n  }\n\n  // \"Start with the first product of each step selected\": a ready-made routine\n  // the shopper can change. Only when nothing was restored, so a shopper's own\n  // picks always win. One per carousel, skipping hidden Night lists.\n  function preselectFirstProducts() {\n    var overlay = document.getElementById('routineBuilderOverlay');\n    if (!overlay || overlay.getAttribute('data-preselect') !== 'true') return 0;\n    var picked = 0;\n    document.querySelectorAll('.rp-product-grid').forEach(function (grid) {\n      if (grid.classList.contains('pm-products')) return;\n      if (grid.querySelector('input.custom-input:checked')) return;\n      var first = grid.querySelector('input.custom-input');\n      if (!first) return;\n      first.checked = true;\n      var card = first.closest('label');\n      var qty = card && card.querySelector('.quantity-selector, .ebc-quantity-selector, .product-quantity-selector');\n      if (qty) qty.style.display = 'flex';\n      picked++;\n    });\n    if (picked) { updateTotals(); }\n    return picked;\n  }\n\n  // ============================================\n  // ADD TO CART\n  // ============================================\n\n  // Lightweight, token-styled toast (replaces blocking alert()). Auto-dismisses.\n  function showRoutineToast(message, type) {\n    let toast = document.getElementById('routineBuilderToast');\n    if (!toast) {\n      toast = document.createElement('div');\n      toast.id = 'routineBuilderToast';\n      toast.setAttribute('role', 'status');\n      toast.setAttribute('aria-live', 'polite');\n      toast.style.cssText = [\n        'position:fixed', 'left:50%', 'bottom:24px', 'transform:translateX(-50%) translateY(12px)',\n        'z-index:120', 'max-width:min(92vw,420px)', 'padding:14px 20px',\n        'border-radius:var(--se-radius,8px)', 'font-family:var(--se-font-body,sans-serif)',\n        'font-size:14px', 'font-weight:600', 'color:#fff', 'box-shadow:0 8px 24px rgba(26,26,26,.18)',\n        'opacity:0', 'transition:opacity .25s ease, transform .25s ease', 'pointer-events:none'\n      ].join(';');\n      document.body.appendChild(toast);\n    }\n    toast.style.background = type === 'error' ? '#b3261e' : 'var(--se-success, #2E7D32)';\n    toast.textContent = message;\n    // reflow then animate in\n    void toast.offsetWidth;\n    toast.style.opacity = '1';\n    toast.style.transform = 'translateX(-50%) translateY(0)';\n    clearTimeout(showRoutineToast._t);\n    showRoutineToast._t = setTimeout(function () {\n      toast.style.opacity = '0';\n      toast.style.transform = 'translateX(-50%) translateY(12px)';\n    }, 2600);\n  }\n\n  let routineAddInFlight = false;\n\n  function addToCart(evt) {\n    const products = window.routineBuilderSelectedProducts || [];\n\n    if (products.length === 0) {\n      showRoutineToast('Please select at least one product.', 'error');\n      return;\n    }\n    if (routineAddInFlight) return;\n    routineAddInFlight = true;\n\n    const btn = evt && evt.currentTarget ? evt.currentTarget : null;\n    const buttons = [\n      document.getElementById('routineBuilderAddToCart'),\n      document.getElementById('mobileAddToCart')\n    ].filter(Boolean);\n    const labels = buttons.map(function (b) { return b.textContent; });\n    buttons.forEach(function (b) {\n      b.setAttribute('aria-busy', 'true');\n      b.disabled = true;\n      b.textContent = 'ADDING\u2026';\n    });\n\n    const items = products.map(p => ({\n      id: parseInt(p.id),\n      quantity: p.quantity\n    }));\n\n    fetch('/cart/add.js', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({ items: items })\n    })\n    .then(response => response.json().then(function (body) { return { ok: response.ok, body: body }; }))\n    .then(result => {\n      if (!result.ok) {\n        // Surface Shopify's specific reason (e.g. \"...is already sold out\").\n        var e = new Error((result.body && (result.body.description || result.body.message)) || 'Failed to add to cart');\n        throw e;\n      }\n      showRoutineToast('Added to your cart \u2014 taking you there\u2026', 'success');\n      setTimeout(function () { window.location.href = '/cart'; }, 900);\n    })\n    .catch(error => {\n      console.error('[ROUTINE-BUILDER] Add to cart error:', error);\n      var msg = (error && error.message) || '';\n      if (/sold out|unavailable|out of stock/i.test(msg)) {\n        // Went out of stock after load \u2014 deselect it so they can pick another.\n        var m = msg.match(/'([^']+)'/);\n        var name = m ? m[1] : null;\n        if (name) {\n          document.querySelectorAll('input.custom-input:checked').forEach(function (cb) {\n            var pt = cb.getAttribute('data-product-title') || '';\n            var t = (cb.closest('label') && cb.closest('label').querySelector('.rp-product-card__title, .product-title, .ebc-product-card__title'));\n            var title = t ? t.textContent.trim() : '';\n            if ((pt && name.indexOf(pt) === 0) || (title && name.indexOf(title) === 0)) {\n              cb.checked = false;\n              cb.dispatchEvent(new Event('change', { bubbles: true }));\n            }\n          });\n        }\n        showRoutineToast('Sorry, this product just went out of stock \u2014 please select another.', 'error');\n      } else {\n        showRoutineToast('Something went wrong adding to your cart. Please try again.', 'error');\n      }\n      routineAddInFlight = false;\n      buttons.forEach(function (b, i) {\n        b.removeAttribute('aria-busy');\n        b.disabled = false;\n        b.textContent = labels[i];\n      });\n    });\n  }\n\n  // ============================================\n  // ACCORDION\n  // ============================================\n\n  // Open or close a step. Driven by the `.active` class rather than an inline\n  // maxHeight, which a later !important rule used to override \u2014 leaving the\n  // header inert. Re-measures any carousel inside, because Slick sizes slides\n  // from a visible container.\n  function setStepOpen(item, open) {\n    if (!item) return;\n    item.classList.toggle('active', open);\n    const header = item.querySelector('.accordion, .ebc-accordion__header');\n    if (header) {\n      header.classList.toggle('active', open);\n      header.setAttribute('aria-expanded', String(open));\n    }\n    if (open && typeof $ !== 'undefined' && $.fn.slick) {\n      setTimeout(function () {\n        $(item).find('.rp-product-grid.slick-initialized').each(function () {\n          if ($(this).is(':visible')) { $(this).slick('setPosition'); }\n        });\n      }, 340);\n    }\n  }\n\n  // Fold a step once it has a product, naming the choice in the header so a\n  // folded step still says what is in it. Re-opens when the step is cleared.\n  function syncStepCollapse(checkbox) {\n    const item = checkbox && checkbox.closest('.accordion-custom-item, .ebc-accordion__item');\n    if (!item) return;\n    const chosen = item.querySelector('input.custom-input:checked');\n    const heading = item.querySelector('.accordion h2, .ebc-accordion__title');\n    if (heading) {\n      let badge = heading.querySelector('.ebc-step-chosen');\n      if (chosen) {\n        const card = chosen.closest('label');\n        const title = card && card.querySelector('.rp-product-card__title');\n        if (!badge) {\n          badge = document.createElement('span');\n          badge.className = 'ebc-step-chosen';\n          heading.appendChild(badge);\n        }\n        badge.textContent = title ? title.textContent.trim() : '';\n      } else if (badge) {\n        badge.remove();\n      }\n    }\n    setStepOpen(item, !chosen);\n  }\n\n  function initializeAccordion() {\n    document.addEventListener('click', function (e) {\n      const header = e.target.closest('.accordion, .ebc-accordion__header');\n      if (!header) return;\n      if (e.target.closest('.day-night-toggle, .ebc-day-night-toggle')) return;\n      const item = header.closest('.accordion-custom-item, .ebc-accordion__item');\n      if (!item) return;\n      setStepOpen(item, !item.classList.contains('active'));\n    });\n\n    // Every step starts open.\n    document.querySelectorAll('.accordion-custom-item, .ebc-accordion__item').forEach(item => {\n      setStepOpen(item, true);\n    });\n  }\n\n  // ============================================\n  // MOBILE STEP TRACKER\n  // ============================================\n\n  function initMobileStepTracker() {\n    const steps = document.querySelectorAll('.accordion-custom, .ebc-accordion');\n    if (steps.length === 0) return;\n\n    const observer = new IntersectionObserver((entries) => {\n      entries.forEach(entry => {\n        if (entry.isIntersecting) {\n          const stepIndex = Array.from(steps).indexOf(entry.target) + 1;\n          const stepTitle = entry.target.querySelector('.accordion h2, .ebc-accordion__title')?.textContent || `Step ${stepIndex}`;\n          const mobileStepDisplay = document.getElementById('mobileBarStep');\n          if (mobileStepDisplay) {\n            mobileStepDisplay.textContent = stepTitle;\n          }\n          // Update step navigation highlighting\n          updateStepNavigation(stepIndex);\n        }\n      });\n    }, {\n      threshold: 0.5,\n      rootMargin: '-100px 0px -50% 0px'\n    });\n\n    steps.forEach(step => observer.observe(step));\n  }\n\n  // ============================================\n  // SIDEBAR STEP NAV CLICK HANDLER\n  // ============================================\n\n  // Jump to a step, opening it first. Shared by the sidebar nav and the mobile\n  // step tabs. The scroll goes through SkinExp.scrollStepIntoView because this\n  // page is a fixed overlay with an inner scrollport, where scrollIntoView()\n  // silently does nothing \u2014 see the note on that function.\n  function jumpToStep(stepNumber) {\n    const targetAccordion = document.querySelector(\n      `.ebc-accordion[data-step=\"${stepNumber}\"], .accordion-custom[data-step=\"${stepNumber}\"]`\n    );\n    if (!targetAccordion) return;\n\n    // Steps collapse once a product is chosen; jumping to a closed one would\n    // land on a bare header.\n    const accordionItem = targetAccordion.querySelector('.accordion-custom-item, .ebc-accordion__item');\n    if (accordionItem && !accordionItem.classList.contains('active')) {\n      const header = accordionItem.querySelector('.accordion, .ebc-accordion__header');\n      if (header) header.click();\n    }\n\n    window.SkinExp.scrollStepIntoView(targetAccordion, { offset: 8 });\n  }\n\n  function initSidebarStepNav() {\n    document.querySelectorAll('.ebc-step-nav__item').forEach(item => {\n      item.addEventListener('click', function() {\n        const stepNumber = parseInt(this.dataset.step);\n        if (!stepNumber) return;\n        updateStepNavigation(stepNumber);\n        jumpToStep(stepNumber);\n      });\n    });\n  }\n\n  // ============================================\n  // MOBILE STEP TAB CLICK HANDLER\n  // ============================================\n\n  function initMobileStepTabs() {\n    document.querySelectorAll('.mobile-step-tab').forEach(tab => {\n      tab.addEventListener('click', function() {\n        const stepNumber = parseInt(this.dataset.step);\n        if (!stepNumber) return;\n        updateStepNavigation(stepNumber);\n        jumpToStep(stepNumber);\n      });\n    });\n  }\n\n  // ============================================\n  // GLOBAL AM/PM TOGGLE HANDLER\n  // ============================================\n\n  function initGlobalAmPmToggle() {\n    document.querySelectorAll('.ebc-ampm-toggle__option').forEach(option => {\n      option.addEventListener('click', function() {\n        const timeOfDay = this.dataset.time;\n\n        // Update toggle button states\n        document.querySelectorAll('.ebc-ampm-toggle__option').forEach(opt => {\n          opt.classList.remove('is-active');\n          opt.setAttribute('aria-pressed', 'false');\n        });\n        this.classList.add('is-active');\n        this.setAttribute('aria-pressed', 'true');\n\n        // Toggle all accordions to the selected time\n        document.querySelectorAll('.accordion-custom-item, .ebc-accordion__item').forEach(item => {\n          const amBtn = item.querySelector('.am-btn');\n          const pmBtn = item.querySelector('.pm-btn');\n\n          if (timeOfDay === 'am' && amBtn && !amBtn.classList.contains('active')) {\n            amBtn.click();\n          } else if (timeOfDay === 'pm' && pmBtn && !pmBtn.classList.contains('active')) {\n            pmBtn.click();\n          }\n        });\n      });\n    });\n  }\n\n  // ============================================\n  // EVENT LISTENERS\n  // ============================================\n\n  function initializeEventListeners() {\n    // Product checkbox changes\n    document.addEventListener('change', function(e) {\n      if (e.target.classList.contains('custom-input')) {\n        handleProductSelection(e.target);\n      }\n    });\n\n    // Quantity buttons\n    document.addEventListener('click', function(e) {\n      if (e.target.classList.contains('quantity-btn')) {\n        // The card root is a <label>. A <button> is interactive content so the\n        // spec already stops the label forwarding the click to the checkbox \u2014\n        // cancel the default anyway so stepping the quantity can never\n        // deselect the product.\n        e.preventDefault();\n        const isPlus = e.target.classList.contains('plus');\n        handleQuantityChange(e.target, isPlus);\n      }\n\n      // Close/Remove button (both old and new classes)\n      if (e.target.closest('.closebtn') || e.target.closest('.ebc-remove-btn') || e.target.closest('.product-remove-btn')) {\n        handleCloseButton(e.target.closest('.closebtn') || e.target.closest('.ebc-remove-btn') || e.target.closest('.product-remove-btn'));\n      }\n\n      // Add to bag button click (both old and new classes)\n      if (e.target.closest('.ebc-add-btn') || e.target.closest('.add-btn')) {\n        const card = e.target.closest('label');\n        const checkbox = card?.querySelector('.custom-input');\n        if (checkbox && !checkbox.checked) {\n          checkbox.checked = true;\n          handleProductSelection(checkbox);\n        }\n      }\n    });\n\n    // Quantity input direct changes\n    document.addEventListener('input', debounce(function(e) {\n      if (e.target.classList.contains('quantity-input')) {\n        updateTotals();\n      }\n    }, 150));\n\n    // Add to cart buttons\n    const addToCartBtn = document.getElementById('routineBuilderAddToCart');\n    const mobileAddToCartBtn = document.getElementById('mobileAddToCart');\n\n    if (addToCartBtn) {\n      addToCartBtn.addEventListener('click', addToCart);\n    }\n    if (mobileAddToCartBtn) {\n      mobileAddToCartBtn.addEventListener('click', addToCart);\n    }\n  }\n\n  // ============================================\n  // MOBILE STICKY BAR VISIBILITY\n  // ============================================\n\n  function initMobileStickyBar() {\n    const mobileBar = document.getElementById('mobileBar');\n    if (!mobileBar) return;\n\n    // Show the mobile bar after a short delay\n    setTimeout(() => {\n      mobileBar.classList.add('visible');\n    }, 500);\n  }\n\n  // ============================================\n  // INITIALIZATION\n  // ============================================\n\n  function init() {\n    initializeEventListeners();\n    initializeAccordion();\n\n    // Restore the shopper's previously-selected products BEFORE Slick clones the\n    // slides, so the cloned slides inherit the checked state too.\n    if (!restoreRoutineSelections()) {\n      preselectFirstProducts();\n    }\n\n    // Initialize sliders after a short delay to ensure DOM is ready\n    setTimeout(initializeSliders, 500);\n\n    // Initialize mobile step tracker\n    setTimeout(initMobileStepTracker, 1000);\n\n    // Initialize sidebar step navigation\n    initSidebarStepNav();\n\n    // Initialize mobile step tabs\n    initMobileStepTabs();\n\n    // Initialize global AM/PM toggle\n    initGlobalAmPmToggle();\n\n    // Initialize mobile sticky bar\n    initMobileStickyBar();\n\n    // Initial totals calculation\n    updateTotals();\n\n    // Set initial step navigation state\n    updateStepNavigation(1);\n  }\n\n  // Run on DOM ready\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n\n})();\n"],
  "mappings": "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",
  "names": []
}
