{"assets": "\u003clink href=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/style.css?v=10061454632771420651770284343\" rel=\"stylesheet\" type=\"text\/css\" media=\"all\" \/\u003e\n \u003cscript src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/application.js?v=50113050323558070391745400132\" defer=\"defer\"\u003e\u003c\/script\u003e\n \u003cstyle\u003e\n \n \u003c\/style\u003e", "header": "\u003cdiv id=\"shopify-section-header\" class=\"shopify-section\"\u003e\u003cstyle data-shopify\u003e\n\n .button {\n padding: 0.625rem 1.5rem;\n font-weight: 500;\n font-size: 0.9375rem;\n cursor: pointer;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n text-decoration: none;\n border: 2px solid transparent;\n font-family: Raleway, Serif;\n }\n\n .button-primary {\n background-color: #156669;\n color: white;\n border-color: #156669;\n }\n\n .button-primary:hover {\n background-color: #156669;\n border-color: #156669;\n transform: translateY(-1px);\n box-shadow: 0 4px 6px rgba(46, 181, 176, 0.2);\n }\n\n .button-secondary {\n background-color: white;\n color: #1a1a1a;\n border-color: #156669;\n }\n\n .button-secondary:hover {\n background-color: #f0fffe;\n color: black;\n transform: translateY(-1px);\n }\n\n\n .cart-count-bubble:empty {\n display: none;\n }\n\n .cart-count-bubble {\n position: absolute;\n background-color: #2EB5B0;\n font-weight: bolder;\n color: white;\n height: 1.7rem;\n width: 1.7rem;\n border-radius: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n bottom: 0rem;\n right: 0rem;\n line-height: calc(1 + 0.1 \/ var(--font-body-scale));\n }\n\n .navbar-image-josette- {\n background-image: url(\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/.png?v=15446\");\n background-size: cover;\n height: 64px;\n width: 64px;\n }\n\n .navbar-image-josette-:hover {\n background-image: url(\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/-hover.gif?v=15446\");\n background-size: cover;\n height: 64px;\n width: 64px;\n }\n\n .header__icon:not(.header__icon--summary),\n .header__icon span {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .header__icon {\n color: rgb(var(--color-foreground));\n }\n\n .header__icon span {\n height: 100%;\n }\n\n .header__icon::after {\n content: none;\n }\n\n .header__icon:hover .icon,\n .modal__close-button:hover .icon {\n transform: scale(1.07);\n }\n\n .header__icon .icon {\n height: 2rem;\n width: 2rem;\n fill: none;\n vertical-align: middle;\n }\n\n .header__icon,\n .header__icon--cart .icon {\n height: 4.4rem;\n width: 4.4rem;\n padding: 0;\n }\n\n .header__icon--cart {\n position: relative;\n margin-right: -1.2rem;\n }\n\n \/* ===========================================\n RESPONSIVE : Mobile et Tablette Portrait\n =========================================== *\/\n\n\/* Par défaut, cacher la nav mobile sur desktop *\/\n.dev-header-responsive-mobile {\n display: none;\n}\n\n.bg-nav-mobile {\n display: none;\n}\n\n\/* Par défaut, montrer la nav desktop *\/\n.dev-header {\n display: block;\n}\n\n\/* Mobile et Tablette : afficher nav mobile, cacher nav desktop *\/\n@media screen and (max-width: 1100px) {\n\n \/* Empêcher le débordement horizontal *\/\n html, body {\n overflow-x: hidden;\n max-width: 100vw;\n }\n\n .wrap, .wrap * {\n max-width: 100%;\n box-sizing: border-box;\n }\n\n .wrap img {\n max-width: 100%;\n height: auto;\n }\n\n \/* Cacher le header desktop *\/\n .dev-header {\n display: none !important;\n }\n\n \/* Afficher la nav mobile *\/\n .dev-header-responsive-mobile {\n display: block;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 75px;\n max-height: 75px;\n overflow: hidden;\n background-color: white;\n z-index: 99;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n\n .dev-header-responsive-mobile \u003e div {\n height: 100%;\n }\n\n .dev-header-responsive-mobile a {\n text-decoration: none;\n color: black;\n }\n\n .dev-header-responsive-mobile .header__icon,\n .dev-header-responsive-mobile .header__icon--cart {\n height: auto;\n width: auto;\n }\n\n .dev-header-responsive-mobile img {\n max-height: 60px;\n }\n\n body {\n padding-top: 75px; \/* Hauteur de la barre de navigation mobile *\/\n }\n\n .element-cart-display-column {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n margin-top: 15px;\n }\n\n .cart-count-bubble {\n bottom: 0.3rem;\n right: 0rem;\n }\n\n .bg-nav-mobile {\n display: flex;\n width: 95%;\n position: fixed;\n top: 0;\n height: 100dvh;\n background-image: url(\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/bg-nav-mobile.svg?v=66758762028970009221728902196\");\n background-size: 100% 100%;\n background-position: left;\n background-repeat: no-repeat;\n flex-direction: column;\n z-index: 999;\n padding-left: 10px;\n\n transform: translateX(-100%);\n transition: transform 0.6s ease-in-out;\n visibility: hidden; \/* Masque complètement la navigation au départ *\/\n }\n\n .bg-nav-mobile.visible {\n visibility: visible; \/* Rendu visible lorsque l'utilisateur interagit *\/\n }\n\n .bg-nav-mobile.open {\n transform: translateX(0);\n }\n\n .header__icon--cart-mobile {\n position: relative !important;\n margin-right: 0 !important;\n }\n\n #search-form-responsive {\n overflow: hidden;\n max-height: 0;\n transition: max-height 0s ease-in-out 0s;\n }\n\n #search-form-responsive.expanded {\n max-height: 200px;\n transition: max-height 0.5s ease-in-out 0s;\n }\n\n \/* Mega menu caché sur mobile\/tablette portrait *\/\n .megamenu-wrapper {\n display: none !important;\n }\n}\n\u003c\/style\u003e\n\n\u003c!-- MEGA MENU STYLES --\u003e\n\u003cstyle\u003e\n \/* Container principal du mega menu *\/\n .megamenu-wrapper {\n display: flex;\n align-items: center;\n gap: 2rem;\n }\n\n \/* Item de navigation *\/\n .megamenu-item {\n position: static;\n }\n\n \/* Trigger (lien cliquable) *\/\n .megamenu-trigger {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 0.5rem 1rem;\n text-decoration: none;\n cursor: pointer;\n font-family: Raleway, serif;\n font-weight: bold;\n font-size: 0.9rem;\n text-transform: uppercase;\n color: #1a1a1a;\n transition: color 0.2s;\n }\n\n .megamenu-trigger:hover {\n \/*color: #34B6B0;*\/\n }\n\n .megamenu-trigger-icon {\n width: 70px;\n height: 70px;\n border-radius: 8px;\n margin-bottom: 0.5rem;\n }\n\n \/* Le dropdown pleine largeur *\/\n .megamenu-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n width: calc(100vw - var(--scrollbar-width, 0px));\n max-width: 100%;\n border-top: 2px solid #F2F2F2;\n border-bottom: 2px solid #F2F2F2;\n background-color: white;\n padding: 1rem 0;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.25s ease, visibility 0.25s ease;\n z-index: 1000;\n box-sizing: border-box;\n overflow-x: hidden;\n }\n\n \/* Afficher le dropdown au survol *\/\n .megamenu-item:hover .megamenu-dropdown {\n opacity: 1;\n visibility: visible;\n }\n\n \/* Contenu centré dans le dropdown *\/\n .megamenu-content {\n max-width: 1000px;\n margin: 0 auto;\n padding: 0 2rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1rem;\n }\n\n \/* Section (Hauteurs ou Collections) *\/\n .megamenu-section {\n width: 100%;\n }\n\n .megamenu-section-title {\n font-family: Raleway, serif;\n font-size: 0.75rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n margin-bottom: 0.5rem;\n }\n\n \/* Grille des items *\/\n .megamenu-grid {\n display: flex;\n justify-content: center;\n flex-wrap: nowrap;\n gap: 2rem;\n }\n\n .megamenu-grid--collections {\n gap: 2rem;\n }\n\n \/* Item cliquable (catégorie ou collection) *\/\n .megamenu-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-decoration: none;\n padding: 0.5rem;\n transition: background-color 0.2s, transform 0.2s;\n width: 100px;\n flex-shrink: 0;\n }\n\n .megamenu-card--collection {\n width: 125px;\n }\n\n \/* Carte \"Voir tout\" *\/\n .megamenu-card--see-all {\n width: 125px;\n }\n\n .megamenu-see-all-box {\n width: 100px;\n height: 100px;\n border: 1px solid black;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 0.5rem;\n transition: background-color 0.2s, transform 0.2s;\n box-sizing: border-box;\n }\n\n .megamenu-see-all-text {\n font-family: Raleway, serif;\n font-size: 0.7rem;\n font-weight: 600;\n color: #1a1a1a;\n line-height: 1.2;\n transition: color 0.2s;\n }\n\n .megamenu-see-all-arrow {\n font-size: 1.2rem;\n color: black;\n margin-top: 0.3rem;\n transition: color 0.2s;\n }\n\n .megamenu-card:hover {\n transform: translateY(-2px);\n }\n\n .megamenu-card-image {\n width: 75px;\n height: 75px;\n border-radius: 8px;\n margin-bottom: 0.3rem;\n }\n\n .megamenu-card-image--collection {\n width: 100px;\n height: 100px;\n aspect-ratio: 1;\n }\n\n .megamenu-card-title {\n font-family: Raleway, serif;\n font-size: 0.8rem;\n font-weight: 600;\n color: #1a1a1a;\n text-align: center;\n word-wrap: break-word;\n overflow-wrap: break-word;\n width: 100%;\n line-height: 1.2;\n }\n\n \/* Le header doit être en position relative pour le dropdown *\/\n .dev-header nav.navbar {\n position: relative;\n }\n\n \/* Grille à 3 colonnes centrée (pour Atelier) *\/\n .megamenu-grid--3cols {\n justify-content: center;\n gap: 1rem;\n }\n\n .megamenu-content--centered {\n max-width: 600px;\n }\n\n \/* Petit dropdown (pour Atelier) *\/\n .megamenu-dropdown--small {\n width: auto;\n min-width: 200px;\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n padding: 1rem;\n }\n\n .megamenu-dropdown-small-content {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .megamenu-dropdown-link {\n display: block;\n padding: 0.75rem 1rem;\n font-family: Raleway, serif;\n font-size: 0.9rem;\n font-weight: 600;\n color: #1a1a1a;\n text-decoration: none;\n border-radius: 6px;\n transition: background-color 0.2s, color 0.2s;\n }\n\n .megamenu-dropdown-link:hover {\n background-color: #f5fffe;\n color: #2EB5B0;\n }\n\u003c\/style\u003e\n\n\u003cstyle\u003e\n \/* Empêcher tout défilement de la page quand le panier est ouvert *\/\n body.cart-open {\n \/* Aucun style qui affecte le défilement *\/\n }\n\n \/* Styles pour le conteneur du panier *\/\n #cart-slider {\n padding: 20px;\n z-index: 999;\n position: fixed;\n top: 0;\n right: -100%;\n width: 500px;\n height: 100vh;\n \/* Hauteur standard pour desktop *\/\n height: 100dvh;\n \/* Hauteur dynamique pour mobile (si supporté) *\/\n background-image: url('\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/bg-nav-mobile.svg?v=66758762028970009221728902196');\n background-size: 100% 100%;\n background-position: right;\n background-repeat: no-repeat;\n transform: scaleX(-1);\n transition: right 0.5s ease-in-out;\n overflow-x: hidden;\n }\n\n \/* Styles spécifiques pour les 3 sections du panier *\/\n .cart-slider-title-block {\n padding: 15px;\n border-bottom: 1px solid #eee;\n height: 9%;\n min-height: 60px;\n display: flex;\n align-items: center;\n }\n\n .cart-slider-content-block {\n height: calc(100% - 300px);\n \/* Augmenté pour laisser plus d'espace au bloc prix *\/\n overflow-y: auto;\n padding: 0 15px;\n }\n\n .cart-slider-price-block {\n height: 300px;\n \/* Augmenté pour s'assurer que le bouton soit visible *\/\n padding: 15px;\n border-top: 1px solid #eee;\n background-color: #f9f9f9;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .cart-totals {\n flex: 1;\n margin-bottom: 10px;\n overflow-y: auto;\n }\n\n .cart-buttons {\n margin-top: auto;\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding-top: 10px;\n }\n\n .cart-buttons button {\n min-height: 44px;\n width: 100%;\n }\n\n \/* Ajustements pour mobile *\/\n @media (max-width: 768px) {\n #cart-slider {\n width: 90%;\n }\n\n .cart-slider-content-block {\n height: calc(100% - 300px);\n max-height: none;\n }\n\n .cart-slider-price-block {\n height: 300px;\n min-height: 300px;\n padding-bottom: env(safe-area-inset-bottom, 15px);\n }\n\n .cart-totals {\n margin-bottom: 5px;\n }\n\n .cart-buttons {\n padding-top: 5px;\n }\n }\n\u003c\/style\u003e\n\n\u003cdiv class=\"dev-header dev-font-family-raleway dev-font-size\"\u003e\n \u003cdiv class=\"container-fluid bg-black\"\u003e\n \u003cdiv class=\"container\"\u003e\n \u003cdiv class=\"row\"\u003e\n \u003cdiv class=\"col text-light h-50px d-flex justify-content-between align-items-center ps-5 pe-5\"\u003e\n \u003cdiv class=\"w-50 d-flex \"\u003e\n \u003ca class=\"me-5 text-decoration-none text-white\" href=\"\/pages\/changeons-le-monde-a-petits-pas\"\u003eLet\u0026#39;s change the world in small steps\u003c\/a\u003e\n \u003ca class=\"me-5 text-decoration-none text-white\" href=\"\/blogs\/news\"\u003eThe blog\u003c\/a\u003e\n \u003c\/div\u003e\n\n \u003cdiv class=\"w-50 d-flex align-items-center justify-content-end logo-contact-account\"\u003e\n \u003cdiv id=\"search-icon\" onclick=\"searchBarDisplay()\"\u003e\n \u003cimg\n src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/search-white.svg?v=136290937758887135531745484928\"\n alt=\"\"\n style=\"width:25px; height:25px ; margin-right: 15px;cursor:pointer;\"\n \u003e\n \u003c\/div\u003e\n \u003cdiv id=\"search-form\" style=\"display: none; margin-right: 10px;\"\u003e\n \u003cform action=\"\/en\/search\" class=\"dev-search-form\"\u003e\n \u003cinput\n type=\"text\"\n placeholder=\"Unicorn, Hot Air Balloon, ...\"\n name=\"q\"\n value=\"\"\n class=\"dev-search-input\"\n style=\"padding-left: 15px; border-radius: 20px 0px 0px 20px;\"\n required\n \u003e\n \u003cdiv class=\"bg-white\" style=\"border-radius: 0px 20px 20px 0px\"\u003e\n \u003cinput\n type=\"submit\"\n value=\"Find my Josette\"\n class=\"dev-search-button\"\n \u003e\n \u003c\/div\u003e\n \u003c\/form\u003e\n \u003c\/div\u003e\n \n\n \u003ca href=\"\/pages\/contact\"\u003e\u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-enveloppe.png?v=125601992236267340811707477501\" alt=\"\"\u003e\u003c\/a\u003e\n\n \n \u003ca href=\"\/account\/register\"\u003e\u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/mon-compte.png?v=1549941288689919651707477501\" alt=\"\"\u003e\u003c\/a\u003e\n \n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n\n \u003cnav class=\"navbar navbar-expand-lg border-bottom h-130px\"\u003e\n \u003cdiv class=\"container pe-5 ps-5\" style=\"display: flex; justify-content: space-between; align-items: center;\"\u003e\n\n \u003c!-- LOGO --\u003e\n \u003ca class=\"navbar-brand\" href=\"https:\/\/josette-tic.com\"\u003e\n \u003cimg\n src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/Header-Logo-enseigne.png?v=129525109042945029401727692166\"\n alt=\"Logo Josette\"\n class=\"logo-image\"\n id=\"my-img\"\n \u003e\n \u003c\/a\u003e\n\n \u003c!-- MEGA MENU --\u003e\n \u003cdiv class=\"megamenu-wrapper\"\u003e\n\n \u003c!-- CATALOGUE (avec dropdown) --\u003e\n \u003cdiv class=\"megamenu-item\"\u003e\n \u003cspan class=\"megamenu-trigger\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-mediums.svg?v=125900960368012407471770895890\" class=\"megamenu-trigger-icon\"\u003e\u003c\/img\u003e\n LES JOSETTES\n \u003c\/span\u003e\n\n \u003c!-- Dropdown pleine largeur --\u003e\n \u003cdiv class=\"megamenu-dropdown\"\u003e\n \u003cdiv class=\"megamenu-content\" style=\"display: flex; flex-direction: column\"\u003e\n\n \u003c!-- Section Hauteurs --\u003e\n \u003cdiv class=\"megamenu-section\"\u003e\n \u003cdiv class=\"megamenu-section-title\"\u003eHauteurs\u003c\/div\u003e\n \u003cdiv class=\"megamenu-grid\"\u003e\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/bambins\" class=\"megamenu-card\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-bambins.svg?v=54198647688371858741770895890\" class=\"megamenu-card-image\"\u003e\u003c\/img\u003e\n \u003cspan class=\"megamenu-card-title\"\u003eBambins\u003c\/span\u003e\n \u003c\/a\u003e\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/invisibles\" class=\"megamenu-card\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-invisibles.svg?v=117889855138458862721770895890\" class=\"megamenu-card-image\"\u003e\u003c\/img\u003e\n \u003cspan class=\"megamenu-card-title\"\u003eInvisibles\u003c\/span\u003e\n \u003c\/a\u003e\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/courtes\" class=\"megamenu-card\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-courtes.svg?v=184453790776472569611770895890\" class=\"megamenu-card-image\"\u003e\u003c\/img\u003e\n \u003cspan class=\"megamenu-card-title\"\u003eCourtes\u003c\/span\u003e\n \u003c\/a\u003e\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/mediums\" class=\"megamenu-card\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-mediums.svg?v=125900960368012407471770895890\" class=\"megamenu-card-image\"\u003e\u003c\/img\u003e\n \u003cspan class=\"megamenu-card-title\"\u003eMediums\u003c\/span\u003e\n \u003c\/a\u003e\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/hautes\" class=\"megamenu-card\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-hautes.svg?v=134624699008912529461770895890\" class=\"megamenu-card-image\"\u003e\u003c\/img\u003e\n \u003cspan class=\"megamenu-card-title\"\u003eHautes\u003c\/span\u003e\n \u003c\/a\u003e\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/marionnettes\" class=\"megamenu-card\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-marionnettes-adultes.svg?v=112048156860172056801770895890\" class=\"megamenu-card-image\"\u003e\u003c\/img\u003e\n \u003cspan class=\"megamenu-card-title\"\u003eMarionnettes\u003c\/span\u003e\n \u003c\/a\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n\n \u003c!-- Section Collections --\u003e\n \u003cdiv class=\"megamenu-section\"\u003e\n \u003cdiv class=\"megamenu-section-title\"\u003eCollections\u003c\/div\u003e\n \u003cdiv class=\"megamenu-grid megamenu-grid--collections\"\u003e\u003ca href=\"\/en\/collections\/collection-cahier-de-vacances\" class=\"megamenu-card megamenu-card--collection\"\u003e\u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/collections\/image_de_collection_12455593-1049-4316-a275-276a02a5a337.jpg?v=1783002254\u0026width=200\"\n alt=\"Cahier de vacances\"\n class=\"megamenu-card-image megamenu-card-image--collection\"\u003e\u003cspan class=\"megamenu-card-title\"\u003eCAHIER DE VACANCES\u003c\/span\u003e\n \u003c\/a\u003e\u003ca href=\"\/en\/collections\/coupe-du-monde-2026\" class=\"megamenu-card megamenu-card--collection\"\u003e\u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/collections\/Vignette_collection.png?v=1780564613\u0026width=200\"\n alt=\"Coupe du monde 2026\"\n class=\"megamenu-card-image megamenu-card-image--collection\"\u003e\u003cspan class=\"megamenu-card-title\"\u003eCOUPE DU MONDE 2026\u003c\/span\u003e\n \u003c\/a\u003e\u003ca href=\"\/en\/collections\/chaussettes-theme-mer\" class=\"megamenu-card megamenu-card--collection\"\u003e\u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/collections\/mer.jpg?v=1772585866\u0026width=200\"\n alt=\"MER\"\n class=\"megamenu-card-image megamenu-card-image--collection\"\u003e\u003cspan class=\"megamenu-card-title\"\u003eMER\u003c\/span\u003e\n \u003c\/a\u003e\u003ca href=\"\/en\/collections\/fete-foraine\" class=\"megamenu-card megamenu-card--collection\"\u003e\u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/collections\/slider-fete-foraine-collection.jpg?v=1779390793\u0026width=200\"\n alt=\"Fête foraine\"\n class=\"megamenu-card-image megamenu-card-image--collection\"\u003e\u003cspan class=\"megamenu-card-title\"\u003eFÊTE FORAINE\u003c\/span\u003e\n \u003c\/a\u003e\u003ca href=\"\/en\/collections\/marionnettes\" class=\"megamenu-card megamenu-card--collection\"\u003e\u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/collections\/marionnettes.jpg?v=1772585226\u0026width=200\"\n alt=\"Puppet socks\"\n class=\"megamenu-card-image megamenu-card-image--collection\"\u003e\u003cspan class=\"megamenu-card-title\"\u003ePUPPET SOCKS\u003c\/span\u003e\n \u003c\/a\u003e\u003ca href=\"https:\/\/josette-tic.com\/pages\/toutes-collections-chaussettes\" class=\"megamenu-card megamenu-card--see-all\"\u003e\n \u003cdiv class=\"megamenu-see-all-box\"\u003e\n \u003cspan class=\"megamenu-see-all-text\"\u003eToutes nos collections\u003c\/span\u003e\n \u003cspan class=\"megamenu-see-all-arrow\"\u003e→\u003c\/span\u003e\n \u003c\/div\u003e\n \u003c\/a\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n\n \u003c!-- TATOUAGE (lien simple) --\u003e\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/tatouage\" class=\"megamenu-trigger\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-tatouage.svg?v=67399927385558897511770895890\" class=\"megamenu-trigger-icon\"\u003e\u003c\/img\u003e\n Tatouage\n \u003c\/a\u003e\n\n \u003c!-- ATELIER (avec sous-menu pleine largeur) --\u003e\n \u003cdiv class=\"megamenu-item\"\u003e\n \u003cspan class=\"megamenu-trigger\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/atelier.png?v=75389112753566680611707477504\" alt=\"Atelier\" class=\"megamenu-trigger-icon\"\u003e\n Atelier\n \u003c\/span\u003e\n \u003cdiv class=\"megamenu-dropdown\"\u003e\n \u003cdiv class=\"megamenu-content megamenu-content--centered\"\u003e\n \u003cdiv class=\"megamenu-section\"\u003e\n \u003cdiv class=\"megamenu-section-title\"\u003eL'Atelier Josette\u003c\/div\u003e\n \u003cdiv class=\"megamenu-grid megamenu-grid--3cols\"\u003e\n \u003ca href=\"https:\/\/atelier.josette-tic.com\" class=\"megamenu-card\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/atelier.png?v=75389112753566680611707477504\" class=\"megamenu-card-image\"\u003e\u003c\/img\u003e\n \u003cspan class=\"megamenu-card-title\"\u003eCréer sa josette\u003c\/span\u003e\n \u003c\/a\u003e\n \u003ca href=\"https:\/\/atelier.josette-tic.com\/vos-creations\" class=\"megamenu-card\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/atelier-vote.svg?v=127680926588648624941728902195\" class=\"megamenu-card-image\"\u003e\u003c\/img\u003e\n \u003cspan class=\"megamenu-card-title\"\u003eVoter\u003c\/span\u003e\n \u003c\/a\u003e\n \u003ca href=\"https:\/\/atelier.josette-tic.com\/hall-of-fame\" class=\"megamenu-card\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-hall-of-fame.svg?v=28394166553267675161772545658\" class=\"megamenu-card-image\"\u003e\u003c\/img\u003e\n \u003cspan class=\"megamenu-card-title\"\u003eHall of fame\u003c\/span\u003e\n \u003c\/a\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n\n \u003ca href=\"https:\/\/josette-tic.com\/pages\/amicaliste\" class=\"megamenu-trigger\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/AAJ.svg?v=89452690581950998971775033406\" class=\"megamenu-trigger-icon\"\u003e\u003c\/img\u003e\n L'amicale\n \u003c\/a\u003e\n\n\n \u003c\/div\u003e\n\n \u003c!-- PANIER (inchangé) --\u003e\n \u003cdiv\u003e\n \u003ca\n href=\"\/en\/cart\"\n class=\"header__icon header__icon--cart link focus-inset\"\n id=\"cart-icon-bubble\"\n \u003e\n \n \u003cimg\n src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/Panier_vide_petite_taille.png?v=159101638406313995531707477501\"\n alt=\"\"\n class=\"logo-panier-vide overflow-hidden\"\n \u003e\n \n \u003cspan class=\"visually-hidden\"\u003eTranslation missing: en.templates.cart.cart\u003c\/span\u003e\u003c\/a\u003e\n \u003c\/div\u003e\n\n \u003c\/div\u003e\n \u003c\/nav\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\u003cdiv class=\"dev-header-responsive-mobile\"\u003e\n \u003cdiv style=\"display: flex; align-items: center; justify-content: space-around\"\u003e\n \u003cimg\n src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/burger_icon.png?v=35548092229759683871728902197\"\n style=\"width: 30px;height: auto;margin: 0 auto; margin-left: 15px; margin-right: 5px;\"\n alt=\"\"\n onclick=\"displayNavResponsive()\"\n \u003e\n \u003ca href=\"https:\/\/josette-tic.com\" style=\"display: flex; align-items: center; justify-content: center\"\n \u003e\u003cimg\n src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/logo-mobile-petit.png?v=160780580420229256261727692376\"\n style=\"width: 60%;height: 75px;margin: 0 auto\"\n alt=\"logo Josette version mobile\"\n \u003e\u003c\/a\u003e\n \n \u003ca\n href=\"\/en\/cart\"\n class=\"header__icon header__icon--cart header__icon--cart-mobile link focus-inset\"\n id=\"cart-icon-bubble\"\n \u003e\n \n \u003cimg\n src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/Panier_vide_petite_taille.png?v=159101638406313995531707477501\"\n alt=\"\"\n class=\"logo-panier-vide overflow-hidden\"\n \u003e\n \n \u003cspan class=\"visually-hidden\"\u003eTranslation missing: en.templates.cart.cart\u003c\/span\u003e\u003c\/a\u003e\n \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cdiv class=\"bg-nav-mobile\" id=\"nav_responsive\"\u003e\n \u003cdiv style=\"display: flex; align-items: center; justify-content: space-between\"\u003e\n \u003cimg\n src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/cross_icon.png?v=130940024759111025871728902198\"\n style=\"width: 30px;height: auto;margin: 0 auto\"\n alt=\"\"\n onclick=\"closeNavResponsive()\"\n \u003e\n \u003cimg\n src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/logo-mobile-petit.png?v=160780580420229256261727692376\"\n style=\"width: 60%;height: 75px;margin: 0 auto\"\n alt=\"logo Josette version mobile\"\n \u003e\n \u003cimg\n src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/search_icon.png?v=145618600013729148311728902199\"\n style=\"width: 40px;height: auto;margin: 0 auto\"\n alt=\"\"\n onclick=\"toggleSearchFormResponsive()\"\n \u003e\n \u003c\/div\u003e\n\n \u003cdiv style=\"width: 97%; height: 100%; overflow-y: auto; z-index: 1888!important;\"\u003e\n \u003cdiv id=\"search-form-responsive\" style=\"display: flex; align-items: center; justify-content: center\"\u003e\n \u003cform action=\"\/en\/search\" class=\"dev-search-form\"\u003e\n \u003cinput\n type=\"text\"\n placeholder=\"Unicorn, Coffee, ...\"\n name=\"q\"\n value=\"\"\n class=\"dev-search-input\"\n style=\"padding-left: 15px; border-radius: 10px 0 0 10px;\"\n required\n \u003e\n \u003cdiv class=\"bg-white\" style=\"border-radius: 0 20px 20px 0\"\u003e\n \u003cinput type=\"submit\" value=\"Find my Josette\" class=\"dev-search-button\"\u003e\n \u003c\/div\u003e\n \u003c\/form\u003e\n \u003c\/div\u003e\n \u003cdiv class=\"underline-custom\"\u003e\n The Josettes\n \u003c\/div\u003e\n \u003cdiv style=\"margin-left: 15px;\"\u003e\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/bambins\" class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-bambins.svg?v=54198647688371858741770895890\" alt=\"\" style=\"height: 50px;\"\u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; text-decoration: underline white\"\n \u003e\n BAMBINS\n \u003c\/div\u003e\n \u003c\/a\u003e\n\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/invisibles\" class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-invisibles.svg?v=117889855138458862721770895890\" alt=\"\" style=\"height: 50px;\"\u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; text-decoration: underline white\"\n \u003e\n invisibles\n \u003c\/div\u003e\n \u003c\/a\u003e\n\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/courtes\" class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-courtes.svg?v=184453790776472569611770895890\" alt=\"\" style=\"height: 50px;\"\u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; text-decoration: underline white\"\n \u003e\n Courtes\n \u003c\/div\u003e\n \u003c\/a\u003e\n\n \n\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/mediums\" class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-mediums.svg?v=125900960368012407471770895890\" alt=\"\" style=\"height: 50px;\"\u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; text-decoration: underline white\"\n \u003e\n médiums\n \u003c\/div\u003e\n \u003c\/a\u003e\n\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/hautes\" class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-hautes.svg?v=134624699008912529461770895890\" alt=\"\" style=\"height: 50px;\"\u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; text-decoration: underline white\"\n \u003e\n hautes\n \u003c\/div\u003e\n \u003c\/a\u003e\n\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/tatouage\" class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-tatouage.svg?v=67399927385558897511770895890\" alt=\"\" style=\"height: 50px;\"\u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; text-decoration: underline white\"\n \u003e\n Tatouage\n \u003c\/div\u003e\n \u003c\/a\u003e\n\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/marionnettes\" class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-marionnettes-adultes.svg?v=112048156860172056801770895890\" alt=\"\" style=\"height: 50px;\"\u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; text-decoration: underline white\"\n \u003e\n Marionnettes\n \u003c\/div\u003e\n \u003c\/a\u003e\n \u003c\/div\u003e\n\n \u003cdiv class=\"underline-custom\"\u003e\n Josettes\u0026#39; workshop\n \u003c\/div\u003e\n \u003cdiv style=\"margin-left: 15px;\"\u003e\n \u003ca\n href=\"https:\/\/atelier.josette-tic.com\"\n class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\n \u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/atelier.png?v=75389112753566680611707477504\" alt=\"\" style=\"height: 50px;\"\u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; text-decoration: underline white\"\n \u003e\n Create\n \u003c\/div\u003e\n \u003c\/a\u003e\n \u003ca\n href=\"https:\/\/atelier.josette-tic.com\/vos-creations\"\n class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\n \u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/atelier-vote.svg?v=127680926588648624941728902195\" alt=\"\" style=\"height: 50px;\"\u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; text-decoration: underline white\"\n \u003e\n Vote\n \u003c\/div\u003e\n \u003c\/a\u003e\n\n \u003ca\n href=\"https:\/\/atelier.josette-tic.com\/hall-of-fame\"\n class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\n \u003e\n \u003cimg src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-hall-of-fame.svg?v=28394166553267675161772545658\" alt=\"\" style=\"height: 50px;\"\u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; text-decoration: underline white\"\n \u003e\n Hall of fame\n \u003c\/div\u003e\n \u003c\/a\u003e\n \u003c\/div\u003e\n\n \u003cdiv class=\"underline-custom\"\u003e\n Discover Josette\n \u003c\/div\u003e\n \u003cdiv style=\"margin-left: 15px;\"\u003e\n \u003ca\n href=\"\/pages\/amicaliste\"\n class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\n \u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; margin-top: 5px;margin-bottom: 5px; text-decoration: underline white\"\n \u003e\n L'AMICALE\n \u003c\/div\u003e\n \u003c\/a\u003e\n \u003ca\n href=\"\/pages\/changeons-le-monde-a-petits-pas\"\n class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\n \u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; margin-top: 5px;margin-bottom: 5px; text-decoration: underline white\"\n \u003e\n Let\u0026#39;s change the world in small steps\n \u003c\/div\u003e\n \u003c\/a\u003e\n \u003ca\n href=\"\/pages\/magasins-chaussettes\"\n class=\"no-underline-no-decoration\"\n style=\"display: flex; align-items: center;\"\n \u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; margin-top: 5px;margin-bottom: 5px; text-decoration: underline white\"\n \u003e\n Our farms\n \u003c\/div\u003e\n \u003c\/a\u003e\n \u003ca href=\"\/blogs\/news\" class=\"no-underline-no-decoration\" style=\"display: flex; align-items: center;\"\u003e\n \u003cdiv\n class=\"text-black\"\n style=\"margin-left: 10px; font-family: Raleway, serif; font-weight: bold; text-transform: uppercase; margin-top: 5px;margin-bottom: 5px; text-decoration: underline white!important\"\n \u003e\n The blog\n \u003c\/div\u003e\n \u003c\/a\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n\n \u003cdiv\n style=\"width: 97%;height: 50px; display: flex; align-items: center; justify-content: end; margin-bottom: 10px;margin-right: 15px;\"\n \u003e\n \n \u003ca href=\"\/pages\/contact\"\n \u003e\u003cimg\n src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/picto-enveloppe.png?v=125601992236267340811707477501\"\n alt=\"\"\n style=\"margin-right: 5px;margin-left: 5px;\"\n \u003e\u003c\/a\u003e\n\n \n \u003ca href=\"\/account\/register\"\n \u003e\u003cimg\n src=\"\/\/josette-tic.com\/cdn\/shop\/t\/6\/assets\/mon-compte.png?v=1549941288689919651707477501\"\n alt=\"\"\n style=\"margin-right: 5px;margin-left: 5px;\"\n \u003e\u003c\/a\u003e\n \n \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cdiv id=\"cart-slider\" style=\"\"\u003e\n \u003cdiv\n class=\"cart-slider-content\"\n style=\"transform: scaleX(-1); height: 100%; display: flex; flex-direction: column;\"\n \u003e\n \u003c!-- BLOC TITLE: toujours en haut, hauteur fixe 9% --\u003e\n \u003cdiv class=\"cart-slider-title-block\"\u003e\n \u003cdiv style=\"display: flex; justify-content: space-between; align-items: center; width: 100%;\"\u003e\n \u003ch3 id=\"cart-slider-title\" style=\"margin: 0;\"\u003eMon panier\u003c\/h3\u003e\n \u003cbutton\n id=\"close-cart-slider\"\n type=\"button\"\n style=\"background: none; border: none; cursor: pointer; font-size: 24px; color:black; text-decoration: none;\"\n \u003e\n \u0026times;\n \u003c\/button\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n\n \u003cform\n id=\"cart-form\"\n action=\"\/en\/cart\"\n method=\"post\"\n style=\"display: flex; flex-direction: column; height: 91%;\"\n \u003e\n \u003c!-- Première étape : Liste des produits --\u003e\n \u003cdiv id=\"cart-step-products\" style=\"display: flex; flex-direction: column; height: 100%;\"\u003e\n \u003c!-- BLOC CONTENT: au milieu, scrollable --\u003e\n \u003cdiv class=\"cart-slider-content-block\"\u003e\n \u003cdiv id=\"cart-slider-items\"\u003e\n \u003cdiv class=\"loading-cart\" style=\"text-align: center; padding: 20px 0;\"\u003eChargement de votre\n panier...\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n\n \u003c!-- BLOC PRICE: en bas, toujours visible --\u003e\n \u003cdiv class=\"cart-slider-price-block\"\u003e\n \u003cdiv class=\"cart-totals\" style=\"margin-bottom: 10px;\"\u003e\n \u003c!-- Message concernant les frais de livraison --\u003e\n \u003cdiv style=\"text-align: center; margin-bottom: 10px;\" class=\"cart-info-fdp\"\u003e\n \n \n Il vous reste\n \u003cb\u003e42,00€\u003c\/b\u003e pour bénéficier des frais de port offerts (en France\n métropolitaine).\n \n \u003c\/div\u003e\n \u003cdiv style=\"display: flex; justify-content: space-between; margin-bottom: 10px;\"\u003e\n \u003cspan\u003eSous-total:\u003c\/span\u003e\n \u003cspan id=\"cart-subtotal\"\u003e0,00 €\u003c\/span\u003e\n \u003c\/div\u003e\n \u003cdiv style=\"display: flex; justify-content: space-between; margin-bottom: 10px;\"\u003e\n \u003cspan\u003eFrais de livraison estimés:\u003c\/span\u003e\n \u003cspan id=\"cart-shipping\"\u003e6 €\u003c\/span\u003e\n \u003c\/div\u003e\n \u003cdiv\n style=\"display: flex; justify-content: space-between; font-weight: bold; margin-bottom: 15px; padding-top: 10px; border-top: 1px solid #eee;\"\n \u003e\n \u003cspan\u003eTotal TTC:\u003c\/span\u003e\n \u003cspan id=\"cart-total\"\u003e0,00 €\u003c\/span\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003cdiv class=\"cart-buttons\" style=\"display: flex; flex-direction: column; gap: 10px;\"\u003e\n \u003cbutton\n type=\"button\"\n id=\"cart-next-button\"\n class=\"dev-formulaire-submit-validate-panier\"\n style=\"background-color: #000; color: #fff; padding: 10px; border: none; border-radius: 5px; cursor: pointer; min-height: 44px;\"\n \u003e\n Suivant\n \u003c\/button\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n\n \u003c!-- Deuxième étape : Finalisation (note et code promo) --\u003e\n \u003cdiv id=\"cart-step-checkout\" style=\"display: none; flex-direction: column; height: 100%;\"\u003e\n \u003c!-- BLOC CONTENT pour la deuxième étape --\u003e\n \u003cdiv class=\"cart-slider-content-block\"\u003e\n \u003cbutton\n type=\"button\"\n id=\"cart-back-button\"\n style=\"background: none; border: none; display: flex; align-items: center; cursor: pointer; padding: 15px 0; margin-bottom: 10px;color:black; text-decoration: none;\"\n \u003e\n \u003cspan style=\"transform: rotate(90deg); display: inline-block; margin-right: 5px; \"\u003e▼\u003c\/span\u003e\n Retour aux produits\n \u003c\/button\u003e\n\n \u003c!-- Note de commande --\u003e\n \u003cdiv style=\"margin-bottom: 25px;\"\u003e\n \u003ch4 style=\"margin-bottom: 10px;\"\u003eAjouter une note ?\u003c\/h4\u003e\n \u003ctextarea\n name=\"note\"\n style=\"width: 100%; border: 1px solid #ddd; border-radius: 5px; padding: 10px; min-height: 100px;\"\n placeholder=\"Ajoutez des instructions spécifiques pour votre commande... Ou alors laissez un petit mot à l'attention de la personne à qui vous offrez ces très belles josettes.\"\n \u003e\u003c\/textarea\u003e\n \u003c\/div\u003e\n\n\n \u003c!-- Cartes cadeaux --\u003e\n \u003cdiv style=\"margin-bottom: 30px; width:100%\"\u003e\n \u003ch4 style=\"margin-bottom: 10px;\"\u003eCartes postales\u003c\/h4\u003e\n \u003ca href=\"https:\/\/josette-tic.com\/collections\/cartes-postales\"\n style=\"display:flex; text-decoration:none; color:black; justify-content:center\"\n class='element-cart-display-column'\u003e\n \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0653\/5217\/1753\/files\/cp-on-the-road-recto.jpg?v=1769775190\"\n style=\"width:150px\" height=\"auto\"\u003e\n \u003cdiv class=\"button button-secondary\" style=\"margin:25px; padding:10px 10px!important;\"\u003e\n Ajouter une carte postale ?\n \u003c\/div\u003e\n \u003c\/a\u003e\n\n \u003c\/div\u003e\n\n\n \u003c!-- Cartes cadeaux --\u003e\n \u003cdiv style=\"margin-bottom: 30px; width:100%\"\u003e\n \u003ch4 style=\"margin-bottom: 10px;\"\u003eCarte cadeau\u003c\/h4\u003e\n \u003ca href=\"https:\/\/josette-tic.com\/products\/carte-cadeau-1\"\n style=\"display:flex; text-decoration:none; color:black; justify-content:center\"\n class=\"element-cart-display-column\"\u003e\n \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0653\/5217\/1753\/files\/chaussettes-fantaisie-carte-cadeau-virtuelle-coton-bio-249.png?v=1770103688\"\n style=\"width:150px\" height=\"auto\"\u003e\n \u003cdiv class=\"button button-secondary\" style=\"margin:25px; padding:10px 10px!important\"\u003eOffrir\n une carte cadeau ?\n \u003c\/div\u003e\n \u003c\/a\u003e\n\n \u003c\/div\u003e\n\n\n \u003c!-- Emballages cadeaux --\u003e\n \u003cdiv style=\"margin-bottom: 30px;\"\u003e\n \u003ch4 style=\"margin-bottom: 10px;\"\u003eOn s'emballe ?\u003c\/h4\u003e\n \u003cdiv id=\"gift-packaging-container\" style=\"display: flex; flex-wrap: wrap; gap: 10px;\"\u003e\n \n \n\n \n \n \n\n \n \n \n \u003cdiv\n class=\"gift-package-card\"\n style=\"width: calc(50% - 5px); border: 1px solid #eee; border-radius: 5px; overflow: hidden; position: relative;\"\n \u003e\n \u003cdiv\n style=\"padding-top: 75%; background-image: url('\/\/josette-tic.com\/cdn\/shop\/files\/chaussettes-fantaisie-pochette-cadeau-coton-bio-279_200x200_crop_center.jpg?v=1758272902'); background-size: cover; background-position: center;\"\n \u003e\u003c\/div\u003e\n \u003cdiv style=\"padding: 10px;\"\u003e\n \u003cp\n style=\"margin: 0 0 5px; font-weight: bold; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\"\n \u003e\n GIFT BAG \n \u003c\/p\u003e\n \u003cdiv\n style=\"display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center;\"\n \u003e\n \u003cspan style=\"min-width: 60px; margin-bottom: 5px;\"\u003e0,30€\u003c\/span\u003e\n \u003cdiv\n class=\"gift-select-container\"\n style=\"position: relative; margin-bottom: 5px;\"\n \u003e\n \u003cinput\n type=\"number\"\n data-variant-id=\"43800297439465\"\n class=\"gift-qty-input\"\n value=\"0\"\n min=\"0\"\n style=\"width: 60px; text-align: center; padding: 5px 8px; border: 1px solid #ddd; border-radius: 3px; background-color: white;\"\n \u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \n \n\n \n \n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n\n \u003c!-- BLOC PRICE pour la deuxième étape --\u003e\n \u003cdiv class=\"cart-slider-price-block\"\u003e\n \u003c!-- Message concernant les frais de livraison --\u003e\n \u003cdiv style=\"text-align: center; margin-bottom: 10px;\" class=\"cart-info-fdp\"\u003e\n \n \n Il vous reste\n \u003cb\u003e42,00€\u003c\/b\u003e pour bénéficier des frais de port offerts (en France\n métropolitaine).\n \n \u003c\/div\u003e\n\n \u003cdiv class=\"cart-totals\" style=\"margin-bottom: 10px;\"\u003e\n \u003cdiv style=\"display: flex; justify-content: space-between; margin-bottom: 10px;\"\u003e\n \u003cspan\u003eSous-total:\u003c\/span\u003e\n \u003cspan id=\"checkout-subtotal\"\u003e0,00 €\u003c\/span\u003e\n \u003c\/div\u003e\n \u003cdiv\n style=\"display: flex; justify-content: space-between; margin-bottom: 10px; display: none;\"\n id=\"discount-line\"\n \u003e\n \u003cspan\u003eRéduction:\u003c\/span\u003e\n \u003cspan id=\"checkout-discount\"\u003e0,00 €\u003c\/span\u003e\n \u003c\/div\u003e\n \u003cdiv style=\"display: flex; justify-content: space-between; margin-bottom: 10px;\"\u003e\n \u003cspan\u003eFrais de livraison estimés:\u003c\/span\u003e\n \u003cspan id=\"checkout-shipping\"\u003e6 €\u003c\/span\u003e\n \u003c\/div\u003e\n \u003cdiv\n style=\"display: flex; justify-content: space-between; font-weight: bold; margin-bottom: 15px; padding-top: 10px; border-top: 1px solid #eee;\"\n \u003e\n \u003cspan\u003eTotal TTC:\u003c\/span\u003e\n \u003cspan id=\"checkout-total\"\u003e0,00 €\u003c\/span\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n\n \u003cdiv class=\"cart-buttons\" style=\"display: flex; flex-direction: column; gap: 10px;\"\u003e\n \u003cinput type=\"hidden\" name=\"attributes[checkout_clicked]\" value=\"true\"\u003e\n \u003cbutton\n type=\"submit\"\n name=\"checkout\"\n formaction=\"\/en\/cart\"\n class=\"dev-formulaire-submit-validate-panier\"\n style=\"background-color: #000; color: #fff; padding: 10px; border: none; border-radius: 5px; cursor: pointer; min-height: 44px;\"\n \u003e\n Valider mon panier\n \u003c\/button\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/form\u003e\n \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n document.addEventListener('DOMContentLoaded', () =\u003e {\n \/\/ Calculer la largeur de la scrollbar et définir la variable CSS\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n document.documentElement.style.setProperty('--scrollbar-width', scrollbarWidth + 'px');\n\n const navResponsive = document.getElementById('nav_responsive');\n if (navResponsive) {\n navResponsive.classList.add('visible'); \/\/ Navigation prête mais hors écran\n }\n });\n\n function displayNavResponsive() {\n document.getElementById('nav_responsive').classList.add('open');\n }\n\n function closeNavResponsive() {\n document.getElementById('nav_responsive').classList.remove('open');\n }\n\n function toggleSearchFormResponsive() {\n const searchForm = document.getElementById('search-form-responsive');\n searchForm.classList.toggle('expanded');\n }\n\n function toggleLanguage() {\n var currentLocale = document.querySelector('.current-locale img').alt;\n var currentPath = window.location.pathname;\n\n if (currentLocale === 'fr') {\n window.location.href = '\/en' + currentPath.replace('\/fr', '');\n } else {\n window.location.href = currentPath.replace('\/en', '');\n }\n }\n\n document.addEventListener('DOMContentLoaded', function () {\n function toggleDropdown() {\n var dropdown = document.querySelector('.locale-dropdown');\n dropdown.style.display = dropdown.style.display === 'none' || dropdown.style.display === '' ? 'block' : 'none';\n }\n\n document.querySelectorAll('.locale-option').forEach((option) =\u003e {\n option.addEventListener('click', function () {\n var locale = this.getAttribute('data-value');\n var currentPath = window.location.pathname;\n\n \/\/ Extrait la langue actuelle à partir de l'URL, si elle est présente\n var currentLangMatch = currentPath.match(\/^\\\/(en|fr)(\\\/|$)\/);\n var currentLang = currentLangMatch ? currentLangMatch[1] : 'fr';\n\n \/\/ Nouveau chemin basé sur la langue choisie\n if (locale !== currentLang) {\n if (locale === 'fr') {\n \/\/ Supprime la langue actuelle (ex: '\/en') du début du chemin\n var newPath = currentPath.replace(\/^\\\/en(\\\/|$)\/, '\/');\n window.location.href = newPath;\n } else if (locale === 'en') {\n \/\/ Ajoute '\/en' au début du chemin s'il n'y est pas déjà\n var newPath = '\/en' + currentPath.replace(\/^\\\/fr(\\\/|$)\/, '\/');\n window.location.href = newPath;\n }\n }\n });\n });\n\n document.querySelector('.current-locale').addEventListener('click', toggleDropdown);\n });\n\n \/\/ Gestion du slider panier\n document.addEventListener('DOMContentLoaded', function () {\n \/\/ Récupérer les éléments du DOM\n const cartIconBubbles = document.querySelectorAll('#cart-icon-bubble');\n const cartSlider = document.getElementById('cart-slider');\n\n \/\/ Éléments de navigation du panier\n const cartStepProducts = document.getElementById('cart-step-products');\n const cartStepCheckout = document.getElementById('cart-step-checkout');\n const cartNextButton = document.getElementById('cart-next-button');\n const cartBackButton = document.getElementById('cart-back-button');\n const cartSliderTitle = document.getElementById('cart-slider-title');\n\n \/\/ Éléments pour le code promo\n const discountInput = document.getElementById('discount-code');\n const applyDiscountButton = document.getElementById('apply-discount');\n const discountStatus = document.getElementById('discount-status');\n const discountLine = document.getElementById('discount-line');\n\n \/\/ Récupération initiale du panier\n loadCartContent();\n\n \/\/ Navigation entre les étapes du panier\n if (cartNextButton) {\n cartNextButton.addEventListener('click', function () {\n loadCartContent();\n cartStepProducts.style.display = 'none';\n cartStepCheckout.style.display = 'block';\n cartSliderTitle.textContent = 'Finaliser ma commande';\n\n \/\/ Copier les totaux de la première étape vers la deuxième\n document.getElementById('checkout-subtotal').textContent = document.getElementById('cart-subtotal').textContent;\n document.getElementById('checkout-shipping').textContent = document.getElementById('cart-shipping').textContent;\n document.getElementById('checkout-total').textContent = document.getElementById('cart-total').textContent;\n\n \/\/ Initialiser les événements des boutons d'ajout d'emballage cadeau\n initGiftPackagingButtons();\n });\n }\n\n if (cartBackButton) {\n cartBackButton.addEventListener('click', function () {\n loadCartContent();\n cartStepCheckout.style.display = 'none';\n cartStepProducts.style.display = 'block';\n cartSliderTitle.textContent = 'Mon panier';\n });\n }\n\n \/\/ Fonction pour ouvrir le panier\n function openCartSlider() {\n \/\/ Simplement changer la position du slider sans affecter le body\n cartSlider.style.right = '0';\n\n \/\/ Charger le contenu du panier\n loadCartContent();\n }\n\n \/\/ Fonction pour fermer le panier\n function closeCartSlider() {\n \/\/ Simplement replacer le slider hors de l'écran\n cartSlider.style.right = '-500px';\n }\n\n \/\/ Fonction pour charger le contenu du panier\n function loadCartContent() {\n \/\/ Ici, vous pourriez effectuer une requête AJAX pour charger le contenu réel du panier\n \/\/ Par exemple, utiliser fetch pour appeler l'API de Shopify\n fetch('\/cart.js')\n .then((response) =\u003e response.json())\n .then((cart) =\u003e {\n const cartItemsContainer = document.getElementById('cart-slider-items');\n\n if (cart.item_count === 0) {\n cartItemsContainer.innerHTML =\n '\u003cdiv style=\"text-align: center; padding: 20px;\"\u003eVotre panier est vide\u003c\/div\u003e';\n\n \/\/ Mettre à jour les totaux\n document.getElementById('cart-subtotal').textContent = '0,00 €';\n document.getElementById('cart-total').textContent = '0,00 €';\n return;\n }\n\n \/\/ Traitement des produits du panier\n window.cartData = cart; \/\/ Pour accès global au panier\n processCartItems(cart, cartItemsContainer);\n })\n .catch((error) =\u003e {\n console.error('Erreur lors du chargement du panier:', error);\n document.getElementById('cart-slider-items').innerHTML =\n '\u003cdiv style=\"text-align: center; padding: 20px;\"\u003eErreur lors du chargement du panier\u003c\/div\u003e';\n });\n }\n\n \/\/ Fonction pour traiter les produits du panier après avoir vérifié les stocks\n function processCartItems(cart, cartItemsContainer) {\n let cartItemsHTML = '';\n let cartTotal = 0;\n\n \/\/ Tableau de promesses pour les requêtes de stocks\n const stockPromises = cart.items.map((item) =\u003e {\n return fetch(`\/products\/${item.handle}.js`)\n .then((response) =\u003e response.json())\n .catch((error) =\u003e {\n console.error(`Erreur lors de la récupération des infos pour ${item.handle}:`, error);\n return null;\n });\n });\n\n \/\/ Résoudre toutes les promesses de stock\n Promise.all(stockPromises)\n .then((productsData) =\u003e {\n \/\/ Générer le HTML pour chaque article du panier\n cart.items.forEach((item, index) =\u003e {\n cartTotal += item.final_line_price;\n\n \/\/ Récupérer les données du produit correspondant\n const productData = productsData[index];\n\n \/\/ Trouver la variante correspondante pour obtenir le stock disponible\n let availableStock = 1000; \/\/ Valeur par défaut élevée\n\n if (productData) {\n const variant = productData.variants.find((v) =\u003e v.id === item.variant_id);\n if (variant) {\n \/\/ Si inventory_management est activé, utiliser inventory_quantity\n availableStock =\n variant.inventory_management === 'shopify' \u0026\u0026 variant.inventory_policy === 'deny'\n ? variant.inventory_quantity + item.quantity \/\/ On ajoute la quantité déjà dans le panier\n : 1000; \/\/ Si pas de gestion de stock ou policy continue, on met une valeur élevée\n }\n }\n\n \/* \/\/ Utiliser un input simple pour tous les produits\n let quantityControl = `\n \u003cinput type=\"number\" min=\"0\" max=\"${availableStock}\" name=\"updates[${\n item.variant_id\n }]\" value=\"${item.quantity}\"\n data-index=\"${index + 1}\" data-variant-id=\"${\n item.variant_id\n }\" data-max-stock=\"${availableStock}\"\n style=\"width: 60px; text-align: center; margin: 0 5px; border: 1px solid #ddd; border-radius: 3px; padding: 5px 8px;\"\u003e\n ${\n availableStock \u003c 100\n ? `\u003cspan style=\"font-size: 0.8em; color: #666;\"\u003e(Max: ${availableStock})\u003c\/span\u003e`\n : ''\n }\n `;\n\n if (item.properties.tattooId) {\n let productProperties = item.properties;\n\n console.log(productProperties);\n\n let propertiesContainer = document.createElement('div'); \/\/ conteneur global\n\n for (let [key, value] of Object.entries(item.properties)) {\n if (value \u0026\u0026 key !== 'tattooId') {\n \/\/ ✅ ignore tattooId\n let propDiv = document.createElement('div');\n propDiv.innerHTML = `\u003cspan style=\"text-decoration: underline;\"\u003e${key}:\u003c\/span\u003e\u003cbr\u003e${value.replace(\n \/\\r\\n|\\n\/g,\n '\u003cbr\u003e'\n )}`;\n propertiesContainer.appendChild(propDiv);\n }\n }\n\n console.log(propertiesContainer);\n quantityControl = propertiesContainer.outerHTML;\n } *\/\n minimumStocks = 0;\n\n \/\/ Construire le HTML des propriétés s’il y a un tatouageId\n let propertiesHTML = '';\n\n if (item.properties \u0026\u0026 (item.properties.TatouageId || item.properties.tattooId)) {\n const propertiesContainer = document.createElement('div');\n propertiesContainer.style.marginBottom = '8px';\n\n for (let [key, value] of Object.entries(item.properties)) {\n \/\/ On ignore les clés \"TatouageId\" et \"tattooId\"\n if (key.toLowerCase() === 'tatouageid' || key.toLowerCase() === 'tattooid') continue;\n\n if (value) {\n const propDiv = document.createElement('div');\n propDiv.innerHTML = `\n \u003cspan style=\"text-decoration: underline; font-weight: bold;\"\u003e${key} :\u003c\/span\u003e\u003cbr\u003e\n ${value.replace(\/\\r\\n|\\n\/g, '\u003cbr\u003e')}\n `;\n propertiesContainer.appendChild(propDiv);\n }\n }\n\n propertiesHTML = propertiesContainer.outerHTML;\n\n availableStock = 1;\n if (item.product_id === 15280745120009) {\n minimumStocks = 1;\n }\n }\n\n\n \/\/ Input quantité avec ajout du HTML des propriétés juste au-dessus\n let quantityControl = `\n \u003cdiv style=\"display;flex;\"\u003e\n \u003cdiv class=\"tattoo-properties\"\u003e${propertiesHTML}\u003c\/div\u003e\n \u003cdiv class=\"tattoo-quantity-control\"\u003e\n \u003cinput type=\"number\" min=\"${minimumStocks}\" max=\"${availableStock}\" name=\"updates[${item.variant_id}]\" value=\"${\n item.quantity\n }\"\n data-index=\"${index + 1}\" data-variant-id=\"${item.key}\" data-max-stock=\"${availableStock}\"\n style=\"width: 60px; text-align: center; margin: 0 5px; border: 1px solid #ddd; border-radius: 3px; padding: 5px 8px;\"\u003e\n ${availableStock \u003c 100 ? `\u003cspan style=\"font-size: 0.8em; color: #666;\"\u003e(Max: ${availableStock})\u003c\/span\u003e` : ''}\n \u003c\/div\u003e\n \u003c\/div\u003e\n`;\n\n cartItemsHTML += `\n \u003cdiv class=\"cart-item\" style=\"display: flex; margin-bottom: 15px; border-bottom: 1px solid #eee; padding-bottom: 15px;\"\u003e\n \u003cdiv class=\"cart-item-image\" style=\"width: 30%; margin-right: 10px;\"\u003e\n \u003cimg src=\"${item.image}\" alt=\"${\n item.title\n }\" style=\"width: 100%; height: auto; object-fit: cover; border-radius: 4px;\"\u003e\n \u003c\/div\u003e\n \u003cdiv class=\"cart-item-details\" style=\"width: 70%;\"\u003e\n \u003ch4 style=\"margin: 0 0 5px;\"\u003e${item.product_title}\u003c\/h4\u003e\n \u003cp style=\"margin: 0 0 5px; color: #666;\"\u003e${item.variant_title || ''}\u003c\/p\u003e\n \u003cdiv style=\"display: flex; justify-content: space-between; align-items: center;\"\u003e\n \u003cdiv class=\"quantity\" style=\"display: flex; align-items: center;\"\u003e\n ${quantityControl}\n \u003c\/div\u003e\n \u003cdiv class=\"price\"\u003e${(item.final_line_price \/ 100).toFixed(2)} €\u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n `;\n });\n\n \/\/ Mettre à jour le HTML du conteneur des articles\n cartItemsContainer.innerHTML = cartItemsHTML;\n\n \/\/ Mettre à jour les totaux\n document.getElementById('cart-subtotal').textContent = (cartTotal \/ 100).toFixed(2) + ' €';\n\n \/\/ Calculer et mettre à jour le total TTC\n let shippingCost = cart.total_price \u003c 4200 ? 600 : 0; \/\/ 6€ si moins de 42€\n let finalTotal = cartTotal + shippingCost;\n document.getElementById('cart-total').textContent = (finalTotal \/ 100).toFixed(2) + ' €';\n\n \/\/ Mettre à jour les frais de livraison\n document.getElementById('cart-shipping').textContent = cart.total_price \u003c 4200 ? '6 €' : 'GRATUIT';\n\n \/\/ Mettre à jour les messages de frais de livraison avec la nouvelle fonction\n updateFdpDiv(cart.total_price);\n\n \/\/ Ajouter des événements pour tous les inputs\n document.querySelectorAll('.cart-item input[type=\"number\"]').forEach((input) =\u003e {\n \/\/ Événement change\n input.addEventListener('change', function () {\n const maxStock = parseInt(this.getAttribute('data-max-stock'));\n let quantity = parseInt(this.value);\n const lineItemKey = this.getAttribute('data-variant-id');\n\n if (quantity \u003e maxStock) {\n quantity = maxStock;\n this.value = maxStock;\n alert(`La quantité a été limitée à ${maxStock}, qui est le maximum disponible en stock.`);\n }\n\n \/\/ Récupérer l’item courant depuis window.cartData\n const currentItem = window.cartData.items.find((item) =\u003e item.key === lineItemKey);\n\n if (!currentItem) {\n console.warn('❌ Item introuvable pour la clé :', lineItemKey);\n return;\n }\n\n \/\/ 👉 Si on veut supprimer l’item (quantité = 0)\n if (quantity === 0) {\n \/\/ Supprimer l’item courant\n updateCartItem(lineItemKey, 0);\n\n \/\/ Vérifier si c’est un tatouage avec un TatouageId\n if (currentItem.properties \u0026\u0026 currentItem.properties.TatouageId) {\n const tattooId = currentItem.properties.TatouageId;\n\n \/\/ Supprimer les autres items liés avec le même TatouageId après un petit délai\n setTimeout(() =\u003e {\n \/\/ Rechercher les autres items liés (même TatouageId, mais autre key)\n const relatedItems = window.cartData.items.filter(\n (item) =\u003e item.properties \u0026\u0026 item.properties.TatouageId === tattooId \u0026\u0026 item.key !== lineItemKey\n );\n\n relatedItems.forEach((item) =\u003e {\n updateCartItem(item.key, 0);\n });\n }, 500);\n }\n\n return;\n }\n\n \/\/ Sinon, mise à jour normale\n updateCartItem(lineItemKey, quantity);\n });\n\n \/\/ Événement input pour mettre à jour le prix en temps réel\n input.addEventListener('input', function () {\n const maxStock = parseInt(this.getAttribute('data-max-stock'));\n let quantity = parseInt(this.value) || 0;\n\n \/\/ Limiter à la quantité maximale disponible\n if (quantity \u003e maxStock) {\n this.value = maxStock;\n quantity = maxStock;\n }\n\n \/\/ Mettre à jour le prix affiché\n const parent = this.closest('.cart-item');\n if (parent) {\n const priceElement = parent.querySelector('.price');\n if (priceElement) {\n const cartItem = cart.items.find(\n (item) =\u003e item.variant_id.toString() === this.getAttribute('data-variant-id')\n );\n if (cartItem) {\n const prixUnitaire = cartItem.price \/ 100;\n const prixTotal = (prixUnitaire * quantity).toFixed(2);\n priceElement.textContent = prixTotal + ' €';\n }\n }\n }\n });\n\n \/\/ Événement keyup pour limiter en temps réel\n input.addEventListener('keyup', function () {\n const maxStock = parseInt(this.getAttribute('data-max-stock'));\n let quantity = parseInt(this.value);\n if (isNaN(quantity)) return; \/\/ Ignore si ce n'est pas un nombre\n\n if (quantity \u003e maxStock) {\n this.value = maxStock;\n }\n });\n\n \/\/ Événement blur pour vérifier lors de la perte de focus\n \/* input.addEventListener('blur', function () {\n const maxStock = parseInt(this.getAttribute('data-max-stock'));\n let quantity = parseInt(this.value);\n const variantId = this.getAttribute('data-variant-id');\n\n if (isNaN(quantity)) {\n this.value = 0;\n updateCartItem(variantId, 0);\n return;\n }\n\n if (quantity \u003e maxStock) {\n this.value = maxStock;\n alert(`La quantité a été limitée à ${maxStock}, qui est le maximum disponible en stock.`);\n updateCartItem(variantId, maxStock);\n return;\n }\n\n \/\/ Sinon, mise à jour normale\n updateCartItem(variantId, quantity);\n }); *\/\n });\n })\n .catch((error) =\u003e {\n console.error('Erreur lors du traitement des produits:', error);\n cartItemsContainer.innerHTML =\n '\u003cdiv style=\"text-align: center; padding: 20px;\"\u003eErreur lors du chargement du panier\u003c\/div\u003e';\n });\n }\n\n \/\/ Fonction pour mettre à jour un article du panier\n function updateCartItem(variantId, quantity) {\n \/\/ Construction de l'objet pour la mise à jour du panier\n const data = {\n updates: {},\n };\n\n \/\/ Ajouter directement l'ID de variante à l'objet updates\n data.updates[variantId] = quantity;\n\n fetch('\/cart\/update.js', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application\/json',\n },\n body: JSON.stringify(data),\n })\n .then((response) =\u003e response.json())\n .then((cart) =\u003e {\n \/\/ Recharger le contenu du panier\n loadCartContent();\n\n \/\/ Mettre à jour les messages de frais de livraison avec la nouvelle fonction\n updateFdpDiv(cart.total_price);\n\n \/\/ Mettre à jour le message de frais de livraison\n const shippingMessageContainer = document.querySelector(\n '.cart-slider-footer div[style*=\"text-align: center\"]'\n );\n if (shippingMessageContainer) {\n if (cart.total_price \u003e= 4200) {\n shippingMessageContainer.innerHTML =\n 'Vous bénéficiez des frais de port offerts (en France métropolitaine).';\n } else {\n const remainingAmount = (4200 - cart.total_price) \/ 100;\n shippingMessageContainer.innerHTML = `Il vous reste \u003cb\u003e${remainingAmount\n .toFixed(2)\n .replace('.', ',')} €\u003c\/b\u003e pour bénéficier des frais de port offerts (en France métropolitaine).`;\n }\n }\n\n \/\/ Recalculer le total\n let finalTotal = cart.total_price \/ 100;\n\n \/\/ Ajouter les frais de livraison si nécessaire\n if (cart.total_price \u003c 4200) {\n finalTotal += 6;\n }\n\n document.getElementById('checkout-total').textContent = finalTotal.toFixed(2).replace('.', ',') + ' €';\n\n \/\/ Mettre à jour le nombre d'articles dans le badge du panier\n if (cart.item_count \u003e 0) {\n document.querySelectorAll('#cart-count-bubble span[aria-hidden=\"true\"]').forEach((span) =\u003e {\n span.textContent = cart.item_count;\n });\n document.querySelectorAll('#cart-count-bubble').forEach((bubble) =\u003e {\n bubble.style.display = 'block';\n });\n } else {\n document.querySelectorAll('#cart-count-bubble').forEach((bubble) =\u003e {\n bubble.style.display = 'none';\n });\n }\n })\n .catch((error) =\u003e {\n console.error('Erreur lors de la mise à jour du panier:', error);\n });\n }\n\n \/\/ Fonction pour mettre à jour les messages de frais de port\n function updateFdpDiv(cartTotalPrice) {\n document.querySelectorAll('.cart-info-fdp').forEach((container) =\u003e {\n if (cartTotalPrice \u003e= 4200) {\n container.innerHTML = 'Vous bénéficiez des frais de port offerts (en France métropolitaine).';\n } else {\n const remainingAmount = (4200 - cartTotalPrice) \/ 100;\n container.innerHTML = `Il vous reste \u003cb\u003e${remainingAmount\n .toFixed(2)\n .replace('.', ',')} €\u003c\/b\u003e pour bénéficier des frais de port offerts (en France métropolitaine).`;\n }\n });\n }\n\n \/\/ Vérifier si nous avons les éléments nécessaires\n if (cartIconBubbles \u0026\u0026 cartSlider) {\n \/\/ Intercepter le clic sur l'icône du panier pour ouvrir le slider au lieu de naviguer vers la page du panier\n cartIconBubbles.forEach((bubble) =\u003e {\n bubble.addEventListener('click', function (event) {\n event.preventDefault(); \/\/ Empêcher la navigation par défaut\n openCartSlider();\n });\n });\n\n \/\/ Ajouter l'événement de clic sur le bouton de fermeture\n document.getElementById('close-cart-slider').addEventListener('click', closeCartSlider);\n\n \/\/ Fermer le panier lorsque l'utilisateur clique en dehors\n document.addEventListener('click', function (event) {\n if (\n cartSlider.style.right !== '-500px' \u0026\u0026\n cartSlider.style.right !== '' \u0026\u0026\n !cartSlider.contains(event.target) \u0026\u0026\n !Array.from(cartIconBubbles).some((bubble) =\u003e bubble === event.target || bubble.contains(event.target))\n ) {\n closeCartSlider();\n }\n });\n\n \/\/ Fermer le panier avec la touche Escape\n document.addEventListener('keydown', function (event) {\n if (event.key === 'Escape' \u0026\u0026 cartSlider.style.right !== '-500px' \u0026\u0026 cartSlider.style.right !== '') {\n closeCartSlider();\n }\n });\n }\n\n \/\/ Fonction pour initialiser les boutons d'ajout d'emballage cadeau\n function initGiftPackagingButtons() {\n document.querySelectorAll('.gift-qty-input').forEach((input) =\u003e {\n \/\/ Vérifier si l'événement a déjà été ajouté (pour éviter les doublons)\n if (!input.hasAttribute('data-initialized')) {\n input.setAttribute('data-initialized', 'true');\n\n \/\/ Récupérer l'ID de variante\n const variantId = input.getAttribute('data-variant-id');\n\n \/\/ Vérifier si cet article est déjà dans le panier\n fetch('\/cart.js')\n .then((response) =\u003e response.json())\n .then((cart) =\u003e {\n const cartItem = cart.items.find((item) =\u003e item.variant_id.toString() === variantId);\n\n \/\/ Si l'article est dans le panier, sélectionner sa quantité\n if (cartItem \u0026\u0026 cartItem.quantity \u003e 0) {\n \/\/ Si la quantité est supérieure à 15, remplacer le select par un input\n if (cartItem.quantity \u003e 15) {\n const parent = input.parentElement;\n const prixUnitaire = parseFloat(parent.previousElementSibling.textContent.replace('€', '').trim());\n\n \/\/ Mettre à jour la quantité\n input.value = cartItem.quantity;\n\n \/\/ Mettre à jour le prix total\n const prixTotal = (prixUnitaire * cartItem.quantity).toFixed(2).replace('.', ',');\n parent.nextElementSibling.textContent = prixTotal + ' €';\n } else {\n \/\/ Sinon, sélectionner la quantité dans le select\n input.value = cartItem.quantity.toString();\n\n \/\/ Mettre à jour le prix affiché\n const prixUnitaire = parseFloat(\n input.parentElement.previousElementSibling.textContent.replace('€', '').trim()\n );\n const prixTotal = (prixUnitaire * cartItem.quantity).toFixed(2).replace('.', ',');\n input.parentElement.nextElementSibling.textContent = prixTotal + ' €';\n }\n }\n })\n .catch((error) =\u003e {\n console.error('Erreur lors de la récupération du panier:', error);\n });\n\n \/\/ Ajouter l'événement change pour l'input\n input.addEventListener('change', function () {\n const variantId = this.getAttribute('data-variant-id');\n const quantity = parseInt(this.value) || 0;\n updateGiftQuantity(variantId, quantity, this);\n\n \/\/ Mettre à jour le prix affiché\n const prixTexte = this.parentElement.previousElementSibling.textContent.replace('€', '').trim();\n \/\/ Convertir correctement le prix (remplacer la virgule par un point si présente)\n const prixUnitaire = parseFloat(prixTexte.replace(',', '.'));\n \/\/ Calculer le prix total avec 2 décimales\n const prixTotal = (prixUnitaire * quantity).toFixed(2).replace('.', ',');\n this.parentElement.nextElementSibling.textContent = prixTotal + ' €';\n });\n\n \/\/ Ajouter l'événement input pour mettre à jour le prix en temps réel\n input.addEventListener('input', function () {\n const quantity = parseInt(this.value) || 0;\n\n \/\/ Mettre à jour le prix affiché\n const prixTexte = this.parentElement.previousElementSibling.textContent.replace('€', '').trim();\n \/\/ Convertir correctement le prix (remplacer la virgule par un point si présente)\n const prixUnitaire = parseFloat(prixTexte.replace(',', '.'));\n \/\/ Calculer le prix total avec 2 décimales\n const prixTotal = (prixUnitaire * quantity).toFixed(2).replace('.', ',');\n this.parentElement.nextElementSibling.textContent = prixTotal + ' €';\n });\n }\n });\n }\n\n \/\/ Fonction pour mettre à jour la quantité d'un emballage cadeau\n function updateGiftQuantity(variantId, quantity, element) {\n if (!variantId) return;\n\n \/\/ Désactiver l'élément pendant le traitement\n element.disabled = true;\n\n \/\/ Si la quantité est 0, on supprime l'article du panier\n \/\/ Sinon, on met à jour la quantité\n const updateData = {\n updates: {},\n };\n updateData.updates[variantId] = quantity;\n\n fetch('\/cart\/update.js', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application\/json',\n },\n body: JSON.stringify(updateData),\n })\n .then((response) =\u003e response.json())\n .then((cart) =\u003e {\n \/\/ Mise à jour réussie\n \/\/ Ajouter un feedback visuel temporaire\n const originalColor = element.style.backgroundColor;\n element.style.backgroundColor = '#e6f7e8'; \/\/ Légère teinte verte\n\n \/\/ Mettre à jour les totaux\n const cartTotal = cart.total_price \/ 100;\n document.getElementById('checkout-subtotal').textContent = cartTotal.toFixed(2).replace('.', ',') + ' €';\n\n \/\/ Mettre à jour les frais de livraison\n const shippingText = cart.total_price \u003c 4200 ? '6 €' : 'GRATUIT';\n document.getElementById('checkout-shipping').textContent = shippingText;\n\n \/\/ Mettre à jour les messages de frais de livraison avec la nouvelle fonction\n updateFdpDiv(cart.total_price);\n\n \/\/ Recalculer le total\n let finalTotal = cartTotal;\n\n \/\/ Ajouter les frais de livraison si nécessaire\n if (shippingText !== 'GRATUIT') {\n finalTotal += 6;\n }\n\n document.getElementById('checkout-total').textContent = finalTotal.toFixed(2).replace('.', ',') + ' €';\n\n \/\/ Mettre à jour le nombre d'articles dans le badge du panier\n document.querySelectorAll('#cart-count-bubble span[aria-hidden=\"true\"]').forEach((span) =\u003e {\n span.textContent = cart.item_count;\n });\n\n \/\/ Réactiver l'élément et restaurer le style après un délai\n setTimeout(() =\u003e {\n element.disabled = false;\n element.style.backgroundColor = originalColor;\n }, 500);\n })\n .catch((error) =\u003e {\n console.error('Erreur lors de la mise à jour du panier:', error);\n element.disabled = false;\n });\n }\n });\n\n \/\/ Empêcher la soumission du formulaire par la touche Entrée\n document.addEventListener('DOMContentLoaded', function () {\n \/\/ Sélectionner le formulaire du panier\n const cartForm = document.getElementById('cart-form');\n\n if (cartForm) {\n \/\/ Empêcher la soumission du formulaire quand on appuie sur Entrée\n cartForm.addEventListener('keydown', function (event) {\n \/\/ Vérifier si la touche pressée est Entrée (code 13)\n if (event.key === 'Enter' || event.keyCode === 13) {\n \/\/ Vérifier si l'élément actif est un input ou textarea\n const activeElement = document.activeElement;\n const isInput = activeElement.tagName === 'INPUT' \u0026\u0026 activeElement.type !== 'submit';\n const isTextarea = activeElement.tagName === 'TEXTAREA';\n\n \/\/ Si c'est un input ou textarea, empêcher la soumission du formulaire\n if (isInput || isTextarea) {\n event.preventDefault();\n \/\/ Optionnellement, enlever le focus de l'élément pour fermer le clavier sur mobile\n activeElement.blur();\n }\n }\n });\n\n \/\/ Pour les appareils mobiles, empêcher également la soumission via le bouton \"go\" du clavier\n const allInputs = cartForm.querySelectorAll(\n 'input[type=\"text\"], input[type=\"number\"], input[type=\"email\"], textarea'\n );\n allInputs.forEach((input) =\u003e {\n input.addEventListener('keypress', function (event) {\n if (event.key === 'Enter' || event.keyCode === 13) {\n event.preventDefault();\n this.blur(); \/\/ Ferme le clavier sur mobile\n }\n });\n });\n }\n });\n\n \/\/ Isoler les événements de défilement à l'intérieur du panier\n document.addEventListener('DOMContentLoaded', function () {\n const cartContentBlocks = document.querySelectorAll('.cart-slider-content-block');\n\n cartContentBlocks.forEach((block) =\u003e {\n \/\/ Empêcher la propagation du défilement\n block.addEventListener(\n 'wheel',\n function (event) {\n event.stopPropagation();\n },\n {passive: true}\n );\n\n \/\/ Empêcher le défilement tactile de se propager\n block.addEventListener(\n 'touchmove',\n function (event) {\n event.stopPropagation();\n },\n {passive: true}\n );\n });\n\n \/\/ Empêcher tout défilement externe si le doigt commence à l'intérieur du panier\n document.getElementById('cart-slider').addEventListener(\n 'touchstart',\n function (event) {\n event.stopPropagation();\n },\n {passive: true}\n );\n });\n\n \/\/ Liste des IDs des produits de chaussettes\n const SOCKS_PRODUCT_IDS = [\n '9848934629705',\n '9848934596937',\n '9848934433097',\n '9848934400329',\n '9848934498633',\n '9848934465865',\n '9848934564169',\n '9848934531401',\n '9848934662473',\n '9848934695241',\n '9848934728009',\n '9848934760777',\n '9848934793545',\n '9848934826313',\n '9848934859081',\n '9848934891849',\n '9122241151305',\n '9122241053001',\n '9848932663625',\n '9614881456457',\n '9122240233801',\n '9122240954697',\n '9122240627017',\n '9122240561481',\n '9122240495945',\n '9122240463177',\n '9122240430409',\n '9614881947977',\n '9122241315145',\n '9122241380681',\n '9122241347913',\n '9122241216841',\n '9122240069961',\n '9122241577289',\n '9122241511753',\n '9122240856393',\n '9122240790857',\n '9122240135497',\n '9122240201033',\n '9122240921929',\n '10201641189705',\n '10201638994249',\n '10228619379017'\n ];\n\n\n \/\/ Fonction pour vérifier si le panier contient des chaussettes\n function hasSocksInCart() {\n return fetch('\/cart.js')\n .then((response) =\u003e response.json())\n .then((cart) =\u003e {\n \/\/ Vérifier si au moins un article est une chaussette\n return cart.items.some((item) =\u003e\n SOCKS_PRODUCT_IDS.includes(item.product_id.toString())\n );\n });\n }\n\n \/\/ Fonction pour afficher la modale de confirmation\n function showConfirmationModal() {\n const modal = document.createElement('div');\n modal.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 9999;\n `;\n\n const modalContent = document.createElement('div');\n modalContent.style.cssText = `\n background-color: white;\n padding: 20px;\n border-radius: 0;\n max-width: 90%;\n width: 500px;\n text-align: center;\n `;\n\n let message =\n \"\u003cp\u003eOulala mon petit doigt de pied m'indique que vous avez choisi des josettes marionnettes qui sont \u003cu\u003e\u003cstrong\u003evendues à l'unité\u003c\/strong\u003e\u003c\/u\u003e.\u003cbr\u003e\u003cbr\u003e Merci de vérifier que les quantités dans votre panier correspondent à ce que vous souhaitez commander.\u003c\/p\u003e\";\n\n modalContent.innerHTML = `\n ${message}\n \u003cdiv style=\"display: flex; justify-content: center; gap: 10px; margin-top: 20px;\"\u003e\n \u003cbutton id=\"modal-back\" style=\"padding: 10px 20px; background-color: #29b3ae; color: white; border: none; border-radius: 0; cursor: pointer;\"\u003eAjouter des marionettes\u003c\/button\u003e\n \u003cbutton id=\"modal-continue\" style=\"padding: 10px 20px; background-color: #666; color: white; border: none; border-radius: 0; cursor: pointer;\"\u003eValider quand même\u003c\/button\u003e\n \u003c\/div\u003e\n `;\n\n modal.appendChild(modalContent);\n document.body.appendChild(modal);\n\n \/\/ Gérer les clics sur les boutons\n document.getElementById('modal-back').addEventListener('click', () =\u003e {\n document.body.removeChild(modal);\n window.location.href = 'https:\/\/josette-tic.com\/collections\/marionnettes';\n });\n\n document.getElementById('modal-continue').addEventListener('click', () =\u003e {\n document.body.removeChild(modal);\n window.location.href = '\/checkout';\n });\n }\n\n \/\/ Modifier le comportement du bouton de validation\n document.addEventListener('DOMContentLoaded', function () {\n const checkoutButton = document.querySelector('button[name=\"checkout\"]');\n if (checkoutButton) {\n checkoutButton.addEventListener('click', function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n hasSocksInCart().then((hasSocks) =\u003e {\n if (hasSocks) {\n showConfirmationModal();\n } else {\n window.location.href = '\/checkout';\n }\n });\n });\n }\n\n \/\/ Intercepter également le formulaire\n const cartForm = document.getElementById('cart-form');\n if (cartForm) {\n cartForm.addEventListener('submit', function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n hasSocksInCart().then((hasSocks) =\u003e {\n if (hasSocks) {\n showConfirmationModal();\n } else {\n window.location.href = '\/checkout';\n }\n });\n });\n }\n });\n\n \/* \/\/ Fonction pour vérifier les paires de chaussettes\n function checkSocksPairs() {\n return fetch('\/cart.js')\n .then((response) =\u003e response.json())\n .then((cart) =\u003e {\n \/\/ Créer un objet pour stocker les quantités par taillant\n const quantitiesBySize = {\n '19-22': 0,\n '23-26': 0,\n '27-30': 0,\n '31-36': 0,\n '37-42': 0,\n '43-47': 0,\n };\n\n \/\/ Parcourir les articles du panier\n cart.items.forEach((item) =\u003e {\n \/\/ Vérifier si l'article est une chaussette en comparant son product_id\n if (SOCKS_PRODUCT_IDS.includes(item.product_id.toString())) {\n \/\/ Extraire le taillant du titre de la variante\n const sizeMatch = item.variant_title.match(\/(\\d+-\\d+)\/);\n if (sizeMatch) {\n const size = sizeMatch[1];\n quantitiesBySize[size] += item.quantity;\n }\n }\n });\n\n \/\/ Vérifier les quantités impaires\n const oddSizes = Object.entries(quantitiesBySize)\n .filter(([_, quantity]) =\u003e quantity \u003e 0 \u0026\u0026 quantity % 2 !== 0)\n .map(([size, quantity]) =\u003e ({\n size,\n missing: 1,\n }));\n\n return {\n hasOddPairs: oddSizes.length \u003e 0,\n oddSizes,\n };\n });\n }\n\n \/\/ Fonction pour afficher la modale de confirmation\n function showConfirmationModal(oddSizes) {\n const modal = document.createElement('div');\n modal.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 9999;\n `;\n\n const modalContent = document.createElement('div');\n modalContent.style.cssText = `\n background-color: white;\n padding: 20px;\n border-radius: 8px;\n max-width: 90%;\n width: 500px;\n text-align: center;\n `;\n\n let message =\n \"\u003cp\u003eOulala mon petit doigt de pied m'indique que vous avez choisi des josettes marionnettes qui sont vendues à l'unité. Voici ce qu'il vous manque pour transformer vos josettes uniques en paires :\u003c\/p\u003e\u003cul style=\\\"list-style: none; padding: 0;\\\"\u003e\";\n oddSizes.forEach(({ size }) =\u003e {\n message += `\u003cli\u003e1 josette en ${size}\u003c\/li\u003e`;\n });\n message += '\u003c\/ul\u003e';\n\n modalContent.innerHTML = `\n ${message}\n \u003cdiv style=\"display: flex; justify-content: center; gap: 10px; margin-top: 20px;\"\u003e\n \u003cbutton id=\"modal-back\" style=\"padding: 10px 20px; background-color: #29b3ae; color: white; border: none; border-radius: 4px; cursor: pointer;\"\u003eRetour au panier\u003c\/button\u003e\n \u003cbutton id=\"modal-continue\" style=\"padding: 10px 20px; background-color: #666; color: white; border: none; border-radius: 4px; cursor: pointer;\"\u003eValider quand même\u003c\/button\u003e\n \u003c\/div\u003e\n `;\n\n modal.appendChild(modalContent);\n document.body.appendChild(modal);\n\n \/\/ Gérer les clics sur les boutons\n document.getElementById('modal-back').addEventListener('click', () =\u003e {\n document.body.removeChild(modal);\n });\n\n document.getElementById('modal-continue').addEventListener('click', () =\u003e {\n document.body.removeChild(modal);\n window.location.href = '\/checkout';\n });\n }\n\n \/\/ Modifier le comportement du bouton de validation\n document.addEventListener('DOMContentLoaded', function () {\n const checkoutButton = document.querySelector('button[name=\"checkout\"]');\n if (checkoutButton) {\n checkoutButton.addEventListener('click', function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n checkSocksPairs().then((result) =\u003e {\n if (result.hasOddPairs) {\n showConfirmationModal(result.oddSizes);\n } else {\n window.location.href = '\/checkout';\n }\n });\n });\n }\n\n \/\/ Intercepter également le formulaire\n const cartForm = document.getElementById('cart-form');\n if (cartForm) {\n cartForm.addEventListener('submit', function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n checkSocksPairs().then((result) =\u003e {\n if (result.hasOddPairs) {\n showConfirmationModal(result.oddSizes);\n } else {\n window.location.href = '\/checkout';\n }\n });\n });\n }\n }); *\/\n\u003c\/script\u003e\n\n\n\u003c\/div\u003e", "footer": "\u003cdiv id=\"shopify-section-footer\" class=\"shopify-section\"\u003e \n\n\n\n\u003cdiv class=\"container-fluid bg-light dev-footer\"\u003e\n \u003cdiv id=\"torch-overlay\"\u003e\u003c\/div\u003e\n \u003cdiv class=\"container text-center\"\u003e\n \u003cdiv class=\"row\"\u003e\n \u003cdiv class=\"col-md-3 col-sm-12\"\u003e\n \u003cp\u003e\u003cstrong\u003e\u003cu\u003eABOUT\u003c\/u\u003e\u003c\/strong\u003e\u003c\/p\u003e\n \u003cul class=\"list-footer\"\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/changeons-le-monde-a-petits-pas\"\u003eThe concept\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/equipe\"\u003eThe team\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/magasins-chaussettes\"\u003eFind a store\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/contact\"\u003eContact Josette\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/josette-recrutement\"\u003eJoin us!\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/reglement-japon\"\u003eRèglement du concours \"Gratte et Gagne\"\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003cdiv id=\"torchBtn\"\u003eNe cliquez pas\u003c\/div\u003e\u003c\/li\u003e\n \u003c\/ul\u003e\n \u003c\/div\u003e\n \u003cdiv class=\"col-md-3 col-sm-12\"\u003e\n \u003cp\u003e\u003cstrong\u003e\u003cu\u003eTHE SHOP\u003c\/u\u003e\u003c\/strong\u003e\u003c\/p\u003e\n \u003cul class=\"list-footer\"\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/toutes-collections-chaussettes\"\u003eOur collections\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/collections\/mediums\"\u003eThe Josettes\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/collections\/broderie\"\u003ePersonalize your Josettes\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"https:\/\/atelier.josette-tic.com\/\"\u003eCreate your Josettes\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/map-monde\"\u003eOur Selfie!\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/products\/carte-cadeau-1\"\u003eAcheter une carte cadeau\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/utiliser-ma-carte-cadeau\"\u003eUtiliser ma carte cadeau\u003c\/a\u003e\u003c\/li\u003e\n \u003c\/ul\u003e\n \u003c\/div\u003e\n \u003cdiv class=\"col-md-3 col-sm-12\"\u003e\n \u003cp\u003e\u003cstrong\u003e\u003cu\u003eCUSTOMER SERVICE\u003c\/u\u003e\u003c\/strong\u003e\u003c\/p\u003e\n \u003cul class=\"list-footer\"\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/paiement-securise\"\u003eSecure payment\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/livraisons-et-retours\"\u003eDelivery and returns\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/conditions-générales-de-vente\"\u003eTerms and Conditions\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/mentions-legales\"\u003eLegal notices\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/foire-aux-questions\"\u003eFrequently Asked Questions\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/gestion-des-donnees-personnelles\"\u003eManagement of personal data\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/exercez-vos-droits\"\u003eExercising your rights\u003c\/a\u003e\u003c\/li\u003e\n \u003c\/ul\u003e\n \u003c\/div\u003e\n \u003cdiv class=\"col-md-3 col-sm-12\"\u003e\n \u003cp\u003e\u003cstrong\u003e\u003cu\u003eB2B\u003c\/u\u003e\u003c\/strong\u003e\u003c\/p\u003e\n \u003cul class=\"list-footer\"\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/revendeurs\"\u003eResellers\u003c\/a\u003e\u003c\/li\u003e\n \u003cli\u003e\u003ca href=\"\/pages\/cadeaux-dentreprise\"\u003eCorporate gifts\u003c\/a\u003e\u003c\/li\u003e\n \u003c\/ul\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n #torchBtn {\n cursor:pointer;\n}\n\n\/* Overlay noir *\/\n#torch-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n background: rgba(0, 0, 0, 0.98);\n opacity: 0;\n transition: opacity 0.3s;\n z-index: 9999;\n}\n\n\/* Mode actif *\/\nbody.torch-mode #torch-overlay {\n opacity: 1;\n cursor: none;\n}\n\n\u003c\/style\u003e\n\n\u003cscript\u003e\nconst btn = document.getElementById(\"torchBtn\");\nconst overlay = document.getElementById(\"torch-overlay\");\n\nlet torchActive = false;\nconst radius = 150; \/\/ rayon de la lampe\n\nbtn.addEventListener(\"click\", () =\u003e {\n torchActive = !torchActive;\n document.body.classList.toggle(\"torch-mode\", torchActive);\n});\n\n\/\/ Fonction pour mettre à jour la position du cercle\nfunction updateTorch(x, y) {\n overlay.style.background = `\n radial-gradient(\n circle ${radius}px at ${x}px ${y}px,\n transparent 0%,\n rgba(0,0,0,0.98) 80%\n )\n `;\n}\n\n\/\/ Desktop\ndocument.addEventListener(\"mousemove\", e =\u003e {\n if (!torchActive) return;\n updateTorch(e.clientX, e.clientY);\n});\n\n\/\/ Mobile\ndocument.addEventListener(\"touchmove\", e =\u003e {\n if (!torchActive) return;\n const touch = e.touches[0];\n updateTorch(touch.clientX, touch.clientY);\n});\n\n\n\u003c\/script\u003e\u003c\/div\u003e"}