{
  "version": 3,
  "sources": ["/cdn/shop/t/26/assets/tdhq-header.js?b=20260923c"],
  "sourcesContent": ["/* ============================================================\n   TDHQ header behaviour \u2014 tdhq-header.js\n\n   Everything here is progressive enhancement. Without JS: search still\n   submits (real form + GET), every nav and mega-menu link still works\n   (real anchors, panels rendered server-side), and the announcement bar\n   is a swipeable rail. Nothing below is required to shop the site.\n\n   No dependencies. Deferred in the layout.\n   ============================================================ */\n(function () {\n  'use strict';\n\n  /* Shopify's JSON endpoints hand back UNSIZED originals (1500-2000px). The CDN\n     resizes on a `width` query parameter, so ask for what the box needs. Any\n     width already on the URL is replaced rather than duplicated. */\n  /* the site's one sized-picture helper (TdhqImg, layout head) */\n  function sizedImage(url, w) { return window.TdhqImg.sized(url, w); }\n\n  // Every tdhq- section includes nothing itself, but a section re-render in\n  // the theme editor can re-run this file. Guard so listeners bind once.\n  if (window.__tdhqHeaderLoaded) return;\n  window.__tdhqHeaderLoaded = true;\n\n  var reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n\n  /* Back to the top of the page, the tab bar's way (audit home-23, shop-21).\n     600px is where the old floating button used to appear. */\n  var TOP_TAP_MIN = 600;\n  function toTop() {\n    window.scrollTo({ top: 0, behavior: reduceMotion.matches ? 'auto' : 'smooth' });\n  }\n\n  /* ---------------------------------------------------------\n     Analytics. Non-personal parameters only.\n     The privacy rules forbid sending raw search text, customer names,\n     emails or account data, so search events carry counts, never the\n     query string itself.\n     --------------------------------------------------------- */\n  function track(name, params) {\n    var detail = params || {};\n    detail.device_type = window.innerWidth < 768 ? 'mobile'\n                       : window.innerWidth < 1100 ? 'tablet' : 'desktop';\n    if (Array.isArray(window.dataLayer)) {\n      window.dataLayer.push(Object.assign({ event: name }, detail));\n    }\n    document.dispatchEvent(new CustomEvent('tdhq:' + name, { detail: detail }));\n  }\n\n  /* Any element carrying data-tdhq-event reports a click \u2014 contact routes,\n     rewards CTAs, quick links. Non-personal: the method, a short label and\n     the destination path, never form values or account data. */\n  document.addEventListener('click', function (e) {\n    var el = e.target.closest('[data-tdhq-event]');\n    if (!el) return;\n    var label = (el.getAttribute('aria-label') || el.textContent || '').replace(/\\s+/g, ' ').trim().slice(0, 60);\n    var href = el.getAttribute('href') || '';\n    track(el.getAttribute('data-tdhq-event'), {\n      contact_method: el.getAttribute('data-tdhq-method') || '',\n      link_label: label,\n      destination: href.indexOf('http') === 0 ? href.split('?')[0] : href\n    });\n  });\n\n  /* ---------------------------------------------------------\n     RE-BINDING AFTER A SECTION RE-RENDER\n\n     The guard above stops this file's listeners being bound twice, and that is\n     right - but on its own it made the theme editor WORSE, not better. Editing\n     the header re-renders the section, Shopify swaps in brand new markup, and\n     the file returns early: the merchant is left looking at a header whose\n     mega menu, search, drawer and sticky state have no handlers at all, with\n     no clue that a preview reload would fix it.\n\n     So the per-element wiring is a function that can run again, and the\n     document- and window-level listeners it registers are tracked and removed\n     before each re-run. Without the tracking, re-binding would either stack up\n     duplicate handlers or leave the old ones closed over elements that are no\n     longer in the document.\n     --------------------------------------------------------- */\n  var bound = [];\n  function on(target, type, fn, opts) {\n    target.addEventListener(type, fn, opts);\n    bound.push([target, type, fn, opts]);\n  }\n  function unbindGlobals() {\n    for (var i = 0; i < bound.length; i++) {\n      bound[i][0].removeEventListener(bound[i][1], bound[i][2], bound[i][3]);\n    }\n    bound = [];\n  }\n\n  var header = document.querySelector('[data-tdhq-header]');\n\n  /* =========================================================\n     1. STICKY COMPACT STATE\n     Compact after ~120px. Never hide-and-reappear on scroll \u2014\n     an aggressively hiding header makes navigation feel unstable.\n     ========================================================= */\n  function sticky() {\n    if (!header) { return; }\n    var THRESHOLD = 120;\n    var stuck = false;\n    var queued = false;\n\n    /* ----------------------------------------------------------------\n       HOW TALL THE PINNED HEADER ACTUALLY IS, PUBLISHED TO THE PAGE.\n\n       --h-main and --h-nav are declared on .tdhq-header-wrap, so page content\n       cannot see them: every `top: calc(var(--h-main, 72px) + var(--h-nav,\n       52px) + 24px)` in the stylesheets was silently resolving to its 148px\n       FALLBACK, which is not the real height at any breakpoint - and elsewhere\n       the offset was a hard-coded 96px, which is not the height at any\n       breakpoint either. That is why the sticky filter panel and the sticky\n       product gallery parked underneath the header instead of below it.\n\n       Measuring is the only honest source: it accounts for the announcement\n       bar scrolling away, the compact sticky state, the per-breakpoint logo\n       and nav sizes, and any of them changing.\n       ---------------------------------------------------------------- */\n    var section = header.closest('.tdhq-header-section') || header;\n    var rootStyle = document.documentElement.style;\n\n    /* NO ROOT WRITES WHILE SCROLLING (owner 20 Oct 2026: on phones the header\n       \"stutters and clips\" when scrolling down and back up).\n       --tdhq-sticky-h and --tdhq-anchor-h live on <html>, so every write\n       restyles the whole document: measured 260-290ms per write on the home\n       page at phone speed (4x CPU, 6,000 elements). Audit MOT-04 had cut the\n       per-frame writes to one per pin, but that one still froze the page as it\n       left the top and again as it came back. Everything that reads\n       --tdhq-sticky-h matters only while the header is pinned (the sticky\n       gallery, sidebars, contents lists, scroll offsets), so it holds the\n       PINNED height, written at load and when a real size change settles.\n       --tdhq-anchor-h differs between the two states only where pinning\n       shrinks the header in the page flow (desktop, tablet), so only there is\n       it written at a pin or unpin; on a phone both states are the same height\n       and nothing is written while the page scrolls. */\n    /* Start from the values already in force (tdhq-core.css sets the phone ones), so a value that is already\n       right is never written: the first write at load restyled the whole page for nothing (22 Oct 2026). */\n    var rootNow = window.getComputedStyle(document.documentElement);\n    var lastH = rootNow.getPropertyValue('--tdhq-sticky-h').trim(), lastA = rootNow.getPropertyValue('--tdhq-anchor-h').trim();\n    var pinnedH = 0, fullH = 0, stuckH = 0, flowShrink = 0, settleTimer = 0;\n    function write(px) {\n      var v = Math.round(px) + 'px';\n      if (v === lastH) { return; }\n      lastH = v;\n      rootStyle.setProperty('--tdhq-sticky-h', v);\n    }\n    /* WHERE AN IN-PAGE LINK LANDS (audit MOT-03). The browser fixes an anchor's\n       destination at the click, while the header is still full height; it then\n       pins and shrinks mid-scroll, so the target landed 52-56px lower than\n       meant with a strip of the band above showing. --tdhq-anchor-h is the\n       height the header WILL have once pinned, plus the part of its shrink\n       that animates and so moves the page during the jump (the instant part\n       is held by the margin in onScroll). Every scroll-margin-top reads it. */\n    function publishAnchor() {\n      var v = Math.round(stuck ? pinnedH : pinnedH + flowShrink) + 'px';\n      if (v === lastA) { return; }\n      lastA = v;\n      rootStyle.setProperty('--tdhq-anchor-h', v);\n    }\n    /* The pinned and full heights, read synchronously with the header's\n       transitions switched off (.is-measuring in tdhq-header.css), then the\n       original state restored while they are still off, so nothing animates\n       at page load. Pinned, the section parks its top one announcement-height\n       above the viewport (a negative sticky top), so what shows is its height\n       plus that top. */\n    function measure(quiet) {\n      var was = header.classList.contains('is-stuck');\n      if (was) { header.classList.add('is-measuring'); header.classList.remove('is-stuck'); }\n      var full = section.getBoundingClientRect().height;\n      /* transitions back on before pinning, in both states, so the animated part\n         of the shrink is measured again after a breakpoint change while pinned */\n      header.classList.remove('is-measuring');\n      header.classList.add('is-stuck');\n      var instant = section.getBoundingClientRect().height;   /* transitions still at their start */\n      header.classList.add('is-measuring');                     /* cancels them: the final state */\n      var final = section.getBoundingClientRect().height;\n      var top = parseFloat(getComputedStyle(section).top) || 0;\n      flowShrink = Math.max(0, Math.round(instant - final));\n      if (!was) { header.classList.remove('is-stuck'); }\n      void section.offsetHeight;   /* settle the restored state while transitions are still off */\n      header.classList.remove('is-measuring');\n      fullH = Math.round(full);\n      stuckH = Math.round(final);\n      pinnedH = Math.round(final + Math.min(0, top));\n      if (!quiet) { publishAnchor(); }\n    }\n    /* A size change that is not the pin itself (the logo arriving, a longer\n       announcement) is measured again once it settles; the pin's own change is\n       the height already expected and writes nothing. */\n    function checkSize() {\n      var h = section.getBoundingClientRect().height;\n      if (Math.abs(h - (stuck ? stuckH : fullH)) <= 1) { return; }\n      measure();\n      write(pinnedH);\n    }\n    function publishSettled() { clearTimeout(settleTimer); settleTimer = setTimeout(checkSize, 240); }\n\n    /* HYSTERESIS - WHY THE PAGE BOUNCED.\n       The header is in the page flow (a sticky section), and the compact state\n       makes it 36px shorter on desktop and up to ~64px on a phone (the search\n       row folds away). The browser's scroll anchoring keeps the content still\n       when something above it shrinks, by pulling scrollY back by the same\n       amount - so one threshold at 120px flipped itself: stick at 121, scrollY\n       drops to 85, unstick, the header grows, scrollY is pushed to 121, stick\n       again... the whole page shook up and down between 120 and 156px (the\n       client's recording, 2026-09-22).\n       Compact past 120; expand again only once the page is back above\n       (120 - shrink - 24), where shrink is MEASURED at each toggle. The band\n       between the two is wider than any jump the toggle itself can cause, so\n       the state can never undo itself. */\n    var shrink = 80;\n    var searchBtn = header.querySelector('[data-tdhq-search-toggle]');\n    function onScroll() {\n      if (queued) return;\n      queued = true;\n      window.requestAnimationFrame(function () {\n        queued = false;\n        var y = window.scrollY;\n        var should = stuck ? y > Math.max(0, THRESHOLD - shrink - 24) : y > THRESHOLD;\n        if (should !== stuck) {\n          var before = section.getBoundingClientRect().height;\n          stuck = should;\n          header.classList.toggle('is-stuck', stuck);\n          /* Back at the top the full search row is there again, so the row the\n             pinned search icon opened is closed and the icon no longer says it\n             is expanded (audit chrome-01). */\n          if (!stuck && header.classList.contains('is-search-open')) {\n            header.classList.remove('is-search-open');\n            if (searchBtn) { searchBtn.setAttribute('aria-expanded', 'false'); }\n          }\n          var delta = Math.abs(before - section.getBoundingClientRect().height);\n          if (delta > 0) { shrink = Math.round(delta); }\n          /* the part of the shrink that happens at once (the phone search row\n             folding away) is held as a margin, so nothing below the header\n             jumps up 64px after the browser has fixed a scroll destination */\n          section.style.marginBottom = stuck && delta > 0 ? Math.round(delta) + 'px' : '';\n          publishAnchor();   /* writes only where the two states differ (see above) */\n        }\n      });\n    }\n    on(window, 'scroll', onScroll, { passive: true });\n    /* the header's heights follow the width only: a phone's address bar showing\n       or hiding (height only, at every change of scroll direction) is skipped */\n    var lastW = window.innerWidth;\n    on(window, 'resize', function () {\n      if (window.innerWidth === lastW) { return; }\n      lastW = window.innerWidth;\n      clearTimeout(settleTimer);\n      settleTimer = setTimeout(function () { measure(); write(pinnedH); }, 240);\n    });\n    if (window.ResizeObserver) { new ResizeObserver(publishSettled).observe(section); }\n    /* First paint: every read first (both heights and the band), then both root\n       variables together. A :root variable re-styles the whole page, so a write\n       between two reads cost a second whole-page style pass. */\n    measure(true);\n    publishAnchor();\n    write(pinnedH);\n    onScroll();\n  }\n\n  /* =========================================================\n     2. MEGA MENU\n     Opens on hover (with intent delay), click, or keyboard.\n     ========================================================= */\n  function megaMenu() {\n    var items = document.querySelectorAll('[data-tdhq-nav-item]');\n    if (!items.length) return;\n\n    // Instant hover opening makes the menu flicker as the pointer crosses\n    // the nav bar, so we wait for intent. On the way out we use a longer\n    // grace period: without it the menu closes whenever the pointer clips\n    // the 1px boundary between the nav bar and the panel.\n    var OPEN_DELAY = 300;\n    var CLOSE_DELAY = 220;\n    var openTimer = null;\n    var closeTimer = null;\n    var current = null;\n\n    function panelOf(item) { return item.querySelector('[data-tdhq-mega]'); }\n    function toggleOf(item) { return item.querySelector('[data-tdhq-nav-toggle]'); }\n\n    function open(item) {\n      if (current === item) return;\n      /* Switching menus DOES close the previous one even when focus is inside\n         it - close() hands focus back to that menu's toggle first, so nothing\n         is stranded. Skipping the close here instead would leave the old panel\n         open with `current` no longer pointing at it, and its focusout guard\n         (`current === item`) would then never fire: a panel open for ever. */\n      /* Moving straight from one department to the next swaps the panels with\n         no fade either way. Fading here flashed the page through the menu on\n         every hover along the bar; a menu opened from nothing, or closed,\n         still fades (.tdhq-mega--instant in tdhq-header.css). */\n      var switching = !!current;\n      if (current) close(current, true);\n      var panel = panelOf(item), toggle = toggleOf(item);\n      if (!panel || !toggle) return;\n      panel.classList.toggle('tdhq-mega--instant', switching);\n      panel.hidden = false;\n      toggle.setAttribute('aria-expanded', 'true');\n      item.classList.add('tdhq-nav__item--open');\n      current = item;\n\n      /* Wake the promo image. It ships loading=\"lazy\" \u2014 correct, because eager\n         would pull six mega-menu images on every page load and compete with the\n         hero for LCP. But a lazy image inside a [hidden] panel is never near the\n         viewport, so the browser defers it and does NOT reliably re-evaluate when\n         the panel is revealed: the promo card rendered its heading and body text\n         with a blank space where the picture should be, on every panel.\n         Proved it was deferral and not a bad URL: an independent `new Image()`\n         with the same src loaded at 760px, and flipping this one to eager made it\n         appear immediately. Flipping on first open costs nothing \u2014 the fetch only\n         happens once the customer actually opens that menu. */\n      var lazies = panel.querySelectorAll('img[loading=\"lazy\"]');\n      for (var i = 0; i < lazies.length; i++) lazies[i].setAttribute('loading', 'eager');\n      var link = item.querySelector('.tdhq-nav__link');\n      track('mega_menu_open', { menu_name: link ? link.textContent.trim().toLowerCase() : '' });\n    }\n\n    function close(item, instant) {\n      var panel = panelOf(item), toggle = toggleOf(item);\n      /* Never hide the element that currently holds focus. `display: none` on\n         an ancestor drops the focused node out of the tree, and the browser\n         resets focus to <body> - the ring vanishes, and the next Tab restarts\n         from the top of the document. Hand focus back to the toggle first, so\n         the customer resumes from where the menu was. */\n      if (panel && panel.contains(document.activeElement) && toggle) toggle.focus();\n      if (panel) {\n        panel.classList.toggle('tdhq-mega--instant', !!instant);\n        panel.hidden = true;\n      }\n      if (toggle) toggle.setAttribute('aria-expanded', 'false');\n      item.classList.remove('tdhq-nav__item--open');\n      if (current === item) current = null;\n    }\n\n    /* Hover must not close a panel the KEYBOARD is inside. The pointer wandering\n       off the nav is not a signal about someone who is tabbing through the\n       panel's links - and on a hybrid machine (touchpad nudge, tab-navigating\n       user) the two happen at once. */\n    function holdsFocus(item) { return !!item && item.contains(document.activeElement); }\n\n    function closeAll() {\n      /* Not forEach(close): forEach passes the index as the second argument,\n         which close() would read as \"switch instantly\". */\n      items.forEach(function (it) { close(it); });\n      current = null;\n    }\n\n    function clearTimers() {\n      clearTimeout(openTimer);\n      clearTimeout(closeTimer);\n    }\n\n    items.forEach(function (item) {\n      var toggle = toggleOf(item);\n\n      item.addEventListener('mouseenter', function () {\n        clearTimers();\n        // If a menu is already open, switch immediately \u2014 the customer has\n        // clearly demonstrated intent to browse the nav bar.\n        openTimer = setTimeout(function () { open(item); }, current ? 60 : OPEN_DELAY);\n      });\n\n      item.addEventListener('mouseleave', function () {\n        clearTimers();\n        closeTimer = setTimeout(function () {\n          if (holdsFocus(item)) return;   // the keyboard is still in there\n          close(item);\n        }, CLOSE_DELAY);\n      });\n\n      if (toggle) {\n        toggle.addEventListener('click', function (e) {\n          e.preventDefault();\n          clearTimers();\n          if (current === item) { close(item); } else { open(item); }\n        });\n      }\n\n      // Focus leaving the item entirely closes it. relatedTarget is null when\n      // focus moves to the browser chrome, which should not close the menu\n      // mid-interaction, so we re-check on the next tick instead.\n      item.addEventListener('focusout', function () {\n        setTimeout(function () {\n          if (current === item && !item.contains(document.activeElement)) close(item);\n        }, 0);\n      });\n\n      // Track which category routes are actually used, so weak columns can\n      // be pruned later using real behaviour rather than opinion.\n      var panel = panelOf(item);\n      if (panel) {\n        panel.addEventListener('click', function (e) {\n          var a = e.target.closest('a');\n          if (!a) return;\n          var col = a.closest('.tdhq-mega__col');\n          var colTitle = col ? col.querySelector('.tdhq-mega__col-title') : null;\n          track('mega_menu_click', {\n            link_name: a.textContent.trim(),\n            menu_column: colTitle ? colTitle.textContent.trim() : '',\n            destination: a.getAttribute('href') || ''\n          });\n        });\n      }\n    });\n\n    on(document, 'keydown', function (e) {\n      if (e.key !== 'Escape' || !current) return;\n      var item = current;\n      var toggle = toggleOf(item);\n      close(item);\n      // Return focus to the control that opened the panel.\n      if (toggle) toggle.focus();\n    });\n\n    on(document, 'click', function (e) {\n      if (current && !current.contains(e.target)) closeAll();\n    });\n  }\n\n  /* =========================================================\n     3. ANNOUNCEMENT ROTATION (mobile)\n     One message at a time. Pauses on interaction, never runs for\n     reduced-motion visitors, and stays swipeable either way.\n     ========================================================= */\n  function announce() {\n    var track_ = document.querySelector('[data-tdhq-announce-track]');\n    if (!track_ || !header) return;\n\n    var items = track_.children;\n    if (items.length < 2) return;\n\n    var delay = parseInt(header.getAttribute('data-rotate'), 10) || 6000;\n    var i = 0;\n    var timer = null;\n    var paused = false;\n\n    function isMobileRail() {\n      // Only rotate while the track is actually a one-up rail; on desktop all\n      // three messages are visible at once and scrolling it would be wrong.\n      return track_.scrollWidth > track_.clientWidth + 4;\n    }\n\n    function step() {\n      if (paused || document.hidden || !isMobileRail()) return;\n      i = (i + 1) % items.length;\n      track_.scrollTo({ left: items[i].offsetLeft - track_.offsetLeft, behavior: 'smooth' });\n    }\n\n    function start() {\n      if (reduceMotion.matches) return;\n      stop();\n      timer = setInterval(step, delay);\n    }\n    function stop() { if (timer) { clearInterval(timer); timer = null; } }\n\n    // Any manual interaction hands control to the customer permanently for\n    // this page view \u2014 resuming would fight the person swiping.\n    ['pointerdown', 'touchstart', 'wheel', 'keydown'].forEach(function (ev) {\n      track_.addEventListener(ev, function () { paused = true; stop(); }, { passive: true });\n    });\n    track_.addEventListener('mouseenter', function () { paused = true; });\n    track_.addEventListener('mouseleave', function () { paused = false; });\n\n    on(document, 'visibilitychange', function () {\n      if (document.hidden) { stop(); } else if (!paused) { start(); }\n    });\n    reduceMotion.addEventListener('change', function () {\n      if (reduceMotion.matches) { stop(); } else if (!paused) { start(); }\n    });\n\n    start();\n  }\n\n  /* =========================================================\n     4. PREDICTIVE SEARCH\n     ========================================================= */\n  function search() {\n    var roots = document.querySelectorAll('[data-tdhq-search]');\n    if (!roots.length) return;\n\n    var MIN_CHARS = 2;\n    var DEBOUNCE = 220;\n    var LIMITS = { product: 6, collection: 4, brand: 4, article: 3 };\n\n    /* Brief section 6 asks for Brands as a group of its own, between Collections\n       and the guides. /search/suggest.json has no notion of a brand, so the set\n       of brand collections is read back from the Brands mega panel this same\n       header already renders on every page (snippets/tdhq-brand-columns.liquid),\n       where every link has already been proved to be a real, stocked collection.\n       Reading markup that is already in the document costs nothing; resolving\n       the brands a second time in Liquid would mean another pass over the brand\n       metaobjects on every page load, which section 22 rules out. The set is\n       built on the first search, never on page load. A brand collection that is\n       not in the curated menu simply stays under Collections \u2014 the right\n       destination under a less specific heading. */\n    var brandSet = null;\n    function collectionHandle(url) {\n      var rest = url ? String(url).split('/collections/')[1] : '';\n      if (!rest) return '';\n      /* suggest.json returns tracking parameters on these URLs\n         (/collections/carpro?_pos=1&_psq=carpro...), so strip them. */\n      return rest.split('?')[0].split('#')[0].split('/')[0];\n    }\n    function isBrandCollection(url) {\n      if (brandSet === null) {\n        brandSet = {};\n        var links = document.querySelectorAll('.tdhq-mega--brands .tdhq-mega__columns a[href]');\n        for (var i = 0; i < links.length; i++) {\n          var h = collectionHandle(links[i].getAttribute('href'));\n          if (h) brandSet[h] = true;\n        }\n      }\n      var ch = collectionHandle(url);\n      return !!ch && brandSet[ch] === true;\n    }\n\n    var currencyFmt = null;\n    try {\n      currencyFmt = new Intl.NumberFormat(document.documentElement.lang || 'en-GB', {\n        style: 'currency',\n        currency: (window.Shopify && window.Shopify.currency && window.Shopify.currency.active) || 'GBP'\n      });\n    } catch (e) { /* Intl unavailable: fall back to the raw string below. */ }\n\n    // Shopify's predictive-search JSON has returned `price` both as a decimal\n    // string (\"19.95\") and as minor units (\"1995\") across API versions, so\n    // normalise defensively rather than trusting one shape.\n    function money(raw) {\n      if (raw == null || raw === '') return '';\n      var s = String(raw).replace(/[^0-9.\\-]/g, '');\n      if (!s) return String(raw);\n      var n = parseFloat(s);\n      if (isNaN(n)) return String(raw);\n      if (s.indexOf('.') === -1 && Math.abs(n) >= 100) n = n / 100;\n      return currencyFmt ? currencyFmt.format(n) : n.toFixed(2);\n    }\n\n    function el(tag, cls, text) {\n      var n = document.createElement(tag);\n      if (cls) n.className = cls;\n      if (text != null) n.textContent = text;\n      return n;\n    }\n\n    /* Titles as the server prints them: no en or em dashes (the client's copy\n       rule). The same chain as the Liquid title outputs and cleanTitle() in\n       tdhq-cart-drawer.js, so a title reads the same in the suggestions, on the\n       results page and in the basket (audit chrome-06: the suggestions printed\n       'Tyre Gloss Gel', an en dash, 'High-Gloss Finish'; the cards print a\n       hyphen). */\n    function cleanTitle(s) {\n      return String(s || '').split(' \\u2013 ').join(' - ').split(' \\u2014 ').join(' - ').split('\\u2014').join(' - ').split('\\u2013').join('-');\n    }\n\n    roots.forEach(function (root) {\n      var input = root.querySelector('[data-tdhq-search-input]');\n      var panel = root.querySelector('[data-tdhq-search-panel]');\n      var status = root.querySelector('[data-tdhq-search-status]');\n      if (!input || !panel) return;\n\n      var timer = null;\n      var controller = null;\n      var results = [];\n      var active = -1;\n\n      function hide() {\n        /* ABORT FIRST. Dismissing the panel has to cancel the request behind\n           it, or a response that was already on the wire lands a second later\n           and render() puts the panel back - showing suggestions for text the\n           shopper has deleted, above an empty search box, after the combobox\n           has already announced itself as collapsed. */\n        if (controller) { controller.abort(); controller = null; }\n        clearTimeout(timer);\n        panel.hidden = true;\n        input.setAttribute('aria-expanded', 'false');\n        input.removeAttribute('aria-activedescendant');\n        active = -1;\n      }\n\n      function setActive(next) {\n        if (!results.length) return;\n        if (active > -1) results[active].removeAttribute('aria-selected');\n        active = (next + results.length) % results.length;\n        var node = results[active];\n        node.setAttribute('aria-selected', 'true');\n        input.setAttribute('aria-activedescendant', node.id);\n        // Keep the highlighted row inside the scroll area without yanking the\n        // whole page around.\n        node.scrollIntoView({ block: 'nearest' });\n      }\n\n      /* A listbox may own only `option` and `group` children. These wrappers\n         were plain divs, so every option in the panel was orphaned from the\n         combobox as far as the accessibility tree was concerned: the input's\n         aria-activedescendant pointed at a node the listbox did not own, and\n         \"Products, 6 items\" was never announced. role=group + aria-label fixes\n         ownership and gives the section a name; the visible <p> is hidden from\n         assistive tech because the group label already says the same words. */\n      function group(title) {\n        var g = el('div', 'tdhq-search__group');\n        g.setAttribute('role', 'group');\n        g.setAttribute('aria-label', title);\n        var t = el('p', 'tdhq-search__group-title', title);\n        t.setAttribute('aria-hidden', 'true');\n        g.appendChild(t);\n        return g;\n      }\n\n      /* A row with no picture of its own shows the site's glyph for its\n         kind (grid, tag, book, bag), cloned from the template the search\n         snippet renders, instead of an empty grey square (audit\n         chrome-06). The box stays, so every title starts on one line. */\n      function addGlyph(media, type) {\n        var glyph = root.querySelector('template[data-tdhq-search-icons]');\n        var g = glyph && (glyph.content.querySelector('[data-kind=\"' + type + '\"]') || glyph.content.querySelector('[data-kind=\"collection\"]'));\n        if (g) {\n          media.className += ' tdhq-search__result-media--icon';\n          media.appendChild(g.firstElementChild.cloneNode(true));\n        }\n      }\n      function putImage(media, src) {\n        var img = el('img');\n        /* 44px box: 1x and 2x candidates, never the 1500px original. */\n        img.src = sizedImage(src, 88);\n        img.srcset = sizedImage(src, 44) + ' 44w, ' + sizedImage(src, 88) + ' 88w, ' + sizedImage(src, 132) + ' 132w';\n        img.sizes = '44px';\n        img.alt = '';\n        img.width = 44; img.height = 44;\n        img.loading = 'lazy';\n        media.appendChild(img);\n      }\n\n      /* COLLECTION PICTURES (22 Oct 2026, owner). suggest.json sends a\n         collection's own picture only, and the category collections have\n         none, so their rows showed the grid glyph. sections/tdhq-search-thumbs\n         answers, for the same words, each collection's own picture or else its\n         newest product's photo (the rule of every collection tile on the site);\n         query() asks for it beside suggest.json. A row waiting on it keeps its\n         empty box for that moment, then takes the photo, or the glyph when\n         there is none. Pictures already seen are kept for the next keystroke. */\n      var thumbCache = {};\n      var pendingThumbs = [];\n      function readThumbs(html) {\n        var m = /<script[^>]*data-tdhq-search-thumbs[^>]*>([\\s\\S]*?)<\\/script>/.exec(html || '');\n        if (!m) { return null; }\n        try { return JSON.parse(m[1]); } catch (e) { return null; }\n      }\n      function collectionRow(type, c, thumbs) {\n        var own = (c.featured_image && c.featured_image.url) || '';\n        var h = collectionHandle(c.url);\n        var known = !own && h && thumbCache[h];\n        return {\n          type: type, url: c.url, title: c.title,\n          image: own || known || '',\n          productPhoto: !!known,\n          waitThumb: (!own && !known && thumbs && h) ? h : ''\n        };\n      }\n\n      // Built with DOM methods rather than innerHTML: these strings come from\n      // product and article titles, and building markup by concatenation is\n      // how stored content becomes an injection vector.\n      function render(data, term, thumbs) {\n        panel.textContent = '';\n        results = [];\n        active = -1;\n        pendingThumbs = [];\n\n        var idx = 0;\n        function addRow(parent, opts) {\n          var a = el('a', 'tdhq-search__result');\n          a.id = 'tdhq-sr-' + (input.id || 'x') + '-' + (idx++);\n          a.href = opts.url;\n          a.setAttribute('role', 'option');\n\n          var media = el('span', 'tdhq-search__result-media');\n          if (!opts.image && opts.waitThumb) {\n            pendingThumbs.push({ media: media, handle: opts.waitThumb, type: opts.type });\n          } else if (!opts.image) {\n            addGlyph(media, opts.type);\n          }\n          /* a logo sits whole on white; a product photo fills the box as in the Products rows */\n          if (opts.image && !opts.productPhoto && (opts.type === 'collection' || opts.type === 'brand')) {\n            media.className += ' tdhq-search__result-media--contain';\n          }\n          if (opts.image) {\n            putImage(media, opts.image);\n          }\n          a.appendChild(media);\n\n          var mid = el('span');\n          mid.appendChild(el('span', 'tdhq-search__result-title', cleanTitle(opts.title)));\n          if (opts.sub) mid.appendChild(el('span', 'tdhq-search__result-brand', opts.sub));\n          a.appendChild(mid);\n\n          var right = el('span', 'tdhq-search__result-meta');\n          if (opts.price) right.appendChild(el('span', 'tdhq-search__result-price', opts.price));\n          if (opts.stock) {\n            right.appendChild(el('span',\n              'tdhq-search__result-stock' + (opts.available ? '' : ' tdhq-search__result-stock--out'),\n              opts.stock));\n          }\n          a.appendChild(right);\n\n          a.addEventListener('click', function () {\n            track('search_result_click', { result_type: opts.type, result_position: idx });\n          });\n\n          parent.appendChild(a);\n          results.push(a);\n        }\n\n        var r = (data && data.resources && data.resources.results) || {};\n        var total = 0;\n\n        if (r.products && r.products.length) {\n          var g = group('Products');\n          r.products.slice(0, LIMITS.product).forEach(function (p) {\n            addRow(g, {\n              type: 'product',\n              url: p.url,\n              title: window.tdhqName ? window.tdhqName(p.title) : p.title,\n              sub: p.vendor || '',\n              price: money(p.price),\n              available: p.available !== false,\n              /* Brief section 6: every product result shows an availability\n                 status, not only the ones that are out of stock. \"In stock\" is\n                 the wording the product card and the product page already use,\n                 and it takes the neutral grey of the rest of the row so that\n                 only the negative state is coloured \u2014 availability is never\n                 carried by colour alone (brief section 21). When the API sends\n                 no `available` field at all, nothing is claimed either way. */\n              stock: p.available === false ? 'Out of stock' : (p.available === true ? 'In stock' : ''),\n              image: (p.featured_image && p.featured_image.url) || p.image || ''\n            });\n          });\n          panel.appendChild(g);\n          total += Math.min(r.products.length, LIMITS.product);\n        }\n\n        if (r.collections && r.collections.length) {\n          /* One pass, two groups, the API's relevance order kept inside each. */\n          var plainCols = [];\n          var brandCols = [];\n          r.collections.forEach(function (c) {\n            /* An old manual copy renamed <handle>-legacy (Store Structure\n               Plan A3) stays published until the admin unpublishes it; its\n               automatic twin holds the real handle and is the one to offer. */\n            if (/-legacy$/.test(collectionHandle(c.url))) return;\n            if (isBrandCollection(c.url)) { brandCols.push(c); } else { plainCols.push(c); }\n          });\n\n          if (plainCols.length) {\n            var gc = group('Collections');\n            plainCols.slice(0, LIMITS.collection).forEach(function (c) {\n              addRow(gc, collectionRow('collection', c, thumbs));\n            });\n            panel.appendChild(gc);\n            total += Math.min(plainCols.length, LIMITS.collection);\n          }\n\n          /* Brands sits AFTER Collections, matching the priority order the\n             brief states: exact products, relevant collections, brand pages,\n             useful guides. A group with nothing in it is not rendered. */\n          if (brandCols.length) {\n            var gb = group('Brands');\n            brandCols.slice(0, LIMITS.brand).forEach(function (c) {\n              addRow(gb, collectionRow('brand', c, thumbs));\n            });\n            panel.appendChild(gb);\n            total += Math.min(brandCols.length, LIMITS.brand);\n          }\n        }\n\n        if (r.articles && r.articles.length) {\n          var ga = group('Advice & guides');\n          r.articles.slice(0, LIMITS.article).forEach(function (a2) {\n            addRow(ga, {\n              type: 'article',\n              url: a2.url,\n              title: a2.title,\n              image: (a2.image && a2.image.url) || a2.image || ''\n            });\n          });\n          panel.appendChild(ga);\n          total += Math.min(r.articles.length, LIMITS.article);\n        }\n\n        if (!total) {\n          /* Never a dead end (audit chrome-11): the full results page for the\n             same words, the whole range, and the advice centre. The two routes\n             come from the theme (routes and the Advice Centre route setting)\n             via the search snippet, so nothing here is typed twice. They are\n             options like any other row, so the arrow keys reach them. */\n          panel.appendChild(el('p', 'tdhq-search__empty', 'No matches found. Try a broader term, or:'));\n          var ways = [['/search?options%5Bunavailable_products%5D=last&q=' + encodeURIComponent(term), 'See all results for \\u201c' + term + '\\u201d'],\n                      [root.getAttribute('data-all-url'), 'Shop all products'],\n                      [root.getAttribute('data-advice-url'), 'Car care advice']];\n          ways.forEach(function (w, i) {\n            if (!w[0]) { return; }\n            var way = el('a', 'tdhq-search__way', w[1]);\n            way.href = w[0];\n            way.id = 'tdhq-sr-' + (input.id || 'x') + '-way' + i;\n            way.setAttribute('role', 'option');\n            panel.appendChild(way);\n            results.push(way);\n          });\n        } else {\n          /* This is the escape hatch from six suggestions to the full result\n             page, and it used to be an anonymous <a> hanging directly off the\n             listbox: invalid as a listbox child, and unreachable by ArrowDown,\n             so a keyboard user could only get to it by tabbing back out. It is\n             an option like any other row now, and joins `results` LAST so it\n             sits at the end of the arrow order. */\n          var all = el('a', 'tdhq-search__all', 'View all results for \u201C' + term + '\u201D');\n          all.href = '/search?options%5Bunavailable_products%5D=last&q=' + encodeURIComponent(term);\n          all.id = 'tdhq-sr-' + (input.id || 'x') + '-all';\n          all.setAttribute('role', 'option');\n          panel.appendChild(all);\n          results.push(all);\n        }\n\n        if (pendingThumbs.length) {\n          var waiting = pendingThumbs;\n          thumbs.then(function (map) {\n            waiting.forEach(function (w) {\n              var src = map && map[w.handle];\n              if (src) { thumbCache[w.handle] = src; putImage(w.media, src); } else { addGlyph(w.media, w.type); }\n            });\n          });\n        }\n\n        panel.hidden = false;\n        input.setAttribute('aria-expanded', 'true');\n        // Announce a count, never the query or the titles.\n        if (status) status.textContent = total ? total + ' suggestions available' : 'No matches found';\n        track('search_suggest', { result_count: total });\n      }\n\n      function query(term) {\n        if (controller) controller.abort();\n        controller = new AbortController();\n\n        var url = '/search/suggest.json'\n          + '?q=' + encodeURIComponent(term)\n          + '&resources[type]=product,collection,article'\n          /* Six of EACH type (limit_scope=each). Without the scope the limit is\n             a total across every type, so 'wax' came back as 4 products, 3\n             collections and 1 guide although the panel is built for 6 products\n             (audit chrome-10). Six collections feed two groups, Collections and\n             Brands, up to four each; guides are sliced to 3 when rendered, and\n             no image is fetched for a row that is never drawn (brief 22). */\n          + '&resources[limit]=6&resources[limit_scope]=each'\n          + '&resources[options][unavailable_products]=last';\n\n        /* the collections' pictures, asked for at the same time (see collectionRow) */\n        var thumbs = fetch('/search/suggest?q=' + encodeURIComponent(term)\n            + '&resources[type]=collection&resources[limit]=6&resources[limit_scope]=each'\n            + '&section_id=tdhq-search-thumbs', { signal: controller.signal })\n          .then(function (res) { return res.ok ? res.text() : ''; })\n          .then(readThumbs)\n          .catch(function () { return null; });\n\n        fetch(url, { signal: controller.signal, headers: { 'Accept': 'application/json' } })\n          .then(function (res) { return res.ok ? res.json() : Promise.reject(res.status); })\n          .then(function (data) { render(data, term, thumbs); })\n          .catch(function (err) {\n            if (err && err.name === 'AbortError') return;\n            // Search must never become a dead end: fall back to the real\n            // results page rather than showing a broken panel.\n            hide();\n          });\n      }\n\n      input.addEventListener('input', function () {\n        var term = input.value.trim();\n        clearTimeout(timer);\n        if (term.length < MIN_CHARS) { hide(); return; }\n        timer = setTimeout(function () { query(term); }, DEBOUNCE);\n      });\n\n      /* Back into a field that still holds a search: the suggestions come back\n         (audit chrome-11: a click outside closed them, and clicking into the\n         same words again showed nothing until a key was pressed). */\n      input.addEventListener('focus', function () {\n        var term = input.value.trim();\n        if (term.length >= MIN_CHARS && panel.hidden) { query(term); }\n      });\n\n      input.addEventListener('keydown', function (e) {\n        if (e.key === 'Escape') { hide(); return; }\n        if (panel.hidden || !results.length) return;\n\n        if (e.key === 'ArrowDown') { e.preventDefault(); setActive(active + 1); }\n        else if (e.key === 'ArrowUp') { e.preventDefault(); setActive(active - 1); }\n        else if (e.key === 'Enter' && active > -1) {\n          // Only intercept Enter when a suggestion is highlighted; otherwise\n          // the form submits normally to the full results page.\n          e.preventDefault();\n          results[active].click();\n        }\n      });\n\n      on(document, 'click', function (e) {\n        if (!root.contains(e.target)) hide();\n      });\n    });\n  }\n\n  /* =========================================================\n     5. MOBILE SEARCH TOGGLE\n     ========================================================= */\n  function searchToggle() {\n    var btn = document.querySelector('[data-tdhq-search-toggle]');\n    if (!btn || !header) return;\n    btn.addEventListener('click', function () {\n      var open = header.classList.toggle('is-search-open');\n      btn.setAttribute('aria-expanded', open ? 'true' : 'false');\n      /* The row is shown by tdhq-header.css (.is-stuck.is-search-open), not by\n         an inline display, which outlived the pinned state: back at the top the\n         row kept display:block and the icon kept aria-expanded=\"true\". sticky()\n         closes it when the header un-pins. */\n      if (open) {\n        var input = header.querySelector('.tdhq-header__search-row [data-tdhq-search-input]');\n        if (input) input.focus();\n      }\n    });\n  }\n\n  /* =========================================================\n     5b. PHONE SEARCH MODE (client, 25 Sep 2026: \"smooth as native phone\n     app\"). With the tab bar on, the phone's one header row is logo + field.\n     Tapping the field is the app's search screen (.is-searching, see\n     tdhq-header.css): the logo slides away, the field takes the row, Cancel\n     slides in, the page dims below the row and the suggestions open as a\n     full-width sheet. Cancel, Escape, a tap on the dimmed page or on a tab\n     leaves it. --tdhq-search-top is where the row ends, re-read while the page\n     moves under it (the announcement bar can still be scrolling away).\n     ========================================================= */\n  function appSearch() {\n    if (!header) return;\n    var bar = header.querySelector('.tdhq-header--hasbar');\n    var root = header.querySelector('.tdhq-header__search-desktop [data-tdhq-search]');\n    var row = header.querySelector('.tdhq-header__main');\n    if (!bar || !root || !row) return;\n    var input = root.querySelector('[data-tdhq-search-input]');\n    var cancel = header.querySelector('[data-tdhq-search-cancel]');\n    if (!input) return;\n    var mq = window.matchMedia('(max-width: 899px)');\n    var longPh = input.getAttribute('data-placeholder-long');\n    var shortPh = input.getAttribute('data-placeholder-short');\n    function placeholder() {\n      if (longPh && shortPh) { input.setAttribute('placeholder', mq.matches ? shortPh : longPh); }\n    }\n    function place() {\n      header.style.setProperty('--tdhq-search-top', Math.max(0, Math.round(row.getBoundingClientRect().bottom)) + 'px');\n    }\n    function searching() { return header.classList.contains('is-searching'); }\n    function enter() {\n      if (!mq.matches || searching()) return;\n      place();\n      header.classList.add('is-searching');\n    }\n    function leave() {\n      if (!searching()) return;\n      header.classList.remove('is-searching');\n      /* the suggestions close the way Escape closes them (search() above) */\n      input.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));\n      input.blur();\n    }\n    input.addEventListener('focus', enter);\n    input.addEventListener('keydown', function (e) { if (e.key === 'Escape') { leave(); } });\n    if (cancel) { cancel.addEventListener('click', leave); }\n    header.addEventListener('click', function (e) { if (e.target === header && searching()) { leave(); } });\n    on(document, 'click', function (e) {\n      if (searching() && e.target.closest && e.target.closest('.tdhq-tabbar')) { leave(); }\n    });\n    var queued = false;\n    on(window, 'scroll', function () {\n      if (!searching() || queued) { return; }\n      queued = true;\n      window.requestAnimationFrame(function () { queued = false; place(); });\n    }, { passive: true });\n    function onWidth() { placeholder(); if (!mq.matches) { leave(); } }\n    if (mq.addEventListener) { on(mq, 'change', onWidth); }\n    placeholder();\n  }\n\n  /* =========================================================\n     6. DRAWER\n     ========================================================= */\n  function drawer() {\n    var root = document.querySelector('[data-tdhq-drawer]');\n    var scrim = document.querySelector('[data-tdhq-drawer-scrim]');\n    /* querySelectorAll, not querySelector: the phone tab bar carries a second\n       opener, and binding only the first one left the Shop tab doing nothing\n       but follow its own href. */\n    var openBtns = document.querySelectorAll('[data-tdhq-drawer-open]');\n    if (!root || !openBtns.length) return;\n\n    /* Every opener describes the same drawer, so they all report the same\n       state: a stale aria-expanded on the tab bar would tell a screen reader\n       the menu is closed while it is open. */\n    function setExpanded(v) {\n      Array.prototype.forEach.call(openBtns, function (b) { b.setAttribute('aria-expanded', v); });\n    }\n\n    var closeBtn = root.querySelector('[data-tdhq-drawer-close]');\n    var titleEl = root.querySelector('[data-tdhq-drawer-title]');\n    var panes = root.querySelectorAll('[data-tdhq-pane]');\n    var returnFocus = null;\n\n    /* ----------------------------------------------------------------\n       HYDRATING THE DEEP PANES\n\n       Everything below the drawer's top level ships inside a <template>\n       (snippets/tdhq-drawer.liquid). Template content is parsed but is not in\n       the document: 972 elements that used to exist on every page, on every\n       device, for a menu most visits never open. This clones them in once, on\n       the first open - synchronously, from markup already in the page, so\n       there is no request to fail and no second copy of the menu to drift.\n\n       Everything the drawer's own code touches is re-read afterwards, because\n       `panes` was a static NodeList captured at init.\n       ---------------------------------------------------------------- */\n    function hydrate() {\n      var tpl = root.querySelector('template[data-tdhq-drawer-deep]');\n      if (!tpl) { return; }\n      var body = root.querySelector('.tdhq-drawer__body') || tpl.parentNode;\n      body.insertBefore(tpl.content.cloneNode(true), tpl);\n      tpl.remove();\n      panes = root.querySelectorAll('[data-tdhq-pane]');\n      initBrandSearch();\n    }\n\n    /* The brand pane's search. This was an inline <script> beside the markup;\n       inside a <template> it would never run, because template content is not\n       executed. It is the same code, invoked after the clone. */\n    function initBrandSearch() {\n      var pane = root.querySelector('[data-tdhq-brands]');\n      if (!pane || pane.dataset.ready) { return; }\n      pane.dataset.ready = '1';\n      var input = pane.querySelector('[data-tdhq-brandsearch]');\n      var none = pane.querySelector('[data-tdhq-brandnone]');\n      var groups = Array.prototype.slice.call(pane.querySelectorAll('[data-brand-group]'));\n      var links = Array.prototype.slice.call(pane.querySelectorAll('[data-brand-link]'));\n      function norm(str) { return (str || '').toLowerCase().replace(/[^a-z0-9]+/g, ''); }\n      function searching() { return !!(input && norm(input.value).length >= 2); }\n      // Brief 27: filter after two characters, ignore case and spacing.\n      if (input) {\n        /* Through morph(): a search that leaves a few brands shrinks the sheet,\n           and clearing it grows the sheet back, so both glide. */\n        input.addEventListener('input', function () { morph(function () {\n          var q = norm(input.value), on = q.length >= 2, shown = 0;\n          links.forEach(function (a) {\n            var ok = !on || norm(a.dataset.brandName).indexOf(q) !== -1;\n            a.hidden = !ok;\n            if (ok && on) { shown++; }\n          });\n          groups.forEach(function (g) {\n            if (!on) { g.hidden = false; g.open = false; return; }\n            var any = g.querySelector('[data-brand-link]:not([hidden])');\n            g.hidden = !any;\n            g.open = !!any;\n          });\n          if (none) { none.hidden = !on || shown > 0; }\n        }); });\n      }\n      // Brief 29: one group open at a time (native `name` grouping where\n      // supported; this covers the rest), except while a search is open.\n      groups.forEach(function (g) {\n        g.addEventListener('toggle', function () {\n          if (!g.open || searching()) { return; }\n          groups.forEach(function (o) { if (o !== g) { o.open = false; } });\n        });\n      });\n    }\n\n    var FOCUSABLE = 'a[href], button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n    function visibleFocusables() {\n      // Only the ACTIVE pane's controls are reachable. Without this filter Tab\n      // walks into hidden panes and focus disappears off-screen.\n      return Array.prototype.filter.call(root.querySelectorAll(FOCUSABLE), function (n) {\n        return n.offsetParent !== null;\n      });\n    }\n\n    /* dir: 'fwd' when drilling in, 'back' for a Back row, nothing when the menu\n       opens - the new screen then slides in from that side (audit chrome-05). */\n    function show(name, dir) {\n      var found = false;\n      panes.forEach(function (p) {\n        var match = p.getAttribute('data-tdhq-pane') === name;\n        p.classList.toggle('is-active', match);\n        p.classList.remove('is-enter-fwd', 'is-enter-back');\n        if (match) {\n          found = true;\n          if (dir && !reduceMotion.matches) { p.classList.add(dir === 'back' ? 'is-enter-back' : 'is-enter-fwd'); }\n          if (titleEl) {\n            titleEl.textContent = p.getAttribute('data-tdhq-pane-title') || 'Menu';\n          }\n        }\n      });\n      if (!found) return;\n      /* The first screen is headed by the logo, the others by their title\n         (tdhq-header.css, .tdhq-drawer.is-root). */\n      root.classList.toggle('is-root', name === 'root');\n      root.querySelector('.tdhq-drawer__body').scrollTop = 0;\n\n      /* Land on the TITLE of the screen just opened. visibleFocusables()[0] is\n         the Close button in the drawer head - outside every pane - so drilling\n         from Menu to Car Care to Shampoos put focus in the same place three\n         times and announced \"Close menu\" each time, with no clue that the\n         screen had changed at all. The title carries tabindex=\"-1\" and names\n         the dialog (aria-labelledby), so focusing it announces where you are.\n         Falling back to the pane's own first control keeps a screen usable if\n         the title is ever removed. */\n      var landing = titleEl || Array.prototype.filter.call(\n        root.querySelectorAll(FOCUSABLE),\n        function (n) { return n.offsetParent !== null && n.closest('[data-tdhq-pane].is-active'); }\n      )[0];\n      if (landing) landing.focus();\n    }\n\n    /* THE SHEET GLIDES TO ITS NEW HEIGHT (audit chrome-05, re-checked). On a\n       phone the menu is a bottom sheet as tall as the screen it shows\n       (tdhq-header.css, \"THE SHOP MENU IS A SHEET ABOVE THE TAB BAR\"), so a\n       drill or Back changed its height in one frame and the black head jumped:\n       sheet top 201 -> 56px opening Brands at 390 (145px), 201 -> 514px\n       opening Advice (313px), 381 -> 241px at 768, while the screen inside it\n       already slid. change() makes the switch; the height is then tweened from\n       the one on screen to the new one over --tdhq-t on --tdhq-ease, the same\n       glide as the footer accordion. A tap mid-glide starts from where the\n       sheet is, not from where it was heading. The full-height side drawer\n       (900-1099px, or the tab bar switched off) does not change height, so\n       nothing runs there. Reduced motion: the height just changes. */\n    var sheetAnim = null;\n    function morph(change) {\n      var live = !root.hidden && root.classList.contains('is-open') &&\n        typeof root.animate === 'function' && !reduceMotion.matches;\n      var from = live ? root.getBoundingClientRect().height : 0;\n      if (sheetAnim) { sheetAnim.cancel(); sheetAnim = null; }\n      change();\n      if (!live) { return; }\n      var to = root.getBoundingClientRect().height;\n      if (Math.abs(to - from) < 1) { return; }\n      var cs = getComputedStyle(root);\n      var a = root.animate({ height: [from + 'px', to + 'px'] }, {\n        duration: window.TdhqMotion ? window.TdhqMotion.ms('--tdhq-t', 220) : 220,\n        easing: cs.getPropertyValue('--tdhq-ease').trim() || 'cubic-bezier(0.4, 0, 0.2, 1)'\n      });\n      sheetAnim = a;\n      a.onfinish = function () { if (sheetAnim === a) { sheetAnim = null; } };\n    }\n\n    /* The pending hide from a close. A re-open inside the 220ms slide-out\n       used to be hidden by it a moment later: an invisible menu, the page\n       still locked, and the Shop tab lit (audit chrome-03). */\n    var closeTimer = null;\n\n    function open() {\n      clearTimeout(closeTimer);\n      returnFocus = document.activeElement;\n      /* Before anything is shown, so the first screen is complete and the\n         drill-down targets exist by the time a row can be tapped. */\n      hydrate();\n      /* Wake the department and brand promo pictures now. They ship lazy, and\n         a lazy image inside a hidden screen is only fetched once that screen is\n         shown, so each promo was still an empty dark tile half a second after\n         the screen opened (the same fix as the desktop mega menu). */\n      var lazies = root.querySelectorAll('.tdhq-drawer__bpromo img[loading=\"lazy\"]');\n      for (var li = 0; li < lazies.length; li++) { lazies[li].setAttribute('loading', 'eager'); }\n      root.hidden = false;\n      if (scrim) scrim.hidden = false;\n      // Force a frame so the transition runs from the off-screen position\n      // rather than being skipped by the hidden -> visible change.\n      requestAnimationFrame(function () {\n        root.classList.add('is-open');\n        if (scrim) scrim.classList.add('is-open');\n      });\n      document.documentElement.classList.remove('tdhq-drawer-closing');\n      document.documentElement.classList.add('tdhq-drawer-open');\n      setExpanded('true');\n      morph(function () { show('root'); });\n      if (titleEl) titleEl.textContent = 'Menu';\n      track('drawer_open', {});\n    }\n\n    function close() {\n      root.classList.remove('is-open');\n      if (scrim) scrim.classList.remove('is-open');\n      /* tdhq-drawer-closing keeps the phone tab bar in front until the sheet\n         has gone (tdhq-header.css). Dropping the bar the moment the lock came\n         off made the sheet slide down OVER it on close, hiding the bar for\n         most of the 220ms, although it rises from BEHIND it on open; a tap\n         on the Shop tab 60ms into the close landed on the sheet. */\n      document.documentElement.classList.add('tdhq-drawer-closing');\n      document.documentElement.classList.remove('tdhq-drawer-open');\n      setExpanded('false');\n\n      var done = function () {\n        if (root.classList.contains('is-open')) { return; }   /* re-opened meanwhile */\n        document.documentElement.classList.remove('tdhq-drawer-closing');\n        root.hidden = true;\n        if (scrim) scrim.hidden = true;\n      };\n      clearTimeout(closeTimer);\n      if (reduceMotion.matches) { done(); } else { closeTimer = setTimeout(done, 220); }\n\n      // Restore focus to whatever opened it.\n      if (returnFocus && typeof returnFocus.focus === 'function') returnFocus.focus();\n    }\n\n    /* The tab bar's opener is an <a> with a real destination so it still goes\n       somewhere with no JavaScript. Once the drawer is available that href\n       must not also fire, or the drawer opens and the page navigates out from\n       under it - which is exactly what it did. */\n    /* On a phone the menu is a sheet above the tab bar, so the Shop tab that\n       opened it is still under the thumb: a second tap closes it. On a page the\n       Shop tab marks as current (a collection or a product), a tap after\n       scrolling returns to the top first - a native tab bar's back-to-top,\n       which replaces the floating button there - and the next tap opens the\n       menu. */\n    Array.prototype.forEach.call(openBtns, function (btn) {\n      btn.addEventListener('click', function (e) {\n        if (btn.tagName === 'A') { e.preventDefault(); }\n        if (root.classList.contains('is-open')) { close(); return; }\n        if (btn.classList.contains('is-current') && window.scrollY > TOP_TAP_MIN) { toTop(); return; }\n        open();\n      });\n    });\n    if (closeBtn) closeBtn.addEventListener('click', close);\n    if (scrim) scrim.addEventListener('click', close);\n    root.addEventListener('animationend', function (e) {\n      if (e.target.classList) { e.target.classList.remove('is-enter-fwd', 'is-enter-back'); }\n    });\n\n    root.addEventListener('click', function (e) {\n      var drill = e.target.closest('[data-tdhq-drill]');\n      if (drill) {\n        e.preventDefault();\n        morph(function () {\n          show(drill.getAttribute('data-tdhq-drill'), drill.classList.contains('tdhq-drawer__back') ? 'back' : 'fwd');\n        });\n        return;\n      }\n      var a = e.target.closest('a[href]');\n      if (a) track('drawer_click', { destination: a.getAttribute('href') || '' });\n    });\n\n    root.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape') { e.preventDefault(); close(); return; }\n      if (e.key !== 'Tab') return;\n\n      var f = visibleFocusables();\n      if (!f.length) return;\n      var first = f[0], last = f[f.length - 1];\n      if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); }\n      else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); }\n    });\n  }\n\n  /* =========================================================\n     7. TAB BAR\n     The tab for the page you are on scrolls back to the top instead of\n     reloading the page (the Shop tab does the same inside drawer()). Any\n     other tab closes an open menu sheet on its way, so the menu never stays\n     up behind the saved panel or the next page.\n     ========================================================= */\n  function tabbar() {\n    var bar = document.querySelector('[data-tdhq-tabbar]');\n    if (!bar || bar.dataset.tdhqTabbarReady) return;\n    bar.dataset.tdhqTabbarReady = '1';\n    bar.addEventListener('click', function (e) {\n      var tab = e.target.closest('.tdhq-tabbar__tab');\n      if (!tab) return;\n      /* ONE PANEL AT A TIME (chrome-07): the saved panel and the basket stay\n         above a live tab bar, so a tab closes whichever of them it does not\n         open on its way. */\n      if (!tab.hasAttribute('data-tdhq-saved-open') && window.tdhqSavedClose) window.tdhqSavedClose();\n      if (!tab.hasAttribute('data-tdhq-cart-link') && document.documentElement.classList.contains('tdhq-cd-open') &&\n          window.tdhqCartDrawer && window.tdhqCartDrawer.close) window.tdhqCartDrawer.close();\n      if (tab.hasAttribute('data-tdhq-drawer-open')) return;\n      var sheet = document.querySelector('[data-tdhq-drawer].is-open');\n      var shut = sheet && sheet.querySelector('[data-tdhq-drawer-close]');\n      if (shut) shut.click();\n      if (tab.classList.contains('is-current') && window.scrollY > 0) {\n        e.preventDefault();\n        toTop();\n      }\n    });\n  }\n\n  /* One entry point, so the editor can re-run exactly what a fresh page runs. */\n  function boot() {\n    unbindGlobals();\n    header = document.querySelector('[data-tdhq-header]');\n    sticky();\n    /* The rest of the header sets up in steps (window.TdhqBoot, 21 Oct) so a swipe at page open is not held. */\n    var rest = [megaMenu, announce, search, searchToggle, appSearch, drawer, tabbar];\n    if (window.TdhqBoot) { window.TdhqBoot.steps(rest); } else { rest.forEach(function (fn) { fn(); }); }\n  }\n\n  boot();\n\n  /* Shopify fires this when a section is re-rendered in the theme editor. Only\n     re-boot when the section that changed actually contains the header or the\n     drawer - every other section re-render is none of this file's business. */\n  document.addEventListener('shopify:section:load', function (e) {\n    var t = e.target;\n    if (!t || !t.querySelector) { return; }\n    if (t.querySelector('[data-tdhq-header], [data-tdhq-drawer]') ||\n        (t.matches && t.matches('[data-tdhq-header], [data-tdhq-drawer]'))) {\n      /* the bar's own line of script does not run in a re-rendered section,\n         so its html classes are re-read from the new markup here, and the new\n         bar is moved to <body> as that script does (the old one is dropped) */\n      var bar = document.querySelector('[data-tdhq-tabbar]');\n      if (t.querySelector('[data-tdhq-header]') || (t.matches && t.matches('[data-tdhq-header]'))) {\n        bar = t.querySelector('[data-tdhq-tabbar]');\n        Array.prototype.forEach.call(document.querySelectorAll('[data-tdhq-tabbar]'), function (old) {\n          if (old !== bar && old.parentNode) { old.parentNode.removeChild(old); }\n        });\n        if (bar && bar.parentNode !== document.body) {\n          var top = t;\n          while (top.parentNode && top.parentNode !== document.body) { top = top.parentNode; }\n          if (top.parentNode) { top.parentNode.insertBefore(bar, top.nextSibling); } else { document.body.appendChild(bar); }\n        }\n      }\n      document.documentElement.classList.toggle('tdhq-has-tabbar', !!bar);\n      document.documentElement.classList.toggle('tdhq-tab-current', !!(bar && bar.querySelector('.tdhq-tabbar__tab.is-current')));\n      boot();\n    }\n  });\n  /* The bar lives outside its section (tdhq-mobilebar.liquid), so it is not removed with it: when the editor\n     deletes or re-renders the header section, the bar goes too (a re-render brings the new one in above). */\n  document.addEventListener('shopify:section:unload', function (e) {\n    var t = e.target;\n    if (!t || !t.querySelector) { return; }\n    if (!(t.querySelector('[data-tdhq-header]') || (t.matches && t.matches('[data-tdhq-header]')))) { return; }\n    Array.prototype.forEach.call(document.querySelectorAll('[data-tdhq-tabbar]'), function (old) {\n      if (old.parentNode) { old.parentNode.removeChild(old); }\n    });\n    document.documentElement.classList.remove('tdhq-has-tabbar', 'tdhq-tab-current');\n  });\n})();\n\n/* ============================================================\n   HQ REWARDS (Joy) - one handler for every [data-tdhq-joy] link.\n\n   The client wants no floating launcher: HQ Rewards opens from the header,\n   the phone menu, the account page and the rewards buttons. Joy's launcher is\n   hidden in the app (Advanced > Display) and Joy opens a screen when the URL\n   hash is one of its documented deeplinks (#joy-home, #joy-ways-to-earn,\n   #joy-ways-to-redeem, #joy-rewards, #joy-activities, #joy-profile).\n\n   Every entry point is a real link, so when Joy is not on the page (app off,\n   script blocked) the click simply follows its href. When Joy is there the\n   click becomes the deeplink instead: the phone menu is closed first, and a\n   hash already in the address bar is cleared so the same screen can be\n   opened twice in a row (a hash that does not change fires no hashchange).\n   ============================================================ */\n(function () {\n  'use strict';\n  if (window.__tdhqJoyLinks) return;\n  window.__tdhqJoyLinks = true;\n\n  document.addEventListener('click', function (e) {\n    var link = e.target.closest && e.target.closest('[data-tdhq-joy]');\n    if (!link || e.defaultPrevented || e.button > 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n    /* Joy not on the page (app off, script blocked): follow the real link. */\n    if (!window.joyInstance) return;\n    e.preventDefault();\n    var fallback = link.getAttribute('href');\n\n    var sheet = document.querySelector('[data-tdhq-drawer].is-open');\n    var shut = sheet && sheet.querySelector('[data-tdhq-drawer-close]');\n    if (shut) shut.click();\n\n    var hash = '#' + link.getAttribute('data-tdhq-joy');\n    if (location.hash) history.replaceState(null, '', location.pathname + location.search);\n    location.hash = hash;\n\n    /* Joy draws its drawer on the first open, and not at all for a guest\n       (the programme shows only after sign-in). Nothing open a moment later\n       means the link's own destination is the right one. */\n    setTimeout(function () {\n      if (!document.querySelector('joy-loyalty-widget') && fallback) {\n        history.replaceState(null, '', location.pathname + location.search);\n        window.location.href = fallback;\n      }\n    }, 1200);\n  });\n})();\n\n/* ============================================================\n   PEEK SHEET - \"How it works\" without leaving the page.\n\n   A link with data-tdhq-peek=\"<section anchor>\" opens a sheet holding that\n   section of its page: the heading, the intro and the numbered steps\n   (tdhq-steps), plus the notice named by data-tdhq-peek-note (tdhq-notice).\n   Shopify serves every storefront page with X-Frame-Options: DENY, so a page\n   cannot be framed; it is fetched once instead and the section is read from\n   it, which keeps the words the page's own, edited in one place. They are\n   written as text, never as fetched markup (only the step icon, the theme's\n   own svg, is copied). The foot keeps an Open full page button, and the\n   link's href is the full page - which is also where a click goes if the\n   page cannot be fetched or the section is not on it.\n   ============================================================ */\n(function () {\n  'use strict';\n  if (window.__tdhqPeek) return;\n  window.__tdhqPeek = true;\n  if (typeof HTMLDialogElement === 'undefined' || !window.fetch || !window.DOMParser) return;\n\n  var root = document.documentElement;\n  var pages = {};\n  var dlg, titleEl, bodyEl, fullEl, opener = null;\n\n  function el(tag, cls, text) {\n    var n = document.createElement(tag);\n    if (cls) n.className = cls;\n    if (text) n.textContent = text;\n    return n;\n  }\n  function txt(scope, sel) {\n    var n = scope && scope.querySelector(sel);\n    return n ? n.textContent.replace(/\\s+/g, ' ').trim() : '';\n  }\n\n  function build() {\n    dlg = el('dialog', 'tdhq-peek');\n    dlg.setAttribute('aria-labelledby', 'tdhq-peek-title');\n    var bar = el('div', 'tdhq-peek__bar');\n    titleEl = el('h2', 'tdhq-peek__title');\n    titleEl.id = 'tdhq-peek-title';\n    var close = el('button', 'tdhq-peek__close');\n    close.type = 'button';\n    close.setAttribute('aria-label', 'Close');\n    close.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>';\n    bar.appendChild(titleEl);\n    bar.appendChild(close);\n    bodyEl = el('div', 'tdhq-peek__body');\n    var foot = el('div', 'tdhq-peek__foot');\n    fullEl = el('a', 'tdhq-peek__full', 'Open full page');\n    foot.appendChild(fullEl);\n    dlg.appendChild(bar);\n    dlg.appendChild(bodyEl);\n    dlg.appendChild(foot);\n    document.body.appendChild(dlg);\n    close.addEventListener('click', function () { dlg.close(); });\n    /* a click on the backdrop lands on the dialog element itself */\n    dlg.addEventListener('click', function (e) { if (e.target === dlg) dlg.close(); });\n    dlg.addEventListener('close', function () {\n      root.classList.remove('tdhq-peek-open');\n      if (opener && typeof opener.focus === 'function') opener.focus();\n    });\n  }\n\n  /* INFORMATION CARDS (tdhq-card-grid): the delivery options and the store's facts\n     open in the same peek as a how-it-works section. A card is a fact, not a\n     step, so it carries no number; its value (an address, the opening hours) is\n     copied with its own line breaks. */\n  function renderCards(sec, frag) {\n    var cards = sec.querySelectorAll('.tdhq-card');\n    if (!cards.length) return null;\n    var ul = el('ul', 'tdhq-peek__steps tdhq-peek__steps--cards'), seen = [];\n    Array.prototype.forEach.call(cards, function (c) {\n      var li = el('li', 'tdhq-peek__step');\n      var svg = c.querySelector('.tdhq-card__icon svg');\n      if (svg) {\n        var ico = el('span', 'tdhq-peek__ico');\n        ico.setAttribute('aria-hidden', 'true');\n        ico.appendChild(document.importNode(svg, true));\n        li.appendChild(ico);\n      }\n      var box = el('div', 'tdhq-peek__stepbody');\n      var t = txt(c, '.tdhq-card__title');\n      if (t) box.appendChild(el('h3', 'tdhq-peek__steptitle', t));\n      var v = c.querySelector('.tdhq-card__value');\n      if (v && v.textContent.trim()) {\n        var vp = el('p', 'tdhq-peek__stepcopy tdhq-peek__value');\n        Array.prototype.forEach.call(v.childNodes, function (n) { vp.appendChild(document.importNode(n, true)); });\n        box.appendChild(vp);\n      }\n      var m = c.querySelector('.tdhq-card__meta');\n      var mt = m ? m.textContent.replace(/\\s+/g, ' ').trim() : '';\n      if (mt && seen.indexOf(mt) < 0) {\n        seen.push(mt);\n        var mp = el('p', 'tdhq-peek__stepcopy tdhq-peek__lines');\n        Array.prototype.forEach.call(m.childNodes, function (n) { mp.appendChild(document.importNode(n, true)); });\n        box.appendChild(mp);\n      }\n      var cp = txt(c, '.tdhq-card__copy');\n      if (cp) box.appendChild(el('p', 'tdhq-peek__stepcopy', cp));\n      li.appendChild(box);\n      ul.appendChild(li);\n    });\n    frag.appendChild(ul);\n    return { heading: txt(sec, 'h2'), content: frag };\n  }\n\n  function render(doc, anchor, noteAnchor) {\n    var sec = doc.getElementById(anchor);\n    if (!sec) return null;\n    var frag = document.createDocumentFragment();\n    var lede = txt(sec, '.tdhq-heading__copy');\n    if (lede) frag.appendChild(el('p', 'tdhq-peek__lede', lede));\n    var steps = sec.querySelectorAll('.tdhq-step');\n    if (!steps.length) return renderCards(sec, frag);\n    var ol = el('ol', 'tdhq-peek__steps');\n    Array.prototype.forEach.call(steps, function (s, i) {\n      var li = el('li', 'tdhq-peek__step');\n      li.appendChild(el('span', 'tdhq-peek__num', String(i + 1)));\n      var svg = s.querySelector('.tdhq-step__icon svg');\n      if (svg) {\n        var ico = el('span', 'tdhq-peek__ico');\n        ico.setAttribute('aria-hidden', 'true');\n        ico.appendChild(document.importNode(svg, true));\n        li.appendChild(ico);\n      }\n      var box = el('div', 'tdhq-peek__stepbody');\n      var t = txt(s, '.tdhq-step__title');\n      if (t) box.appendChild(el('h3', 'tdhq-peek__steptitle', t));\n      var c = txt(s, '.tdhq-step__copy');\n      if (c) box.appendChild(el('p', 'tdhq-peek__stepcopy', c));\n      var items = s.querySelectorAll('.tdhq-step__list li');\n      if (items.length) {\n        var ul = el('ul', 'tdhq-peek__list');\n        Array.prototype.forEach.call(items, function (it) {\n          ul.appendChild(el('li', '', it.textContent.replace(/\\s+/g, ' ').trim()));\n        });\n        box.appendChild(ul);\n      }\n      var n = txt(s, '.tdhq-step__note');\n      if (n) box.appendChild(el('p', 'tdhq-peek__stepnote', n));\n      li.appendChild(box);\n      ol.appendChild(li);\n    });\n    frag.appendChild(ol);\n    var foot = txt(sec, '.tdhq-steps__note');\n    if (foot) frag.appendChild(el('p', 'tdhq-peek__footnote', foot));\n    if (noteAnchor) {\n      var ns = doc.getElementById(noteAnchor);\n      var nt = txt(ns, '.tdhq-notice__title');\n      var nc = txt(ns, '.tdhq-notice__copy');\n      if (nt || nc) {\n        var note = el('div', 'tdhq-peek__notice');\n        note.setAttribute('role', 'note');\n        if (nt) note.appendChild(el('strong', '', nt));\n        var paras = ns.querySelectorAll('.tdhq-notice__copy p');\n        if (paras.length) {\n          Array.prototype.forEach.call(paras, function (p) {\n            var pt = p.textContent.replace(/\\s+/g, ' ').trim();\n            if (pt) note.appendChild(el('p', '', pt));\n          });\n        } else if (nc) {\n          note.appendChild(el('p', '', nc));\n        }\n        frag.appendChild(note);\n      }\n    }\n    return { heading: txt(sec, 'h2'), content: frag };\n  }\n\n  /* U.30b (user 7 Oct 2026: \"it says loading first and then it appears ...\n     looks stupid\"): the peek never shows a loading line. The page is fetched\n     as soon as a visitor shows intent (pointer over the link, keyboard focus,\n     a touch), and a click opens the popup only once its content is ready; a\n     slow fetch shows a busy cursor on the link meanwhile. */\n  function pageOf(link) {\n    var href = link.getAttribute('href') || '';\n    return href.split('#')[0] || location.pathname;\n  }\n  function load(page) {\n    if (!pages[page]) {\n      pages[page] = fetch(page, { credentials: 'same-origin' })\n        .then(function (r) { if (!r.ok) throw new Error(r.status); return r.text(); })\n        .then(function (html) { return new DOMParser().parseFromString(html, 'text/html'); });\n      pages[page].catch(function () { delete pages[page]; });\n    }\n    return pages[page];\n  }\n\n  /* U.30c ONE SECTION, NOT THE WHOLE PAGE. Shopify's section rendering returns\n     just the section that holds the peek (under 1 KB against about 90 KB).\n     The site's own peeks are seeded; any other is learned from its first\n     full-page fetch and kept on this device. A section that is not there any\n     more falls back to the full page, which also relearns its id. Section ids\n     carry the template id, which is different in every theme: the seeds apply\n     only on the theme they were read from (SEED_THEME, the live theme), and\n     learned ids are kept per theme (U.58). */\n  var THEME = String((window.Shopify && window.Shopify.theme && window.Shopify.theme.id) || '');\n  var SEED_THEME = '189060841857';\n  var SEED = {\n    '/pages/delivery-shipping#delivery-options': 'template--27514158776705__carriers',\n    '/pages/click-and-collect#how-it-works': 'template--27515727905153__steps',\n    '/pages/hq-rewards#how-hq-rewards-works': 'template--27523040838017__process',\n    '/pages/visit-our-ilkeston-store#store-opening-hours': 'template--27516114567553__info'\n  };\n  var LEARN = 'tdhq-peek-sections';\n  var learned = {};\n  try { learned = JSON.parse(window.localStorage.getItem(LEARN) || '{}') || {}; } catch (err) { learned = {}; }\n  function sectionFor(key) { return learned[THEME + '|' + key] || (THEME === SEED_THEME ? SEED[key] : '') || ''; }\n  function remember(key, id) {\n    key = THEME + '|' + key;\n    if (!id || learned[key] === id) return;\n    learned[key] = id;\n    try { window.localStorage.setItem(LEARN, JSON.stringify(learned)); } catch (err) {}\n  }\n  var parts = {};\n  function loadFor(link) {\n    var page = pageOf(link);\n    var anchor = link.getAttribute('data-tdhq-peek');\n    if (link.getAttribute('data-tdhq-peek-note')) return load(page);\n    var key = page + '#' + anchor;\n    if (parts[key]) return parts[key];\n    var viaPage = function () {\n      return load(page).then(function (doc) {\n        var at = doc.getElementById(anchor);\n        var wrap = at && at.closest ? at.closest('.shopify-section') : null;\n        if (wrap && wrap.id) remember(key, wrap.id.replace(/^shopify-section-/, ''));\n        return doc;\n      });\n    };\n    var id = sectionFor(key);\n    parts[key] = (id ? fetch(page + (page.indexOf('?') < 0 ? '?' : '&') + 'section_id=' + encodeURIComponent(id), { credentials: 'same-origin' })\n      .then(function (r) { if (!r.ok) throw new Error(r.status); return r.text(); })\n      .then(function (html) {\n        var doc = new DOMParser().parseFromString(html, 'text/html');\n        if (!doc.getElementById(anchor)) throw new Error('moved');\n        return doc;\n      })\n      .catch(function () { delete learned[THEME + '|' + key]; return viaPage(); }) : viaPage());\n    parts[key].catch(function () { delete parts[key]; });\n    return parts[key];\n  }\n  function warm(e) {\n    var link = e.target && e.target.closest && e.target.closest('[data-tdhq-peek]');\n    if (link && link.getAttribute('href')) loadFor(link);\n  }\n  document.addEventListener('pointerover', warm, { passive: true });\n  document.addEventListener('touchstart', warm, { passive: true });\n  document.addEventListener('focusin', warm);\n  /* the top-bar peeks (delivery, Click and Collect) are on every page: their\n     sections are fetched once the page is idle, so a tap opens them at once */\n  function warmBar() {\n    var c = navigator.connection;\n    if (c && c.saveData) return;\n    Array.prototype.forEach.call(document.querySelectorAll('.tdhq-announce [data-tdhq-peek]'), function (a) {\n      var key = pageOf(a) + '#' + a.getAttribute('data-tdhq-peek');\n      if (sectionFor(key)) loadFor(a);\n    });\n  }\n  var idle = window.requestIdleCallback || function (fn) { return setTimeout(fn, 1500); };\n  if (document.readyState === 'complete') idle(warmBar);\n  else window.addEventListener('load', function () { idle(warmBar); }, { once: true });\n\n  var pending = 0;\n  document.addEventListener('click', function (e) {\n    var link = e.target.closest && e.target.closest('[data-tdhq-peek]');\n    if (!link || e.defaultPrevented || e.button > 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n    var href = link.getAttribute('href');\n    if (!href) return;\n    e.preventDefault();\n    if (!dlg) build();\n    var page = pageOf(link);\n    var anchor = link.getAttribute('data-tdhq-peek');\n    var noteAnchor = link.getAttribute('data-tdhq-peek-note');\n    var mine = ++pending;\n    link.setAttribute('aria-busy', 'true');\n    link.classList.add('is-peek-busy');\n    loadFor(link).then(function (doc) {\n      if (mine !== pending) return;\n      var out = render(doc, anchor, noteAnchor);\n      if (!out) throw new Error('section');\n      opener = link;\n      titleEl.textContent = out.heading || link.getAttribute('data-tdhq-peek-title') || link.textContent.trim();\n      fullEl.setAttribute('href', href);\n      bodyEl.textContent = '';\n      bodyEl.appendChild(out.content);\n      root.classList.add('tdhq-peek-open');\n      if (!dlg.open) dlg.showModal();\n      bodyEl.scrollTop = 0;\n    }).catch(function () {\n      if (mine === pending) window.location.href = href;\n    }).then(function () {\n      link.removeAttribute('aria-busy');\n      link.classList.remove('is-peek-busy');\n    });\n  });\n})();\n"],
  "mappings": "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",
  "names": ["on"]
}
