{
  "version": 3,
  "sources": ["/cdn/shop/t/80/assets/cf-recently-viewed.js?n=1790907603185"],
  "sourcesContent": ["/**\n * Recently viewed cities \u2014 the section (sections/recently-viewed-cities.liquid).\n * ---------------------------------------------------------------------------\n *\n * The history is the one `cf-recent-cities.js` keeps for the header menus: per\n * brand, newest first, one entry per city with its variant id and product\n * handle. This merges the brands into one list by time, keeps the products the\n * section was narrowed to, leaves out the city the page itself is showing, and\n * asks the section for a card per city.\n *\n * Each card comes from the Section Rendering API at the city's own URL \u2014\n * /products/<handle>?variant=<id>&section_id=<this section> \u2014 where the section\n * renders nothing but that card, in a <template>. One request per city, run\n * side by side at low priority, and kept in sessionStorage for the visit, so\n * the next page that shows the row draws it without asking again. The key\n * carries the country and currency: the price on the card is the market's.\n *\n * Custom location designs come from the visitor's \"Your Designs\" instead\n * (cf_cube_designs_r1 / cf_frame_designs_r1). A design has no page of its own\n * to render a card at, so the section ships one empty design card per custom\n * product and this fills a copy per design: its step-3 product shot, country, place, and links\n * that reopen that design on step 2, as the notification's View link does. The\n * section leaves a product's card out when the row is narrowed to others, which\n * is how the filter reaches the designs. A design counts from when it was\n * generated.\n *\n * The row arrives as a <template> of its own and is printed as soon as the\n * history is known, with a stand-in card (the empty product on the grey tile,\n * snippets/product-card-skeleton) where each city will be, so the carousel\n * connects to a full row; each card replaces its stand-in as it arrives. The\n * stand-in is the kind of product the card will be - an empty FRAME for a\n * FRAME, an empty CUBE for a CUBE (Alex, 2026-10-15) - by the menu row the city\n * was recorded in (cf-recent-cities.js) or the design's kind.\n */\n(() => {\n  if (window.customElements.get('cf-recently-viewed')) return;\n\n  // v2 (2026-10-06): trios, the Set, Custom Location and the clearance CUBEs moved to the CUBE card; a session that\n  // had stored their old generic cards would otherwise keep drawing them.\n  const CACHE_PREFIX = 'cf:recent-card:v2:';\n  const CARDS_MARKER = '<!--cf-recent-cards-->';\n  const DESIGN_KINDS = ['cube', 'frame'];\n  // The history's menu rows, as the stand-ins name them: a 'trio' entry is a CUBE Set. Any other row is a CUBE's.\n  const STAND_IN_KINDS = { cube: 'cube', trio: 'set', collection: 'set', frame: 'frame', grand: 'grand', blok: 'blok' };\n  const root = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';\n\n  /** Keys for a city ('v' + variant id) and a design ('d' + design id), so the two never collide. */\n  const cityKey = (entry) => 'v' + String(entry.id);\n  const designKey = (design) => 'd' + String(design.design_id);\n\n  /** The city or design on screen \u2014 its own row would only point back at it. */\n  function onScreen() {\n    const keys = new Set();\n    const blob = document.querySelector('script[data-cf-recent-city]');\n\n    if (blob) {\n      try {\n        keys.add(cityKey(JSON.parse(blob.textContent)));\n      } catch (e) {\n        // A malformed blob only means nothing is left out\n      }\n    }\n\n    const params = new URLSearchParams(window.location.search);\n    if (params.get('variant')) keys.add(cityKey({ id: params.get('variant') }));\n    if (params.get('design')) keys.add(designKey({ design_id: params.get('design') }));\n\n    return keys;\n  }\n\n  function readDesigns(kind) {\n    try {\n      const list = JSON.parse(localStorage.getItem(`cf_${kind}_designs_r1`));\n      return Array.isArray(list) ? list : [];\n    } catch (e) {\n      return [];\n    }\n  }\n\n  /** Cities and designs together, newest first: { city, kind, t } or { design, kind, t }. */\n  function history(element, handles, exclude, limit) {\n    const store = (window.CFRecentCities && window.CFRecentCities.read()) || {};\n    const all = [];\n\n    Object.keys(store).forEach((brand) => {\n      (store[brand] || []).forEach((entry) => {\n        if (!entry.h) return;\n        if (handles.length > 0 && !handles.includes(entry.h)) return;\n        all.push({ city: entry, kind: STAND_IN_KINDS[brand] || 'cube', key: cityKey(entry), t: entry.t });\n      });\n    });\n\n    DESIGN_KINDS.forEach((kind) => {\n      // No card for this product: the row is narrowed to others.\n      if (!element.querySelector(`template[data-cf-design-card=\"${kind}\"]`)) return;\n\n      readDesigns(kind).forEach((design) => {\n        if (!design || !design.design_id) return;\n        all.push({ design: design, kind: kind, key: designKey(design), t: Date.parse(design.created_at) || 0 });\n      });\n    });\n\n    all.sort((a, b) => b.t - a.t);\n\n    const seen = new Set();\n    const picked = [];\n\n    for (const item of all) {\n      if (seen.has(item.key) || exclude.has(item.key)) continue;\n\n      seen.add(item.key);\n      picked.push(item);\n      if (picked.length >= limit) break;\n    }\n\n    return picked;\n  }\n\n  /** The same link \"Your Designs\" shares and the notification opens: the design first, its geometry as the fallback. */\n  function designHref(base, design) {\n    const url = new URL(base, window.location.origin);\n    url.searchParams.set('design', design.design_id);\n\n    ['lat', 'lon', 'scale', 'rotation'].forEach((key) => {\n      const value = Number(design[key]);\n      if (design[key] !== undefined && design[key] !== null && Number.isFinite(value)) url.searchParams.set(key, value);\n    });\n\n    url.searchParams.set('saved', '1');\n    return url.pathname + url.search;\n  }\n\n  /**\n   * Whether a picture is there, asked before the row is drawn rather than left to the card: the cards load lazily,\n   * so a missing one would otherwise drop out of the row as it scrolled into view. No answer in time counts as no\n   * picture \u2014 see designPictures for why a guess is not good enough here.\n   */\n  function pictureLoads(src, waitMs) {\n    return new Promise((resolve) => {\n      const probe = new Image();\n      const timer = setTimeout(() => resolve(false), waitMs);\n      probe.onload = () => {\n        clearTimeout(timer);\n        resolve(true);\n      };\n      probe.onerror = () => {\n        clearTimeout(timer);\n        resolve(false);\n      };\n      probe.src = src;\n    });\n  }\n\n  /**\n   * THE STEP-3 PRODUCT SHOT, not `preview_url`. The shot is the regular (model) composite on the CUBE or in the\n   * FRAME, 1200x1500 \u2014 the same kind of picture a catalogue city's card carries, and what \"Your Designs\" and the\n   * Individual Collection's slots show. `preview_url` is the angled render from the map step: a different shot of a\n   * different thing.\n   *\n   * Asked as addon-400.jpg first, as those two do: the API's unsized addon.jpg falls back to that angled render,\n   * with a 200, while the composite is still being made, and the sized one 404s honestly instead. Once the 400 has\n   * loaded the composite exists, so the full one can no longer fall back, and the card offers both. A design whose\n   * shot is not there \u2014 still rendering, or evicted \u2014 stays out of the row until it is.\n   */\n  async function designPictures(previewApi, design) {\n    if (!previewApi) return null;\n\n    // f=45: the shot turned 4:5 on 2026-10-01 under the same name; a new URL is never served stale.\n    const base = `${previewApi}/img/${encodeURIComponent(design.design_id)}`;\n    const small = `${base}/addon-400.jpg?f=45`;\n    const full = `${base}/addon.jpg?f=45`;\n\n    if (!(await pictureLoads(small, 6000))) return null;\n    return { src: full, srcset: `${small} 400w, ${full} 1200w` };\n  }\n\n  /**\n   * A design's card, from the section's empty one. The place comes off the\n   * geocoded parts where the configurator stored them; a design the notifier\n   * buffered has only \"City, Country\" in place_name, split back here.\n   */\n  async function designCard(element, item, previewApi) {\n    const template = element.querySelector(`template[data-cf-design-card=\"${item.kind}\"]`);\n    const source = template && template.content.firstElementChild;\n    if (!source) return '';\n\n    const design = item.design;\n    const card = source.cloneNode(true);\n    const href = designHref(template.dataset.url, design);\n    const parts = String(design.place_name || '').split(',').map((part) => part.trim()).filter(Boolean);\n    const city = design.city || parts[0] || '';\n    const country = design.country || parts.slice(1).join(', ');\n\n    const pictures = await designPictures(previewApi, design);\n    if (!pictures) return '';\n\n    card.querySelectorAll('[data-cf-design-link]').forEach((link) => link.setAttribute('href', href));\n\n    const image = card.querySelector('[data-cf-design-image]');\n    if (image) {\n      image.setAttribute('src', pictures.src);\n      image.setAttribute('srcset', pictures.srcset);\n      image.setAttribute('alt', city);\n    }\n\n    const cityLine = card.querySelector('[data-cf-design-city]');\n    if (cityLine) cityLine.textContent = city;\n\n    // The flag after the country, as the catalogue cards carry it (their country names end in one). Built from the\n    // geocoded ISO code, which the configurator stores; a design the notifier buffered has none and goes without.\n    const code = String(design.country_code || '').trim().toUpperCase();\n    const flag = /^[A-Z]{2}$/.test(code)\n      ? ' ' + String.fromCodePoint(...Array.from(code, (letter) => 0x1f1e6 + letter.charCodeAt(0) - 65))\n      : '';\n\n    // The tile carries the flag after the place, as a catalogue tile does (card-flag), and no country line; with no\n    // code there is no flag, and the slot goes.\n    const flagSlot = card.querySelector('[data-cf-design-flag]');\n    if (flagSlot) {\n      if (flag) {\n        flagSlot.textContent = flag.trim();\n        flagSlot.setAttribute('aria-label', country || code);\n        flagSlot.setAttribute('title', country || code);\n        flagSlot.removeAttribute('hidden');\n      } else {\n        flagSlot.remove();\n      }\n    }\n\n    // No country: the line keeps its room, the way a catalogue card's does.\n    const countryLine = card.querySelector('[data-cf-design-country]');\n    if (countryLine) {\n      if (country) {\n        countryLine.textContent = country + flag;\n      } else {\n        countryLine.textContent = '.';\n        countryLine.style.opacity = '0';\n        countryLine.setAttribute('aria-hidden', 'true');\n      }\n    }\n\n    return card.outerHTML;\n  }\n\n  function cacheKey(sectionId, id) {\n    const shopify = window.Shopify || {};\n    const currency = shopify.currency && shopify.currency.active;\n    return CACHE_PREFIX + [sectionId, root, shopify.country, currency, id].join('|');\n  }\n\n  /**\n   * The card's markup, or '' when there is none to draw \u2014 a variant that has\n   * since been removed renders no template. That answer is kept too, so a dead\n   * entry is asked about once per visit rather than on every page.\n   *\n   * Not cached in the theme editor, where a changed setting changes the card.\n   */\n  async function fetchCard(sectionId, entry, useCache) {\n    const key = cacheKey(sectionId, entry.id);\n\n    if (useCache) {\n      try {\n        const hit = sessionStorage.getItem(key);\n        if (hit !== null) return hit;\n      } catch (e) {\n        // Storage blocked: ask the server every time\n      }\n    }\n\n    let markup = '';\n\n    try {\n      const url = `${root}products/${encodeURIComponent(entry.h)}?variant=${encodeURIComponent(entry.id)}&section_id=${encodeURIComponent(sectionId)}`;\n      const response = await fetch(url, { priority: 'low' });\n      if (!response.ok) return '';\n\n      const doc = new DOMParser().parseFromString(await response.text(), 'text/html');\n      const card = doc.querySelector(`template[data-cf-recent-card=\"${String(entry.id)}\"]`);\n      markup = card ? card.innerHTML.trim() : '';\n    } catch (e) {\n      return ''; // Offline or aborted: try again on the next page\n    }\n\n    if (useCache) {\n      try {\n        sessionStorage.setItem(key, markup);\n      } catch (e) {\n        // Full or blocked: the card is still drawn this time\n      }\n    }\n\n    return markup;\n  }\n\n  class RecentlyViewedCities extends HTMLElement {\n    connectedCallback() {\n      if (this._started) return;\n      this._started = true;\n\n      // cf-recent-cities.js records the page's own city when it runs; both are\n      // deferred and it comes first, but wait for the document either way.\n      if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', () => this.load(), { once: true });\n      } else {\n        this.load();\n      }\n    }\n\n    async load() {\n      const section = this.closest('.shopify-section');\n      const block = this.closest('[data-cf-recent-root]');\n      const shell = this.querySelector('template[data-cf-recent-shell]');\n      if (!section || !block || !shell) return;\n\n      const sectionId = section.id.replace('shopify-section-', '');\n      const handles = (this.getAttribute('handles') || '').split(',').map((handle) => handle.trim()).filter(Boolean);\n      const limit = parseInt(this.getAttribute('products-count'), 10) || 10;\n      const useCache = !(window.Shopify && window.Shopify.designMode);\n      const previewApi = (this.getAttribute('preview-api') || '').replace(/\\/$/, '');\n\n      const items = history(this, handles, onScreen(), limit);\n\n      // No history: live, the section stays hidden; in the editor, the stand-ins stay.\n      if (items.length === 0) return;\n\n      // The row at once, a stand-in (the empty product on the grey tile) where each city will be, rather than\n      // nothing until every card has arrived: the visitor's history is known now, and the cards follow as they come.\n      const standIn = (kind) => {\n        const skeleton =\n          this.querySelector(`template[data-cf-recent-skeleton=\"${kind}\"]`) ||\n          this.querySelector('template[data-cf-recent-skeleton=\"cube\"]');\n        return skeleton ? skeleton.innerHTML.trim() : '';\n      };\n\n      const placeholder = this.querySelector('[data-cf-recent-placeholder]');\n      if (placeholder) placeholder.remove();\n\n      this.insertAdjacentHTML('beforeend', shell.innerHTML.replace(CARDS_MARKER, items.map((item) => standIn(item.kind)).join('')));\n      block.hidden = false;\n\n      const slots = Array.from(this.querySelectorAll('[data-cf-recent-slot] > .product-card--skeleton'));\n\n      await Promise.all(\n        items.map(async (item, index) => {\n          const markup = item.city ? await fetchCard(sectionId, item.city, useCache) : await designCard(this, item, previewApi);\n          place(slots[index], markup);\n        })\n      );\n\n      // Nothing to show after all (every city since removed, every design's picture missing): the section goes.\n      if (!this.querySelector('[data-cf-recent-slot] product-card:not(.product-card--skeleton)')) block.hidden = true;\n\n      /**\n       * A city's card in its stand-in's place. The row has already come into view, so the card's own fade-in\n       * (reveal-on-scroll, which starts it invisible) would never run: it comes in as it is.\n       */\n      function place(slot, markup) {\n        if (!slot || !slot.isConnected) return;\n        if (!markup) {\n          slot.remove();\n          return;\n        }\n\n        // Through a <template>, as insertAdjacentHTML did: markup parsed there runs no scripts.\n        const holder = document.createElement('template');\n        holder.innerHTML = markup;\n        const fragment = holder.content;\n        fragment.querySelectorAll('[reveal-on-scroll]').forEach((element) => element.removeAttribute('reveal-on-scroll'));\n\n        // A design whose picture failed after all (see designPictures) leaves the row, as it leaves \"Your Designs\";\n        // and the section with it, if it was the only card.\n        fragment.querySelectorAll('[data-cf-design-image]').forEach((image) => {\n          image.addEventListener(\n            'error',\n            () => {\n              const card = image.closest('product-card');\n              if (card) card.remove();\n              if (!block.querySelector('[data-cf-recent-slot] product-card')) block.hidden = true;\n            },\n            { once: true }\n          );\n        });\n\n        slot.replaceWith(fragment);\n      }\n    }\n  }\n\n  window.customElements.define('cf-recently-viewed', RecentlyViewedCities);\n})();\n"],
  "mappings": "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",
  "names": []
}
