{
  "version": 3,
  "sources": ["/cdn/shop/t/113/assets/ada-component-structure.js?theme_ada=20261022-1"],
  "sourcesContent": ["(() => {\n  const galleryItemSelector = \".junip-gallery-item-wrapper[role='button']\";\n\n  const repairReviewGallery = () => {\n    document.querySelectorAll(\".junip-gallery-container\").forEach((gallery) => {\n      const items = Array.from(gallery.querySelectorAll(galleryItemSelector));\n      const activeItem = items.find((item) => item === document.activeElement);\n\n      items.forEach((item, index) => {\n        item.tabIndex = item === activeItem || (!activeItem && index === 0) ? 0 : -1;\n      });\n    });\n  };\n\n  // The gallery strip does not scroll to a focused tile or to its trailing \"See more\" link on its own, which\n  // leaves the focused control off screen. Bring it into view.\n  document.addEventListener(\"focusin\", (event) => {\n    const target = event.target;\n    if (!(target instanceof HTMLElement) || !target.closest(\".junip-gallery-container\")) return;\n    window.setTimeout(() => {\n      if (document.activeElement === target) {\n        target.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n      }\n    }, 0);\n  });\n\n  document.addEventListener(\"keydown\", (event) => {\n    const item = event.target.closest?.(galleryItemSelector);\n\n    if (!item || ![\"ArrowLeft\", \"ArrowRight\"].includes(event.key)) {\n      return;\n    }\n\n    const items = Array.from(item.closest(\".junip-gallery-container\").querySelectorAll(galleryItemSelector));\n    const direction = event.key === \"ArrowRight\" ? 1 : -1;\n    const nextItem = items[(items.indexOf(item) + direction + items.length) % items.length];\n\n    event.preventDefault();\n    item.tabIndex = -1;\n    nextItem.tabIndex = 0;\n    nextItem.focus();\n  });\n\n  const repairReviewCards = () => {\n    document\n      .querySelectorAll(\".junip-review-grid-item-container[role='button']\")\n      .forEach((card) => {\n        card.removeAttribute(\"role\");\n        card.removeAttribute(\"tabindex\");\n        card.removeAttribute(\"aria-label\");\n      });\n\n    // Review titles sit one level below the widget's own heading (\"Customer reviews\" on product pages), or at\n    // level 2 where the widget has no heading of its own (home page, reviews page).\n    document.querySelectorAll(\".junip-product-review-container\").forEach((container) => {\n      const widgetHeading = Array.from(\n        container.querySelectorAll(\"h1, h2, h3, h4, h5, h6, [role='heading']\")\n      ).find((heading) => !heading.matches(\".junip-review-title\") && heading.textContent.trim());\n      const widgetLevel = widgetHeading\n        ? Number(widgetHeading.getAttribute(\"aria-level\") || widgetHeading.tagName.slice(1)) || 2\n        : 1;\n      const reviewLevel = String(Math.min(widgetLevel + 1, 6));\n\n      container.querySelectorAll(\".junip-review-title[role='heading']\").forEach((heading) => {\n        if (heading.getAttribute(\"aria-level\") !== reviewLevel) heading.setAttribute(\"aria-level\", reviewLevel);\n      });\n    });\n\n    repairReviewGallery();\n    repairReviewFilterToggle();\n    repairReviewFormSteps();\n  };\n\n  // \"Write a review\" is a multi-step form; each step shows its question in .junip-step-title, but the field is\n  // only described by a placeholder. Label each field with its step title and mark it required when the step\n  // cannot be continued while the field is empty (Continue stays disabled).\n  let reviewStepTitleCount = 0;\n  const repairReviewFormSteps = () => {\n    document.querySelectorAll(\".junip-step\").forEach((step) => {\n      const title = step.querySelector(\".junip-step-title\");\n      if (!title) return;\n      title.id ||= `theme-junip-step-title-${(reviewStepTitleCount += 1)}`;\n\n      const continueButton = Array.from(step.querySelectorAll(\"button\")).find((button) =>\n        /continue/i.test(button.textContent)\n      );\n\n      step.querySelectorAll(\"input:not([type='hidden']):not([type='file']), textarea, select\").forEach((field) => {\n        const hasName =\n          field.getAttribute(\"aria-label\") || field.getAttribute(\"aria-labelledby\") || field.labels?.length;\n        if (!hasName) field.setAttribute(\"aria-labelledby\", title.id);\n\n        if (!field.value && continueButton?.disabled && field.getAttribute(\"aria-required\") !== \"true\") {\n          field.setAttribute(\"aria-required\", \"true\");\n        }\n      });\n    });\n  };\n\n  // Junip's review dialogs close on Escape from the photo viewer but not from the \"Write a review\" form.\n  document.addEventListener(\"keydown\", (event) => {\n    if (event.key !== \"Escape\") return;\n    const dialog = event.target.closest?.('.junip-modal[role=\"dialog\"]');\n    const closeButton = dialog?.querySelector('[role=\"button\"][aria-label=\"Close\"]');\n    if (!closeButton) return;\n    event.preventDefault();\n    closeButton.click();\n  }, true);\n\n  // Junip's \"Toggle filters\" button points aria-controls at #junip-filters-container, which Junip only renders\n  // while the filters are shown. Drop the reference while the target is missing and restore it once it exists.\n  const repairReviewFilterToggle = () => {\n    document\n      .querySelectorAll(\".junip-filters-toggle[aria-controls], .junip-filters-toggle[data-theme-aria-controls]\")\n      .forEach((toggle) => {\n        const targetId =\n          toggle.getAttribute(\"aria-controls\") || toggle.dataset.themeAriaControls;\n        const hasTarget = Boolean(document.getElementById(targetId));\n\n        if (hasTarget && toggle.getAttribute(\"aria-controls\") !== targetId) {\n          toggle.setAttribute(\"aria-controls\", targetId);\n        } else if (!hasTarget && toggle.hasAttribute(\"aria-controls\")) {\n          toggle.dataset.themeAriaControls = targetId;\n          toggle.removeAttribute(\"aria-controls\");\n        }\n      });\n  };\n\n  // \"Photos & videos\" is a role=\"checkbox\" div wrapped around a real checkbox, which was a second, invisible\n  // (0px) tab stop and a second checkbox for screen readers. Keep the div as the one control, named by its\n  // visible label. The \"Purchase verified\" and \"received a perk\" badges are focusable images that do nothing (21 extra tab stops on\n  // the reviews page); keep them readable but out of the Tab order.\n  const repairReviewControls = () => {\n    document.querySelectorAll(\".junip-checkbox[role='checkbox']\").forEach((checkbox) => {\n      const input = checkbox.querySelector(\"input[type='checkbox']\");\n      const label = checkbox.querySelector(\"label\")?.textContent.replace(/\\s+/g, \" \").trim();\n      if (input && input.getAttribute(\"tabindex\") !== \"-1\") input.setAttribute(\"tabindex\", \"-1\");\n      if (input && input.getAttribute(\"aria-hidden\") !== \"true\") input.setAttribute(\"aria-hidden\", \"true\");\n      if (label && checkbox.getAttribute(\"aria-label\") !== label) checkbox.setAttribute(\"aria-label\", label);\n    });\n    document.querySelectorAll(\":is(.junip-verified-container, .junip-rewarded-container)[role='img'][tabindex]\").forEach((badge) => {\n      badge.removeAttribute(\"tabindex\");\n    });\n\n    // Review photo tiles are named \"Preview image for <review title>\", or \"\u2026for null\" when the review has no\n    // title. Say what they are: \"Photo from the review: So Delicious\" / \"Customer photo 14 of 16\".\n    const tiles = Array.from(document.querySelectorAll(\".junip-gallery-item-wrapper[role='button'][aria-label]\"));\n    tiles.forEach((tile, index) => {\n      const junipLabel = tile.dataset.themeJunipLabel || tile.getAttribute(\"aria-label\");\n      if (!/^preview image for /i.test(junipLabel)) return;\n      tile.dataset.themeJunipLabel = junipLabel;\n      const reviewTitle = junipLabel.replace(/^preview image for /i, \"\").trim();\n      const label =\n        reviewTitle && reviewTitle !== \"null\" && reviewTitle !== \"undefined\"\n          ? `Photo from the review: ${reviewTitle}`\n          : `Customer photo ${index + 1} of ${tiles.length}`;\n      if (tile.getAttribute(\"aria-label\") !== label) tile.setAttribute(\"aria-label\", label);\n    });\n\n    // \"See more\" at the end of the photo strip is a focusable div with no role.\n    document.querySelectorAll(\".junip-gallery-more[tabindex='0']\").forEach((more) => {\n      if (more.getAttribute(\"role\") !== \"button\") more.setAttribute(\"role\", \"button\");\n      if (more.getAttribute(\"aria-label\") !== \"See more customer photos\") more.setAttribute(\"aria-label\", \"See more customer photos\");\n    });\n  };\n\n  // \"See more\" (end of the photo strip): Junip loads the remaining photos as soon as it scrolls into view (which\n  // happens when it gets focus) and then removes it, so focus fell to the top of the page. While it has focus,\n  // watch for that and move focus to the first newly loaded photo (it becomes the gallery's tab stop).\n  // Enter/Space also activate it.\n  const followLoadedPhotos = (more) => {\n    const shownBefore = document.querySelectorAll(galleryItemSelector).length;\n    const until = performance.now() + 4000;\n    const check = () => {\n      const active = document.activeElement;\n      if (more.isConnected && active === more) {\n        if (performance.now() < until) window.setTimeout(check, 100);\n        return;\n      }\n      if (active && active !== document.body) return; // focus is somewhere meaningful\n      const items = Array.from(document.querySelectorAll(galleryItemSelector));\n      const target = items[shownBefore] || items[items.length - 1];\n      if (!target) return;\n      items.forEach((item) => {\n        item.tabIndex = item === target ? 0 : -1;\n      });\n      target.focus();\n    };\n    window.setTimeout(check, 100);\n  };\n\n  document.addEventListener(\"focusin\", (event) => {\n    const more = event.target.closest?.(\".junip-gallery-more\");\n    if (more) followLoadedPhotos(more);\n  });\n\n  document.addEventListener(\n    \"keydown\",\n    (event) => {\n      const more = event.target.closest?.(\".junip-gallery-more\");\n      if (!more || (event.key !== \"Enter\" && event.key !== \" \")) return;\n      event.preventDefault();\n      more.click();\n    },\n    true\n  );\n\n  // Junip announces \"More reviews loaded\" for pagination, but filtering (star bars, rating, photos) and sorting\n  // change the list silently. Announce the new result once the list has re-rendered.\n  let reviewStatus = null;\n  const announceReviews = (message) => {\n    if (!reviewStatus) {\n      reviewStatus = document.createElement(\"div\");\n      reviewStatus.className = \"sr-only\";\n      reviewStatus.setAttribute(\"role\", \"status\");\n      reviewStatus.setAttribute(\"aria-live\", \"polite\");\n      reviewStatus.setAttribute(\"aria-atomic\", \"true\");\n      document.body.appendChild(reviewStatus);\n    }\n    reviewStatus.textContent = \"\";\n    window.setTimeout(() => {\n      reviewStatus.textContent = message;\n    }, 50);\n  };\n\n  const describeReviewList = (section) => {\n    const shown = section.querySelectorAll(\".junip-review-date\").length;\n    if (shown === 0) return \"No reviews match these filters.\";\n\n    const rating = section.querySelector('select[aria-label=\"Rating drop down\"]');\n    const sort = section.querySelector('select[aria-label=\"Sort by drop down\"]');\n    const photosOnly =\n      section.querySelector('[role=\"checkbox\"][aria-label*=\"photos\"]')?.getAttribute(\"aria-checked\") === \"true\";\n    const hasMore = Array.from(section.querySelectorAll(\"button\")).some((button) =>\n      /see more reviews/i.test(button.textContent)\n    );\n\n    const searchTerm = section.querySelector('input[type=\"search\"]')?.value.trim();\n\n    const filters = [];\n    if (searchTerm) filters.push(`matching \"${searchTerm}\"`);\n    if (rating && rating.value !== \"all\") filters.push(`rated ${rating.selectedOptions[0]?.text}`);\n    if (photosOnly) filters.push(\"with photos\");\n\n    return [\n      `Showing ${shown} review${shown === 1 ? \"\" : \"s\"}${filters.length ? `, ${filters.join(\", \")}` : \"\"}.`,\n      sort ? `Sorted by ${sort.selectedOptions[0]?.text}.` : \"\",\n      hasMore ? \"More reviews available.\" : \"\"\n    ]\n      .filter(Boolean)\n      .join(\" \");\n  };\n\n  const reviewListSignature = (section) =>\n    Array.from(section.querySelectorAll(\".junip-review-date\"))\n      .map((date) => date.closest(\".junip-review-grid-item-container, [class*='junip-review']\")?.textContent.length || 0)\n      .join(\",\");\n\n  const announceAfterReviewUpdate = (section, returnFocusTo = null) => {\n    const before = reviewListSignature(section);\n    let attempts = 0;\n    const check = () => {\n      attempts += 1;\n      const changed = reviewListSignature(section) !== before;\n      // Wait for the list to change (or give up after ~2.5s and describe whatever is shown).\n      if (changed || attempts >= 5) {\n        announceReviews(describeReviewList(section));\n        // Searching re-renders the search buttons, which drops focus to <body>.\n        if (returnFocusTo?.isConnected && (document.activeElement === document.body || !document.activeElement)) {\n          returnFocusTo.focus({ preventScroll: true });\n        }\n        return;\n      }\n      window.setTimeout(check, 500);\n    };\n    window.setTimeout(check, 500);\n  };\n\n  const reviewFilterSelector = [\n    '.junip-product-review-bar-wrapper[role=\"button\"]',\n    '.junip-filters [role=\"checkbox\"]',\n    \".junip-filters select\",\n    \".junip-search-button\",\n    '.junip-product-review-container input[type=\"search\"]'\n  ].join(\",\");\n\n  const onReviewFilterActivated = (event) => {\n    const control = event.target.closest?.(reviewFilterSelector);\n    if (!control) return;\n    const isSearchField = control.matches('input[type=\"search\"]');\n    if (event.type === \"keydown\" && !(isSearchField ? event.key === \"Enter\" : [\"Enter\", \" \"].includes(event.key))) return;\n    if (event.type === \"click\" && (control.matches(\"select\") || isSearchField)) return;\n    if (event.type === \"change\" && isSearchField) return;\n\n    const section = control.closest(\".junip-product-review-container, [class*='junip-review-section']\");\n    if (!section) return;\n    const searchField = control.closest(\".junip-search-button, input[type='search']\")\n      ? section.querySelector('input[type=\"search\"]')\n      : null;\n    announceAfterReviewUpdate(section, searchField);\n  };\n\n  document.addEventListener(\"click\", onReviewFilterActivated, true);\n  document.addEventListener(\"keydown\", onReviewFilterActivated, true);\n  document.addEventListener(\"change\", onReviewFilterActivated, true);\n\n  // Switching between \"Product reviews\" and \"Store reviews\" swaps the whole summary and list silently.\n  const onReviewTabActivated = (event) => {\n    const tab = event.target.closest?.('.junip-reviews-tab[role=\"tab\"]');\n    if (!tab) return;\n    if (event.type === \"keydown\" && ![\"Enter\", \" \"].includes(event.key)) return;\n\n    const section = tab.closest(\".junip-product-review-container, [class*='junip-review-section']\");\n    if (!section) return;\n    window.setTimeout(() => {\n      const average = section.querySelector(\".junip-product-review-average\")?.textContent.trim();\n      const total = section\n        .querySelector(\".junip-product-review-average\")\n        ?.parentElement?.textContent.match(/([\\d,]+)\\s+reviews?/i)?.[1];\n      announceReviews(\n        [\n          `Showing ${tab.textContent.trim().toLowerCase()}.`,\n          average ? `Average rating ${average} out of 5.` : \"\",\n          total ? `${total} reviews.` : \"\"\n        ]\n          .filter(Boolean)\n          .join(\" \")\n      );\n    }, 1500);\n  };\n\n  document.addEventListener(\"click\", onReviewTabActivated, true);\n  document.addEventListener(\"keydown\", onReviewTabActivated, true);\n\n  /* ------------------------------------------------------------------------------------------------------------\n   * Store locator (Dynamic Store Locator app, /pages/store-locator)\n   * ---------------------------------------------------------------------------------------------------------- */\n  let locatorStatus = null;\n  const announceLocator = (message) => {\n    if (!locatorStatus) {\n      locatorStatus = document.createElement(\"div\");\n      locatorStatus.className = \"sr-only\";\n      locatorStatus.setAttribute(\"role\", \"status\");\n      locatorStatus.setAttribute(\"aria-live\", \"polite\");\n      locatorStatus.setAttribute(\"aria-atomic\", \"true\");\n      document.body.appendChild(locatorStatus);\n    }\n    locatorStatus.textContent = \"\";\n    window.setTimeout(() => {\n      locatorStatus.textContent = message;\n    }, 50);\n  };\n\n  const setAttributeIfChanged = (element, name, value) => {\n    if (element.getAttribute(name) !== value) element.setAttribute(name, value);\n  };\n\n  // Google Places renders its suggestions in a .pac-container appended to <body>, without any combobox or listbox\n  // semantics, so screen readers never hear that suggestions exist or which one is highlighted.\n  const findPlacesList = () =>\n    Array.from(document.querySelectorAll(\".pac-container\")).find(\n      (container) => getComputedStyle(container).display !== \"none\" && container.querySelector(\".pac-item\")\n    );\n\n  let lastSuggestionCount = -1;\n  const syncPlacesCombobox = (input) => {\n    const list = findPlacesList();\n    const isOpen = Boolean(list);\n    setAttributeIfChanged(input, \"aria-expanded\", String(isOpen));\n\n    if (!list) {\n      input.removeAttribute(\"aria-activedescendant\");\n      lastSuggestionCount = -1;\n      return;\n    }\n\n    list.id ||= \"theme-places-suggestions\";\n    setAttributeIfChanged(list, \"role\", \"listbox\");\n    setAttributeIfChanged(list, \"aria-label\", \"Address suggestions\");\n    setAttributeIfChanged(input, \"aria-controls\", list.id);\n\n    const options = Array.from(list.querySelectorAll(\".pac-item\"));\n    options.forEach((option, index) => {\n      option.id ||= `theme-places-suggestion-${index}`;\n      setAttributeIfChanged(option, \"role\", \"option\");\n      setAttributeIfChanged(option, \"aria-selected\", String(option.classList.contains(\"pac-item-selected\")));\n    });\n\n    const selected = options.find((option) => option.classList.contains(\"pac-item-selected\"));\n    if (selected) {\n      setAttributeIfChanged(input, \"aria-activedescendant\", selected.id);\n    } else {\n      input.removeAttribute(\"aria-activedescendant\");\n    }\n\n    if (options.length !== lastSuggestionCount) {\n      lastSuggestionCount = options.length;\n      announceLocator(\n        `${options.length} address suggestion${options.length === 1 ? \"\" : \"s\"} available. Use the up and down arrow keys to choose, then press Enter.`\n      );\n    }\n  };\n\n  let locatorSearchPending = false;\n  const describeLocatorResults = (locator) => {\n    const items = locator.querySelectorAll(\".location-item\");\n    if (items.length === 0) return \"No locations found. Try another address, a larger search radius or another category.\";\n    // The app's own .locations-count is not kept in sync with the list (it can say \"0 locations found\" above a\n    // full list), so count the rendered results instead.\n    return `${items.length} location${items.length === 1 ? \"\" : \"s\"} found. Results are listed after the search filters.`;\n  };\n\n  const repairStoreLocator = () => {\n    document.querySelectorAll(\".store-locator-container\").forEach((locator) => {\n      const input = locator.querySelector(\"input.location-search-input\");\n      if (input) {\n        if (!input.labels?.length) setAttributeIfChanged(input, \"aria-label\", input.placeholder || \"Enter address or zip code\");\n        setAttributeIfChanged(input, \"role\", \"combobox\");\n        setAttributeIfChanged(input, \"aria-autocomplete\", \"list\");\n        if (!input.hasAttribute(\"aria-expanded\")) input.setAttribute(\"aria-expanded\", \"false\");\n      }\n\n      const range = locator.querySelector(\"select.range-filter-select\");\n      if (range && !range.labels?.length) setAttributeIfChanged(range, \"aria-label\", \"Search radius\");\n\n      const category = locator.querySelector(\"select.tag-filter-select\");\n      if (category && !category.labels?.length) setAttributeIfChanged(category, \"aria-label\", \"Filter locations by category\");\n\n      locator.querySelectorAll(\".search-tip a[href]\").forEach((link) => {\n        if (!link.textContent.trim() && !link.getAttribute(\"aria-label\")) {\n          link.setAttribute(\"aria-label\", \"Powered by H1 Apps (opens in a new tab)\");\n          link.querySelector(\"img\")?.setAttribute(\"alt\", \"\");\n        }\n      });\n\n      const list = locator.querySelector(\".locations-list\");\n      if (list) setAttributeIfChanged(list, \"aria-label\", \"Store locations\");\n\n      // Each result is clickable (it selects the store on the map) but is a plain <div>.\n      locator.querySelectorAll(\".location-item\").forEach((item) => {\n        setAttributeIfChanged(item, \"role\", \"button\");\n        setAttributeIfChanged(item, \"tabindex\", \"0\");\n        setAttributeIfChanged(item, \"aria-pressed\", String(item.classList.contains(\"selected\")));\n        if (item.dataset.themeLocationEnhanced === \"true\") return;\n        item.dataset.themeLocationEnhanced = \"true\";\n        item.addEventListener(\"keydown\", (event) => {\n          if (event.key !== \"Enter\" && event.key !== \" \") return;\n          event.preventDefault();\n          item.click();\n        });\n      });\n    });\n  };\n\n  document.addEventListener(\"keydown\", (event) => {\n    const input = event.target.closest?.(\".store-locator-container input.location-search-input\");\n    if (!input) return;\n    if (event.key === \"Enter\") locatorSearchPending = true;\n    // Google moves its highlight after this event; read it once it has.\n    window.setTimeout(() => syncPlacesCombobox(input), 0);\n  }, true);\n\n  document.addEventListener(\"input\", (event) => {\n    const input = event.target.closest?.(\".store-locator-container input.location-search-input\");\n    if (!input) return;\n    // Suggestions arrive asynchronously after typing.\n    window.setTimeout(() => syncPlacesCombobox(input), 600);\n  }, true);\n\n  document.addEventListener(\"change\", (event) => {\n    if (event.target.closest?.(\".store-locator-container select\")) locatorSearchPending = true;\n  }, true);\n\n  document.addEventListener(\"mousedown\", (event) => {\n    if (event.target.closest?.(\".pac-item\")) locatorSearchPending = true;\n  }, true);\n\n  const isShown = (element) =>\n    Boolean(element) && element.getClientRects().length > 0 && getComputedStyle(element).visibility !== \"hidden\";\n\n  // The list is emptied while a search is loading, so only announce once it shows results or the app's own\n  // \"No locations found\" message, and the spinner is gone.\n  const locatorResultsSettled = (locator) => {\n    if (isShown(locator.querySelector(\".search-spinner\"))) return false;\n    return (\n      locator.querySelectorAll(\".location-item\").length > 0 ||\n      Boolean(locator.querySelector(\".locations-list .no-locations\"))\n    );\n  };\n\n  let locatorResultsTimer;\n  const onLocatorResultsChanged = (attempt = 0) => {\n    if (!locatorSearchPending) return;\n    window.clearTimeout(locatorResultsTimer);\n    locatorResultsTimer = window.setTimeout(() => {\n      const locator = document.querySelector(\".store-locator-container\");\n      if (!locator) return;\n      if (!locatorResultsSettled(locator) && attempt < 10) {\n        onLocatorResultsChanged(attempt + 1);\n        return;\n      }\n      locatorSearchPending = false;\n      announceLocator(describeLocatorResults(locator));\n    }, 800);\n  };\n\n  /* ------------------------------------------------------------------------------------------------------------\n   * Third-party forms\n   * ---------------------------------------------------------------------------------------------------------- */\n  // Embedded form iframes (Replo / page content) have no title, so screen readers announce only \"frame\".\n  const iframeTitles = [\n    [/forms\\.monday\\.com/i, \"Wholesale application form\"],\n    [/socialsnowball\\.io/i, \"Affiliate registration form\"]\n  ];\n\n  const titleFormIframes = () => {\n    document.querySelectorAll(\"iframe:not([title])\").forEach((frame) => {\n      const match = iframeTitles.find(([pattern]) => pattern.test(frame.src || \"\"));\n      if (match) frame.setAttribute(\"title\", match[1]);\n    });\n\n    // Hulk Form Builder titles its iframe with the form's internal name (\"Lead Generation\"); name it after the\n    // page instead, e.g. \"Wholesale Application form\".\n    const pageTitle = document.querySelector(\"main h1\")?.textContent.replace(/\\s+/g, \" \").trim();\n    if (!pageTitle) return;\n    document.querySelectorAll(\"iframe[src*='formbuilder.hulkapps.com']\").forEach((frame) => {\n      const title = `${pageTitle} form`;\n      if (frame.getAttribute(\"title\") !== title) frame.setAttribute(\"title\", title);\n    });\n  };\n\n  // The account app marks required fields with \"*\" in the visible label only.\n  const markStarredFieldsRequired = () => {\n    if (!/^\\/a\\/account\\//.test(window.location.pathname)) return;\n    document.querySelectorAll(\"main input:not([type='hidden']), main textarea, main select\").forEach((field) => {\n      if (field.required || field.getAttribute(\"aria-required\") === \"true\") return;\n      const labelledBy = field.getAttribute(\"aria-labelledby\");\n      const label =\n        field.labels?.[0]?.textContent ||\n        (labelledBy && labelledBy.split(\" \").map((id) => document.getElementById(id)?.textContent || \"\").join(\" \")) ||\n        \"\";\n      if (label.trim().endsWith(\"*\")) field.setAttribute(\"aria-required\", \"true\");\n    });\n  };\n\n  // Store locator fields only had placeholders / a first option as their visible label.\n  const addStoreLocatorLabels = () => {\n    document.querySelectorAll(\".store-locator-container\").forEach((locator) => {\n      [\n        [\"input.location-search-input\", \"Address or ZIP code\"],\n        [\"select.range-filter-select\", \"Search radius\"],\n        [\"select.tag-filter-select\", \"Category\"]\n      ].forEach(([selector, text]) => {\n        const field = locator.querySelector(selector);\n        if (!field || !field.id || locator.querySelector(`label[for=\"${field.id}\"]`)) return;\n        const label = document.createElement(\"label\");\n        label.htmlFor = field.id;\n        label.className = \"theme-locator-label text-sm\";\n        label.textContent = text;\n        field.before(label);\n        // The visible label now names the field; drop the earlier screen-reader-only name.\n        field.removeAttribute(\"aria-label\");\n      });\n    });\n  };\n\n  // Membership app (Inveterate, /community/membership): its sign-in, sign-up and store-credit fields have no label.\n  const inveterateFieldNames = [\n    [/first[-_]?name/i, \"First name\"],\n    [/last[-_]?name/i, \"Last name\"],\n    [/password/i, \"Password\"],\n    [/email/i, \"Email\"],\n    [/redeem|redemption|amount/i, \"Store credit amount to redeem\"],\n    [/variant-option/i, \"Product option\"]\n  ];\n\n  const labelInveterateFields = () => {\n    document\n      .querySelectorAll(\"[class*='inveterate'] :is(input:not([type='hidden']), select, textarea), :is(input, select)[id^='inveterate']\")\n      .forEach((field) => {\n        if (field.labels?.length || field.getAttribute(\"aria-label\") || field.getAttribute(\"aria-labelledby\")) return;\n        const key = `${field.id} ${field.name} ${Array.from(field.attributes).map((attribute) => attribute.name).join(\" \")}`;\n        const match = inveterateFieldNames.find(([pattern]) => pattern.test(key));\n        const name = match?.[1] || field.placeholder;\n        if (name) field.setAttribute(\"aria-label\", name);\n      });\n  };\n\n  // Membership FAQ: each question is a button that also contains its answer, so the button was named question and\n  // answer together (even while collapsed) and said nothing about being open or closed. Name it by the question,\n  // keep aria-expanded in step with the app's toggled class, and give screen readers the answer as a separate block\n  // right after the button, present only while it is open (the button's contents are read as one name).\n  const syncInveterateFaq = (button) => {\n    const open = button.classList.contains(\"inveterate__toggled\");\n    if (button.getAttribute(\"aria-expanded\") !== String(open)) button.setAttribute(\"aria-expanded\", String(open));\n    const copy = document.getElementById(button.getAttribute(\"aria-controls\") || \"\");\n    if (copy && copy.hidden === open) copy.hidden = !open;\n  };\n\n  const repairInveterateFaqs = () => {\n    document.querySelectorAll(\".inveterate__faq__item\").forEach((button, index) => {\n      const question = button.querySelector(\".inveterate__faq__question\");\n      const answer = button.querySelector(\".inveterate__faq__answer--inner, .inveterate__faq__answer\");\n      if (!question || !answer) return;\n\n      question.id ||= `theme-faq-question-${index + 1}`;\n      if (button.getAttribute(\"aria-labelledby\") !== question.id) button.setAttribute(\"aria-labelledby\", question.id);\n      // title=\"Question\" was read as the button's description.\n      if (button.hasAttribute(\"title\")) button.removeAttribute(\"title\");\n\n      let copy = button.nextElementSibling;\n      if (!copy?.matches(\".theme-faq-answer\")) {\n        copy = document.createElement(\"div\");\n        copy.className = \"theme-faq-answer sr-only\";\n        copy.id = `theme-faq-answer-${index + 1}`;\n        button.after(copy);\n      }\n      const answerText = answer.textContent.replace(/\\s+/g, \" \").trim();\n      if (copy.textContent !== answerText) copy.textContent = answerText;\n      if (button.getAttribute(\"aria-controls\") !== copy.id) button.setAttribute(\"aria-controls\", copy.id);\n      syncInveterateFaq(button);\n    });\n  };\n\n  // The app toggles a class on the button, which the childList observer below doesn't see.\n  document.addEventListener(\"click\", (event) => {\n    const button = event.target.closest?.(\".inveterate__faq__item\");\n    if (button) window.setTimeout(() => syncInveterateFaq(button), 50);\n  });\n\n  const repairThirdPartyForms = () => {\n    titleFormIframes();\n    markStarredFieldsRequired();\n    addStoreLocatorLabels();\n    labelInveterateFields();\n    repairInveterateFaqs();\n  };\n\n  repairThirdPartyForms();\n  new MutationObserver(repairThirdPartyForms).observe(document.body || document.documentElement, {\n    childList: true,\n    subtree: true\n  });\n\n  repairStoreLocator();\n  new MutationObserver((mutations) => {\n    repairStoreLocator();\n    if (mutations.some((mutation) => mutation.target.closest?.(\".locations-list\"))) {\n      onLocatorResultsChanged();\n    }\n  }).observe(document.body || document.documentElement, {\n    childList: true,\n    subtree: true\n  });\n\n  // Product grids and sliders aren't lists, so screen readers can't say how many products there are. Where a\n  // container holds only product cards, make it a list and the cards its items (a card elsewhere, e.g. in the\n  // mega menu promo, stays a named group).\n  const markProductLists = () => {\n    const containers = new Set(\n      Array.from(document.querySelectorAll(\"product-card\")).map((card) => card.parentElement)\n    );\n    containers.forEach((container) => {\n      if (!container) return;\n      const children = Array.from(container.children);\n      const onlyCards = children.length > 1 && children.every((child) => child.localName === \"product-card\");\n      if (!onlyCards) return;\n      if (container.getAttribute(\"role\") !== \"list\") container.setAttribute(\"role\", \"list\");\n      children.forEach((card) => {\n        if (card.getAttribute(\"role\") !== \"listitem\") card.setAttribute(\"role\", \"listitem\");\n      });\n    });\n  };\n\n  // Junip's vote buttons all say \"Up vote review action - 0\" / \"Down vote review action - 0\". Name them after\n  // the review's author and keep the vote count: \"Mark Kimberly B's review as helpful (0 votes)\".\n  const nameReviewVotes = () => {\n    document.querySelectorAll(\".junip-vote-action[aria-label]\").forEach((vote) => {\n      const junipLabel = vote.getAttribute(\"aria-label\");\n      const match = junipLabel.match(/^(up|down) vote review action\\s*-\\s*(\\d+)/i);\n      if (!match) return; // already named\n      let review = vote.parentElement;\n      while (review && !review.querySelector(\".junip-customer-name\")) review = review.parentElement;\n      const author = review?.querySelector(\".junip-customer-name\")?.textContent.replace(/\\s+/g, \" \").trim();\n      const count = Number(match[2]);\n      const votes = `${count} ${count === 1 ? \"vote\" : \"votes\"}`;\n      const whose = author ? `${author}'s review` : \"this review\";\n      vote.setAttribute(\n        \"aria-label\",\n        match[1].toLowerCase() === \"up\" ? `Mark ${whose} as helpful (${votes})` : `Mark ${whose} as not helpful (${votes})`\n      );\n    });\n  };\n\n  // Carousel arrows only say \"Previous\" / \"Next\", four pairs on the home page alone. Add the section they scroll:\n  // \"Show next products in Bestsellers\".\n  const nameCarouselArrows = () => {\n    document.querySelectorAll(\"button[is='prev-button'], button[is='next-button']\").forEach((button) => {\n      const section = button.closest(\".shopify-section\");\n      const heading = section?.querySelector(\"h1, h2, h3, [role='heading']\");\n      const title = heading?.textContent.replace(/\\s+/g, \" \").trim();\n      const target = document.getElementById(button.getAttribute(\"aria-controls\"));\n      const direction = button.getAttribute(\"is\") === \"prev-button\" ? \"previous\" : \"next\";\n      let label = \"\";\n      if (target?.localName === \"press-carousel\") {\n        // The press section holds customer quotes and has no heading.\n        label = `Show ${direction} testimonial`;\n      } else if (title) {\n        label = `Show ${direction} ${target?.querySelector(\"product-card\") ? \"products\" : \"slides\"} in ${title}`;\n      }\n      if (!label) return;\n      if (button.getAttribute(\"aria-label\") !== label) button.setAttribute(\"aria-label\", label);\n    });\n  };\n\n  nameReviewVotes();\n  nameCarouselArrows();\n  let namingTimer;\n  const scheduleNaming = () => {\n    window.clearTimeout(namingTimer);\n    namingTimer = window.setTimeout(() => {\n      nameReviewVotes();\n      nameCarouselArrows();\n    }, 100);\n  };\n  // Junip rewrites the vote label when the count changes, so aria-label changes are watched too.\n  new MutationObserver(scheduleNaming).observe(document.body || document.documentElement, {\n    childList: true,\n    subtree: true,\n    attributes: true,\n    attributeFilter: [\"aria-label\"]\n  });\n\n  markProductLists();\n  let productListTimer;\n  new MutationObserver(() => {\n    window.clearTimeout(productListTimer);\n    productListTimer = window.setTimeout(markProductLists, 100);\n  }).observe(document.body || document.documentElement, {\n    childList: true,\n    subtree: true\n  });\n\n  repairReviewCards();\n  repairReviewControls();\n  new MutationObserver(() => {\n    repairReviewCards();\n    repairReviewControls();\n  }).observe(document.body || document.documentElement, {\n    childList: true,\n    subtree: true\n  });\n})();\n"],
  "mappings": "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",
  "names": []
}
