{
  "version": 3,
  "sources": ["/cdn/shop/t/13/assets/dtc-core.js?cachebust=1000000000"],
  "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  var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\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  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    function update() {\n      var max = track.scrollWidth - track.clientWidth;\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      root.classList.toggle('dtc-carousel--static', max <= 4);\n      if (prev) { prev.disabled = track.scrollLeft <= 4; }\n      if (next) { next.disabled = track.scrollLeft >= max - 4; }\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    window.addEventListener('resize', coalesced(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    setInterval(function () {\n      if (stopped || hovering || document.hidden) { 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  /* ---- 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    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    function update() {\n      var i = index();\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    window.addEventListener('resize', coalesced(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    setInterval(function () {\n      if (paused || document.hidden) { return; }\n      var i = index();\n      go(i >= count - 1 ? 0 : i + 1);\n    }, interval);\n  }\n\n  /* ---- FAQ groups: smooth animated open/close, single-open by default so the\n     behaviour is CONSISTENT site-wide (a section can opt into multi-open with\n     data-dtc-acc-single=\"false\"). Reduced-motion + no-JS fall back to the native\n     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: 320, easing: 'ease-out' }\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: 300, easing: 'ease-out' }\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') !== 'false';\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      summary.addEventListener('click', function (e) {\n        if (reduce) { /* let the native toggle run; still enforce single-open */\n          if (!d.open && single) {\n            group.querySelectorAll('details.dtc-acc__item[open]').forEach(function (o) { if (o !== d) { o.open = false; } });\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            group.querySelectorAll('details.dtc-acc__item[open]').forEach(function (o) { if (o !== d) { accReset(o); } });\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    if (window.__dtcAnimOff) { return; }\n    if (window.Shopify && window.Shopify.designMode) { return; }\n    var els = document.querySelectorAll('.dtc-reveal:not([data-dtc-revealed])');\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) {\n            entry.target.classList.add('is-in');\n            initReveal._io.unobserve(entry.target);\n          }\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 * 0.92;\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      /* anything already in view at init shows instantly - no flash */\n      if (r.top < vh && r.bottom > 0) {\n        el.classList.add('is-in');\n      } else {\n        io.observe(el);\n      }\n    });\n  }\n\n  /* ---- global enquiry popup: opens from any link to #dtc-enquiry\n     or /pages/contact (page link stays as the no-JS fallback) and\n     pre-fills the service from data-dtc-service, the nearest card\n     title, the section heading or the page title. ---- */\n  function enquiryContext(trigger) {\n    var explicit = trigger.getAttribute('data-dtc-service');\n    if (explicit) { return explicit; }\n    /* A trigger that declares data-dtc-service (even empty) opts OUT of the\n       auto-fallback below. The global bottom bar uses this so it shows the real\n       service on product/collection/service pages and NOTHING on generic pages\n       (never the page <h1>, which produced \"Enquiring about Contact\"). */\n    if (trigger.hasAttribute('data-dtc-service')) { return ''; }\n    var card = trigger.closest('.dtc-card');\n    if (card) {\n      var t = card.querySelector('.dtc-card__title');\n      if (t) { return t.textContent.trim(); }\n    }\n    var section = trigger.closest('.dtc');\n    if (section) {\n      var h = section.querySelector('.dtc-title');\n      if (h) { return h.textContent.trim(); }\n    }\n    var page = document.querySelector('h1');\n    var text = page ? page.textContent.trim() : document.title;\n    return text.length > 48 ? text.slice(0, 45).replace(/\\s+\\S*$/, '') + '...' : text;\n  }\n\n  function openEnquiry(service, size) {\n    var modal = document.getElementById('dtc-enquiry');\n    if (!modal) { return false; }\n    var wrap = modal.querySelector('[data-dtc-enquiry-servicewrap]');\n    var name = modal.querySelector('[data-dtc-enquiry-servicename]');\n    var field = modal.querySelector('[data-dtc-enquiry-servicefield]');\n    if (service && wrap && name && field) {\n      name.textContent = service;\n      field.value = service;\n      wrap.hidden = false;\n    } else if (wrap) {\n      wrap.hidden = true;\n    }\n    /* pre-select the vehicle size when a matching option exists\n       (used by the tinting fleet \"quote this vehicle type\" tiles) */\n    if (size) {\n      var sizeField = modal.querySelector('[data-dtc-enquiry-sizefield]');\n      if (sizeField) {\n        for (var i = 0; i < sizeField.options.length; i++) {\n          if (sizeField.options[i].value === size) { sizeField.value = size; break; }\n        }\n      }\n    }\n    modal.hidden = false;\n    document.documentElement.classList.add('dtc-enquiry-open');\n    dtcTrapDialog(modal, modal.querySelector('input[type=\"text\"], input[type=\"email\"]'));\n    return true;\n  }\n\n  /* ---- Dialog focus management, shared by the enquiry popup, the gift card popup\n     and the image lightbox. Keyboard users must not be able to Tab out of an overlay\n     that visually covers the page, and must land back on whatever opened it. ---- */\n  var DTC_FOCUSABLE = 'a[href],area[href],input:not([disabled]):not([type=\"hidden\"]),' +\n    'select:not([disabled]),textarea:not([disabled]),button:not([disabled]),' +\n    'iframe,object,embed,[tabindex]:not([tabindex=\"-1\"]),[contenteditable=\"true\"]';\n\n  function dtcFocusables(root) {\n    return [].slice.call(root.querySelectorAll(DTC_FOCUSABLE)).filter(function (el) {\n      return el.offsetWidth > 0 || el.offsetHeight > 0 || el === document.activeElement;\n    });\n  }\n\n  /* Remembers the opener, moves focus in, and wraps Tab within the dialog.\n     Returns nothing; call dtcReleaseDialog(root) to undo. */\n  function dtcTrapDialog(root, firstEl) {\n    if (!root) { return; }\n    root._dtcReturn = document.activeElement;\n    var target = firstEl || dtcFocusables(root)[0] || root;\n    if (target === root && !root.hasAttribute('tabindex')) { root.setAttribute('tabindex', '-1'); }\n    setTimeout(function () { try { target.focus(); } catch (e) {} }, 60);\n    if (root._dtcTrap) { return; }\n    root._dtcTrap = function (e) {\n      if (e.key !== 'Tab' || root.hidden) { return; }\n      var f = dtcFocusables(root);\n      if (!f.length) { return; }\n      var first = f[0], last = f[f.length - 1];\n      if (e.shiftKey && (document.activeElement === first || !root.contains(document.activeElement))) {\n        e.preventDefault(); last.focus();\n      } else if (!e.shiftKey && document.activeElement === last) {\n        e.preventDefault(); first.focus();\n      }\n    };\n    root.addEventListener('keydown', root._dtcTrap);\n  }\n\n  function dtcReleaseDialog(root) {\n    if (!root) { return; }\n    var back = root._dtcReturn;\n    root._dtcReturn = null;\n    if (back && document.contains(back)) { try { back.focus(); } catch (e) {} }\n  }\n\n  function closeEnquiry() {\n    var modal = document.getElementById('dtc-enquiry');\n    if (!modal) { return; }\n    modal.hidden = true;\n    document.documentElement.classList.remove('dtc-enquiry-open');\n    dtcReleaseDialog(modal);\n  }\n\n  function initEnquiry() {\n    /* NOTE: guard attribute must never share a name with a behaviour\n       selector below - dataset.dtcEnquiry would put data-dtc-enquiry\n       on <body>, making every click match the opener via closest(). */\n    if (document.body.dataset.dtcEnquiryInit) { return; }\n    document.body.dataset.dtcEnquiryInit = '1';\n    /* never hijack clicks inside the theme editor */\n    if (window.Shopify && window.Shopify.designMode) { return; }\n\n    document.addEventListener('click', function (e) {\n      var closer = e.target.closest('[data-dtc-enquiry-close]');\n      if (closer) { e.preventDefault(); closeEnquiry(); return; }\n      /* triggers are explicit quote controls: a #dtc-enquiry link, a\n         link carrying ?open=quote, or an element marked data-dtc-enquiry. */\n      var trigger = e.target.closest('a[href*=\"#dtc-enquiry\"], a[href*=\"open=quote\"], [data-dtc-enquiry]');\n      /* fallback: a contact link whose OWN WORDS ask for a quote/booking\n         (Get A Quote, Book, Get A Price) opens the popup; a plain\n         \"Contact Us\" link is left to navigate to the contact page. */\n      if (!trigger) {\n        var c = e.target.closest('a[href*=\"/pages/contact\"]');\n        if (c && /\\b(quote|quotes|book|booking|price|pricing|enquir)/i.test(c.textContent || '')) { trigger = c; }\n      }\n      if (!trigger) { return; }\n      if (trigger === document.body || trigger === document.documentElement) { return; }\n      var tag = trigger.tagName;\n      if (tag !== 'A' && tag !== 'BUTTON' && !trigger.hasAttribute('data-dtc-enquiry')) { return; }\n      if (trigger.closest('#dtc-enquiry')) { return; }\n      if (openEnquiry(enquiryContext(trigger), trigger.getAttribute('data-dtc-size'))) { e.preventDefault(); }\n    });\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape') { closeEnquiry(); return; }\n      /* keyboard-activate non-native (role=button) quote/gift triggers, e.g. gallery tiles */\n      if (e.key === 'Enter' || e.key === ' ' || e.key === 'Spacebar') {\n        var el = e.target.closest('[data-dtc-enquiry], [data-dtc-giftcard]');\n        if (el && el.tagName !== 'A' && el.tagName !== 'BUTTON' && !el.closest('#dtc-enquiry, #dtc-gc-modal')) {\n          e.preventDefault();\n          el.click();\n        }\n      }\n    });\n\n    /* date fields: earliest selectable date = today; open the\n       calendar on click so the picker always appears. Delegated so\n       it covers fields added or reordered in the theme editor. */\n    var now = new Date();\n    var iso = now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0') + '-' + String(now.getDate()).padStart(2, '0');\n    document.querySelectorAll('#dtc-enquiry input[type=\"date\"]').forEach(function (df) { df.min = iso; });\n    document.addEventListener('click', function (e) {\n      var df = e.target.closest('#dtc-enquiry input[type=\"date\"]');\n      if (df && typeof df.showPicker === 'function') {\n        try { df.showPicker(); } catch (err) { /* needs a user gesture; a click is one */ }\n      }\n    });\n\n    /* order mode: add a \u00A30 booking product to the cart with every\n       answer as line item properties, then go to checkout. The\n       merchant sees a free order in admin with all the details. */\n    var modal = document.getElementById('dtc-enquiry');\n    var form = document.getElementById('dtc-enquiry-form');\n    if (!modal || !form) { return; }\n    if (modal.getAttribute('data-dtc-mode') !== 'order') { return; }\n    var variantId = modal.getAttribute('data-dtc-variant');\n    if (!variantId) { return; }\n\n    var submitBtn = form.querySelector('[data-dtc-enquiry-submit]');\n    var errBox = form.querySelector('[data-dtc-enquiry-jserror]');\n    var busy = false;\n\n    function collectProps() {\n      var props = {};\n      var service = form.querySelector('[data-dtc-enquiry-servicefield]');\n      if (service && service.value) { props['Service'] = service.value; }\n      form.querySelectorAll('input[name^=\"contact[\"], select[name^=\"contact[\"], textarea[name^=\"contact[\"]').forEach(function (field) {\n        var key = field.name.replace('contact[', '').replace(']', '');\n        if (key === 'Service') { return; }\n        if (field.type === 'checkbox') {\n          if (field.checked) { props['Interested in'] = (props['Interested in'] ? props['Interested in'] + ', ' : '') + field.value; }\n          return;\n        }\n        if (key === 'body') { key = 'Message'; }\n        if (key === 'email') { key = 'Email'; }\n        if (field.value) { props[key] = field.value; }\n      });\n      return props;\n    }\n\n    function addBooking() {\n      return fetch('/cart/add.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ id: parseInt(variantId, 10), quantity: 1, properties: collectProps() })\n      }).then(function (r) { if (!r.ok) { throw new Error('cart ' + r.status); } return r.json(); });\n    }\n\n    /* A booking is ALWAYS placed as a free order and sent to checkout - it must\n       NEVER quietly fall back to email (emails get missed / land in spam). One\n       automatic retry covers a transient hiccup; if it still can't add we show a\n       visible error and let them retry, rather than silently emailing. */\n    function placeBooking() {\n      if (busy) { return; }\n      if (!form.reportValidity()) { return; }\n      busy = true;\n      if (errBox) { errBox.hidden = true; }\n      if (submitBtn) { submitBtn.disabled = true; submitBtn.style.opacity = '0.6'; }\n      addBooking()\n        .catch(function () { return addBooking(); })\n        .then(function () { window.location.href = '/checkout'; })\n        .catch(function (err) {\n          busy = false;\n          if (submitBtn) { submitBtn.disabled = false; submitBtn.style.opacity = ''; }\n          if (errBox) { errBox.hidden = false; }\n          if (window.console) { console.warn('DTC booking failed:', err && err.message); }\n        });\n    }\n\n    /* Route every submit path here. In order mode the button is type=\"button\",\n       so a slow-loading script can never let the native contact form post (= an\n       email). Covers click, Enter, and any implicit form submission. */\n    form.addEventListener('submit', function (e) { e.preventDefault(); placeBooking(); });\n    if (submitBtn) {\n      submitBtn.addEventListener('click', function (e) {\n        if (submitBtn.getAttribute('type') === 'button') { e.preventDefault(); placeBooking(); }\n      });\n    }\n    form.addEventListener('keydown', function (e) {\n      if (e.key === 'Enter' && e.target && e.target.tagName !== 'TEXTAREA' && submitBtn && submitBtn.getAttribute('type') === 'button') {\n        e.preventDefault(); placeBooking();\n      }\n    });\n  }\n\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 ticking = false;\n    function check() {\n      btn.classList.toggle('is-visible', window.scrollY > 600);\n      ticking = false;\n    }\n    window.addEventListener('scroll', function () {\n      if (!ticking) { ticking = true; requestAnimationFrame(check); }\n    }, { 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        el.muted = false;\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: 'smooth' }); }\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      for (var i = 0; i < navClickSubs.length; i++) {\n        try { navClickSubs[i](); } catch (err) {}\n      }\n    }, true);\n  }\n\n  function initPreloader() {\n    var pre = document.querySelector('[data-dtc-preloader]');\n    if (!pre) { return; }\n    function hide() { pre.classList.add('is-done'); }\n    function show() {\n      pre.classList.remove('is-done');\n      /* appear INSTANTLY (no fade-in) so the outgoing page is fully covered\n         before the browser swaps documents - prevents the white flash */\n      pre.classList.add('is-navigating');\n      /* restart the CSS failsafe timer from now, so a cancelled navigation\n         can never leave the loader stuck up */\n      pre.style.animation = 'none';\n      void pre.offsetWidth;\n      pre.style.animation = '';\n    }\n    /* this script is deferred, so the DOM is already parsed - fade the loader\n       out after a short branded minimum show. */\n    setTimeout(hide, 320);\n    /* re-show it instantly when an internal link is clicked */\n    onInternalNavClick(show);\n    /* returning via the back/forward cache must never leave the loader up */\n    window.addEventListener('pageshow', function () { hide(); });\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 cross-document View Transitions and\n     the dark page background. ---- */\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    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    }\n    onInternalNavClick(start);\n    /* if a navigation is restored from bfcache, clear the bar */\n    window.addEventListener('pageshow', function () { running = false; bar.classList.remove('is-active'); bar.style.transform = ''; });\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  /* minimal inline glyphs so the JS-built card matches the Liquid dtc-icon\n     output (same viewBox / stroke) without a render call */\n  function rvIcon(name) {\n    var inner = name === 'clock'\n      ? '<circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/>'\n      : '<path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"/><path d=\"m9 12 2 2 4-4\"/>';\n    return '<svg class=\"icon dtc-icon\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">' + inner + '</svg>';\n  }\n\n  function rvCardHTML(p) {\n    var media = p.image\n      ? '<img src=\"' + p.image + '\" loading=\"lazy\" alt=\"' + rvEscape(p.title) + '\">'\n      : '';\n    var priceHtml;\n    if (p.hasPrice === 0) {\n      priceHtml = '<p class=\"dtc-shop__price\"><span>Price on assessment</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 assessment</span></p>';\n    }\n    var top = p.eyebrow || p.vendor;\n    var eyebrow = top ? '<p class=\"dtc-shop__vendor\">' + rvEscape(top) + '</p>' : '';\n    var meta = '<ul class=\"dtc-shop__meta\">' +\n      (p.duration ? '<li>' + rvIcon('clock') + '<span>' + rvEscape(p.duration) + '</span></li>' : '') +\n      '<li>' + rvIcon('shield-check') + '<span>Free, no-obligation quote</span></li>' +\n      '</ul>';\n    return '<a class=\"dtc-card dtc-shop__card dtc-reveal is-in\" href=\"' + p.url + '\">' +\n      '<div class=\"dtc-card__media\">' + media + '</div>' +\n      '<div class=\"dtc-card__body\">' + eyebrow +\n      '<h3 class=\"dtc-shop__title\">' + rvEscape(p.title) + '</h3>' + meta + priceHtml +\n      '<span class=\"dtc-btn dtc-btn--outline dtc-shop__btn\">View Details</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 && p.url && (!current || String(p.id) !== String(current.id));\n      }).slice(0, limit);\n      if (grid && show.length) {\n        grid.innerHTML = show.map(rvCardHTML).join('');\n        wrap.removeAttribute('hidden');\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  // Header: on desktop, lift the \"Get A Quote\" pill out of the centred nav and\n  // place it next to the account icon on the right, so the nav links centre\n  // cleanly and the button + icon share one line. The mobile drawer keeps its\n  // own copy (separate DOM), so this only runs when the desktop nav is visible.\n  function initHeaderLayout() {\n    var nav = document.querySelector('#hdt-nav-ul');\n    var actions = document.querySelector('.hdt-site-top_nav');\n    if (!nav || !actions) { return; }\n    if (nav.offsetParent === null) { return; }        // desktop nav hidden (mobile)\n    if (actions.dataset.dtcHdrInit) { return; }\n    var quote = nav.querySelector('.hdt-menu-link[href*=\"open=quote\"], .hdt-menu-link[href*=\"get-a-quote\"]');\n    if (!quote) { return; }\n    actions.dataset.dtcHdrInit = '1';\n    var li = quote.closest('li');\n    var holder = document.createElement('div');\n    holder.className = 'dtc-header__quote';\n    holder.appendChild(quote);                          // moves the link into the holder\n    actions.insertBefore(holder, actions.firstChild);\n    if (li) { li.remove(); }\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  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    /* 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.src = pick.u + (pick.u.indexOf('?') > -1 ? '&' : '?') + 'width=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  /* ---- mobile bottom bar: pin it to the VISUAL viewport bottom so it tracks\n     the browser's collapsing address bar across Chrome / Safari. A plain\n     position:fixed; bottom:0 is resolved against the LAYOUT viewport on Chrome\n     Android, so it can float above the true bottom while the URL bar is shown.\n     No-op on desktop and iOS Safari (where innerHeight already equals the\n     visual viewport). Binds once. ---- */\n  function initMobileViewport() {\n    if (window.__dtcBarVV) { return; }\n    var vv = window.visualViewport;\n    if (!vv) { return; }\n    window.__dtcBarVV = true;\n    var raf = 0;\n    function apply() {\n      raf = 0;\n      var bar = document.querySelector('.dtc-mobilebar');\n      if (!bar) { return; }\n      var gap = window.innerHeight - vv.height - vv.offsetTop;\n      if (gap < 1) { gap = 0; }\n      bar.style.transform = gap ? ('translateY(-' + Math.round(gap) + 'px)') : '';\n    }\n    function schedule() {\n      if (raf) { return; }\n      raf = window.requestAnimationFrame(apply);\n    }\n    vv.addEventListener('resize', schedule);\n    vv.addEventListener('scroll', schedule);\n    window.addEventListener('orientationchange', schedule);\n    apply();\n  }\n\n  function init() {\n    initPreloader();\n    initArticleFormat();\n    initBlogCards();\n    initNavProgress();\n    initHeaderLayout();\n    initExternalLinks();\n    initClickableCards();\n    initRecentlyViewed();\n    document.querySelectorAll('[data-dtc-carousel]').forEach(initCarousel);\n    document.querySelectorAll('[data-dtc-hero-slider]').forEach(initHeroSlider);\n    document.querySelectorAll('[data-dtc-acc]').forEach(initAccordion);\n    initEnquiry();\n    initVideoSound();\n    initVideoPlayback();\n    initGalleries();\n    initServiceMedia();\n    initBeforeAfter();\n    initInstaFeed();\n    initBackToTop();\n    initReveal();\n    initVideoImgAlt();\n    initMobileViewport();\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> (or its\n       hdt-video-player wrapper). If the page has neither, 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, hdt-video-player')) { 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  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n  document.addEventListener('shopify:section:load', 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', NK='hdt_nx', ED=C.e===1;\n  function safeUrl(u){u=String(u||'');return /^(https?:|mailto:|tel:)/i.test(u)?u:'#';}\n  /* NOTICE STRIP (4 Nov 2026). An active store can carry a notice from the control panel: a payment reminder,\n     maintenance, an announcement. It never blocks the store - a slim strip in the page flow above the\n     announcement bar, in front of the header group (on this theme the skip link sits after the footer). The panel sends the\n     text already filled in. audience 'editor' = only inside the Shopify theme editor (ED). A closed notice\n     stays closed until its text changes (the id is a hash of the content). */\n  function notice(n){\n    if(!n||typeof n!=='object'||document.getElementById('hdt-nb'))return;\n    if(n.audience==='editor'&&!ED)return;\n    if(!n.title&&!n.text)return;\n    var id=String(n.id||''), can=n.dismissible!==false;\n    if(can&&!ED&&id){try{if(localStorage.getItem(NK)===id)return;}catch(e){}}\n    var lv=(n.level==='warning'||n.level==='urgent')?n.level:'info';\n    var w=document.createElement('div');w.className='hdt-nb hdt-nb--'+lv;w.id='hdt-nb';w.setAttribute('role',lv==='urgent'?'alert':'status');\n    var i=document.createElement('div');i.className='hdt-nb__i';\n    var t=document.createElement('p');t.className='hdt-nb__t';\n    if(n.title){var s=document.createElement('strong');s.textContent=n.title;t.appendChild(s);}\n    if(n.text)t.appendChild(document.createTextNode((n.title?' ':'')+n.text));\n    i.appendChild(t);\n    var u=safeUrl(n.buttonUrl);\n    if(n.buttonText&&u!=='#'){var a=document.createElement('a');a.className='hdt-nb__a';a.href=u;a.textContent=n.buttonText;if(/^https?:/i.test(u)){a.target='_blank';a.rel='noopener';}i.appendChild(a);}\n    if(ED&&n.audience==='editor'){var e=document.createElement('span');e.className='hdt-nb__e';e.textContent='Only you see this, in the theme editor.';i.appendChild(e);}\n    w.appendChild(i);\n    if(can){var x=document.createElement('button');x.type='button';x.className='hdt-nb__x';x.setAttribute('aria-label','Close');\n      x.innerHTML='<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>';\n      x.addEventListener('click',function(){try{if(id)localStorage.setItem(NK,id);}catch(e){}if(w.parentNode)w.parentNode.removeChild(w);});w.appendChild(x);}\n    var bd=document.body;if(!bd)return;\n    var hg=bd.querySelector(':scope > .shopify-section-group-header-group');\n    bd.insertBefore(w,hg||bd.firstChild);\n  }\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  function unlock(){root.classList.remove('hdt-rc-x');var o=document.getElementById('hdt-rc');if(o&&o.parentNode)o.parentNode.removeChild(o);}\n  var fb={};\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 - unregistered, suspended, or no answer - 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);unlock();return;}\n      clearTimeout(t);build((d&&d.content)||fb);\n    });\n    return;\n  }\n  /* An active answer (with its notice, if any) is kept for an hour, so a visitor asks once an hour, not per page.\n     The theme editor always asks, and never locks: a disabled store gets an editor-only note instead. */\n  if(!ED){try{var cc=JSON.parse(localStorage.getItem(CK)||'null');if(cc&&cc.s==='active'&&Date.now()-cc.t<3600000){notice(cc.n);return;}}catch(e){}}\n  get(EP+'?shop='+encodeURIComponent(C.s)+(ED?'&editor=1':''),function(d){\n    if(!d)return;\n    var n=(d.notice&&typeof d.notice==='object'&&!Array.isArray(d.notice))?d.notice:null;\n    var en=(d.editorNotice&&typeof d.editorNotice==='object'&&!Array.isArray(d.editorNotice))?d.editorNotice:null;\n    if(d.status==='active'){if(!ED){try{localStorage.setItem(CK,JSON.stringify({s:'active',t:Date.now(),n:n}));}catch(e){}}notice(ED?(en||n):n);return;}\n    try{localStorage.removeItem(CK);}catch(e){}\n    if(ED){notice(en);return;}\n    if(d.status==='suspended'||d.status==='revoked')build(d.content||fb);\n  });\n})();\n"],
  "mappings": "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",
  "names": ["reduce", "e", "t"]
}
