{"product_id":"kuxiu-x40-turbo-cherry","title":"KUXIU X40 Turbo support de charge sans fil MagSafe pliable 3-en-1 25 W certifié Qi2.2 – Bordeaux","description":"\u003cstyle\u003e\n      .x40-shell {\n        color-scheme: dark;\n        --page: #1d1d1f;\n        --panel: #000;\n        --control: #232325;\n        --card: #242426;\n        --text: #f5f5f7;\n        --muted: #a6a6ab;\n        --accent: #ff5a00;\n        --app-pv-icon-fill: #f5f5f7;\n        width: 100%;\n        max-width: none;\n        background: var(--page);\n      }\n\n      .x40-page,\n      .x40-page * { box-sizing: border-box; }\n\n      .x40-page button { font: inherit; }\n\n      .x40-page {\n        position: relative;\n        left: 50%;\n        width: min(1536px, calc(100vw - 48px));\n        max-width: none;\n        margin: 0;\n        padding: 104px 0 70px;\n        transform: translateX(-50%);\n        background: var(--page);\n        color: var(--text);\n        isolation: isolate;\n      }\n\n      .x40-shell h1,\n      .x40-shell h2 { color: var(--text) !important; }\n\n      .x40-shell h2.x40-top-title {\n        max-width: none;\n        margin: 0 0 36px !important;\n        text-align: left;\n      }\n\n      .x40-feature-panel {\n        position: relative;\n        width: min(1440px, 100%);\n        margin-inline: auto;\n        aspect-ratio: 1120 \/ 528;\n        overflow: hidden;\n        border-radius: 20px;\n        background: var(--panel);\n      }\n\n      .x40-selector-stack {\n        position: absolute;\n        z-index: 2;\n        top: 50%;\n        left: 6.05%;\n        width: 28.58%;\n        transform: translateY(-50%);\n        transition: opacity 560ms cubic-bezier(.22, 1, .36, 1), transform 700ms cubic-bezier(.22, 1, .36, 1);\n      }\n\n      .x40-feature-item {\n        transition: opacity 480ms ease, transform 620ms cubic-bezier(.22, 1, .36, 1);\n      }\n      .x40-feature-item + .x40-feature-item { margin-top: 12px; }\n      .x40-feature-panel:not(.x40-is-visible) .x40-selector-stack {\n        visibility: hidden;\n        opacity: 0;\n        transform: translateY(calc(-50% + 34px));\n      }\n      .x40-feature-panel:not(.x40-is-visible) .x40-feature-item { opacity: 0; transform: translateY(18px); }\n      .x40-feature-panel.x40-is-visible .x40-feature-item { opacity: 1; transform: translateY(0); }\n      .x40-feature-panel.x40-is-visible .x40-feature-item:nth-child(1) { transition-delay: 100ms; }\n      .x40-feature-panel.x40-is-visible .x40-feature-item:nth-child(2) { transition-delay: 180ms; }\n      .x40-feature-panel.x40-is-visible .x40-feature-item:nth-child(3) { transition-delay: 260ms; }\n\n      .x40-selector {\n        display: flex;\n        width: max-content;\n        align-items: center;\n        gap: 10px;\n        border: 0;\n        border-radius: 999px;\n        padding: 15px 20px;\n        background: var(--control);\n        color: var(--text);\n        cursor: pointer;\n        font-size: 17px;\n        line-height: 1.2;\n        font-weight: 500;\n        transition: background-color 160ms ease, transform 160ms ease;\n      }\n\n      .x40-selector:hover { background: #303033; }\n      .x40-selector:active { transform: scale(0.98); }\n      .x40-selector:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }\n\n      .x40-selector__icon {\n        display: block;\n        width: 24px;\n        height: 24px;\n        flex: 0 0 24px;\n      }\n\n      .x40-plus-icon { display: block; width: 24px; height: 24px; stroke-width: 1.4; }\n\n      .x40-selector[aria-expanded=\"true\"] .x40-selector__icon { display: none; }\n\n      .x40-feature-copy {\n        display: grid;\n        grid-template-rows: 1fr;\n        width: 100%;\n        margin-top: 12px;\n        border-radius: 16px;\n        background: var(--card);\n        color: var(--text);\n        font-size: 12px;\n        line-height: 1.45;\n        opacity: 1;\n        transition: grid-template-rows 240ms ease, opacity 180ms ease, margin 240ms ease;\n      }\n\n      .x40-feature-copy__inner {\n        min-height: 0;\n        overflow: hidden;\n      }\n\n      .x40-feature-copy__text { margin: 0; padding: 17px 16px; font-size: 17px; }\n\n      .x40-feature-copy.x40-is-collapsed {\n        grid-template-rows: 0fr;\n        margin-top: 0;\n        opacity: 0;\n      }\n\n      .x40-hero-product {\n        display: block;\n        position: absolute;\n        top: 0;\n        left: 50%;\n        width: 50%;\n        height: 100%;\n        margin: 0;\n        padding: 0;\n        object-fit: cover;\n        pointer-events: none;\n        visibility: hidden;\n        opacity: 0;\n        transition: opacity 180ms ease, transform 180ms ease, visibility 0s linear 180ms;\n      }\n\n      .x40-hero-product.x40-is-active {\n        visibility: visible;\n        opacity: 1;\n        transition-delay: 0s;\n      }\n\n      .x40-hero-product.x40-is-changing { opacity: 0.62; transform: scale(0.985); }\n\n      .x40-feature-panel::after,\n      .x40-media-card::after,\n      .x40-full-bleed-section::after {\n        content: \"\";\n        position: absolute;\n        z-index: 3;\n        top: 50%;\n        left: 50%;\n        width: 34px;\n        height: 34px;\n        margin: -17px 0 0 -17px;\n        border: 3px solid rgba(255, 255, 255, 0.34);\n        border-top-color: #fff;\n        border-radius: 50%;\n        opacity: 0;\n        pointer-events: none;\n        transform: scale(.82);\n        transition: opacity 180ms ease, transform 180ms ease;\n      }\n\n      .x40-feature-panel.x40-is-buffering::after,\n      .x40-media-card.x40-is-buffering::after,\n      .x40-full-bleed-section.x40-is-buffering::after {\n        opacity: 1;\n        transform: scale(1);\n        animation: x40-video-spin 800ms linear infinite;\n      }\n\n      @keyframes x40-video-spin { to { transform: scale(1) rotate(360deg); } }\n\n      @media (prefers-reduced-motion: reduce) {\n        .x40-feature-panel.x40-is-buffering::after,\n        .x40-media-card.x40-is-buffering::after,\n        .x40-full-bleed-section.x40-is-buffering::after { animation-duration: 1600ms; }\n      }\n\n      .x40-mobile-feature-detail { display: none; }\n\n      .x40-design-section {\n        padding-top: 56px;\n        text-align: center;\n      }\n\n      .x40-section-kicker,\n      .x40-content-eyebrow {\n        margin: 0 0 14px;\n        color: var(--accent);\n        font-size: 13px;\n        line-height: 1.2;\n        font-weight: 600;\n      }\n\n      .x40-shell h2.x40-section-title,\n      .x40-shell h2.x40-content-headline {\n        max-width: 780px;\n        margin: 0 auto !important;\n        font-size: 48px !important;\n        line-height: 1.1 !important;\n        letter-spacing: -1px !important;\n        font-weight: 600 !important;\n        padding-bottom: 50px;\n      }\n\n      .x40-section-copy,\n      .x40-content-description {\n        max-width: 810px;\n        margin: 18px auto 0;\n        color: var(--muted);\n        font-size: 14px;\n        line-height: 1.5;\n        font-weight: 400;\n      }\n\n      .x40-exploded-product {\n        display: block;\n        width: min(940px, 100%);\n        height: auto;\n        margin: 74px auto 0;\n        object-fit: cover;\n      }\n\n      .x40-section-block { margin-top: 96px; }\n\n      .x40-media-card {\n        position: relative;\n        overflow: hidden;\n        border-radius: 20px;\n      }\n\n      .x40-scroll-video {\n        display: block;\n        width: 100%;\n        height: 100%;\n        margin: 0;\n        object-fit: cover;\n      }\n\n      .x40-overnight-card { aspect-ratio: 1120 \/ 615; }\n\n      .x40-overnight-copy {\n        position: absolute;\n        z-index: 1;\n        top: 33%;\n        left: 5.6%;\n        width: min(34%, 430px);\n        transform: translateY(-20%);\n      }\n\n      .x40-overnight-copy .x40-content-headline,\n      .x40-overnight-copy .x40-content-description { margin-left: 0; text-align: left; }\n      .x40-overnight-copy .x40-content-description { color: var(--text); }\n\n      .x40-charge-stats {\n        display: grid;\n        grid-template-columns: repeat(3, 1fr);\n        padding: 76px 0 0;\n      }\n\n      .x40-charge-stat { text-align: center; }\n      .x40-charge-stat img { display: block; width: 52px; height: 72px; margin: 0 auto 18px; object-fit: contain; }\n      .x40-charge-stat:nth-child(2) img { width: 42px; }\n      .x40-charge-stat:nth-child(3) img { width: 58px; }\n      .x40-charge-power, .x40-charge-range { margin: 0; color: var(--muted); font-size: 17px; line-height: 1.15; }\n      .x40-charge-time { margin: 10px 0 14px; color: var(--accent); font-size: 28px; line-height: 1.15; font-weight: 600; }\n\n      .x40-full-bleed-section {\n        position: relative;\n        width: 100vw;\n        aspect-ratio: 1492 \/ 778;\n        margin-left: calc(50% - 50vw);\n        overflow: hidden;\n      }\n\n      .x40-full-bleed-copy {\n        position: absolute;\n        z-index: 1;\n        top: 9.8%;\n        left: 50%;\n        width: min(722px, calc(100% - 48px));\n        transform: translateX(-50%);\n        text-align: center;\n      }\n\n      .x40-standby-copy { top: 12%; }\n\n      .x40-portable-section {\n        display: grid;\n        width: calc(50% + 50vw);\n        grid-template-columns: minmax(340px, 520px) minmax(0, 1fr);\n        column-gap: 0;\n        align-items: start;\n        min-height: 674px;\n        padding-left: 8px;\n        padding-right: 0;\n      }\n\n      .x40-portable-copy { padding-top: 0; }\n      .x40-portable-copy .x40-content-headline,\n      .x40-portable-copy .x40-content-description { margin-left: 0; text-align: left; }\n      .x40-portable-copy .x40-content-description { max-width: 430px; }\n\n      .x40-dimensions-image {\n        display: block;\n        width: 100%;\n        height: 800px;\n        justify-self: end;\n        margin: 0;\n        padding: 0;\n        object-fit: contain;\n        object-position: right top;\n      }\n\n      .x40-box-section { padding-bottom: 0; text-align: center; }\n      .x40-box-picture { display: block; margin-top: 112px; }\n      .x40-box-image {\n        display: block;\n        width: 100%;\n        height: auto;\n        border-radius: 20px;\n      }\n\n      @media (max-width: 900px) {\n        .x40-page { width: min(calc(100vw - 32px), 720px); padding-top: 64px; }\n        .x40-shell h2.x40-section-title,\n        .x40-shell h2.x40-content-headline { padding-bottom: 25px; }\n        .x40-eyebrow-title { margin-bottom: 28px; }\n        .x40-feature-panel {\n          display: block;\n          min-height: 0;\n          aspect-ratio: 390 \/ 600;\n        }\n        .x40-selector-stack {\n          position: absolute;\n          top: auto;\n          bottom: 20px;\n          left: 0;\n          right: 0;\n          display: flex;\n          width: 100%;\n          gap: 10px;\n          margin: 0;\n          padding: 0 20px;\n          overflow-x: auto;\n          overscroll-behavior-inline: contain;\n          scrollbar-width: none;\n          scroll-snap-type: inline proximity;\n          transform: none;\n        }\n        .x40-selector-stack::-webkit-scrollbar { display: none; }\n        .x40-feature-panel:not(.x40-is-visible) .x40-selector-stack { transform: translateY(24px); }\n        .x40-feature-panel.x40-is-visible .x40-selector-stack { transform: translateY(0); }\n        .x40-feature-panel.x40-is-detail .x40-selector-stack {\n          visibility: hidden;\n          opacity: 0;\n          pointer-events: none;\n          transform: translateY(20px);\n        }\n        .x40-feature-item { flex: 0 0 auto; scroll-snap-align: start; }\n        .x40-feature-item + .x40-feature-item { margin-top: 0; }\n        .x40-feature-copy { display: none; }\n        .x40-selector { padding: 12px 16px; font-size: 14px; white-space: nowrap; }\n        .x40-selector__icon,\n        .x40-plus-icon { width: 20px; height: 20px; flex-basis: 20px; }\n        .x40-hero-product {\n          position: absolute;\n          top: 0;\n          left: 0;\n          width: 100%;\n          height: 100%;\n          aspect-ratio: auto;\n          transform: none;\n        }\n        .x40-hero-product.x40-is-changing { transform: scale(0.985); }\n        .x40-mobile-feature-detail {\n          position: absolute;\n          z-index: 4;\n          inset: 0;\n          display: block;\n          visibility: hidden;\n          opacity: 0;\n          pointer-events: none;\n          transition: opacity 320ms ease, visibility 320ms ease;\n        }\n        .x40-feature-panel.x40-is-detail .x40-mobile-feature-detail {\n          visibility: visible;\n          opacity: 1;\n          pointer-events: auto;\n        }\n        .x40-mobile-detail-close,\n        .x40-mobile-detail-arrow {\n          position: absolute;\n          display: grid;\n          width: 44px;\n          height: 44px;\n          place-items: center;\n          border: 0;\n          border-radius: 50%;\n          background: rgba(45, 45, 47, 0.68) !important;\n          color: var(--text);\n          cursor: pointer;\n          font-size: 28px;\n          line-height: 1;\n          -webkit-backdrop-filter: blur(18px) saturate(140%);\n          backdrop-filter: blur(18px) saturate(140%);\n        }\n        .x40-mobile-detail-close::before,\n        .x40-mobile-detail-close::after,\n        .x40-mobile-detail-arrow::before,\n        .x40-mobile-detail-arrow::after { display: none !important; content: none !important; }\n        .x40-mobile-detail-close { top: 18px; right: 18px; font-size: 24px; }\n        .x40-mobile-detail-arrow { bottom: 22px; }\n        .x40-mobile-detail-arrow--prev { left: 12px; }\n        .x40-mobile-detail-arrow--next { right: 12px; }\n        .x40-mobile-detail-card {\n          position: absolute;\n          bottom: 22px;\n          left: 50%;\n          width: min(72%, 420px);\n          min-height: 92px;\n          margin: 0;\n          padding: 18px 20px;\n          transform: translateX(-50%);\n          border-radius: 18px;\n          background: rgba(45, 45, 47, 0.72) !important;\n          color: var(--text);\n          font-size: 14px;\n          line-height: 1.45;\n          text-align: left;\n          -webkit-backdrop-filter: blur(22px) saturate(145%);\n          backdrop-filter: blur(22px) saturate(145%);\n        }\n        .x40-mobile-detail-card strong { font-weight: 600; }\n        .x40-design-section { padding-top: 64px; }\n        .x40-exploded-product { margin-top: 44px; }\n        .x40-section-block { margin-top: 72px; }\n        .x40-overnight-card { aspect-ratio: 4 \/ 5; }\n        .x40-overnight-copy {\n          top: 9%;\n          left: 7%;\n          width: 72%;\n          transform: none;\n        }\n        .x40-charge-stats { gap: 12px; padding-top: 48px; }\n        .x40-full-bleed-section { min-height: 680px; aspect-ratio: auto; }\n        .x40-full-bleed-copy { top: 9%; }\n        .x40-standby-copy { top: 9%; }\n        .x40-portable-section { grid-template-columns: 1fr; min-height: 0; padding-left: 0; }\n        .x40-portable-copy { padding: 0 8px; }\n        .x40-dimensions-image { height: auto; margin-top: 34px; object-position: center; }\n        .x40-box-picture { margin-top: 64px; }\n      }\n\n      @media (min-width: 901px) {\n        .x40-shell h2.x40-section-title,\n        .x40-shell h2.x40-content-headline { font-size: 80px !important; line-height: 1.1 !important; }\n        .x40-section-copy,\n        .x40-content-description { font-size: 21px; }\n        .x40-section-kicker,\n        .x40-content-eyebrow { font-size: 24px; }\n      }\n\n      @media (max-width: 520px) {\n        .x40-page { width: min(calc(100vw - 24px), 420px); padding-top: 42px; }\n        .x40-feature-panel { border-radius: 16px; }\n        .x40-hero-product { width: 100%; height: 100%; }\n        .x40-selector-stack { bottom: 16px; padding-inline: 16px; }\n        .x40-mobile-detail-card { bottom: 18px; width: calc(100% - 112px); padding: 16px; }\n        .x40-mobile-detail-arrow { bottom: 18px; }\n        .x40-shell h2.x40-section-title,\n        .x40-shell h2.x40-content-headline { font-size: 36px !important; line-height: 1.1 !important; }\n        .x40-section-kicker,\n        .x40-content-eyebrow { margin-bottom: 12px; }\n        .x40-section-copy,\n        .x40-content-description { margin-top: 16px; font-size: 14px; }\n        .x40-section-block { margin-top: 64px; }\n        .x40-overnight-card { min-height: 610px; aspect-ratio: auto; }\n        .x40-overnight-copy { top: 7%; width: 82%; }\n        .x40-charge-stats { padding-top: 40px; }\n        .x40-charge-stat img { width: 40px; height: 56px; }\n        .x40-charge-time { font-size: 23px; }\n        .x40-full-bleed-section { min-height: 600px; }\n        .x40-full-bleed-copy { width: calc(100% - 32px); }\n        .x40-box-picture { margin-top: 48px; }\n        .x40-box-image { border-radius: 16px; }\n      }\n\n      @media (prefers-reduced-motion: reduce) {\n        .x40-page,\n        .x40-page *,\n        .x40-page *::before,\n        .x40-page *::after { scroll-behavior: auto !important; transition: none !important; }\n        .x40-feature-panel:not(.x40-is-visible) .x40-selector-stack,\n        .x40-feature-panel:not(.x40-is-visible) .x40-feature-item { transform: none; }\n      }\n    \u003c\/style\u003e\n  \u003cdiv class=\"x40-shell\"\u003e\n  \u003cmain class=\"x40-page\" data-x40-root data-node-id=\"2:12\"\u003e\n      \u003ch2 class=\"x40-section-title x40-top-title\" data-node-id=\"3:2\"\u003eRegardez de plus près.\u003c\/h2\u003e\n\n      \u003csection class=\"x40-feature-panel\" aria-label=\"X40 Turbo charging features\" data-node-id=\"2:13\"\u003e\n        \u003cdiv class=\"x40-selector-stack\"\u003e\n          \u003cdiv class=\"x40-feature-item\"\u003e\n            \u003cbutton class=\"x40-selector\" type=\"button\" aria-expanded=\"false\" aria-controls=\"copy-iphone\" data-feature=\"iphone\"\u003e\n              \u003cspan class=\"x40-selector__icon\" aria-hidden=\"true\"\u003e\u003csvg class=\"x40-plus-icon\" version=\"1.1\" width=\"24px\" height=\"24px\" viewbox=\"0 0 24 24\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"11.3\" style=\"stroke: var(--app-pv-icon-fill); fill: none;\"\u003e\u003c\/circle\u003e\u003cg transform=\"translate(7 7)\" style=\"stroke: none; fill: var(--app-pv-icon-fill);\"\u003e\u003cpath d=\"m9 4h-3v-3c0-0.553-0.447-1-1-1s-1 0.447-1 1v3h-3c-0.553 0-1 0.447-1 1s0.447 1 1 1h3v3c0 0.553 0.447 1 1 1s1-0.447 1-1v-3h3c0.553 0 1-0.447 1-1s-0.447-1-1-1\"\u003e\u003c\/path\u003e\u003c\/g\u003e\u003c\/svg\u003e\u003c\/span\u003ePour iPhone\n            \u003c\/button\u003e\n            \u003cdiv class=\"x40-feature-copy x40-is-collapsed\" id=\"copy-iphone\" aria-hidden=\"true\"\u003e\n              \u003cdiv class=\"x40-feature-copy__inner\"\u003e\u003cp class=\"x40-feature-copy__text\"\u003ePosez-le, il s’aimante et se recharge. Compatible avec les coques MagSafe.\u003c\/p\u003e\u003c\/div\u003e\n            \u003c\/div\u003e\n          \u003c\/div\u003e\n          \u003cdiv class=\"x40-feature-item\"\u003e\n            \u003cbutton class=\"x40-selector\" type=\"button\" aria-expanded=\"false\" aria-controls=\"copy-watch\" data-feature=\"watch\"\u003e\n              \u003cspan class=\"x40-selector__icon\" aria-hidden=\"true\"\u003e\u003csvg class=\"x40-plus-icon\" version=\"1.1\" width=\"24px\" height=\"24px\" viewbox=\"0 0 24 24\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"11.3\" style=\"stroke: var(--app-pv-icon-fill); fill: none;\"\u003e\u003c\/circle\u003e\u003cg transform=\"translate(7 7)\" style=\"stroke: none; fill: var(--app-pv-icon-fill);\"\u003e\u003cpath d=\"m9 4h-3v-3c0-0.553-0.447-1-1-1s-1 0.447-1 1v3h-3c-0.553 0-1 0.447-1 1s0.447 1 1 1h3v3c0 0.553 0.447 1 1 1s1-0.447 1-1v-3h3c0.553 0 1-0.447 1-1s-0.447-1-1-1\"\u003e\u003c\/path\u003e\u003c\/g\u003e\u003c\/svg\u003e\u003c\/span\u003ePour Apple Watch\n            \u003c\/button\u003e\n            \u003cdiv class=\"x40-feature-copy x40-is-collapsed\" id=\"copy-watch\" aria-hidden=\"true\"\u003e\n              \u003cdiv class=\"x40-feature-copy__inner\"\u003e\u003cp class=\"x40-feature-copy__text\"\u003eRetournez-le. Dépliez-le. Et rechargez votre Apple Watch sans fil.\u003c\/p\u003e\u003c\/div\u003e\n            \u003c\/div\u003e\n          \u003c\/div\u003e\n          \u003cdiv class=\"x40-feature-item\"\u003e\n            \u003cbutton class=\"x40-selector\" type=\"button\" aria-expanded=\"false\" aria-controls=\"copy-airpods\" data-feature=\"airpods\"\u003e\n              \u003cspan class=\"x40-selector__icon\" aria-hidden=\"true\"\u003e\u003csvg class=\"x40-plus-icon\" version=\"1.1\" width=\"24px\" height=\"24px\" viewbox=\"0 0 24 24\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"11.3\" style=\"stroke: var(--app-pv-icon-fill); fill: none;\"\u003e\u003c\/circle\u003e\u003cg transform=\"translate(7 7)\" style=\"stroke: none; fill: var(--app-pv-icon-fill);\"\u003e\u003cpath d=\"m9 4h-3v-3c0-0.553-0.447-1-1-1s-1 0.447-1 1v3h-3c-0.553 0-1 0.447-1 1s0.447 1 1 1h3v3c0 0.553 0.447 1 1 1s1-0.447 1-1v-3h3c0.553 0 1-0.447 1-1s-0.447-1-1-1\"\u003e\u003c\/path\u003e\u003c\/g\u003e\u003c\/svg\u003e\u003c\/span\u003ePour AirPods\n            \u003c\/button\u003e\n            \u003cdiv class=\"x40-feature-copy x40-is-collapsed\" id=\"copy-airpods\" aria-hidden=\"true\"\u003e\n              \u003cdiv class=\"x40-feature-copy__inner\"\u003e\u003cp class=\"x40-feature-copy__text\"\u003ePlacez vos AirPods au centre de la zone de charge. La recharge sans fil démarre immédiatement.\u003c\/p\u003e\u003c\/div\u003e\n            \u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cvideo class=\"x40-hero-product x40-is-active\" data-video-key=\"default\" data-src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/c90dcd831fe44363b436ab6ae71a879b.webm\" poster=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/poster-x40-burgundy-default.jpg?v=1789390899\" muted playsinline preload=\"none\" aria-label=\"X40 Turbo Gray product animation\" data-node-id=\"3:15\"\u003e\u003c\/video\u003e\n        \u003cvideo class=\"x40-hero-product\" data-video-key=\"iphone\" data-src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/e8ad64816d3c412dacf70a5c2ea2beb9.webm\" poster=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/poster-x40-burgundy-for-iphone.jpg?v=1789390899\" muted playsinline preload=\"none\" aria-hidden=\"true\"\u003e\u003c\/video\u003e\n        \u003cvideo class=\"x40-hero-product\" data-video-key=\"watch\" data-src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/95229f06d0e04500a53f0961a89005f0.webm\" poster=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/poster-x40-burgundy-for-apple-watch.jpg?v=1789390900\" muted playsinline preload=\"none\" aria-hidden=\"true\"\u003e\u003c\/video\u003e\n        \u003cvideo class=\"x40-hero-product\" data-video-key=\"airpods\" data-src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/b05899e3a6cb49618d21a501d7b7f347.webm\" poster=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/poster-x40-burgundy-for-airpods.jpg?v=1789390900\" muted playsinline preload=\"none\" aria-hidden=\"true\"\u003e\u003c\/video\u003e\n        \u003cdiv class=\"x40-mobile-feature-detail\" aria-hidden=\"true\"\u003e\n          \u003cbutton class=\"x40-mobile-detail-close\" type=\"button\" aria-label=\"Close feature details\"\u003e×\u003c\/button\u003e\n          \u003cbutton class=\"x40-mobile-detail-arrow x40-mobile-detail-arrow--prev\" type=\"button\" aria-label=\"Previous feature\"\u003e‹\u003c\/button\u003e\n          \u003cp class=\"x40-mobile-detail-card\" role=\"status\"\u003e\u003c\/p\u003e\n          \u003cbutton class=\"x40-mobile-detail-arrow x40-mobile-detail-arrow--next\" type=\"button\" aria-label=\"Next feature\"\u003e›\u003c\/button\u003e\n        \u003c\/div\u003e\n      \u003c\/section\u003e\n\n      \u003csection class=\"x40-design-section\" data-node-id=\"2:14\"\u003e\n        \u003cp class=\"x40-section-kicker\"\u003eDesign\u003c\/p\u003e\n        \u003ch2 class=\"x40-section-title\"\u003eL’aluminium,\u003cbr\u003efaçonné avec précision.\u003c\/h2\u003e\n        \u003cp class=\"x40-section-copy\"\u003e\n          Microbillé pour une texture douce et raffinée. Anodisé pour une protection durable. Chaque surface bénéficie d’une finition précise, aussi agréable à regarder qu’à toucher.\n        \u003c\/p\u003e\n        \u003cimg class=\"x40-exploded-product\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/x40-turbo-burgundy-exploded-finish.jpg?v=1789391117\" alt=\"Exploded view of the X40 Turbo Gray aluminum finish\" loading=\"lazy\" decoding=\"async\" data-node-id=\"3:19\"\u003e\n      \u003c\/section\u003e\n\n      \u003csection class=\"x40-section-block x40-overnight-section\" data-node-id=\"27:2\" aria-labelledby=\"overnight-title\"\u003e\n        \u003cdiv class=\"x40-media-card x40-overnight-card\"\u003e\n          \u003cvideo class=\"x40-scroll-video\" muted playsinline preload=\"none\" poster=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/x40-turbo-burgundy-fast-charging-pc.jpg?v=1789391259\" data-poster-pc=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/x40-turbo-burgundy-fast-charging-pc.jpg?v=1789391259\" data-poster-mb=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/x40-turbo-burgundy-fast-charging-mb.jpg?v=1789391259\" aria-label=\"X40 Turbo fast charging demonstration\"\u003e\n            \u003csource media=\"(max-width: 900px)\" data-src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/c7de7921eaaa41b3839e68424cd59cc9.webm\" type=\"video\/webm\"\u003e\n            \u003csource data-src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/9c7606780e854c78878344a831256156.webm\" type=\"video\/webm\"\u003e\u003c\/source\u003e\u003c\/video\u003e\n          \u003cdiv class=\"x40-overnight-copy\"\u003e\n            \u003cp class=\"x40-content-eyebrow\"\u003eCertifié Qi2.2\u003c\/p\u003e\n            \u003ch2 class=\"x40-content-headline\" id=\"overnight-title\"\u003ePlus besoin de charger toute la nuit.\u003c\/h2\u003e\n            \u003cp class=\"x40-content-description\"\u003eMettez votre téléphone en charge avant de passer sous la douche, savourez votre café du matin et partez avec 80 % de batterie. Une seule main suffit pour le poser sur le support.\u003c\/p\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"x40-charge-stats\" aria-label=\"Charging performance\"\u003e\n          \u003carticle class=\"x40-charge-stat\"\u003e\n            \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/Charging_for_iPhone.svg?v=1785736195\" alt=\"Charging for iPhone\" loading=\"lazy\" decoding=\"async\"\u003e\n            \u003cp class=\"x40-charge-power\"\u003e25 W max.\u003c\/p\u003e\n            \u003cp class=\"x40-charge-time\"\u003e45 min\u003c\/p\u003e\n            \u003cp class=\"x40-charge-range\"\u003e0~80%\u003c\/p\u003e\n          \u003c\/article\u003e\n          \u003carticle class=\"x40-charge-stat\"\u003e\n            \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/Charging_for_Apple_Watch.svg?v=1785736195\" alt=\"Charging for Apple Watch\" loading=\"lazy\" decoding=\"async\"\u003e\n            \u003cp class=\"x40-charge-power\"\u003e5 W max.\u003c\/p\u003e\n            \u003cp class=\"x40-charge-time\"\u003e40 min\u003c\/p\u003e\n            \u003cp class=\"x40-charge-range\"\u003e0~50%\u003c\/p\u003e\n          \u003c\/article\u003e\n          \u003carticle class=\"x40-charge-stat\"\u003e\n            \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/Charging_for_AirPods.svg?v=1785736195\" alt=\"Charging for AirPods\" loading=\"lazy\" decoding=\"async\"\u003e\n            \u003cp class=\"x40-charge-power\"\u003e5 W max.\u003c\/p\u003e\n            \u003cp class=\"x40-charge-time\"\u003e50 min\u003c\/p\u003e\n            \u003cp class=\"x40-charge-range\"\u003e0~80%\u003c\/p\u003e\n          \u003c\/article\u003e\n        \u003c\/div\u003e\n      \u003c\/section\u003e\n\n      \u003csection class=\"x40-section-block x40-full-bleed-section x40-full-bleed-section--green\" data-node-id=\"27:3\" aria-labelledby=\"magsafe-title\"\u003e\n        \u003cvideo class=\"x40-scroll-video\" muted playsinline preload=\"none\" poster=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/poster-x40-burgundy-MagSafe-PC.jpg?v=1789391506\" data-poster-pc=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/poster-x40-burgundy-MagSafe-PC.jpg?v=1789391506\" data-poster-mb=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/poster-x40-burgundy-MagSafe-MB.jpg?v=1789391506\" aria-label=\"X40 Turbo MagSafe experience demonstration\"\u003e\n          \u003csource media=\"(max-width: 900px)\" data-src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/86e559bc42664c55b8510cea83bbff3f.webm\" type=\"video\/webm\"\u003e\n          \u003csource data-src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/ffd90e105e5e48feaa58b2c89b7482d8.webm\" type=\"video\/webm\"\u003e\u003c\/source\u003e\u003c\/video\u003e\n        \u003cdiv class=\"x40-full-bleed-copy\"\u003e\n          \u003cp class=\"x40-content-eyebrow\"\u003eDesign\u003c\/p\u003e\n          \u003ch2 class=\"x40-content-headline\" id=\"magsafe-title\"\u003eL’expérience MagSafe\u003cbr\u003eparfaite\u003c\/h2\u003e\n          \u003cp class=\"x40-content-description\"\u003eConçu pour une utilisation facile d’une seule main et une fixation MagSafe sûre. Chaque aimant est calibré avec précision pour assurer force et stabilité : fluidité, simplicité, élégance.\u003c\/p\u003e\n        \u003c\/div\u003e\n      \u003c\/section\u003e\n\n      \u003csection class=\"x40-full-bleed-section x40-full-bleed-section--blue\" data-node-id=\"27:4\" aria-labelledby=\"standby-title\"\u003e\n        \u003cvideo class=\"x40-scroll-video\" muted playsinline preload=\"none\" poster=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/poster-x40-burgundy-StandBy-PC.jpg?v=1789391740\" data-poster-pc=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/poster-x40-burgundy-StandBy-PC.jpg?v=1789391740\" data-poster-mb=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/poster-x40-burgundy-StandBy-MB.jpg?v=1789391739\" aria-label=\"X40 Turbo StandBy mode demonstration\"\u003e\n          \u003csource media=\"(max-width: 900px)\" data-src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/5d5b0c03fcba41c1bd34bab543bf3a08.webm\" type=\"video\/webm\"\u003e\n          \u003csource data-src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/74e4c21b55b14bff8b229199df720057.webm\" type=\"video\/webm\"\u003e\u003c\/source\u003e\u003c\/video\u003e\n        \u003cdiv class=\"x40-full-bleed-copy x40-standby-copy\"\u003e\n          \u003ch2 class=\"x40-content-headline\" id=\"standby-title\"\u003ePrêt pour le mode En veille\u003c\/h2\u003e\n          \u003cp class=\"x40-content-description\"\u003eProfitez de la fonction En veille de votre iPhone. Avec le X40 Turbo, placez simplement votre téléphone à l’horizontale pour l’activer.\u003c\/p\u003e\n        \u003c\/div\u003e\n      \u003c\/section\u003e\n\n      \u003csection class=\"x40-section-block x40-portable-section\" data-node-id=\"27:5\" aria-labelledby=\"portable-title\"\u003e\n        \u003cdiv class=\"x40-portable-copy\"\u003e\n          \u003cp class=\"x40-content-eyebrow\"\u003eDimensions\u003c\/p\u003e\n          \u003ch2 class=\"x40-content-headline\" id=\"portable-title\"\u003eCompact,\u003cbr\u003eprêt à vous suivre\u003cbr\u003epartout\u003c\/h2\u003e\n          \u003cp class=\"x40-content-description\"\u003eAssez petit pour vous suivre partout. Assez puissant pour le quotidien. Le X40 Turbo vous permet de rester prêt, où que la vie vous mène.\u003c\/p\u003e\n        \u003c\/div\u003e\n        \u003cimg class=\"x40-dimensions-image\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/x40-turbo-Dimensions.jpg?v=1789391953\" alt=\"X40 Turbo folded dimensions and portable size\" loading=\"lazy\" decoding=\"async\"\u003e\n      \u003c\/section\u003e\n\n      \u003csection class=\"x40-section-block x40-box-section\" data-node-id=\"27:6\" aria-labelledby=\"box-title\"\u003e\n        \u003ch2 class=\"x40-content-headline\" id=\"box-title\"\u003eContenu de la boîte.\u003c\/h2\u003e\n        \u003cp class=\"x40-content-description\"\u003eTout ce qu’il vous faut. Dès l’ouverture de la boîte.\u003c\/p\u003e\n        \u003cpicture class=\"x40-box-picture\"\u003e\n          \u003csource media=\"(max-width: 900px)\" srcset=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/x40-turbo-Packaging-MB.jpg?v=1789392050\"\u003e\n          \u003cimg class=\"x40-box-image\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/x40-turbo-Packaging-PC.jpg?v=1789391953\" alt=\"X40 Turbo package contents\" loading=\"lazy\" decoding=\"async\"\u003e\u003c\/picture\u003e\n      \u003c\/section\u003e\n    \u003c\/main\u003e\n  \u003c\/div\u003e\n\n    \u003cscript\u003e\n    (() =\u003e {\n      const initX40 = (root) =\u003e {\n      if (root.dataset.x40Ready === \"true\") return;\n      root.dataset.x40Ready = \"true\";\n\n      const buttons = [...root.querySelectorAll(\"[data-feature]\")];\n      const product = root.querySelector('[data-video-key=\"default\"]');\n      const featureVideoElements = new Map(\n        [...root.querySelectorAll(\".x40-hero-product[data-video-key]\")]\n          .filter((video) =\u003e video.dataset.videoKey !== \"default\")\n          .map((video) =\u003e [video.dataset.videoKey, video])\n      );\n      let activeProductVideo = product;\n      const instanceId = `x40-${Math.random().toString(36).slice(2, 9)}`;\n      buttons.forEach((button) =\u003e {\n        const panel = root.querySelector(`[id=\"${button.getAttribute(\"aria-controls\")}\"]`);\n        if (!panel) return;\n        panel.id = `${panel.id}-${instanceId}`;\n        button.setAttribute(\"aria-controls\", panel.id);\n      });\n      const featureContent = {\n        iphone: {\n          label: \"Pour iPhone\",\n          copy: \"Coque monobloc en aluminium. Optimisée pour les performances et la batterie. L’alliage d’aluminium est remarquablement léger et offre une conductivité thermique exceptionnelle.\"\n        },\n        watch: {\n          label: \"Pour Apple Watch\",\n          copy: \"Une surface de charge dédiée maintient votre Apple Watch bien en place, visible et prête à l’emploi toute la journée.\"\n        },\n        airpods: {\n          label: \"Pour AirPods\",\n          copy: \"Une base de recharge sans fil stable offre à vos AirPods un emplacement précis pour se recharger sans encombrement supplémentaire.\"\n        }\n      };\n      const featureKeys = [...featureVideoElements.keys()];\n      const mobileQuery = window.matchMedia(\"(max-width: 900px)\");\n      const defaultVideo = \"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/c90dcd831fe44363b436ab6ae71a879b.webm\";\n      const observedVideos = [...root.querySelectorAll(\".x40-scroll-video\")];\n      const allFeatureVideos = [product, ...featureVideoElements.values()];\n      const allVideos = [...allFeatureVideos, ...observedVideos];\n      const preloadQueue = [];\n      const queuedVideos = new Set();\n      let preloadBusy = false;\n\n      const updateResponsivePosters = () =\u003e {\n        observedVideos.forEach((video) =\u003e {\n          const poster = mobileQuery.matches ? video.dataset.posterMb : video.dataset.posterPc;\n          if (poster \u0026\u0026 video.poster !== new URL(poster, document.baseURI).href) video.poster = poster;\n        });\n      };\n      updateResponsivePosters();\n\n      const hydrateVideo = (video) =\u003e {\n        if (video.dataset.hydrated === \"true\") return;\n        video.preload = \"auto\";\n        if (video.dataset.src) {\n          video.src = video.dataset.src;\n          video.removeAttribute(\"data-src\");\n        }\n        video.querySelectorAll(\"source[data-src]\").forEach((source) =\u003e {\n          source.src = source.dataset.src;\n          source.removeAttribute(\"data-src\");\n        });\n        video.dataset.hydrated = \"true\";\n        video.load();\n      };\n\n      const videoHost = (video) =\u003e video.closest(\".x40-feature-panel, .x40-media-card, .x40-full-bleed-section\");\n      const setBuffering = (video, buffering) =\u003e videoHost(video)?.classList.toggle(\"x40-is-buffering\", buffering);\n\n      const prepareAndPlay = (video) =\u003e {\n        queuedVideos.delete(video);\n        video.dataset.wantsPlayback = \"true\";\n        hydrateVideo(video);\n        if (video.readyState \u003c HTMLMediaElement.HAVE_FUTURE_DATA) setBuffering(video, true);\n        const playback = video.play();\n        if (playback) playback.catch(() =\u003e {});\n      };\n\n      const drainPreloadQueue = () =\u003e {\n        if (preloadBusy) return;\n        const video = preloadQueue.shift();\n        if (!video) return;\n        queuedVideos.delete(video);\n        if (video.dataset.hydrated === \"true\") {\n          drainPreloadQueue();\n          return;\n        }\n        preloadBusy = true;\n        let finished = false;\n        const finish = () =\u003e {\n          if (finished) return;\n          finished = true;\n          preloadBusy = false;\n          video.removeEventListener(\"canplay\", finish);\n          video.removeEventListener(\"error\", finish);\n          window.clearTimeout(timeout);\n          drainPreloadQueue();\n        };\n        const timeout = window.setTimeout(finish, 6000);\n        video.addEventListener(\"canplay\", finish, { once: true });\n        video.addEventListener(\"error\", finish, { once: true });\n        hydrateVideo(video);\n        if (video.readyState \u003e= HTMLMediaElement.HAVE_FUTURE_DATA) finish();\n      };\n\n      const queuePreload = (video, priority = false) =\u003e {\n        if (video.dataset.hydrated === \"true\" || queuedVideos.has(video)) return;\n        queuedVideos.add(video);\n        priority ? preloadQueue.unshift(video) : preloadQueue.push(video);\n        drainPreloadQueue();\n      };\n\n      allVideos.forEach((video) =\u003e {\n        video.addEventListener(\"waiting\", () =\u003e {\n          const canControlIndicator = !allFeatureVideos.includes(video) || video === activeProductVideo;\n          if (canControlIndicator \u0026\u0026 video.dataset.wantsPlayback === \"true\") setBuffering(video, true);\n        });\n        [\"canplay\", \"playing\", \"ended\", \"error\"].forEach((eventName) =\u003e {\n          video.addEventListener(eventName, () =\u003e {\n            const canControlIndicator = !allFeatureVideos.includes(video) || video === activeProductVideo;\n            if (canControlIndicator) setBuffering(video, false);\n          });\n        });\n        video.addEventListener(\"playing\", () =\u003e {\n          video.dataset.started = \"true\";\n          video.dataset.autoPaused = \"false\";\n        });\n        video.addEventListener(\"ended\", () =\u003e {\n          video.dataset.wantsPlayback = \"false\";\n          video.dataset.finished = \"true\";\n        });\n      });\n\n      const featurePanel = root.querySelector(\".x40-feature-panel\");\n      const mobileDetail = root.querySelector(\".x40-mobile-feature-detail\");\n      const mobileDetailCard = root.querySelector(\".x40-mobile-detail-card\");\n      const mobileClose = root.querySelector(\".x40-mobile-detail-close\");\n      const mobilePrevious = root.querySelector(\".x40-mobile-detail-arrow--prev\");\n      const mobileNext = root.querySelector(\".x40-mobile-detail-arrow--next\");\n      let activeFeature = null;\n      const revealFeaturePanel = () =\u003e {\n        if (featurePanel.classList.contains(\"x40-is-visible\")) return;\n        featurePanel.classList.add(\"x40-is-visible\");\n        product.dataset.played = \"true\";\n        prepareAndPlay(product);\n      };\n\n      if (\"IntersectionObserver\" in window) {\n        const featureObserver = new IntersectionObserver((entries, observer) =\u003e {\n          entries.forEach((entry) =\u003e {\n            if (!entry.isIntersecting) return;\n            revealFeaturePanel();\n            observer.unobserve(entry.target);\n          });\n        }, { rootMargin: \"0px 0px -78% 0px\", threshold: 0 });\n        featureObserver.observe(featurePanel);\n      } else {\n        revealFeaturePanel();\n      }\n\n      const playFeatureVideo = (key) =\u003e {\n        const nextVideo = featureVideoElements.get(key);\n        if (!nextVideo) return;\n        const shouldRestart = nextVideo.dataset.started === \"true\";\n        if (activeProductVideo !== nextVideo) {\n          activeProductVideo.pause();\n          activeProductVideo.dataset.wantsPlayback = \"false\";\n          activeProductVideo.classList.remove(\"x40-is-active\", \"x40-is-changing\");\n          activeProductVideo.setAttribute(\"aria-hidden\", \"true\");\n          activeProductVideo = nextVideo;\n          activeProductVideo.classList.add(\"x40-is-active\", \"x40-is-changing\");\n          activeProductVideo.removeAttribute(\"aria-hidden\");\n        }\n        hydrateVideo(activeProductVideo);\n        activeProductVideo.dataset.finished = \"false\";\n        if (shouldRestart) {\n          if (nextVideo.readyState \u003e= HTMLMediaElement.HAVE_METADATA) {\n            nextVideo.currentTime = 0;\n          } else {\n            nextVideo.addEventListener(\"loadedmetadata\", () =\u003e { nextVideo.currentTime = 0; }, { once: true });\n          }\n        }\n        prepareAndPlay(activeProductVideo);\n        window.setTimeout(() =\u003e nextVideo.classList.remove(\"x40-is-changing\"), 180);\n      };\n\n      const selectFeature = (key) =\u003e {\n        activeFeature = key;\n        buttons.forEach((item) =\u003e {\n          const active = item.dataset.feature === key;\n          item.setAttribute(\"aria-expanded\", String(active));\n          const panel = root.querySelector(`[id=\"${item.getAttribute(\"aria-controls\")}\"]`);\n          panel.classList.toggle(\"x40-is-collapsed\", !active || mobileQuery.matches);\n          panel.setAttribute(\"aria-hidden\", String(!active || mobileQuery.matches));\n        });\n\n        if (mobileQuery.matches) {\n          const content = featureContent[key];\n          const label = document.createElement(\"strong\");\n          label.textContent = `${content.label}.`;\n          mobileDetailCard.replaceChildren(label, document.createTextNode(` ${content.copy}`));\n          featurePanel.classList.add(\"x40-is-detail\");\n          mobileDetail.setAttribute(\"aria-hidden\", \"false\");\n        }\n        playFeatureVideo(key);\n      };\n\n      const closeMobileDetail = () =\u003e {\n        activeFeature = null;\n        featurePanel.classList.remove(\"x40-is-detail\");\n        mobileDetail.setAttribute(\"aria-hidden\", \"true\");\n        buttons.forEach((item) =\u003e item.setAttribute(\"aria-expanded\", \"false\"));\n        activeProductVideo.pause();\n        activeProductVideo.dataset.wantsPlayback = \"false\";\n        activeProductVideo.classList.remove(\"x40-is-active\", \"x40-is-changing\");\n        activeProductVideo.setAttribute(\"aria-hidden\", \"true\");\n        activeProductVideo = product;\n        activeProductVideo.classList.add(\"x40-is-active\");\n        activeProductVideo.removeAttribute(\"aria-hidden\");\n        hydrateVideo(activeProductVideo);\n        activeProductVideo.dataset.finished = \"false\";\n        if (activeProductVideo.readyState \u003e= HTMLMediaElement.HAVE_METADATA) {\n          activeProductVideo.currentTime = 0;\n        } else {\n          product.addEventListener(\"loadedmetadata\", () =\u003e { product.currentTime = 0; }, { once: true });\n        }\n        prepareAndPlay(activeProductVideo);\n      };\n\n      const warmFeatureVideo = (key) =\u003e {\n        const video = featureVideoElements.get(key);\n        if (video) queuePreload(video, true);\n      };\n\n      let featureCacheQueued = false;\n      const beginFeatureCacheAfterDefault = () =\u003e {\n        const activeSource = product.currentSrc || product.src;\n        if (featureCacheQueued || activeSource !== defaultVideo) return;\n        featureCacheQueued = true;\n        featureKeys.forEach((key) =\u003e {\n          const video = featureVideoElements.get(key);\n          if (video) queuePreload(video);\n        });\n      };\n      product.addEventListener(\"canplay\", beginFeatureCacheAfterDefault);\n      if (product.readyState \u003e= HTMLMediaElement.HAVE_FUTURE_DATA) beginFeatureCacheAfterDefault();\n\n      buttons.forEach((button) =\u003e {\n        button.addEventListener(\"click\", () =\u003e selectFeature(button.dataset.feature));\n        let hoverTimer;\n        button.addEventListener(\"pointerenter\", () =\u003e {\n          hoverTimer = window.setTimeout(() =\u003e warmFeatureVideo(button.dataset.feature), 160);\n        });\n        button.addEventListener(\"pointerleave\", () =\u003e window.clearTimeout(hoverTimer));\n        button.addEventListener(\"focus\", () =\u003e warmFeatureVideo(button.dataset.feature), { once: true });\n        button.addEventListener(\"touchstart\", () =\u003e warmFeatureVideo(button.dataset.feature), { passive: true, once: true });\n      });\n\n      const moveMobileFeature = (direction) =\u003e {\n        const currentIndex = Math.max(0, featureKeys.indexOf(activeFeature));\n        const nextIndex = (currentIndex + direction + featureKeys.length) % featureKeys.length;\n        selectFeature(featureKeys[nextIndex]);\n      };\n\n      mobileClose.addEventListener(\"click\", closeMobileDetail);\n      mobilePrevious.addEventListener(\"click\", () =\u003e moveMobileFeature(-1));\n      mobileNext.addEventListener(\"click\", () =\u003e moveMobileFeature(1));\n      mobileQuery.addEventListener(\"change\", () =\u003e {\n        updateResponsivePosters();\n        if (!mobileQuery.matches \u0026\u0026 featurePanel.classList.contains(\"x40-is-detail\")) closeMobileDetail();\n      });\n\n      if (\"IntersectionObserver\" in window) {\n        const preloadObserver = new IntersectionObserver((entries, observer) =\u003e {\n          entries.forEach((entry) =\u003e {\n            if (!entry.isIntersecting) return;\n            queuePreload(entry.target);\n            observer.unobserve(entry.target);\n          });\n        }, { rootMargin: \"1200px 0px\", threshold: 0 });\n\n        [product, ...observedVideos].forEach((video) =\u003e preloadObserver.observe(video));\n\n        const videoObserver = new IntersectionObserver((entries, observer) =\u003e {\n          entries.forEach((entry) =\u003e {\n            if (!entry.isIntersecting || entry.target.dataset.played === \"true\") return;\n            entry.target.dataset.played = \"true\";\n            prepareAndPlay(entry.target);\n            observer.unobserve(entry.target);\n          });\n        }, { rootMargin: \"0px 0px -78% 0px\", threshold: 0 });\n        observedVideos.forEach((video) =\u003e videoObserver.observe(video));\n\n        const visibilityObserver = new IntersectionObserver((entries) =\u003e {\n          entries.forEach((entry) =\u003e {\n            const video = entry.target;\n            const isFeatureVideo = allFeatureVideos.includes(video);\n            if (isFeatureVideo \u0026\u0026 video !== activeProductVideo) {\n              video.pause();\n              video.dataset.autoPaused = \"false\";\n              setBuffering(video, false);\n              return;\n            }\n            if (!entry.isIntersecting) {\n              if (!video.paused \u0026\u0026 !video.ended) {\n                video.pause();\n                video.dataset.autoPaused = \"true\";\n              }\n              setBuffering(video, false);\n              return;\n            }\n            if (video.dataset.autoPaused === \"true\" \u0026\u0026 video.dataset.finished !== \"true\") prepareAndPlay(video);\n          });\n        }, { rootMargin: \"80px 0px\", threshold: 0.06 });\n        allVideos.forEach((video) =\u003e visibilityObserver.observe(video));\n      } else {\n        allVideos.forEach(queuePreload);\n      }\n      };\n\n      const bootX40 = (scope = document) =\u003e {\n        if (scope.matches?.(\"[data-x40-root]\")) initX40(scope);\n        scope.querySelectorAll?.(\"[data-x40-root]\").forEach(initX40);\n      };\n\n      bootX40();\n      if (!window.__x40ShopifySectionListener) {\n        window.__x40ShopifySectionListener = true;\n        document.addEventListener(\"shopify:section:load\", (event) =\u003e bootX40(event.target));\n      }\n    })();\n    \u003c\/script\u003e\n\n","brand":"KUXIU","offers":[{"title":"Default Title","offer_id":47876908646452,"sku":"X40Turbo-QI2.2-Dark-Cherry","price":78.99,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0548\/8594\/1300\/files\/KUXIUX40TurboBurgundy_1.png?v=1789383941","url":"https:\/\/kuxiu.com\/fr\/products\/kuxiu-x40-turbo-cherry","provider":"KUXIU","version":"1.0","type":"link"}