{
  "version": 3,
  "sources": ["/cdn/shop/t/9/assets/glow-booking.js?b=4"],
  "sourcesContent": ["/*\n * WellnessLiving booking helpers, loaded on every page.\n *\n *  1. Book-click tracking: any link into WellnessLiving fires \"book_click\" (dataLayer, gtag, Shopify customer\n *     events, Meta pixel) and \"Clicked Book Now\" on the Klaviyo profile, with the service/category/provider the\n *     link opens and where on the site it was clicked (closest [data-wl-source], else the section).\n *  2. <wl-next-opening>: live \"Next opening\" times for a service, from sync.glowupmedspa.com/public/availability.\n *     data-service=\"<k_service>\", or data-follow=\"<selector>\" to read k_service from a Book link's href and\n *     follow it when the chosen option changes it. Hides itself when there's nothing to show.\n *  3. <wl-provider-book>: a \"Book with Erika\" button that opens a drawer of the services that provider takes\n *     online (sync.glowupmedspa.com/public/staff). data-staff=\"<k_staff>\" data-name=\"Erika\".\n *  4. <wl-packages data-ids=\"<k_id>,<k_id>\">: memberships/packages/unit banks with live prices, each linking to its\n *     WellnessLiving purchase page (sync.glowupmedspa.com/public/catalog). Re-renders when data-ids changes.\n *     Purchase-link clicks fire \"package_click\" / Klaviyo \"Clicked Buy Package\".\n *  6. <wl-addons data-follow=\"<selector>\">: the add-ons WellnessLiving offers with the Book link's service, with live\n *     prices (sync.glowupmedspa.com/public/addons). Add-ons are picked inside the booking widget, so rows aren't\n *     links. Follows the link's k_service like <wl-next-opening>; hides itself when the service has none.\n *\n *  5. Booking drawer: a plain click on any WellnessLiving appointment link opens WellnessLiving's own booking widget\n *     (widgets.wellnessliving.com, the frameable one) in a drawer on this site instead of leaving it. The service,\n *     category or provider in the link carries over (k_service / k_service_category / k_staff; k_staff narrows the\n *     list to that provider's services). Cmd/ctrl-clicks, target=_blank and [data-wl-direct] links still go to\n *     WellnessLiving. A completed booking fires \"booking_completed\" (dataLayer, gtag, Shopify, Meta \"Schedule\") and\n *     Klaviyo \"Booked Online (Website)\". Package/membership purchase links (/rs/catalog-view) open WellnessLiving's\n *     store widget on that item in the same drawer; a purchase fires \"package_purchased\" / Meta \"Purchase\" / Klaviyo\n *     \"Bought Package Online (Website)\". Picking a time (wl:checkout:begin) fires Klaviyo \"Started Booking\" once per\n *     drawer open (feeds the abandoned-booking flow); funnel steps go to dataLayer as booking_view_item /\n *     booking_checkout_begin, and closing the drawer after starting without booking fires \"booking_abandoned\".\n *     Styling: the widget's colors/fonts come from a WellnessLiving widget design (k_schema). A design overrides the\n *     link's service, so it's only used where window.GuBooking.schemas maps one: { default, categories: { <k_service_category>: k_schema } }.\n *\n * WellnessLiving links can't preselect a date or time (dt_date is ignored), so times are shown to help people\n * choose, and each one opens that service with that provider preselected.\n */\n(() => {\n  const API = 'https://sync.glowupmedspa.com/public';\n  const BOOK = 'https://www.wellnessliving.com/rs/appointment-start.html?id_class_tab=3&id_mode=1&k_business=743190';\n  const WL_LINK = 'a[href*=\"wellnessliving.com/rs/\"]';\n\n  const esc = (s) => String(s == null ? '' : s).replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\n  const bookUrl = (service, staff) => `${BOOK}&k_service=${encodeURIComponent(service)}${staff ? `&k_staff=${encodeURIComponent(staff)}` : ''}`;\n  const param = (href, name) => { try { return new URL(href, location.href).searchParams.get(name) || ''; } catch (e) { return ''; } };\n  // Glow Up's links: k_business=743190, or WellnessLiving's older /rs/appointment-new/glow_up_med_spa address (menu links)\n  const ours = (href) => param(href, 'k_business') === '743190' || /\\/rs\\/appointment-new\\/glow_up_med_spa\\b/.test(href);\n\n  // One request per URL per page view, shared by every element that asks.\n  const requests = new Map();\n  const getJSON = (url) => {\n    if (!requests.has(url)) {\n      requests.set(url, fetch(url, { credentials: 'omit' }).then((r) => (r.ok ? r.json() : null)).catch(() => null));\n    }\n    return requests.get(url);\n  };\n\n  /* ---------------------------------------------------------------- 1. Tracking */\n  const pageType = () => (document.body.className.match(/(?:template|page-type)-([\\w-]+)/) || [])[1] || location.pathname.split('/')[1] || 'home';\n\n  const trackBook = (link, isPurchase) => {\n    const href = link.href;\n    const src = link.closest('[data-wl-source]');\n    const section = link.closest('.shopify-section');\n    const data = {\n      wl_service: param(href, 'k_service'),\n      wl_category: param(href, 'k_service_category'),\n      wl_staff: param(href, 'k_staff'),\n      ...(isPurchase ? { wl_catalog_id: param(href, 'k_id'), item: link.dataset.wlItem || '' } : {}),\n      link_text: (link.textContent || '').replace(/\\s+/g, ' ').trim().slice(0, 60),\n      source: src ? src.dataset.wlSource : section ? section.id.replace(/^shopify-section-(template--\\d+__)?/, '') : 'page',\n      page_type: pageType(),\n      page_path: location.pathname\n    };\n    const name = isPurchase ? 'package_click' : 'book_click';\n    try { (window.dataLayer = window.dataLayer || []).push({ event: name, ...data }); } catch (e) {}\n    try { window.gtag && window.gtag('event', name, data); } catch (e) {}\n    try { window.Shopify && Shopify.analytics && Shopify.analytics.publish(name, data); } catch (e) {}\n    try { window.fbq && window.fbq('trackCustom', isPurchase ? 'PackageClick' : 'BookClick', data); } catch (e) {}\n    // Only lands on a profile Klaviyo already knows (an email click, the quiz, a signup), which is who flows can reach.\n    try { (window.klaviyo = window.klaviyo || []).push(['track', isPurchase ? 'Clicked Buy Package' : 'Clicked Book Now', { ...data, page_url: location.href }]); } catch (e) {}\n  };\n\n  // WellnessLiving's widgets keep the client's login in wellnessliving.com cookies, so the drawer only works where the\n  // browser allows third-party cookies; where it doesn't (iPhone browsers, Safari, Brave, Chrome incognito\u2026) login never\n  // sticks and the visitor is stuck at \"create a login\". Instead of guessing from the browser name, each visit asks:\n  // a hidden frame on another site (glowup-cookie-check.vercel.app, source in ../cookie-check) sets a cookie of the same\n  // kind and reports whether it stuck. No \u2192 Book links go straight to WellnessLiving's own page (same service, same tab),\n  // where login works. The answer is kept for the browser session. Until it arrives (or if the check can't load within\n  // 4 s), the old browser-name guess stands in. ?wl_drawer=1 forces the drawer for testing.\n  const COOKIE_CHECK = 'https://glowup-cookie-check.vercel.app';\n  const forceDrawer = (() => { try { return new URLSearchParams(location.search).get('wl_drawer') === '1'; } catch (e) { return false; } })();\n  // Theme settings \u2192 Booking \u2192 \"Open booking in a drawer\": off sends everyone to WellnessLiving's page (no check, no preload)\n  const drawerOff = !!(window.GuBooking && window.GuBooking.drawer === false) && !forceDrawer;\n  const guessBlocked = (() => {\n    const ua = navigator.userAgent || '';\n    const iOS = /iPad|iPhone|iPod/.test(ua) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n    const safari = /^((?!chrome|chromium|android|crios|fxios|edg|opr|samsungbrowser).)*safari/i.test(ua);\n    return iOS || safari || /firefox|fxios|samsungbrowser/i.test(ua) || !!navigator.brave;\n  })();\n  let cookies = null; // 'yes' | 'no' | null (not known yet)\n  try { cookies = sessionStorage.getItem('gb3pc'); } catch (e) {}\n  const drawerWorks = () => !drawerOff && (forceDrawer || (cookies ? cookies === 'yes' : !guessBlocked));\n  const settled = []; // run once the check has answered or given up\n  let checkDone = !!cookies || forceDrawer || drawerOff;\n  const whenChecked = (fn) => { if (checkDone) fn(); else settled.push(fn); };\n  if (!checkDone) {\n    const frame = document.createElement('iframe');\n    frame.src = COOKIE_CHECK + '/';\n    frame.title = 'Cookie check';\n    frame.tabIndex = -1;\n    frame.setAttribute('aria-hidden', 'true');\n    frame.style.cssText = 'position:absolute;width:0;height:0;border:0;visibility:hidden';\n    const finish = () => {\n      if (checkDone) return;\n      checkDone = true;\n      window.removeEventListener('message', onAnswer);\n      clearTimeout(giveUp);\n      frame.remove();\n      settled.splice(0).forEach((fn) => fn());\n    };\n    const onAnswer = (e) => {\n      if (e.origin !== COOKIE_CHECK || !e.data || e.data.source !== 'gb-3pc') return;\n      cookies = e.data.ok ? 'yes' : 'no';\n      try { sessionStorage.setItem('gb3pc', cookies); } catch (err) {}\n      finish();\n    };\n    window.addEventListener('message', onAnswer);\n    const giveUp = setTimeout(finish, 4000);\n    document.body.appendChild(frame);\n  }\n\n  // Capture phase so it runs before navigation and before handlers that stop propagation.\n  document.addEventListener('click', (e) => {\n    const link = e.target.closest && e.target.closest(WL_LINK);\n    if (link && link.href.includes('/rs/appointment')) {\n      trackBook(link, false);\n      const plain = drawerWorks() && e.button === 0 && !e.metaKey && !e.ctrlKey && !e.shiftKey && !e.altKey && link.target !== '_blank' && !link.hasAttribute('data-wl-direct');\n      if (plain && ours(link.href)) { e.preventDefault(); openBooking(link.href); }\n    } else if (link && link.href.includes('/rs/catalog')) {\n      trackBook(link, true);\n      const plain = drawerWorks() && e.button === 0 && !e.metaKey && !e.ctrlKey && !e.shiftKey && !e.altKey && link.target !== '_blank' && !link.hasAttribute('data-wl-direct');\n      if (plain && ours(link.href)) { e.preventDefault(); openBooking(link.href); }\n    }\n  }, true);\n\n  /* ---------------------------------------------------------------- 5. Booking drawer */\n  const WIDGET = 'https://widgets.wellnessliving.com';\n  let booking = null; // { dialog, frame, loading, fallback, href, key, id, ready, started, done, abandoned, step }\n\n  // Package/membership purchase links (catalog-view) open WellnessLiving's store widget on that item (k_id + id_sale).\n  // Not the /en-frame/ catalog page: that one needs third-party cookies, so it spins forever in Safari and incognito.\n  const isCatalog = (href) => href.includes('/rs/catalog');\n  const frameUrl = (href, id) => {\n    if (!isCatalog(href)) return widgetUrl(href, id);\n    const q = new URLSearchParams({ k_business: '743190' });\n    ['id_sale', 'k_id', 'k_location'].forEach((k) => { const v = param(href, k); if (v) q.set(k, v); });\n    q.set('__wl-widget-id__', id);\n    q.set('__wl-parent-origin__', location.origin);\n    return `${WIDGET}/store/?${q}`;\n  };\n  const widgetUrl = (href, id) => {\n    const cfg = (window.GuBooking && window.GuBooking.schemas) || {};\n    const category = param(href, 'k_service_category');\n    const schema = (cfg.categories && cfg.categories[category]) || (!param(href, 'k_service') && !param(href, 'k_staff') && cfg.default) || '';\n    const q = new URLSearchParams({ k_business: '743190' });\n    if (schema) q.set('k_schema', schema);\n    else ['k_service', 'k_service_category', 'k_staff'].forEach((k) => { const v = param(href, k); if (v) q.set(k, v); });\n    q.set('__wl-widget-id__', id);\n    q.set('__wl-parent-origin__', location.origin);\n    return `${WIDGET}/appointments/?${q}`;\n  };\n\n  // WellnessLiving's widget needs ~4\u20136 s to fetch its data, so the drawer is built and the widget started before the\n  // click: once the page is idle (for the page's main Book link) and again on hover/focus/touch of any Book link.\n  // Opening a link whose widget is already loaded is then instant; any other link loads fresh behind the overlay.\n  const keyOf = (href) => frameUrl(href, '');\n\n  function ensureDrawer() {\n    if (booking) return booking;\n    const dialog = document.createElement('dialog');\n    dialog.className = 'wl-drawer wl-drawer--book';\n    dialog.setAttribute('aria-label', 'Book an appointment');\n    dialog.innerHTML = `\n      <div class=\"wl-drawer__panel\">\n        <header class=\"wl-drawer__bar\">\n          <span class=\"gu-eyebrow\">Glow Up Med Spa</span>\n          <button type=\"button\" class=\"wl-drawer__x\" data-wl-close aria-label=\"Close booking\">\n            <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\"><path d=\"M3 3l10 10M13 3L3 13\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>\n          </button>\n        </header>\n        <div class=\"wl-drawer__body wl-drawer__body--frame\">\n          <div class=\"wl-drawer__loading\" data-wl-loading><span class=\"wl-drawer__spin\" aria-hidden=\"true\"></span><span data-wl-loading-text>Loading available times\u2026</span></div>\n          <iframe title=\"Book an appointment\" allow=\"geolocation; clipboard-write; web-share; payment\"></iframe>\n        </div>\n        <p class=\"wl-drawer__foot\">Trouble booking? <a href=\"#\" data-wl-fallback data-wl-direct target=\"_blank\">Open booking in a new tab</a> or call <a href=\"tel:+16578206472\">657-820-6472</a>.</p>\n      </div>`;\n    dialog.addEventListener('click', (e) => { if (e.target === dialog || e.target.closest('[data-wl-close]')) dialog.close(); });\n    dialog.addEventListener('close', () => {\n      document.documentElement.style.overflow = '';\n      // Started (picked a time) but didn't finish: GA/GTM get the step they left on. Klaviyo's abandoned-booking flow\n      // keys off \"Started Booking\" plus a wait, so it doesn't need this.\n      if (booking.started && !booking.done && !booking.abandoned) track('booking_abandoned', { ...booking.started, step: booking.step || 'checkout' });\n      // Whatever screen they left it on (a quit, a finished booking, another service), start it fresh in the\n      // background so reopening is instant and begins at the start.\n      const href = booking.href;\n      booking.key = '';\n      if (href) setTimeout(() => load(href), 300);\n    });\n    document.body.appendChild(dialog);\n    booking = {\n      dialog,\n      frame: dialog.querySelector('iframe'),\n      loading: dialog.querySelector('[data-wl-loading]'),\n      fallback: dialog.querySelector('[data-wl-fallback]'),\n      key: '', id: '', ready: false\n    };\n    return booking;\n  }\n\n  function load(href) {\n    const b = ensureDrawer();\n    const key = keyOf(href);\n    b.href = href;\n    b.fallback.href = href;\n    if (key === b.key) return; // already loaded or loading\n    b.key = key;\n    b.ready = false;\n    b.loading.hidden = false;\n    b.loading.querySelector('[data-wl-loading-text]').textContent = isCatalog(href) ? 'Loading\u2026' : 'Loading available times\u2026';\n    b.id = (isCatalog(href) ? 'wl-store-widget:' : 'wl-appointments-widget:') + Math.random().toString(36).slice(2, 10);\n    b.frame.src = frameUrl(href, b.id);\n    clearTimeout(b.giveUp);\n    b.giveUp = setTimeout(() => { b.loading.hidden = true; }, 15000); // never trap anyone behind the overlay\n  }\n\n  function openBooking(href) {\n    document.querySelectorAll('dialog[open]').forEach((d) => d.close()); // e.g. the provider drawer\n    load(href);\n    booking.dialog.showModal();\n    document.documentElement.style.overflow = 'hidden';\n    booking.started = null; booking.done = false; booking.abandoned = false; booking.step = '';\n    track('booking_drawer_open', { wl_service: param(href, 'k_service'), wl_category: param(href, 'k_service_category'), wl_staff: param(href, 'k_staff'), preloaded: booking.ready });\n  }\n\n  // Preload. Skipped for people who've asked to save data or are on a very slow connection.\n  const conn = navigator.connection || {};\n  const canPreload = () => drawerWorks() && !conn.saveData && !/(^|-)2g$/.test(conn.effectiveType || '');\n  const isAppointment = (a) => a && (a.href.includes('/rs/appointment') || isCatalog(a.href)) && ours(a.href) && !a.hasAttribute('data-wl-direct');\n  const preload = (a) => { if (canPreload() && isAppointment(a) && !(booking && booking.dialog.open)) load(a.href); };\n  {\n    const linkOf = (e) => e.target.closest && e.target.closest(WL_LINK);\n    // Hover needs a short dwell so sweeping the pointer across a row of time buttons doesn't restart the widget each time\n    let dwell;\n    document.addEventListener('pointerover', (e) => { clearTimeout(dwell); const a = linkOf(e); if (a) dwell = setTimeout(() => preload(a), 150); }, { passive: true });\n    document.addEventListener('pointerout', () => clearTimeout(dwell), { passive: true });\n    document.addEventListener('touchstart', (e) => preload(linkOf(e)), { passive: true });\n    document.addEventListener('focusin', (e) => preload(linkOf(e)));\n    const idle = window.requestIdleCallback || ((fn) => setTimeout(fn, 1500));\n    // Deferred script, so the DOM is ready; don't wait for 'load', which big images can hold back for seconds.\n    // Wait for the cookie check, so browsers that can't use the drawer don't load the widget for nothing.\n    whenChecked(() => idle(() => {\n      // Only the page's own Book link (treatment pages); the header's Book button is on every page and waits for hover or tap\n      const main = document.querySelector('#MainContent [data-gu-book][href*=\"wellnessliving.com/rs/\"]');\n      if (!main) return;\n      preload(main);\n      // The chosen option changes the main Book link; follow it (debounced) so the preloaded widget matches.\n      let t;\n      new MutationObserver(() => { clearTimeout(t); t = setTimeout(() => preload(main), 800); })\n        .observe(main, { attributes: true, attributeFilter: ['href'] });\n    }, { timeout: 2000 }));\n  }\n\n  window.addEventListener('message', (e) => {\n    if (e.origin !== WIDGET || !booking) return;\n    const d = e.data;\n    if (!d || typeof d !== 'object' || d.source !== 'wl-widget') return;\n    if (d.widgetId && d.widgetId !== booking.id) return;\n    // The widget has fetched its data and drawn the first screen\n    if (!booking.ready && ['widget:branding', 'analytics:start', 'widget:scroll:top'].includes(d.type)) {\n      booking.ready = true;\n      booking.loading.hidden = true;\n      clearTimeout(booking.giveUp);\n    }\n    // widget:height is ignored on purpose: the frame stays drawer-height so the widget scrolls inside itself and its\n    // sticky Continue bar stays on screen.\n    if (d.type === 'widget:redirect:self' && d.url && /^https:\\/\\//.test(d.url)) location.href = d.url;\n    // Booking funnel. Seen from the appointments widget: wl:view-item when a service screen draws (also on preload, so\n    // only counted while the drawer is open) and wl:checkout:begin when a time is picked, before sign-in. wl:schedule:begin\n    // and wl:checkout:abandoned are WellnessLiving-documented but weren't observed; handled in case they start arriving.\n    const ev = d.type === 'wl:analytics' && d.event ? d.event : null;\n    if (ev && booking.dialog.open && ['wl:view-item', 'wl:schedule:begin', 'wl:checkout:begin', 'wl:checkout:abandoned'].includes(ev.name)) {\n      const p = ev.data || {};\n      const items = p.items || (p.item ? [p.item] : []);\n      const heading = document.querySelector('h1');\n      const image = document.querySelector('meta[property=\"og:image\"]');\n      const data = {\n        service: items.map((i) => i.service_name).filter(Boolean).join(', '),\n        category: items.map((i) => i.service_category).filter(Boolean).join(', '),\n        provider: items.map((i) => i.selected_staff || i.service_variant).filter(Boolean).join(', '),\n        visit_date: items.map((i) => i.selected_date_time).filter(Boolean).join(', '),\n        price: Number(p.total) || undefined,\n        currency: p.currency_code || 'USD',\n        treatment: heading ? heading.textContent.replace(/\\s+/g, ' ').trim() : '',\n        image_url: image ? image.content.replace(/^http:/, 'https:') : '',\n        wl_service: param(booking.href, 'k_service'),\n        page_url: location.href,\n        page_path: location.pathname\n      };\n      const step = ev.name.replace(/^wl:/, '').replace(/[:-]/g, '_'); // view_item, schedule_begin, checkout_begin, checkout_abandoned\n      booking.step = step;\n      track(`booking_${step}`, data);\n      if (ev.name === 'wl:checkout:abandoned') booking.abandoned = true; // already reported\n      // Klaviyo \"Started Booking\" once per drawer open, for the abandoned-booking flow\n      if ((ev.name === 'wl:schedule:begin' || ev.name === 'wl:checkout:begin') && !booking.started) {\n        booking.started = data;\n        try { (window.klaviyo = window.klaviyo || []).push(['track', 'Started Booking', data]); } catch (err) {}\n      }\n    }\n    if (d.type === 'wl:analytics' && d.event && d.event.name === 'wl:purchase') {\n      booking.done = true;\n      const p = d.event.data || {};\n      const data = { value: Number(p.total) || undefined, currency: p.currency_code || 'USD', items: (p.items || []).map((i) => i.item_name || i.service_name).filter(Boolean).join(', '), page_path: location.pathname };\n      track('package_purchased', data);\n      try { window.gtag && window.gtag('event', 'purchase', data); } catch (err) {}\n      try { window.fbq && window.fbq('track', 'Purchase', { value: data.value, currency: data.currency }); } catch (err) {}\n      try { (window.klaviyo = window.klaviyo || []).push(['track', 'Bought Package Online (Website)', data]); } catch (err) {}\n    }\n    if (d.type === 'wl:analytics' && d.event && d.event.name === 'wl:booking:completed') {\n      booking.done = true;\n      const items = (d.event.data && d.event.data.items) || [];\n      const data = {\n        services: items.map((i) => i.service_name).filter(Boolean).join(', '),\n        category: items.map((i) => i.service_category).filter(Boolean).join(', '),\n        provider: items.map((i) => i.service_variant).filter(Boolean).join(', '),\n        visit_date: items.map((i) => [i.date, i.time].filter(Boolean).join(' ')).join(', '),\n        value: Number(d.event.data && d.event.data.total) || undefined,\n        page_path: location.pathname\n      };\n      track('booking_completed', data);\n      try { window.gtag && window.gtag('event', 'booking_completed', data); } catch (err) {}\n      try { window.fbq && window.fbq('track', 'Schedule', data); } catch (err) {}\n      try { (window.klaviyo = window.klaviyo || []).push(['track', 'Booked Online (Website)', data]); } catch (err) {}\n    }\n  });\n\n  /* ---------------------------------------------------------------- 2. Next opening */\n  const dayLabel = (ymd) => {\n    const [y, m, d] = ymd.split('-').map(Number);\n    const date = new Date(y, m - 1, d);\n    const today = new Date(); today.setHours(0, 0, 0, 0);\n    const diff = Math.round((date - today) / 86400000);\n    if (diff === 0) return 'Today';\n    if (diff === 1) return 'Tomorrow';\n    return date.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });\n  };\n\n  class WlNextOpening extends HTMLElement {\n    connectedCallback() {\n      this.hidden = true;\n      const follow = this.dataset.follow && document.querySelector(this.dataset.follow);\n      if (follow) {\n        this.link = follow;\n        new MutationObserver(() => this.load()).observe(follow, { attributes: true, attributeFilter: ['href'] });\n      }\n      // data-eager: fetch right away (cards in a carousel, which scroll in later). Otherwise only once it's close to\n      // the screen; most visitors never scroll to a lower one.\n      if (this.dataset.eager !== undefined) { this.ready = true; this.load(); return; }\n      const io = new IntersectionObserver((entries) => {\n        if (entries.some((x) => x.isIntersecting)) { io.disconnect(); this.ready = true; this.load(); }\n      }, { rootMargin: '400px' });\n      io.observe(this.parentElement || this);\n    }\n\n    service() { return this.link ? param(this.link.href, 'k_service') : this.dataset.service || ''; }\n\n    async load() {\n      if (!this.ready) return;\n      const service = this.service();\n      const staff = this.dataset.staff || '';\n      if (service === this.shown) return;\n      this.shown = service;\n      if (!service) { this.hidden = true; return; }\n      const data = await getJSON(`${API}/availability?service=${service}${staff ? `&staff=${staff}` : ''}`);\n      if (this.shown !== service) return; // the option changed while this was loading\n      const days = (data && data.days) || [];\n      if (!days.length) { this.hidden = true; return; }\n      const first = days[0].times[0];\n      const max = Number(this.dataset.max || 3);          // chips per day\n      const total = Number(this.dataset.total || 0);      // chips overall (0 = no cap)\n      let chips = days.flatMap((d) => d.times.slice(0, max).map((t) => ({ day: d.date, t })));\n      if (total) chips = chips.slice(0, total);\n      this.innerHTML = `\n        <p class=\"wl-next__lead\">Next opening <strong>${esc(dayLabel(days[0].date))} at ${esc(first.label)}</strong>${first.staff && !staff ? ` with ${esc(first.staff)}` : ''}</p>\n        <ul class=\"wl-next__times\" aria-label=\"Upcoming open times\">\n          ${chips.map(({ day, t }) => `<li><a href=\"${esc(bookUrl(service, t.k_staff || staff))}\" data-wl-source=\"${esc(this.dataset.wlSource || 'next-opening')}\"><span>${esc(dayLabel(day))}</span> ${esc(t.label)}${t.staff && !staff ? ` <em>${esc(t.staff)}</em>` : ''}</a></li>`).join('')}\n        </ul>`;\n      this.hidden = false;\n    }\n  }\n  if (!customElements.get('wl-next-opening')) customElements.define('wl-next-opening', WlNextOpening);\n\n  /* ---------------------------------------------------------------- 3. Book with a provider */\n  class WlProviderBook extends HTMLElement {\n    connectedCallback() {\n      this.button = this.querySelector('button');\n      if (!this.button) return;\n      const url = `${API}/staff?staff=${this.dataset.staff}`;\n      this.button.addEventListener('pointerenter', () => getJSON(url), { once: true });\n      this.button.addEventListener('click', () => this.open(url));\n    }\n\n    async open(url) {\n      const name = this.dataset.name || 'your provider';\n      if (!this.dialog) {\n        this.dialog = document.createElement('dialog');\n        this.dialog.className = 'wl-drawer';\n        this.dialog.setAttribute('aria-label', `Book with ${name}`);\n        this.dialog.addEventListener('click', (e) => { if (e.target === this.dialog || e.target.closest('[data-wl-close]')) this.dialog.close(); });\n        document.body.appendChild(this.dialog);\n      }\n      this.dialog.innerHTML = this.frame(name, '<p class=\"wl-drawer__note\">Loading services\u2026</p>');\n      this.dialog.showModal();\n      track('provider_book_open', { wl_staff: this.dataset.staff, provider: name });\n\n      const data = await getJSON(url);\n      const groups = (data && data.categories) || [];\n      const fallback = this.dataset.fallback || this.button.dataset.fallback;\n      this.dialog.querySelector('.wl-drawer__body').innerHTML = groups.length\n        ? groups.map((g) => `\n            <section class=\"wl-drawer__group\">\n              <h3 class=\"gu-eyebrow\">${esc(g.title)}</h3>\n              <ul>${g.services.map((s) => `\n                <li><a href=\"${esc(bookUrl(s.k_service, this.dataset.staff))}\" data-wl-source=\"provider-drawer\">\n                  <span>${esc(s.title)}</span>${s.duration ? `<em>${esc(s.duration)}</em>` : ''}\n                </a></li>`).join('')}\n              </ul>\n            </section>`).join('')\n        : `<p class=\"wl-drawer__note\">We couldn't load ${esc(name)}'s services just now.</p>\n           ${fallback ? `<a class=\"gu-btn\" href=\"${esc(fallback)}\" data-wl-source=\"provider-drawer\">See all services</a>` : ''}`;\n    }\n\n    frame(name, body) {\n      return `\n        <div class=\"wl-drawer__panel\">\n          <header class=\"wl-drawer__head\">\n            <div>\n              <span class=\"gu-eyebrow\">Book with ${esc(name)}</span>\n              <p class=\"wl-drawer__title\">Choose a service</p>\n            </div>\n            <button type=\"button\" class=\"wl-drawer__close\" data-wl-close aria-label=\"Close\">\n              <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M3 3l10 10M13 3L3 13\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>\n            </button>\n          </header>\n          <div class=\"wl-drawer__body\">${body}</div>\n          <p class=\"wl-drawer__foot\">Pick a service, then choose ${esc(name)} and your time on the next screen.</p>\n        </div>`;\n    }\n  }\n  /* ---------------------------------------------------------------- 4. Memberships + packages */\n  const money = (n) => '$' + Number(n).toLocaleString('en-US', { maximumFractionDigits: Number(n) % 1 ? 2 : 0 });\n  const KIND = { membership: 'Membership', bank: 'Unit bank', package: 'Package', single: 'Prepaid session' };\n\n  class WlPackages extends HTMLElement {\n    static get observedAttributes() { return ['data-ids']; }\n    connectedCallback() { this.render(); }\n    attributeChangedCallback() { if (this.isConnected) this.render(); }\n\n    async render() {\n      const ids = (this.dataset.ids || '').split(',').filter((x) => /^\\d+$/.test(x)).slice(0, 40).join(',');\n      if (ids === this.shown) return;\n      this.shown = ids;\n      if (!ids) { this.hidden = true; return; }\n      const data = await getJSON(`${API}/catalog?ids=${ids}`);\n      if (this.shown !== ids) return;\n      const items = (data && data.items) || [];\n      if (!items.length) { this.hidden = true; return; }\n      this.innerHTML = `\n        ${this.dataset.heading ? `<p class=\"gu-eyebrow\">${esc(this.dataset.heading)}</p>` : ''}\n        <ul class=\"wl-pk__list\">\n          ${items.map((i) => `\n          <li>\n            <a href=\"${esc(i.url)}\" data-wl-source=\"${esc(this.dataset.wlSource || 'packages')}\" data-wl-item=\"${esc(i.title)}\">\n              <span class=\"wl-pk__kind\">${esc(KIND[i.kind] || 'Package')}</span>\n              <span class=\"wl-pk__title\">${esc(i.title)}</span>\n              ${i.price != null ? `<span class=\"wl-pk__price\">${money(i.price)}${i.kind === 'membership' ? '<small>/mo</small>' : ''}</span>` : ''}\n              <span class=\"wl-pk__cta\">${i.kind === 'membership' ? 'Join' : 'Buy'}</span>\n            </a>\n          </li>`).join('')}\n        </ul>`;\n      this.hidden = false;\n    }\n  }\n  if (!customElements.get('wl-packages')) customElements.define('wl-packages', WlPackages);\n\n  /* ---------------------------------------------------------------- 6. Add-ons */\n  class WlAddons extends HTMLElement {\n    connectedCallback() {\n      this.hidden = true;\n      const follow = this.dataset.follow && document.querySelector(this.dataset.follow);\n      if (follow) {\n        this.link = follow;\n        new MutationObserver(() => this.load()).observe(follow, { attributes: true, attributeFilter: ['href'] });\n      }\n      const io = new IntersectionObserver((entries) => {\n        if (entries.some((x) => x.isIntersecting)) { io.disconnect(); this.ready = true; this.load(); }\n      }, { rootMargin: '400px' });\n      io.observe(this.parentElement || this);\n    }\n\n    service() { return this.link ? param(this.link.href, 'k_service') : this.dataset.service || ''; }\n\n    async load() {\n      if (!this.ready) return;\n      const service = this.service();\n      if (service === this.shown) return;\n      this.shown = service;\n      if (!service) { this.hidden = true; return; }\n      const data = await getJSON(`${API}/addons?service=${service}`);\n      if (this.shown !== service) return;\n      const items = ((data && data.items) || []).slice(0, Number(this.dataset.max || 12));\n      if (!items.length) { this.hidden = true; return; }\n      this.innerHTML = `\n        ${this.dataset.heading ? `<p class=\"gu-eyebrow\">${esc(this.dataset.heading)}</p>` : ''}\n        <ul class=\"wl-ao__list\">\n          ${items.map((i) => `\n          <li${i.description ? ` title=\"${esc(i.description)}\"` : ''}>\n            <span class=\"wl-ao__title\">${esc(i.title)}</span>\n            ${i.duration ? `<span class=\"wl-ao__dur\">${esc(i.duration.replace(/(\\d)(min|hr)/g, '$1 $2'))}</span>` : ''}\n            ${i.price != null ? `<span class=\"wl-ao__price\">+${money(i.price)}</span>` : ''}\n          </li>`).join('')}\n        </ul>\n        <p class=\"wl-ao__note\">${esc(this.dataset.note || 'Add at booking')}</p>`;\n      this.hidden = false;\n    }\n  }\n  if (!customElements.get('wl-addons')) customElements.define('wl-addons', WlAddons);\n\n  const track = (name, data) => {\n    try { (window.dataLayer = window.dataLayer || []).push({ event: name, ...data }); } catch (e) {}\n    try { window.Shopify && Shopify.analytics && Shopify.analytics.publish(name, data); } catch (e) {}\n  };\n  if (!customElements.get('wl-provider-book')) customElements.define('wl-provider-book', WlProviderBook);\n})();\n"],
  "mappings": "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",
  "names": []
}
