{
  "version": 3,
  "sources": ["/cdn/shop/t/9/assets/homepage-orbe.js?b=20260808b"],
  "sourcesContent": ["/* Orbe Paris \u2014 carrousel avis (auto-scroll + navigation par fl\u00E8ches)\n   L'autoplay ne tourne QUE quand toutes ces conditions sont r\u00E9unies :\n   carrousel visible dans le viewport (IntersectionObserver), pas de\n   prefers-reduced-motion, et aucune interaction en cours (hover, focus\n   clavier dans la section, touch, ou r\u00E9pit apr\u00E8s un clic de fl\u00E8che).\n   D\u00E8s qu'une condition tombe, la boucle rAF est ANNUL\u00C9E\n   (cancelAnimationFrame) \u2014 pas de boucle qui tourne \u00E0 vide, jamais\n   deux boucles simultan\u00E9es (id unique). Les fl\u00E8ches et le d\u00E9filement\n   manuel restent toujours disponibles, autoplay actif ou non. */\n(function () {\n  document.querySelectorAll('[data-orbe-carousel]').forEach(function (track) {\n    var speedSec = parseFloat(track.getAttribute('data-speed')) || 30;\n    var autoplayEnabled = track.getAttribute('data-autoplay') !== 'false';\n\n    var section = track.closest('section') || document;\n    var prevBtn = section.querySelector('[data-orbe-carousel-prev]');\n    var nextBtn = section.querySelector('[data-orbe-carousel-next]');\n\n    function cardStep() {\n      var card = track.querySelector('.orbe-avis__card');\n      if (!card) return track.clientWidth * 0.8;\n      var styles = window.getComputedStyle(track.querySelector('.orbe-avis__list') || track);\n      var gap = parseFloat(styles.columnGap || styles.gap) || 0;\n      return card.getBoundingClientRect().width + gap;\n    }\n\n    // --- \u00C9tats (chacun suspend l'autoplay tant qu'il est vrai)\n    var motionQuery = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)');\n    var motionReduced = motionQuery ? motionQuery.matches : false;\n    var inView = false;\n    var hovering = false;\n    var touching = false;\n    var focused = false;\n    var settleTimer = null;\n\n    function isPaused() {\n      return hovering || touching || focused || settleTimer !== null;\n    }\n\n    // R\u00E9pit apr\u00E8s une action volontaire (fl\u00E8che, fin de touch) avant reprise.\n    function settle(ms) {\n      if (settleTimer) clearTimeout(settleTimer);\n      settleTimer = setTimeout(function () {\n        settleTimer = null;\n        sync();\n      }, ms);\n      sync();\n    }\n\n    // --- Boucle rAF : id unique, annul\u00E9e proprement \u00E0 l'arr\u00EAt.\n    var rafId = null;\n    var lastTs = null;\n\n    function tick(ts) {\n      if (lastTs == null) lastTs = ts;\n      var dt = (ts - lastTs) / 1000;\n      lastTs = ts;\n\n      var max = track.scrollWidth - track.clientWidth;\n      if (max > 0) {\n        var pxPerSec = max / speedSec;\n        var next = track.scrollLeft + pxPerSec * dt;\n        if (next >= max - 1) {\n          track.scrollTo({ left: 0, behavior: 'smooth' });\n        } else {\n          track.scrollLeft = next;\n        }\n      }\n      rafId = requestAnimationFrame(tick);\n    }\n\n    function startLoop() {\n      if (rafId !== null) return;\n      lastTs = null;\n      rafId = requestAnimationFrame(tick);\n    }\n\n    function stopLoop() {\n      if (rafId !== null) {\n        cancelAnimationFrame(rafId);\n        rafId = null;\n      }\n      lastTs = null;\n    }\n\n    function sync() {\n      if (autoplayEnabled && inView && !motionReduced && !isPaused()) {\n        startLoop();\n      } else {\n        stopLoop();\n      }\n    }\n\n    // --- Navigation par fl\u00E8ches (toujours active, autoplay ou non)\n    if (prevBtn) {\n      prevBtn.addEventListener('click', function () {\n        settle(4000);\n        track.scrollBy({ left: -cardStep(), behavior: 'smooth' });\n      });\n    }\n    if (nextBtn) {\n      nextBtn.addEventListener('click', function () {\n        settle(4000);\n        var max = track.scrollWidth - track.clientWidth;\n        if (track.scrollLeft >= max - 1) {\n          track.scrollTo({ left: 0, behavior: 'smooth' });\n        } else {\n          track.scrollBy({ left: cardStep(), behavior: 'smooth' });\n        }\n      });\n    }\n\n    // --- Interactions utilisateur\n    track.addEventListener('mouseenter', function () { hovering = true; sync(); });\n    track.addEventListener('mouseleave', function () { hovering = false; sync(); });\n    track.addEventListener('touchstart', function () { touching = true; sync(); }, { passive: true });\n    track.addEventListener('touchend', function () { touching = false; settle(1500); }, { passive: true });\n    track.addEventListener('touchcancel', function () { touching = false; settle(1500); }, { passive: true });\n\n    // Pause tant qu'un \u00E9l\u00E9ment de la section a le focus clavier\n    // (fl\u00E8ches, piste tabbable\u2026). relatedTarget = prochain \u00E9l\u00E9ment focus\u00E9.\n    section.addEventListener('focusin', function () { focused = true; sync(); });\n    section.addEventListener('focusout', function (e) {\n      focused = e.relatedTarget ? section.contains(e.relatedTarget) : false;\n      sync();\n    });\n\n    if (motionQuery && motionQuery.addEventListener) {\n      motionQuery.addEventListener('change', function (e) {\n        motionReduced = e.matches;\n        sync();\n      });\n    }\n\n    // --- Visibilit\u00E9 : l'autoplay ne tourne que si le carrousel est \u00E0 l'\u00E9cran.\n    if ('IntersectionObserver' in window) {\n      new IntersectionObserver(function (entries) {\n        entries.forEach(function (entry) {\n          inView = entry.isIntersecting;\n          sync();\n        });\n      }).observe(track);\n    } else {\n      inView = true;\n      sync();\n    }\n  });\n})();\n\n/* Orbe Paris \u2014 socle motion : apparition au scroll (Reveal + Stagger + Trace)\n   Les \u00E9l\u00E9ments qui entrent dans le viewport au m\u00EAme instant re\u00E7oivent un\n   index --orbe-i (plafonn\u00E9 \u00E0 5) : le CSS les d\u00E9cale de 90 ms chacun.\n   L'index est retir\u00E9 apr\u00E8s l'entr\u00E9e pour ne pas retarder d'\u00E9ventuelles\n   transitions ult\u00E9rieures sur le m\u00EAme \u00E9l\u00E9ment. */\n(function () {\n  var targets = document.querySelectorAll('.orbe-reveal, .orbe-trace, .orbe-stagger');\n  if (!targets.length) return;\n\n  var reduceMotion =\n    window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n  if (reduceMotion || !('IntersectionObserver' in window)) {\n    targets.forEach(function (el) {\n      el.classList.add('is-visible');\n    });\n    return;\n  }\n\n  function clearStaggerAfterEntry(el) {\n    el.addEventListener('transitionend', function handler(e) {\n      if (e.target !== el) return;\n      el.style.removeProperty('--orbe-i');\n      el.removeEventListener('transitionend', handler);\n    });\n  }\n\n  var observer = new IntersectionObserver(function (entries) {\n    var batch = entries\n      .filter(function (entry) { return entry.isIntersecting; })\n      .sort(function (a, b) {\n        return (\n          a.boundingClientRect.top - b.boundingClientRect.top ||\n          a.boundingClientRect.left - b.boundingClientRect.left\n        );\n      });\n\n    batch.forEach(function (entry, i) {\n      var el = entry.target;\n      // Les conteneurs .orbe-stagger g\u00E8rent leur cascade en CSS (nth-child) :\n      // pas d'index de batch sur eux.\n      if (i > 0 && !el.classList.contains('orbe-stagger')) {\n        el.style.setProperty('--orbe-i', Math.min(i, 5));\n        clearStaggerAfterEntry(el);\n      }\n      el.classList.add('is-visible');\n      observer.unobserve(el);\n    });\n  }, { threshold: 0.12, rootMargin: '0px 0px -40px 0px' });\n\n  targets.forEach(function (el) {\n    observer.observe(el);\n  });\n})();\n\n/* Orbe Paris \u2014 scrollytelling compression (section logistique-orbe-v6)\n   Bidirectionnel : une \u00E9tape s'active quand elle entre dans le viewport,\n   et se d\u00E9sactive quand on remonte AU-DESSUS d'elle (sortie par le bas\n   de l'\u00E9cran) \u2014 le rail se vide et le galet se recompresse, puis tout se\n   rejoue \u00E0 la descente. Une \u00E9tape d\u00E9j\u00E0 d\u00E9pass\u00E9e (sortie par le haut)\n   reste active : on ne rejoue pas l'animation dans le dos du lecteur.\n   data-orbe-state = index de la plus haute \u00E9tape active (0 si aucune).\n   Sans IO ou en mouvement r\u00E9duit : \u00E9tat final pos\u00E9, sans transition.\n   Aucun listener scroll, aucun rAF, observer permanent unique. */\n(function () {\n  var section = document.querySelector('[data-orbe-compression]');\n  if (!section) return;\n  var steps = section.querySelectorAll('[data-orbe-step]');\n  if (!steps.length) return;\n\n  var reduceMotion =\n    window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n  function setFinalState() {\n    steps.forEach(function (step) {\n      step.classList.add('is-active');\n    });\n    section.setAttribute('data-orbe-state', String(steps.length));\n  }\n\n  if (reduceMotion || !('IntersectionObserver' in window)) {\n    setFinalState();\n    return;\n  }\n\n  function syncState() {\n    var state = 0;\n    steps.forEach(function (step) {\n      if (step.classList.contains('is-active')) {\n        var index = parseInt(step.getAttribute('data-orbe-step'), 10) || 0;\n        if (index > state) state = index;\n      }\n    });\n    section.setAttribute('data-orbe-state', String(state));\n  }\n\n  // Sur smartphone, les \u00E9tapes sont hautes : on d\u00E9clenche plus t\u00F4t (moins de\n  // hauteur visible requise + zone de d\u00E9clenchement plus basse dans l'\u00E9cran).\n  var isMobile = window.matchMedia && window.matchMedia('(max-width: 749px)').matches;\n  var activateRatio = isMobile ? 0.35 : 0.5;\n  var bottomMargin = isMobile ? '-5%' : '-12%';\n\n  var observer = new IntersectionObserver(function (entries) {\n    entries.forEach(function (entry) {\n      var step = entry.target;\n      if (entry.isIntersecting && entry.intersectionRatio >= activateRatio) {\n        step.classList.add('is-active');\n      } else if (!entry.isIntersecting) {\n        // Sortie compl\u00E8te par le bas du viewport = l'utilisateur est\n        // remont\u00E9 au-dessus de l'\u00E9tape \u2192 on la d\u00E9sarme pour le replay.\n        var rootBottom = entry.rootBounds ? entry.rootBounds.bottom : window.innerHeight;\n        if (entry.boundingClientRect.top >= rootBottom) {\n          step.classList.remove('is-active');\n        }\n      }\n    });\n    syncState();\n  }, { threshold: [0, activateRatio], rootMargin: '0px 0px ' + bottomMargin + ' 0px' });\n\n  steps.forEach(function (step) {\n    observer.observe(step);\n  });\n})();\n\n/* Orbe Paris \u2014 lookbook showroom : choix du d\u00E9cor (section lookbook-orbe-v5).\n   Desktop uniquement (sur mobile, la galerie scroll-snap se suffit).\n   Survol d'un nom = aper\u00E7u ; clic = choix (stoppe la rotation pour de bon).\n   Rotation automatique douce (6 s, setInterval \u2014 pas de rAF) seulement si :\n   visible (IO), pas de prefers-reduced-motion, aucune interaction en cours,\n   pas de choix manuel. */\n(function () {\n  var root = document.querySelector('[data-orbe-lookbook]');\n  if (!root) return;\n  var items = root.querySelectorAll('[data-orbe-look-item]');\n  var btns = root.querySelectorAll('[data-orbe-look-btn]');\n  if (items.length < 2 || btns.length !== items.length) return;\n\n  var motionQuery = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)');\n  var desktopQuery = window.matchMedia && window.matchMedia('(min-width: 1000px)');\n  var current = 0;\n  var chosen = false;\n  var interacting = false;\n  var inView = false;\n  var timer = null;\n\n  function setActive(index) {\n    current = index;\n    items.forEach(function (el, i) {\n      el.classList.toggle('is-active', i === index);\n    });\n    btns.forEach(function (btn, i) {\n      btn.classList.toggle('is-active', i === index);\n      btn.setAttribute('aria-pressed', String(i === index));\n    });\n  }\n\n  function start() {\n    if (timer || chosen || interacting || !inView) return;\n    if (motionQuery && motionQuery.matches) return;\n    if (desktopQuery && !desktopQuery.matches) return;\n    timer = setInterval(function () {\n      setActive((current + 1) % items.length);\n    }, 6000);\n  }\n\n  function stop() {\n    if (timer) {\n      clearInterval(timer);\n      timer = null;\n    }\n  }\n\n  btns.forEach(function (btn, i) {\n    btn.addEventListener('click', function () {\n      chosen = true;\n      stop();\n      setActive(i);\n    });\n    btn.addEventListener('mouseenter', function () {\n      setActive(i);\n    });\n  });\n\n  root.addEventListener('mouseenter', function () { interacting = true; stop(); });\n  root.addEventListener('mouseleave', function () { interacting = false; start(); });\n  root.addEventListener('focusin', function () { interacting = true; stop(); });\n  root.addEventListener('focusout', function (e) {\n    interacting = e.relatedTarget ? root.contains(e.relatedTarget) : false;\n    if (!interacting) start();\n  });\n\n  if (motionQuery && motionQuery.addEventListener) {\n    motionQuery.addEventListener('change', function (e) {\n      if (e.matches) stop(); else start();\n    });\n  }\n\n  if ('IntersectionObserver' in window) {\n    new IntersectionObserver(function (entries) {\n      entries.forEach(function (entry) {\n        inView = entry.isIntersecting;\n        if (inView) start(); else stop();\n      });\n    }).observe(root);\n  } else {\n    inView = true;\n    start();\n  }\n})();\n\n/* Orbe Paris \u2014 cartes formats : d\u00E9tail au tap sur \u00E9cran tactile.\n   Sur desktop (pointeur fin), le hover/focus g\u00E8re l'\u00E9tat actif en CSS pur ;\n   ici on ne traite que les \u00E9crans sans survol. Une seule carte ouverte \u00E0\n   la fois. Les clics sur le CTA (lien) ne sont jamais intercept\u00E9s. */\n(function () {\n  var grid = document.querySelector('[data-orbe-format-grid]');\n  if (!grid) return;\n\n  grid.addEventListener('click', function (e) {\n    if (e.target.closest('a')) return;\n    if (window.matchMedia('(hover: hover) and (pointer: fine)').matches) return;\n    var card = e.target.closest('[data-orbe-format-card]');\n    if (!card) return;\n    var wasOpen = card.classList.contains('is-open');\n    grid.querySelectorAll('[data-orbe-format-card].is-open').forEach(function (c) {\n      c.classList.remove('is-open');\n    });\n    if (!wasOpen) card.classList.add('is-open');\n  });\n})();\n\n/* === Orbe : panier \u2014 animation suppression + maj badge + filet de s\u00E9curit\u00E9 total === */\n(function () {\n  function onReady(fn) {\n    if (document.readyState === 'loading') {\n      document.addEventListener('DOMContentLoaded', fn);\n    } else {\n      fn();\n    }\n  }\n\n  onReady(function () {\n    // 1. Animation suppression : actif globalement (n'affecte que les pages avec cart-remove-button).\n    document.addEventListener('click', function (e) {\n      var btn = e.target.closest && e.target.closest('cart-remove-button');\n      if (!btn) return;\n      var row = btn.closest('.cart-item');\n      if (row) row.classList.add('orbe-removing');\n    }, true);\n\n    // 2. Filet de s\u00E9curit\u00E9 \u2014 n'installe le hook fetch qu'en pr\u00E9sence du custom element cart-items\n    //    (donc uniquement sur /cart). Si pas l\u00E0, on n'alt\u00E8re pas window.fetch.\n    if (!document.querySelector('cart-items')) return;\n\n    var origFetch = window.fetch.bind(window);\n    window.fetch = function (input, init) {\n      var url = '';\n      try { url = (typeof input === 'string') ? input : (input && input.url) || ''; } catch (e) {}\n      var p = origFetch(input, init);\n      if (/\\/cart\\/(change|update|add)(\\.js)?/i.test(url)) {\n        // Programme un refresh \u2014 n'utilise PAS p.then pour ne pas consommer la r\u00E9ponse.\n        setTimeout(refreshOrbeCart, 350);\n      }\n      return p;\n    };\n  });\n\n  function refreshOrbeCart() {\n    fetch('/cart.js', { headers: { Accept: 'application/json' }, credentials: 'same-origin' })\n      .then(function (r) { return r.json(); })\n      .then(function (cart) {\n        if (!cart) return;\n        // Total estim\u00E9\n        var formatted = formatMoney(cart.total_price);\n        document.querySelectorAll('.totals__total-value').forEach(function (el) {\n          if (el.textContent.trim() !== formatted.trim()) {\n            el.textContent = formatted;\n            el.classList.add('orbe-total-bump');\n            setTimeout(function () { el.classList.remove('orbe-total-bump'); }, 500);\n          }\n        });\n        // Badge header\n        document.querySelectorAll('[data-orbe-cart-count]').forEach(function (el) {\n          if (cart.item_count > 0) {\n            el.textContent = cart.item_count;\n            el.removeAttribute('hidden');\n          } else {\n            el.textContent = '';\n            el.setAttribute('hidden', '');\n          }\n        });\n        // \u00C9tats is-empty pour styles Dawn\n        var ci = document.querySelector('cart-items');\n        var cf = document.getElementById('main-cart-footer');\n        if (ci) ci.classList.toggle('is-empty', cart.item_count === 0);\n        if (cf) cf.classList.toggle('is-empty', cart.item_count === 0);\n        // Si vide, vider la zone erreur Dawn (au cas o\u00F9 elle aurait gard\u00E9 un message)\n        var errBox = document.getElementById('cart-errors');\n        if (errBox) errBox.textContent = '';\n      })\n      .catch(function () {});\n  }\n\n  function formatMoney(cents) {\n    // Format fran\u00E7ais : 2 000,00 \u20AC EUR (espace ins\u00E9cable, virgule d\u00E9cimale)\n    var euros = (cents / 100).toFixed(2);\n    var parts = euros.split('.');\n    var intPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, '\u202F');\n    return intPart + ',' + parts[1] + '\u202F\u20AC EUR';\n  }\n})();\n\n/* === Orbe : footer l\u00E9gal \u2014 garantit les 4 liens sur toutes les pages (contourne cache Shopify) === */\n(function () {\n  function fixFooter() {\n    var copyright = document.querySelector('.footer__copyright');\n    if (!copyright) return;\n\n    // 1. Supprimer les anciens <small class=\"copyright__content\"> qui contiennent \u00A9 / Shopify / powered_by\n    var smalls = copyright.querySelectorAll(':scope > small.copyright__content');\n    smalls.forEach(function (s) {\n      var t = s.textContent || '';\n      var a = s.querySelector('a');\n      if (/\u00A9|copyright|propuls\u00E9|Shopify/i.test(t) || (a && /shopify\\.com/.test(a.getAttribute('href') || ''))) {\n        s.remove();\n      }\n    });\n\n    // 2. Construire la liste des 4 liens si elle n'est pas d\u00E9j\u00E0 compl\u00E8te\n    var ul = copyright.querySelector('ul.policies');\n    var required = [\n      { href: '/pages/politique-confidentialite', label: 'Politique de confidentialit\u00E9' },\n      { href: '/pages/preferences-cookies', label: 'Pr\u00E9f\u00E9rences en mati\u00E8re de cookies' },\n      { href: '/pages/conditions-generales-de-vente', label: 'CGV' },\n      { href: '/pages/mentions-legales', label: 'Mentions l\u00E9gales' }\n    ];\n\n    if (!ul) {\n      ul = document.createElement('ul');\n      ul.className = 'policies list-unstyled';\n      copyright.appendChild(ul);\n    }\n\n    // 3. Retirer tout li qui pointe vers /policies/* (URLs Shopify obsol\u00E8tes)\n    ul.querySelectorAll('li').forEach(function (li) {\n      var a = li.querySelector('a');\n      if (a && /\\/policies\\//.test(a.getAttribute('href') || '')) li.remove();\n    });\n\n    // 4. Ajouter les liens manquants\n    var existingHrefs = Array.from(ul.querySelectorAll('a')).map(function (a) { return a.getAttribute('href'); });\n    required.forEach(function (link) {\n      if (existingHrefs.indexOf(link.href) === -1) {\n        var li = document.createElement('li');\n        li.innerHTML = '<small class=\"copyright__content\"><a href=\"' + link.href + '\">' + link.label + '</a></small>';\n        ul.appendChild(li);\n      }\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', fixFooter);\n  } else {\n    fixFooter();\n  }\n})();\n\n/* Orbe Paris \u2014 Nuancier tissus (section nuancier-orbe-v14)\n   Progressive enhancement : sans ce script, le nuancier reste OUVERT et\n   utilisable (couverture masqu\u00E9e, les deux plaquettes d\u00E9pli\u00E9es).\n   Avec : couverture anim\u00E9e sur desktop, bascule entre les deux plaquettes\n   superpos\u00E9es sur mobile, s\u00E9lection d'une teinte (met \u00E0 jour le CTA).\n   Scope par section + shopify:section:load (Theme Editor), garde anti-double-init. */\n(function () {\n  function initNuancier(root) {\n    if (!root || root.dataset.nuancierReady === '1') return;\n    root.dataset.nuancierReady = '1';\n\n    var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    var animOn = root.getAttribute('data-anim') !== '0';\n    var accentOn = root.getAttribute('data-accent') === '1';\n\n    var cover = root.querySelector('[data-nuancier-open]');\n    var spread = root.querySelector('[data-nuancier-spread]');\n    var swatches = Array.prototype.slice.call(root.querySelectorAll('[data-nuancier-swatch]'));\n    var plaques = Array.prototype.slice.call(root.querySelectorAll('[data-plaque]'));\n    var mainCta = root.querySelector('[data-nuancier-main-cta]');\n\n    root.classList.add('is-enhanced');\n    if (!animOn || reduce) root.classList.add('orbe-nuancier--instant');\n\n    function setInert(on) {\n      if (!spread) return;\n      if ('inert' in spread) spread.inert = on;\n      spread.setAttribute('aria-hidden', on ? 'true' : 'false');\n    }\n    function openBook(focusInside) {\n      root.classList.add('is-open');\n      setInert(false);\n      if (focusInside) {\n        var a = root.querySelector('[data-nuancier-swatch].is-active') || swatches[0];\n        if (a) a.focus({ preventScroll: true });\n      }\n      if (cover) { cover.setAttribute('aria-expanded', 'true'); cover.setAttribute('aria-hidden', 'true'); cover.tabIndex = -1; }\n    }\n\n    // Desktop : carnet ferm\u00E9 \u00E0 l'arriv\u00E9e, s'ouvre au clic. Mobile : ouvert d'embl\u00E9e.\n    var smallScreen = window.matchMedia && window.matchMedia('(max-width: 859px)').matches;\n    if (cover && !smallScreen) {\n      root.classList.remove('is-open');\n      setInert(true);\n      cover.setAttribute('aria-expanded', 'false');\n      cover.addEventListener('click', function () { openBook(true); });\n    } else {\n      openBook(false);\n    }\n\n    // --- Pile de deux cartes (mobile) : celle de devant est en position, celle\n    // du dessous d\u00E9passe \u00E0 droite par sa tranche ; on tape la tranche pour la\n    // ramener devant. Sur desktop les deux forment la double page du carnet et\n    // la tranche est masqu\u00E9e en CSS. ---\n    var mqStack = window.matchMedia ? window.matchMedia('(max-width: 859px)') : null;\n\n    // Les cartes sont en position absolue dans la pile. Elles doivent faire\n    // EXACTEMENT la m\u00EAme taille (demande fondateur) m\u00EAme si l'une a moins de\n    // teintes : on mesure la plus haute et on l'applique aux deux.\n    var measuring = false;\n    function syncStackHeight() {\n      if (!spread || measuring) return;\n      if (mqStack && !mqStack.matches) {\n        spread.style.height = '';\n        plaques.forEach(function (p) { p.style.height = ''; });\n        return;\n      }\n      measuring = true;\n      plaques.forEach(function (p) { p.style.height = 'auto'; });\n      var h = 0;\n      plaques.forEach(function (p) { if (p.offsetHeight > h) h = p.offsetHeight; });\n      plaques.forEach(function (p) { p.style.height = h + 'px'; });\n      spread.style.height = h + 'px';\n      measuring = false;\n    }\n\n    function openPlaque(plaque) {\n      plaques.forEach(function (p) {\n        p.classList.toggle('is-open', p === plaque);\n      });\n      // Le CTA doit parler du tissu qu'on regarde : si aucune teinte de cette\n      // carte n'est s\u00E9lectionn\u00E9e, on prend la premi\u00E8re.\n      if (!plaque.querySelector('[data-nuancier-swatch].is-active')) {\n        var first = plaque.querySelector('[data-nuancier-swatch]');\n        if (first) select(first);\n      }\n      syncStackHeight();\n    }\n\n    plaques.forEach(function (p) {\n      var tab = p.querySelector('[data-plaque-toggle]');\n      if (!tab) return;\n      tab.addEventListener('click', function () {\n        if (!p.classList.contains('is-open')) openPlaque(p);\n      });\n    });\n\n    syncStackHeight();\n    window.addEventListener('resize', syncStackHeight);\n    if (window.ResizeObserver) {\n      var ro = new ResizeObserver(syncStackHeight);\n      plaques.forEach(function (p) { ro.observe(p); });\n    }\n\n    function applyAccent(btn) {\n      if (!accentOn) return;\n      var a = btn.getAttribute('data-accent');\n      if (a) root.style.setProperty('--nuancier-accent', a);\n    }\n\n    function setMainCta(btn) {\n      if (!mainCta) return;\n      // Override \u00AB bient\u00F4t disponible \u00BB (tissu sans produits) : texte fixe + lien neutralis\u00E9.\n      var override = btn.getAttribute('data-cta-text');\n      if (override) {\n        mainCta.textContent = override;\n        mainCta.removeAttribute('href');\n        mainCta.setAttribute('aria-disabled', 'true');\n        mainCta.classList.add('is-disabled');\n        return;\n      }\n      mainCta.removeAttribute('aria-disabled');\n      mainCta.classList.remove('is-disabled');\n      var name = btn.getAttribute('data-name') || '';\n      var tpl = mainCta.getAttribute('data-template') || 'Voir les mod\u00E8les en {teinte}';\n      mainCta.textContent = tpl.indexOf('{teinte}') !== -1 ? tpl.replace('{teinte}', name) : tpl;\n      var link = btn.getAttribute('data-cta-link') || mainCta.getAttribute('data-default-link') || '#';\n      mainCta.setAttribute('href', link);\n    }\n\n    function select(btn) {\n      if (btn.getAttribute('aria-pressed') === 'true') return; // d\u00E9j\u00E0 active\n      swatches.forEach(function (s) {\n        var on = s === btn;\n        s.classList.toggle('is-active', on);\n        s.setAttribute('aria-pressed', on ? 'true' : 'false');\n      });\n\n      applyAccent(btn);\n      setMainCta(btn);\n    }\n\n    swatches.forEach(function (btn) {\n      btn.addEventListener('click', function () { select(btn); });\n    });\n\n    var initActive = root.querySelector('[data-nuancier-swatch].is-active') || swatches[0];\n    if (initActive) { applyAccent(initActive); setMainCta(initActive); }\n  }\n\n  function initAll(scope) {\n    (scope || document).querySelectorAll('[data-nuancier]').forEach(initNuancier);\n  }\n\n  if (document.readyState !== 'loading') initAll();\n  else document.addEventListener('DOMContentLoaded', function () { initAll(); });\n\n  document.addEventListener('shopify:section:load', function (e) {\n    if (e.target) initAll(e.target);\n  });\n})();\n\n/* Orbe Paris \u2014 Nuancier v15 (section nuancier-orbe-v15)\n   Deux choses seulement : basculer d'un tissu \u00E0 l'autre (onglets) et changer la\n   teinte affich\u00E9e (visuel du fauteuil + m\u00E9daillon macro + nom + phrase + CTA).\n   L'\u00E9tat initial est d\u00E9j\u00E0 rendu c\u00F4t\u00E9 serveur : sans ce script, les deux\n   panneaux restent d\u00E9pli\u00E9s et la 1re teinte de chacun est visible.\n   Le fondu crois\u00E9 se fait sur deux calques <img>, la nouvelle image \u00E9tant\n   pr\u00E9charg\u00E9e avant l'\u00E9change pour ne jamais montrer de trou blanc. */\n(function () {\n  function initPanel(panel) {\n    var heroA = panel.querySelector('[data-hero-a]');\n    var heroB = panel.querySelector('[data-hero-b]');\n    var macro = panel.querySelector('[data-macro]');\n    var nameOut = panel.querySelector('[data-name-out]');\n    var phraseOut = panel.querySelector('[data-phrase-out]');\n    var cta = panel.querySelector('[data-main-cta]');\n    var soon = panel.querySelector('[data-main-soon]');\n    var swatches = Array.prototype.slice.call(panel.querySelectorAll('[data-swatch]'));\n    if (!swatches.length) return;\n\n    function setHero(src, alt) {\n      if (!heroA || !heroB || !src) return;\n      var visible = heroA.classList.contains('is-on') ? heroA : heroB;\n      var hidden = visible === heroA ? heroB : heroA;\n      if (visible.getAttribute('src') === src) {\n        visible.alt = alt || '';\n        return;\n      }\n      // Pr\u00E9chargement, puis d\u00E9codage du calque cach\u00E9 AVANT de l'afficher : sans\n      // \u00E7a, l'\u00E9change peut se faire sur une image pas encore peinte (trou blanc).\n      var pre = new Image();\n      pre.onload = function () {\n        hidden.src = src;\n        hidden.alt = alt || '';\n        var swap = function () {\n          hidden.removeAttribute('aria-hidden');\n          visible.alt = '';\n          visible.setAttribute('aria-hidden', 'true');\n          hidden.classList.add('is-on');\n          visible.classList.remove('is-on');\n        };\n        if (hidden.decode) hidden.decode().then(swap, swap);\n        else swap();\n      };\n      pre.src = src;\n    }\n\n    // 2026-08-08 : la maille bouclette m\u00E9lange des coloris en vente et des\n    // coloris pas encore commandables (data-cta-text sur la pastille). Le CTA\n    // et la mention \u00AB bient\u00F4t disponible \u00BB sont tous deux dans le DOM, on\n    // bascule de l'un \u00E0 l'autre \u2014 sans \u00E7a, un coloris sans fiche affichait\n    // \u00AB Voir le fauteuil en \u2026 \u00BB pointant vers le catalogue.\n    function setCta(btn) {\n      var soonText = btn.getAttribute('data-cta-text');\n      if (soon) {\n        if (soonText) soon.textContent = soonText;\n        soon.hidden = !soonText;\n      }\n      if (!cta) return;\n      cta.hidden = !!soonText;\n      if (soonText) return;\n      // `data-cta-label` (2026-08-08) : libell\u00E9 calcul\u00E9 c\u00F4t\u00E9 Liquid, prioritaire\n      // sur le gabarit. Il nomme la pi\u00E8ce r\u00E9ellement li\u00E9e \u2014 le fauteuil en r\u00E8gle\n      // g\u00E9n\u00E9rale, le pouf pour les coloris qui n'existent que dans ce mod\u00E8le.\n      var label = btn.getAttribute('data-cta-label');\n      var name = btn.getAttribute('data-name') || '';\n      var tpl = cta.getAttribute('data-template') || '';\n      if (label) cta.textContent = label;\n      else if (tpl) cta.textContent = tpl.indexOf('{teinte}') !== -1 ? tpl.replace('{teinte}', name) : tpl;\n      cta.setAttribute('href', btn.getAttribute('data-link') || cta.getAttribute('data-default-link') || '#');\n    }\n\n    function select(btn) {\n      if (btn.getAttribute('aria-pressed') === 'true') return;\n      swatches.forEach(function (s) {\n        var on = s === btn;\n        s.classList.toggle('is-active', on);\n        s.setAttribute('aria-pressed', on ? 'true' : 'false');\n      });\n      setHero(btn.getAttribute('data-hero'), btn.getAttribute('data-alt'));\n      if (macro && btn.getAttribute('data-macro')) macro.src = btn.getAttribute('data-macro');\n      if (nameOut) nameOut.textContent = btn.getAttribute('data-name') || '';\n      if (phraseOut) phraseOut.textContent = btn.getAttribute('data-phrase') || '';\n      setCta(btn);\n    }\n\n    swatches.forEach(function (btn) {\n      btn.addEventListener('click', function () { select(btn); });\n    });\n  }\n\n  function initNuancier15(root) {\n    if (!root || root.dataset.n15Ready === '1') return;\n    root.dataset.n15Ready = '1';\n    root.classList.add('is-enhanced');\n\n    var tabs = Array.prototype.slice.call(root.querySelectorAll('[data-tab]'));\n    var panels = Array.prototype.slice.call(root.querySelectorAll('[data-panel]'));\n    var tabsRow = root.querySelector('[data-tabs]');\n    var panelsWrap = root.querySelector('.orbe-nuancier15__panels');\n\n    // Hauteur du conteneur = hauteur du panneau actif, transitionn\u00E9e en CSS.\n    // Sans \u00E7a, les deux panneaux empil\u00E9s imposent la hauteur du plus grand et\n    // le tissu le plus court tra\u00EEne un grand vide sous lui.\n    function syncHeight() {\n      if (!panelsWrap) return;\n      var on = root.querySelector('[data-panel].is-on');\n      if (on) panelsWrap.style.height = on.getBoundingClientRect().height + 'px';\n    }\n\n    // Le filet sous les onglets est un seul trait : on lui donne la position et\n    // la largeur de l'onglet actif, le CSS fait le glissement. offsetLeft est\n    // relatif \u00E0 la rang\u00E9e (position: relative), et offsetTop g\u00E8re le cas o\u00F9 les\n    // deux libell\u00E9s passent \u00E0 la ligne sur un \u00E9cran tr\u00E8s \u00E9troit.\n    function moveBar(tab) {\n      if (!tabsRow || !tab) return;\n      tabsRow.style.setProperty('--n15-bar-x', tab.offsetLeft + 'px');\n      tabsRow.style.setProperty('--n15-bar-w', tab.offsetWidth + 'px');\n      tabsRow.style.setProperty('--n15-bar-y', (tab.offsetTop + tab.offsetHeight) + 'px');\n    }\n\n    tabs.forEach(function (tab) {\n      tab.addEventListener('click', function () {\n        var key = tab.getAttribute('data-tab');\n        tabs.forEach(function (t) {\n          var on = t === tab;\n          t.classList.toggle('is-on', on);\n          t.setAttribute('aria-selected', on ? 'true' : 'false');\n        });\n        panels.forEach(function (p) {\n          p.classList.toggle('is-on', p.getAttribute('data-panel') === key);\n        });\n        moveBar(tab);\n        syncHeight();\n      });\n    });\n\n    // Arriv\u00E9e depuis une fiche produit (2026-08-07) : le lien \u00AB Voir le tissu\n    // de pr\u00E8s \u00BB porte `?tissu=teddy` ou `?tissu=3d` et doit ouvrir le bon\n    // onglet. Liquid n'a aucun acc\u00E8s aux param\u00E8tres d'URL (choix Shopify li\u00E9 au\n    // cache CDN), la s\u00E9lection se fait donc ici, c\u00F4t\u00E9 navigateur.\n    var voulu = null;\n    try {\n      voulu = new URLSearchParams(window.location.search).get('tissu');\n    } catch (e) { /* navigateur sans URLSearchParams : on garde l'onglet par d\u00E9faut */ }\n    if (voulu) {\n      var cible = tabs.filter(function (t) { return t.getAttribute('data-tab') === voulu; })[0];\n      if (cible && !cible.classList.contains('is-on')) cible.click();\n    }\n\n    function refresh() {\n      moveBar(root.querySelector('[data-tab].is-on') || tabs[0]);\n      syncHeight();\n    }\n\n    refresh();\n    // Les polices web d\u00E9calent la largeur des libell\u00E9s et la hauteur des panneaux\n    // apr\u00E8s coup ; on remesure aussi \u00E0 chaque changement de taille du contenu.\n    if (document.fonts && document.fonts.ready) document.fonts.ready.then(refresh);\n    window.addEventListener('resize', refresh);\n    if (window.ResizeObserver) {\n      var ro = new ResizeObserver(syncHeight);\n      panels.forEach(function (p) { ro.observe(p); });\n    }\n\n    panels.forEach(initPanel);\n  }\n\n  function initAll(scope) {\n    (scope || document).querySelectorAll('[data-nuancier15]').forEach(initNuancier15);\n  }\n\n  if (document.readyState !== 'loading') initAll();\n  else document.addEventListener('DOMContentLoaded', function () { initAll(); });\n\n  document.addEventListener('shopify:section:load', function (e) {\n    if (e.target) initAll(e.target);\n  });\n})();\n"],
  "mappings": "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",
  "names": []
}
