{
  "version": 3,
  "sources": ["/cdn/shop/t/99/assets/nw-product.js?z=1792346763091"],
  "sourcesContent": ["/* Northwoofs product page: gallery slider + thumbnails + dots, option buttons, size guide, phone buy bar. */\n(function () {\n  /* Shopify's language root (/de/ on German pages): cart and product data then come back in the shop language */\n  var ROOT = (window.Shopify && Shopify.routes && Shopify.routes.root) || '/';\n  function init(root) {\n    if (!root || root.dataset.ready) return; root.dataset.ready = '1';\n    const gal = root.querySelector('[data-nwp-gal]'), th = root.querySelector('[data-nwp-thumbs]');\n    const dots = root.querySelectorAll('[data-nwp-dots] i');\n    const n = gal ? gal.querySelectorAll('figure').length : 0;\n    const cur = () => Math.round(gal.scrollLeft / Math.max(1, gal.clientWidth));\n    const go = i => { i = Math.max(0, Math.min(n - 1, i)); gal.scrollTo({ left: i * gal.clientWidth, behavior: 'smooth' }); };\n    if (gal) {\n      th && th.addEventListener('click', e => { const b = e.target.closest('button'); if (b) go(+b.dataset.i); });\n      const prev = root.querySelector('[data-nwp-prev]'), next = root.querySelector('[data-nwp-next]');\n      prev && prev.addEventListener('click', () => go(cur() - 1));\n      next && next.addEventListener('click', () => go(cur() + 1));\n      // the arrows only where there is somewhere to go (as in the full-screen view): no back on the first photo, no next on the last\n      const ends = c => { if (prev) prev.hidden = c <= 0; if (next) next.hidden = c >= n - 1; };\n      ends(cur());\n      let last = -1;\n      gal.addEventListener('scroll', () => {\n        const c = cur();\n        ends(c);\n        // phones: keep the current photo's thumbnail in view in the thumbnail row\n        if (c !== last && th && th.scrollWidth > th.clientWidth + 2) { const b = th.children[c]; if (b) th.scrollTo({ left: b.offsetLeft - (th.clientWidth - b.offsetWidth) / 2, behavior: 'smooth' }); }\n        last = c;\n        th && th.querySelectorAll('button').forEach((b, i) => b.setAttribute('aria-current', String(i === c)));\n        dots.forEach((d, i) => d.classList.toggle('on', i === c));\n      }, { passive: true });\n    }\n\n    // option buttons -> variant id, price, URL\n    const form = root.querySelector('[data-nwp-form]');\n    const idInput = form && form.querySelector('input[name=\"id\"]');\n    const vEl = root.querySelector('[data-nwp-variants]');\n    const variants = vEl ? JSON.parse(vEl.textContent) : [];\n    const opts = [].slice.call(root.querySelectorAll('[data-nwp-opt]'));\n    const hint = root.querySelector('[data-nwp-hint]');\n    const atc = root.querySelector('[data-nwp-atc]');\n    const picked = () => opts.map(f => { const b = f.querySelector('[aria-pressed=\"true\"]'); return b ? b.dataset.v : null; });\n    function setPrice(v) {\n      const box = root.querySelector('[data-nwp-price]');\n      if (box) box.innerHTML = v.c ? '<span class=\"p-sale\"><span class=\"p-now sale\">' + v.p + '</span><s class=\"p-was\">' + v.c + '</s></span>' : '<span class=\"p-now\">' + v.p + '</span>';\n      root.querySelectorAll('[data-nwp-mprice]').forEach(el => { el.innerHTML = v.c ? '<s class=\"p-was\">' + v.c + '</s><span class=\"p-now sale\">' + v.p + '</span>' : v.p; });\n      root.querySelectorAll('[data-nwp-low]').forEach(el => { el.hidden = !v.c; const sp = el.querySelector('span'); if (sp) sp.innerHTML = v.c || '';   /* v.c is the shop's money format, which has its own <span class=money> */ });\n    }\n    function hintText() {\n      if (!hint) return; const i = picked().indexOf(null); if (i < 0) return;\n      hint.textContent = (hint.dataset.t || '').replace('[option]', opts[i].dataset.label || opts[i].dataset.name || '');\n    }\n    function update() {\n      const sel = picked();\n      if (sel.some(x => x === null)) { hintText(); return; }\n      const v = variants.find(x => x.o.every((o, i) => o === sel[i]));\n      if (!v) return;\n      delete root.dataset.need; if (hint) { hint.hidden = true; hint.classList.remove('warn'); } setCta && setCta();\n      if (idInput && idInput.value !== String(v.id)) { idInput.value = v.id; idInput.dispatchEvent(new Event('change', { bubbles: true })); }\n      setPrice(v);\n      if (atc) { atc.disabled = !v.a; }\n      // a colour with its own photo: show it\n      if (v.m && gal) { const figs = [].slice.call(gal.querySelectorAll('figure')); const k = figs.findIndex(f => f.dataset.mid === String(v.m)); if (k > -1) go(k); }\n      root.querySelectorAll('[data-nwp-swname]').forEach(el => { const f = el.closest('[data-nwp-opt]'); const b = f && f.querySelector('[aria-pressed=\"true\"]'); if (b) el.textContent = b.dataset.v; });\n      try { const u = new URL(location.href); u.searchParams.set('variant', v.id); history.replaceState(history.state, '', u); } catch (e) {}\n    }\n    opts.forEach(f => f.addEventListener('click', e => {\n      const b = e.target.closest('button[data-v]'); if (!b) return;\n      f.querySelectorAll('button[data-v]').forEach(x => x.setAttribute('aria-pressed', String(x === b)));\n      update();\n    }));\n    function nudge() {\n      const box = root.querySelector('[data-nwp-opts]'); if (!box) return;\n      hintText(); if (hint) { hint.hidden = false; hint.classList.remove('warn'); void hint.offsetWidth; hint.classList.add('warn'); }\n      box.scrollIntoView({ behavior: 'smooth', block: 'center' });\n    }\n    // while no size is picked, the personalizer button only points to the sizes\n    document.addEventListener('click', e => {\n      if (!root.dataset.need) return;\n      const z = e.target.closest('.pplr-c-button, .product-personalizer .btn, [data-nwp-atc]');\n      if (!z || !root.contains(z)) return;\n      e.preventDefault(); e.stopImmediatePropagation(); nudge();\n    }, true);\n\n    // add to cart without leaving the page, then open the cart drawer\n    if (form) form.addEventListener('submit', async e => {\n      e.preventDefault();\n      if (root.dataset.need) { nudge(); return; }\n      const btn = e.submitter || atc; if (btn) btn.setAttribute('aria-busy', 'true');\n      try {\n        const r = await fetch(ROOT + 'cart/add.js', { method: 'POST', body: new FormData(form), headers: { Accept: 'application/json' } }).catch(() => null);\n        if (!r) { alertMsg(''); return; }\n        if (!r.ok) { const j = await r.json().catch(() => ({})); alertMsg(j.description); return; }\n        if (!window.NWCart) location.href = ROOT + 'cart'; // the cart script opens the drawer after any add\n      } finally { if (btn) btn.removeAttribute('aria-busy'); }\n    });\n    function alertMsg(desc) {\n      const w = window.NWCartWhy ? window.NWCartWhy(desc) : { title: window.NWT.cart.add_failed, body: window.NWT.cart.please_try_again };\n      let m = root.querySelector('.nw-alert'); if (!m) { m = document.createElement('div'); m.className = 'nw-alert'; m.setAttribute('role', 'alert'); form.appendChild(m); }\n      m.innerHTML = '<div><b></b><span></span></div>'; m.querySelector('b').textContent = w.title; m.querySelector('span').textContent = w.body;\n    }\n    // hide our Add to cart when the personalizer adds its own button\n    // button text from the template (design: \"Choose a size\" until a size is picked, then \"Design your collar\")\n    const ctaText = () => (root.dataset.need && root.dataset.ctaPick) || root.dataset.cta || '';\n    const setCta = () => {\n      const t = ctaText(); if (!t) return;\n      const z = root.querySelector('[data-nwc-open]') || root.querySelector('#nw-p2-btn') || root.querySelector('.buy .pplr-c-button, #nw-personalize-btn'); if (z && z.textContent.trim() !== t) z.textContent = t;\n      const mb = root.querySelector('[data-nwp-mbuy]'); if (mb && mb.textContent.trim() !== t) mb.textContent = t;\n    };\n    const checkZepto = () => { if (root.dataset.lpz) return; if (root.querySelector('.pplr-c-button') && atc) atc.hidden = true; setCta(); };\n    checkZepto(); new MutationObserver(checkZepto).observe(root, { childList: true, subtree: true });\n\n    // Fit panel (\"What's the difference?\"), works like the size guide\n    const fp = root.querySelector('[data-nwp-fitpanel]');\n    if (fp) {\n      const fs = fp.previousElementSibling; let fl = null;\n      const openFit = () => { fl = document.activeElement; fp.classList.add('open'); fs.classList.add('open'); fp.setAttribute('aria-hidden', 'false'); document.documentElement.classList.add('nw-fs-lock'); const c = fp.querySelector('[data-nwp-fitclose]'); c && c.focus(); };\n      const closeFit = () => { if (!fp.classList.contains('open')) return; fp.classList.remove('open'); fs.classList.remove('open'); fp.setAttribute('aria-hidden', 'true'); document.documentElement.classList.remove('nw-fs-lock'); fl && fl.focus && fl.focus({ preventScroll: true }); };\n      root.addEventListener('click', e => { if (e.target.closest('[data-nwp-fit]')) openFit(); else if (e.target.closest('[data-nwp-fitclose]')) closeFit(); });\n      document.addEventListener('keydown', e => { if (e.key === 'Escape') closeFit(); });\n    }\n\n    // size guide panel\n    const sg = root.querySelector('[data-nwp-sgpanel]'), sgScrim = sg && sg.previousElementSibling; // its own scrim (the Fit panel has one too)\n    let lastFocus = null;\n    function openSG() { if (!sg) return; lastFocus = document.activeElement; sg.classList.add('open'); sgScrim.classList.add('open'); sg.setAttribute('aria-hidden', 'false'); document.documentElement.classList.add('nw-fs-lock'); const c = sg.querySelector('[data-nwp-sgclose]'); c && c.focus(); }\n    function closeSG() { if (!sg) return; sg.classList.remove('open'); sgScrim.classList.remove('open'); sg.setAttribute('aria-hidden', 'true'); document.documentElement.classList.remove('nw-fs-lock'); const v = sg.querySelector('video'); v && v.pause(); lastFocus && lastFocus.focus(); }\n    root.addEventListener('click', e => {\n      if (e.target.closest('[data-nwp-sg]')) { openSG(); return; }\n      if (e.target.closest('[data-nwp-sgclose]')) closeSG();\n    });\n    document.addEventListener('keydown', e => { if (e.key === 'Escape' && sg && sg.classList.contains('open')) closeSG(); });\n\n    // phone bar: appears once the buy button has scrolled away, and triggers the same action\n    const mbar = root.querySelector('[data-nwp-mbar]'), buy = root.querySelector('.buy');\n    if (mbar && buy && 'IntersectionObserver' in window) new IntersectionObserver(en => { mbar.classList.toggle('show', !en[0].isIntersecting && en[0].boundingClientRect.top < 0); }).observe(buy);\n    // story card speech bubbles: one shape, a rounded box with a long slim spike rising to the dog's mouth from its top\n    // padding (x as fractions of the width); redrawn whenever the bubble changes size\n    const bubs = root.querySelectorAll('[data-nwp-bub]');\n    const shape = b => {\n      const w = b.offsetWidth, h = b.offsetHeight, t = parseFloat(getComputedStyle(b).paddingTop) || 0, r = Math.max(8, w * 0.024);\n      if (!w || !h) return;\n      const p = `M${r},${t} L${0.37 * w},${t} L${0.45 * w},0 L${0.44 * w},${t} L${w - r},${t} Q${w},${t} ${w},${t + r} L${w},${h - r} Q${w},${h} ${w - r},${h} L${r},${h} Q0,${h} 0,${h - r} L0,${t + r} Q0,${t} ${r},${t} Z`;\n      b.style.clipPath = `path('${p}')`;\n    };\n    if ('ResizeObserver' in window) { const ro = new ResizeObserver(en => en.forEach(e => shape(e.target))); bubs.forEach(b => ro.observe(b)); } else bubs.forEach(shape);\n    if (bubs.length && 'IntersectionObserver' in window) {\n      const io = new IntersectionObserver(en => en.forEach(e => { if (e.isIntersecting) { e.target.querySelector('[data-nwp-bub]').classList.add('in'); io.unobserve(e.target); } }), { threshold: 0.35 });\n      bubs.forEach(b => io.observe(b.parentElement));\n    } else bubs.forEach(b => b.classList.add('in'));\n    /* coming from the menu's tag picker (\u2026#design): open the personalizer as soon as it is there */\n    /* It does not wait for the whole page (on a slow phone connection the photos and the video can keep the page\n       \"loading\" for many seconds, and the personalizer never opened): it opens as soon as its button is there.\n       Also when the menu asks for it on the page that is already open (only the #design changes, no new page). */\n    /* the colour picked in the menu (?colour=) goes into the personalizer too: it only listens once it has loaded,\n       so keep telling it until it answers with that colour */\n    const carryColour = () => {\n      let want = ''; try { want = new URLSearchParams(location.search).get('colour') || ''; } catch (e) {}\n      if (!want) return;\n      /* it may first announce its default colour while loading, so repeat for a few seconds (same colour, no harm) */\n      let k = 0;\n      const tick = setInterval(() => {\n        if (++k > 14) { clearInterval(tick); return; }\n        window.dispatchEvent(new CustomEvent('nw:look-colour', { detail: { label: want } }));\n      }, 350);\n    };\n    let fromMenu = 0;\n    const openFromMenu = () => {\n      if (fromMenu) return;\n      let n = 0;\n      fromMenu = setInterval(() => {\n        const z = root.querySelector('[data-nwc-open]') || root.querySelector('#nw-p2-btn') || root.querySelector('.buy .pplr-c-button, #nw-personalize-btn');\n        if (z || ++n > 200) {\n          clearInterval(fromMenu); fromMenu = 0;\n          try { history.replaceState(history.state, '', location.pathname + location.search); } catch (e) {}\n          if (z) { z.click(); carryColour(); }\n        }\n      }, 150);\n    };\n    window.addEventListener('hashchange', () => { if (location.hash === '#design') openFromMenu(); });\n    if (location.hash === '#design') {\n      setTimeout(openFromMenu, 250);\n    }\n    /* Design your tag on a phone (7 Oct): the same opening as from the menu. The front tag lifts out of the product\n       photo (when the tag photo is showing and at least half of it is on screen), otherwise it grows out of the\n       button that was pressed; the personalizer is built around it (nw-tag-picker.js, NWFly). Tag pages only. */\n    /* the tag's own address (the src attribute): the image can briefly report its fallback address while it loads */\n    const RI = /\\/ri\\/[^/]+\\/[^/]+\\/im\\.webp/;\n    const gal0 = () => { const i = root.querySelector('.gal img'); return i && RI.test(i.getAttribute('src') || '') ? i : null; };\n    const frOf = i => (i.getAttribute('src') || '').replace(/\\/im\\.webp.*$/, '/fr.webp');\n    const frAr = {}, frIm = {};\n    const handle = () => (location.pathname.split('/products/')[1] || '').split('/')[0];\n    /* the front picture and the carabiner, fetched ahead so the flight never waits for them */\n    const warmFr = () => { try { const hh = handle(); if (hh && window.NWFly && innerWidth < 768) window.NWFly.hwFor(hh); } catch (x) {} const i = gal0(); if (!i) return; const u = frOf(i); if (frAr[u]) return; frAr[u] = .8; const x = frIm[u] = new Image(); x.crossOrigin = 'anonymous'; x.onload = () => { frAr[u] = x.naturalWidth / x.naturalHeight || .8; }; x.src = u; };\n    /* the photo's address may only be known once it has loaded: try a little later, and again when the page is in */\n    warmFr(); setTimeout(warmFr, 1200); window.addEventListener('load', () => setTimeout(warmFr, 300));\n    root.addEventListener('pointerdown', e => { if (e.target.closest('#nw-p2-btn, [data-nwp-mbuy]')) warmFr(); }, true);\n    root.addEventListener('click', e => {\n      const b = e.target.closest('#nw-p2-btn, [data-nwp-mbuy]'); if (!b || root.dataset.need) return;\n      if (window.__nwFlyOn || !window.NWFly || innerWidth >= 768) return;\n      const g = gal0(); if (!g) return;\n      const src = frOf(g), ar = frAr[src] || .8, W = innerWidth, H = innerHeight, q = g.getBoundingClientRect();\n      const seen = (Math.min(q.bottom, H) - Math.max(q.top, 0)) / q.height;\n      let rect, rot = 0;\n      if (Math.abs(q.left) < 6 && seen >= .5 && RI.test(g.currentSrc || g.src)) {\n        /* where the front tag sits in NW Studio's two-tag picture: centred at 38.5% across, from 39% to 82% down, tilted */\n        const h = q.height * .43, w = h * ar;\n        rect = { left: q.left + q.width * .385 - w / 2, top: q.top + q.height * .39, width: w, height: h }; rot = -9;\n      } else {\n        const bq = b.getBoundingClientRect(), s = 48;\n        rect = { left: bq.left + bq.width / 2 - s / 2 * ar, top: bq.top + bq.height / 2 - s / 2, width: s * ar, height: s };\n      }\n      const h = handle(), hw = h ? window.NWFly.hwFor(h) : null, dots = root.querySelector('.nw-look-d');\n      /* the first tap right after the page opened: the front picture may still be on its way. Without it the flight\n         is an empty box, so wait for it a moment (at most 400 ms, the personalizer is loading meanwhile) */\n      if (!frIm[src]) warmFr();\n      /* a design without a front picture (the worker has none, e.g. Instant Portrait) gets no flight: a broken picture\n         flying in is worse than the personalizer's own opening */\n      const x = frIm[src], go = () => { if (window.__nwFlyOn || (x && x.complete && !x.naturalWidth)) return; window.NWFly.flyIn(null, dots, hw, { src, rect, rot, ar, portrait: /portrait/.test(h) }); };\n      if (!x || (x.complete && x.naturalWidth)) go();\n      else { window.__nwFlyOn = true; let done = false; const f = () => { if (done) return; done = true; window.__nwFlyOn = false; go(); }; x.addEventListener('load', f); x.addEventListener('error', f); setTimeout(f, 400); }\n    }, true);\n    // the drifting colours on a collar or leash page are a way in too: they press the builder's button, which opens it,\n    // or, while no size is picked, points to the sizes\n    const cl = root.querySelector('[data-nw-colours]'), ob = root.querySelector('[data-nwc-open]');\n    if (cl && ob) {\n      cl.addEventListener('click', () => ob.click());\n      cl.addEventListener('keydown', e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); ob.click(); } });\n    }\n    const mb = root.querySelector('[data-nwp-mbuy]');\n    mb && mb.addEventListener('click', () => {\n      if (root.dataset.need) { nudge(); return; }\n      const z = root.querySelector('[data-nwc-open]') || root.querySelector('#nw-p2-btn') || root.querySelector('.buy .pplr-c-button, #nw-personalize-btn');\n      if (z) z.click(); else if (atc && !atc.disabled) atc.click(); else buy.scrollIntoView({ behavior: 'smooth', block: 'center' });\n    });\n  }\n  const all = () => document.querySelectorAll('[data-nwp]').forEach(init);\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', all); else all();\n  document.addEventListener('shopify:section:load', e => init(e.target.querySelector('[data-nwp]')));\n})();\n\n/* photo viewer + desktop magnifier live in nw-lightbox.js (same folder) */\n(function () {\n  if (document.getElementById('nw-lb-js')) return;\n  const me = document.currentScript; if (!me || !me.src) return;\n  const s = document.createElement('script'); s.id = 'nw-lb-js'; s.defer = true;\n  s.src = me.src.split('?')[0].replace('nw-product.js', 'nw-lightbox.js') + '?v=lb5'; document.head.appendChild(s); // bump v when nw-lightbox.js changes\n})();\n\n/* Intro text: clamp to 3 lines and show Read more only when it is actually cut off */\n(function () {\n  /* Where the clamped intro stops: the start of the last word on its last visible line (the one the \"...\" cuts) */\n  function cutIndex(ld) {\n    var tn = ld.firstChild; if (!tn || tn.nodeType !== 3) return -1;\n    var txt = tn.textContent, box = ld.getBoundingClientRect(), r = document.createRange();\n    var top = function (i) { r.setStart(tn, i); r.setEnd(tn, i + 1); var q = r.getClientRects()[0]; return q ? q.top : Infinity; };\n    var lo = 0, hi = txt.length - 1;\n    if (top(hi) < box.bottom - 2) return -1;\n    while (lo < hi) { var m = (lo + hi) >> 1; if (top(m) >= box.bottom - 2) hi = m; else lo = m + 1; }\n    var e = lo - 1; while (e > 0 && txt[e] === ' ') e--;\n    var i = txt.lastIndexOf(' ', e);\n    if (i < 0) return -1;\n    /* if that last word still shows in full next to the \"...\", start right after it */\n    r.setStart(tn, e); r.setEnd(tn, e + 1); var q = r.getClientRects()[0];\n    var m = document.createElement('span'); m.textContent = '\\u2026'; m.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap';\n    ld.appendChild(m); var ell = m.getBoundingClientRect().width; m.remove();\n    /* only skip the word when there is clearly room for it and the \"...\" (browsers differ in where they cut) */\n    if (q && q.top < box.bottom - 2 && q.right + ell * 1.6 + 4 <= box.right) return e + 1;\n    return i + 1;\n  }\n  /* Wrap everything after that point in the Description's first paragraph, so the marker starts exactly there */\n  function markUnread(ld, t) {\n    var p = t.querySelector('.c p'); if (!p) return;\n    if (!p.dataset.orig) p.dataset.orig = p.textContent;\n    var orig = p.dataset.orig, lt = ld.textContent, i = cutIndex(ld);\n    p.textContent = orig;\n    if (i < 0) return;\n    var rest = lt.slice(i).trim(), k = orig.lastIndexOf(rest);\n    if (!rest || k < 0) return;\n    p.textContent = orig.slice(0, k);\n    var s = document.createElement('span'); s.className = 'nw-new'; s.textContent = orig.slice(k); p.appendChild(s);\n    var n2 = t.querySelector('.c p + p .nw-new'); if (n2) n2.classList.add('nw-new--2');\n  }\n  function setup() {\n    document.querySelectorAll('[data-nwp-lead]').forEach(function (w) {\n      var ld = w.querySelector('.lead'), rm = w.querySelector('[data-nwp-more]');\n      if (!ld || !rm || w.dataset.rmReady) return; w.dataset.rmReady = '1';\n      ld.classList.add('clamp');\n      var chk = function () { rm.hidden = ld.scrollHeight <= ld.clientHeight + 2; };\n      chk(); window.addEventListener('resize', chk);\n      if (document.fonts && document.fonts.ready) document.fonts.ready.then(chk);\n      rm.addEventListener('click', function (e) {\n        var t = document.getElementById('nwDesc'); if (!t) return;\n        e.preventDefault();\n        t.open = true;\n        markUnread(ld, t);\n        t.classList.remove('nw-sweep');\n        t.scrollIntoView({ behavior: 'smooth', block: 'start' });\n        setTimeout(function () { void t.offsetWidth; t.classList.add('nw-sweep'); }, 550);\n        setTimeout(function () { t.classList.remove('nw-sweep'); }, 4100);\n      });\n    });\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', setup); else setup();\n})();\n"],
  "mappings": "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",
  "names": ["mb", "n", "h", "dots", "go", "i", "q"]
}
