{
  "version": 3,
  "sources": ["/cdn/shop/t/18/assets/aura-chat.js?cb=5741"],
  "sourcesContent": ["/*\n * aura-chat.js: Ask Aura (spec 14) on the AuraChat backend, with the wrap calculator (spec 10) as an\n * app inside the chat. Loaded on every page when Ask Aura is on; <aura-chat> is in layout/theme.liquid.\n *\n * Same brain as today's widget (AuraShopify assets/aichat.js): the marketing id (localStorage mkt, else\n * amkt), the stored transcript (/api/session), streamed answers (/api/chat), the greeting and starter\n * questions, the DIY or shop chips (/api/audience), lead capture, proactive messages (/api/proactive,\n * /api/cart-nudge) and card-click tracking. What changed:\n *   - The conversation starts over after 24 hours without chat: the session id is the marketing id plus\n *     when the conversation began (localStorage aura.chat.session), not the marketing id alone.\n *   - Color Explorer cards are dropped: the explorer is on every page already. Text links to it open the\n *     color's try-on instead (the Your car tab of its product page; on that page, the try-on in place).\n *     A proactive message that names or links the explorer (\"Try our Color Explorer!\") is dropped whole,\n *     from the transcript and the bar. Until the shopper asks something,\n *     the chat opens with the greeting and example questions, even with proactive messages in the transcript.\n *   - A free swatch chip answer shows two cards: the chips and the material sample for the line asked\n *     about (Vinyl, Hyper PPF or Clear PPF), with a fixed line on what each is for. The other samples,\n *     swatch books and colors the backend adds are dropped.\n *   - Links to auravinyl.com stay on this storefront (preview themes, dev).\n *   - Closed, the bar asks the question this shopper is likeliest to ask on this page (\"How much Piggy Pink\n *     for my Model 3?\"), from the page and what we know (car, colors viewed, cart, a recent order, shop\n *     account), and a click opens the chat with it waiting in the input: Send asks it, a tap in the input\n *     clears it for typing. Each question shows until it is asked. A tip in the bar's line reacts\n *     to what the shopper does (a length picked, filters, an empty search, the explorer closed, a roll\n *     added). One tip per page view, at most four per session, never with sound; \"Show tips\" in the panel\n *     turns them off. Where the bar is folded into the chat button (phones), the question slides out of it\n *     for a few seconds on every other page (the peek).\n *   - \"How much do I need?\" (the buy box, a chip, a typed question, /pages/calculator) runs the calculator\n *     here: car first, then the length from the product's live rolls (sections/aura-calc-variants), with\n *     Add and Free chip buttons that act on the cart through window.aura.\n * Desktop: a 420px panel beside the page (non-modal), left on product pages like the bar. Under 768px a\n * full-screen modal sheet. Calculator and local messages are kept in sessionStorage and placed back\n * between the stored transcript's messages, so the conversation reads the same on every page.\n */\n(() => {\n  const aura = window.aura;\n  if (!aura) return;\n  const cfg = aura.config || {};\n  const routes = cfg.routes || {};\n  const root = (routes.root || '/').replace(/\\/$/, '');\n  const track = (name, props) => aura.track(name, props);\n\n  const ls = {\n    get: (k) => { try { return localStorage.getItem(k); } catch (e) { return null; } },\n    set: (k, v) => { try { localStorage.setItem(k, v); } catch (e) { /* private mode */ } },\n    del: (k) => { try { localStorage.removeItem(k); } catch (e) { /* private mode */ } }\n  };\n  const ss = {\n    get: (k) => { try { return sessionStorage.getItem(k); } catch (e) { return null; } },\n    set: (k, v) => { try { sessionStorage.setItem(k, v); } catch (e) { /* private mode */ } },\n    del: (k) => { try { sessionStorage.removeItem(k); } catch (e) { /* private mode */ } }\n  };\n  const json = (raw, fallback) => { try { return raw ? JSON.parse(raw) : fallback; } catch (e) { return fallback; } };\n  const esc = (s) => String(s == null ? '' : s).replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\n  const fill = (str, vars = {}) => String(str || '').replace(/\\[(\\w+)\\]/g, (m, k) => (vars[k] != null ? vars[k] : m));\n  /* Liquid's t filter HTML-escapes translations (\"I&#39;m\"); strings are decoded once and escaped where they are used */\n  const decoder = document.createElement('textarea');\n  const decode = (v) => {\n    if (typeof v === 'string') { decoder.innerHTML = v; return decoder.value; }\n    if (Array.isArray(v)) return v.map(decode);\n    if (v && typeof v === 'object') return Object.fromEntries(Object.entries(v).map(([k, x]) => [k, decode(x)]));\n    return v;\n  };\n  const reduceMotion = () => window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  const EASE = 'cubic-bezier(0.16, 1, 0.3, 1)';\n\n  /* ---------- identity, shared with the marketing (Meerkat) pipeline and today's widget ---------- */\n  function uuid() {\n    if (crypto.randomUUID) return crypto.randomUUID();\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n      const r = (Math.random() * 16) | 0;\n      return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);\n    });\n  }\n  function marketingId() {\n    let id = ls.get('mkt') || ls.get('amkt');\n    if (!id) { id = uuid(); ls.set('amkt', id); }\n    return id;\n  }\n  /* The conversation starts over after a day without chat. The AuraChat session is the marketing id plus\n     when the conversation began, so the old transcript (and the model's memory of it) stays behind. Fixed\n     for the page view, so a tab left open doesn't switch conversations under the shopper. */\n  const CHAT_IDLE_MS = 24 * 60 * 60 * 1000;\n  let chatSession = null;\n  function sessionId() {\n    if (chatSession) return chatSession;\n    const saved = json(ls.get('aura.chat.session'), null);\n    if (saved && saved.id && Date.now() - saved.at < CHAT_IDLE_MS) {\n      chatSession = saved.id;\n    } else {\n      chatSession = `${marketingId()}.${Date.now().toString(36)}`;\n      ls.set('aura.chat.session', JSON.stringify({ id: chatSession, at: Date.now() }));\n      // A nudge left unanswered in the old conversation no longer blocks new ones\n      ls.del('aura_proactive_pending');\n    }\n    return chatSession;\n  }\n  /* Chat activity keeps the conversation for another day */\n  const touchChat = () => ls.set('aura.chat.session', JSON.stringify({ id: sessionId(), at: Date.now() }));\n  const meerkat = () => ({ mkt: ls.get('mkt'), phone: !!ls.get('mkt_phone'), hidden: !!ls.get('mkt_hidden') });\n  const garage = () => { const car = json(ls.get('aura.garage.v1'), null); return car && car.body ? car : null; };\n  const viewed = () => json(ls.get('aura_viewed'), []);\n  /* aura_viewed holds handles (today's widget reads it); the bar's questions need the colors' names */\n  const viewedNames = () => json(ls.get('aura.viewed.names'), {});\n\n  /* Today's widget limits backend nudges to one a day, and none while one waits for a reply */\n  const dayKey = () => { const d = new Date(); return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`; };\n  const canNudgeToday = () => ls.get('aura_nudge_day') !== dayKey();\n  const markNudgeToday = () => ls.set('aura_nudge_day', dayKey());\n  const pendingReply = () => ls.get('aura_proactive_pending') === '1';\n  const setPending = (on) => { if (on) ls.set('aura_proactive_pending', '1'); else { ls.del('aura_proactive_pending'); ls.del('aura_nudge_day'); } };\n\n  /* ---------- text ---------- */\n  const SIZING = /\\b(how (much|many)|what (size|length)|which (size|length|roll)|enough)\\b[^?.!]*\\b(need|needed|roll|rolls|feet|ft|vinyl|film|ppf|material|cover|wrap)\\b/i;\n  const SIZING_FT = /\\b\\d{2} ?(ft|feet|foot)\\b[^?.!]*\\benough\\b/i;\n  const NOT_SIZING = /\\b(cost|price|pay|cheap|expensive|discount|deal|ship|shipping|deliver|order)\\b|\\$|\\b(hood|roof|trunk|mirrors?|bumpers?|fenders?|doors?|pillars?|spoiler|chrome delete|panels?|stripes?|accents?)\\b/i;\n  const isSizing = (t) => (SIZING.test(t) || SIZING_FT.test(t)) && !NOT_SIZING.test(t);\n\n  /* Cards are the options, so a reply that carries cards drops its questions (as the backend does) */\n  function stripQuestions(text) {\n    const parts = String(text || '').trim().match(/[^.!?\\n]+[.!?]?/g) || [];\n    const kept = parts.map((s) => s.trim()).filter((s) => s && !/\\?$/.test(s));\n    return kept.length ? kept.join(' ').replace(/\\s+/g, ' ').trim() : '';\n  }\n  const stripLinks = (text) => String(text || '')\n    .replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, '$1').replace(/https?:\\/\\/\\S+/g, '')\n    .replace(/\\*\\*(.+?)\\*\\*/g, '$1').replace(/\\s{2,}/g, ' ').replace(/\\s+([.,;:!?])/g, '$1').trim();\n\n  const explorerHost = (() => { try { return new URL(cfg.explorer_url).host; } catch (e) { return 'explore.auravinyl.com'; } })();\n  const isExplorer = (url) => { try { return new URL(url, location.href).host === explorerHost; } catch (e) { return false; } };\n  const explorerCard = (c) => !!(c && c.type === 'promo' && c.url && isExplorer(c.url));\n  const mentionsExplorer = (text) => {\n    const t = String(text || '');\n    return /\\bcolou?r explorer\\b/i.test(t) || (t.match(/https?:\\/\\/[^\\s<>()\\]]+/g) || []).some(isExplorer);\n  };\n  /* A proactive message that pitches the explorer: it names or links the Color Explorer (the backend adds the\n     link and an explorer card to any message that mentions it). The chat doesn't suggest the explorer any more */\n  const explorerPitch = (m) => !!(m && m.proactive && ((m.cards || []).some(explorerCard) || mentionsExplorer(m.content || m.message)));\n  const isSwatchCard = (c) => !!(c && c.type === 'promo' && c.url && /\\/pages\\/swatch-chip-request\\b/.test(c.url));\n  const STORE_HOSTS = /^(www\\.)?auravinyl\\.com$/i;\n\n  /* \"Diamond Nebula Green Blue\" to \"diamond-nebula-green-blue\", as the backend makes a color's handle */\n  const permaOf = (s) => String(s || '').replace(/\\|/g, '-').replace(/ /g, '-').toLowerCase().trim();\n  /* The explorer itself (its home, or a color at /a/<list>/<color>), not other pages on its host (/playlist) */\n  const isExplorerPage = (u) => u.host === explorerHost && (u.pathname === '/' || /^\\/a\\//.test(u.pathname));\n  const explorerPage = (url) => { try { return isExplorerPage(new URL(String(url).replace(/\\s+/g, ''), location.href)); } catch (e) { return false; } };\n  /* An explorer link goes to the color's try-on instead, the Your car tab of its product page: the link's color,\n     else this page's, else the last one viewed, else all colors */\n  function tryonHref(u) {\n    const m = u.pathname.match(/^\\/a\\/[^/]+\\/([^/]+)/);\n    let handle = m ? decodeURIComponent(m[1]) : null;\n    const p = cfg.product && cfg.product.kind === 'color' ? cfg.product : null;\n    // The backend makes the link's color from the product title, which can differ from the handle\n    if (p && (!handle || handle === permaOf(p.title) || handle === permaOf(p.name))) handle = p.handle;\n    handle = handle || viewed().slice(-1)[0];\n    return handle ? `${root}/products/${encodeURIComponent(handle)}?tab=your_car` : routes.all_products || `${root}/collections/all`;\n  }\n\n  /* auravinyl.com links stay on this storefront; explorer links open the color's try-on; other links on the\n     explorer's host carry the marketing id like today */\n  function localHref(url) {\n    let u;\n    try { u = new URL(String(url).replace(/\\s+/g, ''), location.href); } catch (e) { return '#'; }\n    if (!/^https?:$/.test(u.protocol)) return /^(mailto|sms|tel):/.test(u.protocol) ? u.href : '#';\n    if (STORE_HOSTS.test(u.hostname) && u.hostname !== location.hostname) return `${root}${u.pathname}${u.search}${u.hash}`;\n    if (isExplorerPage(u)) return tryonHref(u);\n    if (u.host === explorerHost) {\n      const id = ls.get('mkt') || ls.get('amkt');\n      if (id && !u.searchParams.has('mkt')) u.searchParams.set('mkt', id);\n    }\n    return u.href;\n  }\n  const external = (href) => { try { const u = new URL(href, location.href); return u.host !== location.host && u.host !== explorerHost; } catch (e) { return false; } };\n  let tryonLabel = '';\n  const linkTag = (url, label) => {\n    const href = localHref(url);\n    // A bare explorer link, or the backend's \"Try the Color Explorer\", says where it goes now\n    if (tryonLabel && explorerPage(url) && (/^try\\b/i.test(label) || label.includes(explorerHost))) label = tryonLabel;\n    return `<a href=\"${esc(href)}\"${external(href) ? ' target=\"_blank\" rel=\"noopener\"' : ''}>${esc(label)}</a>`;\n  };\n  const handleOf = (url) => { const m = String(url || '').match(/\\/products\\/([^/?#]+)/); return m ? decodeURIComponent(m[1]) : null; };\n\n  /* Markdown links, bare links, **bold** and line breaks; everything else is escaped */\n  function formatText(text) {\n    const slots = [];\n    const hold = (html) => { slots.push(html); return `\\u0000${slots.length - 1}\\u0000`; };\n    let t = String(text || '');\n    t = t.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (m, label, url) => (/^(https?:\\/\\/|\\/)/.test(url.trim()) ? hold(linkTag(url, label)) : label));\n    t = t.replace(/https?:\\/\\/[^\\s<>()\\]]+/g, (url) => {\n      const trail = (url.match(/[.,;:!?]+$/) || [''])[0];\n      const clean = url.slice(0, url.length - trail.length);\n      let label = clean;\n      try { const u = new URL(clean); label = u.host.replace(/^www\\./, '') + (u.pathname.length > 1 ? u.pathname : ''); } catch (e) { /* keep */ }\n      return hold(linkTag(clean, label)) + trail;\n    });\n    return esc(t)\n      .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n      .replace(/\\n/g, '<br>')\n      .replace(/\\u0000(\\d+)\\u0000/g, (m, i) => slots[+i]);\n  }\n\n  /* ---------- the element ---------- */\n  class AuraChat extends HTMLElement {\n    connectedCallback() {\n      if (this.ready) return;\n      this.backend = (this.dataset.backend || '').replace(/\\/$/, '');\n      this.t = decode(json(this.querySelector('[data-ai-strings]')?.textContent, {}));\n      this.t.calc = this.t.calc || {};\n      this.t.tips = this.t.tips || {};\n      tryonLabel = this.t.see_on_car || '';\n      this.dock = this.querySelector('.ai-dock');\n      this.bar = this.querySelector('[data-ai-open]');\n      this.barText = this.querySelector('[data-ai-bar-text]');\n      this.unread = this.querySelector('[data-ai-unread]');\n      this.panel = this.querySelector('.ai-panel');\n      this.log = this.querySelector('[data-ai-log]');\n      this.thinking = this.querySelector('[data-ai-thinking]');\n      this.form = this.querySelector('[data-ai-form]');\n      this.input = this.form.querySelector('input');\n      this.sendBtn = this.form.querySelector('[type=\"submit\"]');\n      this.contextEl = this.querySelector('[data-ai-context]');\n      this.faq = this.querySelector('[data-ai-faq-sheet]');\n      this.tipsBox = this.querySelector('[data-ai-tips-toggle]');\n      this.mqModal = window.matchMedia('(max-width: 767px)');\n      this.product = cfg.product && cfg.product.handle ? cfg.product : null;\n      this.isColor = !!(this.product && this.product.kind === 'color');\n      this.isShop = !!cfg.shop_account;\n      this.local = json(ss.get(this.localKey()), []);\n      this.serverCount = 0;\n      this.pageStart = Date.now();\n      this.variantCache = new Map();\n      this.ready = true;\n      window.auraChat = this;\n\n      this.bindUi();\n      if (this.isShop) ls.set('aura_audience', 'shop');\n      this.recordView();\n      this.setBarText();\n      this.watchPage();\n      // Desktop: a panel left open on the last page stays open while the shopper browses\n      if (ss.get('aura.chat.open') === '1' && !this.mqModal.matches) this.open({ trigger: 'restore', focus: false });\n      this.peekTimer = setTimeout(() => this.peek(), 900);\n    }\n\n    localKey() { return `aura.chat.local.${sessionId()}`; }\n\n    /* ---------- wiring ---------- */\n    bindUi() {\n      this.bar.addEventListener('click', () => {\n        const run = this.barRun;\n        this.barRun = null;\n        if (run) { track('aura_ai_suggestion_clicked', { kind: this.barKind }); run(); this.setBarText(); return; }\n        if (this.panel.open) this.close(); else this.open({ trigger: 'bar' });\n      });\n      this.querySelectorAll('[data-ai-close]').forEach((b) => b.addEventListener('click', () => this.close()));\n      this.querySelector('[data-ai-faq]').addEventListener('click', () => this.openFaq());\n      this.querySelector('[data-ai-faq-close]').addEventListener('click', () => this.closeFaq());\n      this.form.addEventListener('submit', (e) => {\n        e.preventDefault();\n        if (this.streaming) return;\n        const p = this.pending;\n        this.pending = null;\n        if (p && this.input.value.trim() === p.text) { this.input.value = ''; p.run(p.text); } else this.submit(this.input.value);\n      });\n      // A bar question waiting in the input clears on a tap, so the shopper can type their own\n      this.input.addEventListener('pointerdown', () => {\n        if (this.pending && this.input.value === this.pending.text) this.input.value = '';\n        this.pending = null;\n      });\n      if (this.tipsBox) {\n        this.tipsBox.checked = this.tipsOn();\n        this.tipsBox.addEventListener('change', () => ls.set('aura.chat.tips', this.tipsBox.checked ? 'on' : 'off'));\n      }\n\n      this.panel.addEventListener('close', () => this.onClosed());\n      this.panel.addEventListener('cancel', (e) => { if (!this.faq.hidden) { e.preventDefault(); this.closeFaq(); } });\n      this.panel.addEventListener('keydown', (e) => {\n        if (e.key !== 'Escape' || this.panel.hasAttribute('data-modal')) return;\n        e.preventDefault();\n        if (!this.faq.hidden) this.closeFaq(); else this.close();\n      });\n      this.log.addEventListener('load', (e) => { if (e.target.tagName === 'IMG') this.scrollDown(); }, true);\n      this.log.addEventListener('click', (e) => this.onLogClick(e));\n\n      // The bar's wording is fitted to its width: fit it again once the fonts are in and when the width changes\n      const refit = () => { if (!this.bar.classList.contains('is-tip')) this.setBarText(); };\n      document.fonts?.ready.then(refit);\n      let fitTimer;\n      window.addEventListener('resize', () => { clearTimeout(fitTimer); fitTimer = setTimeout(refit, 200); });\n\n      const vv = window.visualViewport;\n      if (vv) {\n        const sync = () => this.syncViewport();\n        vv.addEventListener('resize', sync);\n        vv.addEventListener('scroll', sync);\n      }\n    }\n\n    tipsOn() { return this.dataset.tips !== 'false' && ls.get('aura.chat.tips') !== 'off'; }\n\n    /* ---------- open and close ---------- */\n    async open({ trigger = 'bar', focus = true } = {}) {\n      this.endPeek(true);\n      if (!this.panel.open) {\n        const modal = this.mqModal.matches;\n        this.panel._opener = document.activeElement;\n        this.panel.toggleAttribute('data-modal', modal);\n        const prev = document.activeElement;\n        if (modal) this.panel.showModal(); else this.panel.show();\n        // show() moves focus to the first button in the panel; beside the page it stays where it was\n        if (!modal && !focus && prev && prev.focus) prev.focus({ preventScroll: true });\n        this.dataset.open = '';\n        this.bar.setAttribute('aria-expanded', 'true');\n        if (this.bar.classList.contains('is-tip')) this.setBarText();\n        this.unread.hidden = true;\n        ss.set('aura.chat.open', '1');\n        touchChat();\n        this.syncViewport();\n        track('aura_ai_opened', { trigger, page_type: cfg.page_type });\n        if (trigger !== 'restore') this.context().then((pageContext) => this.post('/api/chat-opened', { sessionId: sessionId(), pageContext }));\n      }\n      this.renderContext();\n      if (!this.started) this.started = this.restore();\n      else this.started = this.started.then(() => this.sync());\n      await this.started;\n      if (focus && !this.panel.hasAttribute('data-modal')) this.input.focus({ preventScroll: true });\n      else if (focus) this.log.focus({ preventScroll: true });\n      this.scrollDown(true);\n      return { ok: true };\n    }\n\n    close() { if (this.panel.open) this.panel.close(); }\n\n    onClosed() {\n      delete this.dataset.open;\n      this.bar.setAttribute('aria-expanded', 'false');\n      this.closeFaq();\n      ss.del('aura.chat.open');\n      ['--ai-vh', '--ai-top'].forEach((p) => this.panel.style.removeProperty(p));\n    }\n\n    /* iOS keyboard: the modal sheet follows the visual viewport so the input stays above the keyboard */\n    syncViewport() {\n      const vv = window.visualViewport;\n      if (!vv || !this.panel.open || !this.panel.hasAttribute('data-modal')) return;\n      this.panel.style.setProperty('--ai-vh', `${Math.round(vv.height)}px`);\n      this.panel.style.setProperty('--ai-top', `${Math.round(vv.offsetTop)}px`);\n      this.scrollDown();\n    }\n\n    openFaq() {\n      const list = this.faq.querySelector('[data-ai-faq-list]');\n      list.replaceChildren(...this.questions().map((q) => {\n        const li = document.createElement('li');\n        const b = document.createElement('button');\n        b.type = 'button';\n        b.className = 'ai-faq__item';\n        b.textContent = q.label;\n        b.addEventListener('click', () => { this.closeFaq(); this.runQuestion(q); });\n        li.append(b);\n        return li;\n      }));\n      this.faq.hidden = false;\n      this.faq.querySelector('button').focus();\n    }\n\n    closeFaq() {\n      if (this.faq.hidden) return;\n      this.faq.hidden = true;\n      this.querySelector('[data-ai-faq]').focus({ preventScroll: true });\n    }\n\n    /* ---------- backend ---------- */\n    async post(path, body) {\n      if (!this.backend) return null;\n      try {\n        const res = await fetch(`${this.backend}${path}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });\n        return res.ok ? await res.json() : null;\n      } catch (e) { return null; }\n    }\n\n    async cartItems() {\n      if (this.cartAt && Date.now() - this.cartAt < 5000) return this.cartCache;\n      try {\n        const cart = await (await fetch(`${routes.cart}.js`, { headers: { Accept: 'application/json' } })).json();\n        this.cartCache = (cart.items || []).map((i) => ({ title: i.product_title || i.title, qty: i.quantity }));\n      } catch (e) { this.cartCache = []; }\n      this.cartAt = Date.now();\n      return this.cartCache;\n    }\n\n    audience() { return this.isShop ? 'shop' : ls.get('aura_audience'); }\n\n    /* The page context today's widget sends, plus what spec 14 lists (page, car, trade) for the backend to use */\n    async context() {\n      const m = meerkat();\n      const hasLead = !!(m.mkt || m.phone);\n      const car = garage();\n      return {\n        product: this.product ? this.product.title : null,\n        recentlyViewed: viewed().map((s) => s.replace(/-/g, ' ')).slice(-5),\n        cartItems: await this.cartItems(),\n        url: location.href.split('?')[0],\n        audienceType: this.audience(),\n        isShopAccount: this.isShop,\n        hasLead,\n        skipPromoSignup: this.isShop || this.audience() === 'shop' || hasLead,\n        hasPhone: m.phone,\n        meerkatHidden: m.hidden,\n        // The backend falls back to the session id for explorer links and lead capture; the chat session\n        // changes daily, the shopper's Meerkat id doesn't\n        mktId: marketingId(),\n        pageType: cfg.page_type,\n        handle: cfg.product_handle || null,\n        car: car ? car.label : null,\n        trade: cfg.trade === true\n      };\n    }\n\n    async fetchTranscript() {\n      if (!this.backend) return null;\n      try {\n        const res = await fetch(`${this.backend}/api/session/${encodeURIComponent(sessionId())}`);\n        if (!res.ok) return null;\n        const msgs = (await res.json()).messages || [];\n        // The stored transcript doesn't flag proactive messages: one is an assistant message no question came\n        // before (every answer is stored right after its question)\n        return msgs.map((m, i) => (m.role === 'assistant' && !m.proactive && (!i || msgs[i - 1].role !== 'user') ? { ...m, proactive: true } : m));\n      } catch (e) { return null; }\n    }\n\n    async restore() {\n      const [arr] = await Promise.all([this.fetchTranscript(), this.calcReady()]);\n      this.renderAll(arr || []);\n      this.syncPending(arr || []);\n    }\n\n    async sync() {\n      const [arr] = await Promise.all([this.fetchTranscript(), this.calcReady()]);\n      if (arr && arr.length !== this.serverCount) { this.renderAll(arr); this.syncPending(arr); }\n    }\n\n    /* Saved calculator steps need the calculator before they can be drawn again */\n    calcReady() {\n      return this.local.some((e) => e.kind === 'picker' || e.kind === 'calc') ? this.loadCalc().catch(() => null) : null;\n    }\n\n    /* A proactive message or DIY-or-shop question still waiting for a reply blocks new nudges */\n    syncPending(arr) {\n      let last = -1;\n      arr.forEach((m, i) => { if (m.role === 'user') last = i; });\n      setPending(arr.slice(last + 1).some((m) => m.role === 'assistant' && !explorerPitch(m) && (m.proactive || m.needsAudiencePrompt)));\n    }\n\n    /* ---------- rendering the conversation ---------- */\n    renderAll(arr) {\n      this.log.replaceChildren();\n      this.chipsEl = null;\n      this.lastGrid = null;\n      const locals = this.local.slice();\n      const flush = (upTo) => { while (locals.length && locals[0].after <= upTo) this.renderLocal(locals.shift()); };\n      // Until the shopper asks something, the chat opens with the greeting and example questions, around any\n      // proactive messages\n      const started = arr.some((m) => m.role === 'user');\n      if (!started) this.say('bot', this.t.greeting);\n      let asked = '';\n      arr.forEach((m, i) => { flush(i); if (m.role === 'user') asked = m.content; this.renderServer(m, asked); });\n      flush(Infinity);\n      this.serverCount = arr.length;\n      if (!started && !this.local.some((e) => e.kind === 'me')) this.showChips(this.questions().slice(0, 3));\n      const waiting = arr.slice(-3).some((m) => m.role === 'assistant' && m.needsAudiencePrompt);\n      if (waiting && !this.audience()) this.showAudienceChips();\n      this.scrollDown(true);\n    }\n\n    renderServer(m, asked) {\n      if (m.role === 'user') { this.say('me', m.content); return; }\n      if (explorerPitch(m)) return;\n      const cards = this.cleanCards(m.cards);\n      if (cards.some(isSwatchCard)) {\n        const want = this.sampleFor(asked);\n        const sample = cards.find((c) => c.type === 'product' && handleOf(c.url) === want);\n        this.say('bot', this.swatchText(sample));\n        [cards.find(isSwatchCard), sample].filter(Boolean).forEach((c) => this.card(c));\n        return;\n      }\n      let content = m.content || '';\n      if (cards.some((c) => c.type === 'contact') && /\\d{3}[-\\s]?\\d{3}[-\\s]?\\d{4}|@auravinyl\\.com/.test(content)) content = this.t.contact_intro;\n      if (m.needsAudiencePrompt) content = stripQuestions(content) || this.t.audience_intro;\n      if (cards.length && content) content = stripQuestions(content) || content;\n      if (content) this.say('bot', content);\n      cards.forEach((c) => this.card(c));\n    }\n\n    addLocal(entry) {\n      entry.after = this.serverCount;\n      this.local.push(entry);\n      this.local = this.local.slice(-30);\n      this.saveLocal();\n      touchChat();\n      return this.renderLocal(entry);\n    }\n\n    saveLocal() { ss.set(this.localKey(), JSON.stringify(this.local)); }\n\n    renderLocal(entry) {\n      switch (entry.kind) {\n        case 'me': return this.say('me', entry.text);\n        case 'bot': return this.say('bot', entry.text);\n        case 'note': return this.note(entry.text, entry.link);\n        case 'picker': return entry.done ? null : this.picker(entry);\n        case 'calc': return this.calcCard(entry);\n        case 'contact': return this.card({ type: 'contact' });\n        default: return null;\n      }\n    }\n\n    say(who, text) {\n      this.lastGrid = null;\n      const el = document.createElement('div');\n      el.className = `ai-msg ai-msg--${who}`;\n      if (who === 'me') el.textContent = text; else el.innerHTML = formatText(text);\n      this.log.append(el);\n      this.scrollDown(who === 'me');\n      return el;\n    }\n\n    note(text, link) {\n      this.lastGrid = null;\n      const el = document.createElement('p');\n      el.className = 'ai-note';\n      el.innerHTML = `<svg class=\"icon\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#i-check\"></use></svg><span>${esc(text)}${link ? ` <a href=\"${esc(link.href)}\">${esc(link.label)}</a>` : ''}</span>`;\n      this.log.append(el);\n      this.scrollDown(true);\n      return el;\n    }\n\n    /* Explorer cards are dropped (the explorer is on every page); store links stay on this storefront */\n    cleanCards(cards) {\n      return (cards || []).filter((c) => c && !explorerCard(c));\n    }\n\n    /* Swatch answers: the material sample for the line asked about, else this page's, else vinyl */\n    sampleFor(question) {\n      const line = (t) => (/clear ppf|crystal clear/.test(t) ? 'crystal-clear-ppf-sample' : /\\bppf\\b|paint protection/.test(t) ? 'hyper-ppf-sample' : /\\bvinyl\\b/.test(t) ? 'vinyl-sample' : null);\n      return line(String(question || '').toLowerCase()) || line(String(this.product ? this.product.title : '').toLowerCase()) || 'vinyl-sample';\n    }\n\n    swatchText(sample) {\n      return sample ? `${this.t.swatch_chip} ${fill(this.t.swatch_sample, { sample: sample.title })}` : this.t.swatch_chip;\n    }\n\n    dropCard(el) {\n      const grid = el.closest('.ai-cards');\n      el.remove();\n      if (grid && !grid.children.length) { grid.remove(); if (this.lastGrid === grid) this.lastGrid = null; }\n    }\n\n    card(c) {\n      if (c.type === 'promo') return this.promoCard(c);\n      if (c.type === 'contact') return this.contactCard(c);\n      return this.colorCard(c);\n    }\n\n    colorCard(c) {\n      if (!this.lastGrid) {\n        this.lastGrid = document.createElement('ul');\n        this.lastGrid.className = 'ai-cards';\n        this.lastGrid.setAttribute('role', 'list');\n        this.log.append(this.lastGrid);\n      }\n      const handle = handleOf(c.url);\n      const href = c.url ? localHref(c.url) : null;\n      const li = document.createElement('li');\n      li.className = 'ai-cards__item';\n      const price = c.price && !cfg.trade ? `<span class=\"card__price price\">${esc(c.price)}</span>` : '';\n      const out = c.available === false ? `<span class=\"card__finish\">${esc(this.t.sold_out)}</span>` : '';\n      li.innerHTML = `<article class=\"card ai-card\">\n        <div class=\"card__media\">${c.swatch ? `<img src=\"${esc(c.swatch)}\" alt=\"\" loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"300\">` : ''}</div>\n        <div class=\"card__body\">\n          <h3 class=\"card__name\">${href ? `<a class=\"card__link\" href=\"${esc(href)}\" data-ai-card>${esc(c.title)}</a>` : esc(c.title)}</h3>\n          ${price || out ? `<div class=\"card__meta\">${out}${price}</div>` : ''}\n          ${handle && c.type === 'color' ? `<div class=\"card__actions\">\n            <button type=\"button\" class=\"text-btn\" data-ai-chip=\"${esc(handle)}\" data-title=\"${esc(c.title)}\">${esc(this.t.chip)}</button>\n            <button type=\"button\" class=\"text-btn\" data-ai-size=\"${esc(handle)}\">${esc(this.t.size_it)}</button>\n          </div>` : ''}\n        </div>\n      </article>`;\n      li._card = c;\n      this.lastGrid.append(li);\n      this.scrollDown();\n      return li;\n    }\n\n    promoCard(c) {\n      this.lastGrid = null;\n      const el = document.createElement('div');\n      el.className = 'ai-block ai-promo';\n      el.innerHTML = `<p><span class=\"tag\">${esc(this.t.offer)}</span></p>\n        <p class=\"ai-promo__title\">${esc(c.title || '')}</p>\n        ${c.headline && c.headline !== c.title ? `<p class=\"ai-promo__head\">${esc(c.headline)}</p>` : ''}\n        ${c.code ? `<button type=\"button\" class=\"ai-promo__code mono\" data-ai-copy=\"${esc(c.code)}\" aria-label=\"${esc(this.t.copy_code)} ${esc(c.code)}\">${esc(c.code)}<svg class=\"icon\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#i-copy\"></use></svg></button>` : ''}\n        ${c.note ? `<p class=\"small muted\">${esc(c.note)}</p>` : ''}\n        ${c.url ? `<a class=\"btn btn--secondary ai-promo__cta\" href=\"${esc(localHref(c.url))}\" data-ai-card>${esc(c.cta || this.t.learn_more)}</a>` : ''}`;\n      el._card = c;\n      this.log.append(el);\n      this.scrollDown();\n      return el;\n    }\n\n    contactCard(c = {}) {\n      this.lastGrid = null;\n      const k = cfg.contact || {};\n      const el = document.createElement('div');\n      el.className = 'ai-contact';\n      el.innerHTML = [\n        k.sms ? `<a class=\"btn btn--secondary\" href=\"sms:${esc(k.sms)}\" data-ai-handoff=\"sms\">${esc(this.t.text_us)} <span class=\"mono\">${esc(k.phone || c.phone || '')}</span></a>` : '',\n        k.email ? `<a class=\"btn btn--secondary\" href=\"mailto:${esc(k.email)}\" data-ai-handoff=\"email\">${esc(this.t.email_us)}</a>` : '',\n        k.discord ? `<a class=\"btn btn--secondary\" href=\"${esc(k.discord)}\" target=\"_blank\" rel=\"noopener\" data-ai-handoff=\"discord\">${esc(this.t.discord)}</a>` : ''\n      ].join('');\n      el._card = Object.assign({ type: 'contact', title: 'Talk to a human' }, c);\n      this.log.append(el);\n      this.scrollDown();\n      return el;\n    }\n\n    showChips(items) {\n      this.clearChips();\n      if (!items.length) return;\n      const el = document.createElement('div');\n      el.className = 'ai-chips';\n      el.setAttribute('role', 'group');\n      el.setAttribute('aria-label', this.t.suggested);\n      items.forEach((q) => {\n        const b = document.createElement('button');\n        b.type = 'button';\n        b.className = 'chip ai-chip';\n        b.textContent = q.label;\n        b.addEventListener('click', () => { this.clearChips(); this.runQuestion(q); });\n        el.append(b);\n      });\n      this.log.append(el);\n      this.chipsEl = el;\n      this.lastGrid = null;\n      this.scrollDown(true);\n    }\n\n    clearChips() { if (this.chipsEl) { this.chipsEl.remove(); this.chipsEl = null; } }\n\n    showAudienceChips() {\n      this.showChips([\n        { label: this.t.audience_diy, audience: 'diy' },\n        { label: this.t.audience_shop, audience: 'shop' }\n      ]);\n    }\n\n    /* Contextual chips first (the calculator, a free chip of this color), then today's starter questions */\n    questions() {\n      const list = [];\n      list.push({ label: this.isColor ? fill(this.t.calc.ask_color, { color: this.product.name }) : this.t.calc.ask, calc: true });\n      if (this.isColor) list.push({ label: fill(this.t.chip_free, { color: this.product.name }), chip: this.product.handle, title: this.product.title });\n      return list.concat(this.t.starters || []);\n    }\n\n    runQuestion(q) {\n      if (q.calc) return this.openCalculator({ surface: 'chip', said: q.label });\n      if (q.chip) return this.addChip(q.chip, q.title, q.label);\n      if (q.audience) return this.chooseAudience(q.audience);\n      return this.submit(q.prompt || q.label);\n    }\n\n    scrollDown(force) {\n      const el = this.log;\n      if (!force && el.scrollHeight - el.scrollTop - el.clientHeight > 120) return;\n      const snap = () => { el.scrollTop = el.scrollHeight; };\n      snap();\n      requestAnimationFrame(snap);\n    }\n\n    setThinking(label) {\n      if (label === false) { this.thinking.hidden = true; return; }\n      this.thinking.querySelector('[data-ai-thinking-label]').textContent = label || this.t.thinking;\n      this.thinking.hidden = false;\n    }\n\n    /* ---------- clicks inside the conversation ---------- */\n    onLogClick(e) {\n      const cardLink = e.target.closest('[data-ai-card]');\n      if (cardLink) {\n        const holder = cardLink.closest('.ai-card, .ai-promo');\n        const c = holder && holder._card;\n        if (c) this.trackCard(c, c.type === 'promo' ? 'promo_cta' : c.type === 'product' ? 'product_card' : 'color_card');\n        if (this.panel.hasAttribute('data-modal')) this.close();\n        return;\n      }\n      // A try-on link for this page's color opens the try-on here, without a reload\n      const tryon = e.target.closest('a[href*=\"tab=your_car\"]');\n      if (tryon && this.isColor && handleOf(tryon.getAttribute('href')) === this.product.handle && document.querySelector('aura-tryon')) {\n        e.preventDefault();\n        if (this.panel.hasAttribute('data-modal')) this.close();\n        aura.render({ colors: [this.product.handle] }, { surface: 'ai' });\n        return;\n      }\n      const handoff = e.target.closest('[data-ai-handoff]');\n      if (handoff) {\n        track('aura_ai_handoff', { channel: handoff.dataset.aiHandoff });\n        this.trackCard({ type: 'contact', title: 'Talk to a human' }, `contact_${handoff.dataset.aiHandoff}`);\n        return;\n      }\n      const chip = e.target.closest('[data-ai-chip]');\n      if (chip) { this.addChip(chip.dataset.aiChip, chip.dataset.title, null, chip); return; }\n      const size = e.target.closest('[data-ai-size]');\n      if (size) { this.openCalculator({ handle: size.dataset.aiSize, surface: 'ai_card' }); return; }\n      const copy = e.target.closest('[data-ai-copy]');\n      if (copy) {\n        navigator.clipboard?.writeText(copy.dataset.aiCopy).then(() => aura.toast(this.t.copied)).catch(() => {});\n      }\n    }\n\n    trackCard(card, source) {\n      this.context().then((pageContext) => this.post('/api/card-click', {\n        sessionId: sessionId(), card: { type: card.type || null, title: card.title || null, url: card.url || null }, source, pageContext\n      }));\n    }\n\n    /* A color goes on a free chip: the vinyl and PPF samples are standard material, never a color */\n    async addChip(handle, title, said, btn) {\n      if (said) this.addLocal({ kind: 'me', text: said });\n      btn?.setAttribute('aria-busy', 'true');\n      const res = await aura.addChip(handle, { title, surface: 'ai' });\n      btn?.removeAttribute('aria-busy');\n      if (res && res.ok) {\n        this.addLocal({ kind: 'note', text: fill(this.t.added_chip, { color: title || handle }), link: { href: routes.cart, label: this.t.view_cart } });\n        this.markAssisted();\n        track('aura_ai_action_executed', { action: 'add_chip', ok: true, undone: false });\n      } else if (res && ['duplicate', 'limit', 'no_chip_product'].includes(res.reason)) {\n        // aura.addChip already said why in a toast, or is opening the chip request page\n      } else {\n        this.addLocal({ kind: 'note', text: this.t.action_failed });\n      }\n    }\n\n    /* Spec 14: sessions with an executed AI action carry _ai_assisted, so orders can be compared */\n    markAssisted() {\n      if (ss.get('aura.ai.assisted')) return;\n      ss.set('aura.ai.assisted', '1');\n      fetch(`${routes.cart_update}.js`, { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ attributes: { _ai_assisted: 'true' } }) }).catch(() => {});\n    }\n\n    /* ---------- sending ---------- */\n    async submit(raw) {\n      const text = String(raw || '').trim();\n      if (!text || this.streaming) return;\n      this.input.value = '';\n      this.clearChips();\n      setPending(false);\n      if (!this.panel.open) await this.open({ trigger: 'ask', focus: false });\n      // Sizing questions run the calculator here: instant, and the length comes from the product's live rolls\n      if (isSizing(text)) {\n        const calc = await this.loadCalc().catch(() => null);\n        if (calc) return this.openCalculator({ surface: 'ai', said: text, car: calc.find(text) });\n      }\n      this.turns = (this.turns || 0) + 1;\n      track('aura_ai_query', { chars: text.length, has_photo: false, turn: this.turns });\n      if (!this.backend) { this.say('me', text); this.offline(); return; }\n      this.say('me', text);\n      this.stream(text);\n    }\n\n    offline() {\n      this.say('bot', fill(this.t.offline, { phone: (cfg.contact || {}).phone || '', email: (cfg.contact || {}).email || '' }));\n      this.card({ type: 'contact' });\n    }\n\n    async stream(text) {\n      touchChat();\n      this.streaming = true;\n      this.sendBtn.disabled = true;\n      this.setThinking();\n      const t0 = performance.now();\n      let firstComponent = null;\n      let components = 0;\n      let bubble = null;\n      let raw = '';\n      let firstCard = null;\n      let contact = false;\n      let gotAssistant = false;\n      const shown = [];\n      let swatch = null;\n      const PHONE_OR_EMAIL = /\\d{3}[-\\s]?\\d{3}[-\\s]?\\d{4}|@auravinyl\\.com/;\n      const place = (c) => {\n        const el = this.card(c);\n        if (!el) return;\n        shown.push({ card: c, el });\n        if (!firstCard) firstCard = el.closest('.ai-cards') || el;\n      };\n      const isWanted = (c) => c.type === 'product' && handleOf(c.url) === swatch.want;\n      const done = () => {\n        if (bubble) bubble.removeAttribute('aria-busy');\n        this.setThinking(false);\n        this.streaming = false;\n        this.sendBtn.disabled = false;\n        this.serverCount += gotAssistant ? 2 : 1;\n        if (!this.panel.open) this.unread.hidden = false;\n        track('aura_ai_answer_rendered', { components, ms_first_component: firstComponent, ms_total: Math.round(performance.now() - t0) });\n      };\n      const handle = (evt) => {\n        if (evt.type === 'progress') { this.setThinking(evt.label); return; }\n        if (evt.type === 'text') {\n          gotAssistant = true;\n          raw += evt.text;\n          if (contact && PHONE_OR_EMAIL.test(raw)) raw = this.t.contact_intro;\n          if (!bubble) {\n            // The backend sends a turn's cards before its text: the text goes above them, as on reload\n            bubble = this.say('bot', '');\n            if (firstCard) this.log.insertBefore(bubble, firstCard);\n            bubble.setAttribute('aria-busy', 'true');\n          }\n          bubble.innerHTML = formatText(swatch ? this.swatchText(swatch.sample) : raw);\n          this.setThinking(false);\n          this.scrollDown();\n          return;\n        }\n        if (evt.type === 'card' && evt.card) {\n          gotAssistant = true;\n          components += 1;\n          if (firstComponent === null) firstComponent = Math.round(performance.now() - t0);\n          if (evt.card.type === 'contact') {\n            contact = true;\n            if (bubble && PHONE_OR_EMAIL.test(raw)) { raw = this.t.contact_intro; bubble.innerHTML = formatText(raw); }\n          }\n          if (!this.cleanCards([evt.card]).length) return;\n          // A swatch answer keeps the free chips and the line's material sample, chips first\n          if (isSwatchCard(evt.card) && !swatch) {\n            swatch = { want: this.sampleFor(text), sample: null };\n            swatch.sample = shown.map((s) => s.card).find(isWanted) || null;\n            shown.splice(0).forEach((s) => this.dropCard(s.el));\n            firstCard = null;\n            place(evt.card);\n            if (swatch.sample) place(swatch.sample);\n          } else if (!swatch) {\n            place(evt.card);\n          } else if (!swatch.sample && isWanted(evt.card)) {\n            swatch.sample = evt.card;\n            place(evt.card);\n          }\n          if (swatch && bubble) bubble.innerHTML = formatText(this.swatchText(swatch.sample));\n          return;\n        }\n        if (evt.type === 'lead_captured') {\n          if (evt.id) ls.set('mkt', evt.id);\n          if (evt.hasEmail) { ls.set('mkt_hidden', 'true'); ls.set('mkt_email', 'true'); }\n          if (evt.hasPhone) { ls.set('mkt_phone', 'true'); ls.set('mkt_hidden', 'true'); }\n          this.flushAnonList(evt.id);\n          // The AI try-on's gate (aura-tryon.js) lets its held render go\n          if (evt.hasEmail || evt.hasPhone) document.dispatchEvent(new CustomEvent('aura:lead', { detail: { field: evt.hasEmail ? 'email' : 'phone', surface: 'chat', reload: false } }));\n          return;\n        }\n        if (evt.type === 'error') {\n          this.setThinking(false);\n          this.say('bot', fill(this.t.error, { phone: (cfg.contact || {}).phone || '', email: (cfg.contact || {}).email || '' }));\n        }\n      };\n      try {\n        const res = await fetch(`${this.backend}/api/chat`, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ sessionId: sessionId(), message: text, pageContext: await this.context() })\n        });\n        if (!res.ok || !res.body) throw new Error('bad response');\n        const reader = res.body.getReader();\n        const dec = new TextDecoder();\n        let buf = '';\n        for (;;) {\n          const { value, done: end } = await reader.read();\n          if (end) break;\n          buf += dec.decode(value, { stream: true });\n          const parts = buf.split('\\n\\n');\n          buf = parts.pop();\n          parts.forEach((chunk) => {\n            const line = chunk.split('\\n').find((l) => l.startsWith('data:'));\n            if (!line) return;\n            try { handle(JSON.parse(line.slice(5).trim())); } catch (e) { /* partial or keep-alive */ }\n          });\n        }\n        done();\n      } catch (e) {\n        this.setThinking(false);\n        if (!gotAssistant) this.offline();\n        done();\n      }\n    }\n\n    async chooseAudience(type) {\n      if (this.streaming) return;\n      setPending(false);\n      touchChat();\n      ls.set('aura_audience', type);\n      this.say('me', type === 'shop' ? this.t.audience_shop_me : this.t.audience_diy_me);\n      this.setThinking();\n      const d = await this.post('/api/audience', { sessionId: sessionId(), audienceType: type, pageContext: await this.context() });\n      this.setThinking(false);\n      if (!d || !d.ok) { this.offline(); return; }\n      this.serverCount += 2;\n      const cards = this.cleanCards(d.cards);\n      if (d.assistantMessage) this.say('bot', cards.length ? stripQuestions(d.assistantMessage) || d.assistantMessage : d.assistantMessage);\n      cards.forEach((c) => this.card(c));\n    }\n\n    flushAnonList(id) {\n      if (!id) return;\n      const list = json(ls.get('anon_mkt_list'), null);\n      if (!Array.isArray(list)) return;\n      ls.del('anon_mkt_list');\n      list.forEach((uri) => fetch('https://marketing.auravinyl.com/events/meerkat', {\n        method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id, uri })\n      }).catch(() => {}));\n    }\n\n    /* ---------- what Aura knows, as pills under the header ---------- */\n    renderContext() {\n      const pills = [];\n      if (cfg.context_label) pills.push(`<span class=\"ai-pill ai-pill--page\" title=\"${esc(cfg.context_label)}\"><span class=\"ai-pill__k\">${esc(this.t.viewing)}</span><span class=\"ai-pill__v\">${esc(cfg.context_label)}</span></span>`);\n      const car = garage();\n      if (car) pills.push(`<span class=\"ai-pill\"><span class=\"ai-pill__k\">${esc(this.t.your_car)}</span> ${esc(car.label)}<button type=\"button\" class=\"ai-pill__x\" data-ai-forget aria-label=\"${esc(this.t.forget_car)}\">${this.iconX()}</button></span>`);\n      if (this.isShop) pills.push(`<span class=\"ai-pill\">${esc(this.t.shop_account)}</span>`);\n      this.contextEl.innerHTML = pills.join('');\n      this.contextEl.hidden = !pills.length;\n      this.contextEl.querySelector('[data-ai-forget]')?.addEventListener('click', () => {\n        aura.setCar(false);\n        this.renderContext();\n        this.setBarText();\n        this.input.focus({ preventScroll: true });\n      });\n    }\n\n    iconX() { return '<svg class=\"icon\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#i-x\"></use></svg>'; }\n\n    /* ---------- calculator (spec 10) ---------- */\n    loadCalc() {\n      if (window.auraCalc) return Promise.resolve(window.auraCalc);\n      if (!this.calcPromise) {\n        this.calcPromise = new Promise((resolve, reject) => {\n          const s = document.createElement('script');\n          s.src = this.dataset.calcSrc;\n          s.onload = () => (window.auraCalc ? resolve(window.auraCalc) : reject(new Error('calc')));\n          s.onerror = () => { this.calcPromise = null; reject(new Error('calc')); };\n          document.head.append(s);\n        });\n      }\n      return this.calcPromise;\n    }\n\n    /* The product's rolls as the length tiles show them (sections/aura-calc-variants.liquid), through the\n       Section Rendering API. On that product's own page the tiles themselves are read if the fetch fails. */\n    variants(handle) {\n      if (!handle) return Promise.resolve(null);\n      if (!this.variantCache.has(handle)) {\n        // No Accept: application/json here: with it Shopify answers with the product's JSON, not the section\n        const p = fetch(`${root}/products/${encodeURIComponent(handle)}?sections=aura-calc-variants`)\n          .then((r) => (r.ok ? r.json() : Promise.reject(new Error(String(r.status)))))\n          .then((sections) => {\n            const html = sections && sections['aura-calc-variants'];\n            const el = html && new DOMParser().parseFromString(html, 'text/html').querySelector('[data-calc-variants]');\n            if (!el) throw new Error('no data');\n            return JSON.parse(el.textContent);\n          })\n          .catch(() => {\n            this.variantCache.delete(handle);\n            return this.product && handle === this.product.handle ? this.tilesOnPage() : null;\n          });\n        this.variantCache.set(handle, p);\n      }\n      return this.variantCache.get(handle);\n    }\n\n    tilesOnPage() {\n      // aura-product.js renames the radios and posts the id from a hidden input, so read them by length\n      const inputs = [...document.querySelectorAll('[data-length-cards] input[data-length-ft]')];\n      if (!inputs.length) return null;\n      const t = this.product.title.toLowerCase();\n      return {\n        handle: this.product.handle, title: this.product.title, name: this.product.name, kind: this.product.kind,\n        line: t.includes('clear ppf') || t.includes('crystal clear') ? 'clear_ppf' : t.includes('ppf') ? 'hyper_ppf' : 'vinyl',\n        hex: null, image: null, url: location.pathname,\n        rolls: inputs.filter((i) => +i.dataset.lengthFt > 0).map((i) => ({\n          id: +i.value, length_ft: +i.dataset.lengthFt, title: i.dataset.label,\n          fit: i.closest('.roll')?.querySelector('.roll__hint')?.textContent.trim() || '',\n          price: i.dataset.price, regular: i.dataset.regular || null, available: i.dataset.available === 'true'\n        }))\n      };\n    }\n\n    async openCalculator({ handle, surface = 'ai', said, car } = {}) {\n      await this.open({ trigger: surface === 'ai' || surface === 'chip' ? 'calc' : surface, focus: false });\n      this.clearChips();\n      const product = handle || (this.isColor ? this.product.handle : null);\n      const name = product && this.product && product === this.product.handle ? this.product.name : null;\n      this.addLocal({ kind: 'me', text: said || (name ? fill(this.t.calc.ask_color, { color: name }) : this.t.calc.ask) });\n      try { await this.loadCalc(); } catch (e) { this.offline(); return { ok: false, reason: 'calc' }; }\n      let chosen = car || null;\n      if (chosen) this.saveCar(chosen, 'text');\n      else chosen = garage();\n      track('aura_calc_opened', { surface, handle: product, has_car: !!chosen });\n      ss.set('aura.calc.used', '1');\n      if (product) this.markAsked(`calc:${product}`);\n      if (chosen) this.addLocal({ kind: 'calc', state: { handle: product, car: chosen, first: false } })?.focus({ preventScroll: true });\n      else this.askCar(product);\n      return { ok: true };\n    }\n\n    askCar(handle) {\n      this.addLocal({ kind: 'bot', text: this.t.calc.car_question });\n      const entry = this.addLocal({ kind: 'picker', handle });\n      entry?.querySelector('input')?.focus({ preventScroll: true });\n    }\n\n    saveCar(car, method) {\n      const saved = { make: car.make || null, model: car.model || null, year: car.year || null, body: car.body, label: car.label, guide: !!car.guide };\n      aura.setCar(saved);\n      track('aura_calc_car_set', { method, make: saved.make, model: saved.model, body: saved.body });\n      this.renderContext();\n      this.setBarText();\n      return saved;\n    }\n\n    /* Step 1: type-ahead for year, make and model, or a shape (spec 10) */\n    picker(entry) {\n      const calc = window.auraCalc;\n      if (!calc) return null;\n      const t = this.t.calc;\n      const id = `ai-car-${Math.random().toString(36).slice(2, 8)}`;\n      const el = document.createElement('div');\n      el.className = 'ai-block ai-picker';\n      el.innerHTML = `<form class=\"ai-picker__form\" novalidate>\n          <label class=\"field__label\" for=\"${id}\">${esc(t.car_label)}</label>\n          <div class=\"ai-combo\">\n            <input class=\"input\" id=\"${id}\" type=\"text\" role=\"combobox\" aria-autocomplete=\"list\" aria-expanded=\"false\" aria-controls=\"${id}-list\" autocomplete=\"off\" enterkeyhint=\"search\" placeholder=\"${esc(t.car_placeholder)}\">\n            <ul class=\"ai-combo__list\" id=\"${id}-list\" role=\"listbox\" hidden></ul>\n          </div>\n          <p class=\"ai-picker__miss small\" hidden></p>\n        </form>\n        <p class=\"field__label\" id=\"${id}-shapes\">${esc(t.shapes)}</p>\n        <div class=\"ai-shapes\" role=\"group\" aria-labelledby=\"${id}-shapes\">${calc.SHAPES.map((sh) => `<button type=\"button\" class=\"chip\" data-shape=\"${sh}\">${esc((t.bodies || {})[sh] || sh)}</button>`).join('')}</div>`;\n      const input = el.querySelector('input');\n      const list = el.querySelector('[role=\"listbox\"]');\n      const miss = el.querySelector('.ai-picker__miss');\n      let items = [];\n      let active = -1;\n      let typed = '';\n\n      const paint = () => {\n        list.replaceChildren(...items.map((v, i) => {\n          const li = document.createElement('li');\n          li.id = `${id}-o${i}`;\n          li.setAttribute('role', 'option');\n          li.setAttribute('aria-selected', String(i === active));\n          li.className = 'ai-combo__opt';\n          li.innerHTML = `<span>${esc(v.label)}</span><span class=\"small faint\">${esc((t.bodies || {})[v.body] || '')}</span>`;\n          li.addEventListener('mousedown', (e) => e.preventDefault());\n          li.addEventListener('click', () => choose(v, 'typeahead'));\n          return li;\n        }));\n        list.hidden = !items.length;\n        input.setAttribute('aria-expanded', String(!!items.length));\n        if (active >= 0) input.setAttribute('aria-activedescendant', `${id}-o${active}`); else input.removeAttribute('aria-activedescendant');\n      };\n      const choose = (car, method) => {\n        entry.done = true;\n        this.saveLocal();\n        el.remove();\n        const saved = this.saveCar(car, method);\n        this.addLocal({ kind: 'me', text: saved.label });\n        // The picker had focus: hand it to the answer, or the panel would move it to its first button\n        this.addLocal({ kind: 'calc', state: { handle: entry.handle, car: saved, first: false } })?.focus({ preventScroll: true });\n      };\n      input.addEventListener('input', () => {\n        miss.hidden = true;\n        items = calc.suggest(input.value, 6);\n        active = items.length ? 0 : -1;\n        paint();\n      });\n      input.addEventListener('keydown', (e) => {\n        if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n          if (!items.length) return;\n          e.preventDefault();\n          active = (active + (e.key === 'ArrowDown' ? 1 : -1) + items.length) % items.length;\n          paint();\n        } else if (e.key === 'Escape' && items.length) {\n          e.stopPropagation();\n          items = [];\n          active = -1;\n          paint();\n        }\n      });\n      input.addEventListener('blur', () => setTimeout(() => { items = []; active = -1; paint(); }, 150));\n      el.querySelector('form').addEventListener('submit', (e) => {\n        e.preventDefault();\n        const value = input.value.trim();\n        if (!value) return;\n        const hit = items[active] || calc.find(value) || calc.suggest(value, 1)[0];\n        if (hit) { choose(hit, 'typeahead'); return; }\n        typed = value;\n        miss.textContent = t.no_match;\n        miss.hidden = false;\n        el.querySelector('[data-shape]').focus();\n      });\n      el.querySelectorAll('[data-shape]').forEach((b) => b.addEventListener('click', () => {\n        const body = b.dataset.shape;\n        const shapeName = (t.bodies || {})[body] || body;\n        choose({ body, label: typed || shapeName, guide: false }, 'shape');\n      }));\n      this.lastGrid = null;\n      this.log.append(el);\n      this.scrollDown(true);\n      return el;\n    }\n\n    /* The answer: the car in the color, the length in large mono, every roll on a scale, Add and Sample */\n    calcCard(entry) {\n      const el = document.createElement('article');\n      el.className = 'ai-block ai-calc';\n      el.tabIndex = -1;\n      el.setAttribute('aria-label', this.t.calc.title);\n      el.setAttribute('aria-busy', 'true');\n      el.innerHTML = '<div class=\"ai-calc__loading\"></div>';\n      this.lastGrid = null;\n      this.log.append(el);\n      this.scrollDown(true);\n      this.paintCalc(entry, el);\n      return el;\n    }\n\n    /* The answer (spec 10, creative direction \"Calculator sheet\"): the length in large Geist Mono with its\n       basis under it in --text-3, the color's own photo, the rolls as the buy box's tiles, one Volt button */\n    async paintCalc(entry, el) {\n      const s = entry.state;\n      const t = this.t.calc;\n      let calc;\n      try { calc = await this.loadCalc(); } catch (e) { el.remove(); return; }\n      const data = await this.variants(s.handle);\n      const isColor = !!(data && data.kind === 'color' && data.rolls.length);\n      const line = isColor ? data.line : (s.line || 'vinyl');\n      const rec = calc.recommend({ body: s.car.body, line, firstWrap: s.first, rolls: isColor ? data.rolls : null, guide: s.car.guide });\n      if (!rec) { el.remove(); return; }\n      if (rec.custom) {\n        el.innerHTML = `${this.calcHead(s.car)}<p class=\"ai-calc__van\">${esc(t.van)}</p>`;\n        el.removeAttribute('aria-busy');\n        el.append(this.contactCard());\n        this.bindCalcHead(el, entry);\n        return;\n      }\n      // No product: the guide's fit lines by tier, as /pages/calculator shows them\n      if (!isColor) rec.rolls.forEach((r, i) => { r.fit = (t.fits || [])[i] || ''; });\n      if (s.pick) {\n        const i = rec.rolls.findIndex((r) => r.length_ft === s.pick);\n        if (i >= 0) { rec.index = i; rec.roll = rec.rolls[i]; }\n      }\n      const roll = rec.roll;\n      const name = isColor ? data.name : null;\n      const fitRoll = rec.rolls.find((r) => r.length_ft === rec.fits_ft) || {};\n      const basis = rec.basis === 'guide'\n        ? fill(t.basis_guide, { fit: fitRoll.fit || '' })\n        : fill(t.basis_body, { body: (t.bodies || {})[s.car.body] || s.car.body });\n      const notes = [];\n      if (rec.bumped) notes.push(fill(t.sold_out_next, { length: `${rec.fits_ft} ft` }));\n      if (rec.capped) notes.push(t.capped);\n      if (s.pick && s.pick < rec.fits_ft) notes.push(fill(t.short, { length: `${rec.fits_ft} ft` }));\n      const recent = !isColor ? viewed().slice(-1)[0] : null;\n      const media = isColor && data.image\n        ? `<span class=\"ai-calc__media\"${data.hex ? ` style=\"--hex:${esc(data.hex)}\"` : ''}><img src=\"${esc(data.image)}\" alt=\"\" width=\"180\" height=\"225\" decoding=\"async\"></span>`\n        : '';\n      const price = (r) => (r.price\n        ? `<span class=\"ai-roll__price\">${r.regular ? `<span class=\"price--wholesale\">${esc(r.price)}</span> <s class=\"price__was\">${esc(r.regular)}</s>` : esc(r.price)}</span>`\n        : '');\n\n      el.innerHTML = `${this.calcHead(s.car)}\n        <div class=\"ai-calc__answer\">\n          <div class=\"ai-calc__figure\">\n            <p class=\"ai-calc__len\" aria-live=\"polite\"><span class=\"ai-calc__ft\">${roll.length_ft}</span> <span class=\"ai-calc__unit\">ft</span></p>\n            <p class=\"ai-calc__what\">${esc(name ? fill(t.of_color, { color: name }) : t.full_wrap)}</p>\n            <p class=\"ai-calc__basis\">${esc(basis)}</p>\n          </div>\n          ${media}\n        </div>\n        ${isColor ? '' : `<div class=\"ai-calc__lines\" role=\"radiogroup\" aria-label=\"${esc(t.line)}\">\n          <button type=\"button\" class=\"chip\" role=\"radio\" aria-checked=\"${rec.line === 'vinyl'}\" data-calc-line=\"vinyl\">${esc(t.line_vinyl)}</button>\n          <button type=\"button\" class=\"chip\" role=\"radio\" aria-checked=\"${rec.line === 'ppf'}\" data-calc-line=\"hyper_ppf\">${esc(t.line_ppf)}</button>\n        </div>`}\n        <div class=\"ai-rolls${rec.rolls.length === 4 ? ' ai-rolls--4' : ''}\" role=\"radiogroup\" aria-label=\"${esc(t.rolls)}\">\n          ${rec.rolls.map((r, i) => `<button type=\"button\" class=\"ai-roll${r.available === false ? ' ai-roll--out' : ''}\" role=\"radio\" aria-checked=\"${i === rec.index}\" data-calc-pick=\"${r.length_ft}\"${r.available === false ? ' aria-disabled=\"true\"' : ''}>\n            <span class=\"ai-roll__ft\">${r.length_ft} ft</span>\n            ${price(r)}\n            ${r.available === false ? `<span class=\"ai-roll__out\">${esc(this.t.sold_out)}</span>` : r.fit ? `<span class=\"ai-roll__hint\">${esc(r.fit)}</span>` : ''}\n          </button>`).join('')}\n        </div>\n        <label class=\"ai-switch\"><input type=\"checkbox\" role=\"switch\" data-calc-first${s.first ? ' checked' : ''}><span class=\"ai-switch__track\" aria-hidden=\"true\"></span><span>${esc(t.first_wrap)}</span></label>\n        ${notes.map((n) => `<p class=\"ai-calc__note\">${esc(n)}</p>`).join('')}\n        ${isColor\n          ? `<button type=\"button\" class=\"btn btn--primary btn--block btn--wrap\" data-calc-add${roll.available === false || !roll.id ? ' disabled' : ''}>${esc(fill(t.add, { length: `${roll.length_ft} ft`, color: name }))}${roll.price ? ` <span class=\"btn__price\">${esc(roll.price)}</span>` : ''}</button>`\n          : `<a class=\"btn btn--primary btn--block\" href=\"${esc(routes.all_products)}\">${esc(t.pick_color)}</a>`}\n        <div class=\"ai-calc__links\">\n          ${isColor ? `<button type=\"button\" class=\"text-btn\" data-calc-chip>${esc(t.chip)}</button>` : ''}\n          ${recent ? `<button type=\"button\" class=\"text-btn\" data-calc-use=\"${esc(recent)}\">${esc(fill(t.use_color, { color: recent.replace(/-/g, ' ') }))}</button>` : ''}\n          <button type=\"button\" class=\"text-btn\" data-calc-panels>${esc(t.panels)}</button>\n          <a class=\"text-btn\" href=\"${esc(routes.installers)}\">${esc(t.installer)}</a>\n        </div>`;\n      el.removeAttribute('aria-busy');\n      this.bindCalcHead(el, entry);\n\n      const update = (patch) => { Object.assign(s, patch); this.saveLocal(); this.paintCalc(entry, el); };\n      el.querySelectorAll('[data-calc-pick]').forEach((b) => b.addEventListener('click', () => {\n        if (b.getAttribute('aria-disabled') === 'true') return;\n        update({ pick: +b.dataset.calcPick });\n      }));\n      el.querySelector('[data-calc-first]').addEventListener('change', (e) => update({ first: e.target.checked, pick: null }));\n      el.querySelectorAll('[data-calc-line]').forEach((b) => b.addEventListener('click', () => update({ line: b.dataset.calcLine, pick: null })));\n      el.querySelector('[data-calc-use]')?.addEventListener('click', (e) => update({ handle: e.currentTarget.dataset.calcUse, pick: null }));\n      el.querySelector('[data-calc-panels]').addEventListener('click', () => this.submit(fill(t.panels_prompt, { car: s.car.label })));\n      el.querySelector('[data-calc-chip]')?.addEventListener('click', (e) => this.addChip(data.handle, data.title || name, null, e.currentTarget));\n      el.querySelector('[data-calc-add]')?.addEventListener('click', async (e) => {\n        const btn = e.currentTarget;\n        btn.setAttribute('aria-busy', 'true');\n        const res = await aura.addToCart(roll.id, 1, { _car: s.car.label, _coverage: 'full', _basis: rec.basis });\n        btn.removeAttribute('aria-busy');\n        const ok = res && res.ok;\n        track('aura_calc_added', { variant_id: roll.id, length_ft: roll.length_ft, partial_ft: null, ok });\n        track('aura_ai_action_executed', { action: 'add_to_cart', ok, undone: false });\n        if (ok) {\n          this.markAssisted();\n          this.addLocal({ kind: 'note', text: fill(t.added, { length: `${roll.length_ft} ft`, color: name }), link: { href: routes.cart, label: this.t.view_cart } });\n        } else {\n          this.addLocal({ kind: 'note', text: (res && res.reason) || this.t.action_failed });\n        }\n      });\n\n      if (!entry.answered) {\n        entry.answered = true;\n        this.saveLocal();\n        track('aura_calc_answered', { length_ft: roll.length_ft, basis: rec.basis, experience: s.first ? 'first' : 'some', line: rec.line });\n        // The answer is the point: bring its top into view, not the bottom of the log\n        requestAnimationFrame(() => { this.log.scrollTop = Math.max(0, el.offsetTop - this.log.offsetTop - 12); });\n      }\n    }\n\n    calcHead(car) {\n      return `<header class=\"ai-calc__head\"><p class=\"lbl\">${esc(this.t.calc.title)}</p><p class=\"ai-calc__car\">${esc(car.label)} <button type=\"button\" class=\"text-btn\" data-calc-change>${esc(this.t.calc.change)}</button></p></header>`;\n    }\n\n    bindCalcHead(el, entry) {\n      el.querySelector('[data-calc-change]').addEventListener('click', () => {\n        aura.setCar(false);\n        this.renderContext();\n        this.askCar(entry.state.handle);\n      });\n    }\n\n    /* ---------- closed state: the bar asks a question, which a tip takes over for a while ---------- */\n    /* The questions this shopper is likeliest to ask here, best first: this page's own, then what we know\n       about them (a recent order, a roll in the cart, colors viewed, their car, a shop account). Each has its\n       wordings longest first; the bar shows the longest that fits, and a click asks the longest. Each also has a\n       plain wording for the peek, without the color's name (\"How much do I need for my car?\"); compares have none */\n    barQuestions() {\n      const a = this.t.ask || {};\n      const p = this.product;\n      const type = cfg.page_type || '';\n      const car = garage();\n      const carName = car ? car.model || car.label : null;\n      const names = viewedNames();\n      const seen = viewed().filter((h) => names[h] && h !== cfg.product_handle).reverse().map((h) => ({ handle: h, name: names[h] }));\n      const shop = this.isShop || this.audience() === 'shop';\n      const roll = cfg.cart_roll && parseInt(cfg.cart_roll.length, 10) ? cfg.cart_roll : null;\n      const list = [];\n      const words = (k, vars) => [fill(a[k], vars), a[`${k}_short`] && fill(a[`${k}_short`], vars)];\n      const ask = (kind, texts, opts = {}) => {\n        const t = texts.filter(Boolean);\n        list.push({\n          kind, key: opts.key || kind, strict: !!opts.strict, texts: t, run: opts.run || ((text) => this.submit(text)),\n          peek: opts.peek !== undefined ? opts.peek : t.find((x) => x.length <= 36) || t[t.length - 1]\n        });\n      };\n      // Away from the color's own page, a name too long for the line skips the question\n      const carPeek = carName && fill(a.peek_calc_car, { car: carName });\n      const calc = (handle, color) => ask('calc', [carName && fill(a.calc_car, { color, car: carName }), fill(a.calc, { color }), fill(a.calc_short, { color })], {\n        key: `calc:${handle}`, strict: handle !== cfg.product_handle, run: (text) => this.openCalculator({ handle, surface: 'bar', said: text }),\n        peek: carPeek && carPeek.length <= 36 ? carPeek : a.peek_calc\n      });\n      const compare = (x, y) => ask('compare', [fill(a.compare, { a: x, b: y }), fill(a.compare_short, { a: x, b: y })], { key: `compare:${[x, y].sort().join('|')}`, strict: true, peek: null });\n      const enough = () => {\n        const length = `${parseInt(roll.length, 10)} ft`;\n        ask('enough', [carName && fill(a.enough_car, { length, color: roll.name, car: carName }), fill(a.enough, { length, color: roll.name }), fill(a.enough_short, { length })], {\n          key: `calc:${roll.handle}`, run: (text) => this.openCalculator({ handle: roll.handle, surface: 'bar', said: text }), peek: fill(a.enough_short, { length })\n        });\n      };\n      const order = () => ask('order', [cfg.recent_order && fill(a.order, { order: cfg.recent_order }), a.order_short]);\n\n      if (this.isColor) {\n        calc(p.handle, p.name);\n        if (seen[0]) compare(p.name, seen[0].name);\n        const title = p.title.toLowerCase();\n        if (title.includes('ultra gloss')) ask('ultra_gloss', words('ultra_gloss'));\n        else if (title.includes('clear ppf') || title.includes('crystal clear')) ask('clear_ppf', words('clear_ppf'));\n        else if (title.includes('ppf')) ask('ppf_vinyl', words('ppf_vinyl'));\n        ask('sample', words('sample', { color: p.name }), { key: `sample:${p.handle}`, peek: a.sample_short });\n        ask('last', words('last', { color: p.name }), { key: `last:${p.handle}`, peek: a.last_short });\n        ask('install', words('install'));\n      } else if (p) {\n        // Until aura.kind is set on every product (spec 01), the title stands in\n        const k = p.kind !== 'other' ? p.kind\n          : /warranty/i.test(p.title) ? 'warranty' : /sample|swatch/i.test(p.title) ? 'sample'\n          : /tool|squeegee|knife|glove|heat gun|magnet/i.test(p.title) ? 'tool' : /ceramic|clean|care/i.test(p.title) ? 'care' : null;\n        const kinds = { tool: 'tools', care: 'care', sample: 'samples', swatch_book: 'samples', partial: 'hood_roof', warranty: 'warranty' };\n        if (cfg.template_suffix === 'warranty') ask('warranty', words('warranty'));\n        if (kinds[k]) ask(kinds[k], words(kinds[k]));\n      } else if (type === 'search' && cfg.search && cfg.search.terms) {\n        const q = cfg.search.terms;\n        if (!cfg.search.count) ask('search_empty', [fill(a.search_empty, { q })], { key: `find:${q}`, run: () => this.findLike(q) });\n        else ask('search', words('search', { q }), { key: `search:${q}`, peek: a.peek_popular });\n      } else if (type === 'collection') {\n        if (seen[1]) compare(seen[0].name, seen[1].name);\n        const c = cfg.context_label;\n        if (c && cfg.handle !== 'all') {\n          ask('collection', [carName && fill(a.collection_car, { collection: c, car: carName }), ...words('collection', { collection: c })], { key: `collection:${cfg.handle}`, peek: a.peek_popular });\n        }\n      } else if (type === 'cart') {\n        if (roll) enough();\n        ask('ship', words('ship'));\n        if (roll) ask('tools', words('tools'));\n      } else if (type === 'page') {\n        // By template, else by the live store's page handles (most pages are on the default template)\n        const pages = {\n          calculator: ['hood_roof'], ppf: ['ppf_vinyl'], 'hyper-ppf': ['ppf_vinyl'], 'clear-ppf': ['clear_ppf'], vinyl: ['cast'],\n          installers: ['installer'], 'sca-storelocator': ['installer'], 'shop-locator': ['installer'],\n          pros: ['shop_pricing', 'batch'], 'shop-pricing': ['shop_pricing', 'batch'], 'shop-sign-up': ['shop_pricing', 'batch'],\n          'wrap-classes': ['classes', 'diy'], 'wrap-academy': ['classes', 'diy'], faq: ['install'],\n          'swatch-chip-page': ['samples'], 'swatch-chip-request': ['samples'],\n          guides: ['tools'], 'wrap-guides': ['tools'], 'install-tips': ['tools'], 'long-term-care': ['care'],\n          contact: ['order'], support: ['order'], 'shipping-notice': ['ship'], 'shipping-notification': ['ship']\n        };\n        (pages[cfg.template_suffix] || pages[cfg.handle] || []).forEach((k) => {\n          if (k === 'order') order();\n          else if (!(k === 'shop_pricing' && cfg.trade)) ask(k, words(k));\n        });\n      }\n\n      // Then what we know about them, on any page\n      if (cfg.recent_order) order();\n      if (roll) enough();\n      if (seen[1] && !this.isColor) compare(seen[0].name, seen[1].name);\n      if (seen[0] && !this.isColor) calc(seen[0].handle, seen[0].name);\n      if (carName) ask('suits_car', words('suits_car', { car: carName }));\n      if (shop) {\n        if (!cfg.trade) ask('shop_pricing', words('shop_pricing'));\n        ask('batch', words('batch'));\n      }\n      ask('pick', words('pick'));\n      if (!shop) ask('diy', words('diy'));\n      return list;\n    }\n\n    /* The first question not yet asked this session; with none left, the bar's placeholder opens the panel */\n    setBarText() {\n      clearTimeout(this.tipTimer);\n      this.bar.classList.remove('is-tip');\n      const asked = json(ss.get('aura.bar.asked'), []);\n      const q = this.barQuestions().find((c) => c.texts.length && !asked.includes(c.key) && this.fitBar(c));\n      this.barKind = q ? `ask_${q.kind}` : 'bar';\n      this.barRun = q ? () => this.prefill(q.texts[0], (text) => { this.markAsked(q.key); q.run(text); this.setBarText(); }) : null;\n      if (!q) this.barText.textContent = this.dataset.placeholder;\n      else if (q.key !== this.barShown) { this.barShown = q.key; track('aura_ai_suggestion_shown', { kind: this.barKind }); }\n    }\n\n    /* Puts the longest wording that fits in the bar's line. Where the line is hidden (tablets, the round button)\n       34 characters stand in for its width. False when nothing fits and the question needs all its words. */\n    fitBar(q) {\n      const el = this.barText;\n      for (const text of q.texts) {\n        el.textContent = text;\n        if (el.clientWidth > 1 ? el.scrollWidth <= el.clientWidth : text.length <= 34) return true;\n      }\n      return !q.strict;\n    }\n\n    /* The bar's question waits in the input until Send. Where the input takes focus (beside the page) it is\n       selected, so typing replaces it */\n    async prefill(text, run) {\n      this.pending = { text, run };\n      this.input.value = text;\n      await this.open({ trigger: 'bar' });\n      if (document.activeElement === this.input && this.pending) this.input.select();\n    }\n\n    markAsked(key) {\n      const asked = json(ss.get('aura.bar.asked'), []).filter((k) => k !== key);\n      ss.set('aura.bar.asked', JSON.stringify(asked.concat(key).slice(-30)));\n    }\n\n    /* \"Model Y: 58 ft of Viper Green\" for the bar and tips, from the live rolls */\n    async carLine(handle, car) {\n      try {\n        const [calc, data] = await Promise.all([this.loadCalc(), this.variants(handle)]);\n        if (!data || data.kind !== 'color') return null;\n        const rec = calc.recommend({ body: car.body, line: data.line, rolls: data.rolls, guide: car.guide });\n        if (!rec || rec.custom) return null;\n        return { car: car.model || car.label, length: `${rec.fits_ft} ft`, color: data.name, fits_ft: rec.fits_ft };\n      } catch (e) { return null; }\n    }\n\n    /* A tip in the bar's line for 14 seconds; a click on the bar runs it, then the bar's own line returns */\n    showTip({ kind, text, run, force }) {\n      if (this.panel.open || !text) return false;\n      if (!force && this.tipShown) return false;\n      this.tipShown = true;\n      this.endPeek(true);\n      this.barKind = kind;\n      this.barRun = run;\n      this.barText.textContent = text;\n      this.bar.classList.add('is-tip');\n      clearTimeout(this.tipTimer);\n      this.tipTimer = setTimeout(() => this.setBarText(), 14000);\n      track('aura_ai_suggestion_shown', { kind });\n      return true;\n    }\n\n    /* The peek: where the bar is folded into the chat button (phones, product pages under 1024px, short screens),\n       it slides open with this page's question soon after every other page loads (the first, third, ...), holds a\n       few seconds and slides shut, so shoppers see what the button is for. A click while it is open puts the\n       question in the input, as the bar does */\n    peek() {\n      const bar = this.bar;\n      if (this.panel.open || bar.classList.contains('is-tip') || !bar.getClientRects().length) return;\n      if (bar.offsetWidth > 60 || getComputedStyle(bar).visibility === 'hidden') return;\n      const pages = (+ss.get('aura.peek.pages') || 0) + 1;\n      ss.set('aura.peek.pages', String(pages));\n      if (pages % 2 === 0) return;\n      // Each page view takes the next of this page's questions not yet asked, in its plain wording; a click puts\n      // the full one in the input (\"How long will Rose Pink last?\")\n      const asked = json(ss.get('aura.bar.asked'), []);\n      const list = this.barQuestions().filter((q, i, all) => q.peek && !asked.includes(q.key) && all.findIndex((x) => x.key === q.key) === i);\n      if (list.length) {\n        const n = +ss.get('aura.peek.n') || 0;\n        ss.set('aura.peek.n', String(n + 1));\n        const q = list[n % list.length];\n        this.barText.textContent = q.peek;\n        this.barKind = `peek_${q.kind}`;\n        this.barRun = () => this.prefill(q.texts[0], (text) => { this.markAsked(q.key); q.run(text); this.setBarText(); });\n        track('aura_ai_suggestion_shown', { kind: this.barKind });\n      }\n      const from = bar.offsetWidth;\n      bar.classList.add('is-peek');\n      this.peekTimer = setTimeout(() => this.endPeek(), 4500);\n      if (reduceMotion()) return;\n      const shut = `inset(-100px -100px -100px ${bar.offsetWidth - from}px)`;\n      bar.animate([{ clipPath: shut }, { clipPath: 'inset(-100px)' }], { duration: 520, easing: EASE });\n      this.barText.animate([{ opacity: 0, transform: 'translateX(24px)' }, { opacity: 1, transform: 'none' }], { duration: 520, easing: EASE });\n    }\n\n    /* Slides the peek shut, or drops it at once (now: the panel opens or a tip takes the line) */\n    endPeek(now) {\n      clearTimeout(this.peekTimer);\n      const bar = this.bar;\n      if (!bar.classList.contains('is-peek')) return;\n      const done = () => {\n        bar.classList.remove('is-peek');\n        bar.getAnimations().concat(this.barText.getAnimations()).forEach((a) => a.cancel());\n        this.setBarText();\n      };\n      if (now || reduceMotion()) { done(); return; }\n      const open = bar.offsetWidth;\n      bar.classList.remove('is-peek');\n      const from = bar.offsetWidth;\n      bar.classList.add('is-peek');\n      this.barText.animate([{ opacity: 1 }, { opacity: 0 }], { duration: 240, easing: 'ease-in', fill: 'forwards' });\n      bar.animate([{ clipPath: 'inset(-100px)' }, { clipPath: `inset(-100px -100px -100px ${open - from}px)` }], { duration: 460, easing: EASE, fill: 'forwards' })\n        .finished.then(done, () => {});\n    }\n\n    /* A local tip: off when tips are off, or past 4 a session */\n    tip(kind, text, run, force) {\n      if (!this.tipsOn() || this.panel.open) return false;\n      const count = +ss.get('aura.tips.count') || 0;\n      if (count >= 4) return false;\n      const shown = this.showTip({ kind, text, run: run || (() => this.open({ trigger: 'suggestion' })), force });\n      if (shown) ss.set('aura.tips.count', String(count + 1));\n      return shown;\n    }\n\n    findLike(terms) {\n      return this.submit(fill(this.t.tips.find_like, { q: terms }));\n    }\n\n    /* ---------- reacting to the page ---------- */\n    recordView() {\n      if (!this.isColor) return;\n      let list = viewed().filter((h) => h !== this.product.handle);\n      list.push(this.product.handle);\n      list = list.slice(-8);\n      ls.set('aura_viewed', JSON.stringify(list));\n      const names = Object.assign(viewedNames(), { [this.product.handle]: this.product.name });\n      ls.set('aura.viewed.names', JSON.stringify(Object.fromEntries(list.filter((h) => names[h]).map((h) => [h, names[h]]))));\n    }\n\n    watchPage() {\n      const tips = this.t.tips;\n      const color = this.product && this.product.name;\n\n      if (this.isColor) {\n        // 20 seconds on a color: the length for the saved car, or an offer to size it (spec 14)\n        setTimeout(async () => {\n          const car = garage();\n          if (car) {\n            const line = await this.carLine(this.product.handle, car);\n            if (line && !ss.get(`aura.tip.car.${this.product.handle}`)) {\n              ss.set(`aura.tip.car.${this.product.handle}`, '1');\n              this.tip('pdp_car', fill(tips.pdp_car, line), () => this.openCalculator({ surface: 'suggestion' }));\n            }\n          } else if (!ss.get('aura.calc.used')) {\n            this.tip('pdp_dwell', tips.pdp, () => this.openCalculator({ surface: 'suggestion' }));\n          }\n        }, 20000);\n\n        // A length picked on the tiles: warn when it looks short for the saved car\n        let changes = 0;\n        document.addEventListener('change', async (e) => {\n          const input = e.target.closest('[data-length-cards] input[data-length-ft]');\n          if (!input) return;\n          changes += 1;\n          const picked = +input.dataset.lengthFt;\n          const car = garage();\n          if (car && picked) {\n            const line = await this.carLine(this.product.handle, car);\n            if (line && picked < line.fits_ft) this.tip('pdp_short', fill(tips.pdp_short, { ...line, picked: `${picked} ft` }), () => this.openCalculator({ surface: 'suggestion' }), true);\n          } else if (!car && changes === 2) {\n            this.tip('pdp_torn', tips.pdp_torn, () => this.openCalculator({ surface: 'suggestion' }));\n          }\n        });\n\n        // Back from the explorer: how much of the color they just looked at\n        document.getElementById('aura-explorer')?.addEventListener('close', () => {\n          if (!ss.get('aura.calc.used')) this.tip('explorer', fill(tips.explorer, { color }), () => this.openCalculator({ surface: 'explorer' }));\n        });\n      }\n\n      // Filters changed three times on a collection or search page: offer to narrow it down\n      const filters = document.querySelector('aura-filters');\n      if (filters) {\n        let n = 0;\n        filters.addEventListener('change', () => {\n          n += 1;\n          if (n === 3) this.tip('filters', tips.filters, () => this.open({ trigger: 'suggestion' }).then(() => this.addLocal({ kind: 'bot', text: tips.filters_reply })));\n        });\n      }\n\n      // Empty search: describe it instead\n      if (cfg.page_type === 'search' && cfg.search && cfg.search.terms && !cfg.search.count) {\n        setTimeout(() => this.tip('search_empty', fill(tips.search_empty, { q: cfg.search.terms }), () => this.findLike(cfg.search.terms)), 4000);\n      }\n\n      // A roll added that looks short for the saved car\n      document.addEventListener('aura:cart', async (e) => {\n        const item = e.detail && e.detail.data;\n        const car = garage();\n        if (!item || !car || !item.handle || !/ft/i.test(item.variant_title || '')) return;\n        const picked = parseInt(item.variant_title, 10);\n        const line = await this.carLine(item.handle, car);\n        if (line && picked && picked < line.fits_ft) {\n          this.tip('cart_short', fill(tips.pdp_short, { ...line, picked: `${picked} ft` }), () => this.openCalculator({ handle: item.handle, surface: 'cart' }), true);\n        }\n      });\n\n      if (!this.backend) return;\n\n      // Two or three colors viewed: the backend's color-browse message (today's widget, same rules)\n      setTimeout(() => this.colorBrowse(), 1200);\n      // On the cart page: today's cart nudge (the deal first, care after)\n      if (cfg.page_type === 'cart') setTimeout(() => this.cartNudge(), 1500);\n      // Time on the page: the backend decides whether one short message helps (today's timings)\n      const delay = { product: 22000, cart: 12000, collection: 28000 }[cfg.page_type] || 35000;\n      const event = { product: 'product_dwell', cart: 'cart_view', collection: 'collection_browse' }[cfg.page_type] || 'page_dwell';\n      setTimeout(() => this.proactive({ event }), delay);\n    }\n\n    backendNudgeAllowed() {\n      return this.tipsOn() && !this.tipShown && !this.panel.open && canNudgeToday() && !pendingReply();\n    }\n\n    async proactive(signals) {\n      if (!this.backendNudgeAllowed()) return;\n      const pageContext = await this.context();\n      const d = await this.post('/api/proactive', { sessionId: sessionId(), pageContext, signals: { ...signals, timeOnPageMs: Date.now() - this.pageStart } });\n      if (!d || !d.proactive || !d.proactive.message) return;\n      markNudgeToday();\n      if (explorerPitch({ ...d.proactive, proactive: true })) return;\n      setPending(true);\n      this.showBackendTip(d.proactive.message, signals.event);\n    }\n\n    async colorBrowse() {\n      const list = viewed();\n      if (list.length < 2 || !this.isColor) return;\n      const milestone = list.length >= 3 ? 3 : 2;\n      if (ss.get(`aura_color_milestone_${milestone}`) || !this.backendNudgeAllowed()) return;\n      const pageContext = await this.context();\n      pageContext.viewedSlugs = list;\n      const d = await this.post('/api/proactive', {\n        sessionId: sessionId(), pageContext,\n        signals: { event: 'color_browse', viewedCount: list.length, viewedSlugs: list, milestone }\n      });\n      if (!d || !d.proactive || !d.proactive.message) return;\n      ss.set(`aura_color_milestone_${milestone}`, '1');\n      markNudgeToday();\n      if (explorerPitch({ ...d.proactive, proactive: true })) return;\n      setPending(true);\n      this.showBackendTip(d.proactive.message, 'color_browse');\n    }\n\n    async cartNudge() {\n      if (!this.backendNudgeAllowed()) return;\n      const pageContext = await this.context();\n      if (!pageContext.cartItems.length) return;\n      const d = await this.post('/api/cart-nudge', {\n        cartItems: pageContext.cartItems, hasLead: pageContext.hasLead, isShopAccount: this.isShop, audienceType: pageContext.audienceType\n      });\n      if (!d || !d.shouldNudge || !d.message) return;\n      markNudgeToday();\n      // The cart nudge is not stored in the transcript: it joins the conversation when the shopper opens it\n      this.showBackendTip(d.message, 'cart_nudge', () => this.open({ trigger: 'suggestion' }).then(() => this.addLocal({ kind: 'bot', text: d.message })));\n    }\n\n    showBackendTip(message, kind, run) {\n      const shown = this.showTip({ kind, text: stripLinks(message), run: run || (() => this.open({ trigger: 'suggestion' })) });\n      if (!shown) this.unread.hidden = false;\n    }\n  }\n\n  /* A prerendered page starts once the shopper opens it: no view recorded and no nudge shown unseen (theme.liquid\n     window.auraShown) */\n  (window.auraShown || Promise.resolve()).then(() => {\n    if (!customElements.get('aura-chat')) customElements.define('aura-chat', AuraChat);\n  });\n})();\n"],
  "mappings": "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",
  "names": []
}
