{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/s-vehicle-picker.js?picker_revision=20261012"],
  "sourcesContent": ["// <s-vehicle-picker>: Year \u2192 Make \u2192 Model for the homepage Find Your Sound form.\n// Each field is an editable combobox (ARIA 1.2 combobox + listbox pattern) built on the plain text inputs the\n// template renders, so the form still works without this script. Years run from the current year down to\n// data-min-year. For data-api-min-year and later, makes and models load from NHTSA vPIC only once the shopper\n// focuses the year/make field or chooses a year. Earlier years, missing vehicles and API failures all fall back\n// to free typing. Inputs keep the names year / make / model, so the contact page prefill reads them unchanged.\n// Nothing here claims fitment; the choices are only passed along to the contact form.\n\nconst API = 'https://vpic.nhtsa.dot.gov/api/vehicles/';\nconst MAKE_TYPES = ['car', 'mpv', 'truck'];\nconst TIMEOUT_MS = 10000;\nconst YEAR_CHECK_CONCURRENCY = 8;\nconst STORE_KEY = 'soundwaves:guide-vehicle';\nconst SPEAKER_FIT_DATA_URL = new URL('speaker-fit-data.json', import.meta.url).href;\nconst RADIO_FIT_DATA_URL = new URL('radio-fit-data.json', import.meta.url).href;\nconst normSpeakerVehicle = (value) => String(value || '').toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim().replace(/\\s+/g, ' ');\n\n// The Make list never goes beyond these 40 common U.S. makes. Each is matched case-insensitively to NHTSA's own\n// make record (its id is used for lookups) and listed for a year only when NHTSA has vehicles for that year.\n// Anything else, including makes NHTSA doesn't list (e.g. Scion), goes through \"Not listed? Enter it manually\".\nconst CURATED_MAKES = [\n  'Acura', 'Audi', 'BMW', 'Buick', 'Cadillac', 'Chevrolet', 'Chrysler', 'Dodge', 'Ford', 'Genesis',\n  'GMC', 'Honda', 'Hyundai', 'Infiniti', 'Jaguar', 'Jeep', 'Kia', 'Land Rover', 'Lexus', 'Lincoln',\n  'Mazda', 'Mercedes-Benz', 'Mercury', 'MINI', 'Mitsubishi', 'Nissan', 'Oldsmobile', 'Plymouth', 'Pontiac', 'Porsche',\n  'Ram', 'Rivian', 'Saturn', 'Scion', 'Subaru', 'Suzuki', 'Tesla', 'Toyota', 'Volkswagen', 'Volvo',\n];\n\nconst tidy = (text) => String(text || '').trim().replace(/\\s+/g, ' ');\nconst sortNames = (names) => [...new Set(names.filter(Boolean))].sort((a, b) => a.localeCompare(b, 'en', { numeric: true, sensitivity: 'base' }));\n\nasync function fetchJSON(path) {\n  const controller = new AbortController();\n  const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n  try {\n    const response = await fetch(API + path, { signal: controller.signal, headers: { Accept: 'application/json' } });\n    if (!response.ok) throw new Error(`vPIC ${response.status}`);\n    const data = await response.json();\n    if (!data || !Array.isArray(data.Results)) throw new Error('vPIC: unexpected response');\n    return data.Results;\n  } finally {\n    clearTimeout(timer);\n  }\n}\n\nasync function mapLimit(items, limit, task) {\n  const results = new Array(items.length);\n  let next = 0;\n  const worker = async () => {\n    while (next < items.length) {\n      const index = next++;\n      results[index] = await task(items[index]);\n    }\n  };\n  await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));\n  return results;\n}\n\n// Shared across instances and kept for the page's lifetime. A failed load is forgotten so the next attempt retries.\nlet makesPromise = null;\nconst yearMakesCache = new Map();\nconst modelsCache = new Map();\n\n// The curated makes NHTSA lists for passenger cars, MPVs and trucks: [{ label, id, name }] in curated order.\nfunction loadMakes() {\n  if (!makesPromise) {\n    makesPromise = Promise.allSettled(MAKE_TYPES.map((type) => fetchJSON(`GetMakesForVehicleType/${type}?format=json`)))\n      .then((results) => {\n        const ok = results.filter((result) => result.status === 'fulfilled');\n        if (!ok.length) throw new Error('vPIC makes unavailable');\n        const byName = new Map();\n        for (const result of ok) {\n          for (const row of result.value) {\n            const name = tidy(row.MakeName);\n            if (name && row.MakeId && !byName.has(name.toUpperCase())) byName.set(name.toUpperCase(), { id: row.MakeId, name });\n          }\n        }\n        return CURATED_MAKES.flatMap((label) => {\n          const record = byName.get(label.toUpperCase());\n          return record ? [{ label, ...record }] : [];\n        });\n      })\n      .catch((error) => {\n        makesPromise = null;\n        throw error;\n      });\n  }\n  return makesPromise;\n}\n\nfunction loadModels(make, year) {\n  const key = `${make.id}|${year}`;\n  if (!modelsCache.has(key)) {\n    const promise = fetchJSON(`GetModelsForMakeIdYear/makeId/${encodeURIComponent(make.id)}/modelyear/${year}?format=json`)\n      .then((rows) => sortNames(rows.map((row) => tidy(row.Model_Name))))\n      .catch((error) => {\n        modelsCache.delete(key);\n        throw error;\n      });\n    modelsCache.set(key, promise);\n  }\n  return modelsCache.get(key);\n}\n\n// Curated makes with vehicles for this model year: { year, labels, byLabel }. The per-make model lists this\n// fetches are cached, so picking a make afterwards is instant. A make whose check fails is kept (its model step\n// falls back to typing); if every check fails the whole load fails and the picker switches to manual entry.\nfunction loadYearMakes(year) {\n  if (!yearMakesCache.has(year)) {\n    const promise = loadMakes()\n      .then(async (makes) => {\n        const checks = await mapLimit(makes, YEAR_CHECK_CONCURRENCY, (make) =>\n          loadModels(make, year).then((models) => (models.length ? 'yes' : 'no'), () => 'error')\n        );\n        if (makes.length && checks.every((check) => check === 'error')) throw new Error('vPIC models unavailable');\n        const available = makes.filter((_, index) => checks[index] !== 'no');\n        return { year, labels: available.map((make) => make.label), byLabel: new Map(available.map((make) => [make.label, make])) };\n      })\n      .catch((error) => {\n        yearMakesCache.delete(year);\n        throw error;\n      });\n    yearMakesCache.set(year, promise);\n  }\n  return yearMakesCache.get(year);\n}\n\n// ---- One editable combobox ----\n\nclass Combo {\n  options = [];\n  open = false;\n  active = -1;\n  shown = [];\n\n  constructor(field, { onCommit, onOpen, announce, noMatch }) {\n    this.field = field;\n    this.input = field.querySelector('[data-vp-input]');\n    this.list = field.querySelector('[data-vp-list]');\n    this.toggle = field.querySelector('[data-vp-toggle]');\n    this.onCommit = onCommit;\n    this.onOpen = onOpen;\n    this.announce = announce;\n    this.noMatch = noMatch;\n  }\n\n  bind(signal) {\n    const { input, list, toggle, field } = this;\n    input.addEventListener('input', () => {\n      if (!this.listMode) return;\n      this.show(input.value);\n    }, { signal });\n    input.addEventListener('keydown', (event) => this.#onKey(event), { signal });\n    input.addEventListener('click', () => {\n      if (this.listMode && !this.open) this.show('');\n    }, { signal });\n    toggle.addEventListener('click', () => {\n      if (!this.listMode) return;\n      if (this.open) this.close();\n      else this.show('');\n      input.focus();\n    }, { signal });\n    // Keep focus in the input while a pointer picks an option.\n    list.addEventListener('mousedown', (event) => event.preventDefault(), { signal });\n    toggle.addEventListener('mousedown', (event) => event.preventDefault(), { signal });\n    list.addEventListener('click', (event) => {\n      const option = event.target instanceof Element ? event.target.closest('[role=\"option\"]:not([aria-disabled=\"true\"])') : null;\n      if (option) this.commit(this.shown[Number(option.dataset.index)]);\n    }, { signal });\n    field.addEventListener('focusout', (event) => {\n      if (field.contains(/** @type {Node} */ (event.relatedTarget))) return;\n      if (!this.listMode) return;\n      this.close();\n      this.commit(this.match(input.value), true);\n    }, { signal });\n  }\n\n  get listMode() {\n    return 'combo' in this.field.dataset;\n  }\n\n  setListMode(on) {\n    const { input, field, list } = this;\n    if (on === this.listMode) return;\n    if (on) {\n      field.dataset.combo = '';\n      input.setAttribute('role', 'combobox');\n      input.setAttribute('aria-autocomplete', 'list');\n      input.setAttribute('aria-expanded', 'false');\n      input.setAttribute('aria-controls', list.id);\n    } else {\n      this.close();\n      delete field.dataset.combo;\n      for (const name of ['role', 'aria-autocomplete', 'aria-expanded', 'aria-controls', 'aria-activedescendant']) input.removeAttribute(name);\n    }\n  }\n\n  setEnabled(on) {\n    this.input.disabled = !on;\n    this.toggle.disabled = !on;\n    if (!on) this.close();\n  }\n\n  setBusy(on) {\n    if (on) this.input.setAttribute('aria-busy', 'true');\n    else this.input.removeAttribute('aria-busy');\n  }\n\n  setOptions(options) {\n    this.options = options;\n    if (this.open) this.show(this.input.value);\n  }\n\n  // Case-insensitive exact match against the loaded options, or null.\n  match(text) {\n    const wanted = tidy(text).toLowerCase();\n    if (!wanted) return null;\n    return this.options.find((option) => option.toLowerCase() === wanted) || null;\n  }\n\n  show(query) {\n    this.onOpen?.();\n    const wanted = tidy(query).toLowerCase();\n    const starts = [];\n    const contains = [];\n    for (const option of this.options) {\n      const lower = option.toLowerCase();\n      if (!wanted || lower.startsWith(wanted)) starts.push(option);\n      else if (lower.includes(wanted)) contains.push(option);\n    }\n    this.shown = [...starts, ...contains];\n    const current = this.match(this.input.value);\n    this.list.replaceChildren(\n      ...(this.shown.length\n        ? this.shown.map((option, index) => {\n            const item = document.createElement('li');\n            item.id = `${this.list.id}-${index}`;\n            item.setAttribute('role', 'option');\n            item.dataset.index = String(index);\n            item.setAttribute('aria-selected', String(option === current));\n            item.className = 'flex min-h-11 cursor-pointer items-center px-3 text-sm text-on-surface hover:bg-surface-secondary aria-selected:font-semibold aria-selected:text-accent data-[active]:bg-accent data-[active]:text-surface';\n            item.textContent = option;\n            return item;\n          })\n        : this.options.length\n          ? [this.#message(this.noMatch)]\n          : [])\n    );\n    if (!this.list.children.length) {\n      this.close();\n      return;\n    }\n    this.open = true;\n    this.list.hidden = false;\n    this.input.setAttribute('aria-expanded', 'true');\n    // Highlight the current value, or the only match while typing.\n    const currentIndex = current ? this.shown.indexOf(current) : -1;\n    this.#setActive(currentIndex >= 0 ? currentIndex : wanted && this.shown.length === 1 ? 0 : -1);\n    this.announce(this.shown.length);\n  }\n\n  close() {\n    if (!this.open) return;\n    this.open = false;\n    this.list.hidden = true;\n    this.active = -1;\n    this.input.setAttribute('aria-expanded', 'false');\n    this.input.removeAttribute('aria-activedescendant');\n  }\n\n  commit(value, fromBlur = false) {\n    if (value) this.input.value = value;\n    this.close();\n    this.onCommit(value, fromBlur);\n  }\n\n  #message(text) {\n    const item = document.createElement('li');\n    item.setAttribute('role', 'option');\n    item.setAttribute('aria-disabled', 'true');\n    item.className = 'px-3 py-2 text-sm text-on-surface/70';\n    item.textContent = text;\n    return item;\n  }\n\n  #setActive(index) {\n    const items = this.list.querySelectorAll('[role=\"option\"]:not([aria-disabled=\"true\"])');\n    items.forEach((item) => delete item.dataset.active);\n    this.active = index;\n    const item = items[index];\n    if (!item) {\n      this.input.removeAttribute('aria-activedescendant');\n      return;\n    }\n    item.dataset.active = '';\n    this.input.setAttribute('aria-activedescendant', item.id);\n    item.scrollIntoView({ block: 'nearest' });\n  }\n\n  #onKey(event) {\n    if (!this.listMode || this.input.disabled) return;\n    const count = this.shown.length;\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        if (!this.open) this.show(event.altKey ? this.input.value : '');\n        else if (count) this.#setActive(this.active < count - 1 ? this.active + 1 : 0);\n        break;\n      case 'ArrowUp':\n        event.preventDefault();\n        if (!this.open) this.show('');\n        else if (count) this.#setActive(this.active > 0 ? this.active - 1 : count - 1);\n        break;\n      case 'PageDown':\n      case 'PageUp':\n        if (!this.open || !count) return;\n        event.preventDefault();\n        this.#setActive(Math.max(0, Math.min(count - 1, (this.active < 0 ? 0 : this.active) + (event.key === 'PageDown' ? 10 : -10))));\n        break;\n      case 'Enter':\n        if (!this.open) return;\n        event.preventDefault();\n        this.commit(this.active >= 0 ? this.shown[this.active] : this.match(this.input.value));\n        break;\n      case 'Escape':\n        if (!this.open) return;\n        event.preventDefault();\n        this.close();\n        break;\n      default:\n    }\n  }\n}\n\n// ---- Picker ----\n\nclass SVehiclePicker extends HTMLElement {\n  #controller = null;\n  #manual = false; // shopper chose \"Not listed? Enter it manually\"\n  #modelManual = false; // vPIC lists no models (or failed) for this make/year\n  #apiFailed = false;\n  #makes = null; // { year, labels, byLabel } for the year currently chosen\n  #status = '';\n  #token = 0;\n  #speakerFitData = null;\n  #radioFitData = null;\n\n  connectedCallback() {\n    this.#controller = new AbortController();\n    const { signal } = this.#controller;\n    const field = (key) => this.querySelector(`[data-vp-field=\"${key}\"]`);\n    const announce = (count) => this.#announceCount(count);\n    const noMatch = this.dataset.noMatch || '';\n    this.year = new Combo(field('year'), { onCommit: (value, blur) => this.#onYear(value, blur), onOpen: () => this.#warmMakes(), announce, noMatch });\n    this.make = new Combo(field('make'), { onCommit: (value, blur) => this.#onMake(value, blur), onOpen: () => this.#ensureMakes(), announce, noMatch });\n    this.model = new Combo(field('model'), { onCommit: () => this.#save(), announce, noMatch });\n    this.manualButton = this.querySelector('[data-vp-manual]');\n    this.statusEl = this.querySelector('[data-vp-status]');\n    this.countEl = this.querySelector('[data-vp-count]');\n    if (!this.year.input || !this.make.input || !this.model.input) return;\n\n    const max = new Date().getFullYear();\n    const min = Number(this.dataset.minYear) || 1940;\n    this.minYear = min;\n    this.maxYear = max;\n    this.apiMinYear = Number(this.dataset.apiMinYear) || 1996;\n    this.year.setOptions(Array.from({ length: max - min + 1 }, (_, index) => String(max - index)));\n\n    for (const combo of [this.year, this.make, this.model]) combo.bind(signal);\n    this.year.setListMode(true);\n    this.year.input.addEventListener('focus', () => this.#warmMakes(), { signal, once: true });\n    this.make.input.addEventListener('input', () => this.#onMakeTyped(), { signal });\n    this.model.input.addEventListener('input', () => this.#save(), { signal });\n    this.year.input.addEventListener('input', () => this.#onYearTyped(), { signal });\n    this.manualButton?.addEventListener('click', () => this.#onManualButton(), { signal });\n    this.closest('form')?.addEventListener('reset', () => requestAnimationFrame(() => this.#reset()), { signal });\n\n    this.#restore();\n    this.#loadSpeakerFitData();\n    this.#loadRadioFitData();\n    this.manualButton.hidden = false;\n    this.#render();\n  }\n\n  disconnectedCallback() {\n    this.#controller?.abort();\n  }\n\n  // ---- State ----\n\n  #yearValue() {\n    const year = Number(tidy(this.year.input.value));\n    return Number.isInteger(year) && year >= this.minYear && year <= this.maxYear ? year : null;\n  }\n\n  #isClassic() {\n    const year = this.#yearValue();\n    return year !== null && year < this.apiMinYear;\n  }\n\n  #manualMode() {\n    return this.#manual || this.#apiFailed || this.#isClassic();\n  }\n\n  #selectedMake() {\n    return this.#makesReady() ? this.make.match(this.make.input.value) : null;\n  }\n\n  // ---- Events ----\n\n  #onYearTyped() {\n    // Emptying the year in list mode resets the dependent fields (a half-typed year keeps them).\n    if (!tidy(this.year.input.value) && !this.#manualMode()) {\n      this.make.input.value = '';\n      this.model.input.value = '';\n    }\n    this.#render();\n    this.#save();\n  }\n\n  #onYear(value, fromBlur) {\n    if (!value && !fromBlur) return;\n    this.#apiFailed = false;\n    this.#modelManual = false;\n    this.#render();\n    this.#save();\n    const year = this.#yearValue();\n    if (year === null || this.#manualMode()) return;\n    this.#ensureMakes().then(() => {\n      if (this.#selectedMake()) this.#loadModels();\n    });\n    if (!fromBlur) requestAnimationFrame(() => this.make.input.focus());\n  }\n\n  #onMakeTyped() {\n    if (!this.#manualMode() && !this.#modelManual) this.model.input.value = '';\n    this.#modelManual = false;\n    this.model.setOptions([]);\n    this.#render();\n    this.#save();\n  }\n\n  #onMake(value, fromBlur = false) {\n    this.#save();\n    if (!value || this.#manualMode()) {\n      this.#render();\n      return;\n    }\n    this.#loadModels(!fromBlur);\n  }\n\n  #onManualButton() {\n    if (this.#apiFailed || this.#isClassic()) {\n      this.make.input.focus();\n      return;\n    }\n    this.#manual = !this.#manual;\n    this.#modelManual = false;\n    this.#render();\n    this.#save();\n    if (this.#manual) {\n      (this.#selectedMake() ? this.model.input : this.make.input).focus();\n      this.#setStatus(this.dataset.manualNote);\n    } else {\n      this.year.input.focus();\n      const year = this.#yearValue();\n      if (year !== null) this.#ensureMakes().then(() => this.#selectedMake() && this.#loadModels());\n    }\n  }\n\n  #reset() {\n    this.#manual = false;\n    this.#modelManual = false;\n    this.#apiFailed = false;\n    this.model.setOptions([]);\n    try {\n      sessionStorage.removeItem(STORE_KEY);\n    } catch {}\n    this.#render();\n  }\n\n  // ---- Loading ----\n\n  // Fetch NHTSA's make records in the background once the shopper shows interest; errors stay silent here.\n  #warmMakes() {\n    loadMakes().catch(() => {});\n  }\n\n  #makesReady() {\n    const year = this.#yearValue();\n    return Boolean(this.#makes) && year !== null && this.#makes.year === year;\n  }\n\n  // Load the curated makes that have vehicles for the chosen year (cached per year).\n  #ensureMakes() {\n    const year = this.#yearValue();\n    if (this.#makesReady()) return Promise.resolve(this.#makes);\n    if (year === null || this.#manualMode()) return Promise.resolve(null);\n    if (this.#makes && this.#makes.year !== year) {\n      this.#makes = null;\n      this.make.setOptions([]);\n    }\n    this.make.setBusy(true);\n    this.#setStatus(this.dataset.loadingMakes);\n    return loadYearMakes(year)\n      .then((makes) => {\n        if (this.#yearValue() !== year) return null;\n        this.#applyMakes(makes);\n        this.#setStatus('');\n        this.#render();\n        return makes;\n      })\n      .catch(() => {\n        if (this.#yearValue() === year) this.#fail();\n        return null;\n      })\n      .finally(() => this.make.setBusy(false));\n  }\n\n  #applyMakes(makes) {\n    this.#makes = makes;\n    this.make.setOptions(makes.labels);\n    const exact = this.make.match(this.make.input.value);\n    if (exact) {\n      this.make.input.value = exact;\n    } else if (this.make.input.value && !this.#modelManual) {\n      // The typed make has no vehicles listed for this year: its model can't carry over from the list.\n      this.model.input.value = '';\n      this.model.setOptions([]);\n    }\n  }\n\n  #loadModels(focusModel = false) {\n    const year = this.#yearValue();\n    const label = this.#selectedMake();\n    if (year === null || !label || this.#manualMode()) return;\n    const make = this.#makes.byLabel.get(label);\n    if (!make) return;\n    const token = ++this.#token;\n    this.model.setBusy(true);\n    this.#setStatus(this.dataset.loadingModels);\n    loadModels(make, year)\n      .then((models) => {\n        if (token !== this.#token) return;\n        this.model.setOptions(models);\n        if (!models.length) {\n          this.#modelManual = true;\n          this.#setStatus((this.dataset.noModels || '').replace('%year', String(year)).replace('%make', label));\n        } else {\n          this.#modelManual = false;\n          const exact = this.model.match(this.model.input.value);\n          // A model typed for another make/year doesn't carry over.\n          this.model.input.value = exact || '';\n          this.#setStatus('');\n        }\n        this.#render();\n        this.#save();\n        if (focusModel && document.activeElement === this.make.input) this.model.input.focus();\n      })\n      .catch(() => {\n        if (token !== this.#token) return;\n        this.#modelManual = true;\n        this.#setStatus(this.dataset.error);\n        this.#render();\n      })\n      .finally(() => {\n        if (token === this.#token) this.model.setBusy(false);\n      });\n  }\n\n  #fail() {\n    this.#apiFailed = true;\n    this.#render();\n    this.#setStatus(this.dataset.error);\n  }\n\n  // ---- View ----\n\n  #render() {\n    const year = this.#yearValue();\n    const manual = this.#manualMode();\n    const make = this.#selectedMake();\n\n    this.make.setListMode(!manual);\n    this.model.setListMode(!manual && !this.#modelManual);\n    // Never disable a field that holds a value: disabled inputs are left out of the contact hand-off.\n    this.make.setEnabled(manual || year !== null || Boolean(this.make.input.value));\n    this.model.setEnabled(manual || this.#modelManual || (year !== null && Boolean(make)) || Boolean(this.model.input.value));\n\n    if (this.manualButton) {\n      const toList = this.#manual && !this.#apiFailed && !this.#isClassic();\n      this.manualButton.textContent = toList ? this.dataset.listLabel : this.dataset.manualLabel;\n    }\n\n    // Persistent guidance; loading/error/no-model messages set elsewhere take over until the next render.\n    if (this.#isClassic()) this.#setStatus(this.dataset.classicNote);\n    else if (this.#apiFailed) this.#setStatus(this.dataset.error);\n    else if (this.#modelManual) return;\n    else if (this.#manual) this.#setStatus(this.dataset.manualNote);\n    else if (year === null) this.#setStatus(this.dataset.pickYear);\n    else if (this.#makesReady() && !make) this.#setStatus(this.dataset.pickMake);\n    else if (this.#makesReady()) this.#setStatus('');\n  }\n\n  #setStatus(text) {\n    const next = text || '';\n    if (next === this.#status) return;\n    this.#status = next;\n    if (this.statusEl) this.statusEl.textContent = next;\n  }\n\n  #announceCount(count) {\n    if (!this.countEl) return;\n    const text = count === 1 ? this.dataset.countOne : (this.dataset.countOther || '').replace('%n', String(count));\n    clearTimeout(this.countTimer);\n    this.countTimer = setTimeout(() => {\n      this.countEl.textContent = text || '';\n    }, 400);\n  }\n\n  #loadSpeakerFitData() {\n    if (!SPEAKER_FIT_DATA_URL) return;\n    fetch(SPEAKER_FIT_DATA_URL, { credentials: 'same-origin', headers: { Accept: 'application/json' } })\n      .then((response) => { if (!response.ok) throw new Error('Speaker chart unavailable'); return response.json(); })\n      .then((data) => { this.#speakerFitData = data; this.#emitSpeakerFitment(); })\n      .catch(() => { this.#speakerFitData = null; });\n  }\n\n  #loadRadioFitData() {\n    fetch(RADIO_FIT_DATA_URL, { credentials: 'same-origin', headers: { Accept: 'application/json' } })\n      .then((response) => { if (!response.ok) throw new Error('Radio chart unavailable'); return response.json(); })\n      .then((data) => { this.#radioFitData = data; this.#emitSpeakerFitment(); })\n      .catch(() => { this.#radioFitData = null; this.#emitSpeakerFitment(); });\n  }\n\n  #radioResolution() {\n    const data = this.#radioFitData;\n    const selection = { year: this.#yearValue(), make: this.#selectedMake() || tidy(this.make.input.value), model: this.model.match(this.model.input.value) || tidy(this.model.input.value) };\n    if (this.#manual || !selection.year || !selection.make || !selection.model) return { status: 'incomplete', kits: [] };\n    if (!data?.r) return { status: 'unavailable', kits: [] };\n    const key = (value) => String(value || '').toLowerCase().replace(/[^a-z0-9]/g, '');\n    const wanted = key(selection.model);\n    const rows = data.r.filter((row) => {\n      if (key(row[0]) !== key(selection.make) || selection.year < Number(row[3]) || selection.year > Number(row[4])) return false;\n      return (row[2] || []).some((alias) => {\n        const candidate = key(alias);\n        return wanted === candidate || wanted.startsWith(candidate) || candidate.startsWith(wanted);\n      });\n    });\n    if (!rows.length) return { status: 'unlisted', kits: [] };\n    const usable = (value) => Boolean(value && !['N/A', 'N/R', '-', 'X'].includes(String(value).trim().toUpperCase()));\n    const statuses = rows.map((row) => usable(row[5]));\n    const kits = [...new Set(rows.filter((row) => usable(row[5])).map((row) => row[5]))];\n    if (statuses.every(Boolean)) return { status: 'confirmed', kits };\n    if (statuses.every((value) => !value)) return { status: 'no-kit', kits: [] };\n    return { status: 'confirm', kits };\n  }\n\n  #speakerFitment() {\n    const data = this.#speakerFitData;\n    const year = this.#yearValue();\n    const make = this.#selectedMake() || tidy(this.make.input.value);\n    const model = this.model.match(this.model.input.value) || tidy(this.model.input.value);\n    if (!data?.records || !year || !make || !model) return null;\n    const aliases = (value) => { const key = normSpeakerVehicle(value); return key === 'chevy' ? 'chevrolet' : key === 'vw' ? 'volkswagen' : key; };\n    const makeId = new Map(data.make.map((value, index) => [aliases(value), index])).get(aliases(make));\n    const modelId = new Map(data.model.map((value, index) => [normSpeakerVehicle(value), index])).get(normSpeakerVehicle(model));\n    if (makeId == null || modelId == null) return null;\n    const front = new Map(), rear = new Map();\n    const add = (target, rows) => { for (const row of rows || []) {\n      const location = data.location[row[0]], size = data.size[row[1]], adapter = data.adapter[row[2]] || '';\n      if (!location || !size) continue;\n      const entry = { location, size, adapter }; target.set(`${location}|${size}|${adapter}`, entry);\n    } };\n    for (const row of data.records) {\n      if (row[0] !== makeId || row[1] !== modelId || year < row[3] || year > row[4]) continue;\n      add(front, row[5]); add(rear, row[6]);\n    }\n    return front.size || rear.size ? { front: [...front.values()], rear: [...rear.values()] } : null;\n  }\n\n  #emitSpeakerFitment() {\n    const selection = { year: this.year.input.value, make: this.make.input.value, model: this.model.input.value };\n    const complete = /^(19|20)\\d{2}$/.test(selection.year) && Boolean(selection.make && selection.model);\n    this.dispatchEvent(new CustomEvent('speaker-fitment-change', { bubbles: true, detail: { selection, complete, manual: this.#manual, fitment: this.#speakerFitment(), radioFitment: this.#radioResolution() } }));\n  }\n\n  // ---- Persistence: keep the chosen vehicle for this browser session (e.g. after visiting the contact page). ----\n\n  #save() {\n    try {\n      sessionStorage.setItem(\n        STORE_KEY,\n        JSON.stringify({ year: this.year.input.value, make: this.make.input.value, model: this.model.input.value, manual: this.#manual })\n      );\n    } catch {}\n    // Lets the Find your sound guide refresh vehicle-matched results (Stealth Boxes).\n    this.dispatchEvent(new CustomEvent('vehicle-change', { bubbles: true }));\n    this.#emitSpeakerFitment();\n  }\n\n  #restore() {\n    let saved = null;\n    try {\n      saved = JSON.parse(sessionStorage.getItem(STORE_KEY) || 'null');\n    } catch {}\n    // Back/forward cache restores the inputs themselves; only fill from storage when they're empty.\n    const empty = !this.year.input.value && !this.make.input.value && !this.model.input.value;\n    if (saved && empty) {\n      this.year.input.value = tidy(saved.year).slice(0, 4);\n      this.make.input.value = tidy(saved.make).slice(0, 60);\n      this.model.input.value = tidy(saved.model).slice(0, 60);\n    }\n    if (saved) this.#manual = Boolean(saved.manual);\n    // A restored vehicle with a modern year but no list yet: free text until the shopper reopens the list.\n    const year = this.#yearValue();\n    if (year !== null && !this.#manualMode() && (this.make.input.value || this.model.input.value)) {\n      this.#ensureMakes().then(() => this.#selectedMake() && this.#loadModels());\n    }\n  }\n}\n\nif (!customElements.get('s-vehicle-picker')) customElements.define('s-vehicle-picker', SVehiclePicker);\n\n"],
  "mappings": "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",
  "names": ["item"]
}
