{
  "version": 3,
  "sources": ["/cdn/shop/t/20/assets/drsknn-treatment-v3.js?tv3_revision=20260825-pricing-module-direct-booking"],
  "sourcesContent": ["/* Dr Sknn Treatment V3 \u2014 carousel and contained consultation/pricing journeys. */\n(function () {\n  \"use strict\";\n\n  var root = document.querySelector(\"[data-drsknn-treatment-v3]\");\n  if (!root || root.dataset.treatmentV3Ready === \"true\") return;\n  root.dataset.treatmentV3Ready = \"true\";\n\n  var activeOverlay = null;\n  var lastTrigger = null;\n  var returnUrl = \"\";\n  var pricingPromise = null;\n  var suppressPricingClose = false;\n  var nestedPricingIsolation = null;\n  var nestedPricingObserver = null;\n  var resultIndex = 0;\n  var resultZoom = 1;\n  var zoomPositionToken = 0;\n  var zoomDrag = null;\n  var zoomDragMoved = false;\n  var preserveOriginBehaviour = root.dataset.treatmentHandle === \"origin-laser-v3-preview\";\n\n  function q(selector, context) {\n    return (context || document).querySelector(selector);\n  }\n\n  function qa(selector, context) {\n    return Array.prototype.slice.call((context || document).querySelectorAll(selector));\n  }\n\n  function initJumpNavigation() {\n    if (preserveOriginBehaviour) return;\n    var jump = q(\".drsknn-treatment-v3__jump\", root);\n    var scroller = q(\".drsknn-treatment-v3__jump-inner\", jump);\n    var links = qa('a[href^=\"#treatment-\"]', jump);\n    if (!jump || !scroller || !links.length) return;\n\n    var frame = 0;\n    function updateOverflowCue() {\n      frame = 0;\n      var maximum = Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n      var state = \"none\";\n      var cue = \"\";\n      if (maximum > 2) {\n        if (scroller.scrollLeft <= 2) {\n          state = \"start\";\n          cue = \"More \u2192\";\n        } else if (scroller.scrollLeft >= maximum - 2) {\n          state = \"end\";\n          cue = \"\u2190 More\";\n        } else {\n          state = \"middle\";\n          cue = \"More \u2194\";\n        }\n      }\n      jump.setAttribute(\"data-tv3-jump-overflow\", state);\n      jump.setAttribute(\"data-tv3-jump-cue\", cue);\n    }\n\n    function scheduleOverflowCue() {\n      if (frame) window.cancelAnimationFrame(frame);\n      frame = window.requestAnimationFrame(updateOverflowCue);\n    }\n\n    function markCurrent(link) {\n      links.forEach(function (candidate) {\n        if (candidate === link) candidate.setAttribute(\"aria-current\", \"location\");\n        else candidate.removeAttribute(\"aria-current\");\n      });\n    }\n\n    links.forEach(function (link) {\n      link.addEventListener(\"click\", function () { markCurrent(link); });\n    });\n\n    if (typeof window.IntersectionObserver === \"function\") {\n      var sections = links.map(function (link) {\n        try { return q(link.getAttribute(\"href\"), root); } catch (_) { return null; }\n      }).filter(Boolean);\n      var sectionToLink = new Map();\n      links.forEach(function (link) {\n        var section = null;\n        try { section = q(link.getAttribute(\"href\"), root); } catch (_) {}\n        if (section) sectionToLink.set(section, link);\n      });\n      var observer = new window.IntersectionObserver(function (entries) {\n        var visible = entries.filter(function (entry) { return entry.isIntersecting; })\n          .sort(function (a, b) { return b.intersectionRatio - a.intersectionRatio; });\n        if (visible[0] && sectionToLink.has(visible[0].target)) markCurrent(sectionToLink.get(visible[0].target));\n      }, { rootMargin: \"-18% 0px -68% 0px\", threshold: [0, .05, .2] });\n      sections.forEach(function (section) { observer.observe(section); });\n    } else {\n      markCurrent(links[0]);\n    }\n\n    scroller.addEventListener(\"scroll\", scheduleOverflowCue, { passive: true });\n    window.addEventListener(\"resize\", scheduleOverflowCue, { passive: true });\n    updateOverflowCue();\n  }\n\n  function initProofFallback() {\n    if (preserveOriginBehaviour) return;\n    var section = q(\".drsknn-treatment-v3__results-live\", root);\n    var host = q(\"[data-drsknn-proof-preview]\", section);\n    if (!section || !host || !q(\".dps-loading\", host)) return;\n\n    var timeout = null;\n    var started = false;\n    var viewport = null;\n    function startTimeout() {\n      if (started) return;\n      started = true;\n      if (viewport) viewport.disconnect();\n      if (!q(\".dps-loading\", host) || q(\".dps-preview-grid, .dps-preview\", host)) return;\n      timeout = window.setTimeout(function () {\n        var loading = q(\".dps-loading\", host);\n        if (!loading || q(\".dps-preview-grid, .dps-preview\", host)) return;\n        section.setAttribute(\"data-tv3-proof-state\", \"timeout\");\n        loading.classList.add(\"drsknn-treatment-v3__proof-fallback\");\n        loading.setAttribute(\"role\", \"status\");\n        loading.setAttribute(\"aria-live\", \"polite\");\n        loading.innerHTML = \"<strong>Results are taking longer than expected.</strong><span>Use the complete Before &amp; After Studio link below while this panel reconnects.</span>\";\n      }, 10000);\n    }\n\n    if (typeof window.MutationObserver === \"function\") {\n      var observer = new window.MutationObserver(function () {\n        if (!q(\".dps-preview-grid, .dps-preview\", host)) return;\n        if (timeout !== null) window.clearTimeout(timeout);\n        if (viewport) viewport.disconnect();\n        section.setAttribute(\"data-tv3-proof-state\", \"ready\");\n        observer.disconnect();\n      });\n      observer.observe(host, { childList: true, subtree: true });\n    }\n\n    // Match the proof loader's visibility margin; off-screen waiting is not a load failure.\n    if (typeof window.IntersectionObserver === \"function\") {\n      viewport = new window.IntersectionObserver(function (entries) {\n        if (entries.some(function (entry) { return entry.isIntersecting; })) startTimeout();\n      }, { rootMargin: \"700px 0px\" });\n      viewport.observe(host);\n    } else {\n      startTimeout();\n    }\n  }\n\n  function nestedPricingBackdrop() {\n    return q(\".drsknn-pricing-modal-backdrop.drsknn-pricing-modal-open\");\n  }\n\n  function nestedPricingIsOpen() {\n    return Boolean(nestedPricingBackdrop());\n  }\n\n  function restoreNestedPricingIsolation() {\n    if (!nestedPricingIsolation) return;\n    var overlay = nestedPricingIsolation.overlay;\n    var dialog = nestedPricingIsolation.dialog;\n    overlay.inert = nestedPricingIsolation.inert;\n    if (!nestedPricingIsolation.hadInert) overlay.removeAttribute(\"inert\");\n    if (nestedPricingIsolation.ariaHidden === null) overlay.removeAttribute(\"aria-hidden\");\n    else overlay.setAttribute(\"aria-hidden\", nestedPricingIsolation.ariaHidden);\n    overlay.removeAttribute(\"data-tv3-nested-pricing-active\");\n    if (dialog) {\n      if (nestedPricingIsolation.ariaModal === null) dialog.removeAttribute(\"aria-modal\");\n      else dialog.setAttribute(\"aria-modal\", nestedPricingIsolation.ariaModal);\n    }\n    document.documentElement.classList.remove(\"drsknn-tv3-nested-pricing-open\");\n    nestedPricingIsolation = null;\n  }\n\n  function syncNestedPricingIsolation() {\n    if (preserveOriginBehaviour) return;\n    var overlay = overlayFor(\"pricing\");\n    var backdrop = nestedPricingBackdrop();\n    var shouldSuspend = Boolean(\n      overlay &&\n      backdrop &&\n      overlay.classList.contains(\"is-open\") &&\n      !overlay.contains(backdrop)\n    );\n    if (!shouldSuspend) {\n      restoreNestedPricingIsolation();\n      return;\n    }\n    if (nestedPricingIsolation) return;\n\n    var dialog = q(':scope > [role=\"dialog\"]', overlay) || q('[role=\"dialog\"]', overlay);\n    nestedPricingIsolation = {\n      overlay: overlay,\n      dialog: dialog,\n      inert: Boolean(overlay.inert),\n      hadInert: overlay.hasAttribute(\"inert\"),\n      ariaHidden: overlay.getAttribute(\"aria-hidden\"),\n      ariaModal: dialog ? dialog.getAttribute(\"aria-modal\") : null\n    };\n    overlay.setAttribute(\"data-tv3-nested-pricing-active\", \"true\");\n    overlay.inert = true;\n    overlay.setAttribute(\"aria-hidden\", \"true\");\n    if (dialog) dialog.setAttribute(\"aria-modal\", \"false\");\n    document.documentElement.classList.add(\"drsknn-tv3-nested-pricing-open\");\n  }\n\n  function bindNestedPricingIsolation() {\n    if (preserveOriginBehaviour || typeof window.MutationObserver !== \"function\") return;\n    var backdrop = q(\".drsknn-pricing-modal-backdrop\");\n    if (!backdrop) return;\n    if (nestedPricingObserver) nestedPricingObserver.disconnect();\n    nestedPricingObserver = new window.MutationObserver(syncNestedPricingIsolation);\n    nestedPricingObserver.observe(backdrop, { attributes: true, attributeFilter: [\"class\", \"aria-hidden\"] });\n    syncNestedPricingIsolation();\n  }\n\n  function initHeaderSearchBridge() {\n    if (document.documentElement.dataset.drsknnHeaderSearchBridgeReady === \"true\") return;\n    var compactSearch = q(\".header .header-full-width-search\");\n    var compactForm = compactSearch && q(\"form.search\", compactSearch);\n    var compactInput = compactSearch && q('input[type=\"search\"]', compactSearch);\n    var compactSubmit = compactSearch && q('button[type=\"submit\"]', compactSearch);\n    var modalRoot = q(\".header .header__search\");\n    var modalDetails = modalRoot && q(\"details\", modalRoot);\n    var modalInput = modalRoot && q('input[type=\"search\"]', modalRoot);\n\n    if (!compactForm || !compactInput || !compactSubmit || !modalRoot || !modalDetails || !modalInput) return;\n    document.documentElement.dataset.drsknnHeaderSearchBridgeReady = \"true\";\n\n    function setModalRootVisible(visible) {\n      if (visible) {\n        modalRoot.setAttribute(\"data-tv3-search-bridge\", \"true\");\n        modalRoot.style.setProperty(\"display\", \"block\", \"important\");\n      } else {\n        modalRoot.removeAttribute(\"data-tv3-search-bridge\");\n        modalRoot.style.removeProperty(\"display\");\n      }\n    }\n\n    function openSearch(event) {\n      if (compactInput.value.trim()) return;\n      event.preventDefault();\n      setModalRootVisible(true);\n      modalDetails.open = true;\n      window.requestAnimationFrame(function () {\n        modalInput.focus({ preventScroll: true });\n      });\n    }\n\n    compactSubmit.addEventListener(\"click\", openSearch);\n    compactForm.addEventListener(\"submit\", openSearch);\n    modalDetails.addEventListener(\"toggle\", function () {\n      if (modalDetails.open) {\n        setModalRootVisible(true);\n        window.requestAnimationFrame(function () {\n          modalInput.focus({ preventScroll: true });\n        });\n        return;\n      }\n      setModalRootVisible(false);\n    });\n  }\n\n  // This pilot owns its complete page journey, so remove the generic SEO block\n  // if a cached storefront render injects it beneath the V3 section.\n  function removeLegacyEnhancement() {\n    qa(\".drsknn-seo-enhancement\").forEach(function (enhancement) {\n      enhancement.remove();\n    });\n  }\n\n  removeLegacyEnhancement();\n  var legacySweep = window.setInterval(removeLegacyEnhancement, 250);\n  window.setTimeout(function () {\n    removeLegacyEnhancement();\n    window.clearInterval(legacySweep);\n  }, 15000);\n\n  function initCarousel() {\n    var viewport = q(\"[data-tv3-carousel]\", root);\n    var slides = qa(\"[data-tv3-carousel-slide]\", root);\n    var current = q(\"[data-tv3-carousel-current]\", root);\n    var prev = q(\"[data-tv3-carousel-prev]\", root);\n    var next = q(\"[data-tv3-carousel-next]\", root);\n    if (!viewport || !slides.length) return;\n\n    var index = 0;\n    var frame = 0;\n\n    function nearestIndex() {\n      var left = viewport.getBoundingClientRect().left;\n      var best = 0;\n      var distance = Infinity;\n      slides.forEach(function (slide, slideIndex) {\n        var candidate = Math.abs(slide.getBoundingClientRect().left - left);\n        if (candidate < distance) {\n          distance = candidate;\n          best = slideIndex;\n        }\n      });\n      return best;\n    }\n\n    function maximumStartIndex() {\n      var maximumScroll = Math.max(0, viewport.scrollWidth - viewport.clientWidth);\n      var viewportLeft = viewport.getBoundingClientRect().left;\n      var best = 0;\n      var distance = Infinity;\n      slides.forEach(function (slide, slideIndex) {\n        var naturalLeft = slide.getBoundingClientRect().left - viewportLeft + viewport.scrollLeft;\n        var candidate = Math.abs(naturalLeft - maximumScroll);\n        if (candidate < distance) {\n          distance = candidate;\n          best = slideIndex;\n        }\n      });\n      return best;\n    }\n\n    function setDirectionState(button, disabled) {\n      if (!button) return;\n      button.disabled = disabled;\n      button.setAttribute(\"aria-disabled\", disabled ? \"true\" : \"false\");\n    }\n\n    function update() {\n      index = nearestIndex();\n      if (current) current.textContent = String(index + 1);\n      setDirectionState(prev, index === 0);\n      setDirectionState(next, index >= maximumStartIndex());\n    }\n\n    function goTo(target) {\n      index = Math.max(0, Math.min(maximumStartIndex(), target));\n      var delta = slides[index].getBoundingClientRect().left - viewport.getBoundingClientRect().left;\n      viewport.scrollBy({ left: delta, behavior: \"smooth\" });\n      window.setTimeout(update, 320);\n    }\n\n    if (prev) prev.addEventListener(\"click\", function () { goTo(nearestIndex() - 1); });\n    if (next) next.addEventListener(\"click\", function () { goTo(nearestIndex() + 1); });\n    viewport.addEventListener(\"keydown\", function (event) {\n      if (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\") return;\n      event.preventDefault();\n      goTo(nearestIndex() + (event.key === \"ArrowRight\" ? 1 : -1));\n    });\n    viewport.addEventListener(\"scroll\", function () {\n      if (frame) window.cancelAnimationFrame(frame);\n      frame = window.requestAnimationFrame(function () {\n        frame = 0;\n        update();\n      });\n    }, { passive: true });\n    window.addEventListener(\"resize\", update, { passive: true });\n    update();\n  }\n\n  function initTreatmentVideos() {\n    qa(\"[data-tv3-video-load]\", root).forEach(function (button) {\n      button.addEventListener(\"click\", function () {\n        var source = button.getAttribute(\"data-tv3-video-src\") || \"\";\n        if (!/^https:\\/\\/www\\.youtube-nocookie\\.com\\/embed\\/[A-Za-z0-9_-]+(?:\\?|$)/.test(source)) return;\n        var frame = document.createElement(\"iframe\");\n        frame.src = source;\n        frame.title = button.getAttribute(\"data-tv3-video-title\") || \"Dr Sknn treatment video\";\n        frame.loading = \"lazy\";\n        frame.allow = \"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\";\n        frame.allowFullscreen = true;\n        frame.referrerPolicy = \"strict-origin-when-cross-origin\";\n        button.replaceWith(frame);\n      }, { once: true });\n    });\n  }\n\n  function directBookingOverlay() {\n    return q('[data-tv3-overlay=\"direct-booking\"]', root);\n  }\n\n  function filterDirectAreas() {\n    var overlay = directBookingOverlay();\n    if (!overlay) return;\n    var search = q(\"[data-tv3-direct-search]\", overlay);\n    var activeGroup = q(\"[data-tv3-direct-group]:not([hidden])\", overlay);\n    var empty = q(\"[data-tv3-direct-empty]\", overlay);\n    if (!activeGroup) return;\n    var terms = String(search ? search.value : \"\").toLowerCase().trim().split(/\\s+/).filter(Boolean);\n    var visible = 0;\n    qa(\"[data-tv3-direct-area-card]\", activeGroup).forEach(function (card) {\n      var name = String(card.getAttribute(\"data-tv3-direct-area-name\") || \"\");\n      var matches = terms.every(function (term) { return name.indexOf(term) !== -1; });\n      card.hidden = !matches;\n      if (matches) visible += 1;\n    });\n    if (empty) empty.hidden = visible !== 0;\n  }\n\n  function setDirectBookingGroup(slug, focusTab) {\n    var overlay = directBookingOverlay();\n    if (!overlay) return;\n    var tabs = qa(\"[data-tv3-direct-group-tab]\", overlay);\n    var groups = qa(\"[data-tv3-direct-group]\", overlay);\n    var selected = null;\n    tabs.forEach(function (tab) {\n      var active = tab.getAttribute(\"data-tv3-direct-group-tab\") === slug;\n      tab.setAttribute(\"aria-selected\", active ? \"true\" : \"false\");\n      tab.tabIndex = active ? 0 : -1;\n      if (active) selected = tab;\n    });\n    groups.forEach(function (group) {\n      var active = group.getAttribute(\"data-tv3-direct-group\") === slug;\n      group.hidden = !active;\n      group.setAttribute(\"aria-hidden\", active ? \"false\" : \"true\");\n    });\n    filterDirectAreas();\n    if (focusTab && selected) selected.focus({ preventScroll: true });\n  }\n\n  function resetDirectBookingPicker() {\n    var overlay = directBookingOverlay();\n    if (!overlay) return;\n    var search = q(\"[data-tv3-direct-search]\", overlay);\n    var firstTab = q(\"[data-tv3-direct-group-tab]\", overlay);\n    if (search) search.value = \"\";\n    if (firstTab) setDirectBookingGroup(firstTab.getAttribute(\"data-tv3-direct-group-tab\") || \"\", false);\n    else filterDirectAreas();\n  }\n\n  function initDirectBookingPicker() {\n    var overlay = directBookingOverlay();\n    if (!overlay) return;\n    var tabs = qa(\"[data-tv3-direct-group-tab]\", overlay);\n    var search = q(\"[data-tv3-direct-search]\", overlay);\n    var consultationFallback = q(\"[data-tv3-direct-consultation]\", overlay);\n    tabs.forEach(function (tab, index) {\n      tab.addEventListener(\"click\", function () {\n        setDirectBookingGroup(tab.getAttribute(\"data-tv3-direct-group-tab\") || \"\", false);\n      });\n      tab.addEventListener(\"keydown\", function (event) {\n        if (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\") return;\n        event.preventDefault();\n        var delta = event.key === \"ArrowRight\" ? 1 : -1;\n        var next = tabs[(index + delta + tabs.length) % tabs.length];\n        setDirectBookingGroup(next.getAttribute(\"data-tv3-direct-group-tab\") || \"\", true);\n      });\n    });\n    if (search) search.addEventListener(\"input\", filterDirectAreas);\n    if (consultationFallback) {\n      consultationFallback.addEventListener(\"click\", function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        openOverlay(\"consultation\", consultationFallback);\n      });\n    }\n    qa(\"[data-tv3-direct-service-link]\", overlay).forEach(function (link) {\n      link.addEventListener(\"click\", function () { link.setAttribute(\"aria-busy\", \"true\"); });\n    });\n    resetDirectBookingPicker();\n  }\n\n  function relativeUrl(value) {\n    try {\n      var parsed = new URL(value, window.location.href);\n      return parsed.pathname + parsed.search + parsed.hash;\n    } catch (_) {\n      return value;\n    }\n  }\n\n  function overlayFor(name) {\n    return q('[data-tv3-overlay=\"' + name + '\"]', root);\n  }\n\n  function focusableElements(container) {\n    return qa(\n      'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), iframe, [tabindex]:not([tabindex=\"-1\"])',\n      container\n    ).filter(function (element) {\n      return element.getAttribute(\"aria-hidden\") !== \"true\" &&\n        (element.offsetWidth > 0 || element.offsetHeight > 0 || element.getClientRects().length > 0);\n    });\n  }\n\n  function trapOverlayFocus(event) {\n    if (!activeOverlay || event.key !== \"Tab\") return;\n    var dialog = q('[role=\"dialog\"]', activeOverlay);\n    if (!dialog) return;\n    var focusable = focusableElements(dialog);\n    if (!focusable.length) {\n      event.preventDefault();\n      dialog.focus({ preventScroll: true });\n      return;\n    }\n    var first = focusable[0];\n    var last = focusable[focusable.length - 1];\n    var active = document.activeElement;\n    if (event.shiftKey && (active === first || active === dialog || !dialog.contains(active))) {\n      event.preventDefault();\n      last.focus({ preventScroll: true });\n    } else if (!event.shiftKey && (active === last || active === dialog || !dialog.contains(active))) {\n      event.preventDefault();\n      first.focus({ preventScroll: true });\n    }\n  }\n\n  function resetConsultation() {\n    var chooser = q(\"[data-tv3-consultation-chooser]\", root);\n    var booking = q(\"[data-tv3-booking]\", root);\n    var frame = q(\"[data-tv3-booking-frame]\", root);\n    if (chooser) chooser.hidden = false;\n    if (booking) booking.hidden = true;\n    if (tv3ParentBridge) tv3ParentBridge.destroy();\n    tv3ParentBridge = null;\n    if (frame) frame.removeAttribute(\"src\");\n  }\n\n  function closeOverlay(overlay, options) {\n    if (!overlay || !overlay.classList.contains(\"is-open\")) return;\n    options = options || {};\n\n    if (overlay.getAttribute(\"data-tv3-overlay\") === \"pricing\") {\n      restoreNestedPricingIsolation();\n      if (!options.skipPricingClose) {\n        var exactClose = q(\".drsknn-pricing-modal-open [data-pricing-close-modal]\");\n        if (exactClose) {\n          suppressPricingClose = true;\n          exactClose.click();\n          window.setTimeout(function () { suppressPricingClose = false; }, 0);\n        }\n        var guideClose = q(\"[data-pv3-guide]:not([hidden]) [data-pv3-guide-close]\");\n        if (guideClose) guideClose.click();\n      }\n    }\n\n    overlay.classList.remove(\"is-open\");\n    overlay.setAttribute(\"aria-hidden\", \"true\");\n    document.body.classList.remove(\"drsknn-tv3-modal-open\");\n    activeOverlay = null;\n\n    if (returnUrl) {\n      window.history.replaceState(window.history.state || {}, \"\", relativeUrl(returnUrl));\n      returnUrl = \"\";\n    }\n\n    if (overlay.getAttribute(\"data-tv3-overlay\") === \"consultation\") resetConsultation();\n    if (overlay.getAttribute(\"data-tv3-overlay\") === \"direct-booking\") resetDirectBookingPicker();\n    if (overlay.getAttribute(\"data-tv3-overlay\") === \"results\") setResultZoom(1, false);\n    if (lastTrigger && typeof lastTrigger.focus === \"function\") lastTrigger.focus({ preventScroll: true });\n    lastTrigger = null;\n  }\n\n  function setPricingRoute() {\n    var url = new URL(window.location.href);\n    var pricingSlug = root.dataset.pricingSlug || \"all\";\n    url.searchParams.set(\"price_route\", \"search\");\n    if (pricingSlug === \"all\") url.searchParams.delete(\"pricing\");\n    else url.searchParams.set(\"pricing\", pricingSlug);\n    url.hash = \"\";\n    window.history.replaceState(window.history.state || {}, \"\", url.pathname + url.search);\n  }\n\n  function openOverlay(name, trigger) {\n    var overlay = overlayFor(name);\n    if (!overlay) return;\n    if (activeOverlay && activeOverlay !== overlay) closeOverlay(activeOverlay);\n\n    lastTrigger = trigger || document.activeElement;\n    returnUrl = window.location.href;\n    if (name === \"pricing\") setPricingRoute();\n\n    activeOverlay = overlay;\n    overlay.classList.add(\"is-open\");\n    overlay.setAttribute(\"aria-hidden\", \"false\");\n    document.body.classList.add(\"drsknn-tv3-modal-open\");\n    var dialog = q('[role=\"dialog\"]', overlay);\n    if (dialog) dialog.focus({ preventScroll: true });\n\n    if (name === \"pricing\") {\n      hydratePricing().then(function (loaded) {\n        if (!loaded) return;\n        bindNestedPricingIsolation();\n        window.dispatchEvent(new PopStateEvent(\"popstate\", { state: window.history.state || {} }));\n      });\n    }\n    if (name === \"direct-booking\") {\n      resetDirectBookingPicker();\n      window.requestAnimationFrame(function () {\n        var search = q(\"[data-tv3-direct-search]\", overlay);\n        if (search) search.focus({ preventScroll: true });\n      });\n    }\n  }\n\n  function openDetail(trigger) {\n    if (!trigger) return;\n    var overlay = overlayFor(\"detail\");\n    if (!overlay) return;\n    var eyebrow = q(\"[data-tv3-detail-dialog-eyebrow]\", overlay);\n    var title = q(\"[data-tv3-detail-dialog-title]\", overlay);\n    var copy = q(\"[data-tv3-detail-dialog-copy]\", overlay);\n    if (eyebrow) eyebrow.textContent = trigger.getAttribute(\"data-tv3-detail-eyebrow\") || \"More information\";\n    if (title) title.textContent = trigger.getAttribute(\"data-tv3-detail-title\") || \"Clinical planning\";\n    if (copy) copy.textContent = trigger.getAttribute(\"data-tv3-detail-copy\") || \"Your clinician will explain this during consultation.\";\n    openOverlay(\"detail\", trigger);\n  }\n\n  function resultSlides() {\n    return qa(\"[data-tv3-carousel-slide]\", root);\n  }\n\n  function resultCanvas() {\n    return q(\"[data-tv3-result-canvas]\", overlayFor(\"results\"));\n  }\n\n  function setResultZoom(target, keepCentre) {\n    var overlay = overlayFor(\"results\");\n    var canvas = resultCanvas();\n    if (!overlay || !canvas) return;\n    var oldWidth = canvas.scrollWidth || canvas.clientWidth || 1;\n    var oldHeight = canvas.scrollHeight || canvas.clientHeight || 1;\n    var centreX = (canvas.scrollLeft + canvas.clientWidth / 2) / oldWidth;\n    var centreY = (canvas.scrollTop + canvas.clientHeight / 2) / oldHeight;\n    var positionToken = ++zoomPositionToken;\n    resultZoom = Math.max(1, Math.min(3, Math.round(target * 2) / 2));\n    canvas.style.setProperty(\"--tv3-result-zoom\", String(resultZoom));\n    canvas.classList.toggle(\"is-zoomed\", resultZoom > 1);\n    canvas.setAttribute(\"aria-label\", \"Enlarged result at \" + Math.round(resultZoom * 100) + \" percent. Use the zoom controls, scroll to pan, or press Enter to reset.\");\n    var label = q(\"[data-tv3-result-zoom-label]\", overlay);\n    var out = q(\"[data-tv3-result-zoom-out]\", overlay);\n    var inside = q(\"[data-tv3-result-zoom-in]\", overlay);\n    var reset = q(\"[data-tv3-result-zoom-reset]\", overlay);\n    var helpTitle = q(\"[data-tv3-result-help-title]\", overlay);\n    var helpCopy = q(\"[data-tv3-result-help-copy]\", overlay);\n    if (label) label.textContent = Math.round(resultZoom * 100) + \"%\";\n    if (out) out.disabled = resultZoom <= 1;\n    if (inside) inside.disabled = resultZoom >= 3;\n    if (reset) {\n      reset.disabled = resultZoom <= 1;\n      reset.hidden = resultZoom <= 1;\n    }\n    if (helpTitle) helpTitle.textContent = resultZoom > 1 ? \"Drag to explore\" : \"Tap image to zoom\";\n    if (helpCopy) helpCopy.textContent = resultZoom > 1 ? \"Choose Reset to see the full result.\" : \"Or use the Zoom controls below.\";\n    function positionZoomedResult() {\n      if (positionToken !== zoomPositionToken) return;\n      if (resultZoom <= 1) {\n        canvas.scrollLeft = 0;\n        canvas.scrollTop = 0;\n        return;\n      }\n      var targetX = keepCentre ? centreX : .5;\n      var targetY = keepCentre ? centreY : .5;\n      canvas.scrollLeft = Math.max(0, targetX * canvas.scrollWidth - canvas.clientWidth / 2);\n      canvas.scrollTop = Math.max(0, targetY * canvas.scrollHeight - canvas.clientHeight / 2);\n    }\n    window.requestAnimationFrame(positionZoomedResult);\n    window.setTimeout(positionZoomedResult, 210);\n  }\n\n  function initResultZoomPan() {\n    var canvas = resultCanvas();\n    if (!canvas) return;\n    canvas.addEventListener(\"keydown\", function (event) {\n      if (event.key === \"Enter\" || event.key === \" \") {\n        event.preventDefault();\n        setResultZoom(resultZoom > 1 ? 1 : 2, true);\n      } else if (event.key === \"+\" || event.key === \"=\") {\n        event.preventDefault();\n        setResultZoom(resultZoom + .5, true);\n      } else if (event.key === \"-\") {\n        event.preventDefault();\n        setResultZoom(resultZoom - .5, true);\n      } else if (event.key === \"0\") {\n        event.preventDefault();\n        setResultZoom(1, false);\n      }\n    });\n    canvas.addEventListener(\"pointerdown\", function (event) {\n      if (resultZoom <= 1 || event.pointerType !== \"mouse\" || event.button !== 0) return;\n      zoomDrag = { id: event.pointerId, x: event.clientX, y: event.clientY, left: canvas.scrollLeft, top: canvas.scrollTop };\n      zoomDragMoved = false;\n      canvas.classList.add(\"is-dragging\");\n      canvas.setPointerCapture(event.pointerId);\n    });\n    canvas.addEventListener(\"pointermove\", function (event) {\n      if (!zoomDrag || zoomDrag.id !== event.pointerId) return;\n      var deltaX = event.clientX - zoomDrag.x;\n      var deltaY = event.clientY - zoomDrag.y;\n      if (Math.abs(deltaX) > 3 || Math.abs(deltaY) > 3) zoomDragMoved = true;\n      canvas.scrollLeft = zoomDrag.left - deltaX;\n      canvas.scrollTop = zoomDrag.top - deltaY;\n      event.preventDefault();\n    });\n    function endZoomDrag(event) {\n      if (!zoomDrag || zoomDrag.id !== event.pointerId) return;\n      canvas.classList.remove(\"is-dragging\");\n      if (canvas.hasPointerCapture(event.pointerId)) canvas.releasePointerCapture(event.pointerId);\n      zoomDrag = null;\n    }\n    canvas.addEventListener(\"pointerup\", endZoomDrag);\n    canvas.addEventListener(\"pointercancel\", endZoomDrag);\n  }\n\n  function updateResultViewer(target) {\n    var slides = resultSlides();\n    var overlay = overlayFor(\"results\");\n    if (!slides.length || !overlay) return false;\n    resultIndex = ((target % slides.length) + slides.length) % slides.length;\n    var source = q(\"img\", slides[resultIndex]);\n    var caption = q(\"figcaption\", slides[resultIndex]);\n    var image = q(\"[data-tv3-result-image]\", overlay);\n    var current = q(\"[data-tv3-result-current]\", overlay);\n    var viewerCaption = q(\"[data-tv3-result-caption]\", overlay);\n    if (!source || !image) return false;\n    image.src = source.currentSrc || source.src;\n    image.alt = source.alt || \"Dr Sknn before and after result\";\n    if (current) current.textContent = String(resultIndex + 1);\n    if (viewerCaption) viewerCaption.textContent = caption ? caption.textContent.replace(/^\\s*\\d+\\s*/, \"\") : \"Current Before & After Studio result\";\n    return true;\n  }\n\n  function openResult(target, trigger) {\n    if (!updateResultViewer(target)) return;\n    setResultZoom(1, false);\n    openOverlay(\"results\", trigger);\n  }\n\n  function moveResult(delta) {\n    if (updateResultViewer(resultIndex + delta)) setResultZoom(1, false);\n  }\n\n  function loadScript(src, marker) {\n    if (!src) return Promise.resolve(false);\n    var existing = document.querySelector('script[data-tv3-lazy-script=\"' + marker + '\"]');\n    if (existing) return Promise.resolve(true);\n    return new Promise(function (resolve) {\n      var script = document.createElement(\"script\");\n      script.src = src;\n      script.async = true;\n      script.dataset.tv3LazyScript = marker;\n      script.onload = function () { resolve(true); };\n      script.onerror = function () { resolve(false); };\n      document.head.appendChild(script);\n    });\n  }\n\n  function activateTemplateScripts(container) {\n    return qa(\"script\", container).reduce(function (chain, oldScript, index) {\n      return chain.then(function () {\n        return new Promise(function (resolve) {\n          var script = document.createElement(\"script\");\n          Array.prototype.slice.call(oldScript.attributes).forEach(function (attribute) {\n            script.setAttribute(attribute.name, attribute.value);\n          });\n          script.dataset.tv3HydratedScript = String(index + 1);\n          if (oldScript.src) {\n            script.onload = function () { resolve(true); };\n            script.onerror = function () { resolve(false); };\n          } else {\n            script.textContent = oldScript.textContent;\n          }\n          oldScript.replaceWith(script);\n          if (!oldScript.src) resolve(true);\n        });\n      });\n    }, Promise.resolve());\n  }\n\n  function hydratePricing() {\n    if (pricingPromise) return pricingPromise;\n    var pricing = q(\"[data-drsknn-pricing-v3-embedded]\", root);\n    var source = q(\"[data-drsknn-pricing-v3-source]\", root);\n    if (!pricing || !source) return Promise.resolve(false);\n    var controllerSrc = pricing.getAttribute(\"data-pricing-v3-script-src\") || \"\";\n    var sourceUrl = pricing.getAttribute(\"data-pricing-v3-source-url\") || \"\";\n\n    pricing.dataset.tv3Loading = \"true\";\n    pricingPromise = Promise.resolve().then(function () {\n      if (source.firstElementChild) return true;\n      return fetch(sourceUrl, { credentials: \"same-origin\", cache: \"no-cache\" })\n        .then(function (response) {\n          if (!response.ok) throw new Error(\"Pricing source unavailable\");\n          return response.text();\n        }).then(function (html) {\n          var parsed = new window.DOMParser().parseFromString(html, \"text/html\");\n          var remoteSource = parsed.querySelector(\"[data-drsknn-pricing-v3-source]\");\n          if (!remoteSource) throw new Error(\"Pricing source missing\");\n          source.innerHTML = remoteSource.innerHTML;\n          return true;\n        });\n    }).then(function () {\n      return activateTemplateScripts(source);\n    }).then(function () {\n      if (pricing.dataset.pricingV3Ready === \"true\") return true;\n      return loadScript(controllerSrc, \"pricing-v3\");\n    }).then(function (loaded) {\n      pricing.dataset.tv3Loading = \"false\";\n      pricing.dataset.tv3Loaded = loaded ? \"true\" : \"failed\";\n      return loaded;\n    }).catch(function () {\n      pricing.dataset.tv3Loading = \"false\";\n      pricing.dataset.tv3Loaded = \"failed\";\n      var areaGrid = q(\"[data-pv3-area-grid]\", pricing);\n      if (areaGrid) areaGrid.innerHTML = '<p class=\"drsknn-pricing-v3__loading\" role=\"status\">Prices could not load. <a href=\"/pages/dr-sknn-pricing-v3-preview\">Open the full price list</a>.</p>';\n      return false;\n    });\n    return pricingPromise;\n  }\n\n  var tv3ParentBridge = null;\n  function ensureTv3ParentBridge(frame) {\n    var api = window.DRSKNN_BOOKING_PARENT_BRIDGE;\n    if (!api || !frame) return null;\n    if (!tv3ParentBridge) tv3ParentBridge = api.register(frame, { completionOwner: true });\n    return tv3ParentBridge;\n  }\n  window.addEventListener(\"drsknn:booking-parent-bridge-ready\", function () {\n    var frame = q(\"[data-tv3-booking-frame]\", root);\n    if (frame && frame.getAttribute(\"src\")) {\n      var bridge = ensureTv3ParentBridge(frame);\n      if (bridge) bridge.sendPrivacy();\n    }\n  });\n\n  function bookingUrl(role) {\n    if ([\"doctor\", \"nurse\", \"practitioner\"].indexOf(role) === -1) role = \"doctor\";\n    var url = new URL(\"https://www.drsknn.uk/kiosk/v4/consultation/\" + encodeURIComponent(role));\n    var landingSource = root.dataset.landingSource || root.dataset.treatmentHandle || \"treatment_v3\";\n    var params = {\n      source: \"treatment_v3\",\n      landing_source: landingSource,\n      embed: \"1\",\n      embedded: \"1\",\n      booking_embed: \"treatment_v3_modal\",\n      hide_cookie_banner: \"1\",\n      hide_cookie_notice: \"1\",\n      hide_iubenda: \"1\",\n      skip_cookie_policy: \"1\",\n      parent_domain: window.location.hostname === \"www.drsknn.com\" ? \"www.drsknn.com\" : \"drsknn.com\",\n      website_cookie_consent_status: \"handled_on_parent_site\",\n      website_cookie_consent_ref: \"drsknn_com_v5_iubenda\",\n      booking_return: \"v5_completion_v2\",\n      return_url: window.location.hostname === \"www.drsknn.com\" ? \"https://www.drsknn.com/\" : \"https://drsknn.com/\"\n    };\n    Object.keys(params).forEach(function (key) { url.searchParams.set(key, params[key]); });\n    return url.toString();\n  }\n\n  function openBooking(role) {\n    var chooser = q(\"[data-tv3-consultation-chooser]\", root);\n    var booking = q(\"[data-tv3-booking]\", root);\n    var frame = q(\"[data-tv3-booking-frame]\", root);\n    if (!booking || !frame) return;\n    if (chooser) chooser.hidden = true;\n    booking.hidden = false;\n    ensureTv3ParentBridge(frame);\n    frame.setAttribute(\"referrerpolicy\", \"no-referrer\");\n    frame.src = bookingUrl(role);\n  }\n\n  window.DrSknnTreatmentV3OpenBooking = openBooking;\n  function bindContainedPageLinks() {\n    qa('a[href*=\"/pages/dr-sknn-home-v2-preview?open=consultation\"], a[href*=\"/pages/dr-sknn-home-v2-preview?price_route=\"]').forEach(function (link) {\n      if (root.contains(link) || link.dataset.tv3ContainedBound === \"true\") return;\n      link.dataset.tv3ContainedBound = \"true\";\n      link.addEventListener(\"click\", function (event) {\n        var href = link.getAttribute(\"href\") || \"\";\n        var action = href.indexOf(\"open=consultation\") !== -1 ? \"consultation\" : \"pricing\";\n        event.preventDefault();\n        event.stopPropagation();\n        event.stopImmediatePropagation();\n        openOverlay(action, link);\n      }, true);\n    });\n  }\n\n  function initTreatmentReviews() {\n    if (preserveOriginBehaviour) return;\n    var section = q(\"[data-tv3-reviews]\", root);\n    if (!section || section.dataset.tv3ReviewsReady === \"true\") return;\n    section.dataset.tv3ReviewsReady = \"true\";\n\n    var track = q(\"[data-tv3-reviews-track]\", section);\n    var status = q(\"[data-tv3-reviews-status]\", section);\n    var previous = q(\"[data-tv3-reviews-prev]\", section);\n    var next = q(\"[data-tv3-reviews-next]\", section);\n    var googleSummary = q(\"[data-tv3-review-google-summary]\", section);\n    var pabauSummary = q(\"[data-tv3-review-pabau-summary]\", section);\n    var googleLink = q(\"[data-tv3-review-google-link]\", section);\n    var filterButtons = qa(\"[data-tv3-review-filter]\", section);\n    if (!track || !status) return;\n\n    var state = {\n      loaded: false,\n      loading: false,\n      filter: \"featured\",\n      google: [],\n      pabau: [],\n      googleRating: 0,\n      googleCount: 0,\n      pabauCount: 0\n    };\n    var matchStopWords = [\n      \"about\", \"and\", \"area\", \"areas\", \"cheshire\", \"clinic\", \"consultation\", \"doctor\", \"dr\",\n      \"for\", \"from\", \"guide\", \"medical\", \"option\", \"options\", \"result\", \"results\", \"service\",\n      \"skin\", \"sknn\", \"the\", \"therapy\", \"treatment\", \"treatments\", \"wilmslow\", \"with\"\n    ];\n    var broadSingleTerms = [\n      \"ageing\", \"aging\", \"anti\", \"area\", \"body\", \"face\", \"facial\", \"filler\", \"hair\", \"injection\",\n      \"ipl\", \"laser\", \"led\", \"line\", \"remove\", \"rejuvenation\", \"scalp\", \"skin\"\n    ];\n    var treatmentLexicon = [\n      \"acne treatment\", \"anti ageing\", \"anti aging\", \"anti wrinkle\", \"botox\", \"chemical peel\",\n      \"co2\", \"dermal filler\", \"dermalux\", \"exosome\", \"filler\", \"hair reduction\", \"hair removal\",\n      \"hifu\", \"hydrafacial\", \"hydrofacial\", \"ipl\", \"laser\", \"led\", \"mh10\", \"microneedling\",\n      \"nctf\", \"onda\", \"polynucleotide\", \"prp\", \"profhilo\", \"rosacea treatment\", \"skin booster\",\n      \"thread lift\"\n    ];\n\n    function cleanReviewValue(value, limit) {\n      var text = value == null ? \"\" : String(value);\n      text = text.replace(/[\\r\\n\\t]+/g, \" \").replace(/\\s+/g, \" \").trim();\n      return limit ? text.slice(0, limit) : text;\n    }\n\n    function normaliseReviewValue(value) {\n      return cleanReviewValue(value).toLowerCase().replace(/&/g, \" and \").replace(/[_-]+/g, \" \").replace(/[^a-z0-9 ]+/g, \" \").replace(/\\s+/g, \" \").trim();\n    }\n\n    function uniqueReviewValues(values) {\n      var seen = {};\n      return values.filter(function (value) {\n        if (!value || seen[value]) return false;\n        seen[value] = true;\n        return true;\n      });\n    }\n\n    function reviewTagValues(tags) {\n      if (!tags || typeof tags !== \"object\") return [];\n      var values = [];\n      [\"area_ids\", \"areas\", \"category_ids\", \"categories\", \"concern_ids\", \"concerns\"].forEach(function (key) {\n        var current = tags[key];\n        if (Array.isArray(current)) values = values.concat(current);\n        else if (typeof current === \"string\") values = values.concat(current.split(\",\"));\n      });\n      return values.map(normaliseReviewValue).filter(Boolean);\n    }\n\n    function canonicalReviewToken(value) {\n      var token = normaliseReviewValue(value);\n      var aliases = {\n        reductions: \"remove\", reduction: \"remove\", removal: \"remove\", removed: \"remove\",\n        wrinkles: \"wrinkle\", injections: \"injection\", fillers: \"filler\",\n        pigments: \"pigment\", pigmentation: \"pigment\", cheeks: \"cheek\",\n        exosomes: \"exosome\", polynucleotides: \"polynucleotide\"\n      };\n      return aliases[token] || token;\n    }\n\n    function reviewTokens(value) {\n      return uniqueReviewValues(normaliseReviewValue(value).split(\" \").map(canonicalReviewToken).filter(function (word) {\n        return word.length >= 3 && matchStopWords.indexOf(word) === -1;\n      }));\n    }\n\n    var reviewKeywordGroups = (section.getAttribute(\"data-review-keywords\") || \"\").split(\"|\").map(function (value) {\n      var phrase = normaliseReviewValue(value);\n      return { phrase: phrase, tokens: reviewTokens(phrase) };\n    }).filter(function (group) {\n      return group.phrase && group.tokens.length;\n    });\n\n    function reviewMatchScore(review) {\n      var service = normaliseReviewValue(review.service);\n      if (!service) return 0;\n      var serviceWords = reviewTokens(service);\n      var serviceSet = {};\n      serviceWords.forEach(function (word) { serviceSet[word] = true; });\n      var paddedService = \" \" + service + \" \";\n      return reviewKeywordGroups.reduce(function (best, group) {\n        if (group.tokens.length >= 2 && paddedService.indexOf(\" \" + group.phrase + \" \") !== -1) {\n          return Math.max(best, 12 + group.tokens.length);\n        }\n        var overlap = group.tokens.reduce(function (count, word) {\n          return count + (serviceSet[word] ? 1 : 0);\n        }, 0);\n        if (group.tokens.length === 1) {\n          if (broadSingleTerms.indexOf(group.tokens[0]) !== -1) return best;\n          return overlap === 1 ? Math.max(best, 6) : best;\n        }\n        var required = Math.max(2, Math.ceil(group.tokens.length * .66));\n        return overlap >= required ? Math.max(best, overlap * 3) : best;\n      }, 0);\n    }\n\n    function isGenericClinicReview(review) {\n      var text = normaliseReviewValue([review.text, review.service, review.category].join(\" \"));\n      if (!text) return false;\n      var padded = \" \" + text + \" \";\n      return !treatmentLexicon.some(function (term) {\n        return padded.indexOf(\" \" + term + \" \") !== -1;\n      });\n    }\n\n    function normaliseGoogleReview(review, index) {\n      return {\n        id: cleanReviewValue(review && (review.id || review.review_id || review.reviewId || review.time || (\"google-\" + index)), 120),\n        source: \"google\",\n        author: cleanReviewValue(review && (review.author_name || review.author || review.reviewer) || \"Google reviewer\", 70),\n        rating: Math.max(1, Math.min(5, Math.round(Number(review && review.rating || 5)))),\n        text: cleanReviewValue(review && (review.text || review.comment), 1600),\n        date: cleanReviewValue(review && (review.date || review.relative_time_description || review.update_time || review.time), 80),\n        service: \"\",\n        category: \"\",\n        tags: reviewTagValues(review && review.tags)\n      };\n    }\n\n    function normalisePabauReview(review, index) {\n      return {\n        id: cleanReviewValue(review && (review.id || review.review_id) || (\"pabau-\" + index), 120),\n        source: \"pabau\",\n        author: \"Verified patient\",\n        rating: Math.max(1, Math.min(5, Math.round(Number(review && review.rating || 5)))),\n        text: cleanReviewValue(review && (review.text || review.feedback), 1600),\n        date: cleanReviewValue(review && review.date, 80),\n        service: cleanReviewValue(review && review.service, 120),\n        category: cleanReviewValue(review && review.category, 120),\n        tags: reviewTagValues(review && review.tags)\n      };\n    }\n\n    function fetchReviewJson(url, timeout) {\n      if (!url) return Promise.reject(new Error(\"Review endpoint unavailable\"));\n      var controller = typeof window.AbortController === \"function\" ? new window.AbortController() : null;\n      var timer = window.setTimeout(function () { if (controller) controller.abort(); }, timeout || 9000);\n      return fetch(url, {\n        mode: \"cors\",\n        credentials: \"omit\",\n        signal: controller ? controller.signal : undefined\n      }).then(function (response) {\n        window.clearTimeout(timer);\n        if (!response.ok) throw new Error(\"Review endpoint failed\");\n        return response.json();\n      }, function (error) {\n        window.clearTimeout(timer);\n        throw error;\n      });\n    }\n\n    function fetchGoogleReviews() {\n      var primary = section.getAttribute(\"data-google-reviews-url\") || \"\";\n      var fallback = section.getAttribute(\"data-google-reviews-fallback-url\") || \"\";\n      return fetchReviewJson(primary, 20000).catch(function () { return fetchReviewJson(fallback, 20000); });\n    }\n\n    function rankedSafeReviews(reviews) {\n      return reviews.map(function (review, index) {\n        return { review: review, index: index, score: reviewMatchScore(review) };\n      }).filter(function (item) {\n        return item.review.text && (item.score > 0 || isGenericClinicReview(item.review));\n      }).sort(function (left, right) {\n        return right.score - left.score || right.review.rating - left.review.rating || left.index - right.index;\n      });\n    }\n\n    function uniqueReviewItems(items) {\n      var seen = {};\n      return items.filter(function (item) {\n        var key = item.review.source + \"-\" + item.review.id;\n        if (seen[key]) return false;\n        seen[key] = true;\n        return true;\n      });\n    }\n\n    function selectedReviews() {\n      var google = rankedSafeReviews(state.google);\n      var pabau = rankedSafeReviews(state.pabau);\n      if (state.filter === \"google\") return google.slice(0, 3);\n      if (state.filter === \"pabau\") return pabau.slice(0, 3);\n\n      var matchedPabau = pabau.filter(function (item) { return item.score > 0; });\n      var matchedGoogle = google.filter(function (item) { return item.score > 0; });\n      var generalPabau = pabau.filter(function (item) { return item.score === 0; });\n      var generalGoogle = google.filter(function (item) { return item.score === 0; });\n      var featured = [];\n      if (matchedPabau[0]) featured.push(matchedPabau[0]);\n      else if (generalPabau[0]) featured.push(generalPabau[0]);\n      if (matchedGoogle[0]) featured.push(matchedGoogle[0]);\n      else if (generalGoogle[0]) featured.push(generalGoogle[0]);\n      if (matchedPabau[1]) featured.push(matchedPabau[1]);\n      else if (generalPabau[1]) featured.push(generalPabau[1]);\n      return uniqueReviewItems(featured.concat(matchedPabau, matchedGoogle, generalPabau, generalGoogle)).slice(0, 3);\n    }\n\n    function appendTextElement(parent, tag, className, text) {\n      var element = document.createElement(tag);\n      if (className) element.className = className;\n      element.textContent = text;\n      parent.appendChild(element);\n      return element;\n    }\n\n    function reviewCard(item) {\n      var review = item.review;\n      var matched = item.score > 0;\n      var card = document.createElement(\"article\");\n      card.className = \"drsknn-treatment-v3__review-card\";\n      card.setAttribute(\"data-tv3-review-card\", \"\");\n\n      var source = document.createElement(\"div\");\n      source.className = \"drsknn-treatment-v3__review-card-source\";\n      appendTextElement(source, \"span\", \"\", review.source === \"pabau\" ? \"Pabau \u00B7 verified appointment\" : \"Google \u00B7 public review\");\n      var stars = appendTextElement(source, \"b\", \"\", new Array(review.rating + 1).join(\"\u2605\") + new Array(6 - review.rating).join(\"\u2606\"));\n      stars.setAttribute(\"aria-label\", review.rating + \" out of 5 stars\");\n      card.appendChild(source);\n\n      appendTextElement(card, \"h3\", \"\", matched && review.service ? review.service : (matched ? \"Relevant patient feedback\" : \"General clinic experience\"));\n      var quote = document.createElement(\"blockquote\");\n      appendTextElement(quote, \"p\", \"\", review.text);\n      card.appendChild(quote);\n\n      if (review.text.length > 260) {\n        var expand = appendTextElement(card, \"button\", \"drsknn-treatment-v3__review-expand\", \"Read full review\");\n        expand.type = \"button\";\n        expand.setAttribute(\"aria-expanded\", \"false\");\n        expand.addEventListener(\"click\", function () {\n          var expanded = card.classList.toggle(\"is-expanded\");\n          expand.setAttribute(\"aria-expanded\", expanded ? \"true\" : \"false\");\n          expand.textContent = expanded ? \"Show less\" : \"Read full review\";\n        });\n      }\n\n      var footer = document.createElement(\"footer\");\n      appendTextElement(footer, \"strong\", \"\", review.author);\n      appendTextElement(footer, \"span\", \"\", matched ? (review.service || \"Review linked to this treatment route\") : \"Clinic-wide patient feedback\");\n      card.appendChild(footer);\n      return card;\n    }\n\n    function updateReviewArrows() {\n      if (!previous || !next) return;\n      var maximum = Math.max(0, track.scrollWidth - track.clientWidth);\n      var overflow = maximum > 3;\n      previous.hidden = !overflow;\n      next.hidden = !overflow;\n      previous.disabled = !overflow || track.scrollLeft <= 3;\n      next.disabled = !overflow || track.scrollLeft >= maximum - 3;\n    }\n\n    function renderReviews() {\n      var items = selectedReviews();\n      track.replaceChildren();\n      if (!items.length) {\n        appendTextElement(track, \"div\", \"drsknn-treatment-v3__reviews-empty\", \"Current review text is temporarily unavailable. Use the Google and Pabau source links above to read patient feedback.\");\n      } else {\n        items.forEach(function (item) { track.appendChild(reviewCard(item)); });\n      }\n      track.scrollLeft = 0;\n      filterButtons.forEach(function (button) {\n        button.setAttribute(\"aria-pressed\", button.getAttribute(\"data-tv3-review-filter\") === state.filter ? \"true\" : \"false\");\n      });\n      var available = state.google.length + state.pabau.length;\n      status.textContent = available\n        ? \"Showing \" + items.length + \" patient reviews. Treatment-linked feedback is prioritised where the source supports it.\"\n        : \"Use the Google and Pabau links to read current patient feedback.\";\n      window.requestAnimationFrame(updateReviewArrows);\n    }\n\n    function applyGooglePayload(payload) {\n      var place = payload && payload.place || {};\n      var reviews = Array.isArray(payload && payload.reviews) ? payload.reviews : (Array.isArray(place.reviews) ? place.reviews : []);\n      state.google = reviews.map(normaliseGoogleReview).filter(function (review) { return !!review.text; });\n      state.googleRating = Number(payload && payload.average_rating || place.rating || 0);\n      state.googleCount = Number(payload && (payload.rating_count || payload.totalReviewCount) || place.user_rating_count || place.userRatingCount || state.google.length || 0);\n      var destination = cleanReviewValue(place.url || place.googleMapsUri, 1200);\n      if (googleLink && /^https:\\/\\//i.test(destination)) googleLink.href = destination;\n    }\n\n    function applyPabauPayload(payload) {\n      var reviews = Array.isArray(payload && payload.reviews) ? payload.reviews : [];\n      state.pabau = reviews.map(normalisePabauReview).filter(function (review) { return !!review.text; });\n      state.pabauCount = Number(payload && (payload.total || payload.total_count || payload.totalCount) || state.pabau.length || 0);\n    }\n\n    function updateReviewSummaries() {\n      if (googleSummary) {\n        var rating = state.googleRating ? state.googleRating.toFixed(1) + \" from \" : \"\";\n        googleSummary.textContent = state.googleCount ? rating + state.googleCount + \" public ratings\" : \"Public patient reviews\";\n      }\n      if (pabauSummary) pabauSummary.textContent = state.pabauCount ? state.pabauCount + \" verified reviews\" : \"Verified appointment feedback\";\n    }\n\n    function loadReviews() {\n      if (state.loading || state.loaded) return;\n      state.loading = true;\n      status.textContent = \"Loading current patient reviews\u2026\";\n      Promise.all([\n        fetchGoogleReviews().then(applyGooglePayload).catch(function () {}),\n        fetchReviewJson(section.getAttribute(\"data-pabau-reviews-url\") || \"\", 20000).then(applyPabauPayload).catch(function () {})\n      ]).then(function () {\n        state.loading = false;\n        state.loaded = true;\n        updateReviewSummaries();\n        renderReviews();\n      });\n    }\n\n    filterButtons.forEach(function (button) {\n      button.addEventListener(\"click\", function () {\n        state.filter = button.getAttribute(\"data-tv3-review-filter\") || \"featured\";\n        if (!state.loaded) loadReviews();\n        else renderReviews();\n      });\n    });\n    if (previous) previous.addEventListener(\"click\", function () { track.scrollBy({ left: -Math.max(240, track.clientWidth * .88), behavior: \"smooth\" }); });\n    if (next) next.addEventListener(\"click\", function () { track.scrollBy({ left: Math.max(240, track.clientWidth * .88), behavior: \"smooth\" }); });\n    track.addEventListener(\"scroll\", updateReviewArrows, { passive: true });\n    track.addEventListener(\"keydown\", function (event) {\n      if (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\") return;\n      event.preventDefault();\n      track.scrollBy({ left: (event.key === \"ArrowRight\" ? 1 : -1) * Math.max(240, track.clientWidth * .88), behavior: \"smooth\" });\n    });\n    window.addEventListener(\"resize\", updateReviewArrows, { passive: true });\n\n    if (typeof window.IntersectionObserver === \"function\") {\n      var observer = new window.IntersectionObserver(function (entries) {\n        if (!entries.some(function (entry) { return entry.isIntersecting; })) return;\n        observer.disconnect();\n        loadReviews();\n      }, { rootMargin: \"600px 0px\" });\n      observer.observe(section);\n    } else {\n      window.setTimeout(loadReviews, 500);\n    }\n  }\n\n  bindContainedPageLinks();\n  window.setTimeout(bindContainedPageLinks, 1000);\n  window.setTimeout(bindContainedPageLinks, 5000);\n\n  root.addEventListener(\"click\", function (event) {\n    var directConsultation = event.target.closest(\"[data-tv3-direct-consultation]\");\n    if (directConsultation) {\n      event.preventDefault();\n      event.stopPropagation();\n      event.stopImmediatePropagation();\n      openOverlay(\"consultation\", directConsultation);\n      return;\n    }\n    var resultTrigger = event.target.closest(\"[data-tv3-open-result]\");\n    if (resultTrigger) {\n      event.preventDefault();\n      event.stopPropagation();\n      event.stopImmediatePropagation();\n      openResult(Number(resultTrigger.getAttribute(\"data-tv3-open-result\")) || 0, resultTrigger);\n      return;\n    }\n    var detailTrigger = event.target.closest(\"[data-tv3-detail]\");\n    if (detailTrigger) {\n      event.preventDefault();\n      event.stopPropagation();\n      event.stopImmediatePropagation();\n      openDetail(detailTrigger);\n      return;\n    }\n    var zoomSurface = event.target.closest(\"[data-tv3-result-canvas]\");\n    if (zoomSurface) {\n      event.preventDefault();\n      event.stopPropagation();\n      if (zoomDragMoved) {\n        zoomDragMoved = false;\n        return;\n      }\n      setResultZoom(resultZoom > 1 ? 1 : 2, true);\n      return;\n    }\n    var zoomOut = event.target.closest(\"[data-tv3-result-zoom-out]\");\n    if (zoomOut) {\n      event.preventDefault();\n      event.stopPropagation();\n      setResultZoom(resultZoom - .5, true);\n      return;\n    }\n    var zoomIn = event.target.closest(\"[data-tv3-result-zoom-in]\");\n    if (zoomIn) {\n      event.preventDefault();\n      event.stopPropagation();\n      setResultZoom(resultZoom + .5, true);\n      return;\n    }\n    var zoomReset = event.target.closest(\"[data-tv3-result-zoom-reset]\");\n    if (zoomReset) {\n      event.preventDefault();\n      event.stopPropagation();\n      setResultZoom(1, false);\n      return;\n    }\n    var resultPrev = event.target.closest(\"[data-tv3-result-prev]\");\n    if (resultPrev) {\n      event.preventDefault();\n      event.stopPropagation();\n      moveResult(-1);\n      return;\n    }\n    var resultNext = event.target.closest(\"[data-tv3-result-next]\");\n    if (resultNext) {\n      event.preventDefault();\n      event.stopPropagation();\n      moveResult(1);\n      return;\n    }\n    var containedTrigger = event.target.closest(\"[data-tv3-open]\");\n    if (containedTrigger) {\n      event.preventDefault();\n      event.stopPropagation();\n      event.stopImmediatePropagation();\n      openOverlay(containedTrigger.getAttribute(\"data-tv3-open\"), containedTrigger);\n      return;\n    }\n    var roleLink = event.target.closest(\"[data-tv3-book-role]\");\n    if (roleLink) {\n      event.preventDefault();\n      event.stopPropagation();\n      event.stopImmediatePropagation();\n      openBooking(roleLink.getAttribute(\"data-tv3-book-role\") || \"doctor\");\n    }\n  }, true);\n\n  document.addEventListener(\"click\", function (event) {\n    var exactClose = event.target.closest(\"[data-pricing-close-modal], [data-pv3-guide-close]\");\n    var pricingOverlay = overlayFor(\"pricing\");\n    // Pricing V3 marks its synthetic close click when moving from an exact-price\n    // card back to \"All treatments\" or \"Back to matches\". Keep the containing\n    // pricing journey open only for that internal navigation.\n    var preservePricingOverlay = exactClose && exactClose.getAttribute(\"data-pv3-preserve-pricing-overlay\") === \"true\";\n    if (exactClose && !preservePricingOverlay && pricingOverlay && pricingOverlay.classList.contains(\"is-open\") && !suppressPricingClose) {\n      window.setTimeout(function () { closeOverlay(pricingOverlay, { skipPricingClose: true }); }, 0);\n      return;\n    }\n\n    var close = event.target.closest(\"[data-tv3-close]\");\n    if (close) {\n      event.preventDefault();\n      closeOverlay(close.closest(\"[data-tv3-overlay]\"));\n      return;\n    }\n\n    var bookingBack = event.target.closest(\"[data-tv3-booking-back]\");\n    if (bookingBack) {\n      event.preventDefault();\n      resetConsultation();\n      return;\n    }\n\n    var role = event.target.closest(\"[data-tv3-book-role]\");\n    if (role) {\n      event.preventDefault();\n      openBooking(role.getAttribute(\"data-tv3-book-role\") || \"doctor\");\n      return;\n    }\n\n    var trigger = event.target.closest(\"[data-tv3-open], a[href]\");\n    if (!trigger) return;\n    var action = trigger.getAttribute(\"data-tv3-open\") || \"\";\n    var href = trigger.getAttribute(\"href\") || \"\";\n    if (!action && href.indexOf(\"dr-sknn-home-v2-preview?open=consultation\") !== -1) action = \"consultation\";\n    if (!action && href.indexOf(\"dr-sknn-home-v2-preview?price_route=\") !== -1) action = \"pricing\";\n    if (!action || (action !== \"consultation\" && action !== \"pricing\")) return;\n    event.preventDefault();\n    openOverlay(action, trigger);\n  });\n\n  qa(\"[data-tv3-overlay]\", root).forEach(function (overlay) {\n    overlay.addEventListener(\"click\", function (event) {\n      if (event.target === overlay) closeOverlay(overlay);\n    });\n  });\n\n  document.addEventListener(\"keydown\", function (event) {\n    // Pricing V3 owns focus, Escape and Tab while its exact-treatment dialog is open.\n    // The outer Treatment dialog is inert during that interval, so it must not trap\n    // the same keyboard event or close behind the nested dialog.\n    if (!preserveOriginBehaviour && nestedPricingIsOpen()) return;\n    if (event.key === \"Escape\" && activeOverlay) closeOverlay(activeOverlay);\n    if (event.key === \"Tab\" && activeOverlay) {\n      trapOverlayFocus(event);\n      return;\n    }\n    if (!activeOverlay || activeOverlay.getAttribute(\"data-tv3-overlay\") !== \"results\") return;\n    if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n      if (resultZoom > 1 && event.target.closest(\"[data-tv3-result-canvas]\")) return;\n      event.preventDefault();\n      moveResult(event.key === \"ArrowRight\" ? 1 : -1);\n    }\n  });\n\n  initJumpNavigation();\n  initProofFallback();\n  initCarousel();\n  initTreatmentVideos();\n  initTreatmentReviews();\n  initDirectBookingPicker();\n  initResultZoomPan();\n  initHeaderSearchBridge();\n})();\n"],
  "mappings": "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",
  "names": []
}
