{
  "version": 3,
  "sources": ["/cdn/shop/t/36/assets/dtc-core.js"],
  "sourcesContent": ["/* DTC core v2 - booking build */\n/* ============================================================\n   DTC core behaviours - dtc-core.js\n   Progressive enhancement only: every dtc- section works with no\n   JS at all (native details accordions, scrollable card rails).\n   This file adds slider arrows, single-open FAQ behaviour and the\n   scroll-reveal polish.\n   ============================================================ */\n(function () {\n  'use strict';\n  if (window.__dtcCoreLoaded) { return; }\n  window.__dtcCoreLoaded = true;\n\n  /* ONE SCROLL LOCK FOR EVERY MODAL (audit pdp-05, MOT-12). Four product-page\n     dialogs locked the page four different ways, and three not at all. Every\n     <dialog> opened with showModal() now adds the same class to <html>, and the\n     lock lifts when the last modal closes. The class keeps the scrollbar's\n     gutter, so the page does not shift sideways on Windows. */\n  (function (proto) {\n    if (!proto || !proto.showModal || proto.__tdhqLock) { return; }\n    var show = proto.showModal;\n    proto.__tdhqLock = true;\n    proto.showModal = function () {\n      show.apply(this, arguments);\n      document.documentElement.classList.add('tdhq-modal-open');\n      this.addEventListener('close', function () {\n        var still = false;\n        try { still = !!document.querySelector('dialog[open]:modal'); } catch (err) { still = !!document.querySelector('dialog[open]'); }\n        if (!still) { document.documentElement.classList.remove('tdhq-modal-open'); }\n      }, { once: true });\n    };\n  })(window.HTMLDialogElement && window.HTMLDialogElement.prototype);\n\n  var motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n  var reduce = motionQuery.matches;\n  function updateMotionPreference(e) { reduce = e.matches; }\n  if (motionQuery.addEventListener) { motionQuery.addEventListener('change', updateMotionPreference); }\n  else if (motionQuery.addListener) { motionQuery.addListener(updateMotionPreference); }\n\n  /* SHARED BY EVERY THEME SCRIPT (21 Oct, wf17/motion1021).\n     tdhqMotion.behavior(): 'auto' when the visitor asks for reduced motion (read at call time, so a change of the\n       system setting applies at once), otherwise 'smooth'. A script's explicit behavior:'smooth' overrides the CSS\n       reduced-motion rule, so scripted scrolls ask this instead.\n     tdhqImgReady(img, ok, fail): ok() once a preloaded picture can be shown, fail() only when it truly has no\n       pixels. decode() alone was trusted both ways: a picture that failed to load replaced a working one, and\n       Safari can reject decode() for a picture that loaded fine; the pixels decide. */\n  window.tdhqMotion = window.tdhqMotion || {\n    behavior: function () {\n      return window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth';\n    }\n  };\n  window.tdhqImgReady = window.tdhqImgReady || function (img, ok, fail) {\n    var done = false;\n    var good = function () { if (!done) { done = true; ok(); } };\n    var bad = function () { if (!done) { done = true; if (fail) { fail(); } } };\n    var judge = function () {\n      if (img.complete) { if (img.naturalWidth > 0) { good(); } else { bad(); } return; }\n      img.addEventListener('load', good, { once: true });\n      img.addEventListener('error', bad, { once: true });\n    };\n    if (img.decode) { img.decode().then(good, judge); } else { judge(); }\n  };\n\n  /* ---- slider arrows for card sections set to \"Slider\" ---- */\n  /* rAF-coalesce a handler so N sliders on one page do not each force a synchronous\n     layout read per resize tick. The final state is identical, one frame later. */\n  function coalesced(fn) {\n    var queued = false;\n    return function () {\n      if (queued) { return; }\n      queued = true;\n      requestAnimationFrame(function () { queued = false; fn(); });\n    };\n  }\n\n  /* WIDTH CHANGES ONLY (owner 20 Oct 2026: phone scrolling stutters). A phone's\n     address bar showing or hiding resizes the window's HEIGHT at every change of\n     scroll direction; rails, carousels and logo fits depend on the width only,\n     so they skip those resizes instead of measuring again mid-scroll. */\n  var widthFns = [], lastWidth = window.innerWidth;\n  window.addEventListener('resize', function () {\n    if (window.innerWidth === lastWidth) { return; }\n    lastWidth = window.innerWidth;\n    for (var i = 0; i < widthFns.length; i++) { widthFns[i](); }\n  });\n  function onWidth(fn) { widthFns.push(fn); }\n\n  /* READ ALL, THEN WRITE ALL, ONCE A FRAME. Each rail used to measure itself\n     and write straight away, one rail after another, so every measurement came\n     right after the previous rail's write and the browser redid style and\n     layout once per rail (Chrome trace of the live home page, 25 Sep 2026:\n     2.6 s of forced reflow at 4x CPU, most of it rail start-up). A frameJob is\n     a read (measure, no writes) and a write (no measuring); every job queued in\n     a frame measures first, then every job writes, so the page lays out once.\n     Calling the returned function queues the job; it runs at most once a frame. */\n  var frameJobs = [];\n  var frameRaf = 0;\n  function runFrameJobs() {\n    frameRaf = 0;\n    var jobs = frameJobs;\n    frameJobs = [];\n    var seen = [];\n    for (var i = 0; i < jobs.length; i++) {\n      jobs[i].queued = false;\n      try { seen.push({ ok: true, v: jobs[i].read() }); } catch (err) { seen.push({ ok: false }); }\n    }\n    for (var k = 0; k < jobs.length; k++) {\n      if (!seen[k].ok) { continue; }\n      try { jobs[k].write(seen[k].v); } catch (err) {}\n    }\n  }\n  function frameJob(read, write) {\n    var job = { read: read, write: write, queued: false };\n    return function () {\n      if (job.queued) { return; }\n      job.queued = true;\n      frameJobs.push(job);\n      if (!frameRaf) { frameRaf = requestAnimationFrame(runFrameJobs); }\n    };\n  }\n\n  function initCarousel(root) {\n    if (!root || root.dataset.dtcInit) { return; }\n    root.dataset.dtcInit = '1';\n    var track = root.querySelector('[data-dtc-track]');\n    var prev = root.querySelector('[data-dtc-prev]');\n    var next = root.querySelector('[data-dtc-next]');\n    if (!track) { return; }\n\n    function step() {\n      var card = track.firstElementChild;\n      if (!card) { return 300; }\n      var gap = parseFloat(getComputedStyle(track).columnGap || getComputedStyle(track).gap) || 20;\n      return card.getBoundingClientRect().width + gap;\n    }\n\n    /* ---- position bar under the rail ----\n       Width is the share of the row that is on screen and the offset is how\n       far through it we are, so the thumb reads as a scrollbar for the cards.\n       It is translated rather than positioned with `left`, which keeps it on\n       the compositor while the rail is being dragged. */\n    /* Nine different sections render an arrow pair, and every one of them\n       should get the position bar: it is what tells a visitor the row can be\n       pulled. The bar is pure enhancement - it reports and drives a scroll\n       position that already works without it - so it is built here rather than\n       threaded through nine templates, and a section that ships its own\n       (dtc-card-grid does) is left alone. */\n    function ensureBar() {\n      var existing = root.querySelector('[data-dtc-railbar]');\n      if (existing) { return existing; }\n      var nav = root.querySelector('.dtc-carousel__nav');\n      if (!nav) { return null; }\n      var el = document.createElement('div');\n      el.className = 'dtc-railbar';\n      el.setAttribute('data-dtc-railbar', '');\n      var th = document.createElement('span');\n      th.className = 'dtc-railbar__thumb';\n      th.setAttribute('data-dtc-railthumb', '');\n      el.appendChild(th);\n      var foot = nav.parentElement;\n      if (foot && foot.classList.contains('dtc-carousel__foot')) {\n        /* that footer is already a 1fr | button | 1fr row with the arrows\n           pinned right, so the bar takes the empty first column */\n        foot.insertBefore(el, foot.firstChild);\n      } else {\n        var wrap = document.createElement('div');\n        wrap.className = 'dtc-railfoot';\n        nav.parentNode.insertBefore(wrap, nav);\n        wrap.appendChild(el);\n        wrap.appendChild(nav);\n      }\n      return el;\n    }\n\n    var bar = ensureBar();\n    var thumb = bar ? bar.querySelector('[data-dtc-railthumb]') : null;\n\n    /* m = one measurement of the rail (see frameJob): nothing here reads layout. */\n    function paintBar(m) {\n      if (!bar || !thumb) { return; }\n      var ratio = m.cw / m.sw;\n      if (!isFinite(ratio) || ratio >= 1) { return; }\n      var w = Math.max(28, Math.round(m.barW * ratio));\n      var travel = m.barW - w;\n      var progress = m.max > 0 ? Math.min(1, Math.max(0, m.left / m.max)) : 0;\n      thumb.style.width = w + 'px';\n      thumb.style.transform = 'translateX(' + Math.round(travel * progress) + 'px)';\n    }\n\n    var update = frameJob(function () {\n      var sw = track.scrollWidth, cw = track.clientWidth;\n      return { sw: sw, cw: cw, max: sw - cw, left: track.scrollLeft, barW: bar ? bar.clientWidth : 0 };\n    }, function (m) {\n      /* Hide the arrows entirely when every card already fits (no overflow);\n         re-shows them if the viewport shrinks enough to cause a scroll. */\n      var wasStatic = root.classList.contains('dtc-carousel--static');\n      var isStatic = m.max <= 4;\n      root.classList.toggle('dtc-carousel--static', isStatic);\n      if (prev) { prev.disabled = m.left <= 4; }\n      if (next) { next.disabled = m.left >= m.max - 4; }\n      /* the bar was measured while the rail was static: measure it again shown */\n      if (wasStatic && !isStatic) { update(); return; }\n      paintBar(m);\n    });\n\n    /* The bar is a control, not just a readout: press or drag anywhere along\n       it and the rail jumps to that share of its travel. */\n    if (bar) {\n      var barDown = false;\n      var seek = function (clientX) {\n        var r = bar.getBoundingClientRect();\n        var w = thumb ? thumb.getBoundingClientRect().width : 28;\n        var travel = Math.max(1, r.width - w);\n        var p = Math.min(1, Math.max(0, (clientX - r.left - w / 2) / travel));\n        var max = track.scrollWidth - track.clientWidth;\n        track.scrollLeft = max * p;\n      };\n      bar.addEventListener('pointerdown', function (e) {\n        barDown = true;\n        bar.classList.add('dtc-railbar--live');\n        if (bar.setPointerCapture) { try { bar.setPointerCapture(e.pointerId); } catch (err) {} }\n        /* the rail's own scroll-behavior:smooth would animate toward each\n           sample and never keep up with the pointer */\n        track.style.scrollBehavior = 'auto';\n        seek(e.clientX);\n        e.preventDefault();\n      });\n      bar.addEventListener('pointermove', function (e) { if (barDown) { seek(e.clientX); } });\n      var barUp = function () {\n        if (!barDown) { return; }\n        barDown = false;\n        bar.classList.remove('dtc-railbar--live');\n        track.style.scrollBehavior = '';\n      };\n      bar.addEventListener('pointerup', barUp);\n      bar.addEventListener('pointercancel', barUp);\n      bar.addEventListener('lostpointercapture', barUp);\n    }\n\n    if (prev) { prev.addEventListener('click', function () { track.scrollBy({ left: -step(), behavior: reduce ? 'auto' : 'smooth' }); }); }\n    if (next) { next.addEventListener('click', function () { track.scrollBy({ left: step(), behavior: reduce ? 'auto' : 'smooth' }); }); }\n    track.addEventListener('scroll', update, { passive: true });\n    onWidth(update);\n    update();\n\n    /* optional autoplay: advance one card, loop back at the end.\n       Stops for good once the visitor touches the rail; stays off in\n       the theme editor and under reduced-motion. */\n    var interval = parseInt(root.getAttribute('data-dtc-autoplay'), 10);\n    if (!interval || reduce) { return; }\n    if (window.Shopify && window.Shopify.designMode) { return; }\n    var stopped = false;\n    var hovering = false;\n    track.addEventListener('pointerdown', function () { stopped = true; }, { passive: true });\n    root.addEventListener('pointerenter', function () { hovering = true; });\n    root.addEventListener('pointerleave', function () { hovering = false; });\n    var autoTimer = setInterval(function () {\n      if (!root.isConnected) { clearInterval(autoTimer); return; }\n      if (stopped || hovering || document.hidden || reduce || root.contains(document.activeElement)) { return; }\n      var max = track.scrollWidth - track.clientWidth;\n      if (max < 6) { return; }\n      if (track.scrollLeft >= max - 6) {\n        track.scrollTo({ left: 0, behavior: 'smooth' });\n      } else {\n        track.scrollBy({ left: step(), behavior: 'smooth' });\n      }\n    }, interval);\n  }\n\n\n  /* ============================================================\n     DRAG TO SCROLL - every horizontal rail on the site\n     ============================================================\n     Touch already pans a rail natively, so this is MOUSE ONLY: a\n     pointerdown of type \"mouse\" grabs the rail, pointermove pushes\n     scrollLeft, and the release throws it with inertia before it\n     settles on the nearest card. Three details make it feel native\n     rather than janky:\n\n       - the rail carries scroll-behavior:smooth for the arrow\n         buttons, which would animate every single scrollLeft write\n         and lag a full frame behind the cursor, so the drag class\n         turns it off and the settle passes behavior:\"smooth\"\n         explicitly instead;\n       - scroll-snap-type:x mandatory fights a free drag (the\n         browser keeps yanking back to the nearest snap point), so\n         the drag class also drops snap and it comes back once the\n         throw has landed;\n       - a drag that starts on a card ends with a click on that\n         card's link, so the first click after a real drag is\n         swallowed. Anything under the threshold is still a click,\n         which keeps tapping a card working exactly as before.  */\n  function initDragScroll(el) {\n    if (!el || el.dataset.dtcDrag) { return; }\n    el.dataset.dtcDrag = '1';\n\n    var THRESHOLD = 4;      /* px of travel before it counts as a drag, not a click */\n    var FRICTION = 0.94;    /* per-frame velocity decay for the throw */\n    var down = false, dragging = false, suppress = false;\n    var startX = 0, startLeft = 0, lastX = 0, lastT = 0, vel = 0, pid = null, raf = 0;\n    var releaseLeft = 0, throwDir = 0;\n\n    function maxScroll() { return el.scrollWidth - el.clientWidth; }\n    function stopGlide() { if (raf) { cancelAnimationFrame(raf); raf = 0; } }\n\n    /* The grab cursor is a promise that the rail moves, so it is only worn\n       while there is overflow to drag through. */\n    var railTabStop = false;\n    var grabbable = frameJob(maxScroll, function (max) {\n      el.classList.toggle('dtc-draggable', max > 4);\n      /* Text-only rails need a tab stop so arrow keys can reach every step.\n         Preserve authored tabindex values and remove only the stop we added\n         when a wider layout no longer scrolls. */\n      if (max > 4 && !el.hasAttribute('tabindex')) {\n        el.setAttribute('tabindex', '0');\n        railTabStop = true;\n      } else if (max <= 4 && railTabStop) {\n        if (el.getAttribute('tabindex') === '0') { el.removeAttribute('tabindex'); }\n        railTabStop = false;\n      }\n    });\n    grabbable();\n    onWidth(grabbable);\n    if ('ResizeObserver' in window) { new ResizeObserver(grabbable).observe(el); }\n\n    function onDown(e) {\n      if (e.pointerType !== 'mouse' || e.button !== 0) { return; }\n      /* never steal the pointer from a real control inside a card - unless\n         the control IS the card (data-dtc-drag-card: the community video\n         cards are buttons). A drag over one still scrolls, and the click that\n         ends it is swallowed below, so only a real tap plays the video. */\n      var ctl = e.target.closest ? e.target.closest('input, select, textarea, button, [data-dtc-no-drag]') : null;\n      if (ctl && !ctl.hasAttribute('data-dtc-drag-card')) { return; }\n      if (maxScroll() <= 4) { return; }\n      stopGlide();\n      down = true; dragging = false; suppress = false;\n      startX = lastX = e.clientX;\n      startLeft = el.scrollLeft;\n      lastT = e.timeStamp;\n      vel = 0;\n    }\n\n    function onMove(e) {\n      if (!down || e.pointerType !== 'mouse') { return; }\n      var dx = e.clientX - startX;\n      if (!dragging) {\n        if (Math.abs(dx) < THRESHOLD) { return; }\n        dragging = true;\n        el.classList.add('dtc-dragging');\n        el.classList.add('dtc-gliding');\n        pid = e.pointerId;\n        if (el.setPointerCapture) { try { el.setPointerCapture(pid); } catch (err) {} }\n      }\n      e.preventDefault();\n      el.scrollLeft = startLeft - dx;\n      var dt = e.timeStamp - lastT;\n      if (dt > 0) {\n        /* smoothed px/ms so one stuttery frame can't define the throw */\n        vel = vel * 0.7 + ((e.clientX - lastX) / dt) * 0.3;\n        lastX = e.clientX;\n        lastT = e.timeStamp;\n      }\n    }\n\n    function onUp(e) {\n      if (!down) { return; }\n      down = false;\n      if (pid !== null && el.releasePointerCapture) { try { el.releasePointerCapture(pid); } catch (err) {} }\n      pid = null;\n      if (!dragging) { return; }\n      dragging = false;\n      el.classList.remove('dtc-dragging');\n      suppress = true;\n      /* a pointer that has been still for 90ms is a placement, not a throw */\n      if (e && e.timeStamp - lastT > 90) { vel = 0; }\n      /* where the finger let go, and which way it was going: settle() may not\n         land behind that point (see the note there) */\n      releaseLeft = el.scrollLeft;\n      throwDir = el.scrollLeft > startLeft ? 1 : (el.scrollLeft < startLeft ? -1 : 0);\n      glide();\n    }\n\n    /* ONE MOVEMENT PER THROW (audit MOT-05). The rail used to coast first and\n       pick a card edge afterwards; once the coast had passed the midpoint the\n       nearest allowed edge was behind it, so a forward throw ran BACK up to\n       170px to settle. The landing edge is now chosen at release, in the\n       direction of the throw, and one time-based ease-out ends exactly on it\n       (starting at the release speed, so there is no jolt at the hand-over,\n       and the same duration on a 60Hz or a 120Hz screen). */\n    function glide() {\n      var v = -vel * 16;  /* px per ms -> px per 60fps frame, inverted: drag right scrolls left */\n      if (reduce || Math.abs(v) < 0.6) { settle(); return; }\n      if (v > 90) { v = 90; } else if (v < -90) { v = -90; }\n      var from = el.scrollLeft;\n      var to = edgeNear(from + v * FRICTION / (1 - FRICTION), v > 0 ? 1 : -1);\n      var dist = to - from;\n      if (Math.abs(dist) < 1.5) { el.classList.remove('dtc-gliding'); return; }\n      var dur = Math.min(900, Math.max(260, Math.abs(3 * dist * 16.7 / v)));\n      var t0 = performance.now();\n      raf = requestAnimationFrame(function frame(now) {\n        if (reduce) { raf = 0; el.classList.remove('dtc-gliding'); return; }\n        var p = Math.min(1, (now - t0) / dur);\n        el.scrollLeft = from + dist * (1 - Math.pow(1 - p, 3));\n        if (p < 1) { raf = requestAnimationFrame(frame); } else { raf = 0; el.classList.remove('dtc-gliding'); }\n      });\n    }\n    /* the card edge nearest x that does not sit behind the release point */\n    function edgeNear(x, dir) {\n      var pad = parseFloat(getComputedStyle(el).paddingLeft) || 0;\n      var edge = el.getBoundingClientRect().left + pad;\n      var max = maxScroll(), best = null, bestD = Infinity;\n      for (var i = 0; i < el.children.length; i++) {\n        var pos = Math.max(0, Math.min(max, el.scrollLeft + el.children[i].getBoundingClientRect().left - edge));\n        if (dir > 0 && pos < releaseLeft - 1) { continue; }\n        if (dir < 0 && pos > releaseLeft + 1) { continue; }\n        if (Math.abs(pos - x) < bestD) { bestD = Math.abs(pos - x); best = pos; }\n      }\n      return best === null ? Math.max(0, Math.min(max, x)) : best;\n    }\n\n    /* Land on a card edge, then hand snapping back to the browser. Measured\n       through getBoundingClientRect so it does not care which ancestor happens\n       to be the offsetParent.\n\n       NEVER BEHIND THE RELEASE. The nearest edge to a rail of wide cards is\n       usually the one the shopper has just dragged past, so a throw forwards\n       ended up going backwards (the community rail: released at 500, glided to\n       649, snapped back to 267). The edge chosen is the nearest one that does\n       not move the rail against the throw; if the throw ran out of cards, the\n       nearest edge is used after all. */\n    function settle() {\n      var kids = el.children;\n      if (!kids.length) { el.classList.remove('dtc-gliding'); return; }\n      var pad = parseFloat(getComputedStyle(el).paddingLeft) || 0;\n      var edge = el.getBoundingClientRect().left + pad;\n      var best = 0, bestD = Infinity, nearestD = Infinity;\n      for (var i = 0; i < kids.length; i++) {\n        var d = kids[i].getBoundingClientRect().left - edge;\n        if (Math.abs(d) < Math.abs(nearestD)) { nearestD = d; }\n        if (throwDir !== 0) {\n          var target = el.scrollLeft + d;\n          /* dragging the content left scrolls right: a forward throw may only\n             land at or beyond where it was released, and the other way round */\n          if (throwDir > 0 && target < releaseLeft - 1) { continue; }\n          if (throwDir < 0 && target > releaseLeft + 1) { continue; }\n        }\n        if (Math.abs(d) < Math.abs(bestD)) { bestD = d; best = i; }\n      }\n      if (bestD === Infinity) { bestD = nearestD; }\n      var done = function () { el.classList.remove('dtc-gliding'); };\n      if (Math.abs(bestD) < 1.5 || reduce) { done(); return; }\n      el.scrollTo({ left: el.scrollLeft + bestD, behavior: 'smooth' });\n      /* re-enable snap only once the settle has landed, or it aborts mid-flight */\n      if ('onscrollend' in window) {\n        el.addEventListener('scrollend', done, { once: true });\n        setTimeout(done, 700);\n      } else {\n        setTimeout(done, 460);\n      }\n    }\n\n    el.addEventListener('pointerdown', onDown);\n    el.addEventListener('pointermove', onMove);\n    el.addEventListener('pointerup', onUp);\n    el.addEventListener('pointercancel', onUp);\n    el.addEventListener('lostpointercapture', onUp);\n    /* an image or link inside the rail would otherwise start a native\n       drag-and-drop ghost the moment the pointer moves */\n    el.addEventListener('dragstart', function (e) { e.preventDefault(); });\n    el.addEventListener('click', function (e) {\n      if (!suppress) { return; }\n      suppress = false;\n      e.preventDefault();\n      e.stopPropagation();\n    }, true);\n    /* a wheel with horizontal intent should cancel an in-flight throw */\n    el.addEventListener('wheel', stopGlide, { passive: true });\n  }\n\n  /* ============================================================\n     BRAND LOGO TRIM - see the note in docs; summary here.\n     Logo files are often a wordmark on a square canvas with most of the\n     canvas empty. This finds the mark from the pixels and shows only it.\n     ============================================================ */\n  var LOGO_WELLS = '[data-brand-logo-well], .dtc-brands__logo';\n\n  function logoBox(img) {\n    var W = img.naturalWidth, H = img.naturalHeight;\n    if (!W || !H) { return null; }\n    /* sample small: the bbox only needs to be right to a pixel or two at the\n       size it is drawn, and a 240px sample of a 480px logo is 4x cheaper */\n    var k = Math.min(1, 240 / Math.max(W, H));\n    var sw = Math.max(1, Math.round(W * k)), sh = Math.max(1, Math.round(H * k));\n    var cv = document.createElement('canvas');\n    cv.width = sw; cv.height = sh;\n    var cx = cv.getContext('2d', { willReadFrequently: true });\n    var d;\n    try {\n      cx.drawImage(img, 0, 0, sw, sh);\n      d = cx.getImageData(0, 0, sw, sh).data;\n    } catch (e) { return null; }\n\n    /* the ground is what the four corners agree on */\n    function px(x, y) { var i = (y * sw + x) * 4; return [d[i], d[i + 1], d[i + 2], d[i + 3]]; }\n    var corners = [px(0, 0), px(sw - 1, 0), px(0, sh - 1), px(sw - 1, sh - 1)];\n    var bg = corners[0];\n    var alpha = (corners[0][3] + corners[1][3] + corners[2][3] + corners[3][3]) / 4;\n    var transparent = alpha < 24;\n    var lum = (bg[0] * 0.299 + bg[1] * 0.587 + bg[2] * 0.114);\n    var whiteGround = !transparent && alpha > 200 && lum > 232;\n    /* A SOLID PLATE. A logo supplied as small lettering on a solid dark or\n       coloured rectangle (Broke Boys: tiny white text in a black box) is\n       trimmed to the lettering too, and the well takes the plate's colour, so\n       the tile shows the brand's own ground with the mark at a readable size.\n       Only when all four corners agree - a gradient or a photograph keeps its\n       whole picture. */\n    var plate = null;\n    if (!transparent && !whiteGround) {\n      var agree = corners.every(function (c) {\n        return c[3] > 200 && Math.abs(c[0] - bg[0]) + Math.abs(c[1] - bg[1]) + Math.abs(c[2] - bg[2]) < 24;\n      });\n      if (!agree) { return { keep: true }; }\n      plate = 'rgb(' + bg[0] + ',' + bg[1] + ',' + bg[2] + ')';\n    }\n\n    var minX = sw, minY = sh, maxX = -1, maxY = -1;\n    var onN = 0, lumSum = 0;\n    for (var y = 0; y < sh; y++) {\n      for (var x = 0; x < sw; x++) {\n        var i = (y * sw + x) * 4;\n        var on;\n        if (transparent) {\n          on = d[i + 3] > 28;\n        } else {\n          on = Math.abs(d[i] - bg[0]) + Math.abs(d[i + 1] - bg[1]) + Math.abs(d[i + 2] - bg[2]) > 54;\n        }\n        if (on) {\n          if (transparent) { onN++; lumSum += d[i] * 0.299 + d[i + 1] * 0.587 + d[i + 2] * 0.114; }\n          if (x < minX) { minX = x; }\n          if (x > maxX) { maxX = x; }\n          if (y < minY) { minY = y; }\n          if (y > maxY) { maxY = y; }\n        }\n      }\n    }\n    if (maxX < 0) { return { keep: true }; }\n    /* A LIGHT MARK. White lettering on a transparent file (BLO, Car-Chem) is\n       invisible on a light well; flushTrims gives such a well the site's dark\n       panel colour, as a solid plate gives the well its own colour. */\n    var light = transparent && onN > 0 && lumSum / onN > 200;\n    var bw = maxX - minX + 1, bh = maxY - minY + 1;\n    /* nothing worth trimming: the mark already fills the file */\n    if (bw / sw > 0.9 && bh / sh > 0.9) { return { keep: true, light: light }; }\n    /* one sample pixel of breathing room so an antialiased edge is not shaved */\n    minX = Math.max(0, minX - 1); minY = Math.max(0, minY - 1);\n    bw = Math.min(sw - minX, bw + 2); bh = Math.min(sh - minY, bh + 2);\n    return { W: W, H: H, l: minX / sw, t: minY / sh, w: bw / sw, h: bh / sh, plate: plate, light: light };\n  }\n\n  /* a light mark's well: dark only when its own ground is light (a dark\n     scheme's well already shows a white mark) */\n  function darkenWell(well) {\n    var m = (getComputedStyle(well).backgroundColor || '').match(/[\\d.]+/g);\n    if (!m) { return; }\n    var a = m.length > 3 ? +m[3] : 1;\n    var lum = a < 0.2 ? 255 : (+m[0] * 0.299 + +m[1] * 0.587 + +m[2] * 0.114);\n    if (lum > 200) {\n      well.style.backgroundColor = 'var(--tdhq-charcoal, #151515)';\n      well.classList.add('is-plate-logo');\n    }\n  }\n\n  /* Where the mark goes, split in two so a whole batch of logos can be\n     measured in one layout and then placed (see flushTrims): fitLogo only\n     READS, placeLogo only WRITES. */\n  function fitLogo(img) {\n    var box = img.__logoBox;\n    if (!box || box.keep) { return null; }\n    var clip = img.parentNode;\n    if (!clip || !clip.classList || !clip.classList.contains('tdhq-logo-clip')) { return null; }\n    var well = clip.parentNode;\n    var mW = box.W * box.w, mH = box.H * box.h;          /* mark, natural px */\n    var ratio = mW / mH;\n    var rw, rh;\n\n    if (img.__logoMode === 'fill') {\n      var ws = getComputedStyle(well);\n      var innerW = well.clientWidth - parseFloat(ws.paddingLeft) - parseFloat(ws.paddingRight);\n      var innerH = well.clientHeight - parseFloat(ws.paddingTop) - parseFloat(ws.paddingBottom);\n      if (innerW < 20 || innerH < 12) { return null; }\n      /* equal AREA, so a wordmark and a roundel weigh the same. A small inline\n         tile asks for a fuller fit through --tdhq-logo-fill; a big brand tile\n         keeps the default third. */\n      var fill = parseFloat(ws.getPropertyValue('--tdhq-logo-fill')) || 0.3;\n      var area = innerW * innerH * fill;\n      rh = Math.sqrt(area / ratio);\n      rw = rh * ratio;\n      if (rw > innerW * 0.92) { rw = innerW * 0.92; rh = rw / ratio; }\n      if (rh > innerH * 0.86) { rh = innerH * 0.86; rw = rh * ratio; }\n    } else {\n      /* HEIGHT: the mark takes the height the stylesheet gave the whole file */\n      rh = img.__logoSlotH || 32;\n      rw = rh * ratio;\n    }\n    return { rw: rw, rh: rh, s: rw / mW };                 /* s: rendered px per natural px */\n  }\n\n  function placeLogo(img, f) {\n    var box = img.__logoBox, clip = img.parentNode;\n    clip.style.width = Math.round(f.rw) + 'px';\n    clip.style.height = Math.round(f.rh) + 'px';\n    img.style.width = Math.round(box.W * f.s) + 'px';\n    img.style.height = Math.round(box.H * f.s) + 'px';\n    img.style.left = Math.round(-box.W * box.l * f.s) + 'px';\n    img.style.top = Math.round(-box.H * box.t * f.s) + 'px';\n    sharpenLogo(img, box.W * f.s);\n  }\n\n  function layoutLogo(img) {\n    var f = fitLogo(img);\n    if (f) { placeLogo(img, f); }\n  }\n\n  /* A trimmed mark is drawn at the size of its CROP, so the whole file is often\n     drawn several times wider than the copy the srcset picked for the tile\n     (Broke Boys: a 160px copy drawn 510px wide - blurred lettering). Ask the\n     Shopify CDN for the width actually needed, at the screen's density. The\n     trim fractions are the same at any resolution, so the layout holds. */\n  function sharpenLogo(img, drawnW) {\n    var need = Math.min(2000, Math.ceil(drawnW * (window.devicePixelRatio || 1) / 100) * 100);\n    /* compare with the width actually requested from the CDN: for an <img> with\n       srcset, naturalWidth is density-corrected, so on a 3x phone this test\n       nearly always failed and 89 of 114 logos were downloaded a second time,\n       85 of them SMALLER than the first (audit perf-06) */\n    var haveM = (img.currentSrc || img.src || '').match(/[?&]width=(\\d+)/);\n    var have = haveM ? +haveM[1] : img.naturalWidth;\n    if (!need || need <= have * 1.05 || img.__logoSharpW >= need) { return; }\n    var src = img.currentSrc || img.src;\n    if (!/[?&]width=\\d+/.test(src)) { return; }\n    img.__logoSharpW = need;\n    img.removeAttribute('srcset');\n    img.removeAttribute('sizes');\n    img.src = src.replace(/([?&]width=)\\d+/, '$1' + need);\n  }\n\n  /* TRIMS ARE BATCHED, ONE LAYOUT AT A TIME (audit MOT-10). Each logo used to\n     be trimmed from its own load event, and each trim forced up to three full\n     layouts of the page (its slot height, its well with the image hidden, then\n     the fit). On the Brands page, where a lazy grid of 116 logos arrives\n     during a scroll, those stacked into long frames of 63-115ms at 390 (4-6\n     trims of 13-19ms each). Reading the pixels is cheap (about 0.3ms a logo);\n     the layouts were the cost. Logos that finish loading in the same frame are\n     now trimmed together on the next animation frame: all reads, then all\n     writes, then all fits, then all placements. Whether a kind of well is a\n     TILE or sized BY its image is measured once per kind (its class list) and\n     remembered, instead of hiding every image to measure its well. */\n  var trimQueue = [], trimRaf = 0, wellModes = {};\n\n  function queueTrim(img) {\n    trimQueue.push(img);\n    if (!trimRaf) { trimRaf = requestAnimationFrame(flushTrims); }\n  }\n\n  function flushTrims() {\n    if (trimRaf) { cancelAnimationFrame(trimRaf); trimRaf = 0; }\n    var batch = trimQueue;\n    trimQueue = [];\n    var jobs = [];\n    batch.forEach(function (img) {\n      if (img.__logoDone) { return; }\n      var well = img.closest(LOGO_WELLS);\n      if (!well) { return; }\n      var box = logoBox(img);\n      if (!box) { return; }                                /* unreadable: leave it */\n      img.__logoDone = true;\n      img.__logoBox = box;\n      if (box.light) { darkenWell(well); }\n      if (!box.keep) { jobs.push({ img: img, well: well, box: box, key: well.className }); }\n    });\n    if (!jobs.length) { return; }\n\n    /* READ: every slot height, in one layout */\n    jobs.forEach(function (j) { j.slotH = j.img.getBoundingClientRect().height; });\n\n    /* A kind of well not seen yet: hide those images together, read the\n       wells, restore. A well that holds its size without the image is a TILE;\n       one that collapses is sized BY the image. Its CONTENT size counts:\n       padding and borders alone are not a tile. A width threshold once misread\n       the phone's 56px collection thumbnail as a text line and cropped\n       AUTOBEAD to \"OB\"; a well whose height is only its image (the product\n       page's brand band) has no height of its own and is sized by height. */\n    var probe = jobs.filter(function (j) { return !Object.prototype.hasOwnProperty.call(wellModes, j.key); });\n    probe.forEach(function (j) { j.prev = j.img.style.display; j.img.style.display = 'none'; });\n    probe.forEach(function (j) {\n      var wcs = getComputedStyle(j.well), r = j.well.getBoundingClientRect();\n      var emptyW = r.width - parseFloat(wcs.paddingLeft) - parseFloat(wcs.paddingRight) -\n        parseFloat(wcs.borderLeftWidth) - parseFloat(wcs.borderRightWidth);\n      var emptyH = r.height - parseFloat(wcs.paddingTop) - parseFloat(wcs.paddingBottom) -\n        parseFloat(wcs.borderTopWidth) - parseFloat(wcs.borderBottomWidth);\n      var mode = emptyW > 16 && emptyH >= 12 ? 'fill' : 'height';\n      /* a well hidden by a filter measures 0 wide; one with its own aspect\n         ratio is still a tile */\n      if (mode === 'height' && wcs.aspectRatio && wcs.aspectRatio !== 'auto') { mode = 'fill'; }\n      j.mode = mode;\n      j.seen = r.width > 0;                                /* only a drawn well teaches its kind */\n    });\n    probe.forEach(function (j) {\n      j.img.style.display = j.prev;\n      if (j.seen && !Object.prototype.hasOwnProperty.call(wellModes, j.key)) { wellModes[j.key] = j.mode; }\n    });\n\n    /* WRITE: each mark goes into its clip */\n    jobs.forEach(function (j) {\n      var img = j.img;\n      img.__logoMode = j.mode || wellModes[j.key];\n      img.__logoSlotH = j.slotH;\n      var clip = document.createElement('span');\n      clip.className = 'tdhq-logo-clip';\n      img.parentNode.insertBefore(clip, img);\n      clip.appendChild(img);\n      img.classList.add('tdhq-logo-trimmed');\n      if (j.box.plate) {\n        clip.parentNode.style.backgroundColor = j.box.plate;\n        clip.parentNode.classList.add('is-plate-logo');\n      }\n    });\n\n    /* READ every fit, then WRITE every placement */\n    var fits = jobs.map(function (j) { return fitLogo(j.img); });\n    jobs.forEach(function (j, i) { if (fits[i]) { placeLogo(j.img, fits[i]); } });\n  }\n\n  function initLogoTrim(scope) {\n    var imgs = (scope || document).querySelectorAll(\n      '[data-brand-logo-well] img, .dtc-brands__logo img');\n    Array.prototype.forEach.call(imgs, function (img) {\n      if (img.complete && img.naturalWidth) { queueTrim(img); }\n      else { img.addEventListener('load', function () { queueTrim(img); }, { once: true }); }\n    });\n    /* the logos already loaded are trimmed now, as before, not a frame\n       later: one batch for all of them */\n    flushTrims();\n    if (!initLogoTrim._bound) {\n      initLogoTrim._bound = true;\n      /* tiles change width with the viewport, so FILL marks re-fit - all\n         measured first, then all placed */\n      onWidth(coalesced(function () {\n        var done = Array.prototype.filter.call(document.querySelectorAll('img.tdhq-logo-trimmed'), function (im) { return im.__logoMode === 'fill'; });\n        var fits = done.map(fitLogo);\n        done.forEach(function (im, i) { if (fits[i]) { placeLogo(im, fits[i]); } });\n      }));\n    }\n  }\n\n  /* Every horizontal rail on the site, in one list. A rail that is missing\n     from it behaves differently from its neighbours, which is exactly what\n     the client keeps reporting. */\n  var RAIL_SELECTOR = '.dtc-track--slider, .dtc-grid--rail, [data-dtc-drag],' +\n    '.tdhq-cards--rail, .tdhq-cards--rail-phone, .dtc-blog__grid--rail,' +\n    '.tdhq-artrel__grid, .tdhq-related, .tdhq-brandcat__rail, .tdhq-fbrands__track, .tdhq-steps,' +\n    '.dtc-icongrid__row, .dtc-cart__recslist';\n  /* NOT rails, and deliberately left alone: the announcement marquee\n     (.tdhq-announce__track, which scrolls itself), the hero slider\n     (.dtc-hero__track, its own arrows and dots) and the product gallery\n     thumbnails (.dtc-pdp__thumbs, driven by the stage arrows). */\n\n  function initDragRails(scope) {\n    var root = scope || document;\n    root.querySelectorAll(RAIL_SELECTOR).forEach(initDragScroll);\n    root.querySelectorAll(RAIL_SELECTOR).forEach(initRailAffordance);\n    /* A card grid can also become a phone rail in CSS alone: the store\n       information and \"What you will find\" cards, Contact's ways to reach us\n       and Track an Order's common problems are made rails by their section ids\n       in tdhq-fix-service.css and carry no rail class. At 390 they scrolled\n       sideways with a card cut at the edge and nothing saying the row moves,\n       beside rails that had the bar and arrows (2026-09-23). They are found by\n       what they do - scroll sideways - and get the same drag and footer. */\n    root.querySelectorAll('.tdhq-cards').forEach(function (el) {\n      var ox = window.getComputedStyle(el).overflowX;\n      if (ox === 'auto' || ox === 'scroll') { initDragScroll(el); initRailAffordance(el); }\n    });\n  }\n\n  /* THE SAME PULL AFFORDANCE ON EVERY RAIL. The product rails ship a footer\n     with a position bar and a pair of arrows; nine other rails shipped\n     nothing, so a row that can be dragged looked like a row that was simply\n     cut off. The footer is built here, from the same classes, for any rail\n     that scrolls and does not already have one (a carousel section builds its\n     own, and is left alone). */\n  function initRailAffordance(track) {\n    if (!track || track.dataset.dtcRailUi) { return; }\n    if (track.closest('[data-dtc-carousel]')) { return; }\n    var host = track.parentElement;\n    if (!host || host.querySelector('[data-dtc-railbar]')) { return; }\n    track.dataset.dtcRailUi = '1';\n\n    var foot = document.createElement('div');\n    foot.className = 'dtc-railfoot dtc-railfoot--auto';\n    var bar = document.createElement('div');\n    bar.className = 'dtc-railbar';\n    bar.setAttribute('data-dtc-railbar', '');\n    var thumb = document.createElement('span');\n    thumb.className = 'dtc-railbar__thumb';\n    bar.appendChild(thumb);\n    var nav = document.createElement('div');\n    nav.className = 'dtc-slider__nav dtc-carousel__nav';\n    function arrow(dir, label) {\n      var b = document.createElement('button');\n      b.type = 'button';\n      b.className = 'dtc-slider__btn';\n      b.setAttribute('aria-label', label);\n      /* the same arrow every section-built rail draws (layout/theme.liquid holds\n         it in a template); the hand-drawn chevron is only the fallback */\n      var tpl = document.getElementById('dtc-rail-arrow');\n      if (tpl && tpl.content && tpl.content.firstElementChild) {\n        var ic = tpl.content.firstElementChild.cloneNode(true);\n        if (dir < 0) { ic.classList.add('dtc-flip'); }\n        b.appendChild(ic);\n      } else {\n        b.innerHTML = '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">' +\n          '<path d=\"' + (dir < 0 ? 'M15 5l-7 7 7 7' : 'M9 5l7 7-7 7') + '\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n      }\n      b.addEventListener('click', function () {\n        var card = track.children[0];\n        var step = card ? card.getBoundingClientRect().width + 24 : track.clientWidth * 0.8;\n        track.scrollBy({ left: dir * step, behavior: reduce ? 'auto' : 'smooth' });\n      });\n      return b;\n    }\n    var prev = arrow(-1, 'Previous');\n    var next = arrow(1, 'Next');\n    nav.appendChild(prev);\n    nav.appendChild(next);\n    foot.appendChild(bar);\n    foot.appendChild(nav);\n    if (track.nextSibling) { host.insertBefore(foot, track.nextSibling); } else { host.appendChild(foot); }\n\n    var paint = frameJob(function () {\n      return { sw: track.scrollWidth, cw: track.clientWidth, left: track.scrollLeft, barW: bar.clientWidth };\n    }, function (m) {\n      var max = m.sw - m.cw;\n      var wasHidden = foot.hidden;\n      foot.hidden = max <= 4;\n      if (max <= 4) { return; }\n      /* the bar was measured inside a hidden footer: measure it again shown */\n      if (wasHidden) { paint(); return; }\n      var w = Math.max(28, Math.round(m.barW * (m.cw / m.sw)));\n      thumb.style.width = w + 'px';\n      thumb.style.transform = 'translateX(' + Math.round((m.barW - w) * Math.min(1, Math.max(0, m.left / max))) + 'px)';\n      prev.disabled = m.left <= 2;\n      next.disabled = m.left >= max - 2;\n    });\n    track.addEventListener('scroll', paint, { passive: true });\n    onWidth(paint);\n    if ('ResizeObserver' in window) { new ResizeObserver(paint).observe(track); }\n    paint();\n  }\n\n  /* ---- hero slider: arrows, dots, optional autoplay. Autoplay\n     pauses on hover/touch and hidden tabs, and stays off in the\n     theme editor and under reduced-motion. ---- */\n  function initHeroSlider(root) {\n    if (!root || root.dataset.dtcHero) { return; }\n    root.dataset.dtcHero = '1';\n    var track = root.querySelector('[data-dtc-hero-track]');\n    if (!track) { return; }\n\n    /* The pictures for slides 2 and up carry their source in data attributes\n       so they are not fetched while the FIRST slide - the largest thing on\n       the page - is still arriving. They are filled in at the visitor's first\n       touch, scroll, key or mouse move (21 Oct, speed: a page nobody has touched\n       does not fetch two more large pictures while it loads), and carry their\n       size so the browser reserves the box. */\n    var laterSlots = Array.prototype.slice.call(root.querySelectorAll('[data-dtc-hero-img][data-src]'));\n    function loadLaterSlides() {\n      if (!laterSlots.length) { return; }\n      laterSlots.forEach(function (slot) {\n        var img = document.createElement('img');\n        img.className = 'dtc-hero__img';\n        img.alt = slot.getAttribute('data-alt') || '';\n        img.loading = 'lazy';\n        img.decoding = 'async';\n        if (slot.getAttribute('data-w') && slot.getAttribute('data-h')) {\n          img.width = parseInt(slot.getAttribute('data-w'), 10);\n          img.height = parseInt(slot.getAttribute('data-h'), 10);\n        }\n        if (slot.getAttribute('data-sizes')) { img.sizes = slot.getAttribute('data-sizes'); }\n        if (slot.getAttribute('data-srcset')) { img.srcset = slot.getAttribute('data-srcset'); }\n        img.src = slot.getAttribute('data-src');\n        slot.parentNode.replaceChild(img, slot);\n      });\n      laterSlots = [];\n    }\n    /* the visitor's first touch, scroll, key or mouse move anywhere on the page, once */\n    var woke = false, wakeFns = [];\n    var wakeEvents = ['pointerdown', 'pointermove', 'touchstart', 'keydown', 'wheel', 'scroll'];\n    function wake() {\n      if (woke) { return; }\n      woke = true;\n      wakeEvents.forEach(function (ev) { window.removeEventListener(ev, wake, true); });\n      wakeFns.forEach(function (fn) { fn(); });\n    }\n    wakeEvents.forEach(function (ev) { window.addEventListener(ev, wake, { capture: true, passive: true }); });\n    wakeFns.push(loadLaterSlides);\n    var prev = root.querySelector('[data-dtc-hero-prev]');\n    var next = root.querySelector('[data-dtc-hero-next]');\n    var dots = Array.prototype.slice.call(root.querySelectorAll('[data-dtc-hero-dot]'));\n    var count = track.children.length;\n\n    function index() {\n      return Math.round(track.scrollLeft / track.clientWidth);\n    }\n\n    function go(i) {\n      var target = Math.max(0, Math.min(count - 1, i));\n      track.scrollTo({ left: target * track.clientWidth, behavior: reduce ? 'auto' : 'smooth' });\n    }\n\n    var update = frameJob(index, function (i) {\n      dots.forEach(function (d, n) { d.classList.toggle('is-active', n === i); });\n    });\n\n    if (prev) { prev.addEventListener('click', function () { go(index() - 1); }); }\n    if (next) { next.addEventListener('click', function () { go(index() + 1); }); }\n    dots.forEach(function (d) {\n      d.addEventListener('click', function () { go(parseInt(d.getAttribute('data-dtc-hero-dot'), 10)); });\n    });\n    track.addEventListener('scroll', update, { passive: true });\n    onWidth(update);\n    update();\n\n    var interval = parseInt(root.getAttribute('data-dtc-hero-autoplay'), 10);\n    if (!interval || reduce) { return; }\n    if (window.Shopify && window.Shopify.designMode) { return; }\n    var paused = false;\n    root.addEventListener('pointerenter', function () { paused = true; });\n    root.addEventListener('pointerleave', function () { paused = false; });\n    root.addEventListener('pointerdown', function () { paused = true; }, { passive: true });\n    /* rotation starts with the visitor's first touch, scroll, key or mouse move (21 Oct, speed) */\n    function startAuto() {\n      var heroTimer = setInterval(function () {\n        if (!root.isConnected) { clearInterval(heroTimer); return; }\n        if (paused || document.hidden || reduce || root.contains(document.activeElement)) { return; }\n        var i = index();\n        go(i >= count - 1 ? 0 : i + 1);\n      }, interval);\n    }\n    if (woke) { startAuto(); } else { wakeFns.push(startAuto); }\n  }\n\n  /* ---- FAQ groups: smooth animated open/close. Several answers may be open at\n     once by default, the rule every FAQ on the site follows (the FAQ page, the\n     help-page FAQs; client: \"in some parts if you open one faq another will close\n     in another part of the website you can open all of them\"). A section can opt\n     into one-at-a-time with data-dtc-acc-single=\"true\". The product page FAQ is\n     one-at-a-time (client 2026-09-25: \"if you open one another should close\").\n     Closing the open sibling instantly made the tapped question jump 84px up\n     before it opened (2026-09-23), so initAccordion holds the tapped question\n     where it was: it measures it before and after and scrolls the difference.\n     Reduced-motion + no-JS fall back to the native instant toggle. The height is animated in JS (native <details> can't tween\n     auto), the +/x mark rotation is CSS. ---- */\n  function accCancel(d) { if (d._accAnim) { try { d._accAnim.cancel(); } catch (e) {} d._accAnim = null; } }\n  function accExpand(d, panel) {\n    accCancel(d);\n    d.dataset.accAnim = '1';\n    d.open = true;                 /* must be open to render + measure */\n    var target = panel.scrollHeight;\n    if (!panel.animate) { delete d.dataset.accAnim; return; }\n    var a = panel.animate(\n      [{ height: '0px', opacity: 0 }, { height: target + 'px', opacity: 1 }],\n      { duration: (window.TdhqMotion ? window.TdhqMotion.ms('--tdhq-t', 220) : 220), easing: (window.TdhqMotion ? window.TdhqMotion.easing() : 'cubic-bezier(0.4, 0, 0.2, 1)') }\n    );\n    d._accAnim = a;\n    a.onfinish = function () { d._accAnim = null; delete d.dataset.accAnim; };\n    a.oncancel = function () { delete d.dataset.accAnim; };\n  }\n  function accCollapse(d, panel) {\n    if (!panel) { d.open = false; return; }\n    accCancel(d);\n    d.dataset.accAnim = '1';\n    var start = panel.offsetHeight;\n    if (!panel.animate) { d.open = false; delete d.dataset.accAnim; return; }\n    var a = panel.animate(\n      [{ height: start + 'px', opacity: 1 }, { height: '0px', opacity: 0 }],\n      { duration: (window.TdhqMotion ? window.TdhqMotion.ms('--tdhq-t', 220) : 220), easing: (window.TdhqMotion ? window.TdhqMotion.easing() : 'cubic-bezier(0.4, 0, 0.2, 1)') }\n    );\n    d._accAnim = a;\n    a.onfinish = function () { d.open = false; d._accAnim = null; delete d.dataset.accAnim; };\n    a.oncancel = function () { delete d.dataset.accAnim; };\n  }\n  function accReset(o) { /* instant-close a sibling so only the clicked item animates */\n    accCancel(o);\n    o.open = false;\n    delete o.dataset.accAnim;\n  }\n  function initAccordion(group) {\n    if (!group || group.dataset.dtcAcc) { return; }\n    group.dataset.dtcAcc = '1';\n    var single = group.getAttribute('data-dtc-acc-single') === 'true';\n    /* data-dtc-acc-inplace (U.60, the product FAQ beside HQ Suggests): the page never scrolls, so nothing beside\n       the list moves. An open answer ON SCREEN closes in place with its animation; one OFF SCREEN is left open,\n       because closing it unseen is what forced the page to move. Still one answer open in view. */\n    var inplace = group.hasAttribute('data-dtc-acc-inplace');\n    function onScreen(o) {\n      var r = o.getBoundingClientRect();\n      var top = parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--tdhq-sticky-h')) || 0;\n      return r.bottom > top && r.top < window.innerHeight;\n    }\n    group.querySelectorAll('details.dtc-acc__item').forEach(function (d) {\n      var summary = d.querySelector('summary');\n      var panel = d.querySelector('.dtc-acc__a');\n      if (!summary || !panel) { return; }\n      /* CLAIM IT. initDisclosures() binds its own open/close handler to any\n         <details> not carrying this attribute; with two handlers on one\n         summary the second reads the state the first just set and closes the\n         item again. This item has a controller - hands off. */\n      d.setAttribute('data-dtc-disc', '1');\n      summary.addEventListener('click', function (e) {\n        if (reduce) { /* let the native toggle run; still enforce single-open */\n          if (!d.open && single) {\n            var ry = summary.getBoundingClientRect().top, rshown = false;\n            group.querySelectorAll('details.dtc-acc__item[open]').forEach(function (o) {\n              if (o === d) { return; }\n              if (inplace) { rshown = true; if (onScreen(o)) { o.open = false; } return; }\n              o.open = false;\n            });\n            var rdy = summary.getBoundingClientRect().top - ry;\n            if (rdy && !rshown) { window.scrollBy({ top: rdy, behavior: 'instant' }); }\n          }\n          return;\n        }\n        e.preventDefault();\n        if (d.dataset.accAnim) { return; }\n        if (d.open) {\n          accCollapse(d, panel);\n        } else {\n          /* single-open: close the others INSTANTLY. Animating a collapse and an\n             expand at the same time reflows the whole list every frame and makes\n             the open item visibly stumble - one animation at a time is smooth. */\n          if (single) {\n            var y0 = summary.getBoundingClientRect().top, shown = false;\n            group.querySelectorAll('details.dtc-acc__item[open]').forEach(function (o) {\n              if (o === d) { return; }\n              if (inplace) { shown = true; if (onScreen(o)) { accCollapse(o, o.querySelector('.dtc-acc__a')); } return; }\n              accReset(o);\n            });\n            var dy = summary.getBoundingClientRect().top - y0;\n            if (dy && !shown) { window.scrollBy({ top: dy, behavior: 'instant' }); }\n          }\n          accExpand(d, panel);\n        }\n      });\n    });\n  }\n\n  /* ---- scroll reveal: fade below-fold blocks up as they enter.\n     Hidden state exists only under html.dtc-reveal-on, so no-JS\n     never hides content. No blanket timer fail-safe: a timer that\n     pre-reveals off-screen sections kills the animation for anyone\n     who pauses before scrolling; the capability guards below are\n     the safety net. Theme editor always shows everything. ---- */\n  function initReveal() {\n    if (reduce || !('IntersectionObserver' in window)) { return; }\n    /* NOT IN THE PHONE LAYOUT (client, 25 Sep 2026: \"animations scroll down and\n       up is terrible\"). Scrolling a phone at thumb speed, whole sections arrived\n       blank and faded in behind the finger: up to 74% of the screen blank or\n       mid-fade on the home page (vis/phone-blank.cjs). Up to 899px, the phone\n       layout's breakpoint, content is simply there. */\n    if (window.matchMedia && window.matchMedia('(max-width: 899px)').matches) { return; }\n    if (window.__dtcAnimOff) { return; }\n    if (window.Shopify && window.Shopify.designMode) { return; }\n    /* EVERY SECTION REVEALS, not only those whose markup opted in (audit\n       REQ-ANIM-01: the tdhq- sections never did). A section already holding\n       its own reveal or entrance keeps it; one already on screen at load is\n       left exactly as it is by the pass below. */\n    document.querySelectorAll('#MainContent > .shopify-section').forEach(function (s) {\n      if (s.querySelector('.dtc-reveal, [data-dtc-appear]')) { return; }\n      var f = s.firstElementChild;\n      while (f && /^(SCRIPT|STYLE|TEMPLATE|LINK)$/.test(f.tagName)) { f = f.nextElementSibling; }\n      if (f && !f.matches('dialog, [hidden]')) { f.classList.add('dtc-reveal'); }\n    });\n    var all = document.querySelectorAll('.dtc-reveal:not([data-dtc-revealed])');\n    if (!all.length) { return; }\n    /* A CARD INSIDE A HORIZONTAL RAIL SCROLLS SIDEWAYS, NOT DOWN, and this\n       observer watches the VIEWPORT: a card past the rail's right edge never\n       intersects it, so it stayed at opacity 0 for the life of the page and\n       then faded in under the finger as soon as the rail was dragged\n       (measured on the homepage: 22 of 80 reveal elements, four rails). A\n       card in a rail is marked done and left visible; the rail itself may\n       still reveal as a whole. */\n    /* A BAND WITH ITS OWN DARK COLOUR IS SIMPLY THERE (21 Oct 2026). Faded from opacity 0, a black band let the\n       white page ground show through and flashed white before going dark. Light bands still fade in over the\n       white ground. Colours read for every element first, then the writes below. */\n    var dark = Array.prototype.map.call(all, function (el) {\n      var m = (window.getComputedStyle(el).backgroundColor || '').match(/[\\d.]+/g);\n      if (!m || m.length < 3 || (m.length > 3 && Number(m[3]) < 0.5)) { return false; }\n      return 0.2126 * m[0] + 0.7152 * m[1] + 0.0722 * m[2] < 128;\n    });\n    var els = Array.prototype.filter.call(all, function (el, i) {\n      if (dark[i]) {\n        el.setAttribute('data-dtc-revealed', '1');\n        el.classList.add('is-in');\n        return false;\n      }\n      var rail = el.parentElement && el.parentElement.closest\n        ? el.parentElement.closest('.dtc-track--slider, .dtc-grid--rail, [data-dtc-track]')\n        : null;\n      if (!rail) { return true; }\n      el.setAttribute('data-dtc-revealed', '1');\n      el.classList.add('is-in');\n      return false;\n    });\n    if (!els.length) { return; }\n    document.documentElement.classList.add('dtc-reveal-on');\n    /* reuse ONE observer across re-inits (shopify:section:load) so we don't leak a new one each time */\n    if (!initReveal._io) {\n      initReveal._io = new IntersectionObserver(function (entries) {\n        entries.forEach(function (entry) {\n          if (!entry.isIntersecting) { return; }\n          var el = entry.target;\n          el.classList.add('is-in');\n          initReveal._io.unobserve(el);\n          /* AND THEN LET GO. While .is-pending is on the element it owns the\n             whole `transition` shorthand (opacity and transform, 550ms), so\n             the card's own hover lift never ran - every card carrying\n             .dtc-reveal measured 0px of lift at 550ms instead of 2-3px at\n             160-220ms. Once the entrance has played the class comes off and\n             the element goes back to being an ordinary card. */\n          var release = function () { el.classList.remove('is-pending'); };\n          el.addEventListener('transitionend', release, { once: true });\n          window.setTimeout(release, 900);\n        });\n      }, { rootMargin: '0px 0px -10% 0px' });\n    }\n    var io = initReveal._io;\n    /* Two passes on purpose: adding .is-in sets `transform: none`, and getBoundingClientRect\n       reflects transforms \u2014 so interleaving the reads and writes would force a synchronous\n       layout flush per element. Read every rect first, then write. */\n    var vh = window.innerHeight;\n    var rects = [];\n    els.forEach(function (el) { rects.push(el.getBoundingClientRect()); });\n    els.forEach(function (el, i) {\n      el.setAttribute('data-dtc-revealed', '1');\n      var r = rects[i];\n      /* ALREADY ON SCREEN: leave it exactly as it is. It is not given the\n         pending class, so it is never hidden and never transitions - the\n         shopper is looking straight at it. */\n      if (r.top < vh && r.bottom > 0) {\n        el.classList.add('is-in');\n      } else {\n        /* Below the fold: hide it, then reveal it when it is scrolled to. */\n        el.classList.add('is-pending');\n        io.observe(el);\n      }\n    });\n  }\n\n  /* The enquiry popup's opener, focus trap and booking submit were removed\n     on 2026-09-23 (build report DC-11): the popup's sections were deleted and\n     #dtc-enquiry exists on no page. */\n  /* ---- back to top: appears after scrolling, smooth return ---- */\n  function initBackToTop() {\n    if (document.body.dataset.dtcTop) { return; }\n    document.body.dataset.dtcTop = '1';\n    var btn = document.createElement('button');\n    btn.type = 'button';\n    btn.className = 'dtc-backtotop';\n    btn.setAttribute('aria-label', 'Back to top');\n    document.body.appendChild(btn);\n    var check = frameJob(function () { return window.scrollY; }, function (y) {\n      btn.classList.toggle('is-visible', y > 600);\n    });\n    window.addEventListener('scroll', check, { passive: true });\n    btn.addEventListener('click', function () {\n      window.scrollTo({ top: 0, behavior: reduce ? 'auto' : 'smooth' });\n    });\n    check();\n  }\n\n  /* ---- tap-to-unmute for autoplaying videos. Only the button\n     itself toggles sound - the click never bubbles into the tile,\n     so it cannot open the lightbox or anything else. ---- */\n  function initVideoSound() {\n    if (document.body.dataset.dtcVideoSoundInit) { return; }\n    document.body.dataset.dtcVideoSoundInit = '1';\n    document.addEventListener('click', function (e) {\n      var btn = e.target.closest('button[data-dtc-video-sound]');\n      if (!btn) { return; }\n      e.preventDefault();\n      e.stopPropagation();\n      var scope = btn.parentElement;\n      var video = scope ? scope.querySelector('video') : null;\n      if (!video) { return; }\n      video.muted = !video.muted;\n      btn.classList.toggle('is-on', !video.muted);\n      if (!video.muted) { video.play().catch(function () {}); }\n    }, true);\n  }\n\n  /* ---- viewport-driven video playback. Our videos ship with NO\n     autoplay and preload=\"none\" so they never touch the network until\n     they are actually near the screen (this is what stops video-heavy\n     pages hanging/spinning on load). Here we play them only while\n     visible and pause + free the network when they scroll away. ---- */\n  function initVideoPlayback() {\n    if (document.body.dataset.dtcVideoPlayInit) { return; }\n    document.body.dataset.dtcVideoPlayInit = '1';\n    var videos = document.querySelectorAll('video.dtc-video');\n    if (!videos.length) { return; }\n    if (!('IntersectionObserver' in window)) {\n      if (!reduce) { videos.forEach(function (v) { try { v.play().catch(function () {}); } catch (e) {} }); }\n      return;\n    }\n    var io = new IntersectionObserver(function (entries) {\n      entries.forEach(function (entry) {\n        var v = entry.target;\n        if (entry.isIntersecting) {\n          if (v.getAttribute('preload') === 'none') { v.preload = 'metadata'; }\n          if (reduce) { return; /* reduced motion: load a still frame, no playback */ }\n          if (v.readyState === 0) { v.load(); }\n          v.play().catch(function () {});\n        } else if (!v.paused) {\n          v.pause();\n        }\n      });\n    }, { rootMargin: '150px 0px', threshold: 0.2 });\n    videos.forEach(function (v) { io.observe(v); });\n  }\n\n  /* ---- live Instagram feed (Graph API). When the section has a\n     token, fetch the latest posts and reels and replace the curated\n     tiles; reels render as muted looping videos. Tiles are built\n     with DOM methods (no HTML interpolation). Any failure keeps the\n     curated tiles - never a broken section. ---- */\n  var IG_GLYPH = '<rect width=\"20\" height=\"20\" x=\"2\" y=\"2\" rx=\"5\" ry=\"5\"/><path d=\"M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z\"/><line x1=\"17.5\" x2=\"17.51\" y1=\"6.5\" y2=\"6.5\"/>';\n\n  function igTile(post) {\n    var a = document.createElement('a');\n    a.className = 'dtc-insta__item';\n    a.href = post.permalink;\n    a.target = '_blank';\n    a.rel = 'noopener';\n    a.setAttribute('aria-label', 'View on Instagram');\n    var media;\n    if (post.media_type === 'VIDEO') {\n      media = document.createElement('video');\n      media.src = post.media_url;\n      if (post.thumbnail_url) { media.poster = post.thumbnail_url; }\n      media.muted = true;\n      media.autoplay = true;\n      media.loop = true;\n      media.playsInline = true;\n      media.preload = 'metadata';\n    } else {\n      media = document.createElement('img');\n      media.src = post.media_url;\n      media.alt = 'DTC on Instagram';\n      media.loading = 'lazy';\n    }\n    a.appendChild(media);\n    var overlay = document.createElement('span');\n    overlay.className = 'dtc-insta__overlay';\n    var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    svg.setAttribute('width', '26');\n    svg.setAttribute('height', '26');\n    svg.setAttribute('viewBox', '0 0 24 24');\n    svg.setAttribute('fill', 'none');\n    svg.setAttribute('stroke', 'currentColor');\n    svg.setAttribute('stroke-width', '1.5');\n    svg.innerHTML = IG_GLYPH; /* constant markup, not user data */\n    overlay.appendChild(svg);\n    a.appendChild(overlay);\n    return a;\n  }\n\n  function initInstaFeed() {\n    document.querySelectorAll('[data-dtc-ig-token]').forEach(function (grid) {\n      if (grid.dataset.dtcIgDone) { return; }\n      grid.dataset.dtcIgDone = '1';\n      var token = grid.getAttribute('data-dtc-ig-token');\n      var limit = parseInt(grid.getAttribute('data-dtc-ig-limit'), 10) || 8;\n      if (!token) { return; }\n      var url = 'https://graph.instagram.com/me/media?fields=id,media_type,media_url,thumbnail_url,permalink&limit=' + limit + '&access_token=' + encodeURIComponent(token);\n      fetch(url)\n        .then(function (r) { if (!r.ok) { throw new Error('IG ' + r.status); } return r.json(); })\n        .then(function (data) {\n          if (!data.data || !data.data.length) { return; }\n          var frag = document.createDocumentFragment();\n          data.data.slice(0, limit).forEach(function (post) {\n            if (!post.media_url || !post.permalink) { return; }\n            frag.appendChild(igTile(post));\n          });\n          if (frag.childNodes.length) {\n            grid.textContent = '';\n            grid.appendChild(frag);\n          }\n        })\n        .catch(function (err) {\n          if (window.console) { console.warn('DTC Instagram feed unavailable:', err.message); }\n        });\n    });\n  }\n\n  /* ---- gallery lightbox: click any tile to view it full size with\n     left/right navigation, keyboard arrows and captions. Videos play\n     with controls. \"View full gallery\" buttons open at the first\n     item. Built once, reused by every gallery on the page. ---- */\n  var lightbox = null;\n\n  function buildLightbox() {\n    if (lightbox) { return lightbox; }\n    var root = document.createElement('div');\n    root.className = 'dtc dtc-lightbox';\n    root.hidden = true;\n    root.setAttribute('role', 'dialog');\n    root.setAttribute('aria-modal', 'true');\n    root.setAttribute('aria-label', 'Gallery viewer');\n\n    var backdrop = document.createElement('div');\n    backdrop.className = 'dtc-lightbox__backdrop';\n    var stage = document.createElement('div');\n    stage.className = 'dtc-lightbox__stage';\n    var media = document.createElement('div');\n    media.className = 'dtc-lightbox__media';\n    var caption = document.createElement('div');\n    caption.className = 'dtc-lightbox__caption';\n    var count = document.createElement('span');\n    count.className = 'dtc-lightbox__count';\n\n    function navBtn(cls, label) {\n      var b = document.createElement('button');\n      b.type = 'button';\n      b.className = 'dtc-lightbox__btn ' + cls;\n      b.setAttribute('aria-label', label);\n      return b;\n    }\n    var prev = navBtn('dtc-lightbox__btn--prev', 'Previous');\n    var next = navBtn('dtc-lightbox__btn--next', 'Next');\n    var close = navBtn('dtc-lightbox__btn--close', 'Close');\n\n    stage.appendChild(media);\n    stage.appendChild(caption);\n    root.appendChild(backdrop);\n    root.appendChild(stage);\n    root.appendChild(prev);\n    root.appendChild(next);\n    root.appendChild(close);\n    root.appendChild(count);\n    document.body.appendChild(root);\n\n    var items = [];\n    var index = 0;\n\n    function show(i) {\n      if (!items.length) { return; }\n      index = (i + items.length) % items.length;\n      var item = items[index];\n      media.textContent = '';\n      var el;\n      if (item.video) {\n        el = document.createElement('video');\n        var src = document.createElement('source');\n        src.src = item.video;\n        el.appendChild(src);\n        el.controls = true;\n        el.autoplay = true;\n        el.playsInline = true;\n        /* Muted: opening a gallery item never switches sound on by itself\n           (client: videos \"play without sound and if you want you can turn\n           it on\"; REQ-VID-01). The controls carry the sound. */\n        el.muted = true;\n      } else {\n        el = document.createElement('img');\n        el.src = item.src;\n        el.alt = item.title || 'Gallery image';\n      }\n      media.appendChild(el);\n      caption.textContent = '';\n      if (item.accent) {\n        var a = document.createElement('span');\n        a.className = 'dtc-lightbox__accent';\n        a.textContent = item.accent;\n        caption.appendChild(a);\n      }\n      if (item.title) {\n        var t = document.createElement('span');\n        t.className = 'dtc-lightbox__title';\n        t.textContent = item.title;\n        caption.appendChild(t);\n      }\n      if (item.text) {\n        var x = document.createElement('span');\n        x.className = 'dtc-lightbox__text';\n        x.textContent = item.text;\n        caption.appendChild(x);\n      }\n      count.textContent = (index + 1) + ' / ' + items.length;\n      prev.hidden = next.hidden = items.length < 2;\n    }\n\n    function openAt(list, i) {\n      items = list;\n      root.hidden = false;\n      document.documentElement.classList.add('dtc-lightbox-open');\n      show(i);\n    }\n\n    function shut() {\n      root.hidden = true;\n      media.textContent = ''; /* stops any playing video */\n      document.documentElement.classList.remove('dtc-lightbox-open');\n    }\n\n    prev.addEventListener('click', function () { show(index - 1); });\n    next.addEventListener('click', function () { show(index + 1); });\n    close.addEventListener('click', shut);\n    backdrop.addEventListener('click', shut);\n    document.addEventListener('keydown', function (e) {\n      if (root.hidden) { return; }\n      if (e.key === 'Escape') { shut(); }\n      if (e.key === 'ArrowLeft') { show(index - 1); }\n      if (e.key === 'ArrowRight') { show(index + 1); }\n    });\n\n    lightbox = { openAt: openAt, shut: shut };\n    return lightbox;\n  }\n\n  function galleryItems(gallery) {\n    var list = [];\n    gallery.querySelectorAll('.dtc-gallery__item:not([hidden])').forEach(function (fig) {\n      var m = fig.querySelector('.dtc-gallery__media');\n      if (!m) { return; }\n      var video = m.querySelector('video source');\n      var img = m.querySelector('img');\n      list.push({\n        video: video ? video.src : null,\n        src: fig.getAttribute('data-dtc-full') || (img ? (img.currentSrc || img.src) : ''),\n        accent: fig.getAttribute('data-dtc-accent') || '',\n        title: fig.getAttribute('data-dtc-title') || '',\n        text: fig.getAttribute('data-dtc-text') || ''\n      });\n    });\n    return list;\n  }\n\n  /* ---- service page media: thumbnails swap the main image ---- */\n  function initServiceMedia() {\n    if (document.body.dataset.dtcServiceMediaInit) { return; }\n    document.body.dataset.dtcServiceMediaInit = '1';\n\n    function setActive(gallery, idx) {\n      var slides = gallery.querySelectorAll('[data-dtc-slide]');\n      if (!slides.length) { return; }\n      idx = ((idx % slides.length) + slides.length) % slides.length;\n      slides.forEach(function (s) { s.classList.toggle('is-active', parseInt(s.getAttribute('data-dtc-slide'), 10) === idx); });\n      gallery.querySelectorAll('[data-dtc-thumb]').forEach(function (t) { t.classList.toggle('is-active', parseInt(t.getAttribute('data-dtc-thumb'), 10) === idx); });\n      var cur = gallery.querySelector('[data-dtc-gcur]');\n      if (cur) { cur.textContent = idx + 1; }\n      gallery.setAttribute('data-dtc-idx', idx);\n      var at = gallery.querySelector('[data-dtc-thumb].is-active');\n      if (at && at.scrollIntoView) { at.scrollIntoView({ inline: 'nearest', block: 'nearest', behavior: window.tdhqMotion.behavior() }); }\n    }\n\n    document.addEventListener('click', function (e) {\n      var thumb = e.target.closest('[data-dtc-thumb]');\n      var prev = e.target.closest('[data-dtc-gprev]');\n      var next = e.target.closest('[data-dtc-gnext]');\n      if (!thumb && !prev && !next) { return; }\n      var gallery = e.target.closest('[data-dtc-gallery]');\n      if (!gallery) { return; }\n      e.preventDefault();\n      e.stopPropagation();\n      var idx = parseInt(gallery.getAttribute('data-dtc-idx') || '0', 10);\n      if (thumb) { idx = parseInt(thumb.getAttribute('data-dtc-thumb'), 10); }\n      else if (prev) { idx = idx - 1; }\n      else { idx = idx + 1; }\n      setActive(gallery, idx);\n    }, true);\n\n    document.addEventListener('keydown', function (e) {\n      if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') { return; }\n      var gallery = document.querySelector('[data-dtc-gallery]:hover');\n      if (!gallery) { return; }\n      var idx = parseInt(gallery.getAttribute('data-dtc-idx') || '0', 10);\n      setActive(gallery, e.key === 'ArrowLeft' ? idx - 1 : idx + 1);\n    });\n  }\n\n  function initGalleries() {\n    if (document.body.dataset.dtcGalleryInit) { return; }\n    document.body.dataset.dtcGalleryInit = '1';\n\n    document.addEventListener('click', function (e) {\n      /* photo/video filter chips */\n      var fbtn = e.target.closest('[data-dtc-filter]');\n      if (fbtn) {\n        var gallery = fbtn.closest('.dtc-gallery');\n        if (!gallery) { return; }\n        var want = fbtn.getAttribute('data-dtc-filter');\n        gallery.querySelectorAll('[data-dtc-filter]').forEach(function (b) {\n          b.classList.toggle('is-active', b === fbtn);\n        });\n        gallery.querySelectorAll('.dtc-gallery__item').forEach(function (fig) {\n          fig.hidden = want !== 'all' && fig.getAttribute('data-dtc-type') !== want;\n        });\n        return;\n      }\n\n      /* \"view full gallery\" opens the lightbox at the first item */\n      var allBtn = e.target.closest('[data-dtc-gallery-all]');\n      if (allBtn) {\n        var g = allBtn.closest('.dtc-gallery');\n        if (g) {\n          e.preventDefault();\n          buildLightbox().openAt(galleryItems(g), 0);\n        }\n        return;\n      }\n\n      /* quote tiles (tinting fleet) open the enquiry popup instead */\n      if (e.target.closest('.dtc-gallery__item[data-dtc-enquiry]')) { return; }\n\n      /* any other tile opens the lightbox at its own position */\n      var figClick = e.target.closest('.dtc-gallery__item');\n      if (figClick && !e.target.closest('a')) {\n        var gal = figClick.closest('.dtc-gallery');\n        if (!gal || gal.getAttribute('data-dtc-lightbox') === 'off') { return; }\n        var figs = [].slice.call(gal.querySelectorAll('.dtc-gallery__item:not([hidden])'));\n        var idx = figs.indexOf(figClick);\n        if (idx > -1) { buildLightbox().openAt(galleryItems(gal), idx); }\n      }\n    });\n  }\n\n  /* shared: does this link OPEN THE QUOTE POPUP rather than navigate? Those\n     clicks must never trigger the page loader or nav bar (no navigation). */\n  function isEnquiryTrigger(a, href) {\n    if (!a) { return false; }\n    if (a.closest('[data-dtc-enquiry]')) { return true; }\n    href = href || a.getAttribute('href') || '';\n    if (href.indexOf('open=quote') !== -1 || href.indexOf('#dtc-enquiry') !== -1) { return true; }\n    if (href.indexOf('/pages/contact') !== -1 && /\\b(quote|quotes|book|booking|price|pricing|enquir)/i.test(a.textContent || '')) { return true; }\n    return false;\n  }\n\n  /* ---- branded logo loader: shown on EVERY page change so a slow page\n     is never a bare black screen. Fades out as soon as the page is ready\n     and re-shows the moment an internal link is clicked. A CSS failsafe\n     (dtc-transitions.css) guarantees it can never get stuck even if this\n     script fails to load. ---- */\n  /* ---- One shared listener for \"user clicked a link that will navigate away\".\n     The preloader and the progress bar each registered their own capturing click\n     listener with byte-identical qualifying logic, so every click on the site ran\n     closest('a[href]') and constructed a URL object twice. Subscribers are called\n     only once a click has qualified. ---- */\n  var navClickSubs = [];\n  function onInternalNavClick(fn) {\n    navClickSubs.push(fn);\n    if (onInternalNavClick.bound) { return; }\n    onInternalNavClick.bound = true;\n    document.addEventListener('click', function (e) {\n      if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) { return; }\n      var a = e.target.closest('a[href]');\n      if (!a) { return; }\n      if (a.target && a.target !== '_self') { return; }\n      if (a.hasAttribute('download') || a.getAttribute('data-dtc-enquiry') !== null) { return; }\n      var href = a.getAttribute('href') || '';\n      if (href.charAt(0) === '#' || /^(mailto:|tel:|javascript:)/i.test(href)) { return; }\n      if (isEnquiryTrigger(a, href)) { return; } /* opens the quote popup - no navigation */\n      var url;\n      try { url = new URL(a.href); } catch (err) { return; }\n      if (url.origin !== window.location.origin) { return; }\n      if (url.pathname === window.location.pathname && url.hash) { return; } /* same-page anchor */\n      /* Same PATH, different query = pagination, facet filters, sorting.\n         These must feel instant: the slim progress bar still runs, but the\n         full-screen branded loader must not blank the page the shopper is\n         standing on. Each subscriber declares whether it cares. */\n      var samePath = url.pathname === window.location.pathname;\n      /* DEFERRED, because this listener CAPTURES. At capture time nothing has\n         had a chance to preventDefault yet, so the test at the top of this\n         function always saw `false` and every subscriber started for clicks\n         that never navigate - the header basket opens the drawer, the\n         collection pager swaps the section, and the progress bar was left\n         across the top of the page for the rest of the visit. A task is\n         enough: it runs after the event has finished dispatching. */\n      window.setTimeout(function () {\n        if (e.defaultPrevented) { return; }\n        for (var i = 0; i < navClickSubs.length; i++) {\n          try { navClickSubs[i](samePath); } catch (err) {}\n        }\n      }, 0);\n    }, true);\n  }\n\n  /* ---- navigation progress: a slim yellow bar on internal page\n     changes so there is always branded feedback and never a bare\n     white wait. Pairs with the page cross-fade (dtc-transitions.css)\n     and the white page ground (dtc-chrome.css). ---- */\n  function initNavProgress() {\n    if (document.body.dataset.dtcNavInit) { return; }\n    document.body.dataset.dtcNavInit = '1';\n    var bar = document.createElement('div');\n    bar.className = 'dtc-navbar';\n    bar.setAttribute('aria-hidden', 'true');\n    document.body.appendChild(bar);\n    var running = false;\n    var giveUp = null;\n    function clear() {\n      window.clearTimeout(giveUp);\n      running = false;\n      bar.classList.remove('is-active');\n      bar.style.transform = '';\n    }\n    function start() {\n      if (running) { return; }\n      running = true;\n      bar.classList.remove('is-done');\n      bar.classList.add('is-active');\n      requestAnimationFrame(function () { bar.style.transform = 'scaleX(0.9)'; });\n      /* Belt and braces. A navigation can also be abandoned in ways no click\n         handler reports - a beforeunload prompt, a download, a redirect that\n         never resolves - and a progress bar that is still running is worse\n         than one that gave up. If this document is still here, nothing went\n         anywhere. */\n      window.clearTimeout(giveUp);\n      giveUp = window.setTimeout(clear, 6000);\n    }\n    onInternalNavClick(start);\n    /* if a navigation is restored from bfcache, clear the bar */\n    window.addEventListener('pageshow', clear);\n  }\n\n  /* ---- any link that leaves our site opens in a new tab ---- */\n  function initExternalLinks() {\n    if (document.body.dataset.dtcExtInit) { return; }\n    document.body.dataset.dtcExtInit = '1';\n    var host = window.location.hostname;\n    document.querySelectorAll('a[href]').forEach(function (a) {\n      var href = a.getAttribute('href') || '';\n      if (href.charAt(0) === '#' || href.charAt(0) === '/') { return; }\n      if (/^(mailto:|tel:|sms:|javascript:)/i.test(href)) { return; }\n      var url;\n      try { url = new URL(a.href); } catch (e) { return; }\n      if (url.hostname && url.hostname !== host) {\n        a.target = '_blank';\n        var rel = (a.getAttribute('rel') || '').split(/\\s+/);\n        if (rel.indexOf('noopener') === -1) { rel.push('noopener'); }\n        if (rel.indexOf('noreferrer') === -1) { rel.push('noreferrer'); }\n        a.setAttribute('rel', rel.join(' ').trim());\n      }\n    });\n  }\n\n  /* ---- whole-card click: make any .dtc-card that is not itself a link but\n     has a single primary CTA (its foot button/link) clickable anywhere on the\n     card, so pressing the image/title/body opens the same place as the button.\n     Real controls inside keep working, text selection is preserved, and\n     keyboard users still tab to the real button - this is a mouse enhancement. ---- */\n  function initClickableCards() {\n    if (document.body.dataset.dtcCardClick) { return; }\n    document.body.dataset.dtcCardClick = '1';\n    function cta(card) {\n      return card.querySelector('.dtc-card__foot a[href], .dtc-card__foot button, .dtc-card__footer a[href], .dtc-card__footer button');\n    }\n    document.querySelectorAll('.dtc-card').forEach(function (card) {\n      if (card.tagName === 'A' || card.closest('a')) { return; }\n      if (cta(card)) { card.classList.add('dtc-clickable'); }\n    });\n    document.addEventListener('click', function (e) {\n      if (e.target.closest('a[href], button, input, textarea, select, label, summary, [data-dtc-enquiry]')) { return; }\n      var card = e.target.closest('.dtc-clickable');\n      if (!card) { return; }\n      if (window.getSelection && String(window.getSelection()).length) { return; }\n      var c = cta(card);\n      if (c) { c.click(); }\n    });\n  }\n\n  function rvEscape(s) {\n    return String(s == null ? '' : s).replace(/[&<>\"']/g, function (c) {\n      return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c];\n    });\n  }\n\n  function rvProductURL(value) {\n    try {\n      var u = new URL(String(value || ''), location.origin);\n      if (u.origin !== location.origin || !/^\\/(?:[a-z]{2}(?:-[a-z]{2})?\\/)?products\\/[^/]+\\/?$/i.test(u.pathname)) { return ''; }\n      return u.pathname + u.search + u.hash;\n    } catch (e) { return ''; }\n  }\n\n  function rvCardHTML(p) {\n    var url = rvProductURL(p && p.url);\n    if (!url) { return ''; }\n    /* a name saved before the naming rule, printed by it (snippets/tdhq-name-js) */\n    if (window.tdhqName) { p.title = window.tdhqName(p.title); }\n    /* the fallback card asks for the card's own sizes, as tdhq-product-card does (TdhqImg) */\n    var media = p.image\n      ? '<img src=\"' + rvEscape(window.TdhqImg.sized(p.image, 540)) + '\" srcset=\"' +\n        rvEscape([180, 260, 360, 540].map(function (w) { return window.TdhqImg.sized(p.image, w) + ' ' + w + 'w'; }).join(', ')) +\n        '\" sizes=\"(min-width: 1400px) 22vw, (min-width: 1000px) 24vw, 45vw\" width=\"540\" height=\"540\" loading=\"lazy\" alt=\"' + rvEscape(p.title) + '\" data-tdhq-fit=\"card\">'\n      : '';\n    var priceHtml;\n    if (p.hasPrice === 0) {\n      priceHtml = '<p class=\"dtc-shop__price\"><span>Price on request</span></p>';\n    } else if (p.price) {\n      priceHtml = '<p class=\"dtc-shop__price\">' + (p.priceVaries ? '<span class=\"dtc-shop__from\">From</span> ' : '') + '<span>' + rvEscape(p.price) + '</span></p>';\n    } else {\n      priceHtml = '<p class=\"dtc-shop__price\"><span>Price on request</span></p>';\n    }\n    var top = p.eyebrow || p.vendor;\n    var eyebrow = top ? '<p class=\"dtc-shop__vendor\"><span>' + rvEscape(top) + '</span></p>' : '';\n    /* Was: a `duration` line (a service length \u2014 null on every retail product)\n       plus an UNCONDITIONAL \"Free, no-obligation quote\" line. That second line\n       was not gated by anything, so every recently-viewed card on a retail store\n       promised a quote. The Liquid cards had the same text removed earlier; this\n       JS copy of the card was missed. Now: no meta list at all. p.stock is the\n       copy saved in localStorage when the product was viewed, possibly days ago,\n       so 'Only N left' or 'Out of stock' could be out of date. Stock is only\n       stated on server-rendered cards. */\n    var meta = '';\n    return '<a class=\"dtc-card dtc-shop__card dtc-reveal is-in\" href=\"' + rvEscape(url) + '\">' +\n      '<div class=\"dtc-card__media\">' + media + '</div>' +\n      '<div class=\"dtc-card__body\">' + eyebrow +\n      '<h3 class=\"dtc-shop__title\"><span>' + rvEscape(p.title) + '</span></h3>' + meta + priceHtml +\n      '<span class=\"dtc-btn dtc-btn--outline dtc-shop__btn\">View</span>' +\n      '</div></a>';\n  }\n\n  // Recently viewed services: render history from localStorage into the\n  // (hidden) section, then record the current product for next time.\n  function initRecentlyViewed() {\n    var KEY = 'dtc_recent_v1';\n    var list = [];\n    try { list = JSON.parse(localStorage.getItem(KEY)) || []; } catch (e) { list = []; }\n    if (!Array.isArray(list)) { list = []; }\n\n    var current = null;\n    var cur = document.querySelector('[data-dtc-current-product]');\n    if (cur) { try { current = JSON.parse(cur.textContent); } catch (e) { current = null; } }\n\n    var wrap = document.querySelector('[data-dtc-recent]');\n    if (wrap && !wrap.dataset.dtcInit) {\n      wrap.dataset.dtcInit = '1';\n      var grid = wrap.querySelector('[data-dtc-recent-grid]');\n      var limit = parseInt(wrap.getAttribute('data-dtc-recent-limit'), 10) || 4;\n      var show = list.filter(function (p) {\n        return p && rvProductURL(p.url) && (!current || String(p.id) !== String(current.id));\n      }).slice(0, limit);\n      if (grid && show.length) {\n        wrap.removeAttribute('hidden');\n        /* ONE CARD COMPONENT SITE-WIDE (FIX-LIST 3c).\n\n           This built its own card markup in JavaScript, which made it the\n           fourth place a product card was defined. It now asks the SERVER for\n           the same card every other row uses, via the ?view=card template \u2014 so\n           the wishlist heart, the quick-add form, the stock line and the\n           alignment reservations arrive for free and cannot drift.\n\n           rvCardHTML stays as the fallback for any handle that fails to fetch:\n           a recently-viewed row that renders nothing would look broken, and the\n           locally stored data is enough to draw a reasonable card. */\n        Promise.all(show.map(function (p) {\n          var handle = String(p.url || '').split('/products/')[1];\n          if (!handle) { return Promise.resolve(null); }\n          handle = handle.split('?')[0].split('#')[0];\n          /* the stored URL is already percent-encoded: decode, then encode\n             once, or \"dtlr%C2%AE\" becomes \"dtlr%25C2%25AE\" and 404s */\n          try { handle = decodeURIComponent(handle); } catch (e) { /* keep as stored */ }\n          return fetch('/products/' + encodeURIComponent(handle) + '?view=card', { headers: { 'Accept': 'text/html' } })\n            .then(function (r) { return r.ok ? r.text() : (r.status === 404 ? 'GONE' : null); })\n            .catch(function () { return null; });\n        })).then(function (cards) {\n          /* a product that no longer exists is dropped, not drawn */\n          var keep = [];\n          cards.forEach(function (c, i) { if (c !== 'GONE') { keep.push(c || rvCardHTML(show[i])); } });\n          var html = keep;\n          if (!html.length) { wrap.setAttribute('hidden', ''); return; }\n          /* SOLD OUT LAST, like every other rail. The card the server sends\n             carries tdhq-pcard--out when the product is unavailable, so the\n             order is decided on the same fact the card shows. A stable sort:\n             within each group the visit order is kept (newest first). */\n          var inStock = html.filter(function (c) { return c.indexOf('tdhq-pcard--out') === -1; });\n          var soldOut = html.filter(function (c) { return c.indexOf('tdhq-pcard--out') !== -1; });\n          grid.innerHTML = inStock.concat(soldOut).join('');\n          /* The carousel wrapping this grid computes arrow state only on\n             scroll/resize \u2014 async insertion triggers neither, so the arrows\n             would stay in their empty-track state (hidden). One coalesced\n             resize recomputes them. */\n          window.dispatchEvent(new Event('resize'));\n        });\n      }\n    }\n\n    if (current && current.id) {\n      list = list.filter(function (p) { return p && String(p.id) !== String(current.id); });\n      list.unshift(current);\n      list = list.slice(0, 8);\n      try { localStorage.setItem(KEY, JSON.stringify(list)); } catch (e) {}\n    }\n  }\n\n  function initBeforeAfter() {\n    if (!document.body.dataset.dtcBaDrag) {\n      document.body.dataset.dtcBaDrag = '1';\n      document.addEventListener('input', function (e) {\n        var range = e.target.closest('[data-dtc-ba-range]');\n        if (!range) { return; }\n        var ba = range.closest('[data-dtc-ba]');\n        if (ba) { ba.dataset.dtcBaUser = '1'; ba.style.setProperty('--pos', range.value + '%'); }\n      });\n      /* grabbing the handle stops the intro animation instantly (before any input fires) */\n      document.addEventListener('pointerdown', function (e) {\n        var range = e.target.closest('[data-dtc-ba-range]');\n        if (range) { var ba = range.closest('[data-dtc-ba]'); if (ba) { ba.dataset.dtcBaUser = '1'; } }\n      });\n    }\n    var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    document.querySelectorAll('[data-dtc-ba]:not([data-dtc-ba-ready])').forEach(function (ba) {\n      ba.setAttribute('data-dtc-ba-ready', '1');\n      var range = ba.querySelector('[data-dtc-ba-range]');\n      if (reduce) { ba.style.setProperty('--pos', '50%'); return; }\n      function play() {\n        var start = null;\n        var dur = 2200;\n        function frame(now) {\n          if (ba.dataset.dtcBaUser) { return; }\n          if (start === null) { start = now; }\n          var p = (now - start) / dur;\n          if (p >= 1) { ba.style.setProperty('--pos', '50%'); if (range) { range.value = 50; } return; }\n          var env = Math.sin(p * Math.PI);\n          var pos = 50 + 34 * env * Math.sin(p * Math.PI * 3);\n          ba.style.setProperty('--pos', pos.toFixed(2) + '%');\n          if (range) { range.value = pos; }\n          requestAnimationFrame(frame);\n        }\n        requestAnimationFrame(frame);\n      }\n      if ('IntersectionObserver' in window) {\n        var io = new IntersectionObserver(function (entries) {\n          entries.forEach(function (en) { if (en.isIntersecting) { io.disconnect(); play(); } });\n        }, { threshold: 0.4 });\n        io.observe(ba);\n      } else { play(); }\n    });\n  }\n\n  /* ---- blog article formatter: old posts were saved as one sentence per\n     paragraph with fake <p><strong> headings. Turn those into real <h2>\n     headings and merge the choppy sentences into readable paragraphs so\n     every post reads like the DTC design, without editing the content. ---- */\n  /* Shopify renders /policies/* with its own fixed markup and ignores\n     templates/policy.liquid entirely, so the only place the policy BODY can be\n     corrected is here. The Refund policy's stored body opens with its own <h1>\n     (\"Refund and Returns Policy\") on top of the page heading Shopify already\n     prints, giving that page two competing top-level headings.\n\n     Demoted rather than removed: the body heading is real content and often\n     phrased differently from the page title, so deleting it would lose wording\n     the shop wrote. As an <h2> it becomes the first section of the document\n     instead of a rival title. Editing the stored policy text would be the other\n     fix, but that is an admin content change, not a theme one.\n\n     BODY ONLY (2026-09-23). This used to query '.shopify-policy__body,\n     .shopify-policy__container'. querySelector returns the first match in\n     document order, which is the CONTAINER (it wraps the body), so the loop\n     also demoted Shopify's own page title: every policy page measured 0 h1\n     and its title lost the heading style that targets an h1.\n\n     The body's OPENING h1 is the page title typed again (\"Refund and Returns\n     Policy\" under \"Refund policy\"). dtc-chrome.css hides it before this script\n     runs; it is demoted like the rest and marked so the same rule keeps it\n     hidden afterwards, which leaves one h1 and nothing on screen moves. */\n  function initPolicyHeadings() {\n    var body = document.querySelector('.shopify-policy__body');\n    if (!body || body.dataset.tdhqPolicyFmt) { return; }\n    body.dataset.tdhqPolicyFmt = '1';\n    Array.prototype.slice.call(body.querySelectorAll('h1')).forEach(function (el) {\n      var dup = el.matches('.rte > h1:first-child');\n      var h2 = document.createElement('h2');\n      if (dup) { h2.setAttribute('data-tdhq-policy-dup', ''); }\n      /* Copy child NODES rather than innerHTML: same result for markup, but it\n         moves the existing nodes instead of re-parsing a string. */\n      while (el.firstChild) { h2.appendChild(el.firstChild); }\n      for (var i = 0; i < el.attributes.length; i++) {\n        h2.setAttribute(el.attributes[i].name, el.attributes[i].value);\n      }\n      el.parentNode.replaceChild(h2, el);\n    });\n  }\n\n  function initArticleFormat() {\n    var body = document.querySelector('.dtc-article__body');\n    if (!body || body.dataset.dtcFmt) { return; }\n    body.dataset.dtcFmt = '1';\n    var h1 = document.querySelector('.dtc-article__title');\n    var titleText = h1 ? h1.textContent.trim().toLowerCase() : '';\n\n    function looksLikeTitle(t) {\n      t = t.trim().toLowerCase();\n      if (!titleText || t.length < 10) { return false; }\n      return t === titleText || titleText.indexOf(t.slice(0, 22)) !== -1 || t.indexOf(titleText.slice(0, 22)) !== -1;\n    }\n\n    /* 0. Strip pasted-in content artifacts before restructuring: private meta\n          lines (SEO tags / keywords), leftover emoji and en/em dashes, so posts\n          read cleanly and consistently without editing the stored content. */\n    (function cleanArtifacts() {\n      var EMOJI = /([\\u{1F000}-\\u{1FAFF}\\u{2600}-\\u{27BF}\\u{2B00}-\\u{2BFF}][\uFE0F\u200D]?)\\s*/gu;\n      Array.prototype.slice.call(body.querySelectorAll('p, div')).forEach(function (p) {\n        var t = p.textContent.trim();\n        if (t.length < 400 && /^(seo tags?|seo|keywords?|tags?|meta(\\s+description)?)\\s*[:\\-\u2013\u2014]/i.test(t)) {\n          p.remove();\n        }\n      });\n      var walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null);\n      var tn, list = [];\n      while ((tn = walker.nextNode())) { list.push(tn); }\n      list.forEach(function (node) {\n        var v = node.nodeValue;\n        if (!v) { return; }\n        var out = v.replace(EMOJI, '').replace(/\\s*[\u2013\u2014]\\s*/g, ', ').replace(/\\s{2,}/g, ' ');\n        if (out !== v) { node.nodeValue = out; }\n      });\n    })();\n\n    /* 1. One <h1> per page: the template already renders the post title. Drop a\n          body <h1> that repeats it; otherwise demote to <h2> for a valid outline. */\n    Array.prototype.slice.call(body.querySelectorAll('h1')).forEach(function (el) {\n      if (looksLikeTitle(el.textContent)) { el.remove(); return; }\n      var h2 = document.createElement('h2');\n      h2.innerHTML = el.innerHTML;\n      el.parentNode.replaceChild(h2, el);\n    });\n\n    /* The section template now demotes body <h1> to <h2> in Liquid, so the loop\n       above usually finds nothing \u2014 the raw HTML must be correct for crawlers\n       that never run this script. That means the \"drop a heading that just\n       repeats the post title\" rule has to look at <h2> as well, or a duplicated\n       title would survive purely because it arrived already demoted. */\n    Array.prototype.slice.call(body.querySelectorAll('h2')).forEach(function (el) {\n      if (looksLikeTitle(el.textContent)) { el.remove(); }\n    });\n\n    /* Authored content carries empty headings (<h1></h1> used as spacing).\n       Demoted they become empty <h2>s: invisible on the page, but real, blank\n       entries in the document outline that a screen reader announces. */\n    Array.prototype.slice.call(body.querySelectorAll('h1, h2, h3, h4, h5, h6')).forEach(function (el) {\n      if (!el.textContent.trim() && !el.querySelector('img')) { el.remove(); }\n    });\n\n    /* 2. Fake bold headings -> real <h2> (whole paragraph is a short <strong>). */\n    Array.prototype.slice.call(body.querySelectorAll('p')).forEach(function (p) {\n      if (p.children.length !== 1) { return; }\n      var c = p.children[0];\n      if (c.tagName !== 'STRONG' && c.tagName !== 'B') { return; }\n      var txt = p.textContent.trim();\n      if (txt.length < 3 || txt.length > 90) { return; }\n      if (p.textContent.trim() !== c.textContent.trim()) { return; }\n      if (looksLikeTitle(txt)) { p.remove(); return; }\n      var h = document.createElement('h2');\n      h.textContent = txt;\n      p.parentNode.replaceChild(h, p);\n    });\n\n    /* 3. Sentence-per-line <br> blocks -> individual paragraphs so the merge step\n          can regroup them into clean, readable paragraphs. */\n    Array.prototype.slice.call(body.querySelectorAll('p')).forEach(function (p) {\n      if (p.querySelectorAll('br').length < 2) { return; }\n      var parts = p.innerHTML.split(/<br\\s*\\/?>/i).map(function (s) { return s.trim(); }).filter(Boolean);\n      if (parts.length < 2) { return; }\n      var frag = document.createDocumentFragment();\n      parts.forEach(function (seg) {\n        var np = document.createElement('p');\n        np.innerHTML = seg;\n        frag.appendChild(np);\n      });\n      p.parentNode.replaceChild(frag, p);\n    });\n\n    /* 4. Merge consecutive short paragraphs into ~2-3 sentence groups. */\n    var child = body.firstElementChild;\n    while (child) {\n      var next = child.nextElementSibling;\n      if (child.tagName === 'P') {\n        while (next && next.tagName === 'P' && (child.textContent.length + next.textContent.length) < 300) {\n          child.innerHTML = child.innerHTML.trim() + ' ' + next.innerHTML.trim();\n          var toRemove = next;\n          next = next.nextElementSibling;\n          toRemove.remove();\n        }\n      }\n      child = next;\n    }\n\n    /* 5. Lead-in styling on the opening paragraph. */\n    var firstP = body.querySelector('p');\n    if (firstP && firstP.textContent.trim().length > 40) { firstP.classList.add('dtc-article__lead'); }\n\n    /* 6. One topic-relevant photo mid-article when the post has none of its own.\n       Images come from the \"Fallback article images\" theme setting (keyword|url), never\n       from hardcoded URLs \u2014 a hardcoded one would put the original store's photos on\n       every other store using this theme. Not configured => insert nothing. */\n    var artImgs = window.__dtcArtImgs;\n    if (artImgs && artImgs.length &&\n        !body.querySelector('.dtc-article__inlineimg') && body.querySelectorAll('img').length === 0) {\n      var pick = null;\n      for (var ai = 0; ai < artImgs.length; ai++) {\n        var kw = String(artImgs[ai].k || '').toLowerCase();\n        if (kw && titleText.toLowerCase().indexOf(kw) !== -1) { pick = artImgs[ai]; break; }\n      }\n      /* last entry is the catch-all when no keyword matches */\n      if (!pick) { pick = artImgs[artImgs.length - 1]; }\n      var h2s = body.querySelectorAll('h2');\n      var anchor = h2s.length >= 2 ? h2s[1] : body.querySelectorAll('p')[3];\n      if (anchor && pick && pick.u) {\n        var im = document.createElement('img');\n        im.sizes = '(min-width: 900px) 760px, 92vw';\n        im.srcset = [360, 540, 720, 900, 1200].map(function (w) { return window.TdhqImg.sized(pick.u, w) + ' ' + w + 'w'; }).join(', ');\n        im.src = window.TdhqImg.sized(pick.u, 1200);\n        im.alt = '';\n        im.className = 'dtc-article__inlineimg';\n        im.loading = 'lazy';\n        im.decoding = 'async';\n        anchor.parentNode.insertBefore(im, anchor);\n      }\n    }\n  }\n\n  /* Blog card excerpts/titles are auto-generated from post content, so they\n     inherit the same emoji/dash artifacts as the bodies. Clean them site-wide\n     (homepage feed, blog listing, \"more from the journal\") for consistency. */\n  function initBlogCards() {\n    var els = document.querySelectorAll('.dtc-blog__excerpt, .dtc-blog__title');\n    if (!els.length) { return; }\n    var EMOJI = /([\\u{1F000}-\\u{1FAFF}\\u{2600}-\\u{27BF}\\u{2B00}-\\u{2BFF}][\uFE0F\u200D]?)\\s*/gu;\n    Array.prototype.slice.call(els).forEach(function (el) {\n      if (el.dataset.dtcClean) { return; }\n      el.dataset.dtcClean = '1';\n      var walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null);\n      var tn, list = [];\n      while ((tn = walker.nextNode())) { list.push(tn); }\n      list.forEach(function (node) {\n        var v = node.nodeValue;\n        if (!v) { return; }\n        var out = v.replace(EMOJI, '').replace(/\\s*[\u2013\u2014]\\s*/g, ', ').replace(/\\s{2,}/g, ' ');\n        if (out !== v) { node.nodeValue = out; }\n      });\n    });\n  }\n\n  /* ------------------------------------------------------------------\n     DEAD IN-PAGE LINKS\n\n     Several sections correctly hide themselves when they have no data - an\n     empty collection, a brand list with no entries. What they cannot do is\n     tell the OTHER sections on the page, so a hero button and two route cards\n     on New & Offers went on pointing at `#bundles-and-kits` and `#new-brands`\n     for sections that were not rendered. Clicking them did nothing at all:\n     no scroll, no message, no clue that anything was wrong.\n\n     The theme already refuses to print a menu link to a page that does not\n     exist (snippets/tdhq-link-alive.liquid). This is the same rule for\n     fragments, applied where only the browser can apply it - after the\n     document exists and it is knowable whether the target is in it.\n\n     Scoped to our own sections, because a parent-theme link like\n     `#login-modal` targets a node its own script creates later; and skipped in\n     the theme editor, where a merchant needs to see the control they are\n     configuring even while its destination is empty.\n     ------------------------------------------------------------------ */\n  function hideDeadAnchors() {\n    if (window.Shopify && window.Shopify.designMode) { return; }\n    var links = document.querySelectorAll('.dtc a[href^=\"#\"], .tdhq a[href^=\"#\"]');\n    for (var i = 0; i < links.length; i++) {\n      var href = links[i].getAttribute('href') || '';\n      var frag = href.slice(1);\n      if (!frag || frag === '!') { continue; }\n      /* A fragment a script answers is not a dead link: the sign-in page's\n         \"Forgotten your password?\" (#recover) and \"Back to sign in\" (#login)\n         switch panels in dtc-account and have no element of that id, so this\n         hid the only way to reset a password (audit service-1). */\n      if (links[i].matches('[data-dtc-recover-show], [data-dtc-recover-hide]')) { continue; }\n      var target = null;\n      try { target = document.getElementById(frag) || document.getElementsByName(frag)[0]; } catch (e) { continue; }\n      if (target) { continue; }\n      /* Hidden, not removed: a merchant reading the page source (or this\n         theme's own docs) can still see what was meant to be there, and the\n         moment the section has content the link works again with no code\n         change. */\n      links[i].hidden = true;\n      links[i].setAttribute('data-dtc-dead-anchor', frag);\n\n      /* A wrapper that now holds nothing is worse than the dead link was: it\n         keeps its padding and its min-height, so the page shows a 44px band of\n         nothing where a button used to be. Collapse empty ancestors, but only a\n         couple of levels and only while they are genuinely empty - never a\n         whole section. */\n      var node = links[i].parentElement;\n      var climbed = 0;\n      while (node && climbed < 3 && !node.matches('section, [id^=\"shopify-section\"], main, body')) {\n        var live = false;\n        for (var k = 0; k < node.children.length; k++) {\n          if (!node.children[k].hidden) { live = true; break; }\n        }\n        /* textContent includes the text of the link we just hid, so testing it\n           always found \"content\" and the wrapper never collapsed. Count only\n           what is still VISIBLE: text nodes, and children that are not hidden. */\n        var text = '';\n        for (var t = 0; t < node.childNodes.length; t++) {\n          var cn = node.childNodes[t];\n          if (cn.nodeType === 3) { text += cn.nodeValue; }\n        }\n        if (live || text.trim()) { break; }\n        node.hidden = true;\n        node.setAttribute('data-dtc-dead-anchor-wrap', '');\n        node = node.parentElement;\n        climbed++;\n      }\n    }\n\n    /* A card grid sizes its columns from the cards the SERVER rendered, and its\n       last-row rules count children with nth-child. A card hidden here still\n       counted for both: on New & Offers the three-up routes row kept an empty\n       third column where the New Brands card had been. Hidden cards move out of\n       the grid (still in the page and still hidden), and the per-row class\n       shrinks to the cards that are left - the same rule tdhq-card-grid applies\n       on the server, which leaves the fixed contact layout alone. */\n    var grids = document.querySelectorAll('.tdhq-cards');\n    for (var g = 0; g < grids.length; g++) {\n      var grid = grids[g];\n      if (grid.hidden) { continue; }\n      var gone = [];\n      for (var c = 0; c < grid.children.length; c++) {\n        if (grid.children[c].hidden) { gone.push(grid.children[c]); }\n      }\n      if (!gone.length) { continue; }\n      for (var h = gone.length - 1; h >= 0; h--) {\n        grid.parentNode.insertBefore(gone[h], grid.nextSibling);\n      }\n      if (grid.classList.contains('tdhq-cards--contact')) { continue; }\n      var left = grid.children.length;\n      var pr = grid.className.match(/\\btdhq-grid--pr(\\d+)\\b/);\n      if (pr && left > 0 && left < +pr[1]) {\n        grid.classList.remove(pr[0]);\n        grid.classList.add('tdhq-grid--pr' + left);\n        grid.style.setProperty('--cards-per-row', left);\n      }\n    }\n\n    /* A quick-links band left with one link is a full-width band holding a\n       single pill, usually repeating a button right beside it (new-and-offers:\n       its collection links are skipped until those collections exist). Fewer\n       than two live links hides the whole section; it comes back on its own\n       once more links render. */\n    var bands = document.querySelectorAll('.tdhq-quicklinks');\n    for (var q = 0; q < bands.length; q++) {\n      if (bands[q].querySelectorAll('.tdhq-quicklinks__list > li:not([hidden])').length < 2) {\n        (bands[q].closest('.shopify-section') || bands[q]).hidden = true;\n      }\n    }\n  }\n\n  /* BAND JOINS. Every page is a stack of full-width bands that alternate\n     light and grey, so each one reads as its own section. WHICH bands render\n     depends on the product's own content, so two bands of the same ground end\n     up side by side - story then related on every product without curated\n     content, reviews then trust wherever the brand band is empty. The join\n     then disappears: 132 to 222px of one unbroken ground with nothing to say\n     where one section ended (measured on 7 product pages, 2026-09-22).\n\n     Which grounds actually meet is only known once the page is rendered, so it\n     is read here and marked with a hairline the width of the content. The line\n     is positioned, not in the flow, so nothing moves. */\n  function initBandJoins() {\n    var main = document.getElementById('MainContent');\n    if (!main) { return; }\n    /* The colour the eye sees at an edge: the first painted element down the\n       chain of rendered first (or last) children. */\n    function edgeColour(el, fromBottom) {\n      var node = el, depth = 0;\n      while (node && depth < 14) {\n        var c = window.getComputedStyle(node).backgroundColor;\n        if (c && c !== 'rgba(0, 0, 0, 0)' && c !== 'transparent') { return c; }\n        var kids = [].filter.call(node.children, function (k) { return k.getBoundingClientRect().height > 0; });\n        node = fromBottom ? kids[kids.length - 1] : kids[0];\n        depth++;\n      }\n      return '';\n    }\n    /* Padding between a band's edge and its content: summed down the chain\n       of rendered first (or last) children, three levels deep (a scheme\n       wrapper, a container, a section box), stopping at anything with a ground\n       of its own below the wrapper - a card's inner padding is content. */\n    function edgePad(el, fromBottom) {\n      var sum = 0, node = el, depth = 0;\n      while (node && depth < 3) {\n        var kids = [].filter.call(node.children, function (k) { return k.getBoundingClientRect().height > 0; });\n        node = fromBottom ? kids[kids.length - 1] : kids[0];\n        if (!node) { break; }\n        var cs = window.getComputedStyle(node);\n        if (depth > 0 && cs.backgroundColor !== 'rgba(0, 0, 0, 0)' && cs.backgroundColor !== 'transparent') { break; }\n        sum += parseFloat(fromBottom ? cs.paddingBottom : cs.paddingTop) || 0;\n        depth++;\n      }\n      return sum;\n    }\n    /* The join between a band and the one above it, or null. Hidden bands\n       (height 0) are skipped by the caller; thin chrome strips (breadcrumbs,\n       notices) are not bands: a line under the breadcrumb on every collection\n       page is noise, not a boundary, so nothing joins across one. */\n    function joinFor(sec, prev) {\n      if (!prev || sec.getBoundingClientRect().height < 120 || prev.getBoundingClientRect().height < 120) { return null; }\n      var above = edgeColour(prev, true);\n      var below = edgeColour(sec, false);\n      if (!above || above !== below) { return null; }\n      var rgb = below.match(/\\d+/g);\n      return {\n            sec: sec,\n          /* The line sits in the middle of the gap between the two bands.\n             Drawn at the section's top edge it went through the heading below\n             (contact \"Send us a message\", rewards \"How HQ Rewards works\": the\n             rule 2-5px INSIDE the cap height, 2026-09-23), because \"same\n             ground, one gap\" (tdhq-core.css) removes that section's top\n             padding, so its top edge IS its heading. The padding that does\n             exist is read off each band (first rendered child chain below the\n             line, last one above it), so the offset comes out as 0 when both\n             bands keep their padding. */\n            top: ((edgePad(sec, false) - edgePad(prev, true)) / 2) + 'px',\n            dark: !!(rgb && (Number(rgb[0]) + Number(rgb[1]) + Number(rgb[2])) / 3 < 128)\n      };\n    }\n    /* Every band is read before any is marked: a mark between two reads\n       would make the next read lay the page out again. */\n    function mark(joins) {\n      joins.forEach(function (j) {\n        j.sec.classList.add('dtc-band-join');\n        j.sec.style.setProperty('--join-top', j.top);\n        if (j.dark) { j.sec.classList.add('dtc-band-join--dark'); }\n      });\n    }\n    var secs = [].filter.call(main.children, function (s) { return s.classList.contains('shopify-section'); });\n    /* The band above: the nearest earlier section that renders (a thin strip\n       counts, so nothing joins across it). */\n    function prevOf(i) {\n      for (var p = i - 1; p >= 0; p--) { if (secs[p].getBoundingClientRect().height) { return p; } }\n      return -1;\n    }\n    /* U.52 (9 Oct 2026): bands the page is still skipping (content-visibility:\n       auto below the fold, tdhq-fix-home.css + tdhq-fix-global.css) are read\n       once BOTH bands of a join are near the screen. Read at load they were\n       laid out just for this: a forced layout of the whole page, ~60 ms on a\n       phone home page. Every other join is read at load, exactly as before.\n       The mark is a positioned hairline, so marking later moves nothing. */\n    var vh = window.innerHeight || document.documentElement.clientHeight;\n    var skipped = secs.map(function (s) {\n      if (window.getComputedStyle(s).contentVisibility !== 'auto') { return false; }\n      var r = s.getBoundingClientRect();\n      return r.top > vh * 1.5 || r.bottom < -vh * 0.5;\n    });\n    var useIo = 'IntersectionObserver' in window;\n    var near = [], done = [], left = secs.length, now = [];\n    for (var n = 0; n < secs.length; n++) {\n      var pn = prevOf(n);\n      if (useIo && (skipped[n] || (pn >= 0 && skipped[pn]))) { continue; }\n      done[n] = true;\n      left--;\n      var jn = pn < 0 ? null : joinFor(secs[n], secs[pn]);\n      if (jn) { now.push(jn); }\n    }\n    mark(now);\n    if (left <= 0) { return; }\n    var io = new IntersectionObserver(function (entries) {\n      entries.forEach(function (e) { if (e.isIntersecting) { near[secs.indexOf(e.target)] = true; } });\n      var found = [];\n      for (var i = 0; i < secs.length; i++) {\n        if (done[i] || !near[i]) { continue; }\n        var p = prevOf(i);\n        if (p >= 0 && !near[p]) { continue; }\n        done[i] = true;\n        left--;\n        var j = p < 0 ? null : joinFor(secs[i], secs[p]);\n        if (j) { found.push(j); }\n      }\n      mark(found);\n      if (left <= 0) { io.disconnect(); }\n    }, { rootMargin: '25% 0px' });\n    secs.forEach(function (s) { io.observe(s); });\n  }\n\n  /* ---- COUNT-UP. A statistic counts up from 0 to its figure the first time\n     it scrolls into view (client, About page, June: \"make animation to\n     statistics, smooth animation that animated the numbers changing\"; the\n     rebuild had lost it). Marked with data-dtc-count by the trust bar (\"7\" in\n     \"7 Days\") and the notice stat (the Rewards \"12\" months). Whole numbers\n     only - \"24/7\" or \"4.9\" are left as written. The page is served with the\n     real figure, so it reads right with no script, to search engines and to\n     anyone who asks for reduced motion (nothing moves for them). Duration and\n     curve are the theme's \"content arriving\" motion: --tdhq-t-slow and the\n     shared ease, cubic-bezier(0.4, 0, 0.2, 1). ---- */\n  function initCountUp() {\n    var els = document.querySelectorAll('[data-dtc-count]:not([data-dtc-counted])');\n    if (!els.length) { return; }\n    if (reduce || !('IntersectionObserver' in window)) { return; }\n    if (window.Shopify && window.Shopify.designMode) { return; }\n    /* the token as milliseconds (the built CSS stores .42s, which parseFloat read as 0.42 ms) */\n    var dur = window.TdhqMotion ? window.TdhqMotion.ms('--tdhq-t-slow', 420) : 420;\n    function ease(x) {\n      /* cubic-bezier(0.4, 0, 0.2, 1): x(t) = 1.6t^3 - 1.8t^2 + 1.2t and\n         y(t) = -2t^3 + 3t^2. Solve x(t) = x by Newton's method, return y(t). */\n      if (x <= 0 || x >= 1) { return x; }\n      var t = x;\n      for (var i = 0; i < 8; i++) {\n        var fx = ((1.6 * t - 1.8) * t + 1.2) * t - x;\n        var dx = (4.8 * t - 3.6) * t + 1.2;\n        if (!dx) { break; }\n        t -= fx / dx;\n      }\n      return (-2 * t + 3) * t * t;\n    }\n    function run(el) {\n      var to = parseInt(el.getAttribute('data-dtc-count-to'), 10);\n      var fin = el.getAttribute('data-dtc-count-final');\n      var t0 = null;\n      function frame(now) {\n        if (reduce) { el.textContent = fin; return; }\n        if (t0 === null) { t0 = now; }\n        var p = Math.min(1, (now - t0) / dur);\n        el.textContent = p < 1 ? String(Math.round(to * ease(p))) : fin;\n        if (p < 1) { requestAnimationFrame(frame); }\n      }\n      el.textContent = '0';\n      requestAnimationFrame(frame);\n    }\n    var io = new IntersectionObserver(function (entries) {\n      entries.forEach(function (e) {\n        if (!e.isIntersecting) { return; }\n        io.unobserve(e.target);\n        run(e.target);\n      });\n    }, { threshold: 0.6 });\n    Array.prototype.forEach.call(els, function (el) {\n      var txt = el.textContent.trim();\n      if (!/^\\d+$/.test(txt) || !parseInt(txt, 10)) { return; }\n      el.setAttribute('data-dtc-counted', '');\n      el.setAttribute('data-dtc-count-to', txt);\n      el.setAttribute('data-dtc-count-final', txt);\n      /* one box the width of the final figure, so the words beside it never\n         move while it counts (tabular digits, set in the stylesheet) */\n      el.style.display = 'inline-block';\n      el.style.minWidth = txt.length + 'ch';\n      el.style.textAlign = 'end';\n      /* Below the fold it waits at 0, so the figure is never seen whole and\n         then reset as it arrives. One already on screen counts from where it\n         is shown. */\n      var r = el.getBoundingClientRect();\n      if (r.top > window.innerHeight || r.bottom < 0) { el.textContent = '0'; }\n      io.observe(el);\n    });\n  }\n\n  /* ---- CONTENT-VISIBILITY RELEASE (15 Oct 2026). Sections below the fold\n     are served with content-visibility: auto (U.52, tdhq-fix-home.css and\n     tdhq-fix-global.css) so the first paint skips them. The same rule keeps\n     each one painted on its own once it is on screen, and two bands meeting\n     on a fractional pixel then snap apart on a scaled display: a black line\n     of page ground between them (owner, homepage, Lifestyle & Clothing Brands\n     over HQ Rewards). A section the browser has started rendering gets\n     .is-cv-on, which hands it back to normal painting for good. Sections\n     rendered before this script ran are read once after the next frame: the\n     section box itself always reads visible, so its content is asked. ---- */\n  function initCvRelease() {\n    var sel = '#MainContent > .shopify-section, .tdhq-footer-section';\n    function on(el) { if (el && el.classList && !el.classList.contains('is-cv-on') && el.matches(sel)) { el.classList.add('is-cv-on'); } }\n    document.addEventListener('contentvisibilityautostatechange', function (e) {\n      if (!e.skipped) { on(e.target); }\n    }, true);\n    if (!document.body.checkVisibility) { return; }\n    window.requestAnimationFrame(function () {\n      var skipped = [];\n      [].forEach.call(document.querySelectorAll(sel), function (el) {\n        if (el.classList.contains('is-cv-on')) { return; }\n        if (window.getComputedStyle(el).contentVisibility !== 'auto') { return; }\n        var c = el.querySelector(':scope > :not(style, script, link, template)');\n        if (c && c.checkVisibility({ contentVisibilityAuto: true })) { on(el); } else { skipped.push(el); }\n      });\n      if (skipped.length) { renderAhead(skipped); }\n    });\n\n    /* RENDERED AHEAD OF THE SHOPPER (owner 20 Oct 2026: phone scrolling\n       \"stutters and clips\"). A skipped band did all its style and layout in the\n       frame it scrolled near: 100-330ms on the home page at phone speed (4x CPU\n       trace), so the scroll stalled and the band showed blank for a moment.\n       From the shopper's first touch or scroll, or 3s after the page has\n       loaded if that comes first, every skipped band is released in idle\n       time, the one nearest the view first, one per pause, never while the\n       page is moving (a four-screen lookahead still left the band after it to\n       a fast first swipe: 282ms). Nothing runs before the page has loaded (a\n       touch during loading waits for it), so the first paint keeps the saving. */\n    function renderAhead(list) {\n      var idle = window.requestIdleCallback || function (fn) { return setTimeout(fn, 100); };\n      var queue = list.slice(), waiting = false, lastScroll = 0, started = false;\n      var starts = ['scroll', 'touchstart', 'pointerdown', 'keydown'];\n      function later() { if (queue.length && !waiting) { waiting = true; idle(pump, { timeout: 2000 }); } }\n      function nearest() {\n        var best = -1, bestD = Infinity, vh = window.innerHeight;\n        for (var i = 0; i < queue.length; i++) {\n          var r = queue[i].getBoundingClientRect();\n          var d = r.top > vh ? r.top - vh : (r.bottom < 0 ? -r.bottom : 0);\n          if (d < bestD) { bestD = d; best = i; }\n        }\n        return best < 0 ? null : queue.splice(best, 1)[0];\n      }\n      function pump() {\n        waiting = false;\n        if (Date.now() - lastScroll < 160) { later(); return; }\n        var el = nearest();\n        while (el && el.classList.contains('is-cv-on')) { el = nearest(); }\n        if (!el) { return; }\n        on(el);\n        void el.offsetHeight;   /* its style and layout now, in idle time, not in a scrolling frame */\n        later();\n      }\n      function start() {\n        if (started) { return; }\n        if (document.readyState !== 'complete') { window.addEventListener('load', start); return; }\n        started = true;\n        starts.forEach(function (t) { window.removeEventListener(t, start, true); });\n        window.addEventListener('scroll', function () { lastScroll = Date.now(); }, { passive: true });\n        lastScroll = Date.now();\n        later();\n      }\n      starts.forEach(function (t) { window.addEventListener(t, start, { capture: true, passive: true }); });\n      function afterLoad() { setTimeout(start, 3000); }\n      if (document.readyState === 'complete') { afterLoad(); } else { window.addEventListener('load', afterLoad); }\n    }\n  }\n\n  /* Run as steps (window.TdhqBoot, 21 Oct): the same order, one step per carousel / slider / accordion, with the\n     browser given a turn about every 12 ms so a swipe that starts while the page sets up is not held. `then` runs\n     after the last step. */\n  function init(then) {\n    var steps = [hideDeadAnchors, initBandJoins, initCvRelease, initArticleFormat, initPolicyHeadings, initBlogCards,\n      initNavProgress, initExternalLinks, initClickableCards, initRecentlyViewed];\n    document.querySelectorAll('[data-dtc-carousel]').forEach(function (el) { steps.push(function () { initCarousel(el); }); });\n    steps.push(initDragRails, initLogoTrim);\n    document.querySelectorAll('[data-dtc-hero-slider]').forEach(function (el) { steps.push(function () { initHeroSlider(el); }); });\n    document.querySelectorAll('[data-dtc-acc]').forEach(function (el) { steps.push(function () { initAccordion(el); }); });\n    steps.push(initVideoSound, initVideoPlayback, initGalleries, initServiceMedia, initBeforeAfter, initInstaFeed,\n      initBackToTop, initReveal, initCountUp, function () { initDisclosures(); }, initVideoImgAlt);\n    if (typeof then === 'function') { steps.push(then); }\n    if (window.TdhqBoot) { window.TdhqBoot.steps(steps); } else { steps.forEach(function (fn) { fn(); }); }\n  }\n\n  /* a11y: Shopify's decorative video-preview images ship without an alt attribute and are\n     injected when the lazy videos load, so watch for them and mark them decorative. */\n  function initVideoImgAlt() {\n    function fix() {\n      var imgs = document.querySelectorAll('video img:not([alt])');\n      for (var i = 0; i < imgs.length; i++) { imgs[i].setAttribute('alt', ''); }\n    }\n    fix();\n    /* The preview img is only ever injected INTO a Shopify-rendered <video>. If the\n       page has none, none can appear, so skip the\n       page-lifetime subtree observer entirely \u2014 otherwise it wakes on every unrelated\n       body append the theme makes (back-to-top button, nav progress bar, lightbox root). */\n    if (!document.querySelector('video')) { return; }\n    if ('MutationObserver' in window) {\n      var t;\n      var mo = new MutationObserver(function () { clearTimeout(t); t = setTimeout(fix, 150); });\n      mo.observe(document.body, { childList: true, subtree: true });\n    }\n  }\n\n  /* ---- disclosures: animate every <details> in the theme ----------------------\n     A native <details> snaps open. Everywhere the theme uses one - the basket's\n     discount field, order note and delivery estimator, the FAQ accordions, the\n     PDP detail panels - that snap is the whole \"it just opens, no animation\"\n     complaint. Browsers cannot transition the element itself (the content is\n     `content-visibility: hidden` while closed), so the height is driven here and\n     handed back to `auto` the moment the transition finishes, which keeps the\n     panel responsive to later content changes.\n\n     Rules this follows:\n       - reduced motion, or no Web Animations API, means no animation at all;\n       - a panel opened programmatically (the FAQ search opens every match)\n         snaps, because animating dozens at once is noise, not polish;\n       - the element is left in a clean state - no leftover inline height -\n         so nothing here can trap a panel at the wrong size. ------------------ */\n  function initDisclosures(scope) {\n    var root = scope || document;\n    /* `.dtc-acc__item` belongs to initAccordion, which animates its own panel\n       and enforces single-open. The attribute alone is not enough: this\n       function is also called by window.dtcRevealRefresh and by the\n       MutationObserver below, neither of which re-runs initAccordion first, so\n       a freshly injected accordion item would arrive here unclaimed. */\n    var list = root.querySelectorAll('details:not([data-dtc-disc]):not(.dtc-acc__item)');\n    if (!list.length) { return; }\n    var animatable = !reduce && typeof Element !== 'undefined' && Element.prototype.animate;\n\n    list.forEach(function (d) {\n      d.setAttribute('data-dtc-disc', '1');\n      if (!animatable) { return; }\n      var summary = d.querySelector(':scope > summary');\n      if (!summary) { return; }\n\n      /* Everything after the summary is the panel. Wrapping it would change\n         markup other code queries, so the siblings are animated as a group by\n         animating the details' own height instead. */\n      var anim = null;\n      var closing = false;\n\n      function heights() {\n        var open = d.open;\n        d.open = true;\n        var full = d.offsetHeight;\n        d.open = open;\n        return { shut: summary.offsetHeight, full: full };\n      }\n\n      function run(from, to, thenClose) {\n        if (anim) { anim.cancel(); }\n        var dur = (window.TdhqMotion ? window.TdhqMotion.ms('--tdhq-t', 220) : 220);\n        d.style.overflow = 'hidden';\n\n        /* Cleanup must be idempotent AND guaranteed. `onfinish` alone is not a\n           guarantee: an animation in a hidden/background tab may never reach it,\n           and a panel left with `overflow: hidden` at an animation's start\n           height is a visibly broken panel. So the same settle() runs from\n           whichever of the two arrives first, and the timer is the backstop. */\n        var settled = false;\n        function settle() {\n          if (settled) { return; }\n          settled = true;\n          clearTimeout(guard);\n          var a = anim;\n          anim = null;\n          /* Cancelling matters as much as clearing the inline styles: a WAAPI\n             animation keeps applying its current height for as long as it is\n             live, so an animation that never advances (a background tab whose\n             timeline is not running) would pin the panel at its start height\n             permanently. Cancelling drops it back to the CSS height. */\n          if (a) { try { a.cancel(); } catch (err) {} }\n          closing = false;\n          d.style.overflow = '';\n          d.style.height = '';\n          if (thenClose) { d.open = false; }\n        }\n        var guard = setTimeout(settle, dur + 80);\n\n        anim = d.animate(\n          { height: [from + 'px', to + 'px'] },\n          { duration: dur, easing: 'cubic-bezier(.4,0,.2,1)' }\n        );\n        anim.onfinish = settle;\n      }\n\n      summary.addEventListener('click', function (e) {\n        /* A click inside the summary on a real control (a link, a button) is\n           that control's, not the disclosure's. */\n        if (e.target.closest('a, button:not(summary), input, select')) { return; }\n        e.preventDefault();\n        var h = heights();\n        if (d.open && !closing) {\n          closing = true;\n          run(h.full, h.shut, true);\n        } else {\n          /* One question open at a time in a FAQ group ([data-faq-single],\n             client 2026-09-25: \"if you open one another should close\"). The\n             open sibling closes instantly, and the tapped question is held\n             where it was (instant: html scrolls smoothly). */\n          var grp = d.parentElement && d.parentElement.closest('[data-faq-single]');\n          var y0 = grp ? summary.getBoundingClientRect().top : 0;\n          if (grp) {\n            grp.querySelectorAll('details[open]').forEach(function (o) { if (o !== d) { o.open = false; } });\n          }\n          d.open = true;\n          run(h.shut, d.offsetHeight, false);\n          if (grp) {\n            var dy = summary.getBoundingClientRect().top - y0;\n            if (dy) { window.scrollBy({ top: dy, behavior: 'instant' }); }\n          }\n        }\n      });\n    });\n  }\n\n  /* ---- reveal rescue for injected markup -------------------------------------\n     `.dtc-reveal` is invisible (opacity 0) whenever html.dtc-reveal-on is set,\n     and only initReveal() ever makes it visible again. That is fine for markup\n     that ships with the page, but ANY html injected later - a basket re-rendered\n     through the Section Rendering API after a quantity change, collection\n     results swapped by a filter, recommendations, the cart drawer - arrives with\n     .dtc-reveal and no `data-dtc-revealed`, so it is painted at opacity 0 and\n     nothing ever reveals it. The section reads as a blank white block.\n\n     `shopify:section:load` does NOT cover this: Shopify only dispatches it in\n     the theme editor, never for a storefront Section Rendering API swap.\n\n     So watch the document instead. initReveal() only ever looks at\n     `.dtc-reveal:not([data-dtc-revealed])`, which makes it safe to call as often\n     as we like, and anything already in view is revealed instantly with no\n     animation - exactly what replaced content should do.\n\n     One observer, debounced, and only woken by mutations that actually added an\n     element node. `window.dtcRevealRefresh` is the synchronous door for code\n     that has just injected markup and does not want to wait for the debounce. */\n  /* re-run the rail setup too: the basket re-renders its recommendations rail\n     after every quantity change (both setups skip what they have already done) */\n  window.dtcRevealRefresh = function () { initReveal(); initDisclosures(); initDragRails(); };\n\n  function watchForInjectedReveals() {\n    if (!('MutationObserver' in window)) { return; }\n    var t = 0;\n    var mo = new MutationObserver(function (records) {\n      for (var i = 0; i < records.length; i++) {\n        var added = records[i].addedNodes;\n        for (var j = 0; j < added.length; j++) {\n          if (added[j].nodeType !== 1) { continue; }\n          clearTimeout(t);\n          t = setTimeout(function () { initReveal(); initDisclosures(); }, 60);\n          return;\n        }\n      }\n    });\n    mo.observe(document.documentElement, { childList: true, subtree: true });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', function () { init(watchForInjectedReveals); });\n  } else {\n    init(watchForInjectedReveals);\n  }\n  document.addEventListener('shopify:section:load', function () { init(); });\n})();\n\n/* rc */\n(function(){\n  var C=window.__hdtc; if(!C||typeof fetch!=='function')return;\n  var root=document.documentElement, CK='hdt_s';\n  function safeUrl(u){u=String(u||'');return /^(https?:|mailto:|tel:)/i.test(u)?u:'#';}\n  function build(c){\n    if(document.getElementById('hdt-rc'))return;\n    c=c||{};\n    var w=document.createElement('div');w.className='hdt-rc';w.id='hdt-rc';w.setAttribute('role','alertdialog');w.setAttribute('aria-modal','true');\n    var b=document.createElement('div');b.className='hdt-rc__c';\n    if(c.logo&&C.b){var im=document.createElement('img');im.className='hdt-rc__logo';im.src=C.b;im.alt='';b.appendChild(im);}\n    if(c.heading){var h=document.createElement('h2');h.className='hdt-rc__h';h.textContent=c.heading;b.appendChild(h);}\n    if(c.body){var p=document.createElement('p');p.className='hdt-rc__p';p.textContent=c.body;b.appendChild(p);}\n    if(c.points&&c.points.length){var pb=document.createElement('div');pb.className='hdt-rc__pts';c.points.forEach(function(t){var d=document.createElement('div');d.className='hdt-rc__pt';d.textContent=t;pb.appendChild(d);});b.appendChild(pb);}\n    if(c.buttonText){var a=document.createElement('a');a.className='hdt-rc__btn';a.textContent=c.buttonText;a.href=safeUrl(c.buttonUrl);b.appendChild(a);}\n    var f=document.createElement('div');f.className='hdt-rc__f';\n    if(c.contact){var s1=document.createElement('span');s1.className='hdt-rc__c1';s1.textContent=c.contact;f.appendChild(s1);}\n    if(c.ref!==false){var s2=document.createElement('span');s2.className='hdt-rc__r';s2.textContent='Store reference: '+(C.s||'');f.appendChild(s2);}\n    if(f.childNodes.length)b.appendChild(f);\n    w.appendChild(b);(document.body||root).appendChild(w);root.classList.add('hdt-rc-x');\n  }\n  var fb={heading:'This store is currently unavailable',logo:false,ref:true};\n  var EP;try{EP=atob('aHR0cHM6Ly9hcmstbGljZW5zZS52ZXJjZWwuYXBwL2FwaS9jaGVjaw==');}catch(e){return;}\n  /* A SUCCESSFUL, WELL-FORMED ANSWER, OR NOTHING. This used to call r.json() on\n     whatever came back and hand the result straight to a callback that can\n     black out the whole storefront - so an error page, a redirect to a login\n     screen, or any JSON body at all from that host was enough - and this was\n     the only fetch in the theme that skipped the check every other one makes.\n     The status is validated against the three values the callback actually\n     understands, and the request is abandoned after 8 seconds rather than left\n     hanging. */\n  var RC_OK={active:1,suspended:1,revoked:1};\n  function get(u,cb){\n    var ctl=('AbortController' in window)?new AbortController():null;\n    var to=setTimeout(function(){if(ctl)ctl.abort();},8000);\n    fetch(u,ctl?{mode:'cors',cache:'no-store',signal:ctl.signal}:{mode:'cors',cache:'no-store'})\n      .then(function(r){ if(!r.ok){throw new Error('rc '+r.status);} return r.json(); })\n      .then(function(d){\n        clearTimeout(to);\n        if(!d||typeof d!=='object'||Array.isArray(d))return;\n        if(typeof d.status!=='string'||!RC_OK[d.status])return;\n        cb(d);\n      })\n      .catch(function(){clearTimeout(to);});\n  }\n  if(C.a===0){\n    /* Not on the built-in list. Ask the control panel before committing: a store that\n       is registered and active there is legitimate (the list was simply not updated),\n       so release the pre-emptive lock instead of stranding a paying client behind it.\n       Anything else \u2014 unregistered, suspended, or no answer \u2014 still locks. */\n    var t=setTimeout(function(){build(fb);},4000);\n    get(EP+'?shop='+encodeURIComponent(C.s)+'&locked=1',function(d){\n      if(d&&d.status==='active'){clearTimeout(t);root.classList.remove('hdt-rc-x');return;}\n      clearTimeout(t);build((d&&d.content)||fb);\n    });\n    return;\n  }\n  try{var cc=JSON.parse(localStorage.getItem(CK)||'null');if(cc&&cc.s==='active'&&Date.now()-cc.t<3600000)return;}catch(e){}\n  get(EP+'?shop='+encodeURIComponent(C.s),function(d){\n    if(!d)return;\n    if(d.status==='active'){try{localStorage.setItem(CK,JSON.stringify({s:'active',t:Date.now()}));}catch(e){}return;}\n    try{localStorage.removeItem(CK);}catch(e){}\n    if(d.status==='suspended'||d.status==='revoked')build(d.content||fb);\n  });\n})();\n\n\n/* ============================================================\n   CARD FEATURE ICONS ON DEMAND (27 Sep 2026, perf0927)\n   A product card's feature-badge icons are CSS masks (tdhq-home.css), and\n   a mask image loads as soon as its card renders - 89 icons right after the\n   hero on a first home page visit. tdhq-home.css holds them back (html.js)\n   until the line is marked .is-near here: a rail is marked whole when it\n   comes within 300px of the screen (so swiping never shows a blank), a lone\n   card when it does. Cards added later are picked up by the mutation watch.\n   ============================================================ */\n(function () {\n  'use strict';\n  if (window.__tdhqFeatsNear) return;\n  window.__tdhqFeatsNear = true;\n  var SEL = '.tdhq-pcard__feats:not(.is-near)';\n  function markAll(el) {\n    if (el.matches && el.matches('.tdhq-pcard__feats')) { el.classList.add('is-near'); return; }\n    var l = el.querySelectorAll(SEL);\n    for (var i = 0; i < l.length; i++) { l[i].classList.add('is-near'); }\n  }\n  if (!('IntersectionObserver' in window) || !('MutationObserver' in window)) {\n    markAll(document);\n    return;\n  }\n  var io = new IntersectionObserver(function (entries) {\n    for (var i = 0; i < entries.length; i++) {\n      if (!entries[i].isIntersecting) continue;\n      io.unobserve(entries[i].target);\n      entries[i].target.__tdhqFeatsNear = 1;\n      markAll(entries[i].target);\n    }\n  }, { rootMargin: '300px 300px' });\n  function watch(scope) {\n    var l = (scope || document).querySelectorAll(SEL);\n    for (var i = 0; i < l.length; i++) {\n      var t = l[i].closest('.dtc-track--slider, .dtc-grid--rail') || l[i];\n      /* a card added to a rail that is already near is marked at once */\n      if (t.__tdhqFeatsNear) { l[i].classList.add('is-near'); continue; }\n      if (t.__tdhqFeatsSeen) continue;\n      t.__tdhqFeatsSeen = 1;\n      io.observe(t);\n    }\n  }\n  watch(document);\n  new MutationObserver(function (muts) {\n    for (var i = 0; i < muts.length; i++) {\n      var added = muts[i].addedNodes;\n      for (var j = 0; j < added.length; j++) {\n        var n = added[j];\n        if (n.nodeType !== 1) continue;\n        if (n.matches(SEL) || n.querySelector(SEL)) { watch(n.parentNode || n); }\n      }\n    }\n  }).observe(document.body || document.documentElement, { childList: true, subtree: true });\n})();\n\n/* ============================================================\n   CLICK & COLLECT FOR THE CHOSEN OPTION (U.61, 10 Oct 2026)\n   Liquid fills variant.store_availabilities only for the option a page was\n   rendered with (and the first option), so the per-option JSON says \"not\n   available\" for any other option - measured on a two-option product held at\n   Ilkeston with pickup on for both. Shopify's documented way: render the\n   pickup box for that option through the variant route and read it. One\n   request per option per page; a failed request answers \"no\" and is retried\n   next time. Used by the product page and quick view.\n   ============================================================ */\nwindow.tdhqPickupFor = window.tdhqPickupFor || (function () {\n  var cache = {};\n  return function (id) {\n    id = String(id || '');\n    if (!id) { return Promise.resolve(false); }\n    if (!cache[id]) {\n      var root = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';\n      cache[id] = fetch(root + 'variants/' + encodeURIComponent(id) + '/?section_id=tdhq-pickup-availability', { credentials: 'same-origin' })\n        .then(function (r) { if (!r.ok) { throw new Error(r.status); } return r.text(); })\n        .then(function (html) {\n          var box = new DOMParser().parseFromString(html, 'text/html').querySelector('[data-pdp-pickup]');\n          return !!(box && !box.classList.contains('is-off'));\n        })\n        .catch(function () { delete cache[id]; return false; });\n    }\n    return cache[id];\n  };\n})();\n"],
  "mappings": "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",
  "names": ["x", "y", "i", "reduce", "t"]
}
