<!doctype html>
<html lang="fr">
<head >
<meta charset="utf-8"/>
<meta name="title" content="Idées de Cadeau Bio, Cartes Cadeaux & Emballages | Avril"/>
<meta name="description" content="Découvrez toutes nos idées de cadeau composés de cosmétiques bio Avril pour votre entourage, nos cartes cadeaux ainsi que nos emballages cadeaux réutilisables."/>
<meta name="robots" content="INDEX,FOLLOW"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Idées de Cadeau Bio, Cartes Cadeaux & Emballages | Avril</title>
<link rel="stylesheet" type="text/css" media="all" href="https://www.avril-beaute.fr/static/version1791884672/_cache/merged/059a3134b1ccb19bc8bd6fe849ae5459.min.css" />
<link rel="icon" type="image/x-icon" href="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Magento_Theme/favicon.ico" />
<link rel="shortcut icon" type="image/x-icon" href="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Magento_Theme/favicon.ico" />
<script type="text/javascript" src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Sbsoftware_Sarbacane/js/sd_cart_update.min.js"></script>
<script type="text/javascript" src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Smile_ElasticsuiteTracker/js/tracking.min.js"></script>
<script type="text/javascript" src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/js/enable-animation.min.js"></script>
<script type="text/javascript" src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/js/obfuscation.min.js"></script>
<script type="text/javascript" src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Hyva_SmileElasticsuite/js/fetch_products_view.min.js"></script>
<script type="text/javascript" src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Hyva_MagedelightMegamenu/js/megamenu/megamenu.min.js"></script>
<script type="text/javascript" src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Hyva_MagedelightMegamenu/js/megamenu/burgermenu.min.js"></script>
<link rel="canonical" href="https://www.avril-beaute.fr/cadeaux/cadeaux.html"/>
<script>
function launchGtm() {
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-N95VVZ2');
}
launchGtm();
</script>
<script type="application/ld+json"> {
"@context": "http://schema.org",
"@type": "WebSite",
"name": "Avril",
"url": "https://www.avril-beaute.fr/",
"potentialAction": {
"@type": "SearchAction",
"target": "https://www.avril-beaute.fr/catalogsearch/result/?q={search_term_string}",
"query-input": "required name=search_term_string"
} }
</script>
<script type="application/ld+json"> {
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Idées de Cadeau Bio, Cartes Cadeaux & Emballages | Avril",
"url": "https://www.avril-beaute.fr/cadeaux/cadeaux.html",
"inLanguage": "fr",
"description": "Découvrez toutes nos idées de cadeau composés de cosmétiques bio Avril pour votre entourage, nos cartes cadeaux ainsi que nos emballages cadeaux réutilisables.",
"publisher": {
"@type": "Organization",
"name": "Avril",
"logo": {
"@type": "ImageObject",
"url": "https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/logo.svg"
}
},
"isPartOf": {
"@type": "WebSite",
"name": "Avril",
"url": "https://www.avril-beaute.fr/"
}
,
"potentialAction": {
"@type": "SearchAction",
"target": "https://www.avril-beaute.fr/catalogsearch/result/?q={search_term_string}",
"query-input": "required name=search_term_string"
}
,
"mainEntity": {
"@type": "ItemList",
"name": "Idées de Cadeau Bio, Cartes Cadeaux & Emballages | Avril",
"itemListOrder": "http://schema.org/ItemListOrderAscending",
"numberOfItems": 33,
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"url": "https://www.avril-beaute.fr/calendrier-de-l-avent-2026-24-jours-pour-bien-etre-soi-2325.html",
"name": "Calendrier de l'Avent 2026 - 24 jours pour bien être soi"
}
,
{
"@type": "ListItem",
"position": 2,
"url": "https://www.avril-beaute.fr/coffret-cadeau-essentiels-soins-2293.html",
"name": "Coffret cadeau Essentiels soins"
}
,
{
"@type": "ListItem",
"position": 3,
"url": "https://www.avril-beaute.fr/coffret-cadeau-routine-soin-visage-2291.html",
"name": "Coffret cadeau Routine soin visage"
}
,
{
"@type": "ListItem",
"position": 4,
"url": "https://www.avril-beaute.fr/coffret-cadeau-routine-eclat-1891.html",
"name": "Coffret cadeau Routine éclat"
}
,
{
"@type": "ListItem",
"position": 5,
"url": "https://www.avril-beaute.fr/coffret-cadeau-rituel-douceur-2294.html",
"name": "Coffret cadeau Rituel douceur"
}
,
{
"@type": "ListItem",
"position": 6,
"url": "https://www.avril-beaute.fr/coffret-cadeau-cocooning-2295.html",
"name": "Coffret cadeau Cocooning"
}
,
{
"@type": "ListItem",
"position": 7,
"url": "https://www.avril-beaute.fr/coffret-cadeau-essentiels-make-up-2296.html",
"name": "Coffret cadeau Essentiels Make-up"
}
,
{
"@type": "ListItem",
"position": 8,
"url": "https://www.avril-beaute.fr/coffret-cadeau-mes-essentiels-rechargeables-2292.html",
"name": "Coffret cadeau Mes essentiels rechargeables"
}
,
{
"@type": "ListItem",
"position": 9,
"url": "https://www.avril-beaute.fr/coffret-cadeau-cosmetique-bio-mon-duo-quotidien-1872.html",
"name": "Coffret cadeau Mon duo visage quotidien"
}
,
{
"@type": "ListItem",
"position": 10,
"url": "https://www.avril-beaute.fr/coffret-cadeau-teint-eclatant.html",
"name": "Coffret cadeau Trio soins éclat visage"
}
,
{
"@type": "ListItem",
"position": 11,
"url": "https://www.avril-beaute.fr/carte-cadeau.html",
"name": "Carte cadeau"
}
,
{
"@type": "ListItem",
"position": 12,
"url": "https://www.avril-beaute.fr/coffret-cadeau-cosmetique-bio-un-temps-pour-soi-1873.html",
"name": "Coffret cadeau Duo soins éclat visage"
}
,
{
"@type": "ListItem",
"position": 13,
"url": "https://www.avril-beaute.fr/coffret-cadeau-cosmetique-bio-mon-duo-masculin-1874.html",
"name": "Coffret cadeau Mon duo visage au masculin"
}
,
{
"@type": "ListItem",
"position": 14,
"url": "https://www.avril-beaute.fr/coffret-cadeau-cosmetiques-bio-duo-matinal-1879.html",
"name": "Coffret cadeau Duo soins quotidiens corps"
}
,
{
"@type": "ListItem",
"position": 15,
"url": "https://www.avril-beaute.fr/coffret-cadeau-escale-dans-le-sud-1862.html",
"name": "Coffret cadeau Soins parfumés visage & corps "
}
,
{
"@type": "ListItem",
"position": 16,
"url": "https://www.avril-beaute.fr/coffret-cadeau-cosmetiques-bio-mon-rituel-corps-1876.html",
"name": "Coffret cadeau Duo soins corps"
}
,
{
"@type": "ListItem",
"position": 17,
"url": "https://www.avril-beaute.fr/coffret-cadeau-mon-kit-rasage-cc1.html",
"name": "Coffret cadeau Rasage & soins visage homme "
}
,
{
"@type": "ListItem",
"position": 18,
"url": "https://www.avril-beaute.fr/kit-decouverte-soins-visage-corps-et-maquillage.html",
"name": "Kit découverte Soins visage, corps et maquillage"
}
,
{
"@type": "ListItem",
"position": 19,
"url": "https://www.avril-beaute.fr/duo-maquillage-soin-pailletes.html",
"name": "Coffret cadeau Duo maquillage & soin pailleté"
}
,
{
"@type": "ListItem",
"position": 20,
"url": "https://www.avril-beaute.fr/coffret-cadeau-mes-basiques-homme-cc2.html",
"name": "Coffret cadeau Trio soins visage & corps homme"
}
,
{
"@type": "ListItem",
"position": 21,
"url": "https://www.avril-beaute.fr/trio-vernis-a-ongles.html",
"name": "Coffret cadeau Trio vernis à ongles"
}
,
{
"@type": "ListItem",
"position": 22,
"url": "https://www.avril-beaute.fr/coffret-cadeau-rituel-precieux.html",
"name": "Coffret cadeau Soins visage peau mature"
}
,
{
"@type": "ListItem",
"position": 23,
"url": "https://www.avril-beaute.fr/kit-decouverte-maquillage.html",
"name": "Kit découverte maquillage"
}
,
{
"@type": "ListItem",
"position": 24,
"url": "https://www.avril-beaute.fr/petit-coffret-beige-petales-vide-1848.html",
"name": "Petit coffret jaune motif carreaux vide"
}
,
{
"@type": "ListItem",
"position": 25,
"url": "https://www.avril-beaute.fr/grand-coffret-bleu-galets-1847.html",
"name": "Grand coffret jaune motif feuillage vide"
}
,
{
"@type": "ListItem",
"position": 26,
"url": "https://www.avril-beaute.fr/pochon-en-coton-bio-petit-modele-12x15cm-1466.html",
"name": "Pochon en coton bio Petit modèle (12x15cm)"
}
,
{
"@type": "ListItem",
"position": 27,
"url": "https://www.avril-beaute.fr/pochon-en-coton-bio-moyen-modele-16x19cm-1465.html",
"name": "Pochon en coton bio Moyen Modèle (16x19cm)"
}
,
{
"@type": "ListItem",
"position": 28,
"url": "https://www.avril-beaute.fr/pochon-en-coton-bio-grand-modele-16x23cm-1464.html",
"name": "Pochon en coton bio Grand Modèle (16x23cm)"
}
,
{
"@type": "ListItem",
"position": 29,
"url": "https://www.avril-beaute.fr/pochon-en-coton-bio-modele-xl-25x28cm-1905.html",
"name": "Pochon en coton bio Modèle XL (25x28cm)"
}
,
{
"@type": "ListItem",
"position": 30,
"url": "https://www.avril-beaute.fr/furoshiki-carreaux-52-x-52-cm-coton-bio-1214.html",
"name": "Furoshiki Carreaux 52 x 52 cm Coton bio"
}
,
{
"@type": "ListItem",
"position": 31,
"url": "https://www.avril-beaute.fr/furoshiki-zebre-52-x-52-cm-coton-bio-1215.html",
"name": "Furoshiki Zèbre 52 x 52 cm Coton bio"
}
,
{
"@type": "ListItem",
"position": 32,
"url": "https://www.avril-beaute.fr/furoshiki-feuillage-32-x-32-cm-coton-bio-1213.html",
"name": "Furoshiki Feuillage 32 x 32 cm Coton bio"
}
,
{
"@type": "ListItem",
"position": 33,
"url": "https://www.avril-beaute.fr/furoshiki-petales-32-x-32-cm-coton-bio-1212.html",
"name": "Furoshiki Pétales 32 x 32 cm Coton bio"
}
]
}
}
</script>
<script type="application/ld+json">
{"@context":"https:\/\/schema.org","@type":"Organization","url":"https:\/\/www.avril-beaute.fr\/","name":"Avril","logo":"https:\/\/www.avril-beaute.fr\/static\/version1791884672\/frontend\/Avril\/hyva\/fr_FR\/images\/logo.svg","image":"https:\/\/www.avril-beaute.fr\/static\/version1791884672\/frontend\/Avril\/hyva\/fr_FR\/images\/logo.svg","email":"serviceclientweb@avril-beaute.fr","address":{"@type":"PostalAddress","streetAddress":"25 avenue Jean Perrin","addressLocality":"Bondues","postalCode":"59910","addressCountry":"france"},"telephone":"03 20 70 81 78","sameAs":["https:\/\/www.instagram.com\/avrilcosmetiques\r","https:\/\/www.facebook.com\/avril.cosmetique\r","https:\/\/www.pinterest.fr\/avrilbeaute\/\r","https:\/\/www.linkedin.com\/company\/18163493\r","https:\/\/www.tiktok.com\/@avrilcosmetiquebio"],"vatID":"FR69 538 712 217","hasMerchantReturnPolicy":{"@type":"MerchantReturnPolicy","returnPolicyCategory":"https:\/\/schema.org\/MerchantReturnFiniteReturnWindow","merchantReturnDays":60,"returnMethod":"https:\/\/schema.org\/ReturnByMail","returnFees":"https:\/\/schema.org\/FreeReturn"}} </script>
<!--Custom Style-->
<script defer charset="utf-8" src="https://widgets.rr.skeepers.io/product/d8dd2351-8915-8454-393d-a739ef959513/73bb10c1-72d7-4fab-afd7-18a82c8b17a2.js"></script><script>
var SD_CART_URL = 'https://www.avril-beaute.fr/sd_cart_update';
var SD_VALIDATE = false;
</script>
<script>
//<![CDATA[
function userConsentEsTraking(config)
{
return config.cookieRestrictionEnabled == false || hyva.getCookie(config.cookieRestrictionName) !== null;
}
try {
smileTracker.setConfig({
beaconUrl : 'https://www.avril-beaute.fr/elasticsuite/tracker/hit/image/h.png',
telemetryUrl : 'https://t.elasticsuite.io/track',
telemetryEnabled : '',
sessionConfig : {"visit_cookie_name":"STUID","visit_cookie_lifetime":"3600","visitor_cookie_lifetime":"365","visitor_cookie_name":"STVID","domain":"avril-beaute.fr","path":"\/"},
endpointUrl : 'https://www.avril-beaute.fr/rest/V1/elasticsuite-tracker/hit'
});
smileTracker.addPageVar('store_id', '6');
document.addEventListener('DOMContentLoaded', function () {
if (userConsentEsTraking({"cookieRestrictionEnabled":"0","cookieRestrictionName":"user_allowed_save_cookie"})) {
smileTracker.sendTag();
}
});
} catch (err) {
;
}
//]]>
</script>
<script>
var BASE_URL = 'https://www.avril-beaute.fr/';
var THEME_PATH = 'https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR';
var COOKIE_CONFIG = {
"expires": null,
"path": "\u002F",
"domain": ".avril\u002Dbeaute.fr",
"secure": true,
"lifetime": "34187400",
"cookie_restriction_enabled": false };
var CURRENT_STORE_CODE = 'b2c_fr';
var CURRENT_WEBSITE_ID = '3';
window.hyva = window.hyva || {}
window.cookie_consent_groups = window.cookie_consent_groups || {}
window.cookie_consent_groups['necessary'] = true;
window.cookie_consent_config = window.cookie_consent_config || {};
window.cookie_consent_config['necessary'] = [].concat(
window.cookie_consent_config['necessary'] || [],
[
'user_allowed_save_cookie',
'form_key',
'mage-messages',
'private_content_version',
'mage-cache-sessid',
'last_visited_store',
'section_data_ids'
]
);
//# sourceURL=hyva-variables.js
</script>
<script>
(function( hyva, undefined ) {
function lifetimeToExpires(options, defaults) {
const lifetime = options.lifetime || defaults.lifetime;
if (lifetime) {
const date = new Date;
date.setTime(date.getTime() + lifetime * 1000);
return date;
}
return null;
}
function generateRandomString() {
const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
length = 16;
let formKey = '',
charactersLength = allowedCharacters.length;
for (let i = 0; i < length; i++) {
formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))]
}
return formKey;
}
const sessionCookieMarker = {noLifetime: true}
const cookieTempStorage = {};
const internalCookie = {
get(name) {
const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return v ? v[2] : null;
},
set(name, value, days, skipSetDomain) {
let expires,
path,
domain,
secure,
samesite;
const defaultCookieConfig = {
expires: null,
path: '/',
domain: null,
secure: false,
lifetime: null,
samesite: 'lax'
};
const cookieConfig = window.COOKIE_CONFIG || {};
expires = days && days !== sessionCookieMarker
? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig)
: lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires;
path = cookieConfig.path || defaultCookieConfig.path;
domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain);
secure = cookieConfig.secure || defaultCookieConfig.secure;
samesite = cookieConfig.samesite || defaultCookieConfig.samesite;
document.cookie = name + "=" + encodeURIComponent(value) +
(expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') +
(path ? '; path=' + path : '') +
(domain ? '; domain=' + domain : '') +
(secure ? '; secure' : '') +
(samesite ? '; samesite=' + samesite : 'lax');
},
isWebsiteAllowedToSaveCookie() {
const allowedCookies = this.get('user_allowed_save_cookie');
if (allowedCookies) {
const allowedWebsites = JSON.parse(unescape(allowedCookies));
return allowedWebsites[CURRENT_WEBSITE_ID] === 1;
}
return false;
},
getGroupByCookieName(name) {
const cookieConsentConfig = window.cookie_consent_config || {};
let group = null;
for (let prop in cookieConsentConfig) {
if (!cookieConsentConfig.hasOwnProperty(prop)) continue;
if (cookieConsentConfig[prop].includes(name)) {
group = prop;
break;
}
}
return group;
},
isCookieAllowed(name) {
const cookieGroup = this.getGroupByCookieName(name);
return cookieGroup
? window.cookie_consent_groups[cookieGroup]
: this.isWebsiteAllowedToSaveCookie();
},
saveTempStorageCookies() {
for (const [name, data] of Object.entries(cookieTempStorage)) {
if (this.isCookieAllowed(name)) {
this.set(name, data['value'], data['days'], data['skipSetDomain']);
delete cookieTempStorage[name];
}
}
}
};
hyva.getCookie = (name) => {
const cookieConfig = window.COOKIE_CONFIG || {};
if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) {
return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null;
}
return internalCookie.get(name);
}
hyva.setCookie = (name, value, days, skipSetDomain) => {
const cookieConfig = window.COOKIE_CONFIG || {};
if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) {
cookieTempStorage[name] = {value, days, skipSetDomain};
return;
}
return internalCookie.set(name, value, days, skipSetDomain);
}
hyva.setSessionCookie = (name, value, skipSetDomain) => {
return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain)
}
hyva.getBrowserStorage = () => {
const browserStorage = window.localStorage || window.sessionStorage;
if (!browserStorage) {
console.warn('Browser Storage is unavailable');
return false;
}
try {
browserStorage.setItem('storage_test', '1');
browserStorage.removeItem('storage_test');
} catch (error) {
console.warn('Browser Storage is not accessible', error);
return false;
}
return browserStorage;
}
hyva.postForm = (postParams) => {
const form = document.createElement("form");
let data = postParams.data;
if (! postParams.skipUenc && ! data.uenc) {
data.uenc = btoa(window.location.href);
}
form.method = "POST";
form.action = postParams.action;
Object.keys(postParams.data).map(key => {
const field = document.createElement("input");
field.type = 'hidden'
field.value = postParams.data[key];
field.name = key;
form.appendChild(field);
});
const form_key = document.createElement("input");
form_key.type = 'hidden';
form_key.value = hyva.getFormKey();
form_key.name="form_key";
form.appendChild(form_key);
document.body.appendChild(form);
form.submit();
}
hyva.getFormKey = function () {
let formKey = hyva.getCookie('form_key');
if (!formKey) {
formKey = generateRandomString();
hyva.setCookie('form_key', formKey);
}
return formKey;
}
hyva.formatPrice = (value, showSign, options = {}) => {
const groupSeparator = options.groupSeparator;
const decimalSeparator = options.decimalSeparator
delete options.groupSeparator;
delete options.decimalSeparator;
const formatter = new Intl.NumberFormat(
'fr\u002DFR',
Object.assign({
style: 'currency',
currency: 'EUR',
signDisplay: showSign ? 'always' : 'auto'
}, options)
);
return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ?
formatter.formatToParts(value).map(({type, value}) => {
switch (type) {
case 'currency':
return '\u20AC' || value;
case 'minusSign':
return '- ';
case 'plusSign':
return '+ ';
case 'group':
return groupSeparator !== undefined ? groupSeparator : value;
case 'decimal':
return decimalSeparator !== undefined ? decimalSeparator : value;
default :
return value;
}
}).reduce((string, part) => string + part) :
formatter.format(value);
}
const formatStr = function (str, nStart) {
const args = Array.from(arguments).slice(2);
return str.replace(/(%+)([0-9]+)/g, (m, p, n) => {
const idx = parseInt(n) - nStart;
if (args[idx] === null || args[idx] === void 0) {
return m;
}
return p.length % 2
? p.slice(0, -1).replace('%%', '%') + args[idx]
: p.replace('%%', '%') + n;
})
}
hyva.str = function (string) {
const args = Array.from(arguments);
args.splice(1, 0, 1);
return formatStr.apply(undefined, args);
}
hyva.strf = function () {
const args = Array.from(arguments);
args.splice(1, 0, 0);
return formatStr.apply(undefined, args);
}
/**
* Take a html string as `content` parameter and
* extract an element from the DOM to replace in
* the current page under the same selector,
* defined by `targetSelector`
*/
hyva.replaceDomElement = (targetSelector, content) => {
// Parse the content and extract the DOM node using the `targetSelector`
const parser = new DOMParser();
const doc = parser.parseFromString(content, 'text/html');
const contentNode = doc.querySelector(targetSelector);
// Bail if content or target can't be found
if (!contentNode || !document.querySelector(targetSelector)) {
return;
}
hyva.activateScripts(contentNode);
// Replace the old DOM node with the new content
document.querySelector(targetSelector).replaceWith(contentNode);
// Reload customerSectionData and display cookie-messages if present
window.dispatchEvent(new CustomEvent("reload-customer-section-data"));
hyva.initMessages();
}
hyva.removeScripts = (contentNode) => {
const scripts = contentNode.getElementsByTagName('script');
for (let i = 0; i < scripts.length; i++) {
scripts[i].parentNode.removeChild(scripts[i]);
}
const templates = contentNode.getElementsByTagName('template');
for (let i = 0; i < templates.length; i++) {
const container = document.createElement('div');
container.innerHTML = templates[i].innerHTML;
hyva.removeScripts(container);
templates[i].innerHTML = container.innerHTML;
}
}
hyva.activateScripts = (contentNode) => {
// Create new array from HTMLCollection to avoid mutation of collection while manipulating the DOM.
const scripts = Array.from(contentNode.getElementsByTagName('script'));
// Iterate over all script tags to duplicate+inject each into the head
for (const original of scripts) {
const script = document.createElement('script');
original.type && (script.type = original.type);
script.innerHTML = original.innerHTML;
// Remove the original (non-executing) script from the contentNode
original.parentNode.removeChild(original)
// Add script to head
document.head.appendChild(script);
}
return contentNode;
}
const replace = {['+']: '-', ['/']: '_', ['=']: ','};
hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]);
let currentTrap;
const focusableElements = (rootElement) => {
const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]';
return Array.from(rootElement.querySelectorAll(selector))
.filter(el => {
return el.style.display !== 'none'
&& !el.disabled
&& el.tabIndex !== -1
&& (el.offsetWidth || el.offsetHeight || el.getClientRects().length)
})
}
const focusTrap = (e) => {
const isTabPressed = e.key === 'Tab' || e.keyCode === 9;
if (!isTabPressed) return;
const focusable = focusableElements(currentTrap)
const firstFocusableElement = focusable[0]
const lastFocusableElement = focusable[focusable.length - 1]
e.shiftKey
? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault())
: document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault())
};
hyva.releaseFocus = (rootElement) => {
if (currentTrap && (!rootElement || rootElement === currentTrap)) {
currentTrap.removeEventListener('keydown', focusTrap)
currentTrap = null
}
}
hyva.trapFocus = (rootElement) => {
if (!rootElement) return;
hyva.releaseFocus()
currentTrap = rootElement
rootElement.addEventListener('keydown', focusTrap)
const firstElement = focusableElements(rootElement)[0]
firstElement && firstElement.focus()
}
hyva.safeParseNumber = (rawValue) => {
const number = rawValue ? parseFloat(rawValue) : null;
return Array.isArray(number) || isNaN(number) ? rawValue : number;
}
const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('');
hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => {
const camelCase = toCamelCase(name);
const key = '__hyva_bool_' + name
return new Proxy(Object.assign(
additionalMethods,
{
[key]: !!value,
[name]() {return !!this[key]},
['!' + name]() {return !this[key]}, // @deprecated This does not work with non-CSP Alpine
['not' + camelCase]() {return !this[key]},
['toggle' + camelCase]() {this[key] = !this[key]},
[`set${camelCase}True`]() {this[key] = true},
[`set${camelCase}False`]() {this[key] = false},
}
), {
set(target, prop, value) {
return prop === name
? (target[key] = !!value)
: Reflect.set(...arguments);
}
})
}
hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true})
window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true});
window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies())
}( window.hyva = window.hyva || {} ));
//# sourceURL=hyva.js
</script>
<script type="speculationrules">
{
"tag": "Hyva Theme",
"prefetch": [{
"source": "document",
"where": {
"and": [
{ "href_matches": "/*" },
{ "not": {
"href_matches": ["/customer/*","/search/*","/sales/*","/wishlist/*","/checkout/*","/paypal/*","/newsletter/*","/stores/store/redirect/*"] }},
{ "not": {
"selector_matches": [".no-preload", ".do-not-prerender", "[download]", "[rel~=nofollow]", "[target]"]
}}
]
},
"eagerness": "moderate"
}]
}
</script>
<style>
:root {
--dynamic-bg-color: #bc6b5e;
}
</style>
<script
src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/js/swiper/swiper-bundle.min.js"></script>
<meta property="og:type" content="og:product" />
<meta property="og:title" content="Idées de Cadeau Bio, Cartes Cadeaux & Emballages | Avril" />
<meta property="og:image" content="https://www.avril-beaute.fr/media/catalog/category/7-_Cat_gorie_CADEAUX_copie_2_retouch_.jpg" />
<meta property="og:description" content="<style>#html-body [data-pb-style=QJXM5QK]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="QJXM5QK"><div data-content-type="text" data-appearance="default" data-element="main"></div></div></div>" />
<meta property="og:url" content="https://www.avril-beaute.fr/cadeaux/cadeaux.html" />
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content="" />
<meta name="twitter:title" content="Idées de Cadeau Bio, Cartes Cadeaux & Emballages | Avril" />
<meta name="twitter:description" content="<style>#html-body [data-pb-style=QJXM5QK]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="QJXM5QK"><div data-content-type="text" data-appearance="default" data-element="main"></div></div></div>" />
<meta name="twitter:image" content="https://www.avril-beaute.fr/media/catalog/category/7-_Cat_gorie_CADEAUX_copie_2_retouch_.jpg" />
<link rel="next" href="https://www.avril-beaute.fr/cadeaux/cadeaux.html?p=2" />
</head>
<body id="html-body" class="page-with-filter page-products categorypath-cadeaux-cadeaux category-cadeaux page-layout-1column catalog-category-view page-layout-category-full-width">
<noscript>
<iframe
src="https://www.googletagmanager.com/ns.html?id=GTM-N95VVZ2"
height="0" width="0" style="display:none;visibility:hidden"></iframe>
</noscript>
<style>
/*--add custom css for affiliate--*/
</style>
<script>
const crispPluginURL = "https://plugins.crisp.chat/urn:crisp.im:magento:0"
window.$crisp = [];
window.CRISP_WEBSITE_ID = "51ee87b2-9a09-4e4e-87a7-48756085e9ab";
(function () {
d = document;
s = d.createElement("script");
s.src = "https://client.crisp.chat/l.js";
s.async = 1;
d.getElementsByTagName("head")[0].appendChild(s);
})();
window.CRISP_READY_TRIGGER = __handleCrispTriggered;
function handleMagentoCustomerData(customerData) {
const _customer = customerData.get("customer")();
// No customer found, do not continue.
if (!_customer || Object.keys(_customer).length === 0) {
return;
}
// Set customers full name in Crisp
$crisp.push(['set', 'user:nickname', _customer.fullname]);
// Fetch customer data using Magento API
require(["jquery"], function ($) {
$.ajax({
url: "/rest/V1/customers/me",
type: "GET",
contentType: "application/json",
dataType: "json",
success: function (customer) {
// Set customer email in Crisp
if (customer.email) {
$crisp.push(['set', 'user:email', customer.email]);
}
// Post customer ID to Crisp
if (customer.id) {
__reportCrispData("customer", {id: parseInt(customer.id)})
}
},
error: function () {
// Ignore error
}
});
});
}
function handleMagentoCustomerCart(customerData) {
const _cartType = "cart";
const _cart = customerData.get("cart");
const _cartData = _cart();
const _currency = "EUR";
// Post cart immediately to Crisp
if (_cartData?.items?.length > 0) {
if (_currency !== null) {
_cartData.currency = _currency
}
__reportCrispData(_cartType, _cartData);
}
// Subscribe to cart changes and post to Crisp
_cart.subscribe((data) => {
if (_currency !== null) {
data.currency = _currency
}
if (data?.items?.length > 0) {
__reportCrispData(_cartType, data);
}
});
}
function __handleCrispTriggered() {
// Set 'magento' segment on session (only after first message is sent)
$crisp.push(["on", "message:sent", () => {
$crisp.push(["set", "session:segments", [["magento"]]]);
$crisp.push(["off", "message:sent"]);
}]);
// Only post data when chat is opened by the user for the first time.
$crisp.push(["on", "chat:opened", () => {
// Get and save Crisp session ID
window.CRISP_SESSION_ID = $crisp.get('session:identifier');
$crisp.push(["off", "chat:opened"]);
// Handle magento customer data and cart
require(["Magento_Customer/js/customer-data"], (customerData) => {
handleMagentoCustomerData(customerData);
handleMagentoCustomerCart(customerData);
});
}])
}
function __reportCrispData(type, body) {
fetch(
crispPluginURL +
"/visitors/website/" +
window.CRISP_WEBSITE_ID +
"/session/" +
window.CRISP_SESSION_ID +
"/" + type,
{
method: "POST",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
},
body: JSON.stringify(body),
}
);
}
</script>
<input name="form_key" type="hidden" value="ThSMex3EkPNfSLKM" />
<noscript>
<section
class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal"
aria-labelledby="messageGlobalNoScriptMessage"
>
<div class="container text-center">
<p id="messageGlobalNoScriptMessage">
<strong>Javascript est désactivé dans votre navigateur.</strong>
<span>
Pour une meilleure expérience sur notre site, assurez-vous d’activer JavaScript dans votre navigateur. </span>
</p>
</div>
</section>
</noscript>
<script>
'use strict';
(function () {
/**
* @typedef amPickupLocalStorage
* @property {Object} scheduleData
* @property {Object} store
* @property {boolean} isPickupSelected
* @property {boolean} isCurbsideChecked
* @property {string} curbsideComment
* @property {Object} dateValue
* @property {string} timeValue
*/
window.amPickupLocalStorage = window.amPickupLocalStorage || {
getObject: function () {
return hyva.getBrowserStorage().getItem('amPickupLocation')
? JSON.parse(hyva.getBrowserStorage().getItem('amPickupLocation'))
: {};
},
setObject: function (newObject) {
hyva.getBrowserStorage().setItem('amPickupLocation', JSON.stringify(newObject));
},
remove: function () {
hyva.getBrowserStorage().removeItem('amPickupLocation');
},
setIsPickupSelected: function (value) {
this.setObject({
...this.getObject(),
isPickupSelected: value
});
},
isPickupSelected: function () {
return (this.getObject().isPickupSelected && this.getObject().isPickupSelected !== undefined)
? Boolean(Number(this.getObject().isPickupSelected))
: null;
},
setScheduleData: function (value) {
this.setObject({
...this.getObject(),
scheduleData: value
});
},
getScheduleData: function () {
return (this.getObject().scheduleData && this.getObject().scheduleData !== undefined)
? this.getObject().scheduleData
: null;
},
setStore: function (value) {
this.setObject({
...this.getObject(),
store: value
});
},
getStore: function () {
return (this.getObject().store && this.getObject().store !== undefined)
? this.getObject().store
: null;
},
setCurbsideChecked: function (value) {
this.setObject({
...this.getObject(),
isCurbsideChecked: value
});
},
getCurbsideChecked: function () {
return (this.getObject().isCurbsideChecked && this.getObject().isCurbsideChecked !== undefined)
? this.getObject().isCurbsideChecked
: false;
},
setCurbsideComment: function (value) {
this.setObject({
...this.getObject(),
curbsideComment: value
});
},
getCurbsideComment: function () {
return (this.getObject().curbsideComment && this.getObject().curbsideComment !== undefined)
? this.getObject().curbsideComment
: null;
},
setDateValue: function (value) {
this.setObject({
...this.getObject(),
dateValue: value
});
},
getDateValue: function () {
return (this.getObject().dateValue && this.getObject().dateValue !== undefined)
? new Date(Number(this.getObject().dateValue))
: null;
},
setTimeValue: function (value) {
this.setObject({
...this.getObject(),
timeValue: value
});
},
getTimeValue: function () {
return (this.getObject().timeValue && this.getObject().timeValue !== undefined)
? this.getObject().timeValue
: null;
}
};
})();
</script>
<script src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Connectif_Integration/js/ajaxConnectifTagsCore.min.js"></script>
<script src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Connectif_Integration/js/ajaxConnectifTagsHyva.min.js"></script>
<script>
window.connectifAjaxTags({
url: 'https\u003A\u002F\u002Fwww.avril\u002Dbeaute.fr\u002Fconnectif\u002Ftags\u002Fajaxconnectiftags'
});
</script>
<script>
'use strict';
(function(hyva) {
const formValidationRules = {
required(value, options, field, context) {
const el = field.element.type === 'hidden' ? createTextInputFrom(field.element) : field.element,
msg = 'Ce\u0020champ\u0020est\u0020obligatoire.';
if (el.type === 'radio' || el.type === 'checkbox') {
return (value === undefined || value.length === 0) ? msg : true;
}
el.setAttribute('required', '');
el.checkValidity();
return el.validity.valueMissing ? msg : true;
},
maxlength(value, options, field, context) {
const n = Number(options)
if (value.length > n) {
return n === 1
? hyva.strf('Veuillez\u0020entrer\u0020au\u0020maximum\u00201\u0020caract\u00E8re.')
: hyva.strf('Veuillez\u0020entrer\u0020au\u0020maximum\u0020\u00250\u0020caract\u00E8res.', options)
}
return true;
},
minlength(value, options, field, context) {
const n = Number(options)
if (value.length > 0 && value.length < n) {
return n === 1
? hyva.strf('Veuillez\u0020entrer\u0020au\u0020moins\u00201\u0020caract\u00E8re.')
: hyva.strf('Veuillez\u0020entrer\u0020au\u0020moins\u0020\u00250\u0020caract\u00E8res.', options)
}
return true;
},
max(value, options, field, context) {
field.element.setAttribute('max', options);
field.element.checkValidity();
if (field.element.validity.rangeOverflow) {
return hyva.strf('Veuillez\u0020entrer\u0020une\u0020valeur\u0020inf\u00E9rieure\u0020ou\u0020\u00E9gale\u0020\u00E0\u0020\u0022\u00250\u0022.', options);
}
return true;
},
min(value, options, field, context) {
field.element.setAttribute('min', options);
field.element.checkValidity();
if (field.element.validity.rangeUnderflow) {
return hyva.strf('Veuillez\u0020entrer\u0020une\u0020valeur\u0020sup\u00E9rieure\u0020ou\u0020\u00E9gale\u0020\u00E0\u0020\u0022\u00250\u0022.', options);
}
return true;
},
step(value, options, field, context) {
field.element.setAttribute('step', options);
field.element.checkValidity();
if (field.element.validity.stepMismatch) {
const val = Number(value);
const step = Number(options);
const msg = 'Veuillez\u0020entrer\u0020une\u0020valeur\u0020valide.\u0020L\u002Bes\u0020deux\u0020valeurs\u0020valides\u0020les\u0020plus\u0020proches\u0020sont\u0020\u0022\u00250\u0022\u0020et\u0020\u0022\u00251\u0022.';
return hyva.strf(msg, Math.floor(val / step) * step, Math.ceil(val / step) * step);
}
return true;
},
pattern(value, options, field, context) {
field.element.setAttribute('pattern', options);
field.element.checkValidity();
if (field.element.validity.patternMismatch) {
return field.element.title
? hyva.strf('Please\u0020match\u0020the\u0020requested\u0020format\u003A\u0020\u00250.', field.element.title)
: 'Veuillez\u0020respecter\u0020le\u0020format\u0020demand\u00E9.'
}
return true;
},
email(value, options, field, context) {
const rule = /^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i;
if (value.length > 0 && !rule.test(value)) {
return 'Saisissez\u0020un\u0020email\u0020valide.';
}
return true;
},
password(value, options, field, context) {
const rule = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/;
if (value.length > 0 && !rule.test(value)) {
return 'Please\u0020provide\u0020at\u0020least\u0020one\u0020upper\u0020case,\u0020one\u0020lower\u0020case,\u0020one\u0020digit\u0020and\u0020one\u0020special\u0020character\u0020\u0028\u0023\u003F\u0021\u0040\u0024\u0025\u005E\u0026\u002A\u002D\u0029';
}
return true;
},
equalTo(value, options, field, context) {
const dependencyField = context.fields[options].element;
if (value !== dependencyField.value) {
const dependencyFieldName =
dependencyField.label ||
dependencyField.title ||
(dependencyField.labels && dependencyField.labels[0] && dependencyField.labels[0].innerText) ||
dependencyField.name;
return hyva.strf('Cette\u0020valeur\u0020doit\u0020\u00EAtre\u0020identique\u0020au\u0020champ\u0020\u0022\u00250\u0022.', dependencyFieldName);
}
return true;
}
};
function raceSome(promises, pred) {
return new Promise((resolve, reject) => {
if (promises.length === 0) {
return resolve();
}
let settled = false, nDone = 0;
const resolveIf = v => {
if (!settled && (pred(v) || ++nDone === promises.length)) {
settled = true;
resolve(v);
}
return v;
}
promises.map(promise => {
promise.then(resolveIf).catch(reason => {
settled = true;
reject(reason)
});
return promise;
});
});
}
const INPUT_ATTRIBUTE_RULES = {min: 'min', max: 'max', required: 'required', minlength: 'minlength', maxlength: 'maxlength', step: 'step', pattern: 'pattern'}
const INPUT_TYPE_RULES = {email: 'email'}
function getRules(element) {
let rules = {};
Object.keys(INPUT_ATTRIBUTE_RULES).forEach(attrName => {
if (element.hasAttribute(attrName)) {
rules[INPUT_ATTRIBUTE_RULES[attrName]] = element.getAttribute(attrName);
}
})
if (INPUT_TYPE_RULES[element.type]) {
rules[INPUT_TYPE_RULES[element.type]] = true;
}
if (element.dataset.validate) {
try {
Object.assign(rules, JSON.parse(element.dataset.validate));
} catch (error) {
console.error('Validator error. Cannot parse data-validate attribute of element:\n', element);
}
}
return rules;
}
function isInvalidRuleResult(ruleState) {
return typeof ruleState === 'string' || !ruleState || (ruleState.type && ruleState.content);
}
async function runValidateFn(rule, options, value, field) {
return formValidationRules[rule](value, options, field, this);
}
function generateId() {
let id;
do {
id = `${this.idPrefix}-${++this.idSeq}`;
} while (document.getElementById(id));
return id;
}
function isVisible(element) {
const el = element.type !== 'hidden' ? element : (element.parentElement || {});
return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length)
}
function elementWillValidate(element) {
return (element.willValidate || element.type === 'hidden')
&& element.tagName !== 'BUTTON'
&& element.disabled === false
&& !(element.tagName === 'INPUT' && element.type === 'submit')
&& (element.hasAttribute('data-validate-hidden') || isVisible(element))
}
function createMessageContainer(el, fieldWrapperClassName) {
if (! el.parentElement) {
return;
}
const refocus = document.activeElement === el;
const wrapper = document.createElement('div');
wrapper.classList.add.apply(wrapper.classList, fieldWrapperClassName.split(' '));
el.parentElement.insertBefore(wrapper, el);
wrapper.appendChild(el);
refocus && document.activeElement !== el && el.focus();
return wrapper;
}
function containerNotFound(selector, el) {
const msg = `Cannot find message container element ${selector} of ${el.name}`;
console.error(msg, el);
throw msg;
}
function createTextInputFrom(el) {
const text = document.createElement('INPUT');
text.type = 'text';
text.value = el.value;
return text;
}
function classNamesToSelector(classNames) {
return classNames.split(' ')
.filter(className => className.length > 0)
.map(className => `.${className}`)
.join('')
}
function hasMessagesWrapper(field, messagesWrapperClassName) {
return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName));
}
function getMessagesWrapper(field, messagesWrapperClassName) {
if (hasMessagesWrapper.call(this, field, messagesWrapperClassName)) {
return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName));
}
const msgWrapper = document.createElement('ul');
const msgId = generateId.call(this);
msgWrapper.id = msgId;
field.element.setAttribute('aria-errormessage', msgId);
field.element.setAttribute('aria-describedby', msgId);
msgWrapper.classList.add.apply(msgWrapper.classList, messagesWrapperClassName.split(' '));
if (field.validateOnChange) {
msgWrapper.setAttribute('aria-live', 'polite');
}
this.getMessageContainer(field).appendChild(msgWrapper);
return msgWrapper;
}
function getCheckedValues(field) {
const name = field.element.name.replace(/([\\"])/g, '\\$1');
const elements = field.element.form.querySelectorAll('input[name="' + name + '"]:checked');
return Array.from(elements).map(el => el.value);
}
function escapeHtml(s) {
const div = document.createElement('div')
div.innerText = s;
return div.innerHTML;
}
function formValidationAjax(form, options = {}) {
const instance = hyva.formValidation(form, options);
// Override pour ne jamais créer de container autour de l'input
instance.getMessagesWrapper = function(field, messagesClassName) {
const container = field.element.parentElement; // on prend juste le parent
let msgWrapper = container.querySelector(`.${messagesClassName}`);
if (!msgWrapper) {
msgWrapper = document.createElement('ul');
msgWrapper.classList.add(messagesClassName);
container.appendChild(msgWrapper);
}
return msgWrapper;
}
return instance;
}
function formValidation(form, options = {}) {
const formElement = form || this.$el;
if (formElement.dataset && formElement.dataset.options) {
try {
options = Object.assign(options, JSON.parse(formElement.dataset.options || '{}'));
} catch (e) {
throw new Error('Cannot read the form options from the data-options attribute: not valid JSON');
}
}
// Disable browser default validation
if (formElement.tagName === 'FORM') {
formElement.setAttribute('novalidate', '');
} else {
console.error('formValidation can be initialized only on FORM element', formElement);
return;
}
options = Object.assign({
fieldWrapperClassName: 'field field-reserved',
messagesWrapperClassName: 'messages',
validClassName: 'field-success',
invalidClassName: 'field-error',
pageMessagesWrapperSelector: null,
scrollToFirstError: true,
}, options || {});
return {
state: {
valid: false,
},
fields: {},
idSeq: 0,
idPrefix: formElement.id || 'vld-msg',
setupFields(elements) {
this.fields = {};
Array.from(elements).forEach(element => {
if (elementWillValidate(element)) {
this.setupField(element);
}
});
},
setupField(element) {
if (! element) return;
const onChange = !!element.dataset.onChange;
if (elementWillValidate(element)) {
const rules = getRules(element);
if (Object.keys(rules).length > 0) {
if (this.fields[element.name]) {
Object.assign(this.fields[element.name].rules, rules);
} else {
this.fields[element.name] = {
element,
rules: rules,
validateOnChange: onChange,
state: {
valid: null,
rules: {}
}
}
}
}
} else {
console.error('Element will not validate', element);
}
},
onSubmit(event) {
if (event.target.tagName === 'FORM') {
event.preventDefault();
this.validate()
.then(() => event.target.submit())
.catch(invalidElements => {});
}
},
onChange(event) {
event.target.dataset.onChange = 'true';
if (!Object.keys(this.fields).length) {
this.setupFields(formElement.elements);
}
if (!Object.keys(this.fields).includes(event.target.name)) {
this.setupField(event.target);
}
const field = this.fields[event.target.name];
this.validateField(field);
field && field.element.removeAttribute('data-on-change')
},
validateSafe() {
return new Promise(resolve => this.validate().then(() => resolve(true)).catch(() => {}))
},
validate() {
if (!Object.keys(this.fields).length || !Object.keys(this.fields).length !== formElement.elements.length) {
this.setupFields(formElement.elements);
}
return new Promise(async (resolve, reject) => {
if (formElement.elements) {
await raceSome(this.validateFields(), result => result !== true)
const invalidFields = Object.values(this.fields).filter(field => !field.state.valid);
this.state.valid = invalidFields.length === 0;
if (this.state.valid) {
resolve();
} else {
if (options.scrollToFirstError && invalidFields.length > 0) {
invalidFields[0].element.focus()
invalidFields[0].element.select && invalidFields[0].element.select();
}
reject(invalidFields.map(field => field.element));
}
}
});
},
validateFields() {
const fields = Object.values(this.fields);
fields.forEach(field => {
this.getMessageContainer(field).classList.remove(options.validClassName, options.invalidClassName)
});
return fields.map(field => this.validateField(field))
},
validateField(field) {
if (! field || ! elementWillValidate(field.element)) {
return new Promise(resolve => resolve(true))
}
let value;
if (field.element.type === 'checkbox') {
value = getCheckedValues(field);
} else if (field.element.type === 'radio') {
value = getCheckedValues(field)[0] || undefined;
} else if (field.element.tagName === 'SELECT' && field.element.multiple) {
value = Array.from(field.element.selectedOptions).map(opt => opt.value);
} else {
value = field.element.value;
}
const rules = field.rules || {};
field.state.valid = true;
this.showFieldState(field);
const fieldValidations = Object.keys(rules).filter(rule => formValidationRules[rule]).map(async rule => {
return runValidateFn.call(this, rule, rules[rule], value, field).then(result => {
field.state.rules[rule] = result;
return result;
})
});
return new Promise(resolve => {
Promise.all(fieldValidations).then(results => {
field.state.valid = !elementWillValidate(field.element) || rules.length === 0 || !results.some(isInvalidRuleResult)
this.showFieldState(field);
resolve(field.state.valid);
})
});
},
getMessagesByField(field) {
const messages = [];
const invalidRules = Object.keys(field.state.rules).filter(rule => isInvalidRuleResult(field.state.rules[rule]));
field.rules && Object.keys(field.rules).forEach((rule) => {
if (invalidRules.includes(rule)) {
const customMessage = field.element.getAttribute('data-msg-' + rule);
const message = customMessage ? customMessage : field.state.rules[rule];
const ruleOptions = JSON.parse(JSON.stringify(field.rules[rule]));
if (typeof message === 'undefined' || message === null || (typeof message !== 'string' && ! message.type)) {
messages.push(hyva.strf('Validation rule "%0" failed.', rule));
} else if (Array.isArray(ruleOptions)) {
ruleOptions.unshift(message.type ? message.content : message);
const content = hyva.strf.apply(null, ruleOptions);
messages.push(message.type ? {type: message.type, content} : content);
} else {
const content = hyva.strf(message.type ? message.content : message, ruleOptions)
messages.push(message.type ? {type: message.type, content} : content);
}
}
});
return messages;
},
/** @deprecated */
getFieldWrapper(field) {
return this.getMessageContainer(field)
},
getMessageContainer(field) {
let container;
const pageSelector = field.element.getAttribute('data-validation-container') || options.pageMessagesContainerSelector;
if (pageSelector) {
container = document.querySelector(pageSelector)
|| containerNotFound(pageSelector, field.element)
} else {
const containerSelector = classNamesToSelector(options.fieldWrapperClassName);
container = field.element.closest(containerSelector)
|| createMessageContainer(field.element, options.fieldWrapperClassName)
|| containerNotFound(containerSelector, field.element);
}
return container;
},
showFieldState(field) {
const container = this.getMessageContainer(field),
hasErrorMessages = hasMessagesWrapper.call(this, field, options.messagesWrapperClassName),
messages = this.getMessagesByField(field).map(m => {
return m.type !== 'html' ? escapeHtml(m.type ? m.content : m) : m.content;
});
container.classList.toggle(options.validClassName, field.state.valid && ! hasErrorMessages);
container.classList.toggle(options.invalidClassName, !field.state.valid || hasErrorMessages);
this.createHtmlErrorMessage(field, messages);
if (field.state.valid) {
field.element.removeAttribute('aria-invalid');
} else {
field.element.setAttribute('aria-invalid', 'true');
if (! document.activeElement) {
field.element.focus();
}
}
},
removeMessages(field, messagesClass) {
if (! hasMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName)) {
return;
}
const msgWrapper = getMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName);
const messages = msgWrapper.querySelectorAll(`[data-msg-field='${field.element.name}']`);
Array.from(messages).forEach(msg => msg.remove());
if (msgWrapper && msgWrapper.childElementCount === 0) {
field.element.removeAttribute('aria-errormessage');
field.element.removeAttribute('aria-describedby');
msgWrapper.remove();
}
},
createErrorMessage(field, messages) {
const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml)
this.createHtmlErrorMessage(field, htmlMessages);
},
createHtmlErrorMessage(field, messages) {
this.removeMessages(field, options.messagesWrapperClassName);
field.element.removeAttribute('aria-errormessage');
field.element.removeAttribute('aria-describedby');
if (!field.state.valid) {
const msgWrapper = this.addHtmlMessages(field, options.messagesWrapperClassName, messages);
field.element.setAttribute('aria-errormessage', msgWrapper.id);
field.element.setAttribute('aria-describedby', msgWrapper.id);
}
},
/** @deprecated */
createMessage(field, message) {
return this.addMessages(field, options.messagesWrapperClassName, message);
},
addMessages(field, messagesClass, messages) {
const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml)
return this.addHtmlMessages(field, messagesClass, htmlMessages);
},
addHtmlMessages(field, messagesClass, htmlMessages) {
const msgWrapper = getMessagesWrapper.call(this, field, messagesClass);
(Array.isArray(htmlMessages) ? htmlMessages : [htmlMessages]).forEach((htmlMessage) => {
const li = document.createElement('li');
li.innerHTML = htmlMessage;
li.setAttribute('data-msg-field', field.element.name);
msgWrapper.appendChild(li);
});
return msgWrapper;
},
setField(name, value) {
this.fields[name].element.value = value;
this.fields[name].element.dispatchEvent((new Event('input')));
this.validateField(this.fields[name]);
}
}
}
hyva.formValidation = formValidation;
hyva.formValidationAjax = formValidationAjax;
hyva.formValidation.rules = formValidationRules;
hyva.formValidation.setInputAttributeRuleName = (attrName, ruleName) => INPUT_ATTRIBUTE_RULES[attrName] = ruleName || attrName;
hyva.formValidation.setInputTypeRuleName = (typeName, ruleName) => INPUT_TYPE_RULES[typeName] = ruleName || typeName;
hyva.formValidation.addRule = (name, validator) => formValidationRules[name] = validator;
hyva.formValidation.addRule(
'validate-custom-nif',
(v) => {
if (!v || v.length === 0) {
return true;
}
let msg = 'Veuillez\u0020saisir\u0020jusqu\u2019\u00E0\u00209\u0020caract\u00E8res\u0020alphanum\u00E9riques.';
return /^[a-zA-Z0-9]{1,9}$/.test(v) ? true : msg;
}
);
}(window.hyva = window.hyva || {}));
window.addEventListener('alpine:init', () => {
Alpine.data('hyva.formValidation', hyva.formValidation);
Alpine.data('hyva.formValidation($el)', hyva.formValidation);
}, {once: true});
</script>
<div class="page-wrapper"><header class="page-header"><div class="header-message dynamic-bg-color py-2 px-5 text-white text-13"><style>#html-body [data-pb-style=BHYHUC6]{text-align:center;border-style:none}</style><div class="text-white" data-content-type="html" data-appearance="default" data-element="main" data-pb-style="BHYHUC6" data-decoded="true">Découvrez notre <a href="https://www.avril-beaute.fr/calendrier-de-l-avent-2026-24-jours-pour-bien-etre-soi-2325.html" style="text-decoration: underline; color: inherit;">calendrier de l'Avent</a> dans son coffret réutilisable</div></div><a class="action skip sr-only focus:not-sr-only focus:absolute focus:z-40 focus:bg-white contentarea"
href="#contentarea">
<span>
Allez au contenu </span>
</a>
<script>
function initHeader() {
return {
searchOpen: false,
cart: {},
isCartOpen: false,
header: document.querySelector('header'),
headerMessage: document.querySelector('.header-message'),
logoFix: document.querySelectorAll('.fixed-logo'),
logoSticky: document.querySelectorAll('.sticky-logo'),
bindDropdownHover() {
document.querySelectorAll('li.dropdown > ul').forEach(ul => {
const li = ul.closest('li.dropdown');
li.addEventListener('mouseenter', () => {
this.header.classList.add('dropdown-hover')
});
li.addEventListener('mouseleave', () => {
this.header.classList.remove('dropdown-hover')
});
})
},
getData(data) {
if (data.cart) {
this.cart = data.cart
}
},
isCartEmpty() {
return !this.cart.summary_count
},
toggleHeaderFixed() {
const isScrolled = window.scrollY > 0;
this.header.classList.toggle("fixed-header", isScrolled);
this.logoFix.forEach(el => {
el.classList.toggle("hidden", isScrolled);
});
this.logoSticky.forEach(el => {
el.classList.toggle("hidden", !isScrolled);
});
if (this.headerMessage) {
this.headerMessage.classList.toggle("hidden", isScrolled);
}
},
toggleCart(event) {
if (event.detail && event.detail.isOpen !== undefined) {
this.isCartOpen = event.detail.isOpen
if (!this.isCartOpen && this.$refs && this.$refs.cartButton) {
this.$refs.cartButton.focus()
}
} else {
this.isCartOpen = true
}
}
}
}
function initCompareHeader() {
return {
compareProducts: null,
itemCount: 0,
receiveCompareData(data) {
if (data['compare-products']) {
this.compareProducts = data['compare-products'];
this.itemCount = this.compareProducts.count;
}
}
}
}
</script>
<div id="header"
class="z-30 w-full bg-transparent relative"
x-data="initHeader()"
x-init="toggleHeaderFixed(); bindDropdownHover()"
@scroll.window="toggleHeaderFixed()"
@private-content-loaded.window="getData(event.detail.data)"
@search-close.window=" searchOpen = false; $refs.searchButton && $refs.searchButton.focus(); "
>
<div class="container flex items-center justify-between w-full p-3 md:px-6 mx-auto mt-0">
<!--Logo (we define z-20 here to let it go on top of our megamenu) -->
<div class="z-20 hidden lg:block">
<div class="fixed-logo order-2 lg:order-1 w-auto">
<a
class="flex items-center justify-center text-xl font-medium tracking-wide text-gray-800 no-underline hover:no-underline font-title w-[60px] h-[52px] md:w-[78px] md:h-[68px] mx-auto"
href="https://www.avril-beaute.fr/"
aria-label="Go to Home page"
>
<img
src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/svg/logo.svg"
alt="Avril"
width="78" height="68" loading="eager"
/>
</a>
</div>
<div class="sticky-logo hidden order-2 lg:order-1 w-auto">
<a
class="flex items-center justify-center text-xl font-medium tracking-wide text-gray-800 no-underline hover:no-underline font-title w-[30px] h-[30px] mx-auto"
href="https://www.avril-beaute.fr/"
aria-label="Go to Home page"
>
<img
src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/svg/logo-floral.svg"
alt="Avril"
width="30"
height="30"
loading="eager"
/>
</a>
</div>
</div>
<!--Main Navigation-->
<div class="block order-3 lg:hidden lg:order-0">
<div class="fixed-logo order-2 lg:order-1 w-auto">
<a
class="flex items-center justify-center text-xl font-medium tracking-wide text-gray-800 no-underline hover:no-underline font-title w-[60px] h-[52px] md:w-[78px] md:h-[68px] mx-auto"
href="https://www.avril-beaute.fr/"
aria-label="Go to Home page"
>
<img
src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/svg/logo.svg"
alt="Avril"
width="78" height="68" loading="eager"
/>
</a>
</div>
<div class="sticky-logo hidden order-2 lg:order-1 w-auto">
<a
class="flex items-center justify-center text-xl font-medium tracking-wide text-gray-800 no-underline hover:no-underline font-title w-[30px] h-[30px] mx-auto"
href="https://www.avril-beaute.fr/"
aria-label="Go to Home page"
>
<img
src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/svg/logo-floral.svg"
alt="Avril"
width="30"
height="30"
loading="eager"
/>
</a>
</div>
</div>
<div class="flex items-center gap-2">
<div class="section-item-content nav-sections-item-content w-full lg:block !mb-0 mt-0 hidden order-2" x-cloak>
<div class="menu-container horizontal-menu">
<div data-action="navigation" class="bg-inherit menu avril left" x-cloak>
<div x-data="primaryMenu()" x-init="init()" class="w-full" x-cloak>
<ul class="!static md-top-menu-items flex items-center justify-center"><li class="product-menu dropdown menu-dropdown-icon category-item nav-1019"> <a class="relative" href="https://www.avril-beaute.fr/soin.html" > <span class="megaitemicons"></span> Soin <span class="block w-8 h-8 absolute top-1/2 right-2 -translate-y-1/2 md:hidden"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg> </span> </a> <ul class="w-full bg-white shadow-lg justify-center transition-all duration-300 ease-in-out"> <li> <ul class="column2 container flex"> <li class="mega-static-block menu-content col-menu-9"> <ul class="column4 child-level-1"><li class=category-item nav-1019-20 "><a href="https://www.avril-beaute.fr/soin/visage.html" >Visage</a><ul class="child-level-2"><li class=category-item nav-1019-22 "><a href="https://www.avril-beaute.fr/soin/visage/soin-visage.html" >Crème</a></li><li class=category-item nav-1019-98 "><a href="https://www.avril-beaute.fr/soin/visage/serum-visage.html" >Sérum</a></li><li class=category-item nav-1019-23 "><a href="https://www.avril-beaute.fr/soin/visage/masque-visage.html" >Masque & gommage</a></li><li class=category-item nav-1019-21 "><a href="https://www.avril-beaute.fr/soin/visage/nettoyant.html" >Nettoyant</a></li><li class=category-item nav-1019-433 "><a href="https://www.avril-beaute.fr/soin/visage/demaquillant.html" >Démaquillant</a></li><li class=category-item nav-1019-440 "><a href="https://www.avril-beaute.fr/soin/visage/soin-des-levres.html" >Soin des lèvres</a></li><li class=category-item nav-1019-441 "><a href="https://www.avril-beaute.fr/soin/visage/huiles-eaux-florales.html" >Huile & eau florale</a></li></ul></li><li class=category-item nav-1019-24 "><a href="https://www.avril-beaute.fr/soin/corps-et-douche.html" >Corps & douche</a><ul class="child-level-2"><li class=category-item nav-1019-25 "><a href="https://www.avril-beaute.fr/soin/corps-et-douche/soin-corps.html" >Soin corps</a></li><li class=category-item nav-1019-26 "><a href="https://www.avril-beaute.fr/soin/corps-et-douche/savons-gel-douche.html" >Savon & gel douche</a></li><li class=category-item nav-1019-27 "><a href="https://www.avril-beaute.fr/soin/corps-et-douche/deodorant.html" >Déodorant</a></li><li class=category-item nav-1019-28 "><a href="https://www.avril-beaute.fr/soin/corps-et-douche/dentifrices.html" >Dentifrice</a></li><li class=category-item nav-1019-29 "><a href="https://www.avril-beaute.fr/soin/corps-et-douche/accessoires.html" >Accessoires</a></li></ul></li><li class=category-item nav-1019-30 "><a href="https://www.avril-beaute.fr/soin/cheveux.html" >Cheveux</a><ul class="child-level-2"><li class=category-item nav-1019-31 "><a href="https://www.avril-beaute.fr/soin/cheveux/shampooings-apres-shampooing.html" >Shampooing</a></li><li class=category-item nav-1019-445 "><a href="https://www.avril-beaute.fr/soin/cheveux/apres-shampooing.html" >Après-shampooing</a></li><li class=category-item nav-1019-446 "><a href="https://www.avril-beaute.fr/soin/cheveux/soin-coiffant.html" >Soin & coiffant</a></li><li class=category-item nav-1019-410 "><a href="https://www.avril-beaute.fr/soin/cheveux/cheveux.html" >Par préoccupation</a></li></ul></li><li class=category-item nav-1019-309 "><a href="https://www.avril-beaute.fr/soin/accessoires.html" >Accessoires</a><ul class="child-level-2"><li class=category-item nav-1019-442 "><a href="https://www.avril-beaute.fr/soin/accessoires/gants-eponges.html" >Gants & éponges</a></li><li class=category-item nav-1019-443 "><a href="https://www.avril-beaute.fr/soin/accessoires/trousses-contenants.html" >Trousses & contenants</a></li><li class=category-item nav-1019-444 "><a href="https://www.avril-beaute.fr/soin/accessoires/autres-contenants.html" >Autres accessoires</a></li></ul></li></ul> </li> <li class="mega-static-block menu-sidebar-right"><ul><li><style>#html-body [data-pb-style=C5A1YVN]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;align-self:stretch}#html-body [data-pb-style=PR6VNIN]{display:flex;width:100%}#html-body [data-pb-style=FY3H93H],#html-body [data-pb-style=HWU0KLB]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;text-align:center;width:50%;align-self:stretch}#html-body [data-pb-style=FY3H93H]{text-align:left}#html-body [data-pb-style=BGQSIBW]{border-style:none}#html-body [data-pb-style=J5OBEEG],#html-body [data-pb-style=MC7KHKN]{max-width:100%;height:auto}@media only screen and (max-width: 768px) { #html-body [data-pb-style=BGQSIBW]{border-style:none} }</style><div class="pagebuilder-column-group border-r border-l-2 border-gray-300" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-background-lazy-load="false" data-element="main" data-pb-style="C5A1YVN"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="PR6VNIN"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="HWU0KLB"><div class="category-item-link" data-content-type="text" data-appearance="default" data-element="main"><p>Sélection</p></div><div class="megamenu-cms-list-items-wrapper" data-content-type="text" data-appearance="default" data-element="main"><ul> <li> <p><a tabindex="0" href="/nouveau/nouveautes-soin.html">Nouveautés</a></p> </li> <li> <p><a tabindex="0" href="/selections-avril/best-sellers-soin-bio-avril-hiver-2024-2025.html">Meilleures ventes</a></p> </li> <li> <p><a tabindex="0" href="/selections-avril/produits-a-reconstituer.html">Soin rechargeable</a></p> </li> <li> <p><a tabindex="0" href="/selections-avril/vegan/soin-vegan.html">Végan</a></p> </li> <li> <p><a tabindex="0" href="/zero-gaspi/soin-zero-gaspi.html">Zéro gaspi</a></p> </li> </ul></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="FY3H93H"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="BGQSIBW"><a href="https://www.avril-beaute.fr/soin/visage/soin-visage/anti-age.html" target="" data-link-type="default" title="" data-element="link"><img class="pagebuilder-mobile-hidden" src="https://avril.twic.pics/media/wysiwyg/encart_cest_nouveau_copie______1.jpg" alt="" title="" loading="lazy" data-use-native-image-dimensions="false" width="200" height="200" data-element="desktop_image" data-pb-style="J5OBEEG"><img class="pagebuilder-mobile-only" src="https://avril.twic.pics/media/wysiwyg/encart_cest_nouveau_copie______1.jpg" alt="" title="" loading="lazy" data-use-native-image-dimensions="false" width="200" height="200" data-element="mobile_image" data-pb-style="MC7KHKN"></a></figure><div class="megamenu-cms-box-content" data-content-type="text" data-appearance="default" data-element="main"><p class="mt-4"><a tabindex="0" href="https://www.avril-beaute.fr/soin/visage/soin-visage/anti-age.html">Gamme PRO AGE +</a></p> <p class="mb-4">Notre réponse aux peaux matures</p> <p id="J5XF472"><a tabindex="0" href="https://www.avril-beaute.fr/soin/visage/soin-visage/anti-age.html"><span class="underline">Découvrir</span> -></a></p></div></div></div></div></li></ul></li> </ul> </li> </ul> </li><li class="product-menu dropdown menu-dropdown-icon category-item nav-1020"> <a class="relative" href="https://www.avril-beaute.fr/maquillage.html" > <span class="megaitemicons"></span> Maquillage <span class="block w-8 h-8 absolute top-1/2 right-2 -translate-y-1/2 md:hidden"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg> </span> </a> <ul class="w-full bg-white shadow-lg justify-center transition-all duration-300 ease-in-out"> <li> <ul class="column2 container flex"> <li class="mega-static-block menu-content col-menu-9"> <ul class="column4 child-level-1"><li class=category-item nav-1020-14 "><a href="https://www.avril-beaute.fr/maquillage/maquillage.html" >Maquillage </a><ul class="child-level-2"><li class=category-item nav-1020-6 "><a href="https://www.avril-beaute.fr/maquillage/maquillage/teint.html" >Teint</a></li><li class=category-item nav-1020-4 "><a href="https://www.avril-beaute.fr/maquillage/maquillage/yeux.html" >Yeux</a></li><li class=category-item nav-1020-7 "><a href="https://www.avril-beaute.fr/maquillage/maquillage/levres.html" >Lèvres</a></li><li class=category-item nav-1020-8 "><a href="https://www.avril-beaute.fr/maquillage/maquillage/ongles.html" >Ongles</a></li><li class=category-item nav-1020-9 "><a href="https://www.avril-beaute.fr/maquillage/maquillage/palettes-de-maquillage.html" >Palettes de maquillage</a></li></ul></li><li class=category-item nav-1020-15 "><a href="https://www.avril-beaute.fr/maquillage/demaquillant.html" >Préparation & démaquillage</a><ul class="child-level-2"><li class=category-item nav-1020-424 "><a href="https://www.avril-beaute.fr/maquillage/demaquillant/base-fixateur.html" >Base & fixateur</a></li><li class=category-item nav-1020-425 "><a href="https://www.avril-beaute.fr/maquillage/demaquillant/nettoyant.html" >Nettoyant</a></li><li class=category-item nav-1020-16 "><a href="https://www.avril-beaute.fr/maquillage/demaquillant/demaquillant.html" >Démaquillant</a></li></ul></li><li class=category-item nav-1020-10 "><a href="https://www.avril-beaute.fr/maquillage/pinceaux.html" >Accessoires</a><ul class="child-level-2"><li class=category-item nav-1020-422 "><a href="https://www.avril-beaute.fr/maquillage/pinceaux/pinceaux.html" >Pinceaux</a></li><li class=category-item nav-1020-419 "><a href="https://www.avril-beaute.fr/maquillage/pinceaux/houppettes-blender.html" >Houppettes & blenders</a></li><li class=category-item nav-1020-420 "><a href="https://www.avril-beaute.fr/maquillage/pinceaux/gants-eponges.html" >Gants & éponges </a></li><li class=category-item nav-1020-421 "><a href="https://www.avril-beaute.fr/maquillage/pinceaux/accessoires-pour-les-ongles.html" >Accessoires pour les ongles </a></li><li class=category-item nav-1020-423 "><a href="https://www.avril-beaute.fr/maquillage/pinceaux/trousses-contenants.html" >Trousses & contenants </a></li></ul></li></ul> </li> <li class="mega-static-block menu-sidebar-right"><ul><li><style>#html-body [data-pb-style=PS6P00M]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;align-self:stretch}#html-body [data-pb-style=JAO6M6D]{display:flex;width:100%}#html-body [data-pb-style=J0EA5HO],#html-body [data-pb-style=VXEB4OS]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;text-align:center;width:50%;align-self:stretch}#html-body [data-pb-style=J0EA5HO]{text-align:left}#html-body [data-pb-style=STOP6LD]{border-style:none}#html-body [data-pb-style=LQLYW6J],#html-body [data-pb-style=RE3XLSL]{max-width:100%;height:auto}@media only screen and (max-width: 767px) { #html-body [data-pb-style=STOP6LD]{border-style:none} }</style><div class="pagebuilder-column-group border-r border-l-2 border-gray-300" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-background-lazy-load="false" data-element="main" data-pb-style="PS6P00M"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="JAO6M6D"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="VXEB4OS"><div class="category-item-link" data-content-type="text" data-appearance="default" data-element="main"><p>Sélection</p></div><div class="megamenu-cms-list-items-wrapper" data-content-type="text" data-appearance="default" data-element="main"><ul> <li> <p><a tabindex="0" href="/nouveau/nouveautes-maquillage.html">Nouveautés</a></p> </li> <li> <p><a tabindex="0" href="/selections-avril/best-sellers-maquillage-bio-avril-hiver-2024-2025.html">Meilleures ventes</a></p> </li> <li> <p><a href="https://www.avril-beaute.fr/selections-avril/vegan/maquillage-vegan.html">Végan</a></p> </li> <li> <p><a tabindex="0" href="/zero-gaspi/maquillage-zero-gaspi.html">Zéro gaspi</a></p> </li> </ul></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="J0EA5HO"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="STOP6LD"><a href="/rdv-make-up-soft-glam" target="" data-link-type="default" title="" data-element="link"><img class="pagebuilder-mobile-hidden" src="https://avril.twic.pics/media/wysiwyg/092a76f2-c6ad-407f-89d0-aba010a1a938.jpg" alt="" title="" width="200" height="200" loading="lazy" data-use-native-image-dimensions="false" data-element="desktop_image" data-pb-style="LQLYW6J"><img class="pagebuilder-mobile-only" src="https://avril.twic.pics/media/wysiwyg/092a76f2-c6ad-407f-89d0-aba010a1a938.jpg" alt="" title="" width="200" height="200" loading="lazy" data-use-native-image-dimensions="false" data-element="mobile_image" data-pb-style="RE3XLSL"></a></figure><div class="megamenu-cms-box-content" data-content-type="text" data-appearance="default" data-element="main"><p class="mt-4"><a href="/rdv-make-up-soft-glam">RDV make-up soft glam</a></p> <p id="L9YTDQR" class="mb-4">Naturel & sophistiqué</p> <p id="J5XF472"><a href="/rdv-make-up-soft-glam"><span class="underline">Découvrir</span> →</a></p></div></div></div></div></li></ul></li> </ul> </li> </ul> </li><li class="product-menu dropdown menu-dropdown-icon category-item nav-1021"> <a class="relative" href="https://www.avril-beaute.fr/homme.html" > <span class="megaitemicons"></span> Homme <span class="block w-8 h-8 absolute top-1/2 right-2 -translate-y-1/2 md:hidden"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg> </span> </a> <ul class="w-full bg-white shadow-lg justify-center transition-all duration-300 ease-in-out"> <li> <ul class="column2 container flex"> <li class="mega-static-block menu-content col-menu-9"> <ul class="column4 child-level-1"><li class=category-item nav-1021-151 "><a href="https://www.avril-beaute.fr/homme/soin-visage-et-rasage.html" >Soin visage et rasage</a><ul class="child-level-2"><li class=category-item nav-1021-157 "><a href="https://www.avril-beaute.fr/homme/soin-visage-et-rasage/soin-visage.html" >Soin visage</a></li><li class=category-item nav-1021-152 "><a href="https://www.avril-beaute.fr/homme/soin-visage-et-rasage/rasage.html" >Rasage</a></li><li class=category-item nav-1021-161 "><a href="https://www.avril-beaute.fr/homme/soin-visage-et-rasage/nettoyant-visage.html" >Nettoyant visage</a></li><li class=category-item nav-1021-312 "><a href="https://www.avril-beaute.fr/homme/soin-visage-et-rasage/accessoires.html" >Accessoires</a></li></ul></li><li class=category-item nav-1021-166 "><a href="https://www.avril-beaute.fr/homme/corps-et-douche.html" >Corps et douche</a><ul class="child-level-2"><li class=category-item nav-1021-167 "><a href="https://www.avril-beaute.fr/homme/corps-et-douche/soin-corps.html" >Soin & gommage</a></li><li class=category-item nav-1021-231 "><a href="https://www.avril-beaute.fr/homme/corps-et-douche/savon-gel-douche.html" >Savon & gel douche</a></li><li class=category-item nav-1021-232 "><a href="https://www.avril-beaute.fr/homme/corps-et-douche/deodorant.html" >Déodorant</a></li><li class=category-item nav-1021-233 "><a href="https://www.avril-beaute.fr/homme/corps-et-douche/dentifrice.html" >Dentifrice</a></li><li class=category-item nav-1021-173 "><a href="https://www.avril-beaute.fr/homme/corps-et-douche/accessoires.html" >Accessoires</a></li></ul></li><li class=category-item nav-1021-180 "><a href="https://www.avril-beaute.fr/homme/cheveux.html" >Cheveux</a><ul class="child-level-2"><li class=category-item nav-1021-234 "><a href="https://www.avril-beaute.fr/homme/cheveux/shampooing-et-apres-shampooing.html" >Shampooing et après shampooing</a></li><li class=category-item nav-1021-181 "><a href="https://www.avril-beaute.fr/homme/cheveux/soins-et-produits-coiffants.html" >Soin et produit coiffant</a></li><li class=category-item nav-1021-188 "><a href="https://www.avril-beaute.fr/homme/cheveux/accessoires.html" >Accessoires</a></li></ul></li></ul> </li> <li class="mega-static-block menu-sidebar-right"><ul><li><style>#html-body [data-pb-style=OEID26D]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;align-self:stretch}#html-body [data-pb-style=A0SN62B]{display:flex;width:100%}#html-body [data-pb-style=JN2Q2UV],#html-body [data-pb-style=TS6JT8B]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;text-align:center;width:50%;align-self:stretch}#html-body [data-pb-style=JN2Q2UV]{text-align:left}#html-body [data-pb-style=TRD9G6M]{border-style:none}#html-body [data-pb-style=A34N2SU],#html-body [data-pb-style=AVL4N4U]{max-width:100%;height:auto}@media only screen and (max-width: 768px) { #html-body [data-pb-style=TRD9G6M]{border-style:none} }</style><div class="pagebuilder-column-group border-r border-l-2 border-gray-300" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-background-lazy-load="false" data-element="main" data-pb-style="OEID26D"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="A0SN62B"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="TS6JT8B"><div class="category-item-link" data-content-type="text" data-appearance="default" data-element="main"><p>Sélection</p></div><div class="megamenu-cms-list-items-wrapper" data-content-type="text" data-appearance="default" data-element="main"><ul> <li> <p><a tabindex="0" href="https://www.avril-beaute.fr/selections-avril/vegan/soin-vegan-pour-homme.html">Vegan</a></p> </li> </ul></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="JN2Q2UV"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="TRD9G6M"><a href="https://www.avril-beaute.fr/homme/soin-visage-et-rasage.html" target="" data-link-type="default" title="" data-element="link"><img class="pagebuilder-mobile-hidden" src="https://avril.twic.pics/media/wysiwyg/rasage.jpg" alt="" title="" loading="lazy" data-use-native-image-dimensions="false" width="200" height="200" data-element="desktop_image" data-pb-style="A34N2SU"><img class="pagebuilder-mobile-only" src="https://avril.twic.pics/media/wysiwyg/rasage.jpg" alt="" title="" loading="lazy" data-use-native-image-dimensions="false" width="200" height="200" data-element="mobile_image" data-pb-style="AVL4N4U"></a></figure><div class="megamenu-cms-box-content" data-content-type="text" data-appearance="default" data-element="main"><p class="mt-4"><a tabindex="0" href="https://www.avril-beaute.fr/homme/soin-visage-et-rasage.html">Gamme rasage</a></p> <p class="mb-4">Un rasage efficace en douceur</p> <p id="J5XF472"><a tabindex="0" href="https://www.avril-beaute.fr/homme/soin-visage-et-rasage.html"><span class="underline">Découvrir</span> -></a></p></div></div></div></div></li></ul></li> </ul> </li> </ul> </li><li class="product-menu dropdown menu-dropdown-icon category-item nav-1022"> <a class="relative" href="https://www.avril-beaute.fr/bebe.html" > <span class="megaitemicons"></span> Famille <span class="block w-8 h-8 absolute top-1/2 right-2 -translate-y-1/2 md:hidden"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg> </span> </a> <ul class="w-full bg-white shadow-lg justify-center transition-all duration-300 ease-in-out"> <li> <ul class="column2 container flex"> <li class="mega-static-block menu-content col-menu-9"> <ul class="column4 child-level-1"><li class=category-item nav-1022-387 "><a href="https://www.avril-beaute.fr/bebe/nettoyant.html" >Soin & nettoyant haute tolérance</a></li><li class=category-item nav-1022-397 "><a href="https://www.avril-beaute.fr/bebe/accessoires.html" >Accessoires</a></li></ul> </li> <li class="mega-static-block menu-sidebar-right"><ul><li><style>#html-body [data-pb-style=S8Y2Q88]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;align-self:stretch}#html-body [data-pb-style=JXMBX4M]{display:flex;width:100%}#html-body [data-pb-style=B4KLX6L],#html-body [data-pb-style=YEFQVI9]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;text-align:center;width:41.6667%;align-self:stretch}#html-body [data-pb-style=YEFQVI9]{text-align:left;width:58.3333%}#html-body [data-pb-style=L92NUNO]{border-style:none}#html-body [data-pb-style=MP5YSUO],#html-body [data-pb-style=TBK37WJ]{max-width:100%;height:auto}@media only screen and (max-width: 768px) { #html-body [data-pb-style=L92NUNO]{border-style:none} }</style><div class="pagebuilder-column-group border-r border-l-2 border-gray-300" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-background-lazy-load="false" data-element="main" data-pb-style="S8Y2Q88"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="JXMBX4M"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="B4KLX6L"><div class="category-item-link" data-content-type="text" data-appearance="default" data-element="main"><p><a tabindex="0" href="https://www.avril-beaute.fr/bebe/tout-le-soin-bebe.html">Sélection</a></p></div><div class="megamenu-cms-list-items-wrapper" data-content-type="text" data-appearance="default" data-element="main"><ul> <li> <p><a tabindex="0" href="https://www.avril-beaute.fr/bebe/tout-le-soin-bebe.html">Soin bébé</a></p> </li> </ul></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="YEFQVI9"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="L92NUNO"><a href="https://www.avril-beaute.fr/bebe.html" target="" data-link-type="default" title="" data-element="link"><img class="pagebuilder-mobile-hidden" src="https://avril.twic.pics/media/wysiwyg/gamme_famille_vignette_1.png" alt="" title="" loading="lazy" data-use-native-image-dimensions="false" width="200" height="200" data-element="desktop_image" data-pb-style="TBK37WJ"><img class="pagebuilder-mobile-only" src="https://avril.twic.pics/media/wysiwyg/gamme_famille_vignette_1.png" alt="" title="" loading="lazy" data-use-native-image-dimensions="false" width="200" height="200" data-element="mobile_image" data-pb-style="MP5YSUO"></a></figure><div class="megamenu-cms-box-content" data-content-type="text" data-appearance="default" data-element="main"><p class="mt-4"><a tabindex="0" href="https://www.avril-beaute.fr/bebe.html">Gamme Famille</a></p> <p class="mb-4">Des produits hypoallergéniques pour toute la famille </p> <p id="J5XF472"><a tabindex="0" href="https://www.avril-beaute.fr/bebe.html"><span class="underline">Découvrir</span> -></a></p></div></div></div></div></li></ul></li> </ul> </li> </ul> </li><li class="product-menu dropdown menu-dropdown-icon category-item nav-1023"> <a class="relative" href="https://www.avril-beaute.fr/cadeaux/cadeaux.html" > <span class="megaitemicons"></span> Cadeaux <span class="block w-8 h-8 absolute top-1/2 right-2 -translate-y-1/2 md:hidden"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg> </span> </a> <ul class="w-full bg-white shadow-lg justify-center transition-all duration-300 ease-in-out"> <li> <ul class="column2 container flex"> <li class="mega-static-block menu-content col-menu-9"> <ul class="column4 child-level-1"><li class=category-item nav-1023-217 "><a href="https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux.html" >Coffrets cadeaux</a><ul class="child-level-2"><li class=category-item nav-1023-374 "><a href="https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux/20.html" >Moins de 20€</a></li><li class=category-item nav-1023-375 "><a href="https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux/30.html" >Moins de 30€</a></li><li class=category-item nav-1023-376 "><a href="https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux/40.html" >Moins de 40€</a></li><li class=category-item nav-1023-381 "><a href="https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux/60.html" >Moins de 60€</a></li></ul></li><li class=category-item nav-1023-218 "><a href="https://www.avril-beaute.fr/cadeaux/cadeaux/emballage-cadeau.html" >Emballage cadeau</a></li><li class=category-item nav-1023-219 "><a href="https://www.avril-beaute.fr/cadeaux/cadeaux/carte-cadeau.html" >Carte cadeau</a></li></ul> </li> <li class="mega-static-block menu-sidebar-right"><ul><li><style>#html-body [data-pb-style=EO7TGFQ]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;align-self:stretch}#html-body [data-pb-style=RBT47X0]{display:flex;width:100%}#html-body [data-pb-style=UKV8I82]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;text-align:center;width:50%;align-self:stretch}#html-body [data-pb-style=D3EUVQA],#html-body [data-pb-style=KDG9PPK]{display:none}#html-body [data-pb-style=ROC76GT]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;text-align:left;width:50%;align-self:stretch}#html-body [data-pb-style=O3UAX2Q]{border-style:none}#html-body [data-pb-style=V3MOPFY],#html-body [data-pb-style=VQ3BS0L]{max-width:100%;height:auto}@media only screen and (max-width: 767px) { #html-body [data-pb-style=O3UAX2Q]{border-style:none} }</style><div class="pagebuilder-column-group border-r border-l-2 border-gray-300" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-background-lazy-load="false" data-element="main" data-pb-style="EO7TGFQ"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="RBT47X0"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="UKV8I82"><div class="category-item-link" data-content-type="text" data-appearance="default" data-element="main" data-pb-style="D3EUVQA"><p>Sélection</p></div><div class="megamenu-cms-list-items-wrapper" data-content-type="text" data-appearance="default" data-element="main" data-pb-style="KDG9PPK"><ul> <li> <p><a tabindex="0" href="/nouveau/nouveautes-maquillage.html">Nouveautés</a></p> </li> <li> <p><a tabindex="0" href="/selections-avril/best-sellers-maquillage-bio-avril-hiver-2024-2025.html">Meilleures ventes</a></p> </li> <li> <p><a tabindex="0" href="/zero-gaspi/maquillage-zero-gaspi.html">Zéro gaspi</a></p> </li> </ul></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="ROC76GT"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="O3UAX2Q"><a href="https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux.html" target="" data-link-type="default" title="" data-element="link"><img class="pagebuilder-mobile-hidden" src="https://avril.twic.pics/media/.renditions/wysiwyg/homepage/calendrier_de_l_avent.png" alt="" title="" width="200" height="200" loading="lazy" data-use-native-image-dimensions="false" data-element="desktop_image" data-pb-style="V3MOPFY"><img class="pagebuilder-mobile-only" src="https://avril.twic.pics/media/.renditions/wysiwyg/homepage/calendrier_de_l_avent.png" alt="" title="" width="200" height="200" loading="lazy" data-use-native-image-dimensions="false" data-element="mobile_image" data-pb-style="VQ3BS0L"></a></figure><div class="megamenu-cms-box-content" data-content-type="text" data-appearance="default" data-element="main"><p class="mt-4"><a tabindex="0" href="https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux.html">Calendrier de l'Avent</a></p> <p class="mb-4">24 jours pour bien être soi</p> <p id="J5XF472"><a tabindex="0" href="https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux.html"><span class="underline">Découvrir</span> -></a></p></div></div></div></div></li></ul></li> </ul> </li> </ul> </li><li class="product-menu dropdown menu-dropdown-icon category-item nav-1024"> <a class="relative" href="https://www.avril-beaute.fr/nouveau.html" > <span class="megaitemicons"></span> Nouveau <span class="block w-8 h-8 absolute top-1/2 right-2 -translate-y-1/2 md:hidden"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg> </span> </a> <ul class="w-full bg-white shadow-lg justify-center transition-all duration-300 ease-in-out"> <li> <ul class="column2 container flex"> <li class="mega-static-block menu-content col-menu-9"> <ul class="column4 child-level-1"><li class=category-item nav-1024-224 "><a href="https://www.avril-beaute.fr/nouveau/nouveautes-maquillage.html" >Nouveautés maquillage</a></li><li class=category-item nav-1024-225 "><a href="https://www.avril-beaute.fr/nouveau/nouveautes-soin.html" >Nouveautés soin</a></li></ul> </li> <li class="mega-static-block menu-sidebar-right"><ul><li><style>#html-body [data-pb-style=F9YOTQN]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;align-self:stretch}#html-body [data-pb-style=EJGNPK6]{display:flex;width:100%}#html-body [data-pb-style=TXFTKG4],#html-body [data-pb-style=V3FM3JM]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;text-align:center;width:50%;align-self:stretch}#html-body [data-pb-style=V3FM3JM]{text-align:left}#html-body [data-pb-style=PFLD5TA],#html-body [data-pb-style=UOUPH2O]{display:none}#html-body [data-pb-style=D7A85GG]{border-style:none}#html-body [data-pb-style=HG3NT7T],#html-body [data-pb-style=T0PUP97]{max-width:100%;height:auto}@media only screen and (max-width: 768px) { #html-body [data-pb-style=D7A85GG]{border-style:none} }</style><div class="pagebuilder-column-group border-r border-l-2 border-gray-300" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-background-lazy-load="false" data-element="main" data-pb-style="F9YOTQN"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="EJGNPK6"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="TXFTKG4"><div class="category-item-link" data-content-type="text" data-appearance="default" data-element="main" data-pb-style="PFLD5TA"><p>C'est nouveau !</p></div><div class="megamenu-cms-list-items-wrapper" data-content-type="text" data-appearance="default" data-element="main" data-pb-style="UOUPH2O"><ul> <li style="text-align: left;"><a tabindex="0" href="https://www.avril-beaute.fr/maquillage/maquillage/yeux/mascara.html">Mascara volume </a>& allongeant</li> <li style="text-align: left;"><a tabindex="0" href="https://www.avril-beaute.fr/lait-solaire-spf30-2273.html">Lait solaire spf 30</a></li> <li style="text-align: left;"><a tabindex="0" href="https://www.avril-beaute.fr/selections-avril/produits-eco-conscients/maquillage-rechargeable.html">Maquillage rechargeable : nouveau packaging</a></li> </ul></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="V3FM3JM"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="D7A85GG"><a href="https://www.avril-beaute.fr/soin/cheveux/cheveux.html" target="" data-link-type="default" title="" data-element="link"><img class="pagebuilder-mobile-hidden" src="https://avril.twic.pics/media/wysiwyg/vignette_capillaire.png" alt="" title="" loading="lazy" data-use-native-image-dimensions="false" width="200" height="200" data-element="desktop_image" data-pb-style="HG3NT7T"><img class="pagebuilder-mobile-only" src="https://avril.twic.pics/media/wysiwyg/vignette_capillaire.png" alt="" title="" loading="lazy" data-use-native-image-dimensions="false" width="200" height="200" data-element="mobile_image" data-pb-style="T0PUP97"></a></figure><div class="megamenu-cms-box-content" data-content-type="text" data-appearance="default" data-element="main"><p class="mt-4"><a tabindex="0" href="https://www.avril-beaute.fr/soin/cheveux/cheveux.html">Gamme capillaire</a></p> <p class="mb-4">6 nouvelles routines sur-mesure</p> <p id="J5XF472"><a tabindex="0" href="https://www.avril-beaute.fr/soin/cheveux/cheveux.html"><span class="underline">Découvrir</span> -></a></p></div></div></div></div></li></ul></li> </ul> </li> </ul> </li><li class=""> <a href="https://www.avril-beaute.fr/animation/noel/c-est-noel.html" > <span class="megaitemicons"> </span>Déjà Noël</a> </li></ul>
</div>
</div>
</div>
</div>
<div x-data="initMegaMenuMobile()" class="megamenu-burger-mobile z-10 order-0 navigation min-w-12 lg:hidden">
<div :class="{'overflow-x-hidden overflow-y-auto fixed top-0 left-0 w-full h-full bg-background flex flex-col' : open}"
@toggle-mobile-megamenu.window="open = !open"
@keydown.window.escape="open=false"
x-cloak>
<div class="flex items-baseline justify-between menu-icon bg-cover"
:class="{'min-h-32' : open}"
:style="open ? 'background-image: url(https://avril.twic.pics/media/hyva_homepage_slider/1000013120_1.png);' : ''"
x-cloak>
<div class="flex justify-start w-full relative">
<a @click="$dispatch('toggle-mobile-megamenu')"
class="flex items-center justify-center cursor-pointer bg-inherit relative"
:class="{ 'ml-auto': open }"
x-cloak>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="60" height="60" :class="{ 'hidden' : !open, 'block': open }" role="img">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
<title>x</title></svg>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="p-2" width="48" height="48" :class="{ 'hidden' : open, 'block': !open }" role="img">
<path stroke-linecap="round" stroke-linejoin="round" d="M15 12H3M17 18H3M21 6H3"/>
<title>align-left</title></svg>
</a>
</div>
</div>
<div class="flex flex-col items-center gap-3 sm:gap-4 flex-wrap sm:flex-nowrap px-4 pt-4 pb-2"
:class="{ 'hidden' : !open }"
x-cloak>
<button class="relative w-full min-w-0"
@click.prevent="searchOpen = !searchOpen; $dispatch('search-open');"
aria-haspopup="true"
:aria-expanded="searchOpen"
x-cloak>
<label class="sr-only" for="search-menu">Recherchez ici</label>
<input id="search-menu" type="search"
class="no-search-cancel w-full pointer-events-none py-6 border-0 rounded-md placeholder:text-sm"
placeholder="Recherchez ici"
readonly tabindex="-1"
x-cloak />
<div class="p-1 pointer-events-none absolute top-1/2 right-3 -translate-y-1/2 sm:right-4"
aria-label="Search" tabindex="-1" x-cloak>
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewbox="0 0 28 28" fill="none" aria-hidden="true">
<path d="M21.0003 21.0003L17.625 17.625" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13.2218 19.4437C16.6581 19.4437 19.4437 16.6581 19.4437 13.2218C19.4437 9.78561 16.6581 7 13.2218 7C9.78561 7 7 9.78561 7 13.2218C7 16.6581 9.78561 19.4437 13.2218 19.4437Z" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
</button>
<div class="burger-categories-wrapper order-2 w-full" x-cloak>
<div
class="megamenu-burger-avril relative z-10"
x-data='{ stack: ["root"], panels: {"root-0-0-0":{"title":"Crème","image":"https://www.avril-beaute.fr/media/catalog/category/2-_Cat_gorie_Soin_Visage_1_.jpg","see_all":"https://www.avril-beaute.fr/soin/visage/soin-visage.html","items":[{"t":"Crème visage","u":"https://www.avril-beaute.fr/soin/visage/soin-visage/creme-visage.html","has":false,"pid":null,"underline":false},{"t":"Anti-âge","u":"https://www.avril-beaute.fr/soin/visage/soin-visage/anti-age.html","has":false,"pid":null,"underline":false},{"t":"Fluide matifiant","u":"https://www.avril-beaute.fr/soin/visage/soin-visage/fluide-matifiant.html","has":false,"pid":null,"underline":false},{"t":"Baume à lèvres","u":"https://www.avril-beaute.fr/soin/visage/soin-visage/baume-a-levres.html","has":false,"pid":null,"underline":false},{"t":"Lotion visage","u":"https://www.avril-beaute.fr/soin/visage/soin-visage/lotion-visage.html","has":false,"pid":null,"underline":false},{"t":"Eau florale","u":"https://www.avril-beaute.fr/soin/visage/soin-visage/eau-florale.html","has":false,"pid":null,"underline":false},{"t":"Huile végétale","u":"https://www.avril-beaute.fr/soin/visage/soin-visage/huile-vegetale.html","has":false,"pid":null,"underline":false},{"t":"Macérat","u":"https://www.avril-beaute.fr/soin/visage/soin-visage/macerat.html","has":false,"pid":null,"underline":false},{"t":"Soin solaire","u":"https://www.avril-beaute.fr/soin/visage/soin-visage/creme-solaire.html","has":false,"pid":null,"underline":false}],"id":"root-0-0-0"},"root-0-0-2":{"title":"Masque & gommage","image":"https://www.avril-beaute.fr/media/catalog/category/2-_Cat_gorie_Soin_Visage_1__1.jpg","see_all":"https://www.avril-beaute.fr/soin/visage/masque-visage.html","items":[{"t":"Masque","u":"https://www.avril-beaute.fr/soin/visage/masque-visage/masque-visage.html","has":false,"pid":null,"underline":false},{"t":"Gommage","u":"https://www.avril-beaute.fr/soin/visage/masque-visage/gommage-visage.html","has":false,"pid":null,"underline":false}],"id":"root-0-0-2"},"root-0-0-3":{"title":"Nettoyant","image":"https://www.avril-beaute.fr/media/catalog/category/9-_Cat_gorie_NOUVEAU_copie_8.jpg","see_all":"https://www.avril-beaute.fr/soin/visage/nettoyant.html","items":[{"t":"Gel nettoyant","u":"https://www.avril-beaute.fr/soin/visage/nettoyant/gel-visage.html","has":false,"pid":null,"underline":false},{"t":"Mousse nettoyante","u":"https://www.avril-beaute.fr/soin/visage/nettoyant/mousse-nettoyante.html","has":false,"pid":null,"underline":false},{"t":"Gommage","u":"https://www.avril-beaute.fr/soin/visage/nettoyant/gommage-visage.html","has":false,"pid":null,"underline":false},{"t":"Savon visage","u":"https://www.avril-beaute.fr/soin/visage/nettoyant/savon-visage.html","has":false,"pid":null,"underline":false},{"t":"Eau nettoyante","u":"https://www.avril-beaute.fr/soin/visage/nettoyant/eau-nettoyante.html","has":false,"pid":null,"underline":false}],"id":"root-0-0-3"},"root-0-0-4":{"title":"Démaquillant","image":"https://www.avril-beaute.fr/media/catalog/category/14a-_Cat_gorie_DEMAQUILLAGEv1_copie.jpg","see_all":"https://www.avril-beaute.fr/soin/visage/demaquillant.html","items":[{"t":"Baume démaquillant","u":"https://www.avril-beaute.fr/soin/visage/demaquillant/baume-demaquillant.html","has":false,"pid":null,"underline":false},{"t":"Lait démaquillant","u":"https://www.avril-beaute.fr/soin/visage/demaquillant/lait-demaquillant.html","has":false,"pid":null,"underline":false},{"t":"Huile démaquillante","u":"https://www.avril-beaute.fr/soin/visage/demaquillant/huile-demaquillante.html","has":false,"pid":null,"underline":false},{"t":"Eau micellaire","u":"https://www.avril-beaute.fr/soin/visage/demaquillant/eau-micellaire.html","has":false,"pid":null,"underline":false},{"t":"Démaquillant yeux","u":"https://www.avril-beaute.fr/soin/visage/demaquillant/demaquillant-yeux.html","has":false,"pid":null,"underline":false},{"t":"Dissolvant","u":"https://www.avril-beaute.fr/soin/visage/demaquillant/dissolvant.html","has":false,"pid":null,"underline":false}],"id":"root-0-0-4"},"root-0-0":{"title":"Visage","image":"https://www.avril-beaute.fr/media/catalog/category/2-_Cat_gorie_Soin_Visage_copie_2_retouch_.jpg","see_all":"https://www.avril-beaute.fr/soin/visage.html","items":[{"t":"Crème","u":"https://www.avril-beaute.fr/soin/visage/soin-visage.html","has":true,"pid":"root-0-0-0","underline":false},{"t":"Sérum","u":"https://www.avril-beaute.fr/soin/visage/serum-visage.html","has":false,"pid":null,"underline":false},{"t":"Masque & gommage","u":"https://www.avril-beaute.fr/soin/visage/masque-visage.html","has":true,"pid":"root-0-0-2","underline":false},{"t":"Nettoyant","u":"https://www.avril-beaute.fr/soin/visage/nettoyant.html","has":true,"pid":"root-0-0-3","underline":false},{"t":"Démaquillant","u":"https://www.avril-beaute.fr/soin/visage/demaquillant.html","has":true,"pid":"root-0-0-4","underline":false},{"t":"Soin des lèvres","u":"https://www.avril-beaute.fr/soin/visage/soin-des-levres.html","has":false,"pid":null,"underline":false},{"t":"Huile & eau florale","u":"https://www.avril-beaute.fr/soin/visage/huiles-eaux-florales.html","has":false,"pid":null,"underline":false}],"id":"root-0-0"},"root-0-1-0":{"title":"Soin corps","image":"https://www.avril-beaute.fr/media/catalog/category/6b-_Cat_gorie_CORPS_DOUCHE_v2_copie_all_g__4.jpg","see_all":"https://www.avril-beaute.fr/soin/corps-et-douche/soin-corps.html","items":[{"t":"Crème corps","u":"https://www.avril-beaute.fr/soin/corps-et-douche/soin-corps/creme-corps.html","has":false,"pid":null,"underline":false},{"t":"Baume corps","u":"https://www.avril-beaute.fr/soin/corps-et-douche/soin-corps/baume-corps.html","has":false,"pid":null,"underline":false},{"t":"Huile corps","u":"https://www.avril-beaute.fr/soin/corps-et-douche/soin-corps/huile-corps.html","has":false,"pid":null,"underline":false},{"t":"Huile végétale","u":"https://www.avril-beaute.fr/soin/corps-et-douche/soin-corps/huile-vegetale.html","has":false,"pid":null,"underline":false},{"t":"Gommage corps","u":"https://www.avril-beaute.fr/soin/corps-et-douche/soin-corps/gommage-corps.html","has":false,"pid":null,"underline":false},{"t":"Soin solaire","u":"https://www.avril-beaute.fr/soin/corps-et-douche/soin-corps/creme-solaire.html","has":false,"pid":null,"underline":false}],"id":"root-0-1-0"},"root-0-1-1":{"title":"Savon & gel douche","image":"https://www.avril-beaute.fr/media/catalog/category/6b-_Cat_gorie_CORPS_DOUCHE_v2_copie_all_g__1_6.jpg","see_all":"https://www.avril-beaute.fr/soin/corps-et-douche/savons-gel-douche.html","items":[{"t":"Savon corps","u":"https://www.avril-beaute.fr/soin/corps-et-douche/savons-gel-douche/savon-corps.html","has":false,"pid":null,"underline":false},{"t":"Savon à froid","u":"https://www.avril-beaute.fr/soin/corps-et-douche/savons-gel-douche/savon-a-froid.html","has":false,"pid":null,"underline":false},{"t":"Gel douche & gel mains","u":"https://www.avril-beaute.fr/soin/corps-et-douche/savons-gel-douche/gel-douche.html","has":false,"pid":null,"underline":false},{"t":"Gel et pain intime","u":"https://www.avril-beaute.fr/soin/corps-et-douche/savons-gel-douche/gel-et-pain-intime.html","has":false,"pid":null,"underline":false},{"t":"Base neutre","u":"https://www.avril-beaute.fr/soin/corps-et-douche/savons-gel-douche/base-neutre.html","has":false,"pid":null,"underline":false}],"id":"root-0-1-1"},"root-0-1-3":{"title":"Dentifrice","image":"https://www.avril-beaute.fr/media/catalog/category/6b-_Cat_gorie_CORPS_DOUCHE_v2_copie_all_g__2_7.jpg","see_all":"https://www.avril-beaute.fr/soin/corps-et-douche/dentifrices.html","items":[{"t":"Dentifrice","u":"https://www.avril-beaute.fr/soin/corps-et-douche/dentifrices/dentifrice.html","has":false,"pid":null,"underline":false},{"t":"Brosse à dents","u":"https://www.avril-beaute.fr/soin/corps-et-douche/dentifrices/brosse-a-dent.html","has":false,"pid":null,"underline":false}],"id":"root-0-1-3"},"root-0-1-4":{"title":"Accessoires","image":"https://www.avril-beaute.fr/media/catalog/category/6b-_Cat_gorie_CORPS_DOUCHE_v2_copie_all_g__2_10.jpg","see_all":"https://www.avril-beaute.fr/soin/corps-et-douche/accessoires.html","items":[{"t":"Gants","u":"https://www.avril-beaute.fr/soin/corps-et-douche/accessoires/gants.html","has":false,"pid":null,"underline":false},{"t":"Brosse à dents","u":"https://www.avril-beaute.fr/soin/corps-et-douche/accessoires/brosse-a-dent.html","has":false,"pid":null,"underline":false},{"t":"Cure-oreilles","u":"https://www.avril-beaute.fr/soin/corps-et-douche/accessoires/cure-oreilles.html","has":false,"pid":null,"underline":false},{"t":"Porte-savon","u":"https://www.avril-beaute.fr/soin/corps-et-douche/accessoires/porte-savon.html","has":false,"pid":null,"underline":false},{"t":"Flacon vide","u":"https://www.avril-beaute.fr/soin/corps-et-douche/accessoires/flacon-vide.html","has":false,"pid":null,"underline":false}],"id":"root-0-1-4"},"root-0-1":{"title":"Corps & douche","image":"https://www.avril-beaute.fr/media/catalog/category/5b-_Cat_gorie_CORPS_DOUCHE_copie_retouch_2.jpg","see_all":"https://www.avril-beaute.fr/soin/corps-et-douche.html","items":[{"t":"Soin corps","u":"https://www.avril-beaute.fr/soin/corps-et-douche/soin-corps.html","has":true,"pid":"root-0-1-0","underline":false},{"t":"Savon & gel douche","u":"https://www.avril-beaute.fr/soin/corps-et-douche/savons-gel-douche.html","has":true,"pid":"root-0-1-1","underline":false},{"t":"Déodorant","u":"https://www.avril-beaute.fr/soin/corps-et-douche/deodorant.html","has":false,"pid":null,"underline":false},{"t":"Dentifrice","u":"https://www.avril-beaute.fr/soin/corps-et-douche/dentifrices.html","has":true,"pid":"root-0-1-3","underline":false},{"t":"Accessoires","u":"https://www.avril-beaute.fr/soin/corps-et-douche/accessoires.html","has":true,"pid":"root-0-1-4","underline":false}],"id":"root-0-1"},"root-0-2-0":{"title":"Shampooing","image":"https://www.avril-beaute.fr/media/catalog/category/12-_Cat_gorie_CHEVEUX_1_.jpg","see_all":"https://www.avril-beaute.fr/soin/cheveux/shampooings-apres-shampooing.html","items":[{"t":"Shampooing solide","u":"https://www.avril-beaute.fr/soin/cheveux/shampooings-apres-shampooing/shampooing-solide.html","has":false,"pid":null,"underline":false},{"t":"Shampooing liquide","u":"https://www.avril-beaute.fr/soin/cheveux/shampooings-apres-shampooing/shampooing.html","has":false,"pid":null,"underline":false},{"t":"Après-shampooing","u":"https://www.avril-beaute.fr/soin/cheveux/shampooings-apres-shampooing/apres-shampooing-solide.html","has":false,"pid":null,"underline":false}],"id":"root-0-2-0"},"root-0-2-3":{"title":"Par préoccupation","image":"https://www.avril-beaute.fr/media/catalog/category/12-_Cat_gorie_CHEVEUX_1__6.jpg","see_all":"https://www.avril-beaute.fr/soin/cheveux/cheveux.html","items":[{"t":"J'ai les cheveux bouclés","u":"https://www.avril-beaute.fr/soin/cheveux/cheveux/j-ai-les-cheveux-boucles.html","has":false,"pid":null,"underline":false},{"t":"J'ai les cheveux gras","u":"https://www.avril-beaute.fr/soin/cheveux/cheveux/j-ai-les-cheveux-gras.html","has":false,"pid":null,"underline":false},{"t":"J'ai les cheveux secs & abîmés","u":"https://www.avril-beaute.fr/soin/cheveux/cheveux/j-ai-les-cheveux-secs-abimes.html","has":false,"pid":null,"underline":false},{"t":"J'ai les cheveux normaux","u":"https://www.avril-beaute.fr/soin/cheveux/cheveux/jai-les-cheveux-normaux.html","has":false,"pid":null,"underline":false},{"t":"J'ai les cheveux colorés","u":"https://www.avril-beaute.fr/soin/cheveux/preoccupations-cheveux/j-ai-les-cheveux-colores.html","has":false,"pid":null,"underline":false},{"t":"J'ai le cuir chevelu sensible","u":"https://www.avril-beaute.fr/soin/cheveux/cheveux/j-ai-des-pellicules.html","has":false,"pid":null,"underline":false},{"t":"J'ai les cheveux fins","u":"https://www.avril-beaute.fr/soin/cheveux/preoccupations-cheveux/mes-cheveux-manquent-de-volume.html","has":false,"pid":null,"underline":false}],"id":"root-0-2-3"},"root-0-2":{"title":"Cheveux","image":"https://www.avril-beaute.fr/media/catalog/category/12-_Cat_gorie_CHEVEUX_copie_2_retouch_.jpg","see_all":"https://www.avril-beaute.fr/soin/cheveux.html","items":[{"t":"Shampooing","u":"https://www.avril-beaute.fr/soin/cheveux/shampooings-apres-shampooing.html","has":true,"pid":"root-0-2-0","underline":false},{"t":"Après-shampooing","u":"https://www.avril-beaute.fr/soin/cheveux/apres-shampooing.html","has":false,"pid":null,"underline":false},{"t":"Soin & coiffant","u":"https://www.avril-beaute.fr/soin/cheveux/soin-coiffant.html","has":false,"pid":null,"underline":false},{"t":"Par préoccupation","u":"https://www.avril-beaute.fr/soin/cheveux/cheveux.html","has":true,"pid":"root-0-2-3","underline":false}],"id":"root-0-2"},"root-0-3":{"title":"Accessoires","image":"https://www.avril-beaute.fr/media/catalog/category/9-_Cat_gorie_NOUVEAU_copie_10.jpg","see_all":"https://www.avril-beaute.fr/soin/accessoires.html","items":[{"t":"Gants & éponges","u":"https://www.avril-beaute.fr/soin/accessoires/gants-eponges.html","has":false,"pid":null,"underline":false},{"t":"Trousses & contenants","u":"https://www.avril-beaute.fr/soin/accessoires/trousses-contenants.html","has":false,"pid":null,"underline":false},{"t":"Autres accessoires","u":"https://www.avril-beaute.fr/soin/accessoires/autres-contenants.html","has":false,"pid":null,"underline":false}],"id":"root-0-3"},"root-0":{"title":"Soin","image":"https://www.avril-beaute.fr/media/catalog/category/5b-_Cat_gorie_CORPS_DOUCHE_copie_retouch_2_2.jpg","see_all":"https://www.avril-beaute.fr/soin.html","items":[{"t":"Visage","u":"https://www.avril-beaute.fr/soin/visage.html","has":true,"pid":"root-0-0","underline":false},{"t":"Corps & douche","u":"https://www.avril-beaute.fr/soin/corps-et-douche.html","has":true,"pid":"root-0-1","underline":false},{"t":"Cheveux","u":"https://www.avril-beaute.fr/soin/cheveux.html","has":true,"pid":"root-0-2","underline":false},{"t":"Accessoires","u":"https://www.avril-beaute.fr/soin/accessoires.html","has":true,"pid":"root-0-3","underline":false}],"id":"root-0"},"root-1-0":{"title":"Accessoires","image":"https://www.avril-beaute.fr/media/catalog/category/13_b_-Cat_gorie_MAQUILLAGE_niveau2_v1_copie_2_retouch__40.jpg","see_all":"https://www.avril-beaute.fr/maquillage/pinceaux.html","items":[{"t":"Pinceaux","u":"https://www.avril-beaute.fr/maquillage/pinceaux/pinceaux.html","has":false,"pid":null,"underline":false},{"t":"Houppettes & blenders","u":"https://www.avril-beaute.fr/maquillage/pinceaux/houppettes-blender.html","has":false,"pid":null,"underline":false},{"t":"Gants & éponges","u":"https://www.avril-beaute.fr/maquillage/pinceaux/gants-eponges.html","has":false,"pid":null,"underline":false},{"t":"Accessoires pour les ongles","u":"https://www.avril-beaute.fr/maquillage/pinceaux/accessoires-pour-les-ongles.html","has":false,"pid":null,"underline":false},{"t":"Trousses & contenants","u":"https://www.avril-beaute.fr/maquillage/pinceaux/trousses-contenants.html","has":false,"pid":null,"underline":false}],"id":"root-1-0"},"root-1-1-0":{"title":"Teint","image":"https://www.avril-beaute.fr/media/.renditions/wysiwyg/8-_Cat_gorie_MAQUILLAGE_niveau1_copie.jpg","see_all":"https://www.avril-beaute.fr/maquillage/maquillage/teint.html","items":[{"t":"Fond de teint & BB Cream","u":"https://www.avril-beaute.fr/maquillage/maquillage/teint/bb-cream-fond-de-teint.html","has":false,"pid":null,"underline":false},{"t":"Correcteur & anti-cernes","u":"https://www.avril-beaute.fr/maquillage/maquillage/teint/correcteurs-et-anticernes.html","has":false,"pid":null,"underline":false},{"t":"Base de teint & fixateur","u":"https://www.avril-beaute.fr/maquillage/maquillage/teint/base-de-teint.html","has":false,"pid":null,"underline":false},{"t":"Poudre compacte","u":"https://www.avril-beaute.fr/maquillage/maquillage/teint/poudre-compacte.html","has":false,"pid":null,"underline":false},{"t":"Poudre bonne mine","u":"https://www.avril-beaute.fr/maquillage/maquillage/teint/poudre-bonne-mine.html","has":false,"pid":null,"underline":false},{"t":"Blush","u":"https://www.avril-beaute.fr/maquillage/maquillage/teint/blush.html","has":false,"pid":null,"underline":false},{"t":"Highlighter","u":"https://www.avril-beaute.fr/maquillage/maquillage/teint/highlighter.html","has":false,"pid":null,"underline":false},{"t":"Poudre libre","u":"https://www.avril-beaute.fr/maquillage/maquillage/teint/poudre-libre.html","has":false,"pid":null,"underline":false},{"t":"Houpette","u":"https://www.avril-beaute.fr/maquillage/maquillage/teint/houppette.html","has":false,"pid":null,"underline":false},{"t":"Éponge","u":"https://www.avril-beaute.fr/maquillage/maquillage/teint/eponge.html","has":false,"pid":null,"underline":false}],"id":"root-1-1-0"},"root-1-1-1":{"title":"Yeux","image":"https://www.avril-beaute.fr/media/.renditions/wysiwyg/8-_Cat_gorie_MAQUILLAGE_niveau1_copie.jpg","see_all":"https://www.avril-beaute.fr/maquillage/maquillage/yeux.html","items":[{"t":"Mascara","u":"https://www.avril-beaute.fr/maquillage/maquillage/yeux/mascara.html","has":false,"pid":null,"underline":false},{"t":"Eyeliner","u":"https://www.avril-beaute.fr/maquillage/maquillage/yeux/eyeliner.html","has":false,"pid":null,"underline":false},{"t":"Crayon yeux","u":"https://www.avril-beaute.fr/maquillage/maquillage/yeux/crayon-yeux.html","has":false,"pid":null,"underline":false},{"t":"Crayon sourcils","u":"https://www.avril-beaute.fr/maquillage/maquillage/yeux/crayon-sourcils.html","has":false,"pid":null,"underline":false},{"t":"Crayon fard à paupières","u":"https://www.avril-beaute.fr/maquillage/maquillage/yeux/crayon-fard.html","has":false,"pid":null,"underline":false},{"t":"Fard à paupières","u":"https://www.avril-beaute.fr/maquillage/maquillage/yeux/fard-a-paupieres.html","has":false,"pid":null,"underline":false},{"t":"Taille-crayon","u":"https://www.avril-beaute.fr/maquillage/maquillage/yeux/taille-crayon.html","has":false,"pid":null,"underline":false},{"t":"Recourbe-cils","u":"https://www.avril-beaute.fr/maquillage/maquillage/yeux/recourbe-cils.html","has":false,"pid":null,"underline":false},{"t":"Pince à épiler","u":"https://www.avril-beaute.fr/maquillage/maquillage/yeux/pince-a-epiler.html","has":false,"pid":null,"underline":false}],"id":"root-1-1-1"},"root-1-1-2":{"title":"Lèvres","image":"https://www.avril-beaute.fr/media/catalog/category/8-_Cat_gorie_MAQUILLAGE_niveau1_copie_1_3.jpg","see_all":"https://www.avril-beaute.fr/maquillage/maquillage/levres.html","items":[{"t":"Rouge à lèvres","u":"https://www.avril-beaute.fr/maquillage/maquillage/levres/rouge-a-levres.html","has":false,"pid":null,"underline":false},{"t":"Crayon rouge à lèvres","u":"https://www.avril-beaute.fr/maquillage/maquillage/levres/crayon-levres.html","has":false,"pid":null,"underline":false},{"t":"Huile lèvres","u":"https://www.avril-beaute.fr/maquillage/maquillage/levres/huile-levres.html","has":false,"pid":null,"underline":false},{"t":"Crayon contour lèvres","u":"https://www.avril-beaute.fr/maquillage/maquillage/levres/crayon-contour-levres.html","has":false,"pid":null,"underline":false},{"t":"Baume à lèvres teinté","u":"https://www.avril-beaute.fr/maquillage/maquillage/levres/baume-a-levres-teinte.html","has":false,"pid":null,"underline":false}],"id":"root-1-1-2"},"root-1-1-3":{"title":"Ongles","image":"https://www.avril-beaute.fr/media/catalog/category/13_b_-Cat_gorie_MAQUILLAGE_niveau2_v1_copie_2_retouch__35.jpg","see_all":"https://www.avril-beaute.fr/maquillage/maquillage/ongles.html","items":[{"t":"Vernis","u":"https://www.avril-beaute.fr/maquillage/maquillage/ongles/vernis.html","has":false,"pid":null,"underline":false},{"t":"Dissolvant","u":"https://www.avril-beaute.fr/maquillage/maquillage/ongles/dissolvant.html","has":false,"pid":null,"underline":false},{"t":"Coupe-ongles","u":"https://www.avril-beaute.fr/maquillage/maquillage/ongles/coupe-ongles.html","has":false,"pid":null,"underline":false},{"t":"Lime à ongles","u":"https://www.avril-beaute.fr/maquillage/maquillage/ongles/lime-a-ongles.html","has":false,"pid":null,"underline":false},{"t":"Repousse-cuticules","u":"https://www.avril-beaute.fr/maquillage/maquillage/ongles/repousse-cuticules.html","has":false,"pid":null,"underline":false},{"t":"Pierre ponce","u":"https://www.avril-beaute.fr/maquillage/maquillage/ongles/pierre-ponce.html","has":false,"pid":null,"underline":false}],"id":"root-1-1-3"},"root-1-1":{"title":"Maquillage","image":"https://www.avril-beaute.fr/media/catalog/category/13_b_-Cat_gorie_MAQUILLAGE_niveau2_v1_copie_2_retouch_.jpg","see_all":"https://www.avril-beaute.fr/maquillage/maquillage.html","items":[{"t":"Teint","u":"https://www.avril-beaute.fr/maquillage/maquillage/teint.html","has":true,"pid":"root-1-1-0","underline":false},{"t":"Yeux","u":"https://www.avril-beaute.fr/maquillage/maquillage/yeux.html","has":true,"pid":"root-1-1-1","underline":false},{"t":"Lèvres","u":"https://www.avril-beaute.fr/maquillage/maquillage/levres.html","has":true,"pid":"root-1-1-2","underline":false},{"t":"Ongles","u":"https://www.avril-beaute.fr/maquillage/maquillage/ongles.html","has":true,"pid":"root-1-1-3","underline":false},{"t":"Palettes de maquillage","u":"https://www.avril-beaute.fr/maquillage/maquillage/palettes-de-maquillage.html","has":false,"pid":null,"underline":false}],"id":"root-1-1"},"root-1-2-0":{"title":"Base & fixateur","image":"https://www.avril-beaute.fr/media/catalog/category/14a-_Cat_gorie_DEMAQUILLAGEv1_copie_2_retouhc__19.jpg","see_all":"https://www.avril-beaute.fr/maquillage/demaquillant/base-fixateur.html","items":[{"t":"Base de teint","u":"https://www.avril-beaute.fr/maquillage/demaquillant/base-fixateur/base-de-teint.html","has":false,"pid":null,"underline":false},{"t":"Fixateur de maquillage","u":"https://www.avril-beaute.fr/maquillage/demaquillant/base-fixateur/fixateur-de-maquillage.html","has":false,"pid":null,"underline":false}],"id":"root-1-2-0"},"root-1-2-1":{"title":"Nettoyant","image":"https://www.avril-beaute.fr/media/catalog/category/14a-_Cat_gorie_DEMAQUILLAGEv1_copie_2_retouhc__22.jpg","see_all":"https://www.avril-beaute.fr/maquillage/demaquillant/nettoyant.html","items":[{"t":"Mousse nettoyante","u":"https://www.avril-beaute.fr/maquillage/demaquillant/nettoyant/mousse-nettoyante.html","has":false,"pid":null,"underline":false},{"t":"Gel nettoyant","u":"https://www.avril-beaute.fr/maquillage/demaquillant/nettoyant/gel-nettoyant.html","has":false,"pid":null,"underline":false},{"t":"Eau nettoyante","u":"https://www.avril-beaute.fr/maquillage/demaquillant/nettoyant/eau-nettoyante.html","has":false,"pid":null,"underline":false},{"t":"Savon & pain dermatologique","u":"https://www.avril-beaute.fr/maquillage/demaquillant/nettoyant/savon-visage-pain-dermatologique.html","has":false,"pid":null,"underline":false},{"t":"Gommage","u":"https://www.avril-beaute.fr/maquillage/demaquillant/nettoyant/gommage-visage.html","has":false,"pid":null,"underline":false},{"t":"Lotion tonique","u":"https://www.avril-beaute.fr/maquillage/demaquillant/nettoyant/lotion-visage.html","has":false,"pid":null,"underline":false},{"t":"Eau florale","u":"https://www.avril-beaute.fr/maquillage/demaquillant/nettoyant/eau-florale.html","has":false,"pid":null,"underline":false}],"id":"root-1-2-1"},"root-1-2-2":{"title":"Démaquillant","image":"https://www.avril-beaute.fr/media/catalog/category/14a-_Cat_gorie_DEMAQUILLAGEv1_copie_2_retouhc__27.jpg","see_all":"https://www.avril-beaute.fr/maquillage/demaquillant/demaquillant.html","items":[{"t":"Eau micellaire","u":"https://www.avril-beaute.fr/maquillage/demaquillant/demaquillant/eau-micellaire.html","has":false,"pid":null,"underline":false},{"t":"Baume démaquillant","u":"https://www.avril-beaute.fr/maquillage/demaquillant/demaquillant/baume-demaquillant.html","has":false,"pid":null,"underline":false},{"t":"Lait démaquillant","u":"https://www.avril-beaute.fr/maquillage/demaquillant/demaquillant/lait-demaquillant.html","has":false,"pid":null,"underline":false},{"t":"Huile démaquillante","u":"https://www.avril-beaute.fr/maquillage/demaquillant/demaquillant/huile-demaquillante.html","has":false,"pid":null,"underline":false},{"t":"Démaquillant yeux","u":"https://www.avril-beaute.fr/maquillage/demaquillant/demaquillant/demaquillant-yeux.html","has":false,"pid":null,"underline":false},{"t":"Dissolvant","u":"https://www.avril-beaute.fr/maquillage/demaquillant/demaquillant/dissolvant.html","has":false,"pid":null,"underline":false}],"id":"root-1-2-2"},"root-1-2":{"title":"Préparation & démaquillage","image":"https://www.avril-beaute.fr/media/catalog/category/14a-_Cat_gorie_DEMAQUILLAGEv1_copie_2_retouhc_.jpg","see_all":"https://www.avril-beaute.fr/maquillage/demaquillant.html","items":[{"t":"Base & fixateur","u":"https://www.avril-beaute.fr/maquillage/demaquillant/base-fixateur.html","has":true,"pid":"root-1-2-0","underline":false},{"t":"Nettoyant","u":"https://www.avril-beaute.fr/maquillage/demaquillant/nettoyant.html","has":true,"pid":"root-1-2-1","underline":false},{"t":"Démaquillant","u":"https://www.avril-beaute.fr/maquillage/demaquillant/demaquillant.html","has":true,"pid":"root-1-2-2","underline":false}],"id":"root-1-2"},"root-1":{"title":"Maquillage","image":"https://www.avril-beaute.fr/media/catalog/category/8-_Cat_gorie_MAQUILLAGE_niveau1_copie_1.jpg","see_all":"https://www.avril-beaute.fr/maquillage.html","items":[{"t":"Accessoires","u":"https://www.avril-beaute.fr/maquillage/pinceaux.html","has":true,"pid":"root-1-0","underline":false},{"t":"Maquillage","u":"https://www.avril-beaute.fr/maquillage/maquillage.html","has":true,"pid":"root-1-1","underline":false},{"t":"Préparation & démaquillage","u":"https://www.avril-beaute.fr/maquillage/demaquillant.html","has":true,"pid":"root-1-2","underline":false}],"id":"root-1"},"root-2-0-0":{"title":"Soin visage","image":"https://www.avril-beaute.fr/media/catalog/category/4-_Cat_gorie_HOMME_1__3.jpg","see_all":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/soin-visage.html","items":[{"t":"Crème visage","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/soin-visage/creme-visage.html","has":false,"pid":null,"underline":false},{"t":"Crème anti-âge","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/soin-visage/creme-anti-age.html","has":false,"pid":null,"underline":false},{"t":"Baume à lèvres","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/soin-visage/baume-a-levres.html","has":false,"pid":null,"underline":false},{"t":"Huile à barbe","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/soin-visage/huile-a-barbe.html","has":false,"pid":null,"underline":false}],"id":"root-2-0-0"},"root-2-0-1":{"title":"Rasage","image":"https://www.avril-beaute.fr/media/catalog/category/4-_Cat_gorie_HOMME_1__8.jpg","see_all":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/rasage.html","items":[{"t":"Savon à raser","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/rasage/savon-a-raser.html","has":false,"pid":null,"underline":false},{"t":"Crème de rasage","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/rasage/creme-de-rasage.html","has":false,"pid":null,"underline":false},{"t":"Baume après-rasage","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/rasage/baume-apres-rasage.html","has":false,"pid":null,"underline":false}],"id":"root-2-0-1"},"root-2-0-2":{"title":"Nettoyant visage","image":"https://www.avril-beaute.fr/media/catalog/category/4-_Cat_gorie_HOMME_1__1.jpg","see_all":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/nettoyant-visage.html","items":[{"t":"Gel visage","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/nettoyant-visage/gel-visage.html","has":false,"pid":null,"underline":false},{"t":"Mousse nettoyante","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/nettoyant-visage/mousse-nettoyante.html","has":false,"pid":null,"underline":false},{"t":"Savon visage","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/nettoyant-visage/savon-visage.html","has":false,"pid":null,"underline":false},{"t":"Gommage visage","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/nettoyant-visage/gommage-visage.html","has":false,"pid":null,"underline":false},{"t":"Eau nettoyante","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/nettoyant-visage/eau-nettoyante.html","has":false,"pid":null,"underline":false}],"id":"root-2-0-2"},"root-2-0":{"title":"Soin visage et rasage","image":"https://www.avril-beaute.fr/media/catalog/category/3-_Cat_gorie_SOIN_VISAGE_et_RASAGE_HOMME_copie_2_1.jpg","see_all":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage.html","items":[{"t":"Soin visage","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/soin-visage.html","has":true,"pid":"root-2-0-0","underline":false},{"t":"Rasage","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/rasage.html","has":true,"pid":"root-2-0-1","underline":false},{"t":"Nettoyant visage","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/nettoyant-visage.html","has":true,"pid":"root-2-0-2","underline":false},{"t":"Accessoires","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage/accessoires.html","has":false,"pid":null,"underline":false}],"id":"root-2-0"},"root-2-1-0":{"title":"Soin & gommage","image":"https://www.avril-beaute.fr/media/catalog/category/4-_Cat_gorie_HOMME_1__19.jpg","see_all":"https://www.avril-beaute.fr/homme/corps-et-douche/soin-corps.html","items":[{"t":"Crème corps","u":"https://www.avril-beaute.fr/homme/corps-et-douche/soin-corps/creme-corps.html","has":false,"pid":null,"underline":false},{"t":"Baume corps","u":"https://www.avril-beaute.fr/homme/corps-et-douche/soin-corps/baume-corps.html","has":false,"pid":null,"underline":false},{"t":"Huile corps","u":"https://www.avril-beaute.fr/homme/corps-et-douche/soin-corps/huile-corps.html","has":false,"pid":null,"underline":false},{"t":"Huile végétale","u":"https://www.avril-beaute.fr/homme/corps-et-douche/soin-corps/huile-vegetale.html","has":false,"pid":null,"underline":false},{"t":"Gommage corps","u":"https://www.avril-beaute.fr/homme/corps-et-douche/soin-corps/gommage-corps.html","has":false,"pid":null,"underline":false}],"id":"root-2-1-0"},"root-2-1-1":{"title":"Savon & gel douche","image":"https://www.avril-beaute.fr/media/catalog/category/4-_Cat_gorie_HOMME_1__25.jpg","see_all":"https://www.avril-beaute.fr/homme/corps-et-douche/savon-gel-douche.html","items":[{"t":"Gel douche","u":"https://www.avril-beaute.fr/homme/corps-et-douche/savon-gel-douche/gel-douche.html","has":false,"pid":null,"underline":false},{"t":"Savon corps","u":"https://www.avril-beaute.fr/homme/corps-et-douche/savon-gel-douche/savon-corps.html","has":false,"pid":null,"underline":false},{"t":"Savon à froid","u":"https://www.avril-beaute.fr/homme/corps-et-douche/savon-gel-douche/savon-a-froid.html","has":false,"pid":null,"underline":false},{"t":"Base neutre","u":"https://www.avril-beaute.fr/homme/corps-et-douche/savon-et-gel-douche/base-neutre.html","has":false,"pid":null,"underline":false}],"id":"root-2-1-1"},"root-2-1-3":{"title":"Dentifrice","image":"https://www.avril-beaute.fr/media/catalog/category/4-_Cat_gorie_HOMME_1__31.jpg","see_all":"https://www.avril-beaute.fr/homme/corps-et-douche/dentifrice.html","items":[{"t":"Dentifrice","u":"https://www.avril-beaute.fr/homme/corps-et-douche/dentifrice/dentifrice.html","has":false,"pid":null,"underline":false},{"t":"Brosse à dents","u":"https://www.avril-beaute.fr/homme/corps-et-douche/dentifrice/brosse-a-dent.html","has":false,"pid":null,"underline":false}],"id":"root-2-1-3"},"root-2-1":{"title":"Corps et douche","image":"https://www.avril-beaute.fr/media/catalog/category/5b-_Cat_gorie_CORPS_DOUCHE_copie_retouch_2_1.jpg","see_all":"https://www.avril-beaute.fr/homme/corps-et-douche.html","items":[{"t":"Soin & gommage","u":"https://www.avril-beaute.fr/homme/corps-et-douche/soin-corps.html","has":true,"pid":"root-2-1-0","underline":false},{"t":"Savon & gel douche","u":"https://www.avril-beaute.fr/homme/corps-et-douche/savon-gel-douche.html","has":true,"pid":"root-2-1-1","underline":false},{"t":"Déodorant","u":"https://www.avril-beaute.fr/homme/corps-et-douche/deodorant.html","has":false,"pid":null,"underline":false},{"t":"Dentifrice","u":"https://www.avril-beaute.fr/homme/corps-et-douche/dentifrice.html","has":true,"pid":"root-2-1-3","underline":false},{"t":"Accessoires","u":"https://www.avril-beaute.fr/homme/corps-et-douche/accessoires.html","has":false,"pid":null,"underline":false}],"id":"root-2-1"},"root-2-2-0":{"title":"Shampooing et après shampooing","image":"https://www.avril-beaute.fr/media/catalog/category/12-_Cat_gorie_CHEVEUX_1__1_1.jpg","see_all":"https://www.avril-beaute.fr/homme/cheveux/shampooing-et-apres-shampooing.html","items":[{"t":"Shampooing solide","u":"https://www.avril-beaute.fr/homme/cheveux/shampooing-et-apres-shampooing/shampooing-solide.html","has":false,"pid":null,"underline":false},{"t":"Shampooing","u":"https://www.avril-beaute.fr/homme/cheveux/shampooing-et-apres-shampooing/shampooing.html","has":false,"pid":null,"underline":false},{"t":"Après-shampooing solide","u":"https://www.avril-beaute.fr/homme/cheveux/shampooing-et-apres-shampooing/apres-shampooing-solide.html","has":false,"pid":null,"underline":false},{"t":"Après-shampooing","u":"https://www.avril-beaute.fr/homme/cheveux/shampooing-et-apres-shampooing/apres-shampooing.html","has":false,"pid":null,"underline":false}],"id":"root-2-2-0"},"root-2-2-1":{"title":"Soin et produit coiffant","image":"https://www.avril-beaute.fr/media/catalog/category/12-_Cat_gorie_CHEVEUX_1__1_6.jpg","see_all":"https://www.avril-beaute.fr/homme/cheveux/soins-et-produits-coiffants.html","items":[{"t":"Gel cheveux","u":"https://www.avril-beaute.fr/homme/cheveux/soins-et-produits-coiffants/gel-cheveux.html","has":false,"pid":null,"underline":false},{"t":"Mousse capillaire","u":"https://www.avril-beaute.fr/homme/cheveux/soins-et-produits-coiffants/mousse-capillaire.html","has":false,"pid":null,"underline":false},{"t":"Huile capillaire","u":"https://www.avril-beaute.fr/homme/cheveux/soins-et-produits-coiffants/huile-capillaire.html","has":false,"pid":null,"underline":false},{"t":"Spray démêlant & thermoprotecteur","u":"https://www.avril-beaute.fr/homme/cheveux/soins-et-produits-coiffants/spray-demelant.html","has":false,"pid":null,"underline":false},{"t":"Masque capillaire","u":"https://www.avril-beaute.fr/homme/cheveux/soins-et-produits-coiffants/masque-capillaire.html","has":false,"pid":null,"underline":false},{"t":"Huile végétale","u":"https://www.avril-beaute.fr/homme/cheveux/soins-et-produits-coiffants/huile-vegetale.html","has":false,"pid":null,"underline":false}],"id":"root-2-2-1"},"root-2-2":{"title":"Cheveux","image":"https://www.avril-beaute.fr/media/catalog/category/12-_Cat_gorie_CHEVEUX_copie_2_retouch__1.jpg","see_all":"https://www.avril-beaute.fr/homme/cheveux.html","items":[{"t":"Shampooing et après shampooing","u":"https://www.avril-beaute.fr/homme/cheveux/shampooing-et-apres-shampooing.html","has":true,"pid":"root-2-2-0","underline":false},{"t":"Soin et produit coiffant","u":"https://www.avril-beaute.fr/homme/cheveux/soins-et-produits-coiffants.html","has":true,"pid":"root-2-2-1","underline":false},{"t":"Accessoires","u":"https://www.avril-beaute.fr/homme/cheveux/accessoires.html","has":false,"pid":null,"underline":false}],"id":"root-2-2"},"root-2":{"title":"Homme","image":"https://www.avril-beaute.fr/media/catalog/category/4-_Cat_gorie_HOMME_copie.jpg","see_all":"https://www.avril-beaute.fr/homme.html","items":[{"t":"Soin visage et rasage","u":"https://www.avril-beaute.fr/homme/soin-visage-et-rasage.html","has":true,"pid":"root-2-0","underline":false},{"t":"Corps et douche","u":"https://www.avril-beaute.fr/homme/corps-et-douche.html","has":true,"pid":"root-2-1","underline":false},{"t":"Cheveux","u":"https://www.avril-beaute.fr/homme/cheveux.html","has":true,"pid":"root-2-2","underline":false}],"id":"root-2"},"root-3-0":{"title":"Soin & nettoyant haute tolérance","image":"https://www.avril-beaute.fr/media/catalog/category/11-_Cat_gorie_FAMILLE_1__1.jpg","see_all":"https://www.avril-beaute.fr/bebe/nettoyant.html","items":[{"t":"Baume réparateur","u":"https://www.avril-beaute.fr/catalog/category/view/s/baume-reparateur-haute-tolerance/id/394/","has":false,"pid":null,"underline":false},{"t":"Crème neutre","u":"https://www.avril-beaute.fr/catalog/category/view/s/creme-neutre-haute-tolerance/id/396/","has":false,"pid":null,"underline":false},{"t":"Huile de massage","u":"https://www.avril-beaute.fr/catalog/category/view/s/huile-de-massage-haute-tolerance/id/395/","has":false,"pid":null,"underline":false},{"t":"Pain dermatologique","u":"https://www.avril-beaute.fr/bebe/nettoyant/pain-dermatologique-haute-tolerance.html","has":false,"pid":null,"underline":false},{"t":"Gel lavant neutre","u":"https://www.avril-beaute.fr/bebe/nettoyant/gel-lavant-neutre-haute-tolerance.html","has":false,"pid":null,"underline":false},{"t":"Gel lavant 2 en 1","u":"https://www.avril-beaute.fr/bebe/nettoyant/gel-lavant-2-en-1-en-poudre-a-reconstituer.html","has":false,"pid":null,"underline":false},{"t":"Eau nettoyante","u":"https://www.avril-beaute.fr/bebe/nettoyant/eau-nettoyante-haute-tolerance.html","has":false,"pid":null,"underline":false},{"t":"Dentifrice goût fraise","u":"https://www.avril-beaute.fr/bebe/nettoyant/dentifrice-gout-fraise.html","has":false,"pid":null,"underline":false}],"id":"root-3-0"},"root-3-1":{"title":"Accessoires","image":"https://www.avril-beaute.fr/media/catalog/category/9-_Cat_gorie_NOUVEAU_copie_15.jpg","see_all":"https://www.avril-beaute.fr/bebe/accessoires.html","items":[{"t":"Brosse à dents rechargeable","u":"https://www.avril-beaute.fr/bebe/accessoires/brosse-a-dents-rechargeable.html","has":false,"pid":null,"underline":false},{"t":"Gant & éponge visage","u":"https://www.avril-beaute.fr/bebe/accessoires/gant-eponges-visage.html","has":false,"pid":null,"underline":false},{"t":"Porte-savon & pochette","u":"https://www.avril-beaute.fr/bebe/accessoires/porte-savon-pochette.html","has":false,"pid":null,"underline":false},{"t":"Cure-oreilles","u":"https://www.avril-beaute.fr/bebe/accessoires/cure-oreilles.html","has":false,"pid":null,"underline":false},{"t":"Coupe-ongles","u":"https://www.avril-beaute.fr/bebe/accessoires/coupe-ongles.html","has":false,"pid":null,"underline":false},{"t":"Pince à épiler","u":"https://www.avril-beaute.fr/bebe/accessoires/pince-a-epiler.html","has":false,"pid":null,"underline":false},{"t":"Brosse & peigne","u":"https://www.avril-beaute.fr/bebe/accessoires/brosse-peigne.html","has":false,"pid":null,"underline":false}],"id":"root-3-1"},"root-3":{"title":"Famille","image":"https://www.avril-beaute.fr/media/catalog/category/11-_Cat_gorie_FAMILLE_copie_2_retouch_2_18.jpg","see_all":"https://www.avril-beaute.fr/bebe.html","items":[{"t":"Soin & nettoyant haute tolérance","u":"https://www.avril-beaute.fr/bebe/nettoyant.html","has":true,"pid":"root-3-0","underline":false},{"t":"Accessoires","u":"https://www.avril-beaute.fr/bebe/accessoires.html","has":true,"pid":"root-3-1","underline":false}],"id":"root-3"},"root-4-0":{"title":"Coffrets cadeaux","image":"https://www.avril-beaute.fr/media/catalog/category/7-_Cat_gorie_CADEAUX_copie_2_retouch__2.jpg","see_all":"https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux.html","items":[{"t":"Moins de 20€","u":"https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux/20.html","has":false,"pid":null,"underline":false},{"t":"Moins de 30€","u":"https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux/30.html","has":false,"pid":null,"underline":false},{"t":"Moins de 40€","u":"https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux/40.html","has":false,"pid":null,"underline":false},{"t":"Moins de 60€","u":"https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux/60.html","has":false,"pid":null,"underline":false}],"id":"root-4-0"},"root-4":{"title":"Cadeaux","image":"https://www.avril-beaute.fr/media/catalog/category/7-_Cat_gorie_CADEAUX_copie_2_retouch_.jpg","see_all":"https://www.avril-beaute.fr/cadeaux/cadeaux.html","items":[{"t":"Coffrets cadeaux","u":"https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux.html","has":true,"pid":"root-4-0","underline":false},{"t":"Emballage cadeau","u":"https://www.avril-beaute.fr/cadeaux/cadeaux/emballage-cadeau.html","has":false,"pid":null,"underline":false},{"t":"Carte cadeau","u":"https://www.avril-beaute.fr/cadeaux/cadeaux/carte-cadeau.html","has":false,"pid":null,"underline":false}],"id":"root-4"},"root-5":{"title":"Nouveau","image":"https://www.avril-beaute.fr/media/catalog/category/9-_Cat_gorie_NOUVEAU_copie.jpg","see_all":"https://www.avril-beaute.fr/nouveau.html","items":[{"t":"Nouveautés maquillage","u":"https://www.avril-beaute.fr/nouveau/nouveautes-maquillage.html","has":false,"pid":null,"underline":false},{"t":"Nouveautés soin","u":"https://www.avril-beaute.fr/nouveau/nouveautes-soin.html","has":false,"pid":null,"underline":false}],"id":"root-5"},"root":{"title":"","image":null,"see_all":null,"items":[{"t":"Soin","u":"https://www.avril-beaute.fr/soin.html","has":true,"pid":"root-0","underline":false},{"t":"Maquillage","u":"https://www.avril-beaute.fr/maquillage.html","has":true,"pid":"root-1","underline":false},{"t":"Homme","u":"https://www.avril-beaute.fr/homme.html","has":true,"pid":"root-2","underline":false},{"t":"Famille","u":"https://www.avril-beaute.fr/bebe.html","has":true,"pid":"root-3","underline":false},{"t":"Cadeaux","u":"https://www.avril-beaute.fr/cadeaux/cadeaux.html","has":true,"pid":"root-4","underline":false},{"t":"Nouveau","u":"https://www.avril-beaute.fr/nouveau.html","has":true,"pid":"root-5","underline":true},{"t":"Déjà Noël","u":"https://www.avril-beaute.fr/animation/noel/c-est-noel.html","has":false,"pid":null,"underline":false}],"id":"root"}}, openPanel(id){ if(id && this.panels[id]) { this.stack.push(id); } }, back(){ if(this.stack.length>1) { const path = this.getMenuPath(); window.dataLayer = window.dataLayer || []; window.dataLayer.push({ "event": "nav_menu_return", "event_parameter": path, "event_value": "" }); this.stack.pop(); } }, current(){ return this.stack[this.stack.length-1] }, closeAll(){ this.stack = ["root"] }, getMenuPath() { return this.stack .filter(id => id !== "root") .map(id => this.panels[id].title) .join(" > "); }, pushMenuClick(itemTitle, url) { const path = this.getMenuPath(); window.dataLayer = window.dataLayer || []; window.dataLayer.push({ "event": "nav_menu_click", "event_parameter": path !== "" ? path : "root", "event_value": url }); } }'
x-id="['panel']"
>
<!-- LEVEL 1 (root) -->
<section
class="panel level-1"
role="region"
:aria-labelledby="$id('panel')"
x-show="current()==='root'"
>
<ul>
<template x-for="item in panels.root.items" :key="item.t + (item.pid || '')">
<li class="flex items-center justify-between py-4 px-2">
<template x-if="item.u && !item.has">
<a class="font-abhayalibre text-left flex-1 text-22 font-extrabold" :href="item.u"
@click="pushMenuClick(item.t, item.u)">
<span :class="{ 'underline-effect underline-effect-bg_secondary': item.underline }" x-text="item.t"></span>
</a>
</template>
<template x-if="!item.u || item.has">
<button
type="button"
class="font-abhayalibre text-left flex-1 text-22 font-extrabold"
@click="openPanel(item.pid)"
aria-haspopup="true"
:aria-expanded="current()===item.pid"
>
<span :class="{ 'underline-effect underline-effect-bg_secondary': item.underline }" x-text="item.t"></span>
</button>
</template>
<template x-if="item.has">
<button
type="button"
class="ml-3 shrink-0"
@click="openPanel(item.pid)"
:aria-label="'Open\u0020' + item.t"
>
<div class="w-8 h-8">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg>
</div>
</button>
</template>
</li>
</template>
</ul>
</section>
<!-- LEVELS 2+ : full-screen overlay panels, teleported -->
<template x-for="(panel, pid) in panels" :key="pid">
<template x-if="pid !== 'root'">
<template x-teleport=".megamenu-burger-mobile">
<section
class="panel fixed inset-0 bg-background z-20 flex flex-col"
role="region"
aria-live="polite"
x-show="current()===pid"
x-transition.opacity
>
<header class="flex flex-col items-center px-4 pt-3 pb-12 border-b"
:style="panel.image ? { backgroundImage: 'url(' + panel.image + ')', backgroundSize: 'cover', backgroundPosition: 'center' } : {}"
>
<div class="flex justify-between items-center w-full">
<div class="flex items-center gap-1"
@click="back()"
aria-label="Retour"
role="button" tabindex="0">
<div class="w-8 h-8 rotate-180">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg>
</div>
<span>Retour</span>
</div>
<a
@click="closeAll(); $dispatch('toggle-mobile-megamenu');"
class="flex items-center justify-center cursor-pointer ml-auto"
aria-label="Fermer"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="p-4" width="60" height="60" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
</svg>
</a>
</div>
<div class="w-full text-center">
<a class="font-abhayalibre text-4xl font-extrabold underline"
:href="panel.see_all"
@click="pushMenuClick(panel.title, panel.see_all)"
x-text="panel.title">
</a>
</div>
</header>
<button class="relative w-full min-w-0 p-4" @click.prevent=" searchOpen = !searchOpen; $dispatch('search-open', { menu_path: getMenuPath() }); "
aria-haspopup="true"
:aria-expanded="searchOpen">
<label class="sr-only" :for="'search-' + panel.id">
Recherchez ici </label>
<input type="search" :id="'search-' + panel.id"
class="no-search-cancel w-full pointer-events-none py-6 border-0 rounded-md placeholder:text-sm"
placeholder="Recherchez ici"
readonly
tabindex="-1"
/>
<div class="p-1 pointer-events-none absolute top-1/2 -translate-y-1/2 right-6"
aria-label="Search"
tabindex="-1"
>
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewbox="0 0 28 28" fill="none" aria-hidden="true">
<path d="M21.0003 21.0003L17.625 17.625" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13.2218 19.4437C16.6581 19.4437 19.4437 16.6581 19.4437 13.2218C19.4437 9.78561 16.6581 7 13.2218 7C9.78561 7 7 9.78561 7 13.2218C7 16.6581 9.78561 19.4437 13.2218 19.4437Z" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
</button>
<ul class="flex-1">
<template x-for="item in panel.items" :key="item.t + (item.pid || '')">
<li class="flex items-center justify-between py-4 px-4">
<template x-if="item.u && !item.has">
<a class="block font-abhayalibre flex-1 text-22 font-extrabold" :href="item.u"
@click="pushMenuClick(item.t, item.u)"
x-text="item.t"></a>
</template>
<template x-if="!item.u || item.has">
<button
type="button"
class="font-abhayalibre text-left flex-1 text-22 font-extrabold"
@click="openPanel(item.pid)"
aria-haspopup="true"
:aria-expanded="current()===item.pid"
x-text="item.t"
></button>
</template>
<template x-if="item.has">
<button
type="button"
class="ml-3 shrink-0"
@click="openPanel(item.pid)"
:aria-label="'Open\u0020' + item.t"
>
<div class="w-8 h-8">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg>
</div>
</button>
</template>
</li>
</template>
</ul>
<template x-if="panel.see_all">
<div class="px-4 py-3 mb-6">
<a class="inline-flex underline items-center gap-2" :href="panel.see_all" rel="nofollow"
@click="pushMenuClick(panel.title, panel.see_all)">
Voir tout <span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="16" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/>
</svg>
</span>
</a>
</div>
</template>
</section>
</template>
</template>
</template>
</div>
</div>
</div>
<div :class="{ 'hidden' : !open }" class="flex flex-col bg-white flex-1" x-cloak>
<div class="block lg:hidden flex flex-col py-4 flex-1">
<ul>
<li x-data="{ open: false }" class="relative w-full px-6">
<button
@click="open = !open"
class="flex items-center justify-between w-full mr-8">
<span>Le projet Avril</span>
<div class="w-8 h-8 transition-transform duration-300" :class="open ? 'rotate-90' : ''">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg>
</div>
</button>
<div
x-show="open"
@click.away="open = false"
x-transition>
<style>#html-body [data-pb-style=Y9H1S33]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="Y9H1S33"><div data-content-type="text" data-appearance="default" data-element="main"><p id="Q24S9MD" style="line-height: 2;"><a tabindex="0" title="Nos produits" href="/le-projet-avril-nos-produits">Nos produits</a></p>
<p style="line-height: 2;"><a tabindex="0" title="Nos engagements" href="/le-projet-avril-environnement">Nos engagements</a></p>
<p style="line-height: 2;"><a tabindex="0" title="Le collectif Avril" href="/le-projet-avril-collectif">Le collectif Avril</a></p></div></div></div> </div>
</li>
<li class="w-full px-6 py-4">
<a href="https://www.avril-beaute.fr/qui-est-avril-marque-cosmetique-bio" class="flex items-center"
title="Notre histoire">
<span>Notre histoire</span>
</a>
</li>
<hr class="h-px mb-6 mt-4 bg-gray-200 border-0 dark:bg-gray-700 w-11/12 mx-auto">
<li class="w-full px-4 pb-4">
<a href="https://www.avril-beaute.fr/customer/account/" class="flex items-center gap-2"
title="Mon compte">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 13 14" fill="none" class="w-4 h-4 stroke-[1.5]" aria-hidden="true">
<path d="M6.08333 7.41667C7.92428 7.41667 9.41667 5.92428 9.41667 4.08333C9.41667 2.24238 7.92428 0.75 6.08333 0.75C4.24238 0.75 2.75 2.24238 2.75 4.08333C2.75 5.92428 4.24238 7.41667 6.08333 7.41667Z" stroke="#1D1D1B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11.4167 12.7493C11.4167 11.3349 10.8548 9.97831 9.85457 8.97811C8.85438 7.97792 7.49782 7.41602 6.08333 7.41602C4.66885 7.41602 3.31229 7.97792 2.3121 8.97811C1.3119 9.97831 0.75 11.3349 0.75 12.7493" stroke="#1D1D1B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>Mon compte</span>
</a>
</li>
<li class="w-full px-4 pb-4">
<a href="https://www.avril-beaute.fr/wishlist/" class="flex items-center gap-2"
title="Vos favoris">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 16 14" fill="" class="w-4 h-4 fill-transparent stroke-[1.1]" aria-hidden="true">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>Vos favoris</span>
</a>
</li>
<li class="w-full px-4 pb-4">
<a href="https://www.avril-beaute.fr/contact/" class="flex items-center gap-2"
title="Nous contacter">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke="currentColor" class="w-4 h-4 stroke-[1.4]" width="24" height="24" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"/>
</svg>
<span>Nous contacter</span>
</a>
</li>
<li class="w-full px-4 pb-4">
<a href="https://www.avril-beaute.fr/points-de-vente" class="flex items-center gap-2"
title="Nos boutiques">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 18 18" fill="none" class="w-4 h-4 stroke-[1.3]" aria-hidden="true">
<path d="M11.2485 15.7469V11.9977C11.2485 11.7988 11.1695 11.6081 11.0289 11.4675C10.8883 11.3268 10.6975 11.2478 10.4987 11.2478H7.49935C7.30048 11.2478 7.10976 11.3268 6.96914 11.4675C6.82852 11.6081 6.74952 11.7988 6.74952 11.9977V15.7469M13.3285 7.73113C13.1722 7.58149 12.9642 7.49796 12.7478 7.49796C12.5314 7.49796 12.3234 7.58149 12.1671 7.73113C11.8184 8.06369 11.3551 8.24923 10.8732 8.24923C10.3914 8.24923 9.92805 8.06369 9.57939 7.73113C9.42311 7.58171 9.21523 7.49832 8.99902 7.49832C8.7828 7.49832 8.57492 7.58171 8.41865 7.73113C8.06994 8.06391 7.60645 8.24958 7.12444 8.24958C6.64242 8.24958 6.17893 8.06391 5.83023 7.73113C5.67391 7.58149 5.46587 7.49796 5.24948 7.49796C5.03309 7.49796 4.82505 7.58149 4.66874 7.73113C4.33194 8.05251 3.88762 8.23709 3.42224 8.24892C2.95685 8.26076 2.50372 8.099 2.15103 7.79514C1.79834 7.49129 1.57133 7.06707 1.51418 6.60506C1.45704 6.14304 1.57384 5.6763 1.84187 5.29566L4.00813 2.15835C4.14558 1.95553 4.33063 1.78948 4.5471 1.67471C4.76356 1.55994 5.00485 1.49995 5.24986 1.5H12.7482C12.9925 1.49991 13.2331 1.55949 13.4491 1.67358C13.6651 1.78766 13.85 1.95279 13.9876 2.15461L16.1584 5.29791C16.4265 5.67885 16.5432 6.14595 16.4857 6.6082C16.4282 7.07045 16.2006 7.49474 15.8474 7.79838C15.4941 8.10202 15.0405 8.26326 14.5748 8.25069C14.1092 8.23812 13.6649 8.05263 13.3285 7.73038" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3 8.21094V14.2471C3 14.6448 3.158 15.0263 3.43924 15.3075C3.72048 15.5888 4.10193 15.7468 4.49966 15.7468H13.4976C13.8954 15.7468 14.2768 15.5888 14.5581 15.3075C14.8393 15.0263 14.9973 14.6448 14.9973 14.2471V8.21094" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>Nos boutiques</span>
</a>
</li>
<li class="w-full px-4 pb-4">
<a href="https://www.avril-pro.fr/" class="flex items-center gap-2"
title="Espace Pro">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke="currentColor" class="w-4 h-4 stroke-[1.5]" width="24" height="24" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"/>
</svg>
<span>Espace Pro</span>
</a>
</li>
</ul>
<div class="px-6 pt-4 pb-6">
<div x-data="{ open: false }" class="w-full pr-4">
<div class="relative text-right">
<div class="flex justify-start">
<button
@click="open = !open"
@click.outside="open = false"
@keydown.window.escape="open = false"
type="button"
class="w-full border-none p-0 text-sm shadow-none leading-[140%] font-light font-sans min-h-fit flex items-center pr-5 gap-2"
:aria-expanded="open.toString()"
aria-haspopup="true"
>
Français
<img src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/svg/FR.svg"
alt=""
width="17"
height="17"
aria-hidden="true"
loading="lazy" />
<span
:class="open ? 'inline-block rotate-90 transition-transform duration-300' : 'inline-block -rotate-90 transition-transform duration-300'"
>
<svg xmlns="http://www.w3.org/2000/svg" width="5" height="10" viewbox="0 0 7 12" fill="none" aria-hidden="true" class="block">
<path d="M6 1L1 6L6 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
</button>
</div>
<nav
x-cloak
x-show="open"
x-transition.origin.top.left
class="absolute mdonly:left-0 md:right-0 top-full z-20 w-auto py-2 mt-1 overflow-auto origin-top-left rounded-sm shadow-lg lg:mt-3 bg-container-lighter"
>
<div class="my-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
<a
x-data
@click.prevent="$el.setAttribute('href', atob($el.dataset.enc)); window.location.href = atob($el.dataset.enc)"
href="#"
role="link"
data-enc="aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL3N0b3Jlcy9zdG9yZS9yZWRpcmVjdC9fX19zdG9yZS9iMmNfZW4vX19fZnJvbV9zdG9yZS9iMmNfZnIvdWVuYy9hSFIwY0hNNkx5OTNkM2N1WVhaeWFXd3RiM0puWVc1cFl5NWpiMjB2WVhCd2JHVXRkRzkxWTJndGFXTnZiaTV3Ym1jX1gxOWZjM1J2Y21VOVlqSmpYMlZ1Lw=="
class="px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100 leading-[140%] font-light font-sans text-sm flex items-center gap-4 md:justify-end"
>
Anglais <img src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/svg/EN.svg"
alt=""
width="17"
height="17"
aria-hidden="true"
loading="lazy" />
</a>
<a
x-data
@click.prevent="$el.setAttribute('href', atob($el.dataset.enc)); window.location.href = atob($el.dataset.enc)"
href="#"
role="link"
data-enc="aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL3N0b3Jlcy9zdG9yZS9yZWRpcmVjdC9fX19zdG9yZS9iMmNfZXMvX19fZnJvbV9zdG9yZS9iMmNfZnIvdWVuYy9hSFIwY0hNNkx5OTNkM2N1WVhaeWFXd3RZbWx2TG1WekwyRndjR3hsTFhSdmRXTm9MV2xqYjI0dWNHNW5QMTlmWDNOMGIzSmxQV0l5WTE5bGN3fn4v"
class="px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100 leading-[140%] font-light font-sans text-sm flex items-center gap-4 md:justify-end"
>
Espagnol <img src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/svg/ES.svg"
alt=""
width="17"
height="17"
aria-hidden="true"
loading="lazy" />
</a>
</div>
</nav>
</div>
</div>
</div><div class="flex justify-center items-center flex-1 mb-6"><div class="fixed-logo order-2 lg:order-1 w-auto">
<a
class="flex items-center justify-center text-xl font-medium tracking-wide text-gray-800 no-underline hover:no-underline font-title w-[60px] h-[52px] md:w-[78px] md:h-[68px] mx-auto"
href="https://www.avril-beaute.fr/"
aria-label="Go to Home page"
>
<img
src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/svg/logo.svg"
alt="Avril"
width="71" height="62" loading="eager"
/>
</a>
</div>
<div class="sticky-logo hidden order-2 lg:order-1 w-auto">
<a
class="flex items-center justify-center text-xl font-medium tracking-wide text-gray-800 no-underline hover:no-underline font-title w-[30px] h-[30px] mx-auto"
href="https://www.avril-beaute.fr/"
aria-label="Go to Home page"
>
<img
src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/svg/logo-floral.svg"
alt="Avril"
width="30"
height="30"
loading="eager"
/>
</a>
</div>
</div></div> </div>
</div>
</div>
<script>
'use strict';
const initMegaMenuMobile = () => ({ open: false });
</script>
<button
id="menu-search-icon"
class="block lg:hidden p-1 order-2 lg:order-0"
@click.prevent=" searchOpen = !searchOpen; $dispatch('search-open'); "
aria-label="Toggle search form"
aria-haspopup="true"
:aria-expanded="searchOpen"
x-ref="searchButton"
>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewbox="0 0 28 28" fill="none" class="w-full h-full" aria-hidden="true">
<path d="M21.0003 21.0003L17.625 17.625" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13.2218 19.4437C16.6581 19.4437 19.4437 16.6581 19.4437 13.2218C19.4437 9.78561 16.6581 7 13.2218 7C9.78561 7 7 9.78561 7 13.2218C7 16.6581 9.78561 19.4437 13.2218 19.4437Z" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
<div class="header-links flex items-center gap-2 lg:gap-1 order-3 lg:-mr-1">
<!--Search Icon-->
<button
id="menu-search-icon"
class="hidden lg:block"
@click.prevent=" searchOpen = !searchOpen; $dispatch('search-open'); "
aria-label="Toggle search form"
aria-haspopup="true"
:aria-expanded="searchOpen"
x-ref="searchButton"
>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewbox="0 0 28 28" fill="none" class="w-full h-full" aria-hidden="true">
<path d="M21.0003 21.0003L17.625 17.625" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13.2218 19.4437C16.6581 19.4437 19.4437 16.6581 19.4437 13.2218C19.4437 9.78561 16.6581 7 13.2218 7C9.78561 7 7 9.78561 7 13.2218C7 16.6581 9.78561 19.4437 13.2218 19.4437Z" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<!-- Additional Header Elements -->
<a href="https://www.avril-beaute.fr/points-de-vente" title="Trouver un magasin"
class="hidden md:flex justify-center items-center flex-col">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 18 18" fill="none" class="w-6 h-6 max-w-full" aria-hidden="true">
<path d="M11.2485 15.7469V11.9977C11.2485 11.7988 11.1695 11.6081 11.0289 11.4675C10.8883 11.3268 10.6975 11.2478 10.4987 11.2478H7.49935C7.30048 11.2478 7.10976 11.3268 6.96914 11.4675C6.82852 11.6081 6.74952 11.7988 6.74952 11.9977V15.7469M13.3285 7.73113C13.1722 7.58149 12.9642 7.49796 12.7478 7.49796C12.5314 7.49796 12.3234 7.58149 12.1671 7.73113C11.8184 8.06369 11.3551 8.24923 10.8732 8.24923C10.3914 8.24923 9.92805 8.06369 9.57939 7.73113C9.42311 7.58171 9.21523 7.49832 8.99902 7.49832C8.7828 7.49832 8.57492 7.58171 8.41865 7.73113C8.06994 8.06391 7.60645 8.24958 7.12444 8.24958C6.64242 8.24958 6.17893 8.06391 5.83023 7.73113C5.67391 7.58149 5.46587 7.49796 5.24948 7.49796C5.03309 7.49796 4.82505 7.58149 4.66874 7.73113C4.33194 8.05251 3.88762 8.23709 3.42224 8.24892C2.95685 8.26076 2.50372 8.099 2.15103 7.79514C1.79834 7.49129 1.57133 7.06707 1.51418 6.60506C1.45704 6.14304 1.57384 5.6763 1.84187 5.29566L4.00813 2.15835C4.14558 1.95553 4.33063 1.78948 4.5471 1.67471C4.76356 1.55994 5.00485 1.49995 5.24986 1.5H12.7482C12.9925 1.49991 13.2331 1.55949 13.4491 1.67358C13.6651 1.78766 13.85 1.95279 13.9876 2.15461L16.1584 5.29791C16.4265 5.67885 16.5432 6.14595 16.4857 6.6082C16.4282 7.07045 16.2006 7.49474 15.8474 7.79838C15.4941 8.10202 15.0405 8.26326 14.5748 8.25069C14.1092 8.23812 13.6649 8.05263 13.3285 7.73038" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3 8.21094V14.2471C3 14.6448 3.158 15.0263 3.43924 15.3075C3.72048 15.5888 4.10193 15.7468 4.49966 15.7468H13.4976C13.8954 15.7468 14.2768 15.5888 14.5581 15.3075C14.8393 15.0263 14.9973 14.6448 14.9973 14.2471V8.21094" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<!--Customer Icon & Dropdown-->
<!-- BLOCK header.customer -->
<div
x-cloak
id="customer-menu-drawer"
x-data="initCustomerMenuDrawer()"
@toggle-register-form.window="showRegisterForm = $event.detail"
@keydown.escape="closeCustomerMenuDrawer"
class="relative inline-block"
>
<button
type="button"
id="customer-menu"
class="block w-full h-full"
@click="open = !open"
:aria-expanded="open ? 'true' : 'false'"
aria-label="Mon compte"
aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewbox="0 0 28 28" fill="none" class="w-full h-full stroke-[1.1]" aria-hidden="true">
<path d="M14 14.7503C16.4162 14.7503 18.375 12.7915 18.375 10.3751C18.375 7.95881 16.4162 6 14 6C11.5838 6 9.625 7.95881 9.625 10.3751C9.625 12.7915 11.5838 14.7503 14 14.7503Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M21 21.7502C21 19.8936 20.2625 18.1131 18.9497 16.8003C17.637 15.4875 15.8565 14.75 14 14.75C12.1435 14.75 10.363 15.4875 9.05025 16.8003C7.7375 18.1131 7 19.8936 7 21.7502" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div role="dialog"
aria-labelledby="customer-drawer-title"
aria-modal="true"
:aria-hidden="!open"
:class="open ? 'fixed bottom-0 top-24 md:top-0 right-0 z-50 w-full md:w-[515px] max-w-full' : 'hidden'"
class="flex">
<div class="backdrop"
x-show="open"
x-transition:enter="ease-in-out duration-500"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="ease-in-out duration-500"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
role="button"
@click="closeCustomerMenuDrawer"
aria-label="Fermer"></div>
<div class="relative bg-background shadow-2xl rounded-xl md:rounded-none w-full max-w-full z-20"
x-show="open"
x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700"
x-transition:enter-start="translate-x-full"
x-transition:enter-end="translate-x-0"
x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700"
x-transition:leave-start="translate-x-0"
x-transition:leave-end="translate-x-full"
role="region"
:tabindex="open ? 0 : -1"
aria-label="Customer Menu"
>
<div class="flex flex-col text-center h-full max-h-screen shadow-xl overflow-y-auto pb-20">
<div x-show="!showRegisterForm" x-transition>
<div class="pt-20 pb-8 bg-white rounded-xl px-6 flex flex-col">
<div class="mb-3">
<p class="text-28 font-abhayalibre font-bold">Nouveau client ?</p>
</div>
<a href="#" class="btn btn-primary mx-auto text-sm !px-16 !py-3"
@click.prevent="$dispatch('toggle-register-form', true)">
Créer mon compte </a>
</div>
</div>
<div x-show="showRegisterForm" x-transition>
<div class="pt-10 pb-8 px-6 flex flex-col">
<a href="#" class="text-sm text-left mb-4"
@click.prevent="$dispatch('toggle-register-form', false)">
< Retour </a>
<div class="mb-3">
<p class="text-28 font-abhayalibre font-bold">Créer mon compte</p>
</div>
<form class="form create account form-create-account"
action="https://www.avril-beaute.fr/customer/ajax/createpost/"
x-data="Object.assign(hyva.formValidationAjax($el), initForm_6acf38a494018($el))"
@submit.prevent="submitForm()"
id="header-customer-form-register"
method="post" enctype="multipart/form-data" autocomplete="off"
>
<input name="form_key" type="hidden" value="ThSMex3EkPNfSLKM" /> <div class="control">
<input type="hidden"
value=""
name="g-recaptcha-response"
>
</div>
<fieldset class="w-full mx-auto">
<div class="legend text-sm text-center w-full mb-4 font-light">
<span>Informations personnelles</span>
</div>
<input type="hidden" name="success_url" value="">
<input type="hidden" name="error_url" value="">
<div class="field field-reserved gender required">
<div class="control">
<select id="header_gender"
name="gender"
title="Genre"
class="form-select"
required>
<option value="1"
>
M </option>
<option value="2"
>
Mme </option>
</select>
</div>
</div>
<div class="field field-reserved w-full field-name-firstname required">
<div class="control">
<input type="text" id="header_firstname"
name="firstname"
value=""
required
placeholder="Prénom*"
title="Prénom"
class="form-input w-full required-entry"
@input.debounce="onChange"
required>
</div>
</div>
<div class="field field-reserved w-full field-name-lastname required">
<div class="control">
<input type="text" id="header_lastname"
name="lastname"
required
value=""
placeholder="Nom*"
title="Nom"
class="form-input w-full required-entry"
@input.debounce="onChange"
required>
</div>
</div>
<div class="legend text-sm text-center w-full my-4 font-light">
<span>Informations de connexion</span>
</div>
<div class="field field-reserved required">
<div class="control">
<input
type="email"
name="email"
autocomplete="email"
id="header_email_address"
required
value=""
placeholder="E-mail*"
class="form-input w-full"
@input.debounce="onChange"
/>
</div>
</div>
<!-- Password fields remain unchanged -->
<div class="field field-reserved required">
<div class="flex flex-wrap gap-4 mb-2.5">
<div class="control relative w-full">
<div class="sr-only" aria-live="polite">
<template x-if="!showPassword">
<span>Password hidden</span>
</template>
<template x-if="showPassword">
<span>Password shown</span>
</template>
</div>
<input
:type="showPassword ? 'text' : 'password'"
type="password"
id="header_password"
name="password"
placeholder="Mot de passe*"
title="Mot de passe"
minlength="8"
class="form-input"
required
data-validate='{"password-strength": {"minCharacterSets": 3, "minimumPasswordLength": 8}}'
@input.debounce="onChange"
autocomplete="off"
>
<button
type="button"
:aria-pressed="showPassword ? true : false"
x-on:click="showPassword = !showPassword"
class="absolute top-1/2 right-0 -translate-y-1/2 px-4 py-3"
:aria-label="showPassword ? 'Hide\u0020Password' : 'Show\u0020Password'"
>
<template x-if="!showPassword">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="14" viewbox="0 0 22 16" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M1.06251 8.34738C0.979165 8.12287 0.979165 7.8759 1.06251 7.65138C1.87421 5.68324 3.25202 4.00042 5.02128 2.81628C6.79053 1.63214 8.87155 1 11.0005 1C13.1295 1 15.2105 1.63214 16.9797 2.81628C18.749 4.00042 20.1268 5.68324 20.9385 7.65138C21.0218 7.8759 21.0218 8.12287 20.9385 8.34738C20.1268 10.3155 18.749 11.9983 16.9797 13.1825C15.2105 14.3666 13.1295 14.9988 11.0005 14.9988C8.87155 14.9988 6.79053 14.3666 5.02128 13.1825C3.25202 11.9983 1.87421 10.3155 1.06251 8.34738Z" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 11C12.6569 11 14 9.65685 14 8C14 6.34315 12.6569 5 11 5C9.34315 5 8 6.34315 8 8C8 9.65685 9.34315 11 11 11Z" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>
<template x-if="showPassword">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="14" viewbox="0 0 22 16" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M1.06251 8.34738C0.979165 8.12287 0.979165 7.8759 1.06251 7.65138C1.87421 5.68324 3.25202 4.00042 5.02128 2.81628C6.79053 1.63214 8.87155 1 11.0005 1C13.1295 1 15.2105 1.63214 16.9797 2.81628C18.749 4.00042 20.1268 5.68324 20.9385 7.65138C21.0218 7.8759 21.0218 8.12287 20.9385 8.34738C20.1268 10.3155 18.749 11.9983 16.9797 13.1825C15.2105 14.3666 13.1295 14.9988 11.0005 14.9988C8.87155 14.9988 6.79053 14.3666 5.02128 13.1825C3.25202 11.9983 1.87421 10.3155 1.06251 8.34738Z" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 11C12.6569 11 14 9.65685 14 8C14 6.34315 12.6569 5 11 5C9.34315 5 8 6.34315 8 8C8 9.65685 9.34315 11 11 11Z" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>
</button>
</div>
<ul class="password-criteria text-left !pb-0 !mb-0 -mt-2.5">
<li data-criterion="length" class="flex items-center gap-1.5">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewbox="0 0 16 15" fill="none" class="text-gray_avril-100" aria-hidden="true">
<path d="M8.00065 14.1673C11.6825 14.1673 14.6673 11.1825 14.6673 7.50065C14.6673 3.81875 11.6825 0.833984 8.00065 0.833984C4.31875 0.833984 1.33398 3.81875 1.33398 7.50065C1.33398 11.1825 4.31875 14.1673 8.00065 14.1673Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6 7.5013L7.33333 8.83464L10 6.16797" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
8 caractères minimum </li>
<li data-criterion="uppercase" class="flex items-center gap-1.5">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewbox="0 0 16 15" fill="none" class="text-gray_avril-100" aria-hidden="true">
<path d="M8.00065 14.1673C11.6825 14.1673 14.6673 11.1825 14.6673 7.50065C14.6673 3.81875 11.6825 0.833984 8.00065 0.833984C4.31875 0.833984 1.33398 3.81875 1.33398 7.50065C1.33398 11.1825 4.31875 14.1673 8.00065 14.1673Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6 7.5013L7.33333 8.83464L10 6.16797" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
1 lettre majuscule </li>
<li data-criterion="lowercase" class="flex items-center gap-1.5">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewbox="0 0 16 15" fill="none" class="text-gray_avril-100" aria-hidden="true">
<path d="M8.00065 14.1673C11.6825 14.1673 14.6673 11.1825 14.6673 7.50065C14.6673 3.81875 11.6825 0.833984 8.00065 0.833984C4.31875 0.833984 1.33398 3.81875 1.33398 7.50065C1.33398 11.1825 4.31875 14.1673 8.00065 14.1673Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6 7.5013L7.33333 8.83464L10 6.16797" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
1 lettre minuscule </li>
<li data-criterion="number" class="flex items-center gap-1.5">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewbox="0 0 16 15" fill="none" class="text-gray_avril-100" aria-hidden="true">
<path d="M8.00065 14.1673C11.6825 14.1673 14.6673 11.1825 14.6673 7.50065C14.6673 3.81875 11.6825 0.833984 8.00065 0.833984C4.31875 0.833984 1.33398 3.81875 1.33398 7.50065C1.33398 11.1825 4.31875 14.1673 8.00065 14.1673Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6 7.5013L7.33333 8.83464L10 6.16797" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
1 chiffre </li>
</ul>
</div>
</div>
<!-- Password confirm -->
<div class="field field-reserved required">
<div class="control relative w-full">
<div class="sr-only" aria-live="polite">
<template x-if="!showPasswordConfirm">
<span>Confirm password hidden</span>
</template>
<template x-if="showPasswordConfirm">
<span>confirm password shown</span>
</template>
</div>
<input
:type="showPasswordConfirm ? 'text' : 'password'"
type="password"
name="password_confirmation"
placeholder="Confirmer le mot de passe*"
title="Confirmer le mot de passe"
id="header_password-confirmation"
data-validate='{"equalTo": "password"}'
@input.debounce="onChange"
required
class="form-input"
autocomplete="off"
>
<button
type="button"
x-on:click="showPasswordConfirm = !showPasswordConfirm"
:aria-pressed="showPasswordConfirm ? true : false"
class="absolute top-1/2 right-0 -translate-y-1/2 px-4 py-3"
:aria-label=" showPasswordConfirm ? 'Hide\u0020Password' : 'Show\u0020Password' "
>
<template x-if="!showPasswordConfirm">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="14" viewbox="0 0 22 16" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M1.06251 8.34738C0.979165 8.12287 0.979165 7.8759 1.06251 7.65138C1.87421 5.68324 3.25202 4.00042 5.02128 2.81628C6.79053 1.63214 8.87155 1 11.0005 1C13.1295 1 15.2105 1.63214 16.9797 2.81628C18.749 4.00042 20.1268 5.68324 20.9385 7.65138C21.0218 7.8759 21.0218 8.12287 20.9385 8.34738C20.1268 10.3155 18.749 11.9983 16.9797 13.1825C15.2105 14.3666 13.1295 14.9988 11.0005 14.9988C8.87155 14.9988 6.79053 14.3666 5.02128 13.1825C3.25202 11.9983 1.87421 10.3155 1.06251 8.34738Z" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 11C12.6569 11 14 9.65685 14 8C14 6.34315 12.6569 5 11 5C9.34315 5 8 6.34315 8 8C8 9.65685 9.34315 11 11 11Z" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>
<template x-if="showPasswordConfirm">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="14" viewbox="0 0 22 16" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M1.06251 8.34738C0.979165 8.12287 0.979165 7.8759 1.06251 7.65138C1.87421 5.68324 3.25202 4.00042 5.02128 2.81628C6.79053 1.63214 8.87155 1 11.0005 1C13.1295 1 15.2105 1.63214 16.9797 2.81628C18.749 4.00042 20.1268 5.68324 20.9385 7.65138C21.0218 7.8759 21.0218 8.12287 20.9385 8.34738C20.1268 10.3155 18.749 11.9983 16.9797 13.1825C15.2105 14.3666 13.1295 14.9988 11.0005 14.9988C8.87155 14.9988 6.79053 14.3666 5.02128 13.1825C3.25202 11.9983 1.87421 10.3155 1.06251 8.34738Z" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 11C12.6569 11 14 9.65685 14 8C14 6.34315 12.6569 5 11 5C9.34315 5 8 6.34315 8 8C8 9.65685 9.34315 11 11 11Z" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>
</button>
</div>
</div>
<div class="field sponsorship text-left">
<div class="legend text-sm text-center w-full my-4 font-light">
<span>Programme de parrainage</span>
</div>
<p class="subtitle text-xs md:text-sm font-light text-left mb-2.5">
Vous avez découvert Avril grâce à un.e proche ? Indiquez ici son adresse e-mail </p>
<div class="field !mt-2.5">
<label for="header_sponsor_email_address" class="label hidden">
<span>Adresse e-mail de votre parrain</span>
</label>
<div class="control">
<input type="email"
name="sponsor_email_address"
autocomplete="email"
id="header_sponsor_email_address"
value=""
title="Adresse e-mail de votre parrain"
placeholder="Adresse e-mail de votre parrain"
class="input-text">
</div>
</div>
</div>
<div class="field choice newsletter !items-start">
<input type="checkbox" name="is_subscribed" class="mt-1"
title="Abonnez-vous à la lettre d’information" value="1"
id="header_is_subscribed">
<label
for="header_is_subscribed"
class="label text-sm font-light text-left">
<span>
Je souhaite recevoir les newsletters d'Avril (nouveautés produits, conseils bien-être, inspiration make-up et bien sûr nos avancées en faveur de l'environnement), personnalisées et suivies (ouverture, clics) </span>
</label>
</div>
<div class="actions-toolbar !border-0">
<div class="primary w-full">
<button type="submit"
:disabled="isLoading || disabledByRecaptcha"
x-bind:aria-busy="isLoading ? 'true' : 'false'"
class="mx-auto action submit primary btn btn-primary disabled:opacity-75"
title="Créer mon compte"
>
<span
x-text="isLoading ? 'Chargement\u0020en\u0020cours...' : 'Cr\u00E9er\u0020mon\u0020compte'"></span>
</button>
</div>
</div>
<div x-show="globalError" class="mt-4 text-red-600 text-sm" x-text="globalError"></div>
</fieldset>
</form>
<p class="font-light text-sm leading-[140%] text-gray_avril-100 text-left mt-6">
<span>
Les données personnelles recueillies sur ce formulaire font l'objet d'un traitement informatique opéré sous la responsabilité d'Avril. Pour plus d'informations sur les traitements de données personnelles, veuillez consulter notre </span>
<a href="https://www.avril-beaute.fr/politique-de-confidentialite/" class="underline">
Politique de confidentialité. </a>
</p>
</div>
<script>
function formValidationAjax(form, options = {}) {
const instance = hyva.formValidation(form, options);
// Never wrap the input; use existing parent as container
instance.getMessagesWrapper = function (field, messagesClassName) {
const container = field.element.parentElement;
let msgWrapper = container.querySelector(`.${messagesClassName}`);
if (!msgWrapper) {
msgWrapper = document.createElement('ul');
msgWrapper.classList.add(messagesClassName);
container.appendChild(msgWrapper);
}
return msgWrapper;
}
return instance;
}
hyva.formValidationAjax = formValidationAjax;
</script>
<script>
function initForm_6acf38a494018($el) {
return {
errors: 0,
hasCaptchaToken: 0,
globalError: '',
showPassword: false,
showPasswordConfirm: false,
disabledByRecaptcha: false,
isLoading: false,
clearErrors() {
this.globalError = '';
this.errors = 0;
$el.querySelectorAll('.field-error ul.messages li').forEach(el => el.remove());
},
submitForm() {
this.isLoading = true;
this.clearErrors();
this.validate().then(() => {
const $form = document.querySelector('#header\u002Dcustomer\u002Dform\u002Dregister');
if (!this.hasCaptchaToken) {
this.errors = 1;
const lockSubmitButton = () => {
$form.querySelector('[type="submit"]')?.setAttribute('disabled', true);
};
const failCaptcha = (errorMessage, exception = null) => {
this.errors = 1;
lockSubmitButton();
if (this.setErrorMessages) {
this.setErrorMessages([errorMessage]);
this.displayErrorMessage = true;
} else {
window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000);
}
if (exception) {
console.error(
exception ||
'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?'
);
}
};
const executeGreCaptcha = () => {
grecaptcha.ready(() => {
grecaptcha.execute(
'6LcFYF4qAAAAADImTOaJzO6csad6UWhk\u002D3kW7m4q',
{action: 'submit'}
).then((token) => {
const tokenElement = $form['g\u002Drecaptcha\u002Dresponse'];
if (tokenElement && token && token.length > 0) {
$form['g\u002Drecaptcha\u002Dresponse'].value = token;
this.errors = 0;
this.hasCaptchaToken = 1;
(this.submitForm || $form.submit).call(this);
} else {
failCaptcha(
tokenElement
? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
: 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
);
}
}).catch((exception) => {
failCaptcha(
'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.',
exception
);
});
});
};
if (window.grecaptcha) {
executeGreCaptcha();
} else {
const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LcFYF4qAAAAADImTOaJzO6csad6UWhk\u002D3kW7m4q";
const script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', recaptchaUrl);
document.head.appendChild(script);
script.addEventListener("load", executeGreCaptcha, false);
}
}
if (!this.hasCaptchaToken) {
this.isLoading = false;
return;
}
if (this.errors > 0) {
this.isLoading = false;
this.setErrorMessages('La\u0020validation\u0020ReCaptcha\u0020a\u0020\u00E9chou\u00E9,\u0020veuillez\u0020r\u00E9essayer');
return;
}
return this.doSubmit($form);
}).catch(() => {
this.isLoading = false;
});
},
async doSubmit($form) {
const formData = new FormData($form);
fetch($form.action, {
method: 'POST',
body: formData,
headers: {'X-Requested-With': 'XMLHttpRequest'},
})
.then(response => response.json())
.then(data => {
if (data.success) {
const successMsg = document.createElement('div');
successMsg.className = 'mb-4 text-green text-sm';
successMsg.textContent = data.message;
$form.prepend(successMsg);
const currentPath = window.location.pathname;
if (currentPath.includes('checkout/cart')) {
window.location.href = 'https://www.avril-beaute.fr/checkout/';
} else {
window.location.reload();
}
} else {
this.globalError = data.message || 'Une\u0020erreur\u0020s\u0027est\u0020produite.\u0020Veuillez\u0020r\u00E9essayez\u0020s\u2019il\u0020vous\u0020pla\u00EEt.';
this.isLoading = false;
}
})
.catch((error) => {
this.globalError = 'Une\u0020erreur\u0020s\u0027est\u0020produite.\u0020Veuillez\u0020r\u00E9essayez\u0020s\u2019il\u0020vous\u0020pla\u00EEt.';
console.error(error);
this.isLoading = false;
});
}
}
}
</script>
</div>
<div x-show="!showRegisterForm" x-transition>
<div id="container-header-login" class="px-6 mt-8">
<div class="mb-3">
<p id="customer-menu-drawer-title" class="text-28 font-abhayalibre font-bold">
<span>Déjà client ?</span>
</p>
</div>
<form id="header-customer-form-login"
x-data="initCustomerHeaderLoginForm_6acf38a494b15()"
@submit.prevent="submitForm()"
class="form header-form-login w-full">
<input name="form_key" type="hidden" value="ThSMex3EkPNfSLKM" />
<fieldset class="fieldset login">
<div class="field email required mb-4">
<input type="email" name="login[username]"
class="form-input w-full"
required
placeholder="E-mail*"
value=""
autocomplete="off"
/>
</div>
<div class="field password required">
<div class="relative w-full">
<input type="password" name="login[password]"
class="form-input w-full"
required
placeholder="Mot de passe*"
autocomplete="off"
:type="showPassword ? 'text' : 'password'"
/>
<button type="button" x-on:click="showPassword = !showPassword"
class="absolute top-1/2 right-0 -translate-y-1/2 px-4 py-3">
<template x-if="!showPassword">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="14" viewbox="0 0 22 16" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M1.06251 8.34738C0.979165 8.12287 0.979165 7.8759 1.06251 7.65138C1.87421 5.68324 3.25202 4.00042 5.02128 2.81628C6.79053 1.63214 8.87155 1 11.0005 1C13.1295 1 15.2105 1.63214 16.9797 2.81628C18.749 4.00042 20.1268 5.68324 20.9385 7.65138C21.0218 7.8759 21.0218 8.12287 20.9385 8.34738C20.1268 10.3155 18.749 11.9983 16.9797 13.1825C15.2105 14.3666 13.1295 14.9988 11.0005 14.9988C8.87155 14.9988 6.79053 14.3666 5.02128 13.1825C3.25202 11.9983 1.87421 10.3155 1.06251 8.34738Z" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 11C12.6569 11 14 9.65685 14 8C14 6.34315 12.6569 5 11 5C9.34315 5 8 6.34315 8 8C8 9.65685 9.34315 11 11 11Z" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>
<template x-if="showPassword">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="14" viewbox="0 0 22 16" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M1.06251 8.34738C0.979165 8.12287 0.979165 7.8759 1.06251 7.65138C1.87421 5.68324 3.25202 4.00042 5.02128 2.81628C6.79053 1.63214 8.87155 1 11.0005 1C13.1295 1 15.2105 1.63214 16.9797 2.81628C18.749 4.00042 20.1268 5.68324 20.9385 7.65138C21.0218 7.8759 21.0218 8.12287 20.9385 8.34738C20.1268 10.3155 18.749 11.9983 16.9797 13.1825C15.2105 14.3666 13.1295 14.9988 11.0005 14.9988C8.87155 14.9988 6.79053 14.3666 5.02128 13.1825C3.25202 11.9983 1.87421 10.3155 1.06251 8.34738Z" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 11C12.6569 11 14 9.65685 14 8C14 6.34315 12.6569 5 11 5C9.34315 5 8 6.34315 8 8C8 9.65685 9.34315 11 11 11Z" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>
</button>
</div>
</div>
<div class="flex flex-col mt-4 gap-4">
<a href="https://www.avril-beaute.fr/customer/account/forgotpassword/" class="text-sm underline">
Mot de passe oublié ? </a>
<button type="submit"
class="btn btn-primary mx-auto text-sm !px-16 !py-3"
:disabled="isLoading || disabledByRecaptcha"
x-bind:aria-busy="isLoading ? 'true' : 'false'">
<span
x-text="isLoading ? 'Chargement\u0020en\u0020cours...' : 'Me\u0020connecter'"></span>
</button>
<div class="control">
<input type="hidden"
value=""
name="g-recaptcha-response"
>
</div>
</div>
<div>
<template x-if="displayErrorMessage">
<p class="text-red flex items-center mt-4 gap-2.5">
<span class="inline-block">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
<title>exclamation-circle</title></svg>
</span>
<template x-for="(errorMessage, idx) in errorMessages" :key="idx">
<span x-html="errorMessage"></span>
</template>
</p>
</template>
</div>
</fieldset>
</form>
</div>
<script>
function initCustomerHeaderLoginForm_6acf38a494b15() {
return {
errors: 0,
hasCaptchaToken: 0,
isLoading: false,
showPassword: false,
displayErrorMessage: false,
errorMessages: [],
disabledByRecaptcha: false,
setErrorMessages(messages) {
this.errorMessages = Array.isArray(messages) ? messages : [messages];
this.displayErrorMessage = this.errorMessages.length > 0;
},
async submitForm() {
this.isLoading = true;
this.displayErrorMessage = false;
this.errorMessages = [];
const $form = document.querySelector('#header-customer-form-login');
if (!this.hasCaptchaToken) {
this.errors = 1;
const lockSubmitButton = () => {
$form.querySelector('[type="submit"]')?.setAttribute('disabled', true);
};
const failCaptcha = (errorMessage, exception = null) => {
this.errors = 1;
lockSubmitButton();
if (this.setErrorMessages) {
this.setErrorMessages([errorMessage]);
this.displayErrorMessage = true;
} else {
window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000);
}
if (exception) {
console.error(
exception ||
'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?'
);
}
};
const executeGreCaptcha = () => {
grecaptcha.ready(() => {
grecaptcha.execute(
'6LcFYF4qAAAAADImTOaJzO6csad6UWhk\u002D3kW7m4q',
{action: 'submit'}
).then((token) => {
const tokenElement = $form['g\u002Drecaptcha\u002Dresponse'];
if (tokenElement && token && token.length > 0) {
$form['g\u002Drecaptcha\u002Dresponse'].value = token;
this.errors = 0;
this.hasCaptchaToken = 1;
(this.submitForm || $form.submit).call(this);
} else {
failCaptcha(
tokenElement
? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
: 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
);
}
}).catch((exception) => {
failCaptcha(
'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.',
exception
);
});
});
};
if (window.grecaptcha) {
executeGreCaptcha();
} else {
const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LcFYF4qAAAAADImTOaJzO6csad6UWhk\u002D3kW7m4q";
const script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', recaptchaUrl);
document.head.appendChild(script);
script.addEventListener("load", executeGreCaptcha, false);
}
}
if (!this.hasCaptchaToken) {
this.isLoading = false;
return;
}
if (this.errors > 0) {
this.isLoading = false;
this.setErrorMessages('La\u0020validation\u0020ReCaptcha\u0020a\u0020\u00E9chou\u00E9,\u0020veuillez\u0020r\u00E9essayer');
return;
}
return this.doSubmit($form);
},
async doSubmit($form) {
const formData = new FormData($form);
try {
const response = await fetch('https://www.avril-beaute.fr/customer/ajax/loginpost/', {
method: 'POST',
body: formData,
headers: {
'X-Requested-With': 'XMLHttpRequest'
},
credentials: 'same-origin'
});
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
if (data.redirectUrl) {
window.location.href = data.redirectUrl;
return;
}
if (data.success) {
const currentPath = window.location.pathname;
if (currentPath.includes('checkout/cart')) {
window.location.href = 'https://www.avril-beaute.fr/checkout/';
} else {
window.location.reload();
}
} else {
this.setErrorMessages(data.message || 'Identifiant\u0020ou\u0020mot\u0020de\u0020passe\u0020invalide.');
this.isLoading = false;
}
} catch (err) {
this.setErrorMessages('Une\u0020erreur\u0020s\u0027est\u0020produite.\u0020Merci\u0020d\u0027essayer\u0020ult\u00E9rieurement.');
console.error(err);
this.isLoading = false;
}
}
}
}
</script>
</div>
<div x-show="!showRegisterForm" x-transition class="mt-auto">
<div class="pt-20 pb-8 rounded-xl px-6 flex flex-col">
<div class="mb-3">
<p class="text-28 font-abhayalibre font-bold">Vous êtes professionnel ?</p>
</div>
<a href="https://www.avril-pro.fr/customer/account/login/referer" class="text-sm underline">
Rendez-vous sur notre site Avril pro </a>
</div>
</div>
<button
type="button"
@click="closeCustomerMenuDrawer"
aria-label="Fermer"
class="absolute top-6 right-4 p-4"
>
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 14 14" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M13 1L1 13M1 1L13 13" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
</div>
</div>
<script>
function initCustomerMenuDrawer() {
return {
open: false,
isLoading: false,
showRegisterForm: false,
closeCustomerMenuDrawer() {
this.open = false;
this.showRegisterForm = false;
},
}
}
</script>
<!-- /BLOCK header.customer -->
<!--Cart Icon-->
<a
id="menu-cart-icon"
class="relative inline-block"
x-ref="cartButton"
:aria-disabled="isCartEmpty()"
:aria-label="` Voir le panier, ${isCartEmpty() ? 'Cart is empty' : cart.summary_count > 1 ? hyva.str('%1 articles', cart.summary_count) : hyva.str('%1 item', cart.summary_count) }`"
href="javascript:void(0)"
onclick="location.href=atob('aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL2NoZWNrb3V0L2NhcnQvaW5kZXgv')"
title="Voir le panier"
>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewbox="0 0 28 28" fill="none" class="w-full h-full" aria-hidden="true">
<path d="M17.1111 12.6004C17.1111 13.343 16.7833 14.0552 16.1999 14.5803C15.6164 15.1054 14.8251 15.4004 14 15.4004C13.1748 15.4004 12.3835 15.1054 11.8001 14.5803C11.2166 14.0552 10.8889 13.343 10.8889 12.6004M7.08008 9.82422H20.9199" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M7.31111 9.4269C7.10917 9.66923 7 9.96398 7 10.2669V19.6C7 19.9713 7.16389 20.3274 7.45561 20.5899C7.74733 20.8525 8.143 21 8.55556 21H19.4444C19.857 21 20.2527 20.8525 20.5444 20.5899C20.8361 20.3274 21 19.9713 21 19.6V10.2669C21 9.96398 20.8908 9.66923 20.6889 9.4269L19.1333 7.56C18.9884 7.38613 18.8006 7.245 18.5846 7.1478C18.3686 7.0506 18.1304 7 17.8889 7H10.1111C9.86962 7 9.63144 7.0506 9.41545 7.1478C9.19945 7.245 9.01156 7.38613 8.86667 7.56L7.31111 9.4269Z" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span
x-text="cart.summary_count"
x-show="!isCartEmpty()"
x-cloak
class="absolute top-0 -right-0 h-5 px-2 py-1 rounded-full bg-pink_avril-200 text-white text-xs font-semibold leading-none text-center uppercase tabular-nums"
aria-hidden="true"
></span>
</a>
</div>
</div>
<!--Search-->
<div id="search-content"
x-cloak
x-show="searchOpen"
class="fixed inset-0 z-50"
x-transition.opacity
@keydown.escape.prevent.stop=" searchOpen = false; $refs.searchButton && $refs.searchButton.focus(); "
x-effect=" // Scroll lock on html element when search is open document.documentElement.classList.toggle('overflow-hidden', searchOpen); document.documentElement.classList.toggle('no-scrollbar', searchOpen); "
>
<div class="absolute inset-0"
aria-hidden="true"
@click="searchOpen = false; $refs.searchButton && $refs.searchButton.focus();"
></div>
<div class="relative z-10 h-full w-full">
<div class="flex flex-col h-full w-full bg-container">
<div class="flex-1 overflow-auto">
<script>
const AUTOCOMPLETE_TYPES = Object.freeze({
PRODUCT: 'product',
CATEGORY: 'category',
CMS_PAGE: 'cms_page',
SEARCH_TERM: 'term',
PRODUCT_ATTRIBUTE: 'product_attribute'
});
const SLIDER_CONFIG = {
url: 'https://www.avril-beaute.fr/catalog/autocomplete_products/'
};
function initMiniSearchComponent() {
"use strict";
return {
show: false,
formSelector: "#search_mini_form",
url: "https://www.avril-beaute.fr/search/ajax/suggest/",
destinationSelector: "#search_autocomplete",
templates: {"term":{"title":"Suggestions","template":"Hyva_SmileElasticsuite::core\/autocomplete\/term.phtml"},"product":{"title":"Meilleurs r\u00e9sultats","template":"Magento_Catalog::product\/list\/item.phtml"},"category":{"title":"Categories","template":"Hyva_SmileElasticsuite::catalog\/autocomplete\/category.phtml"},"product_attribute":{"title":"Attributs","template":"Hyva_SmileElasticsuite::catalog\/autocomplete\/product_attribute.phtml","titleRenderer":"renderEsAutocompleteTitleAttribute"},"cms_page":{"title":"Cms page","template":"Hyva_SmileElasticsuite::cms-search\/autocomplete\/cms.phtml"}},
priceFormat: {"pattern":"%s\u00a0\u20ac","precision":2,"requiredPrecision":2,"decimalSymbol":",","groupSymbol":"\u202f","groupLength":3,"integerRequired":false},
minSearchLength: 2,
searchResultsByType: {},
currentRequest: null,
productsLoading: false,
otherTypesLoading: false,
async fillProductsRender() {
const signal = this.currentRequest?.signal;
if (!signal || signal.aborted) return;
const productIds = (this.searchResultsByType[AUTOCOMPLETE_TYPES.PRODUCT] || [])
.map(product => product.entity_id)
.filter(Boolean);
try {
const productsHtml = await fetchProductsHtml(
productIds,
SLIDER_CONFIG.url,
signal
);
window.dispatchEvent(new CustomEvent('update-products', {
detail: {data: productsHtml}
}));
this.productsLoading = false;
} catch (err) {
if (err?.name !== 'AbortError') {
console.error(err);
}
}
},
getSearchResults: function () {
const value = this.$refs.searchInput.value.trim();
if (value.length < parseInt(this.minSearchLength, 10)) {
this.show = false;
this.searchResultsByType = [];
return false;
}
let url = this.url + '?' + new URLSearchParams({
q: value,
_: Date.now()
}).toString();
if (this.currentRequest !== null) {
this.currentRequest.abort();
}
this.currentRequest = new AbortController();
this.productsLoading = true;
this.otherTypesLoading = true;
fetch(url, {
method: 'GET',
signal: this.currentRequest.signal,
}).then((response) => {
if (response.ok) return response.json();
}).then((data) => {
this.show = data.length > 0;
this.searchResultsByType = data.reduce((acc, result) => {
if (!acc[result.type]) acc[result.type] = [];
acc[result.type].push(result);
return acc;
}, {});
this.fillProductsRender();
}).catch((err) => {
this.show = false;
this.searchResultsByType = {};
}).finally(() => {
this.otherTypesLoading = false;
});
},
encodeUrl: function (url) {
return btoa(url)
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '~');
}
}
}
</script>
<div id="elasticsuite-search-container" class="min-h-screen flex flex-col h-full" x-data="initMiniSearchComponent()">
<div class="container mx-auto text-primary flex flex-col p-4">
<form
class="form minisearch flex flex-col flex-1 min-h-0"
id="search_mini_form"
action="https://www.avril-beaute.fr/catalogsearch/result/"
method="get"
role="search"
>
<div class="flex items-center gap-3 sm:gap-4 flex-wrap sm:flex-nowrap">
<div class="relative flex-1 min-w-0">
<label class="sr-only" for="search">
Recherchez ici </label>
<input id="search"
x-on:input.debounce="getSearchResults()"
x-ref="searchInput"
type="search"
class="no-search-cancel w-full"
autocapitalize="off" autocomplete="off" autocorrect="off"
name="q"
value=""
placeholder="Recherchez ici"
maxlength="128"
@search-open.window.debounce.10="$el.focus(); $el.select();"
/>
<button class="p-1 pointer absolute top-1/2 right-3 -translate-y-1/2 sm:right-4" type="submit"
aria-label="Search">
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewbox="0 0 28 28" fill="none" aria-hidden="true">
<path d="M21.0003 21.0003L17.625 17.625" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13.2218 19.4437C16.6581 19.4437 19.4437 16.6581 19.4437 13.2218C19.4437 9.78561 16.6581 7 13.2218 7C9.78561 7 7 9.78561 7 13.2218C7 16.6581 9.78561 19.4437 13.2218 19.4437Z" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
<button type="button"
class="p-1 pointer"
x-on:click="show = false; $dispatch('search-close');"
aria-label="Close search">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
</div>
<div class="flex-1 min-h-0 flex flex-col mt-5">
<div class="relative w-full tracking-search-frequent" x-show="!show">
<div class="text-28 font-extrabold py-2 pl-2 font-abhayalibre">
Recherches fréquentes </div>
<ul class="search-terms">
<li id="term-861" class="item hover:bg-gray-100">
<a class="w-full block p-2 qcd"
href="javascript:;"
data-qcd="aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL2NhdGFsb2dzZWFyY2gvcmVzdWx0Lz9xPUNyJUMzJUE4bWUrdmlzYWdl">
<span class="text-sm">Crème visage</span>
</a>
</li>
<li id="term-2106" class="item hover:bg-gray-100">
<a class="w-full block p-2 qcd"
href="javascript:;"
data-qcd="aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL2NhdGFsb2dzZWFyY2gvcmVzdWx0Lz9xPWVhdStmbG9yYWxl">
<span class="text-sm">eau florale</span>
</a>
</li>
<li id="term-766" class="item hover:bg-gray-100">
<a class="w-full block p-2 qcd"
href="javascript:;"
data-qcd="aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL2NhdGFsb2dzZWFyY2gvcmVzdWx0Lz9xPU1hc2NhcmE~">
<span class="text-sm">Mascara</span>
</a>
</li>
<li id="term-702" class="item hover:bg-gray-100">
<a class="w-full block p-2 qcd"
href="javascript:;"
data-qcd="aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL2NhdGFsb2dzZWFyY2gvcmVzdWx0Lz9xPVNlcnVt">
<span class="text-sm">Serum</span>
</a>
</li>
<li id="term-152" class="item hover:bg-gray-100">
<a class="w-full block p-2 qcd"
href="javascript:;"
data-qcd="aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL2NhdGFsb2dzZWFyY2gvcmVzdWx0Lz9xPXZlcm5pcw~~">
<span class="text-sm">vernis</span>
</a>
</li>
</ul>
</div>
<div id="search_autocomplete"
class="search-autocomplete relative w-full flex-1 min-h-0 overflow-auto tracking-search-suggestion"
x-show="show"
:class="otherTypesLoading ? 'blur-sm pointer-events-none' : ''"
style="display:none;">
<div class="w-full h-full">
<template x-for="searchResultByType in Object.values(searchResultsByType)">
<div>
<template
x-if="searchResultByType.hasOwnProperty(0) && searchResultByType[0].type !== AUTOCOMPLETE_TYPES.PRODUCT">
<div>
<template
x-if="templates[searchResultByType[0].type].title && templates[searchResultByType[0].type].titleRenderer === undefined">
<div class="text-xl sm:text-28 font-extrabold py-2 pl-2 font-abhayalibre"
x-text="templates[searchResultByType[0].type].title"></div>
</template>
<template
x-if="templates[searchResultByType[0].type].titleRenderer !== undefined">
<div class="text-xl sm:text-2xl font-bold py-2 pl-2"
x-text="window[templates[searchResultByType[0].type].titleRenderer](searchResultByType)"></div>
</template>
<template x-for="searchResult in searchResultByType">
<div>
<template x-if="searchResult.type == 'term'">
<a class="w-full block p-2 hover:bg-gray-100 qcd hover:cursor-pointer"
x-bind:data-qcd="encodeUrl('https://www.avril-beaute.fr/catalogsearch/result/?q=' + searchResult.title)"
javascript=":;"
:title="searchResult.title"
>
<span class="text-sm" x-text="searchResult.title"></span>
<span class="text-sm" x-text="'(' + searchResult.num_results + ')'"></span>
</a>
</template>
<template x-if="searchResult.type == 'category'">
<a class="w-full block p-2 qcd hover:cursor-pointer"
x-bind:data-qcd="encodeUrl(searchResult.url)"
javascript=":;"
:title="searchResult.title"
>
<span class="text-sm italic block text-gray-500" x-text="searchResult.breadcrumb.join(' > ').concat(' > ')"></span>
<span class="text-sm" x-text="searchResult.title"></span>
</a>
</template>
<template x-if="searchResult.type == 'product_attribute'">
<a class="w-full block p-2 qcd hover:cursor-pointer"
javascript=":;"
x-bind:data-qcd="encodeUrl(searchResult.url)"
:title="searchResult.title"
>
<span class="text-sm" x-text="searchResult.title"></span>
<span class="text-xs uppercase text-gray-500" x-text="searchResult.attribute_label" style="vertical-align: super;"></span>
</a>
</template>
<script>
function renderEsAutocompleteTitleAttribute(data)
{
data = data.filter(function(item) {
return item.type === 'product_attribute';
}).map(function(item) {
return item['attribute_label']
}).reduce(function(prev, item) {
if (item in prev) {
prev[item]++;
} else {
prev[item] = 1;
}
return prev;
}, {});
data = Object.entries(data).sort(function(item1, item2) {
return item2[1] - item1[1]
}).map(function(item) {return item[0]});
if (data.length > 2) {
data = data.slice(0, 2);
data.push('...');
}
return data.join(', ');
}
</script>
<template x-if="searchResult.type == 'cms_page'">
<a class="w-full block p-2 qcd hover:cursor-pointer"
javascript=":;"
x-bind:data-qcd="encodeUrl(searchResult.url)"
:title="searchResult.title"
>
<span class="text-sm" x-text="searchResult.title"></span>
</a>
</template>
</div>
</template>
</div>
</template>
</div>
</template>
</div>
</div>
</div>
</form>
</div>
<div id="search-autocomplete-external"
class="search-autocomplete w-full bg-white shadow-lg flex-1 py-6 tracking-search-product"
:class="productsLoading ? 'blur-sm pointer-events-none' : ''"
x-show="show && searchResultsByType[AUTOCOMPLETE_TYPES.PRODUCT]?.length"
style="display:none;">
<div class="container mx-auto px-4">
<template
x-if="templates[AUTOCOMPLETE_TYPES.PRODUCT]?.title && templates[AUTOCOMPLETE_TYPES.PRODUCT].titleRenderer === undefined">
<div class="text-xl sm:text-2xl font-bold p-4"
x-text="templates[AUTOCOMPLETE_TYPES.PRODUCT].title"></div>
</template>
<template x-if="templates[AUTOCOMPLETE_TYPES.PRODUCT]?.titleRenderer !== undefined">
<div class="text-xl sm:text-2xl font-bold p-4"
x-text="window[templates[AUTOCOMPLETE_TYPES.PRODUCT].titleRenderer](searchResultsByType[AUTOCOMPLETE_TYPES.PRODUCT])"></div>
</template>
<div id="products-slider-_6acf38a4958f1"
x-data="productsSliderSL_6acf38a4958f1()"
x-init="getQuoteItems(); $nextTick(() => { setActiveTab(1); })"
x-ref="containerSlider"
x-bind="eventListeners"
class="products-slider container mx-auto"
>
<ul class="product-items mt-[30px] pl-4" :style="{ width: width + 'px' }">
<li class="swiper w-full">
<ul class="product-items swiper-wrapper h-auto !mb-6" :class="{ 'hidden': !initialized }">
<template x-for="product in products" :key="product.id">
<li class="swiper-slide h-full" x-show="product.renderHtml" x-html="product.renderHtml"></li>
</template>
</ul>
<div class="flex justify-between pr-10 container mx-0 gap-2">
<div class="custom-pagination flex gap-2"></div>
<div class="gap-2 w-[80px] shrink-0 hidden md:flex">
<button class="swiper-button-prev"><svg xmlns="http://www.w3.org/2000/svg" width="5" height="10" viewbox="0 0 7 12" fill="none" aria-hidden="true">
<path d="M6 1L1 6L6 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<button class="swiper-button-next"><svg xmlns="http://www.w3.org/2000/svg" width="5" height="10" viewbox="0 0 7 12" fill="none" class="rotate-180" aria-hidden="true">
<path d="M6 1L1 6L6 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
<button type="submit" form="search_mini_form" class="btn-arrow w-full justify-end flex md:hidden">
<span>Voir tout</span>
</button>
</div>
</li>
</ul>
</div>
<script>
function productsSliderSL_6acf38a4958f1() {
return {
activeTab: 0,
initialized: false,
swiper: null,
width: '100%',
products: [],
quoteItems: [],
eventListeners: {
['@update-products.window'](e) {
this.products = e.detail.data;
this.reinitOnDataChange();
}
},
init() {
this.watchMageCache();
window.addEventListener('get-last-item-success', () => {
this.waitForUpdatedCart();
});
},
setActiveTab: function (tab) {
this.initialized = false;
this.activeTab = tab;
this.$nextTick(() => this.initSlider());
},
reinitOnDataChange: function () {
this.initialized = false;
this.$nextTick(() => this.initSlider());
},
initSlider: function () {
const root = this.$root;
const el = root.querySelector('.swiper');
if (!el) {
return;
}
if (this.swiper) {
this.swiper.destroy(true, true);
this.swiper = null;
}
const paginationEl = root.querySelector('.custom-pagination');
if (paginationEl) {
paginationEl.innerHTML = '';
}
const slidesCount = root.querySelectorAll('.swiper-wrapper > .swiper-slide').length;
const vw = document.documentElement.clientWidth || window.innerWidth;
const effectiveSpv = vw >= 1180 ? 4.5 : vw >= 967 ? 3.5 : vw >= 560 ? 2.5 : 1.5;
const baseOptions = {
centeredSlides: false,
slidesPerView: 1.5,
slidesPerGroup: 1,
spaceBetween: 20,
keyboard: {enabled: true},
autoplay: {delay: 5000},
speed: 500,
watchOverflow: true,
observeParents: true,
observer: true,
grabCursor: true,
navigation: {
nextEl: root.querySelector('.swiper-button-next'),
prevEl: root.querySelector('.swiper-button-prev'),
},
pagination: {
el: paginationEl,
clickable: true,
renderBullet: (i, cls) => `<button type="button" class="${cls}" aria-label="Go to slide ${i + 1}"></button>`
},
breakpoints: {
1180: {slidesPerView: 4.5},
967: {slidesPerView: 3.5},
560: {slidesPerView: 2.5}
}
};
const notEnoughToLoop = slidesCount <= Math.ceil(effectiveSpv);
baseOptions.loop = !notEnoughToLoop;
this.swiper = new Swiper(el, baseOptions);
this.initialized = true;
},
waitForUpdatedCart: function () {
const previous = JSON.stringify(this.quoteItems);
const check = () => {
const cache = localStorage.getItem('mage-cache-storage');
if (!cache) return setTimeout(check, 50);
const mageCache = JSON.parse(cache);
const cart = mageCache.cart || mageCache['cart-data'];
if (!cart) return setTimeout(check, 50);
const items = cart.items || cart['items'];
if (!items) return setTimeout(check, 50);
const newItems = items.map(i => i.original_product_sku);
if (JSON.stringify(newItems) === previous) {
return setTimeout(check, 50);
}
this.quoteItems = newItems;
};
check();
},
isInCart: function (sku) {
return this.quoteItems.includes(sku);
},
watchMageCache: function () {
let self = this;
(function(originalSetItem) {
localStorage.setItem = function(key, value) {
originalSetItem.apply(this, arguments);
if (key === 'mage-cache-storage') {
setTimeout(function () {
self.getQuoteItems();
}, 0);
}
};
})(localStorage.setItem);
},
getQuoteItems: function () {
let self = this;
if (!localStorage.getItem('mage-cache-storage')) {
return;
}
let mageCache = JSON.parse(localStorage.getItem('mage-cache-storage'));
let cart = mageCache.cart || mageCache['cart-data'];
if (!cart) return;
let items = cart.items || cart['items'];
if (!items) return;
self.quoteItems = [];
items.forEach(item => {
if (item.original_product_sku) {
self.quoteItems.push(item.original_product_sku);
}
});
}
}
}
</script>
</div>
</div>
<div id="search-layer-footer" class="mt-auto w-full" x-show="!show">
<!-- modifié le 2025-10-01 16:03:37 -->
<style>#html-body [data-pb-style=IH2HCM7] {
justify-content: center;
display: flex;
flex-direction: column;
background-color: #fff;
background-position: left top;
background-size: cover;
background-repeat: no-repeat;
background-attachment: scroll;
min-height: 200px
}</style>
<div data-content-type="row" data-appearance="full-width" data-enable-parallax="0" data-parallax-speed="0.5"
data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true"
data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="false" data-element="main"
data-pb-style="IH2HCM7">
<div class="row-full-width-inner" data-element="inner">
<div class="block-title" data-content-type="text" data-appearance="default" data-element="main">
<p>besoin d'aide ?</p>
</div>
<div data-content-type="text" data-appearance="default" data-element="main">
<p id="EC4V0LR">
<a tabindex="0" href="/livraison-paiement">Livraison et retours</a>
</p>
<p>
<a tabindex="0" href="/contact">Contactez-nous</a>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--Cart Drawer-->
<!--Authentication Pop-Up-->
<!-- BLOCK authentication-popup --><script>
function initAuthentication() {
return {
open: false,
forceAuthentication: false,
checkoutUrl: 'https://www.avril-beaute.fr/checkout/index/',
errors: 0,
hasCaptchaToken: 0,
displayErrorMessage: false,
errorMessages: [],
showRegisterForm: false,
closeCustomerMenuDrawer() {
this.open = false;
this.showRegisterForm = false;
},
setErrorMessages: function setErrorMessages(messages) {
this.errorMessages = [messages];
this.displayErrorMessage = this.errorMessages.length;
},
onPrivateContentLoaded: function (data) {
const isLoggedIn = data.customer && data.customer.firstname;
if (data.cart && !isLoggedIn) {
this.forceAuthentication = !data.cart.isGuestCheckoutAllowed;
}
},
redirectIfAuthenticated: function (event) {
if (event.detail && event.detail.url) {
this.checkoutUrl = event.detail.url;
}
if (!this.forceAuthentication) {
window.location.href = this.checkoutUrl;
}
}
}
}
</script>
<section id="authentication-popup"
x-data="initAuthentication()"
@toggle-register-form.window="showRegisterForm = $event.detail"
@toggle-login-form.window="showRegisterForm = $event.detail; open = true"
@private-content-loaded.window="onPrivateContentLoaded($event.detail.data)"
@toggle-authentication.window="open = forceAuthentication; redirectIfAuthenticated(event)"
@keydown.window.escape="open = false"
>
<div
class="backdrop"
aria-hidden="true"
x-cloak
x-show="open"
x-transition:enter="ease-in-out duration-500"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="ease-in-out duration-500"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
@click="open = false"
></div>
<div role="dialog"
aria-modal="true"
@click.outside="open = false"
:class="open ? 'fixed bottom-0 top-24 md:top-0 right-0 z-50 w-full md:w-[515px] max-w-full' : 'hidden'"
class="flex"
x-cloak
x-show="open"
>
<div class="relative bg-background shadow-2xl rounded-xl md:rounded-none w-full max-w-full z-20"
x-show="open"
x-cloak=""
x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700"
x-transition:enter-start="translate-x-full"
x-transition:enter-end="translate-x-0"
x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700"
x-transition:leave-start="translate-x-0"
x-transition:leave-end="translate-x-full"
>
<div class="flex flex-col text-center h-full max-h-screen shadow-xl overflow-y-auto pb-20">
<div x-show="!showRegisterForm" x-transition>
<div class="pt-20 pb-8 bg-white rounded-xl px-6 flex flex-col">
<div class="mb-3">
<p class="text-28 font-abhayalibre font-bold">Nouveau client ?</p>
</div>
<a href="#" class="btn btn-primary mx-auto text-sm !px-16 !py-3"
@click.prevent="$dispatch('toggle-register-form', true)">
Créer mon compte </a>
</div>
</div>
<div x-show="showRegisterForm" x-transition>
<div class="pt-10 pb-8 px-6 flex flex-col">
<a href="#" class="text-sm text-left mb-4"
@click.prevent="$dispatch('toggle-register-form', false)">
< Retour </a>
<div class="mb-3">
<p class="text-28 font-abhayalibre font-bold">Créer mon compte</p>
</div>
<form class="form create account form-create-account"
action="https://www.avril-beaute.fr/customer/ajax/createpost/"
x-data="Object.assign(hyva.formValidationAjax($el), initForm_6acf38a495f26($el))"
@submit.prevent="submitForm()"
id="customer-authentication-popup-customer-form-register"
method="post" enctype="multipart/form-data" autocomplete="off"
>
<input name="form_key" type="hidden" value="ThSMex3EkPNfSLKM" /> <div class="control">
<input type="hidden"
value=""
name="g-recaptcha-response"
>
</div>
<fieldset class="w-full mx-auto">
<div class="legend text-sm text-center w-full mb-4 font-light">
<span>Informations personnelles</span>
</div>
<input type="hidden" name="success_url" value="">
<input type="hidden" name="error_url" value="">
<div class="field field-reserved gender required">
<div class="control">
<select id="authentication_gender"
name="gender"
title="Genre"
class="form-select"
required>
<option value="1"
>
M </option>
<option value="2"
>
Mme </option>
</select>
</div>
</div>
<div class="field field-reserved w-full field-name-firstname required">
<div class="control">
<input type="text" id="authentication_firstname"
name="firstname"
value=""
required
placeholder="Prénom*"
title="Prénom"
class="form-input w-full required-entry"
@input.debounce="onChange"
required>
</div>
</div>
<div class="field field-reserved w-full field-name-lastname required">
<div class="control">
<input type="text" id="authentication_lastname"
name="lastname"
required
value=""
placeholder="Nom*"
title="Nom"
class="form-input w-full required-entry"
@input.debounce="onChange"
required>
</div>
</div>
<div class="legend text-sm text-center w-full my-4 font-light">
<span>Informations de connexion</span>
</div>
<div class="field field-reserved required">
<div class="control">
<input
type="email"
name="email"
autocomplete="email"
id="authentication_email_address"
required
value=""
placeholder="E-mail*"
class="form-input w-full"
@input.debounce="onChange"
/>
</div>
</div>
<!-- Password fields remain unchanged -->
<div class="field field-reserved required">
<div class="flex flex-wrap gap-4 mb-2.5">
<div class="control relative w-full">
<div class="sr-only" aria-live="polite">
<template x-if="!showPassword">
<span>Password hidden</span>
</template>
<template x-if="showPassword">
<span>Password shown</span>
</template>
</div>
<input
:type="showPassword ? 'text' : 'password'"
type="password"
id="authentication_password"
name="password"
placeholder="Mot de passe*"
title="Mot de passe"
minlength="8"
class="form-input"
required
data-validate='{"password-strength": {"minCharacterSets": 3, "minimumPasswordLength": 8}}'
@input.debounce="onChange"
autocomplete="off"
>
<button
type="button"
:aria-pressed="showPassword ? true : false"
x-on:click="showPassword = !showPassword"
class="absolute top-1/2 right-0 -translate-y-1/2 px-4 py-3"
:aria-label="showPassword ? 'Hide\u0020Password' : 'Show\u0020Password'"
>
<template x-if="!showPassword">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="14" viewbox="0 0 22 16" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M1.06251 8.34738C0.979165 8.12287 0.979165 7.8759 1.06251 7.65138C1.87421 5.68324 3.25202 4.00042 5.02128 2.81628C6.79053 1.63214 8.87155 1 11.0005 1C13.1295 1 15.2105 1.63214 16.9797 2.81628C18.749 4.00042 20.1268 5.68324 20.9385 7.65138C21.0218 7.8759 21.0218 8.12287 20.9385 8.34738C20.1268 10.3155 18.749 11.9983 16.9797 13.1825C15.2105 14.3666 13.1295 14.9988 11.0005 14.9988C8.87155 14.9988 6.79053 14.3666 5.02128 13.1825C3.25202 11.9983 1.87421 10.3155 1.06251 8.34738Z" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 11C12.6569 11 14 9.65685 14 8C14 6.34315 12.6569 5 11 5C9.34315 5 8 6.34315 8 8C8 9.65685 9.34315 11 11 11Z" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>
<template x-if="showPassword">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="14" viewbox="0 0 22 16" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M1.06251 8.34738C0.979165 8.12287 0.979165 7.8759 1.06251 7.65138C1.87421 5.68324 3.25202 4.00042 5.02128 2.81628C6.79053 1.63214 8.87155 1 11.0005 1C13.1295 1 15.2105 1.63214 16.9797 2.81628C18.749 4.00042 20.1268 5.68324 20.9385 7.65138C21.0218 7.8759 21.0218 8.12287 20.9385 8.34738C20.1268 10.3155 18.749 11.9983 16.9797 13.1825C15.2105 14.3666 13.1295 14.9988 11.0005 14.9988C8.87155 14.9988 6.79053 14.3666 5.02128 13.1825C3.25202 11.9983 1.87421 10.3155 1.06251 8.34738Z" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 11C12.6569 11 14 9.65685 14 8C14 6.34315 12.6569 5 11 5C9.34315 5 8 6.34315 8 8C8 9.65685 9.34315 11 11 11Z" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>
</button>
</div>
<ul class="password-criteria text-left !pb-0 !mb-0 -mt-2.5">
<li data-criterion="length" class="flex items-center gap-1.5">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewbox="0 0 16 15" fill="none" class="text-gray_avril-100" aria-hidden="true">
<path d="M8.00065 14.1673C11.6825 14.1673 14.6673 11.1825 14.6673 7.50065C14.6673 3.81875 11.6825 0.833984 8.00065 0.833984C4.31875 0.833984 1.33398 3.81875 1.33398 7.50065C1.33398 11.1825 4.31875 14.1673 8.00065 14.1673Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6 7.5013L7.33333 8.83464L10 6.16797" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
8 caractères minimum </li>
<li data-criterion="uppercase" class="flex items-center gap-1.5">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewbox="0 0 16 15" fill="none" class="text-gray_avril-100" aria-hidden="true">
<path d="M8.00065 14.1673C11.6825 14.1673 14.6673 11.1825 14.6673 7.50065C14.6673 3.81875 11.6825 0.833984 8.00065 0.833984C4.31875 0.833984 1.33398 3.81875 1.33398 7.50065C1.33398 11.1825 4.31875 14.1673 8.00065 14.1673Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6 7.5013L7.33333 8.83464L10 6.16797" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
1 lettre majuscule </li>
<li data-criterion="lowercase" class="flex items-center gap-1.5">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewbox="0 0 16 15" fill="none" class="text-gray_avril-100" aria-hidden="true">
<path d="M8.00065 14.1673C11.6825 14.1673 14.6673 11.1825 14.6673 7.50065C14.6673 3.81875 11.6825 0.833984 8.00065 0.833984C4.31875 0.833984 1.33398 3.81875 1.33398 7.50065C1.33398 11.1825 4.31875 14.1673 8.00065 14.1673Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6 7.5013L7.33333 8.83464L10 6.16797" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
1 lettre minuscule </li>
<li data-criterion="number" class="flex items-center gap-1.5">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewbox="0 0 16 15" fill="none" class="text-gray_avril-100" aria-hidden="true">
<path d="M8.00065 14.1673C11.6825 14.1673 14.6673 11.1825 14.6673 7.50065C14.6673 3.81875 11.6825 0.833984 8.00065 0.833984C4.31875 0.833984 1.33398 3.81875 1.33398 7.50065C1.33398 11.1825 4.31875 14.1673 8.00065 14.1673Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6 7.5013L7.33333 8.83464L10 6.16797" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
1 chiffre </li>
</ul>
</div>
</div>
<!-- Password confirm -->
<div class="field field-reserved required">
<div class="control relative w-full">
<div class="sr-only" aria-live="polite">
<template x-if="!showPasswordConfirm">
<span>Confirm password hidden</span>
</template>
<template x-if="showPasswordConfirm">
<span>confirm password shown</span>
</template>
</div>
<input
:type="showPasswordConfirm ? 'text' : 'password'"
type="password"
name="password_confirmation"
placeholder="Confirmer le mot de passe*"
title="Confirmer le mot de passe"
id="authentication_password-confirmation"
data-validate='{"equalTo": "password"}'
@input.debounce="onChange"
required
class="form-input"
autocomplete="off"
>
<button
type="button"
x-on:click="showPasswordConfirm = !showPasswordConfirm"
:aria-pressed="showPasswordConfirm ? true : false"
class="absolute top-1/2 right-0 -translate-y-1/2 px-4 py-3"
:aria-label=" showPasswordConfirm ? 'Hide\u0020Password' : 'Show\u0020Password' "
>
<template x-if="!showPasswordConfirm">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="14" viewbox="0 0 22 16" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M1.06251 8.34738C0.979165 8.12287 0.979165 7.8759 1.06251 7.65138C1.87421 5.68324 3.25202 4.00042 5.02128 2.81628C6.79053 1.63214 8.87155 1 11.0005 1C13.1295 1 15.2105 1.63214 16.9797 2.81628C18.749 4.00042 20.1268 5.68324 20.9385 7.65138C21.0218 7.8759 21.0218 8.12287 20.9385 8.34738C20.1268 10.3155 18.749 11.9983 16.9797 13.1825C15.2105 14.3666 13.1295 14.9988 11.0005 14.9988C8.87155 14.9988 6.79053 14.3666 5.02128 13.1825C3.25202 11.9983 1.87421 10.3155 1.06251 8.34738Z" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 11C12.6569 11 14 9.65685 14 8C14 6.34315 12.6569 5 11 5C9.34315 5 8 6.34315 8 8C8 9.65685 9.34315 11 11 11Z" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>
<template x-if="showPasswordConfirm">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="14" viewbox="0 0 22 16" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M1.06251 8.34738C0.979165 8.12287 0.979165 7.8759 1.06251 7.65138C1.87421 5.68324 3.25202 4.00042 5.02128 2.81628C6.79053 1.63214 8.87155 1 11.0005 1C13.1295 1 15.2105 1.63214 16.9797 2.81628C18.749 4.00042 20.1268 5.68324 20.9385 7.65138C21.0218 7.8759 21.0218 8.12287 20.9385 8.34738C20.1268 10.3155 18.749 11.9983 16.9797 13.1825C15.2105 14.3666 13.1295 14.9988 11.0005 14.9988C8.87155 14.9988 6.79053 14.3666 5.02128 13.1825C3.25202 11.9983 1.87421 10.3155 1.06251 8.34738Z" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 11C12.6569 11 14 9.65685 14 8C14 6.34315 12.6569 5 11 5C9.34315 5 8 6.34315 8 8C8 9.65685 9.34315 11 11 11Z" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>
</button>
</div>
</div>
<div class="field sponsorship text-left">
<div class="legend text-sm text-center w-full my-4 font-light">
<span>Programme de parrainage</span>
</div>
<p class="subtitle text-xs md:text-sm font-light text-left mb-2.5">
Vous avez découvert Avril grâce à un.e proche ? Indiquez ici son adresse e-mail </p>
<div class="field !mt-2.5">
<label for="authentication_sponsor_email_address" class="label hidden">
<span>Adresse e-mail de votre parrain</span>
</label>
<div class="control">
<input type="email"
name="sponsor_email_address"
autocomplete="email"
id="authentication_sponsor_email_address"
value=""
title="Adresse e-mail de votre parrain"
placeholder="Adresse e-mail de votre parrain"
class="input-text">
</div>
</div>
</div>
<div class="field choice newsletter !items-start">
<input type="checkbox" name="is_subscribed" class="mt-1"
title="Abonnez-vous à la lettre d’information" value="1"
id="authentication_is_subscribed">
<label
for="authentication_is_subscribed"
class="label text-sm font-light text-left">
<span>
Je souhaite recevoir les newsletters d'Avril (nouveautés produits, conseils bien-être, inspiration make-up et bien sûr nos avancées en faveur de l'environnement), personnalisées et suivies (ouverture, clics) </span>
</label>
</div>
<div class="actions-toolbar !border-0">
<div class="primary w-full">
<button type="submit"
:disabled="isLoading || disabledByRecaptcha"
x-bind:aria-busy="isLoading ? 'true' : 'false'"
class="mx-auto action submit primary btn btn-primary disabled:opacity-75"
title="Créer mon compte"
>
<span
x-text="isLoading ? 'Chargement\u0020en\u0020cours...' : 'Cr\u00E9er\u0020mon\u0020compte'"></span>
</button>
</div>
</div>
<div x-show="globalError" class="mt-4 text-red-600 text-sm" x-text="globalError"></div>
</fieldset>
</form>
<p class="font-light text-sm leading-[140%] text-gray_avril-100 text-left mt-6">
<span>
Les données personnelles recueillies sur ce formulaire font l'objet d'un traitement informatique opéré sous la responsabilité d'Avril. Pour plus d'informations sur les traitements de données personnelles, veuillez consulter notre </span>
<a href="https://www.avril-beaute.fr/politique-de-confidentialite/" class="underline">
Politique de confidentialité. </a>
</p>
</div>
<script>
function formValidationAjax(form, options = {}) {
const instance = hyva.formValidation(form, options);
// Never wrap the input; use existing parent as container
instance.getMessagesWrapper = function (field, messagesClassName) {
const container = field.element.parentElement;
let msgWrapper = container.querySelector(`.${messagesClassName}`);
if (!msgWrapper) {
msgWrapper = document.createElement('ul');
msgWrapper.classList.add(messagesClassName);
container.appendChild(msgWrapper);
}
return msgWrapper;
}
return instance;
}
hyva.formValidationAjax = formValidationAjax;
</script>
<script>
function initForm_6acf38a495f26($el) {
return {
errors: 0,
hasCaptchaToken: 0,
globalError: '',
showPassword: false,
showPasswordConfirm: false,
disabledByRecaptcha: false,
isLoading: false,
clearErrors() {
this.globalError = '';
this.errors = 0;
$el.querySelectorAll('.field-error ul.messages li').forEach(el => el.remove());
},
submitForm() {
this.isLoading = true;
this.clearErrors();
this.validate().then(() => {
const $form = document.querySelector('#customer\u002Dauthentication\u002Dpopup\u002Dcustomer\u002Dform\u002Dregister');
if (!this.hasCaptchaToken) {
this.errors = 1;
const lockSubmitButton = () => {
$form.querySelector('[type="submit"]')?.setAttribute('disabled', true);
};
const failCaptcha = (errorMessage, exception = null) => {
this.errors = 1;
lockSubmitButton();
if (this.setErrorMessages) {
this.setErrorMessages([errorMessage]);
this.displayErrorMessage = true;
} else {
window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000);
}
if (exception) {
console.error(
exception ||
'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?'
);
}
};
const executeGreCaptcha = () => {
grecaptcha.ready(() => {
grecaptcha.execute(
'6LcFYF4qAAAAADImTOaJzO6csad6UWhk\u002D3kW7m4q',
{action: 'submit'}
).then((token) => {
const tokenElement = $form['g\u002Drecaptcha\u002Dresponse'];
if (tokenElement && token && token.length > 0) {
$form['g\u002Drecaptcha\u002Dresponse'].value = token;
this.errors = 0;
this.hasCaptchaToken = 1;
(this.submitForm || $form.submit).call(this);
} else {
failCaptcha(
tokenElement
? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
: 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
);
}
}).catch((exception) => {
failCaptcha(
'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.',
exception
);
});
});
};
if (window.grecaptcha) {
executeGreCaptcha();
} else {
const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LcFYF4qAAAAADImTOaJzO6csad6UWhk\u002D3kW7m4q";
const script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', recaptchaUrl);
document.head.appendChild(script);
script.addEventListener("load", executeGreCaptcha, false);
}
}
if (!this.hasCaptchaToken) {
this.isLoading = false;
return;
}
if (this.errors > 0) {
this.isLoading = false;
this.setErrorMessages('La\u0020validation\u0020ReCaptcha\u0020a\u0020\u00E9chou\u00E9,\u0020veuillez\u0020r\u00E9essayer');
return;
}
return this.doSubmit($form);
}).catch(() => {
this.isLoading = false;
});
},
async doSubmit($form) {
const formData = new FormData($form);
fetch($form.action, {
method: 'POST',
body: formData,
headers: {'X-Requested-With': 'XMLHttpRequest'},
})
.then(response => response.json())
.then(data => {
if (data.success) {
const successMsg = document.createElement('div');
successMsg.className = 'mb-4 text-green text-sm';
successMsg.textContent = data.message;
$form.prepend(successMsg);
const currentPath = window.location.pathname;
if (currentPath.includes('checkout/cart')) {
window.location.href = 'https://www.avril-beaute.fr/checkout/';
} else {
window.location.reload();
}
} else {
this.globalError = data.message || 'Une\u0020erreur\u0020s\u0027est\u0020produite.\u0020Veuillez\u0020r\u00E9essayez\u0020s\u2019il\u0020vous\u0020pla\u00EEt.';
this.isLoading = false;
}
})
.catch((error) => {
this.globalError = 'Une\u0020erreur\u0020s\u0027est\u0020produite.\u0020Veuillez\u0020r\u00E9essayez\u0020s\u2019il\u0020vous\u0020pla\u00EEt.';
console.error(error);
this.isLoading = false;
});
}
}
}
</script>
</div>
<div x-show="!showRegisterForm" x-transition>
<div id="container-header-login" class="px-6 mt-8">
<div class="mb-3">
<p id="customer-menu-drawer-title" class="text-28 font-abhayalibre font-bold">
<span>Déjà client ?</span>
</p>
</div>
<form id="customer-authentication-popup-customer-form-login"
x-data="initCustomerHeaderLoginForm_6acf38a4965e9()"
@submit.prevent="submitForm()"
class="form header-form-login w-full">
<input name="form_key" type="hidden" value="ThSMex3EkPNfSLKM" />
<fieldset class="fieldset login">
<div class="field email required mb-4">
<input type="email" name="login[username]"
class="form-input w-full"
required
placeholder="E-mail*"
value=""
autocomplete="off"
/>
</div>
<div class="field password required">
<div class="relative w-full">
<input type="password" name="login[password]"
class="form-input w-full"
required
placeholder="Mot de passe*"
autocomplete="off"
:type="showPassword ? 'text' : 'password'"
/>
<button type="button" x-on:click="showPassword = !showPassword"
class="absolute top-1/2 right-0 -translate-y-1/2 px-4 py-3">
<template x-if="!showPassword">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="14" viewbox="0 0 22 16" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M1.06251 8.34738C0.979165 8.12287 0.979165 7.8759 1.06251 7.65138C1.87421 5.68324 3.25202 4.00042 5.02128 2.81628C6.79053 1.63214 8.87155 1 11.0005 1C13.1295 1 15.2105 1.63214 16.9797 2.81628C18.749 4.00042 20.1268 5.68324 20.9385 7.65138C21.0218 7.8759 21.0218 8.12287 20.9385 8.34738C20.1268 10.3155 18.749 11.9983 16.9797 13.1825C15.2105 14.3666 13.1295 14.9988 11.0005 14.9988C8.87155 14.9988 6.79053 14.3666 5.02128 13.1825C3.25202 11.9983 1.87421 10.3155 1.06251 8.34738Z" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 11C12.6569 11 14 9.65685 14 8C14 6.34315 12.6569 5 11 5C9.34315 5 8 6.34315 8 8C8 9.65685 9.34315 11 11 11Z" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>
<template x-if="showPassword">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="14" viewbox="0 0 22 16" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M1.06251 8.34738C0.979165 8.12287 0.979165 7.8759 1.06251 7.65138C1.87421 5.68324 3.25202 4.00042 5.02128 2.81628C6.79053 1.63214 8.87155 1 11.0005 1C13.1295 1 15.2105 1.63214 16.9797 2.81628C18.749 4.00042 20.1268 5.68324 20.9385 7.65138C21.0218 7.8759 21.0218 8.12287 20.9385 8.34738C20.1268 10.3155 18.749 11.9983 16.9797 13.1825C15.2105 14.3666 13.1295 14.9988 11.0005 14.9988C8.87155 14.9988 6.79053 14.3666 5.02128 13.1825C3.25202 11.9983 1.87421 10.3155 1.06251 8.34738Z" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 11C12.6569 11 14 9.65685 14 8C14 6.34315 12.6569 5 11 5C9.34315 5 8 6.34315 8 8C8 9.65685 9.34315 11 11 11Z" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>
</button>
</div>
</div>
<div class="flex flex-col mt-4 gap-4">
<a href="https://www.avril-beaute.fr/customer/account/forgotpassword/" class="text-sm underline">
Mot de passe oublié ? </a>
<button type="submit"
class="btn btn-primary mx-auto text-sm !px-16 !py-3"
:disabled="isLoading || disabledByRecaptcha"
x-bind:aria-busy="isLoading ? 'true' : 'false'">
<span
x-text="isLoading ? 'Chargement\u0020en\u0020cours...' : 'Me\u0020connecter'"></span>
</button>
<div class="control">
<input type="hidden"
value=""
name="g-recaptcha-response"
>
</div>
</div>
<div>
<template x-if="displayErrorMessage">
<p class="text-red flex items-center mt-4 gap-2.5">
<span class="inline-block">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
<title>exclamation-circle</title></svg>
</span>
<template x-for="(errorMessage, idx) in errorMessages" :key="idx">
<span x-html="errorMessage"></span>
</template>
</p>
</template>
</div>
</fieldset>
</form>
</div>
<script>
function initCustomerHeaderLoginForm_6acf38a4965e9() {
return {
errors: 0,
hasCaptchaToken: 0,
isLoading: false,
showPassword: false,
displayErrorMessage: false,
errorMessages: [],
disabledByRecaptcha: false,
setErrorMessages(messages) {
this.errorMessages = Array.isArray(messages) ? messages : [messages];
this.displayErrorMessage = this.errorMessages.length > 0;
},
async submitForm() {
this.isLoading = true;
this.displayErrorMessage = false;
this.errorMessages = [];
const $form = document.querySelector('#customer-authentication-popup-customer-form-login');
if (!this.hasCaptchaToken) {
this.errors = 1;
const lockSubmitButton = () => {
$form.querySelector('[type="submit"]')?.setAttribute('disabled', true);
};
const failCaptcha = (errorMessage, exception = null) => {
this.errors = 1;
lockSubmitButton();
if (this.setErrorMessages) {
this.setErrorMessages([errorMessage]);
this.displayErrorMessage = true;
} else {
window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000);
}
if (exception) {
console.error(
exception ||
'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?'
);
}
};
const executeGreCaptcha = () => {
grecaptcha.ready(() => {
grecaptcha.execute(
'6LcFYF4qAAAAADImTOaJzO6csad6UWhk\u002D3kW7m4q',
{action: 'submit'}
).then((token) => {
const tokenElement = $form['g\u002Drecaptcha\u002Dresponse'];
if (tokenElement && token && token.length > 0) {
$form['g\u002Drecaptcha\u002Dresponse'].value = token;
this.errors = 0;
this.hasCaptchaToken = 1;
(this.submitForm || $form.submit).call(this);
} else {
failCaptcha(
tokenElement
? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
: 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
);
}
}).catch((exception) => {
failCaptcha(
'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.',
exception
);
});
});
};
if (window.grecaptcha) {
executeGreCaptcha();
} else {
const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LcFYF4qAAAAADImTOaJzO6csad6UWhk\u002D3kW7m4q";
const script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', recaptchaUrl);
document.head.appendChild(script);
script.addEventListener("load", executeGreCaptcha, false);
}
}
if (!this.hasCaptchaToken) {
this.isLoading = false;
return;
}
if (this.errors > 0) {
this.isLoading = false;
this.setErrorMessages('La\u0020validation\u0020ReCaptcha\u0020a\u0020\u00E9chou\u00E9,\u0020veuillez\u0020r\u00E9essayer');
return;
}
return this.doSubmit($form);
},
async doSubmit($form) {
const formData = new FormData($form);
try {
const response = await fetch('https://www.avril-beaute.fr/customer/ajax/loginpost/', {
method: 'POST',
body: formData,
headers: {
'X-Requested-With': 'XMLHttpRequest'
},
credentials: 'same-origin'
});
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
if (data.redirectUrl) {
window.location.href = data.redirectUrl;
return;
}
if (data.success) {
const currentPath = window.location.pathname;
if (currentPath.includes('checkout/cart')) {
window.location.href = 'https://www.avril-beaute.fr/checkout/';
} else {
window.location.reload();
}
} else {
this.setErrorMessages(data.message || 'Identifiant\u0020ou\u0020mot\u0020de\u0020passe\u0020invalide.');
this.isLoading = false;
}
} catch (err) {
this.setErrorMessages('Une\u0020erreur\u0020s\u0027est\u0020produite.\u0020Merci\u0020d\u0027essayer\u0020ult\u00E9rieurement.');
console.error(err);
this.isLoading = false;
}
}
}
}
</script>
</div>
<div x-show="!showRegisterForm" x-transition class="mt-auto">
<div class="pt-20 pb-8 rounded-xl px-6 flex flex-col">
<div class="mb-3">
<p class="text-28 font-abhayalibre font-bold">Vous êtes professionnel ?</p>
</div>
<a href="https://www.avril-pro.fr/customer/account/login/referer" class="text-sm underline">
Rendez-vous sur notre site Avril pro </a>
</div>
</div>
<button
type="button"
@click="closeCustomerMenuDrawer"
aria-label="Fermer"
class="absolute top-6 right-4 p-4"
>
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 14 14" fill="none" class="stroke-primary" aria-hidden="true">
<path d="M13 1L1 13M1 1L13 13" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
</div>
</section>
<!-- /BLOCK authentication-popup --></div>
</header><div class="page-main"><div class="page messages"><script>
window.defaultSuccessMessageTimeout = 5000;
function initMessages() {
"use strict";
return {
messages: window.mageMessages || [],
isEmpty() {
return this.messages.reduce(
function (isEmpty, message) {
return isEmpty && message === undefined
}, true
)
},
hasMessages() {
return !this.isEmpty();
},
hasMessage() {
return !!this.message;
},
removeMessage() {
this.messages[this.index] = undefined;
},
addMessages(messages, hideAfter) {
messages.map((message) => {
if (!message.text || !message.text.trim()) return;
this.messages = this.messages.concat(message);
if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) {
hideAfter = window.defaultSuccessMessageTimeout;
}
if (hideAfter) {
this.setHideTimeOut(this.messages.length -1, hideAfter);
}
});
},
setHideTimeOut(messageIndex, hideAfter) {
setTimeout((messageIndex) => {
this.messages[messageIndex] = undefined;
}, hideAfter, messageIndex);
},
eventListeners: {
['@messages-loaded.window'](event) {
this.addMessages(event.detail.messages, event.detail.hideAfter)
},
['@private-content-loaded.window'](event) {
const data = event.detail.data;
if (
data.messages &&
data.messages.messages &&
data.messages.messages.length
) {
this.addMessages(data.messages.messages);
}
},
['@clear-messages.window']() {
this.messages = [];
},
['@pageshow.window'](event) {
if (event.persisted) {
this.messages = [];
};
}
},
getMessageUiId() {
return 'message-' + this.message.type;
}
}
}
window.addEventListener('alpine:init', () => Alpine.data('initMessages', initMessages), {once: true})
</script>
<section id="messages"
x-data="initMessages"
x-bind="eventListeners"
role="alert"
>
<template x-if="hasMessages">
<div class="w-full">
<div class="messages container mx-auto py-3">
<template x-for="(message, index) in messages" :key="index">
<div>
<template x-if="hasMessage">
<div class="message"
:class="message.type"
:ui-id="getMessageUiId"
>
<span x-html="message.text"></span>
<button
type="button"
class="text-gray-600 hover:text-black"
aria-label="Close message"
@click.prevent="removeMessage"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="18" height="18" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
</div>
</template>
</div>
</template>
</div>
</div>
</template>
</section>
</div></div><main id="maincontent" class="page-main-full-width"><div id="contentarea" tabindex="-1"></div>
<div class="columns"><aside class="sidebar sidebar-main">
<div id="products-filter"
class="block p-0 m-0"
x-data="initLayeredNavigation()"
x-init="checkIsMobileResolution()"
@resize.window.debounce="checkIsMobileResolution()"
@visibilitychange.window.debounce="checkIsMobileResolution()"
x-bind="eventListeners"
>
<div class="container-filter" :class="{'active': open}">
<div class="flex justify-end items-center md:mt-5">
<a @click="open = false;" href="javascript:;">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 14 14" fill="none" aria-hidden="true">
<path d="M13 1L1 13M1 1L13 13" stroke="#1D1D1B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
</div>
<div class="block-title h-10 flex items-center justify-between" @click="blockOpen = !blockOpen">
<div>
<span class="title">
filtrer & affiner </span>
</div>
<div class="erase-filter" >
</div>
</div>
<div id="filters-content"
class="block-content filter-content pt-3 mb-6"
:class="{'!block': blockOpen}">
<div class="filter-option border-b py-4"
data-filter-name="Type d'articles"
:class="{'hidden': !$store.category.config.items.filterItems.categorie_articleFilter.length && !$store.category.hasMoreItems.categorie_articleFilter}"
x-data="{ accordionOpen: false }">
<div class="filter-options-title flex justify-between items-center cursor-pointer hover:text-secondary-darker border-container"
@click="accordionOpen = !accordionOpen">
<span class="title text-15 font-light text-primary text-sans-serif">
Type d'articles </span>
<span class="py-1 px-1 border-container">
<svg width="24" height="24" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"
class="transition-transform transform duration-300 ease-in-out"
:class="accordionOpen ? 'rotate-180' : ''">
<path d="M19 9L12 16L5 9" stroke="#4A5568" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round" />
</svg>
</span>
</div>
<div class="filter-options-content pt-3 hidden" :class="{ 'hidden': !accordionOpen , 'block': accordionOpen }">
<div class="categorie_articleFilter" x-data="{ options: {"component":"Smile_ElasticsuiteCatalog\/js\/attribute-filter","maxSize":100,"displayProductCount":true,"hasMoreItems":false,"displayRelNofollow":null,"ajaxLoadUrl":"https:\/\/www.avril-beaute.fr\/catalog\/navigation_filter\/ajax\/id\/216\/?cat=216&filterName=categorie_article","items":[{"label":"Coffrets cadeaux","count":22,"url":"aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL2NhZGVhdXgvY2FkZWF1eC5odG1sP2NhdGVnb3JpZV9hcnRpY2xlPUNvZmZyZXRzK2NhZGVhdXg~","is_selected":false},{"label":"Furoshiki","count":6,"url":"aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL2NhZGVhdXgvY2FkZWF1eC5odG1sP2NhdGVnb3JpZV9hcnRpY2xlPUZ1cm9zaGlraQ~~","is_selected":false},{"label":"Pochette","count":4,"url":"aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL2NhZGVhdXgvY2FkZWF1eC5odG1sP2NhdGVnb3JpZV9hcnRpY2xlPVBvY2hldHRl","is_selected":false},{"label":"Sac","count":4,"url":"aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL2NhZGVhdXgvY2FkZWF1eC5odG1sP2NhdGVnb3JpZV9hcnRpY2xlPVNhYw~~","is_selected":false},{"label":"Coffrets \u00e0 composer","count":2,"url":"aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL2NhZGVhdXgvY2FkZWF1eC5odG1sP2NhdGVnb3JpZV9hcnRpY2xlPUNvZmZyZXRzKyVDMyVBMCtjb21wb3Nlcg~~","is_selected":false},{"label":"Vernis Color\u00e9s","count":1,"url":"aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL2NhZGVhdXgvY2FkZWF1eC5odG1sP2NhdGVnb3JpZV9hcnRpY2xlPVZlcm5pcytDb2xvciVDMyVBOXM~","is_selected":false}],"sections":[]}, filterName: 'categorie_articleFilter', searchLabel: `Rechercher (%s)`, showMoreLabel: `Afficher plus`, showLessLabel: `Voir moins`, noSearchResultLabel: `Aucun résultat pour la recherche <b>%s</b>.`, expanded: false, items: [], lastSelectIndex: 0, maxSize: 0, displayedItems: [], fulltextSearch: null, result: 0, init() { Alpine.store('category').hasMoreItems[this.filterName] = this.options.hasMoreItems this.items = this.options.items.map(this.addItemId.bind(this)); let lastSelectedIndex = Math.max.apply(null, (this.items.map( function (v, k) { return v['is_selected'] ? k : 0; })) ); this.maxSize = Math.max(this.options.maxSize, lastSelectedIndex + 1); this.onShowLess(); this.displayedItems = this.getDisplayedItems(); }, loadAdditionalItems: async function (callback) { // ajaxLoadUrl already carries the current query string (built with _current), and the filters // are re-rendered on each AJAX layer update, so it is never stale const response = await fetch(this.options.ajaxLoadUrl, { method: 'GET', headers: { 'X-Requested-With': 'XMLHttpRequest', }, }) const data = await response.json() this.items = data.map(this.addItemId.bind(this)) this.options.hasMoreItems = false if (callback) return callback() }, getDisplayedItems: function () { let items = this.items; if (this.expanded === false) { items = this.items.slice(0, this.maxSize); } if (this.getFulltextSearch()) { let searchTokens = this.slugify(this.getFulltextSearch()).split('-'); let lastSearchToken = searchTokens.splice(-1, 1)[0]; items = items.filter(function (item) { let isValidItem = true; let itemTokens = this.slugify(item.label).split('-'); searchTokens.forEach(function (currentToken) { if (itemTokens.indexOf(currentToken) === -1) { isValidItem = false; } }) if (isValidItem && lastSearchToken) { let ngrams = itemTokens.map(function (token) { return token.substring(0, lastSearchToken.length) }); isValidItem = ngrams.indexOf(lastSearchToken) !== -1; } return isValidItem; }.bind(this)) } this.result = items.length; return items; }, /** * Does the search have a result */ hasSearchResult: function () { return this.getDisplayedItems().length > 0 }, /** * Search result message */ getSearchResultMessage: function () { return this.noSearchResultLabel.replace('%s', `'` + this.getFulltextSearch() + `'`) }, getFulltextSearch: function () { return this.fulltextSearch; }, /** * Callback for the 'Show more' button */ onShowMore: function () { if (this.options.hasMoreItems) { this.loadAdditionalItems(this.onShowMore.bind(this)); } else { this.expanded = true; Alpine.store('category').config.items.filterItems[this.filterName] = this.getDisplayedItems(); } this.displayedItems = this.getDisplayedItems(); }, /** * Index the text to be searched. */ slugify: function (text) { return text.toString().toLowerCase() .replace(/\s+/g, '-') // Replace spaces with - .replace(/[^\w\u0400-\u052F\u2DE0-\u2DFF\uA640-\uA69F'\-]+/g, '') // Remove all non-word chars .replace(/\-\-+/g, '-') // Replace multiple - with single - .replace(/^-+/, '') // Trim - from start of text }, /** * Callback for the 'Show less' button */ onShowLess: function () { this.expanded = false; Alpine.store('category').config.items.filterItems[this.filterName] = this.getDisplayedItems(); this.displayedItems = this.getDisplayedItems(); }, /** * Check if the filter can be expanded * * @returns {boolean} */ enableExpansion: function () { return this.options.hasMoreItems || this.items.length > this.maxSize; }, /** * Displays the 'Show More' link * * @returns {*|boolean} */ displayShowMore: function () { return this.enableExpansion() && this.expanded === false && !this.getFulltextSearch(); }, /** * Displays the 'Show Less' link * * @returns {*|boolean} */ displayShowLess: function () { return this.enableExpansion() && this.expanded === true && !this.getFulltextSearch(); }, /** * Add an id to items. */ addItemId: function (item) { item.id = Math.floor(Math.random() * 1000000) + '_option_'; item.displayProductCount = this.options.displayProductCount && (item.count >= 1); return item; } }">
<ol class="items">
<template x-for="attribute in $store.category.config.items.filterItems.categorie_articleFilter" hidden>
<li class="item my-1">
<span
class="flex justify-between mt-1.5 py-1 pr-1 text-sm hover:bg-gray-200 hover:text-primary cursor-pointer"
@click=" const targetUrl = $store.category.customBase64Decode(attribute.url); $store.category.updateLayer(targetUrl); expanded = false; "
>
<div class="flex items-center px-1.5 pointer-events-none">
<input :id="attribute.label" :name="attribute.label" class="pointer-events-none mr-1" type="checkbox" :checked="attribute.is_selected" />
<label :for="attribute.label" class="pointer-events-none" x-text="attribute.label"></label>
</div>
<span class="pointer-events-none count text-primary ml-1"
x-text="' (' + attribute.count + ')'"></span>
</span>
</li>
</template>
</ol>
<div class="no-results-message empty" x-model="result" x-show="getFulltextSearch() && !hasSearchResult()">
<p x-html="getSearchResultMessage()"></p>
</div>
<div class="actions" x-show="enableExpansion()">
<div class="secondary text-right">
<a class="action show-more underline text-secondary cursor-pointer" x-on:click="onShowMore()"
x-show="displayShowMore()"><span x-text="showMoreLabel + '+'"></span></a>
<a class="action show-less underline text-secondary cursor-pointer" x-on:click="onShowLess()"
x-show="displayShowLess()"><span x-text="showLessLabel + '-'"></span></a>
</div>
</div>
</div>
</div>
</div>
</div>
<a href="javascript:;"
class="btn-filters sidebar !px-8 !py-4"
@is-loading.window="isLoading = $event.detail"
@update-label-btn.window="label = $event.detail"
x-show="!isLoading"
@click="applyFilters()">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 16 16" fill="none" aria-hidden="true">
<path d="M14.1673 7.99862H5.93065M3.02332 7.99862H1.83398M3.02332 7.99862C3.02332 7.61318 3.17644 7.24352 3.44899 6.97096C3.72154 6.69841 4.0912 6.54529 4.47665 6.54529C4.8621 6.54529 5.23176 6.69841 5.50431 6.97096C5.77687 7.24352 5.92998 7.61318 5.92998 7.99862C5.92998 8.38407 5.77687 8.75373 5.50431 9.02629C5.23176 9.29884 4.8621 9.45196 4.47665 9.45196C4.0912 9.45196 3.72154 9.29884 3.44899 9.02629C3.17644 8.75373 3.02332 8.38407 3.02332 7.99862ZM14.1673 12.4033H10.3353M10.3353 12.4033C10.3353 12.7888 10.1818 13.1589 9.90921 13.4315C9.6366 13.7041 9.26685 13.8573 8.88132 13.8573C8.49587 13.8573 8.12621 13.7035 7.85366 13.431C7.5811 13.1584 7.42798 12.7887 7.42798 12.4033M10.3353 12.4033C10.3353 12.0178 10.1818 11.6483 9.90921 11.3757C9.6366 11.1031 9.26685 10.95 8.88132 10.95C8.49587 10.95 8.12621 11.1031 7.85366 11.3756C7.5811 11.6482 7.42798 12.0178 7.42798 12.4033M7.42798 12.4033H1.83398M14.1673 3.59396H12.0973M9.18998 3.59396H1.83398M9.18998 3.59396C9.18998 3.20851 9.3431 2.83885 9.61566 2.5663C9.88821 2.29374 10.2579 2.14063 10.6433 2.14063C10.8342 2.14062 11.0232 2.17822 11.1995 2.25125C11.3758 2.32429 11.536 2.43134 11.671 2.5663C11.8059 2.70125 11.913 2.86147 11.986 3.03779C12.0591 3.21412 12.0966 3.4031 12.0966 3.59396C12.0966 3.78481 12.0591 3.9738 11.986 4.15013C11.913 4.32645 11.8059 4.48667 11.671 4.62162C11.536 4.75657 11.3758 4.86363 11.1995 4.93666C11.0232 5.0097 10.8342 5.04729 10.6433 5.04729C10.2579 5.04729 9.88821 4.89417 9.61566 4.62162C9.3431 4.34907 9.18998 3.97941 9.18998 3.59396Z" stroke-miterlimit="10" stroke-linecap="round"/>
</svg>
<span x-text="label"></span>
</a>
</div>
<div class="overlay" :class="{'active': open}" @click="open = false;" @is-loading.window="isLoading = $event.detail">
</div>
<a href="javascript:;" class="btn-filters !px-8 !py-4" @click="changeStatus(true)">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 16 16" fill="none" aria-hidden="true">
<path d="M14.1673 7.99862H5.93065M3.02332 7.99862H1.83398M3.02332 7.99862C3.02332 7.61318 3.17644 7.24352 3.44899 6.97096C3.72154 6.69841 4.0912 6.54529 4.47665 6.54529C4.8621 6.54529 5.23176 6.69841 5.50431 6.97096C5.77687 7.24352 5.92998 7.61318 5.92998 7.99862C5.92998 8.38407 5.77687 8.75373 5.50431 9.02629C5.23176 9.29884 4.8621 9.45196 4.47665 9.45196C4.0912 9.45196 3.72154 9.29884 3.44899 9.02629C3.17644 8.75373 3.02332 8.38407 3.02332 7.99862ZM14.1673 12.4033H10.3353M10.3353 12.4033C10.3353 12.7888 10.1818 13.1589 9.90921 13.4315C9.6366 13.7041 9.26685 13.8573 8.88132 13.8573C8.49587 13.8573 8.12621 13.7035 7.85366 13.431C7.5811 13.1584 7.42798 12.7887 7.42798 12.4033M10.3353 12.4033C10.3353 12.0178 10.1818 11.6483 9.90921 11.3757C9.6366 11.1031 9.26685 10.95 8.88132 10.95C8.49587 10.95 8.12621 11.1031 7.85366 11.3756C7.5811 11.6482 7.42798 12.0178 7.42798 12.4033M7.42798 12.4033H1.83398M14.1673 3.59396H12.0973M9.18998 3.59396H1.83398M9.18998 3.59396C9.18998 3.20851 9.3431 2.83885 9.61566 2.5663C9.88821 2.29374 10.2579 2.14063 10.6433 2.14063C10.8342 2.14062 11.0232 2.17822 11.1995 2.25125C11.3758 2.32429 11.536 2.43134 11.671 2.5663C11.8059 2.70125 11.913 2.86147 11.986 3.03779C12.0591 3.21412 12.0966 3.4031 12.0966 3.59396C12.0966 3.78481 12.0591 3.9738 11.986 4.15013C11.913 4.32645 11.8059 4.48667 11.671 4.62162C11.536 4.75657 11.3758 4.86363 11.1995 4.93666C11.0232 5.0097 10.8342 5.04729 10.6433 5.04729C10.2579 5.04729 9.88821 4.89417 9.61566 4.62162C9.3431 4.34907 9.18998 3.97941 9.18998 3.59396Z" stroke-miterlimit="10" stroke-linecap="round"/>
</svg>
Filtrer </a>
</div>
<script>
function initLayeredNavigation() {
return {
isMobile: false,
blockOpen: false,
isLoading: false,
open: false,
label: '',
changeStatus: function (newStatus) {
if (newStatus === true && this.open === false) {
let count = parseInt(document.querySelector('.toolbar-number')?.innerText || '0', 10);
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'filter',
event_parameter: 'opening',
event_value: count
});
}
this.open = newStatus;
if (this.open === true) {
let count = parseInt(document.querySelector('.toolbar-number')?.innerText || '0', 10);
let label = 'Voir\u0020le\u0020r\u00E9sultat';
if (count > 1) {
label = 'Voir\u0020les\u0020\u00251\u0020r\u00E9sultats';
}
this.label = label.replace('%1', count);
}
},
applyFilters: function() {
this.open = false;
const activeFilters = [];
document.querySelectorAll('.filter-option').forEach(option => {
const hasActive = option.querySelector('.filter-item.active, .filter-item.selected, .swatch-option.selected, input:checked');
if (hasActive) {
const filterName = option.dataset.filterName;
if (filterName) activeFilters.push(filterName);
}
});
if (activeFilters.length > 0) {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'filter',
event_parameter: 'apply',
event_value: activeFilters.join('|')
});
}
},
checkIsMobileResolution: function () {
this.isMobile = window.outerWidth < 768
},
eventListeners: {
['@open-filters-modal.window']() {
this.changeStatus(true);
}
}
}
}
</script>
</aside><div class="column main">
<div class="custom-category-title min-h-24 md:min-h-[330px] relative md:overflow-hidden md:bg-transparent">
<img src="https://avril.twic.pics/media/catalog/category/7-_Cat_gorie_CADEAUX_copie_2_retouch_.jpg?twic=v1/cover=2880x666"
title="Cadeaux"
class="w-full h-full md:absolute object-cover no-responsive hidden md:block"
width="1440"
height="333"
alt="Cadeaux"
/>
<img src="https://avril.twic.pics/media/catalog/category/7-_Cat_gorie_CADEAUX_mobile_1_1.jpg?twic=v1/cover=780x400"
title="Cadeaux"
class="w-full object-cover no-responsive !h-[200px] md:hidden"
width="390"
height="200"
alt="Cadeaux"
/>
<div class="relative w-full container mx-auto py-5 md:pt-48 px-4 md:pb-14">
<div>
<nav class="breadcrumbs bg-container-lighter text-slate-900" aria-label="Breadcrumb">
<div class="container">
<ol class="items list-reset py-4 rounded flex flex-wrap text-grey text-sm md:px-2.5">
<li class="item flex home">
<a
href="https://www.avril-beaute.fr/"
aria-label="Aller à la page d’accueil"
>Accueil</a>
</li>
<li class="item flex category215">
<span aria-hidden="true" class="separator text-slate-600 px-2">/</span>
<a
href="https://www.avril-beaute.fr/cadeaux.html"
>Cadeaux </a>
</li>
<li class="item flex category216">
<span aria-hidden="true" class="separator text-slate-600 px-2">/</span>
<span
class="text-slate-600"
aria-current="page"
>Cadeaux</span>
</li>
</ol>
</div>
</nav>
<script type="application/ld+json">
{ "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/www.avril-beaute.fr\/","name":"Accueil"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/www.avril-beaute.fr\/cadeaux.html","name":"Cadeaux\t\t"}},{"@type":"ListItem","position":3,"item":{"@id":"https:\/\/www.avril-beaute.fr\/cadeaux\/cadeaux.html","name":"Cadeaux"}}] }
</script>
</div>
<h1 class="category-title lowercase">Coffrets cadeaux & emballage</h1>
<div class="category-description md:w-[36%]"><style>#html-body [data-pb-style=QJXM5QK]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="QJXM5QK"><div data-content-type="text" data-appearance="default" data-element="main"></div></div></div></div>
<div class="subcategories-list mdonly:overflow-y-auto w-full" style="scrollbar-width: none;">
<ul class="w-max md:w-full flex gap-2.5 md:flex-wrap">
<li>
<h2 class="!font-sans btn btn-senary transition-colors duration-500 ease-in-out">
<a href="https://www.avril-beaute.fr/cadeaux/cadeaux/coffrets-cadeaux.html">
Coffrets cadeaux </a>
</h2>
</li>
<li>
<h2 class="!font-sans btn btn-senary transition-colors duration-500 ease-in-out">
<a href="https://www.avril-beaute.fr/cadeaux/cadeaux/emballage-cadeau.html">
Emballage cadeau </a>
</h2>
</li>
<li>
<h2 class="!font-sans btn btn-senary transition-colors duration-500 ease-in-out">
<a href="https://www.avril-beaute.fr/cadeaux/cadeaux/carte-cadeau.html">
Carte cadeau </a>
</h2>
</li>
</ul>
</div>
</div>
</div>
<script>window.puqConfig = {"fix_min_max_sale_qty_error_messages":true,"fix_validate_grouped_qty":true};</script><div class="category-list-view">
<section class="container pt-3 md:pt-8 py-8 px-4 bg-white" id="product-list"
aria-label="Product list" tabindex="-1">
<div class="active-filters" x-data>
</div>
<script>
function initToolbar_6acf38a246d78() {
return {
options: {"productListToolbarForm":{"mode":"product_list_mode","direction":"product_list_dir","order":"product_list_order","limit":"product_list_limit","modeDefault":"grid","directionDefault":"asc","orderDefault":"position","limitDefault":36,"url":"https:\/\/www.avril-beaute.fr\/cadeaux\/cadeaux.html","formKey":"ThSMex3EkPNfSLKM","post":false,"page":"p","ajax":true}}.productListToolbarForm || {},
getUrlParams: function () {
let decode = window.decodeURIComponent,
urlPaths = this.options.url.split('?'),
urlParams = urlPaths[1] ? urlPaths[1].split('&') : [],
params = {},
parameters, i;
for (i = 0; i < urlParams.length; i++) {
parameters = urlParams[i].split('=');
params[decode(parameters[0])] = parameters[1] !== undefined ?
decode(parameters[1].replace(/\+/g, '%20')) :
'';
}
return params;
},
getCurrentLimit: function () {
return this.getUrlParams()[this.options.limit] || this.options.limitDefault;
},
getCurrentPage: function () {
return this.getUrlParams()[this.options.page] || 1;
},
changeUrl(paramName, paramValue, defaultValue) {
let urlPaths = this.options.url.split('?'),
baseUrl = urlPaths[0],
paramData = this.getUrlParams(),
currentPage = this.getCurrentPage(),
newPage;
/**
* calculates the page on which the first item of the current page will
* be with the new limit and sets that number as the new page
*/
if (currentPage > 1 && paramName === this.options.limit) {
newPage = Math.floor(this.getCurrentLimit() * (currentPage - 1) / paramValue) + 1;
if (newPage > 1) {
paramData[this.options.page] = newPage;
} else {
delete paramData[this.options.page];
}
}
paramData[paramName] = paramValue;
if (this.options.post) {
hyva.postForm({action: baseUrl, data: paramData});
} else {
if (paramValue === defaultValue.toString()) {
delete paramData[paramName];
}
paramData = Object.keys(paramData).length === 0
? ''
: '?' + (new URLSearchParams(paramData));
location.href = baseUrl + paramData
}
}
}
}
</script>
<div x-data="initToolbar_6acf38a246d78()"
class="toolbar toolbar-products items-center container">
<p class="toolbar-amount text-sm leading-5 text-primary order-3 sm:order-2 md:order-3 lg:order-2 col-span-2 gap-x-1"
id="toolbar-amount">
<span class="toolbar-number">
39 </span>
produits</p>
</div>
<div class="products container wrapper product-items mode-grid products-grid">
<div x-data="initProductCard()" x-init="getQuoteItems()"
class="mx-auto pt-4 pb-12 grid gap-4 grid-cols-2 sm:grid-cols-3 xl:grid-cols-4 auto-rows-fr grid-flow-dense">
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1932/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="2325"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1932"/>
<a href="https://www.avril-beaute.fr/calendrier-de-l-avent-2026-24-jours-pour-bien-etre-soi-2325.html"
title="Calendrier de l'Avent 2026 - 24 jours pour bien être soi"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1932.window="$root.src = $event.detail"
loading="eager"
fetchpriority="high"
src="https://avril.twic.pics/media/catalog/product/2/3/2325_2_1791932557_1.png?twic=v1/cover=680x680"
width="340"
height=""
alt="Calendrier de l'Avent 2026 - 24 jours pour bien être soi"
title="Calendrier de l'Avent 2026 - 24 jours pour bien être soi"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1932.window="$root.src = $event.detail"
loading="eager"
fetchpriority="high"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/2/3/2325_1_1791932557_1.png?twic=v1/cover=680x680"
width="340"
height=""
alt="Calendrier de l'Avent 2026 - 24 jours pour bien être soi"
title="Calendrier de l'Avent 2026 - 24 jours pour bien être soi"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-yellow_avril-100">Nouveauté</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"2325","productId":1932,"name":"Calendrier de l\u0027Avent 2026 - 24 jours pour bien \u00eatre soi"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1932)"
aria-label="Ajouter à ma liste d’envie Calendrier de l'Avent 2026 - 24 jours pour bien être soi"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1932"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Calendrier de l'Avent 2026 - 24 jours pour bien être soi</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1932.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1932" data-price-box="product-id-1932">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1932" data-price-amount="94.5"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">94,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Calendrier de l&#039;Avent 2026 - 24 jours pour bien être soi"
aria-label="Ajouter Calendrier de l&#039;Avent 2026 - 24 jours pour bien être soi"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('2325') }"
>
<span :class="{ 'hidden': isInCart('2325'), 'flex items-center gap-1': !isInCart('2325') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('2325'), 'hidden': !isInCart('2325') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1934/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="2293"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1934"/>
<a href="https://www.avril-beaute.fr/coffret-cadeau-essentiels-soins-2293.html"
title="Coffret cadeau Essentiels soins"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1934.window="$root.src = $event.detail"
loading="eager"
fetchpriority="high"
src="https://avril.twic.pics/media/catalog/product/2/2/2293_2_1791932556_1.png?twic=v1/cover=680x680"
width="340"
height=""
alt="Coffret cadeau Essentiels soins"
title="Coffret cadeau Essentiels soins"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1934.window="$root.src = $event.detail"
loading="eager"
fetchpriority="high"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/2/2/2293_1_1791932556_1.png?twic=v1/cover=680x680"
width="340"
height=""
alt="Coffret cadeau Essentiels soins"
title="Coffret cadeau Essentiels soins"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-yellow_avril-100">Nouveauté</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"2293","productId":1934,"name":"Coffret cadeau Essentiels soins"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1934)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Essentiels soins"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1934"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Essentiels soins</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1934.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1934" data-price-box="product-id-1934">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1934" data-price-amount="22"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">22 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Essentiels soins"
aria-label="Ajouter Coffret cadeau Essentiels soins"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('2293') }"
>
<span :class="{ 'hidden': isInCart('2293'), 'flex items-center gap-1': !isInCart('2293') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('2293'), 'hidden': !isInCart('2293') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<div class="col-span-2 row-span-2">
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1928/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="2291"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1928"/>
<a href="https://www.avril-beaute.fr/coffret-cadeau-routine-soin-visage-2291.html"
title="Coffret cadeau Routine soin visage"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 !m-0"
x-data=""
@update-gallery-1928.window="$root.src = $event.detail"
loading="eager"
fetchpriority="high"
src="https://avril.twic.pics/media/catalog/product/2/2/2291_2_1791932556_1.png?twic=v1/cover=1392x1776"
width="696"
height=""
alt="Coffret cadeau Routine soin visage"
title="Coffret cadeau Routine soin visage"
/>
<img class="object-cover w-full block m-auto image-1 absolute !m-0 h-full"
x-data=""
@update-gallery-1928.window="$root.src = $event.detail"
loading="eager"
fetchpriority="high"
src="https://avril.twic.pics/media/catalog/product/cache/b052555dfafd40b3e9bff3637b0b9f89/2/2/2291_1_1791932556_1.png?twic=v1/cover=1392x1776"
width="696"
height=""
alt="Coffret cadeau Routine soin visage"
title="Coffret cadeau Routine soin visage"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-yellow_avril-100">Nouveauté</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"2291","productId":1928,"name":"Coffret cadeau Routine soin visage"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1928)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Routine soin visage"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1928"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Routine soin visage</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1928.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1928" data-price-box="product-id-1928">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1928" data-price-amount="39"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">39 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Routine soin visage"
aria-label="Ajouter Coffret cadeau Routine soin visage"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('2291') }"
>
<span :class="{ 'hidden': isInCart('2291'), 'flex items-center gap-1': !isInCart('2291') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('2291'), 'hidden': !isInCart('2291') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
</div>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1601/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1891"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1601"/>
<a href="https://www.avril-beaute.fr/coffret-cadeau-routine-eclat-1891.html"
title="Coffret cadeau Routine éclat"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1601.window="$root.src = $event.detail"
loading="eager"
fetchpriority="high"
src="https://avril.twic.pics/media/catalog/product/1/8/1891_2_1791932554_1.png?twic=v1/cover=680x680"
width="340"
height=""
alt="Coffret cadeau Routine éclat"
title="Coffret cadeau Routine éclat"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1601.window="$root.src = $event.detail"
loading="eager"
fetchpriority="high"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/8/1891_1_1791932554_1.png?twic=v1/cover=680x680"
width="340"
height=""
alt="Coffret cadeau Routine éclat"
title="Coffret cadeau Routine éclat"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-yellow_avril-100">Nouveauté</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1891","productId":1601,"name":"Coffret cadeau Routine \u00e9clat"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1601)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Routine éclat"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1601"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="1891"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Routine éclat</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1601.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1601" data-price-box="product-id-1601">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1601" data-price-amount="23"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">23 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Routine éclat"
aria-label="Ajouter Coffret cadeau Routine éclat"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1891') }"
>
<span :class="{ 'hidden': isInCart('1891'), 'flex items-center gap-1': !isInCart('1891') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1891'), 'hidden': !isInCart('1891') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1929/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="2294"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1929"/>
<a href="https://www.avril-beaute.fr/coffret-cadeau-rituel-douceur-2294.html"
title="Coffret cadeau Rituel douceur"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1929.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/2/2/2294_2_1791932556_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Rituel douceur"
title="Coffret cadeau Rituel douceur"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1929.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/2/2/2294_1_1791932556_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Rituel douceur"
title="Coffret cadeau Rituel douceur"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-yellow_avril-100">Nouveauté</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"2294","productId":1929,"name":"Coffret cadeau Rituel douceur"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1929)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Rituel douceur"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1929"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Rituel douceur</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1929.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1929" data-price-box="product-id-1929">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1929" data-price-amount="30"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">30 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Rituel douceur"
aria-label="Ajouter Coffret cadeau Rituel douceur"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('2294') }"
>
<span :class="{ 'hidden': isInCart('2294'), 'flex items-center gap-1': !isInCart('2294') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('2294'), 'hidden': !isInCart('2294') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1931/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="2295"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1931"/>
<a href="https://www.avril-beaute.fr/coffret-cadeau-cocooning-2295.html"
title="Coffret cadeau Cocooning"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1931.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/2/2/2295_2_1791932556_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Cocooning"
title="Coffret cadeau Cocooning"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1931.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/2/2/2295_1_1791932556_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Cocooning"
title="Coffret cadeau Cocooning"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-yellow_avril-100">Nouveauté</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"2295","productId":1931,"name":"Coffret cadeau Cocooning"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1931)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Cocooning"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1931"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Cocooning</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1931.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1931" data-price-box="product-id-1931">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1931" data-price-amount="30"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">30 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Cocooning"
aria-label="Ajouter Coffret cadeau Cocooning"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('2295') }"
>
<span :class="{ 'hidden': isInCart('2295'), 'flex items-center gap-1': !isInCart('2295') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('2295'), 'hidden': !isInCart('2295') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1933/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="2296"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1933"/>
<a href="https://www.avril-beaute.fr/coffret-cadeau-essentiels-make-up-2296.html"
title="Coffret cadeau Essentiels Make-up"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1933.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/2/2/2296_2_1791932557_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Essentiels Make-up"
title="Coffret cadeau Essentiels Make-up"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1933.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/2/2/2296_1_1791932557_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Essentiels Make-up"
title="Coffret cadeau Essentiels Make-up"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-yellow_avril-100">Nouveauté</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"2296","productId":1933,"name":"Coffret cadeau Essentiels Make-up"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1933)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Essentiels Make-up"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1933"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Essentiels Make-up</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1933.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1933" data-price-box="product-id-1933">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1933" data-price-amount="27"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">27 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Essentiels Make-up"
aria-label="Ajouter Coffret cadeau Essentiels Make-up"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('2296') }"
>
<span :class="{ 'hidden': isInCart('2296'), 'flex items-center gap-1': !isInCart('2296') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('2296'), 'hidden': !isInCart('2296') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1930/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="2292"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1930"/>
<a href="https://www.avril-beaute.fr/coffret-cadeau-mes-essentiels-rechargeables-2292.html"
title="Coffret cadeau Mes essentiels rechargeables"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1930.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/2/2/2292_2_1791932556_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Mes essentiels rechargeables"
title="Coffret cadeau Mes essentiels rechargeables"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1930.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/2/2/2292_1_1791932556_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Mes essentiels rechargeables"
title="Coffret cadeau Mes essentiels rechargeables"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-yellow_avril-100">Nouveauté</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"2292","productId":1930,"name":"Coffret cadeau Mes essentiels rechargeables"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1930)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Mes essentiels rechargeables"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1930"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Mes essentiels rechargeables</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1930.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1930" data-price-box="product-id-1930">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1930" data-price-amount="21"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">21 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Mes essentiels rechargeables"
aria-label="Ajouter Coffret cadeau Mes essentiels rechargeables"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('2292') }"
>
<span :class="{ 'hidden': isInCart('2292'), 'flex items-center gap-1': !isInCart('2292') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('2292'), 'hidden': !isInCart('2292') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1025/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1872"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1025"/>
<input type="hidden"
name="bundle_option[10]"
value="17">
<input type="hidden"
name="bundle_option[11]"
value="18">
<input type="hidden"
name="bundle_option[103]"
value="578">
<a href="https://www.avril-beaute.fr/coffret-cadeau-cosmetique-bio-mon-duo-quotidien-1872.html"
title="Coffret cadeau Mon duo visage quotidien"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1025.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_mon_duo_quotidien_2500_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Mon duo visage quotidien"
title="Coffret cadeau Mon duo visage quotidien"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1025.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_mon_duo_quotidien_2500_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Mon duo visage quotidien"
title="Coffret cadeau Mon duo visage quotidien"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1872","productId":1025,"name":"Coffret cadeau Mon duo visage quotidien"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1025)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Mon duo visage quotidien"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1025"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="1872"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Mon duo visage quotidien</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1025.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1025" data-price-box="product-id-1025">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1025" data-price-amount="16.5"
data-price-type=""
class="price-wrapper"><span class="price">16,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Mon duo visage quotidien"
aria-label="Ajouter Coffret cadeau Mon duo visage quotidien"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1872') }"
>
<span :class="{ 'hidden': isInCart('1872'), 'flex items-center gap-1': !isInCart('1872') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1872'), 'hidden': !isInCart('1872') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1697/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="cc4"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1697"/>
<input type="hidden"
name="bundle_option[380]"
value="430">
<input type="hidden"
name="bundle_option[381]"
value="431">
<input type="hidden"
name="bundle_option[382]"
value="432">
<input type="hidden"
name="bundle_option[383]"
value="581">
<a href="https://www.avril-beaute.fr/coffret-cadeau-teint-eclatant.html"
title="Coffret cadeau Trio soins éclat visage"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1697.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_teint_clatant_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Trio soins éclat visage"
title="Coffret cadeau Trio soins éclat visage"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1697.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_teint_clatant_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Trio soins éclat visage"
title="Coffret cadeau Trio soins éclat visage"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"cc4","productId":1697,"name":"Coffret cadeau Trio soins \u00e9clat visage"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1697)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Trio soins éclat visage"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1697"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="cc4"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Trio soins éclat visage</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1697.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1697" data-price-box="product-id-1697">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1697" data-price-amount="30.5"
data-price-type=""
class="price-wrapper"><span class="price">30,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Trio soins éclat visage"
aria-label="Ajouter Coffret cadeau Trio soins éclat visage"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('cc4') }"
>
<span :class="{ 'hidden': isInCart('cc4'), 'flex items-center gap-1': !isInCart('cc4') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('cc4'), 'hidden': !isInCart('cc4') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1913/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="giftcard"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1913"/>
<a href="https://www.avril-beaute.fr/carte-cadeau.html"
title="Carte cadeau"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1913.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/c/a/carte_cadeau.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Carte cadeau"
title="Carte cadeau"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1913.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/a/v/avril_e-carte_cadeau_fr_avec_ombre_2_.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Carte cadeau"
title="Carte cadeau"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"giftcard","productId":1913,"name":"Carte cadeau"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1913)"
aria-label="Ajouter à ma liste d’envie Carte cadeau"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1913"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="giftcard"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Carte cadeau</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1913.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1913" data-price-box="product-id-1913">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1913" data-price-amount="0"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">0 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Carte cadeau"
aria-label="Ajouter Carte cadeau"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('giftcard') }"
>
<span :class="{ 'hidden': isInCart('giftcard'), 'flex items-center gap-1': !isInCart('giftcard') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('giftcard'), 'hidden': !isInCart('giftcard') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1026/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1873"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1026"/>
<input type="hidden"
name="bundle_option[12]"
value="19">
<input type="hidden"
name="bundle_option[13]"
value="20">
<input type="hidden"
name="bundle_option[104]"
value="580">
<a href="https://www.avril-beaute.fr/coffret-cadeau-cosmetique-bio-un-temps-pour-soi-1873.html"
title="Coffret cadeau Duo soins éclat visage"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1026.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_un_temps_pour_soi_copie.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Duo soins éclat visage"
title="Coffret cadeau Duo soins éclat visage"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1026.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_un_temps_pour_soi_copie.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Duo soins éclat visage"
title="Coffret cadeau Duo soins éclat visage"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1873","productId":1026,"name":"Coffret cadeau Duo soins \u00e9clat visage"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1026)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Duo soins éclat visage"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1026"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="1873"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Duo soins éclat visage</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1026.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1026" data-price-box="product-id-1026">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1026" data-price-amount="15.5"
data-price-type=""
class="price-wrapper"><span class="price">15,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Duo soins éclat visage"
aria-label="Ajouter Coffret cadeau Duo soins éclat visage"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1873') }"
>
<span :class="{ 'hidden': isInCart('1873'), 'flex items-center gap-1': !isInCart('1873') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1873'), 'hidden': !isInCart('1873') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1027/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1874"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1027"/>
<input type="hidden"
name="bundle_option[14]"
value="21">
<input type="hidden"
name="bundle_option[15]"
value="22">
<input type="hidden"
name="bundle_option[101]"
value="579">
<a href="https://www.avril-beaute.fr/coffret-cadeau-cosmetique-bio-mon-duo-masculin-1874.html"
title="Coffret cadeau Mon duo visage au masculin"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1027.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_mon_duo_au_masculin_copie.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Mon duo visage au masculin"
title="Coffret cadeau Mon duo visage au masculin"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1027.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_mon_duo_au_masculin_copie.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Mon duo visage au masculin"
title="Coffret cadeau Mon duo visage au masculin"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1874","productId":1027,"name":"Coffret cadeau Mon duo visage au masculin"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1027)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Mon duo visage au masculin"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1027"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="1874"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Mon duo visage au masculin</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1027.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1027" data-price-box="product-id-1027">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1027" data-price-amount="16.5"
data-price-type=""
class="price-wrapper"><span class="price">16,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Mon duo visage au masculin"
aria-label="Ajouter Coffret cadeau Mon duo visage au masculin"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1874') }"
>
<span :class="{ 'hidden': isInCart('1874'), 'flex items-center gap-1': !isInCart('1874') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1874'), 'hidden': !isInCart('1874') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1032/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1879"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1032"/>
<input type="hidden"
name="bundle_option[24]"
value="32">
<input type="hidden"
name="bundle_option[25]"
value="33">
<input type="hidden"
name="bundle_option[94]"
value="583">
<a href="https://www.avril-beaute.fr/coffret-cadeau-cosmetiques-bio-duo-matinal-1879.html"
title="Coffret cadeau Duo soins quotidiens corps"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1032.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_duo_matinal_1_ok_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Duo soins quotidiens corps"
title="Coffret cadeau Duo soins quotidiens corps"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1032.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_duo_matinal_1_ok_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Duo soins quotidiens corps"
title="Coffret cadeau Duo soins quotidiens corps"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1879","productId":1032,"name":"Coffret cadeau Duo soins quotidiens corps"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1032)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Duo soins quotidiens corps"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1032"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="1879"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Duo soins quotidiens corps</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1032.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1032" data-price-box="product-id-1032">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1032" data-price-amount="16.5"
data-price-type=""
class="price-wrapper"><span class="price">16,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Duo soins quotidiens corps"
aria-label="Ajouter Coffret cadeau Duo soins quotidiens corps"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1879') }"
>
<span :class="{ 'hidden': isInCart('1879'), 'flex items-center gap-1': !isInCart('1879') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1879'), 'hidden': !isInCart('1879') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1037/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1862"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1037"/>
<input type="hidden"
name="bundle_option[38]"
value="301">
<input type="hidden"
name="bundle_option[39]"
value="47">
<input type="hidden"
name="bundle_option[40]"
value="48">
<input type="hidden"
name="bundle_option[90]"
value="586">
<a href="https://www.avril-beaute.fr/coffret-cadeau-escale-dans-le-sud-1862.html"
title="Coffret cadeau Soins parfumés visage & corps "
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1037.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/c/o/coffret_cadeau_escale_dans_le_sud_2_ok.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Soins parfumés visage & corps "
title="Coffret cadeau Soins parfumés visage & corps "
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1037.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_escale_dans_le_sud_2_ok_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Soins parfumés visage & corps "
title="Coffret cadeau Soins parfumés visage & corps "
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1862","productId":1037,"name":"Coffret cadeau Soins parfum\u00e9s visage \u0026 corps "})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1037)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Soins parfumés visage & corps "
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1037"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="1862"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Soins parfumés visage & corps </span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1037.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1037" data-price-box="product-id-1037">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1037" data-price-amount="22.5"
data-price-type=""
class="price-wrapper"><span class="price">22,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Soins parfumés visage &amp; corps "
aria-label="Ajouter Coffret cadeau Soins parfumés visage &amp; corps "
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1862') }"
>
<span :class="{ 'hidden': isInCart('1862'), 'flex items-center gap-1': !isInCart('1862') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1862'), 'hidden': !isInCart('1862') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1035/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1876"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1035"/>
<input type="hidden"
name="bundle_option[33]"
value="41">
<input type="hidden"
name="bundle_option[34]"
value="584">
<input type="hidden"
name="bundle_option[92]"
value="585">
<a href="https://www.avril-beaute.fr/coffret-cadeau-cosmetiques-bio-mon-rituel-corps-1876.html"
title="Coffret cadeau Duo soins corps"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1035.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_duo_matinal_2_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Duo soins corps"
title="Coffret cadeau Duo soins corps"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1035.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_duo_matinal_2_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Duo soins corps"
title="Coffret cadeau Duo soins corps"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1876","productId":1035,"name":"Coffret cadeau Duo soins corps"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1035)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Duo soins corps"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1035"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Duo soins corps</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1035.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1035" data-price-box="product-id-1035">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1035" data-price-amount="21.5"
data-price-type=""
class="price-wrapper"><span class="price">21,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Duo soins corps"
aria-label="Ajouter Coffret cadeau Duo soins corps"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1876') }"
>
<span :class="{ 'hidden': isInCart('1876'), 'flex items-center gap-1': !isInCart('1876') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1876'), 'hidden': !isInCart('1876') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1649/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="cc1"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1649"/>
<input type="hidden"
name="bundle_option[327]"
value="590">
<input type="hidden"
name="bundle_option[322]"
value="356">
<input type="hidden"
name="bundle_option[323]"
value="591">
<input type="hidden"
name="bundle_option[325]"
value="359">
<input type="hidden"
name="bundle_option[332]"
value="592">
<a href="https://www.avril-beaute.fr/coffret-cadeau-mon-kit-rasage-cc1.html"
title="Coffret cadeau Rasage & soins visage homme "
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1649.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_homme_2_ok2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Rasage & soins visage homme "
title="Coffret cadeau Rasage & soins visage homme "
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1649.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_homme_2_ok2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Rasage & soins visage homme "
title="Coffret cadeau Rasage & soins visage homme "
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"cc1","productId":1649,"name":"Coffret cadeau Rasage \u0026 soins visage homme "})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1649)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Rasage & soins visage homme "
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1649"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="cc1"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Rasage & soins visage homme </span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1649.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1649" data-price-box="product-id-1649">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1649" data-price-amount="32.5"
data-price-type=""
class="price-wrapper"><span class="price">32,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Rasage &amp; soins visage homme "
aria-label="Ajouter Coffret cadeau Rasage &amp; soins visage homme "
data-addto="cart"
:class="{ 'is-in-cart': isInCart('cc1') }"
>
<span :class="{ 'hidden': isInCart('cc1'), 'flex items-center gap-1': !isInCart('cc1') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('cc1'), 'hidden': !isInCart('cc1') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1738/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="cc12"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1738"/>
<input type="hidden"
name="bundle_option[455]"
value="518">
<input type="hidden"
name="bundle_option[457]"
value="519">
<input type="hidden"
name="bundle_option[458]"
value="520">
<input type="hidden"
name="bundle_option[459]"
value="521">
<input type="hidden"
name="bundle_option[460]"
value="522">
<input type="hidden"
name="bundle_option[461]"
value="523">
<a href="https://www.avril-beaute.fr/kit-decouverte-soins-visage-corps-et-maquillage.html"
title="Kit découverte Soins visage, corps et maquillage"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1738.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_copie_ok_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Kit découverte Soins visage, corps et maquillage"
title="Kit découverte Soins visage, corps et maquillage"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1738.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_copie_ok_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Kit découverte Soins visage, corps et maquillage"
title="Kit découverte Soins visage, corps et maquillage"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"cc12","productId":1738,"name":"Kit d\u00e9couverte Soins visage, corps et maquillage"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1738)"
aria-label="Ajouter à ma liste d’envie Kit découverte Soins visage, corps et maquillage"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1738"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="cc12"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Kit découverte Soins visage, corps et maquillage</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1738.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1738" data-price-box="product-id-1738">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1738" data-price-amount="47.8"
data-price-type=""
class="price-wrapper"><span class="price">47,80 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Kit découverte Soins visage, corps et maquillage"
aria-label="Ajouter Kit découverte Soins visage, corps et maquillage"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('cc12') }"
>
<span :class="{ 'hidden': isInCart('cc12'), 'flex items-center gap-1': !isInCart('cc12') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('cc12'), 'hidden': !isInCart('cc12') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1740/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="cc14"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1740"/>
<input type="hidden"
name="bundle_option[471]"
value="542">
<input type="hidden"
name="bundle_option[472]"
value="543">
<input type="hidden"
name="bundle_option[473]"
value="544">
<a href="https://www.avril-beaute.fr/duo-maquillage-soin-pailletes.html"
title="Coffret cadeau Duo maquillage & soin pailleté"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1740.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_huile_paillet_vernis_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Duo maquillage & soin pailleté"
title="Coffret cadeau Duo maquillage & soin pailleté"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1740.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_huile_paillet_vernis_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Duo maquillage & soin pailleté"
title="Coffret cadeau Duo maquillage & soin pailleté"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"cc14","productId":1740,"name":"Coffret cadeau Duo maquillage \u0026 soin paillet\u00e9"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1740)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Duo maquillage & soin pailleté"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1740"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="cc14"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Duo maquillage & soin pailleté</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1740.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1740" data-price-box="product-id-1740">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1740" data-price-amount="20.5"
data-price-type=""
class="price-wrapper"><span class="price">20,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Duo maquillage &amp; soin pailleté"
aria-label="Ajouter Coffret cadeau Duo maquillage &amp; soin pailleté"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('cc14') }"
>
<span :class="{ 'hidden': isInCart('cc14'), 'flex items-center gap-1': !isInCart('cc14') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('cc14'), 'hidden': !isInCart('cc14') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1653/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="cc2"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1653"/>
<input type="hidden"
name="bundle_option[333]"
value="370">
<input type="hidden"
name="bundle_option[340]"
value="377">
<input type="hidden"
name="bundle_option[341]"
value="378">
<input type="hidden"
name="bundle_option[339]"
value="589">
<a href="https://www.avril-beaute.fr/coffret-cadeau-mes-basiques-homme-cc2.html"
title="Coffret cadeau Trio soins visage & corps homme"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1653.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_mes_basiques_homme_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Trio soins visage & corps homme"
title="Coffret cadeau Trio soins visage & corps homme"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1653.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_mes_basiques_homme_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Trio soins visage & corps homme"
title="Coffret cadeau Trio soins visage & corps homme"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"cc2","productId":1653,"name":"Coffret cadeau Trio soins visage \u0026 corps homme"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1653)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Trio soins visage & corps homme"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1653"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="cc2"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Trio soins visage & corps homme</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1653.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1653" data-price-box="product-id-1653">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1653" data-price-amount="22.5"
data-price-type=""
class="price-wrapper"><span class="price">22,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Trio soins visage &amp; corps homme"
aria-label="Ajouter Coffret cadeau Trio soins visage &amp; corps homme"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('cc2') }"
>
<span :class="{ 'hidden': isInCart('cc2'), 'flex items-center gap-1': !isInCart('cc2') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('cc2'), 'hidden': !isInCart('cc2') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1736/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="cc10"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1736"/>
<input type="hidden"
name="bundle_option[447]"
value="507">
<input type="hidden"
name="bundle_option[448]"
value="508">
<input type="hidden"
name="bundle_option[449]"
value="509">
<input type="hidden"
name="bundle_option[450]"
value="593">
<a href="https://www.avril-beaute.fr/trio-vernis-a-ongles.html"
title="Coffret cadeau Trio vernis à ongles"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1736.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_3_vernis_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Trio vernis à ongles"
title="Coffret cadeau Trio vernis à ongles"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1736.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_3_vernis_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Trio vernis à ongles"
title="Coffret cadeau Trio vernis à ongles"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"cc10","productId":1736,"name":"Coffret cadeau Trio vernis \u00e0 ongles"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1736)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Trio vernis à ongles"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1736"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="cc10"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Trio vernis à ongles</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1736.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1736" data-price-box="product-id-1736">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1736" data-price-amount="17.5"
data-price-type=""
class="price-wrapper"><span class="price">17,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Trio vernis à ongles"
aria-label="Ajouter Coffret cadeau Trio vernis à ongles"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('cc10') }"
>
<span :class="{ 'hidden': isInCart('cc10'), 'flex items-center gap-1': !isInCart('cc10') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('cc10'), 'hidden': !isInCart('cc10') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1700/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="cc7"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1700"/>
<input type="hidden"
name="bundle_option[391]"
value="441">
<input type="hidden"
name="bundle_option[392]"
value="442">
<input type="hidden"
name="bundle_option[393]"
value="443">
<input type="hidden"
name="bundle_option[394]"
value="444">
<input type="hidden"
name="bundle_option[395]"
value="582">
<a href="https://www.avril-beaute.fr/coffret-cadeau-rituel-precieux.html"
title="Coffret cadeau Soins visage peau mature"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1700.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_rituel_pr_cieux_3_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Soins visage peau mature"
title="Coffret cadeau Soins visage peau mature"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1700.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_cadeau_rituel_pr_cieux_3_2500.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Coffret cadeau Soins visage peau mature"
title="Coffret cadeau Soins visage peau mature"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"cc7","productId":1700,"name":"Coffret cadeau Soins visage peau mature"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1700)"
aria-label="Ajouter à ma liste d’envie Coffret cadeau Soins visage peau mature"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1700"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="cc7"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Coffret cadeau Soins visage peau mature</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1700.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1700" data-price-box="product-id-1700">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1700" data-price-amount="38.5"
data-price-type=""
class="price-wrapper"><span class="price">38,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Coffret cadeau Soins visage peau mature"
aria-label="Ajouter Coffret cadeau Soins visage peau mature"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('cc7') }"
>
<span :class="{ 'hidden': isInCart('cc7'), 'flex items-center gap-1': !isInCart('cc7') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('cc7'), 'hidden': !isInCart('cc7') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1741/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="cc15"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1741"/>
<input type="hidden"
name="bundle_option[476]"
value="546">
<input type="hidden"
name="bundle_option[477]"
value="634">
<input type="hidden"
name="bundle_option[478]"
value="635">
<input type="hidden"
name="bundle_option[479]"
value="636">
<input type="hidden"
name="bundle_option[480]"
value="637">
<input type="hidden"
name="bundle_option[475]"
value="545">
<input type="hidden"
name="bundle_option[481]"
value="551">
<input type="hidden"
name="bundle_option[482]"
value="552">
<input type="hidden"
name="bundle_option[483]"
value="553">
<a href="https://www.avril-beaute.fr/kit-decouverte-maquillage.html"
title="Kit découverte maquillage"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1741.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_base_de_teint_mascara_ral_et_palettes_fards_copie_ok.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Kit découverte maquillage"
title="Kit découverte maquillage"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1741.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/c/o/coffret_base_de_teint_mascara_ral_et_palettes_fards_copie_ok.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Kit découverte maquillage"
title="Kit découverte maquillage"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"cc15","productId":1741,"name":"Kit d\u00e9couverte maquillage"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1741)"
aria-label="Ajouter à ma liste d’envie Kit découverte maquillage"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1741"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="cc15"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Kit découverte maquillage</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<span class="sr-only">
The price depends on the options chosen on the product page </span>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1741.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1741" data-price-box="product-id-1741">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1741" data-price-amount="57.5"
data-price-type=""
class="price-wrapper"><span class="price">57,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Kit découverte maquillage"
aria-label="Ajouter Kit découverte maquillage"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('cc15') }"
>
<span :class="{ 'hidden': isInCart('cc15'), 'flex items-center gap-1': !isInCart('cc15') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('cc15'), 'hidden': !isInCart('cc15') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1056/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1848"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1056"/>
<a href="https://www.avril-beaute.fr/petit-coffret-beige-petales-vide-1848.html"
title="Petit coffret jaune motif carreaux vide"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1056.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/8/1848_1_1791327747_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Petit coffret jaune motif carreaux vide"
title="Petit coffret jaune motif carreaux vide"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1056.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/8/1848_1_1791327747_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Petit coffret jaune motif carreaux vide"
title="Petit coffret jaune motif carreaux vide"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1848","productId":1056,"name":"Petit coffret jaune motif carreaux vide"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1056)"
aria-label="Ajouter à ma liste d’envie Petit coffret jaune motif carreaux vide"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1056"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Petit coffret jaune motif carreaux vide</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1056.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1056" data-price-box="product-id-1056">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1056" data-price-amount="1"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">1 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Petit coffret jaune motif carreaux vide"
aria-label="Ajouter Petit coffret jaune motif carreaux vide"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1848') }"
>
<span :class="{ 'hidden': isInCart('1848'), 'flex items-center gap-1': !isInCart('1848') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1848'), 'hidden': !isInCart('1848') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1057/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1847"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1057"/>
<a href="https://www.avril-beaute.fr/grand-coffret-bleu-galets-1847.html"
title="Grand coffret jaune motif feuillage vide"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1057.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/8/1847_1_1791327747_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Grand coffret jaune motif feuillage vide"
title="Grand coffret jaune motif feuillage vide"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1057.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/8/1847_1_1791327747_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Grand coffret jaune motif feuillage vide"
title="Grand coffret jaune motif feuillage vide"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row-reverse">
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1847","productId":1057,"name":"Grand coffret jaune motif feuillage vide"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1057)"
aria-label="Ajouter à ma liste d’envie Grand coffret jaune motif feuillage vide"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1057"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="1847"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Grand coffret jaune motif feuillage vide</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1057.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1057" data-price-box="product-id-1057">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1057" data-price-amount="2"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">2 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Grand coffret jaune motif feuillage vide"
aria-label="Ajouter Grand coffret jaune motif feuillage vide"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1847') }"
>
<span :class="{ 'hidden': isInCart('1847'), 'flex items-center gap-1': !isInCart('1847') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1847'), 'hidden': !isInCart('1847') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/573/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1466"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="573"/>
<a href="https://www.avril-beaute.fr/pochon-en-coton-bio-petit-modele-12x15cm-1466.html"
title="Pochon en coton bio Petit modèle (12x15cm)"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-573.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/1/4/1466_2_1789426963_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Pochon en coton bio Petit modèle (12x15cm)"
title="Pochon en coton bio Petit modèle (12x15cm)"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-573.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/4/1466_1_1789426963_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Pochon en coton bio Petit modèle (12x15cm)"
title="Pochon en coton bio Petit modèle (12x15cm)"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-purple_avril-100">Zéro plastique</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1466","productId":573,"name":"Pochon en coton bio Petit mod\u00e8le (12x15cm)"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(573)"
aria-label="Ajouter à ma liste d’envie Pochon en coton bio Petit modèle (12x15cm)"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_573"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Pochon en coton bio Petit modèle (12x15cm)</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-573.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="573" data-price-box="product-id-573">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-573" data-price-amount="4"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">4 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Pochon en coton bio Petit modèle (12x15cm)"
aria-label="Ajouter Pochon en coton bio Petit modèle (12x15cm)"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1466') }"
>
<span :class="{ 'hidden': isInCart('1466'), 'flex items-center gap-1': !isInCart('1466') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1466'), 'hidden': !isInCart('1466') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/572/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1465"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="572"/>
<a href="https://www.avril-beaute.fr/pochon-en-coton-bio-moyen-modele-16x19cm-1465.html"
title="Pochon en coton bio Moyen Modèle (16x19cm)"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-572.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/1/4/1465_2_1789426963_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Pochon en coton bio Moyen Modèle (16x19cm)"
title="Pochon en coton bio Moyen Modèle (16x19cm)"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-572.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/4/1465_1_1789426963_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Pochon en coton bio Moyen Modèle (16x19cm)"
title="Pochon en coton bio Moyen Modèle (16x19cm)"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-purple_avril-100">Zéro plastique</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1465","productId":572,"name":"Pochon en coton bio Moyen Mod\u00e8le (16x19cm)"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(572)"
aria-label="Ajouter à ma liste d’envie Pochon en coton bio Moyen Modèle (16x19cm)"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_572"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="1465"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Pochon en coton bio Moyen Modèle (16x19cm)</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-572.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="572" data-price-box="product-id-572">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-572" data-price-amount="4.8"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">4,80 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Pochon en coton bio Moyen Modèle (16x19cm)"
aria-label="Ajouter Pochon en coton bio Moyen Modèle (16x19cm)"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1465') }"
>
<span :class="{ 'hidden': isInCart('1465'), 'flex items-center gap-1': !isInCart('1465') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1465'), 'hidden': !isInCart('1465') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/571/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1464"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="571"/>
<a href="https://www.avril-beaute.fr/pochon-en-coton-bio-grand-modele-16x23cm-1464.html"
title="Pochon en coton bio Grand Modèle (16x23cm)"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-571.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/1/4/1464_2_1789426963_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Pochon en coton bio Grand Modèle (16x23cm)"
title="Pochon en coton bio Grand Modèle (16x23cm)"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-571.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/4/1464_1_1789426963_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Pochon en coton bio Grand Modèle (16x23cm)"
title="Pochon en coton bio Grand Modèle (16x23cm)"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-purple_avril-100">Zéro plastique</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1464","productId":571,"name":"Pochon en coton bio Grand Mod\u00e8le (16x23cm)"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(571)"
aria-label="Ajouter à ma liste d’envie Pochon en coton bio Grand Modèle (16x23cm)"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_571"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="1464"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Pochon en coton bio Grand Modèle (16x23cm)</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-571.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="571" data-price-box="product-id-571">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-571" data-price-amount="5"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">5 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Pochon en coton bio Grand Modèle (16x23cm)"
aria-label="Ajouter Pochon en coton bio Grand Modèle (16x23cm)"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1464') }"
>
<span :class="{ 'hidden': isInCart('1464'), 'flex items-center gap-1': !isInCart('1464') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1464'), 'hidden': !isInCart('1464') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/1688/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1905"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="1688"/>
<a href="https://www.avril-beaute.fr/pochon-en-coton-bio-modele-xl-25x28cm-1905.html"
title="Pochon en coton bio Modèle XL (25x28cm)"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-1688.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/1/9/1905_2_1791327748_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Pochon en coton bio Modèle XL (25x28cm)"
title="Pochon en coton bio Modèle XL (25x28cm)"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-1688.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/9/1905_1_1791327748_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Pochon en coton bio Modèle XL (25x28cm)"
title="Pochon en coton bio Modèle XL (25x28cm)"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-purple_avril-100">Zéro plastique</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1905","productId":1688,"name":"Pochon en coton bio Mod\u00e8le XL (25x28cm)"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(1688)"
aria-label="Ajouter à ma liste d’envie Pochon en coton bio Modèle XL (25x28cm)"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_1688"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
<div class="skeepers_product__stars" data-product-id="1905"></div> </span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Pochon en coton bio Modèle XL (25x28cm)</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-1688.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="1688" data-price-box="product-id-1688">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-1688" data-price-amount="6"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">6 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Pochon en coton bio Modèle XL (25x28cm)"
aria-label="Ajouter Pochon en coton bio Modèle XL (25x28cm)"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1905') }"
>
<span :class="{ 'hidden': isInCart('1905'), 'flex items-center gap-1': !isInCart('1905') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1905'), 'hidden': !isInCart('1905') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/582/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1214"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="582"/>
<a href="https://www.avril-beaute.fr/furoshiki-carreaux-52-x-52-cm-coton-bio-1214.html"
title="Furoshiki Carreaux 52 x 52 cm Coton bio"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-582.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/1/2/1214_2_1789426951_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Furoshiki Carreaux 52 x 52 cm Coton bio"
title="Furoshiki Carreaux 52 x 52 cm Coton bio"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-582.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/2/1214_1_1789426951_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Furoshiki Carreaux 52 x 52 cm Coton bio"
title="Furoshiki Carreaux 52 x 52 cm Coton bio"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-purple_avril-100">Zéro plastique</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1214","productId":582,"name":"Furoshiki Carreaux 52 x 52 cm Coton bio"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(582)"
aria-label="Ajouter à ma liste d’envie Furoshiki Carreaux 52 x 52 cm Coton bio"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_582"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Furoshiki Carreaux 52 x 52 cm Coton bio</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
<span class="font-sans font-light text-sm leading-[130%] tracking-normal text-gray_avril-100">
2 teintes </span>
</div>
<div class="flex gap-2 mt-1">
<span
class="w-3.5 h-3.5 rounded-full"
style="background-color: #f1ede2"></span>
<h3 class="font-sans font-light text-xs leading-[120%] tracking-normal text-primary">
Carreaux </h3>
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-582.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="582" data-price-box="product-id-582">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-582" data-price-amount="3.5"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">3,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Furoshiki Carreaux 52 x 52 cm Coton bio"
aria-label="Ajouter Furoshiki Carreaux 52 x 52 cm Coton bio"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1214') }"
>
<span :class="{ 'hidden': isInCart('1214'), 'flex items-center gap-1': !isInCart('1214') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1214'), 'hidden': !isInCart('1214') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/583/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1215"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="583"/>
<a href="https://www.avril-beaute.fr/furoshiki-zebre-52-x-52-cm-coton-bio-1215.html"
title="Furoshiki Zèbre 52 x 52 cm Coton bio"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-583.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/1/2/1215_2_1787785538_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Furoshiki Zèbre 52 x 52 cm Coton bio"
title="Furoshiki Zèbre 52 x 52 cm Coton bio"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-583.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/2/1215_1_1787785538_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Furoshiki Zèbre 52 x 52 cm Coton bio"
title="Furoshiki Zèbre 52 x 52 cm Coton bio"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-purple_avril-100">Zéro plastique</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1215","productId":583,"name":"Furoshiki Z\u00e8bre 52 x 52 cm Coton bio"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(583)"
aria-label="Ajouter à ma liste d’envie Furoshiki Zèbre 52 x 52 cm Coton bio"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_583"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Furoshiki Zèbre 52 x 52 cm Coton bio</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
<span class="font-sans font-light text-sm leading-[130%] tracking-normal text-gray_avril-100">
2 teintes </span>
</div>
<div class="flex gap-2 mt-1">
<span
class="w-3.5 h-3.5 rounded-full"
style="background-color: #f1ede2"></span>
<h3 class="font-sans font-light text-xs leading-[120%] tracking-normal text-primary">
Zèbre </h3>
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-583.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="583" data-price-box="product-id-583">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-583" data-price-amount="3.5"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">3,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Furoshiki Zèbre 52 x 52 cm Coton bio"
aria-label="Ajouter Furoshiki Zèbre 52 x 52 cm Coton bio"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1215') }"
>
<span :class="{ 'hidden': isInCart('1215'), 'flex items-center gap-1': !isInCart('1215') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1215'), 'hidden': !isInCart('1215') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/581/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1213"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="581"/>
<a href="https://www.avril-beaute.fr/furoshiki-feuillage-32-x-32-cm-coton-bio-1213.html"
title="Furoshiki Feuillage 32 x 32 cm Coton bio"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-581.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/1/2/1213_2_1789426951_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Furoshiki Feuillage 32 x 32 cm Coton bio"
title="Furoshiki Feuillage 32 x 32 cm Coton bio"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-581.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/2/1213_1_1789426951_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Furoshiki Feuillage 32 x 32 cm Coton bio"
title="Furoshiki Feuillage 32 x 32 cm Coton bio"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-purple_avril-100">Zéro plastique</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1213","productId":581,"name":"Furoshiki Feuillage 32 x 32 cm Coton bio"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(581)"
aria-label="Ajouter à ma liste d’envie Furoshiki Feuillage 32 x 32 cm Coton bio"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_581"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Furoshiki Feuillage 32 x 32 cm Coton bio</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
<span class="font-sans font-light text-sm leading-[130%] tracking-normal text-gray_avril-100">
2 teintes </span>
</div>
<div class="flex gap-2 mt-1">
<span
class="w-3.5 h-3.5 rounded-full"
style="background-color: #f1ede2"></span>
<h3 class="font-sans font-light text-xs leading-[120%] tracking-normal text-primary">
Feuillage </h3>
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-581.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="581" data-price-box="product-id-581">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-581" data-price-amount="2.5"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">2,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Furoshiki Feuillage 32 x 32 cm Coton bio"
aria-label="Ajouter Furoshiki Feuillage 32 x 32 cm Coton bio"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1213') }"
>
<span :class="{ 'hidden': isInCart('1213'), 'flex items-center gap-1': !isInCart('1213') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1213'), 'hidden': !isInCart('1213') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
<form method="post"
action="https://www.avril-beaute.fr/checkout/cart/add/uenc/%25uenc%25/product/580/"
class="product_addtocart_form item product product-item card card-interactive grow flex flex-col w-full bg-container !p-0 !h-full shadow-transparent hover:bg-container relative"
data-sku="1212"
>
<input type="hidden" name="form_key" :value="hyva.getFormKey()" />
<input type="hidden" name="product" value="580"/>
<a href="https://www.avril-beaute.fr/furoshiki-petales-32-x-32-cm-coton-bio-1212.html"
title="Furoshiki Pétales 32 x 32 cm Coton bio"
class="product photo product-item-photo mx-auto mb-3 w-full flex-1 flex flex-col"
tabindex="-1"
>
<div class="flex justify-center relative flex-grow">
<img class="object-cover w-full block m-auto image-2 "
x-data=""
@update-gallery-580.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/1/2/1212_2_1789426951_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Furoshiki Pétales 32 x 32 cm Coton bio"
title="Furoshiki Pétales 32 x 32 cm Coton bio"
/>
<img class="object-cover w-full block m-auto image-1 absolute max-w-[85%] left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
x-data=""
@update-gallery-580.window="$root.src = $event.detail"
src="https://avril.twic.pics/media/catalog/product/cache/8ead48f4d9dc504f521f617972d27952/1/2/1212_1_1789426951_1.png?twic=v1/cover=680x680"
loading="lazy"
width="340"
height=""
alt="Furoshiki Pétales 32 x 32 cm Coton bio"
title="Furoshiki Pétales 32 x 32 cm Coton bio"
/>
</div>
<div class="flex gap-2 absolute px-4 pt-4 justify-between w-full top-0 flex-row">
<div class="flex flex-wrap gap-1"><span class="self-start font-sans font-light text-10 tracking-normal text-center text-primary px-3 py-1 rounded-[3px] bg-purple_avril-100">Zéro plastique</span></div>
<div class="button-wishlist h-4">
<button
x-data='initWishlist({"sku":"1212","productId":580,"name":"Furoshiki P\u00e9tales 32 x 32 cm Coton bio"})'
x-init='getWishlistItems()'
x-defer="intersect"
@click.prevent="addToWishlist(580)"
aria-label="Ajouter à ma liste d’envie Furoshiki Pétales 32 x 32 cm Coton bio"
type="button"
:disabled="isLoading"
class="w-4 h-4 p-0 border-0 inline-flex shrink-0 items-center justify-center"
data-addto="wishlist"
>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 16 14" fill="" class="stroke-primary hover:fill-primary" aria-hidden="true" :class="inWishlist ? 'fill-primary' : 'fill-transparent'">
<path d="M12.6663 8.33333C13.6597 7.36 14.6663 6.19333 14.6663 4.66667C14.6663 3.69421 14.28 2.76158 13.5924 2.07394C12.9048 1.38631 11.9721 1 10.9997 1C9.82634 1 8.99967 1.33333 7.99967 2.33333C6.99967 1.33333 6.17301 1 4.99967 1C4.02721 1 3.09458 1.38631 2.40695 2.07394C1.71932 2.76158 1.33301 3.69421 1.33301 4.66667C1.33301 6.2 2.33301 7.36667 3.33301 8.33333L7.99967 13L12.6663 8.33333Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
<div id="product-item-info_580"
class="product-info flex flex-col justify-between px-2 md:px-4 pt-2 pb-4 min-h-[180px]">
<div class="flex justify-between items-center w-full min-h-3">
<div>
<div class="netreviews-stars">
<span>
</span>
</div>
</div>
<div class="font-sans font-light text-xs leading-none normal-tracking text-primary">
</div>
</div>
<h3 class="mt-3 mb-1">
<span>Furoshiki Pétales 32 x 32 cm Coton bio</span>
<div class="flex flex-col justify-start">
<div class="min-h-[20px] flex items-center">
<span class="font-sans font-light text-sm leading-[130%] tracking-normal text-gray_avril-100">
2 teintes </span>
</div>
<div class="flex gap-2 mt-1">
<span
class="w-3.5 h-3.5 rounded-full"
style="background-color: #f1ede2"></span>
<h3 class="font-sans font-light text-xs leading-[120%] tracking-normal text-primary">
Pétales </h3>
</div>
</div>
</h3>
<div class="flex justify-between gap-2.5 mt-3 items-end">
<div class="my-auto text-gray-900"
x-data="initPriceBox()"
x-defer="intersect"
@update-prices-580.window="updatePrice($event.detail);"
>
<div class="price-box price-final_price" data-role="priceBox" data-product-id="580" data-price-box="product-id-580">
<span class="price-container price-final_price tax weee"
>
<span id="product-price-580" data-price-amount="2.5"
data-price-type="finalPrice"
class="price-wrapper"><span class="price">2,50 €</span></span>
</span>
</div> </div>
<button
class="w-auto btn btn-primary btn-add-to-cart flex gap-1 justify-center items-center relative !px-2 md:!px-5 !py-[3px]"
title="Ajouter Furoshiki Pétales 32 x 32 cm Coton bio"
aria-label="Ajouter Furoshiki Pétales 32 x 32 cm Coton bio"
data-addto="cart"
:class="{ 'is-in-cart': isInCart('1212') }"
>
<span :class="{ 'hidden': isInCart('1212'), 'flex items-center gap-1': !isInCart('1212') }">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline">
Ajouter </span>
</span>
<span :class="{ 'flex items-center gap-1.5': isInCart('1212'), 'hidden': !isInCart('1212') }">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 10 7" fill="none" class="border-current" aria-hidden="true">
<path d="M9 1L3.5 6.5L1 4" stroke="#1D1D1B" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="font-light text-xs md:text-13 leading-8 tracking-normal text-white inline is-in-cart">
Ajouté </span>
</span>
</button>
</div>
</div>
</a>
</form>
</div>
</div>
<script>
function initToolbar_6acf38a49b6bf() {
return {
options: {"productListToolbarForm":{"mode":"product_list_mode","direction":"product_list_dir","order":"product_list_order","limit":"product_list_limit","modeDefault":"grid","directionDefault":"asc","orderDefault":"position","limitDefault":36,"url":"https:\/\/www.avril-beaute.fr\/cadeaux\/cadeaux.html","formKey":"ThSMex3EkPNfSLKM","post":false,"page":"p","ajax":true}}.productListToolbarForm || {},
getUrlParams: function () {
let decode = window.decodeURIComponent,
urlPaths = this.options.url.split('?'),
urlParams = urlPaths[1] ? urlPaths[1].split('&') : [],
params = {},
parameters, i;
for (i = 0; i < urlParams.length; i++) {
parameters = urlParams[i].split('=');
params[decode(parameters[0])] = parameters[1] !== undefined ?
decode(parameters[1].replace(/\+/g, '%20')) :
'';
}
return params;
},
getCurrentLimit: function () {
return this.getUrlParams()[this.options.limit] || this.options.limitDefault;
},
getCurrentPage: function () {
return this.getUrlParams()[this.options.page] || 1;
},
changeUrl(paramName, paramValue, defaultValue) {
let urlPaths = this.options.url.split('?'),
baseUrl = urlPaths[0],
paramData = this.getUrlParams(),
currentPage = this.getCurrentPage(),
newPage;
/**
* calculates the page on which the first item of the current page will
* be with the new limit and sets that number as the new page
*/
if (currentPage > 1 && paramName === this.options.limit) {
newPage = Math.floor(this.getCurrentLimit() * (currentPage - 1) / paramValue) + 1;
if (newPage > 1) {
paramData[this.options.page] = newPage;
} else {
delete paramData[this.options.page];
}
}
paramData[paramName] = paramValue;
if (this.options.post) {
hyva.postForm({action: baseUrl, data: paramData});
} else {
if (paramValue === defaultValue.toString()) {
delete paramData[paramName];
}
paramData = Object.keys(paramData).length === 0
? ''
: '?' + (new URLSearchParams(paramData));
location.href = baseUrl + paramData
}
}
}
}
</script>
<div x-data="initToolbar_6acf38a49b6bf()"
class="toolbar toolbar-products items-center container">
<div class="overlay" :class="{'active': $store.category.isLoading}">
<div
class="z-50 fixed inset-0 grid place-items-center bg-white/70 text-slate-800"
x-transition.opacity.duration.200ms
>
<div class="w-10 h-10 border-2 border-primary border-t-transparent rounded-full animate-spin"></div>
</div>
</div>
<div class="flex justify-center order-2 col-span-4">
<nav class="inline-flex items-center pages" aria-label="pagination">
<ol class="relative z-0 inline-flex shadow-sm items pages-items">
<li
class="item -ml-px active"
aria-label="Page 1"
>
<span
class="page block w-full py-2"
aria-current="page"
>
<span class="sr-only label">
Vous lisez actuellement la page </span>
<span class="pointer-events-none">1</span>
</span>
</li>
<li
class="item -ml-px"
aria-label="Page 2"
>
<a
href="https://www.avril-beaute.fr/cadeaux/cadeaux.html?p=2"
@click.prevent="$store.category.loadPageWithPager($event.currentTarget.href)"
class="page block w-full py-2"
>
<span class="sr-only label">Page</span>
<span class="pointer-events-none">2</span>
</a>
</li>
<li class="item -ml-px">
<a
href="https://www.avril-beaute.fr/cadeaux/cadeaux.html?p=2"
@click.prevent="$store.category.loadPageWithPager($event.currentTarget.href)"
class="page next w-full text-center flex justify-center py-2"
aria-label="Suivant"
>
<span class="sr-only">Suivant</span>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-5 h-5" width="20" height="20" role="img">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
<title>chevron-right</title></svg>
</a>
</li>
</ol>
</nav>
</div>
</div>
</section>
<div class="container px-4 mb-10">
<div class="bg-container rounded-lg p-3">
<style>#html-body [data-pb-style=AWF181I],#html-body [data-pb-style=PC19JUY]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=PC19JUY]{justify-content:flex-start;display:flex;flex-direction:column}#html-body [data-pb-style=AWF181I]{align-self:stretch}#html-body [data-pb-style=BT7X0AV]{display:flex;width:100%}#html-body [data-pb-style=DOQV68P],#html-body [data-pb-style=MALEA72],#html-body [data-pb-style=MGBMSVA],#html-body [data-pb-style=OHUA69V]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:25%;align-self:stretch}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div class="page-reassurance" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="false" data-element="inner" data-pb-style="PC19JUY"><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="8" data-background-lazy-load="false" data-element="main" data-pb-style="AWF181I"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="BT7X0AV"><div class="pagebuilder-column page-reassurance-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="MALEA72"><div class="page-reassurance-icon" data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewbox="0 0 32 32" fill="none" role="img">
<path d="M29.3138 9.35926L2.64714 9.34466C1.72666 9.34416 0.98006 10.0899 0.979556 11.0104L0.977732 14.3437C0.977228 15.2642 1.72301 16.0108 2.64349 16.0113L29.3101 16.0259C30.2306 16.0264 30.9772 15.2806 30.9777 14.3602L30.9796 11.0268C30.9801 10.1064 30.2343 9.35976 29.3138 9.35926Z" stroke="#1D1D1B" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M15.9805 9.35217L15.9686 31.0188M15.9805 9.35217C15.3789 6.86751 14.3421 4.74304 13.005 3.2558C11.668 1.76857 10.0928 0.987596 8.48502 1.01473C7.37996 1.01412 6.31991 1.45253 5.53808 2.2335C4.75625 3.01448 4.31668 4.07404 4.31608 5.17911C4.31547 6.28418 4.75388 7.34423 5.53485 8.12606C6.31583 8.90789 7.37539 9.34745 8.48046 9.34806M15.9805 9.35217C16.5847 6.86817 17.6239 4.74483 18.9626 3.25906C20.3012 1.7733 21.8772 0.994046 23.485 1.02294C24.5901 1.02354 25.6497 1.46311 26.4306 2.24494C27.2116 3.02677 27.65 4.08682 27.6494 5.19189C27.6488 6.29695 27.2092 7.35652 26.4274 8.1375C25.6456 8.91847 24.5855 9.35688 23.4805 9.35627M27.6435 16.0252L27.6371 27.6919C27.6366 28.5759 27.285 29.4236 26.6595 30.0484C26.034 30.6731 25.186 31.0239 24.3019 31.0234L7.63527 31.0143C6.75122 31.0138 5.90356 30.6621 5.27878 30.0367C4.654 29.4112 4.30328 28.5632 4.30376 27.6791L4.31015 16.0124" stroke="#1D1D1B" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<title>heroicons/outline/reassurance/delivery</title></svg>
</div><div class="page-reassurance-text" data-content-type="text" data-appearance="default" data-element="main"><p><a tabindex="0" href="/conditions-generales-de-vente-avril-cosmetique-bio" target="_blank" rel="noopener">Livraison en point relais offerte </a></p>
<p><a tabindex="0" href="/conditions-generales-de-vente-avril-cosmetique-bio" target="_blank" rel="noopener">dès 25€ d'achat</a></p></div></div><div class="pagebuilder-column page-reassurance-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="MGBMSVA"><div class="page-reassurance-icon" data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><svg xmlns="http://www.w3.org/2000/svg" width="35" height="35" viewbox="0 0 32 36" fill="none" role="img">
<path d="M15.7982 34.8244L15.8073 18.1578M14.1317 34.3735C14.6383 34.6664 15.213 34.8207 15.7982 34.821C16.3833 34.8214 16.9582 34.6676 17.4651 34.3754L29.1354 27.7151C29.6418 27.4231 30.0625 27.0031 30.3553 26.4971C30.6481 25.9912 30.8027 25.4172 30.8036 24.8327L30.8109 11.4993C30.8106 10.9148 30.6567 10.3406 30.3644 9.83436C30.0722 9.32812 29.6519 8.90763 29.1458 8.61508L17.4828 1.94203C16.9763 1.64919 16.4015 1.49486 15.8164 1.49454C15.2313 1.49422 14.6564 1.64792 14.1495 1.94021L2.47918 8.60049C1.97279 8.89248 1.55209 9.31251 1.25928 9.81842C0.966473 10.3243 0.811854 10.8984 0.810934 11.4829L0.803636 24.8162C0.803916 25.4008 0.957906 25.975 1.25016 26.4812C1.54241 26.9875 1.96266 27.4079 2.46872 27.7005L14.1317 34.3735Z" stroke="#1D1D1B" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M1.29438 9.81562L15.8065 18.1569L30.3277 9.83152M8.31354 5.26947L23.3088 13.861" stroke="#1D1D1B" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<title>heroicons/outline/reassurance/shipping</title></svg>
</div><div class="page-reassurance-text" data-content-type="text" data-appearance="default" data-element="main"><p><a href="/conditions-generales-de-vente-avril-cosmetique-bio" target="_blank" rel="noopener">Expédition sous</a></p>
<p><a href="/conditions-generales-de-vente-avril-cosmetique-bio" target="_blank" rel="noopener">24 à 48h</a></p></div></div><div class="pagebuilder-column page-reassurance-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="DOQV68P"><div class="page-reassurance-icon" data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewbox="0 0 36 35" fill="none" role="img">
<path d="M23.02 33.2918L23.0246 24.9585C23.0248 24.5164 22.8495 24.0924 22.5371 23.7797C22.2247 23.467 21.8009 23.2911 21.3588 23.2909L14.6922 23.2872C14.2501 23.287 13.8261 23.4624 13.5134 23.7748C13.2007 24.0871 13.0248 24.511 13.0246 24.953L13.02 33.2863M27.6531 15.4777C27.3058 15.1449 26.8435 14.959 26.3626 14.9587C25.8816 14.9584 25.4191 15.1438 25.0714 15.4763C24.296 16.215 23.266 16.6269 22.195 16.6263C21.124 16.6257 20.0944 16.2127 19.3198 15.4731C18.9726 15.1408 18.5106 14.9552 18.0301 14.9549C17.5495 14.9547 17.0873 15.1398 16.7398 15.4717C15.9643 16.211 14.9339 16.6231 13.8625 16.6225C12.7911 16.6219 11.7611 16.2087 10.9864 15.4685C10.6392 15.1358 10.1769 14.9498 9.69589 14.9496C9.21491 14.9493 8.75239 15.1347 8.40477 15.4671C7.65579 16.1811 6.66795 16.5908 5.63352 16.6165C4.5991 16.6423 3.5921 16.2822 2.80854 15.6064C2.02498 14.9306 1.52091 13.9874 1.39445 12.9604C1.268 11.9334 1.52819 10.8961 2.1244 10.0504L6.94322 3.07967C7.24898 2.62902 7.66049 2.26015 8.14177 2.00531C8.62305 1.75048 9.15944 1.61745 9.70402 1.61784L26.3707 1.62697C26.9137 1.62706 27.4484 1.75979 27.9284 2.01363C28.4084 2.26747 28.8192 2.63473 29.1249 3.08347L33.9461 10.0728C34.5415 10.9198 34.8002 11.9582 34.6718 12.9856C34.5435 14.013 34.0372 14.9557 33.2516 15.6302C32.4661 16.3047 31.4576 16.6625 30.4226 16.634C29.3876 16.6055 28.4003 16.1927 27.6531 15.476" stroke="#1D1D1B" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M4.69531 16.5312L4.68797 29.9479C4.68748 30.832 5.03821 31.68 5.66299 32.3055C6.28777 32.9309 7.13542 33.2826 8.01948 33.2831L28.0195 33.294C28.9035 33.2945 29.7516 32.9438 30.377 32.319C31.0025 31.6942 31.3541 30.8466 31.3546 29.9625L31.362 16.5458" stroke="#1D1D1B" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<title>heroicons/outline/reassurance/withdrawal</title></svg>
</div><div class="page-reassurance-text" data-content-type="text" data-appearance="default" data-element="main"><p><a href="/conditions-generales-de-vente-avril-cosmetique-bio" target="_blank" rel="noopener">Retrait gratuit en</a></p>
<p><a href="/conditions-generales-de-vente-avril-cosmetique-bio" target="_blank" rel="noopener">boutique Avril</a></p></div></div><div class="pagebuilder-column page-reassurance-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="OHUA69V"><div class="page-reassurance-icon" data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewbox="0 0 32 33" fill="none" role="img">
<path d="M30.9605 16.4481C30.9627 12.4698 29.3844 8.65364 26.5729 5.83905C23.7614 3.02447 19.947 1.44203 15.9687 1.43985C11.7753 1.45333 7.74946 3.08739 4.73292 6.00037L0.964189 9.76497" stroke="#1D1D1B" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M0.96875 1.43164L0.964189 9.76497L9.29752 9.76953M0.960539 16.4316C0.958362 20.4099 2.53663 24.2261 5.34813 27.0406C8.15964 29.8552 11.9741 31.4377 15.9523 31.4398C20.1457 31.4264 24.1716 29.7923 27.1882 26.8793L30.9569 23.1147" stroke="#1D1D1B" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M22.623 23.1094L30.9564 23.1139L30.9518 31.4473" stroke="#1D1D1B" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<title>heroicons/outline/reassurance/return</title></svg>
</div><div class="page-reassurance-text" data-content-type="text" data-appearance="default" data-element="main"><p><a tabindex="-1" href="/conditions-generales-de-vente-avril-cosmetique-bio" target="_blank" rel="noopener">Retour</a></p>
<p><a tabindex="-1" href="/conditions-generales-de-vente-avril-cosmetique-bio" target="_blank" rel="noopener">gratuit</a></p></div></div></div></div></div></div> </div>
<div class="bg-white">
</div>
</div>
<script>
function initProductCard() {
return {
quoteItems: [],
init() {
this.watchMageCache();
window.addEventListener('get-last-item-success', () => {
this.waitForUpdatedCart();
});
},
watchMageCache: function () {
let self = this;
(function(originalSetItem) {
localStorage.setItem = function(key, value) {
originalSetItem.apply(this, arguments);
if (key === 'mage-cache-storage') {
setTimeout(function () {
self.getQuoteItems();
}, 0);
}
};
})(localStorage.setItem);
},
getQuoteItems: function () {
let self = this;
if (!localStorage.getItem('mage-cache-storage')) {
return;
}
let mageCache = JSON.parse(localStorage.getItem('mage-cache-storage'));
let cart = mageCache.cart || mageCache['cart-data'];
if (!cart) return;
let items = cart.items || cart['items'];
if (!items) return;
self.quoteItems = [];
items.forEach(item => {
if (item.original_product_sku) {
self.quoteItems.push(item.original_product_sku);
}
});
},
waitForUpdatedCart: function () {
const previous = JSON.stringify(this.quoteItems);
const check = () => {
const cache = localStorage.getItem('mage-cache-storage');
if (!cache) return setTimeout(check, 50);
const mageCache = JSON.parse(cache);
const cart = mageCache.cart || mageCache['cart-data'];
if (!cart) return setTimeout(check, 50);
const items = cart.items || cart['items'];
if (!items) return setTimeout(check, 50);
const newItems = items.map(i => i.original_product_sku);
if (JSON.stringify(newItems) === previous) {
return setTimeout(check, 50);
}
this.quoteItems = newItems;
};
check();
},
isInCart: function (sku) {
return this.quoteItems.includes(sku);
}
}
}
</script>
<script type="application/ld+json">{"@context": "http://schema.org/","@type": "WebPage","name": "Idées de Cadeau Bio, Cartes Cadeaux & Emballages | Avril","mainEntity":{"@type":"WebPageElement","offers":{"@type":"Offer","itemOffered":[{"@type":"Product","name":"Calendrier de l'Avent 2026 - 24 jours pour bien \u00eatre soi","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/2\/3\/2325_1_1791932557_1.png","sku":"2325","description":"","review":[],"mpn":"3662217023257","offers":{"@type":"Offer","price":94.5,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/calendrier-de-l-avent-2026-24-jours-pour-bien-etre-soi-2325.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Coffret cadeau Essentiels soins","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/2\/2\/2293_1_1791932556_1.png","sku":"2293","description":"","review":[],"mpn":"3662217022939","offers":{"@type":"Offer","price":22,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-essentiels-soins-2293.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Coffret cadeau Routine soin visage","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/2\/2\/2291_1_1791932556_1.png","sku":"2291","description":"","review":[],"mpn":"3662217022915","offers":{"@type":"Offer","price":39,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-routine-soin-visage-2291.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Coffret cadeau Routine \u00e9clat","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/1\/8\/1891_1_1791932554_1.png","sku":"1891","description":"","review":[],"mpn":"3662217018918","brand":{"@type":"Brand","name":"Avril"},"offers":{"@type":"Offer","price":23,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-routine-eclat-1891.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Coffret cadeau Rituel douceur","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/2\/2\/2294_1_1791932556_1.png","sku":"2294","description":"","review":[],"mpn":"3662217022946","offers":{"@type":"Offer","price":30,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-rituel-douceur-2294.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Coffret cadeau Cocooning","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/2\/2\/2295_1_1791932556_1.png","sku":"2295","description":"","review":[],"mpn":"3662217022953","offers":{"@type":"Offer","price":30,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-cocooning-2295.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Coffret cadeau Essentiels Make-up","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/2\/2\/2296_1_1791932557_1.png","sku":"2296","description":"","review":[],"mpn":"3662217022960","offers":{"@type":"Offer","price":27,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-essentiels-make-up-2296.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Coffret cadeau Mes essentiels rechargeables","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/2\/2\/2292_1_1791932556_1.png","sku":"2292","description":"","review":[],"mpn":"3662217022922","offers":{"@type":"Offer","price":21,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-mes-essentiels-rechargeables-2292.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Coffret cadeau Mon duo visage quotidien","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_cadeau_mon_duo_quotidien_2500_1.png","sku":"1872","description":"","review":[],"mpn":"3662217018727","offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-cosmetique-bio-mon-duo-quotidien-1872.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Coffret cadeau Trio soins \u00e9clat visage","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_cadeau_teint_clatant_2500.png","sku":"cc4","description":"","review":[],"offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-teint-eclatant.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Carte cadeau","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/a\/v\/avril_e-carte_cadeau_fr_avec_ombre_2_.png","sku":"giftcard","description":"","review":[],"offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/carte-cadeau.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Coffret cadeau Duo soins \u00e9clat visage","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_cadeau_un_temps_pour_soi_copie.png","sku":"1873","description":"","review":[],"mpn":"3662217018734","offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-cosmetique-bio-un-temps-pour-soi-1873.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Coffret cadeau Mon duo visage au masculin","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_cadeau_mon_duo_au_masculin_copie.png","sku":"1874","description":"","review":[],"mpn":"3662217018741","offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-cosmetique-bio-mon-duo-masculin-1874.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Coffret cadeau Duo soins quotidiens corps","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_cadeau_duo_matinal_1_ok_2500.png","sku":"1879","description":"","review":[],"mpn":"3662217018796","offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-cosmetiques-bio-duo-matinal-1879.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Coffret cadeau Soins parfum\u00e9s visage & corps ","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_cadeau_escale_dans_le_sud_2_ok_1.png","sku":"1862","description":"","review":[],"mpn":"3662217018628","offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-escale-dans-le-sud-1862.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Coffret cadeau Duo soins corps","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_cadeau_duo_matinal_2_2500.png","sku":"1876","description":"","review":[],"mpn":"3662217018765","offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-cosmetiques-bio-mon-rituel-corps-1876.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Coffret cadeau Rasage & soins visage homme ","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_homme_2_ok2500.png","sku":"cc1","description":"","review":[],"offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-mon-kit-rasage-cc1.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Kit d\u00e9couverte Soins visage, corps et maquillage","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_copie_ok_2500.png","sku":"cc12","description":"","review":[],"offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/kit-decouverte-soins-visage-corps-et-maquillage.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Coffret cadeau Duo maquillage & soin paillet\u00e9","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_huile_paillet_vernis_2500.png","sku":"cc14","description":"","review":[],"offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/duo-maquillage-soin-pailletes.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Coffret cadeau Trio soins visage & corps homme","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_cadeau_mes_basiques_homme_2500.png","sku":"cc2","description":"","review":[],"offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-mes-basiques-homme-cc2.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Coffret cadeau Trio vernis \u00e0 ongles","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_3_vernis_2500.png","sku":"cc10","description":"","review":[],"offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/trio-vernis-a-ongles.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Coffret cadeau Soins visage peau mature","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_cadeau_rituel_pr_cieux_3_2500.png","sku":"cc7","description":"","review":[],"offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/coffret-cadeau-rituel-precieux.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Kit d\u00e9couverte maquillage","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/c\/o\/coffret_base_de_teint_mascara_ral_et_palettes_fards_copie_ok.png","sku":"cc15","description":"","review":[],"offers":{"@type":"Offer","price":0,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/kit-decouverte-maquillage.html","availability":"http:\/\/schema.org\/InStock"}},{"@type":"Product","name":"Petit coffret jaune motif carreaux vide","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/1\/8\/1848_1_1791327747_1.png","sku":"1848","description":"","review":[],"mpn":"3662217018482","brand":{"@type":"Brand","name":"Avril"},"offers":{"@type":"Offer","price":1,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/petit-coffret-beige-petales-vide-1848.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Grand coffret jaune motif feuillage vide","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/1\/8\/1847_1_1791327747_1.png","sku":"1847","description":"","review":[],"mpn":"3662217018475","brand":{"@type":"Brand","name":"Avril"},"offers":{"@type":"Offer","price":2,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/grand-coffret-bleu-galets-1847.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Pochon en coton bio Petit mod\u00e8le (12x15cm)","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/1\/4\/1466_1_1789426963_1.png","sku":"1466","description":"","review":[],"mpn":"3662217014668","brand":{"@type":"Brand","name":"Avril"},"offers":{"@type":"Offer","price":4,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/pochon-en-coton-bio-petit-modele-12x15cm-1466.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Pochon en coton bio Moyen Mod\u00e8le (16x19cm)","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/1\/4\/1465_1_1789426963_1.png","sku":"1465","description":"","review":[],"mpn":"3662217014651","brand":{"@type":"Brand","name":"Avril"},"offers":{"@type":"Offer","price":4.8,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/pochon-en-coton-bio-moyen-modele-16x19cm-1465.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Pochon en coton bio Grand Mod\u00e8le (16x23cm)","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/1\/4\/1464_1_1789426963_1.png","sku":"1464","description":"","review":[],"mpn":"3662217014644","brand":{"@type":"Brand","name":"Avril"},"offers":{"@type":"Offer","price":5,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/pochon-en-coton-bio-grand-modele-16x23cm-1464.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Pochon en coton bio Mod\u00e8le XL (25x28cm)","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/1\/9\/1905_1_1791327748_1.png","sku":"1905","description":"","review":[],"mpn":"3662217019052","brand":{"@type":"Brand","name":"Avril"},"offers":{"@type":"Offer","price":6,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/pochon-en-coton-bio-modele-xl-25x28cm-1905.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Furoshiki Carreaux 52 x 52 cm Coton bio","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/1\/2\/1214_1_1789426951_1.png","sku":"1214","description":"","review":[],"mpn":"3662217012145","brand":{"@type":"Brand","name":"Avril"},"offers":{"@type":"Offer","price":3.5,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/furoshiki-carreaux-52-x-52-cm-coton-bio-1214.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Furoshiki Z\u00e8bre 52 x 52 cm Coton bio","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/placeholder\/default\/Logo_avril_baseline_cosmetique_bio_fond_transp.png","sku":"1215","description":"","review":[],"mpn":"3662217012152","brand":{"@type":"Brand","name":"Avril"},"offers":{"@type":"Offer","price":3.5,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/furoshiki-zebre-52-x-52-cm-coton-bio-1215.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Furoshiki Feuillage 32 x 32 cm Coton bio","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/1\/2\/1213_1_1789426951_1.png","sku":"1213","description":"","review":[],"mpn":"3662217012138","brand":{"@type":"Brand","name":"Avril"},"offers":{"@type":"Offer","price":2.5,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/furoshiki-feuillage-32-x-32-cm-coton-bio-1213.html","availability":"http:\/\/schema.org\/OutOfStock"}},{"@type":"Product","name":"Furoshiki P\u00e9tales 32 x 32 cm Coton bio","image":"https:\/\/www.avril-beaute.fr\/media\/catalog\/product\/cache\/6517c62f5899ad6aa0ba23ceb3eeff97\/1\/2\/1212_1_1789426951_1.png","sku":"1212","description":"","review":[],"mpn":"3662217012121","brand":{"@type":"Brand","name":"Avril"},"offers":{"@type":"Offer","price":2.5,"priceCurrency":"EUR","priceValidUntil":"2026-10-14","url":"https:\/\/www.avril-beaute.fr\/furoshiki-petales-32-x-32-cm-coton-bio-1212.html","availability":"http:\/\/schema.org\/OutOfStock"}}]}}}</script></div>
<script>
document.addEventListener('alpine:init', () => {
Alpine.store('category', {
config: {"items":{"filterItems":{"categorie_articleFilter":[{"label":"Coffrets cadeaux","count":22,"url":"https:\/\/www.avril-beaute.fr\/cadeaux\/cadeaux.html?categorie_article=Coffrets+cadeaux","is_selected":false},{"label":"Furoshiki","count":6,"url":"https:\/\/www.avril-beaute.fr\/cadeaux\/cadeaux.html?categorie_article=Furoshiki","is_selected":false},{"label":"Pochette","count":4,"url":"https:\/\/www.avril-beaute.fr\/cadeaux\/cadeaux.html?categorie_article=Pochette","is_selected":false},{"label":"Sac","count":4,"url":"https:\/\/www.avril-beaute.fr\/cadeaux\/cadeaux.html?categorie_article=Sac","is_selected":false},{"label":"Coffrets \u00e0 composer","count":2,"url":"https:\/\/www.avril-beaute.fr\/cadeaux\/cadeaux.html?categorie_article=Coffrets+%C3%A0+composer","is_selected":false},{"label":"Vernis Color\u00e9s","count":1,"url":"https:\/\/www.avril-beaute.fr\/cadeaux\/cadeaux.html?categorie_article=Vernis+Color%C3%A9s","is_selected":false}],"priceFilter":[],"nouveauteFilter":[],"coup_de_coeurFilter":[],"zero_plastiqueFilter":[],"sous_tonFilter":[],"type_de_peauxFilter":[],"effetFilter":[],"finitionFilter":[],"couvranceFilter":[],"type_de_cheveuxFilter":[],"forme_galeniqueFilter":[],"eligible_hommeFilter":[],"zone_applicationFilter":[],"population_cibleFilter":[],"en_promoFilter":[],"couleur_principaleFilter":[],"categorie_article_n1Filter":[],"sous_categorie_articleFilter":[]},"activeFilter":"\n\n<div class=\"erase-filter\" >\n <\/div>\n","pageSize":33,"size":39,"curPage":1},"slider":{"directMode":false},"infinite":{"active":false,"buttonLabel":"Voir plus de produits"}},
urlParams: new URLSearchParams(decodeURI(window.location.search).replace(/\[(\d*)\]/g, '')),
ajaxEnable: 1,
infiniteEnable: 0,
isLoadingPager: true,
isLoading: false,
hasMoreItems: {},
get clearUrl() {
const {protocol, host, pathname, searchParams} = new URL(window.location.href);
const queryParam = searchParams.has('q') ? '?q=' + searchParams.get('q').toString() : '';
let isAjax = 'isAjax=1';
if (queryParam !== '') {
isAjax = '&' + isAjax;
} else {
isAjax = '?' + isAjax;
}
return protocol + '//' + host + pathname + queryParam + isAjax;
},
get current_href() {
return window.location.href;
},
get sentence() {
const current = Math.min(
this.config.items.pageSize * this.config.items.curPage,
this.config.items.size
);
return this.generateSentence(current, this.config.items.size);
},
generateSentence(current, total) {
if (total > this.config.items.pageSize) {
if (this.infiniteEnable) {
return `Articles 1-${current} sur ${total}`;
} else {
return `Articles ${this.config.items.pageSize * (this.config.items.curPage - 1) + 1}-${current} sur ${total}`;
}
} else if (total === 1) {
return `1 Articles`;
} else {
return `${total} Articles`;
}
},
get isHidden() {
return this.config.infinite.active && this.config.items.curPage * this.config.items.pageSize >= this.config.items.size
},
get currentUrl() {
return this.buildUrl(this.current_href, 'p', parseInt(this.config.items.curPage) + 1);
},
getSliderFilterValues() {
return Array.from(document.querySelectorAll('.filter-content .filter-option'))
.filter(item => item.querySelector('.smile-es-range-slider'))
.map(filterItem => filterItem.dataset.filterName);
},
getMultipleFilterValues() {
return Array.from(document.querySelectorAll('.filter-content .filter-option'))
.map(filterItem => filterItem.dataset.filterName);
},
reload() {
this.urlParams = this.getDecodedURLSearchParams();
},
getDecodedURLSearchParams() {
return new URLSearchParams(
decodeURI(window.location.search).replace(/\[(\d*)\]/g, '')
);
},
buildUrl(url, replaceParam, replaceValue) {
try {
const href = new URL(url, window.location.origin);
if (replaceParam) {
href.searchParams.set(replaceParam, replaceValue);
return href.toString();
}
href.searchParams.set('isAjax', '1');
return href.toString();
} catch (e) {
if (replaceParam) {
const separator = url.includes('?') ? '&' : '?';
return `${url}${separator}${encodeURIComponent(replaceParam)}=${encodeURIComponent(replaceValue)}`;
}
return url.includes('?') ? `${url}&isAjax=1` : `${url}?isAjax=1`;
}
},
customBase64Decode(encodedString) {
if (!encodedString) {
return '';
}
let s = String(encodedString)
.replace(/-/g, '+')
.replace(/_/g, '/')
.replace(/~/g, '');
while (s.length % 4) s += '=';
try {
const decoded = atob(s);
const textarea = document.createElement('textarea');
textarea.innerHTML = decoded;
return textarea.value;
} catch (e) {
return String(encodedString);
}
},
async updateLayer(url, replaceParam, replaceValue) {
if (!this.ajaxEnable) {
window.location.href = url;
return;
}
this.isLoading = true;
try {
const updatedUrl = this.buildUrl(url, replaceParam, replaceValue);
const response = await this.fetchLayerData(updatedUrl);
await this.afterUpdateLayer(response, updatedUrl);
this.scrollTop();
} catch (error) {
console.error(error);
} finally {
this.isLoading = false;
let count = parseInt(document.querySelector('.toolbar-number')?.innerText || '0', 10);
let label = 'Voir\u0020le\u0020r\u00E9sultat';
if (count > 1) {
label = 'Voir\u0020les\u0020\u00251\u0020r\u00E9sultats';
}
const finalLabel = label.replace('%1', count);
window.dispatchEvent(new CustomEvent('update-label-btn', {detail: finalLabel}));
}
},
async fetchLayerData(url) {
const response = await fetch(url, {
headers: {
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
},
method: 'GET',
mode: 'same-origin',
credentials: 'include',
});
if (response.ok) {
const data = await response.json();
return this.buildResponse(data);
} else {
throw new Error('Fetch failed');
}
},
async afterUpdateLayer(response, updatedUrl) {
try {
await this.updatePageState(updatedUrl);
await this.updateElements(response);
this.isLoading = false;
} catch (error) {
console.error(error);
this.isLoading = false;
}
},
async loadPage(url) {
this.isLoading = true;
try {
const updatedUrl = this.processPageUrl(url);
const result = await this.fetchPageData(updatedUrl);
await this.afterPageLoad(result, updatedUrl);
} catch (error) {
console.error(error);
} finally {
this.isLoading = false;
}
},
async loadPageWithPager(url) {
if (!this.ajaxEnable) {
window.location.href = url;
return;
}
this.isLoading = true;
try {
const builtUrl = this.buildUrl(url);
const updatedUrl = this.processPageUrl(builtUrl);
const result = await this.fetchPageData(updatedUrl);
await this.afterPageLoadPager(result, updatedUrl);
} catch (error) {
console.error(error);
} finally {
this.isLoading = false;
}
},
async fetchPageData(url) {
const response = await fetch(url, {
headers: {
'X-Requested-With': 'XMLHttpRequest'
},
method: 'GET',
mode: 'same-origin',
credentials: 'include',
});
if (response.ok) {
const data = await response.json();
return this.buildResponse(data);
} else {
throw new Error('Fetch failed');
}
},
buildResponse(data) {
return {
productList: new DOMParser()
.parseFromString(data.productList || '', 'text/html')
.querySelector('.products.wrapper')?.outerHTML || '',
activeFilter: new DOMParser()
.parseFromString(data.activeFilter || '', 'text/html')
.querySelector('.active-filters')?.outerHTML || '',
eraseFilter: new DOMParser()
.parseFromString(data.eraseFilter || '', 'text/html')
.querySelector('.erase-filter')?.outerHTML || '',
listFilterOptions: new DOMParser()
.parseFromString(data.listFilterOptions || '', 'text/html')
.querySelector('.filter-content')?.outerHTML || '',
pagination: new DOMParser()
.parseFromString(data.productList || '', 'text/html')
.querySelector('[aria-label=pagination]')?.outerHTML || '',
quickFilters: new DOMParser()
.parseFromString(data.productList || '', 'text/html')
.querySelector('#quick-filters')?.outerHTML || '',
toolbarAmount: data.toolbarAmount,
dataLayer: data.dataLayer || ''
};
},
async afterPageLoad(response, url) {
this.isLoading = true;
try {
const newUrl = this.processPageUrl(url);
await this.updatePageState(newUrl);
await this.replaceProductList(response);
} catch (error) {
console.error(error);
} finally {
this.isLoading = false;
}
},
async afterPageLoadPager(response, url) {
this.isLoading = true;
try {
const newUrl = this.processPageUrl(url);
await this.updatePageState(newUrl);
await this.updateElements(response);
this.scrollTop();
} catch (error) {
console.error(error);
} finally {
this.isLoading = false;
}
},
scrollTop() {
setTimeout(() => {
window.scrollTo({
top: 0,
left: 0,
behavior: 'smooth'
});
}, 250);
},
processPageUrl(url) {
const newUrl = new URL(url);
newUrl.searchParams.delete('_');
return newUrl.toString();
},
async updatePageState(newUrl) {
const updatedUrl = new URL(newUrl);
updatedUrl.searchParams.delete('_');
updatedUrl.searchParams.delete('isAjax');
updatedUrl.searchParams.delete('_');
history.pushState({}, document.title, updatedUrl.toString());
this.reload();
},
async updateElements(response) {
const newPagination = new DOMParser().parseFromString(response.pagination, 'text/html').querySelector('[aria-label=pagination]');
const pagination = document.querySelector('[aria-label=pagination]');
if (pagination && newPagination) {
pagination.replaceWith(newPagination);
} else if (pagination) {
// Single page of results: the pager is emptied but kept, so that a later update can fill it again
pagination.replaceChildren();
}
const newProductList = new DOMParser().parseFromString(response.productList, 'text/html')
.querySelector('.products.wrapper')?.children;
const productList = document.querySelector('.products.wrapper');
if (productList && newProductList) productList.replaceChildren(...newProductList);
const newEraseFilter = new DOMParser().parseFromString(response.eraseFilter, 'text/html').querySelector('.erase-filter');
const eraseFilter = document.querySelector('.erase-filter');
if (newEraseFilter && eraseFilter) {
eraseFilter.replaceWith(newEraseFilter);
}
const newActiveFilters = new DOMParser().parseFromString(response.activeFilter, 'text/html').querySelector('.active-filters');
const activeFilters = document.querySelector('.active-filters');
if (newActiveFilters && activeFilters) {
activeFilters.replaceWith(newActiveFilters);
}
const newFilters = new DOMParser().parseFromString(response.listFilterOptions, 'text/html').querySelectorAll('.filter-content .filter-option');
const filterContent = document.querySelector('.filter-content');
if (newFilters && filterContent) {
filterContent.innerHTML = '';
filterContent.append(...newFilters);
}
const toolbarAmount = document.querySelector('#toolbar-amount');
if (toolbarAmount && response.toolbarAmount !== undefined) {
if (response.toolbarAmount > 1) {
toolbarAmount.innerHTML = '<span class="toolbar-number">' + response.toolbarAmount + '</span> ' + 'produits';
} else {
toolbarAmount.innerHTML = '<span class="toolbar-number">' + response.toolbarAmount + '</span> ' + 'produit';
}
}
const newQuickFilters = new DOMParser().parseFromString(response.quickFilters, 'text/html').querySelector('#quick-filters');
const quickFilters = document.querySelector('#quick-filters');
if (newQuickFilters && quickFilters) {
quickFilters.replaceWith(newQuickFilters);
}
if (response.dataLayer) {
this.updateDataLayer(response.dataLayer);
}
await this.replaceSliderFilters({
listFilterOptions: response.listFilterOptions
});
if (typeof window.ajaxCart === 'function') {
window.ajaxCart();
}
},
async replaceSliderFilters(response) {
const sliderItems = this.getSliderFilterValues();
if (sliderItems.length > 0) {
const newSlidersContent = new DOMParser().parseFromString(response.listFilterOptions, 'text/html')
.querySelectorAll('.filter-content .filter-option');
const filteredItems = Array.from(newSlidersContent)
.filter(item => sliderItems.includes(item.dataset.filterName));
filteredItems.map(item => {
const slider = document.querySelector(`[data-filter-name=${item.dataset.filterName}]`);
slider.replaceWith(item);
});
}
},
async replaceFilterItems(response) {
const currentFiltersList = this.getMultipleFilterValues();
const newFiltersContent = new DOMParser().parseFromString(response.listFilterOptions, 'text/html')
.querySelectorAll('.filter-content .filter-option');
const filteredListContent = Array.from(newFiltersContent).filter(item => {
return currentFiltersList.lastIndexOf(item.dataset.filterName) === -1;
});
if (filteredListContent.length > 0) {
const filterContent = document.querySelector('.filter-content');
filterContent.append(...filteredListContent);
}
},
async replaceActiveFilter(response) {
const newActiveFilter = new DOMParser().parseFromString(response.activeFilter, 'text/html')
.querySelector('.filter-current');
const activeFilter = document.querySelector('.filter-current');
activeFilter.replaceWith(newActiveFilter);
},
async replaceProductList(response) {
const newProductList = new DOMParser()
.parseFromString(response.productList, 'text/html')
.querySelector('.products.wrapper');
const productList = document.querySelector('.products.wrapper');
if (newProductList && productList) {
productList.append(...newProductList.children);
if (typeof window.ajaxCart === 'function') {
window.ajaxCart();
}
}
},
updateDataLayer(html) {
const parsed = new DOMParser().parseFromString(html, 'text/html');
const scripts = parsed.querySelectorAll('script[data-datalayer-script="1"]');
if (scripts.length === 0) {
return;
}
scripts.forEach(script => {
const s = document.createElement('script');
if (script.src) {
s.src = script.src;
s.async = script.async;
} else {
s.textContent = script.textContent;
}
document.body.appendChild(s);
s.remove();
});
}
})
})
</script>
<div x-data="addToCartSuccess_6acf38a49e069_cart_product_success()">
<div id="add-to-cart-success"
:class="{'active': open}"
class="overflow-x-hidden"
>
<div class="flex justify-between bg-container p-6 pb-3 items-center">
<a @click="open = false;" href="javascript:;" class="flex items-center gap-2 font-light text-sm text-primary">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 7 12" fill="none" aria-hidden="true">
<path d="M6 1L1 6L6 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
Continuer mes achats </a>
<a @click="open = false;" href="javascript:;">
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 14 14" fill="none" aria-hidden="true">
<path d="M13 1L1 13M1 1L13 13" stroke="#1D1D1B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
</div>
<div class="bg-container p-6 pt-3 product-success">
<p class="mb-2">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 25 24" fill="none" aria-hidden="true">
<path d="M22.3006 9.9995C22.7573 12.2408 22.4318 14.5709 21.3785 16.6013C20.3251 18.6317 18.6075 20.2396 16.5121 21.1568C14.4167 22.0741 12.0702 22.2453 9.86391 21.6419C7.65758 21.0385 5.7248 19.6969 4.38789 17.8409C3.05097 15.9849 2.39073 13.7267 2.51728 11.4429C2.64382 9.15904 3.54949 6.98759 5.08326 5.29067C6.61703 3.59375 8.68619 2.47393 10.9457 2.11795C13.2052 1.76198 15.5184 2.19136 17.4996 3.3345" stroke="#9DBCA5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9.5 11L12.5 14L22.5 4" stroke="#9DBCA5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
Produit ajouté ! </p>
<div class="addtocart-product-success"></div>
<p class="shipping text-center my-6">
Livraison gratuite en point relais dès <b>25€</b> d'achat ! </p>
<a class="m-auto flex w-fit btn btn-primary !py-4 !px-11 !rounded-full"
href="https://www.avril-beaute.fr/checkout/cart/">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" class="border-current" aria-hidden="true">
<path d="M14.6664 10.3354C14.6664 11.0426 14.3854 11.7209 13.8853 12.221C13.3852 12.7211 12.7069 13.0021 11.9997 13.0021C11.2924 13.0021 10.6142 12.7211 10.1141 12.221C9.61398 11.7209 9.33303 11.0426 9.33303 10.3354M6.06836 7.69141H17.931" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.26667 7.31133C6.09357 7.54213 6 7.82284 6 8.11133V17C6 17.3536 6.14048 17.6928 6.39052 17.9428C6.64057 18.1929 6.97971 18.3333 7.33333 18.3333H16.6667C17.0203 18.3333 17.3594 18.1929 17.6095 17.9428C17.8595 17.6928 18 17.3536 18 17V8.11133C18 7.82284 17.9064 7.54213 17.7333 7.31133L16.4 5.53333C16.2758 5.36774 16.1148 5.23333 15.9296 5.14076C15.7445 5.04819 15.5403 5 15.3333 5H8.66667C8.45967 5 8.25552 5.04819 8.07038 5.14076C7.88524 5.23333 7.7242 5.36774 7.6 5.53333L6.26667 7.31133Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>Voir mon panier</span>
</a>
</div>
<div class="flex justify-center items-center save-planet">
<div>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 29 28" fill="none" class="rotate-180" aria-hidden="true">
<path d="M25.6309 17.4998H20.3342C19.7154 17.4998 19.1219 17.7457 18.6843 18.1832C18.2467 18.6208 18.0009 19.2143 18.0009 19.8332V25.1298M8.66758 3.89648V5.83315C8.66758 6.76141 9.03633 7.65165 9.6927 8.30803C10.3491 8.9644 11.2393 9.33315 12.1676 9.33315C12.7864 9.33315 13.3799 9.57898 13.8175 10.0166C14.2551 10.4542 14.5009 11.0476 14.5009 11.6665C14.5009 12.9498 15.5509 13.9998 16.8342 13.9998C17.4531 13.9998 18.0466 13.754 18.4842 13.3164C18.9217 12.8788 19.1676 12.2853 19.1676 11.6665C19.1676 10.3832 20.2176 9.33315 21.5009 9.33315H25.1992M13.3342 25.6082V20.9998C13.3342 20.381 13.0884 19.7875 12.6508 19.3499C12.2132 18.9123 11.6197 18.6665 11.0009 18.6665C10.3821 18.6665 9.78858 18.4207 9.351 17.9831C8.91341 17.5455 8.66758 16.952 8.66758 16.3332V15.1665C8.66758 14.5476 8.42175 13.9542 7.98416 13.5166C7.54658 13.079 6.95308 12.8332 6.33424 12.8332H2.89258" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M14.5007 25.6673C20.944 25.6673 26.1673 20.444 26.1673 14.0007C26.1673 7.55733 20.944 2.33398 14.5007 2.33398C8.05733 2.33398 2.83398 7.55733 2.83398 14.0007C2.83398 20.444 8.05733 25.6673 14.5007 25.6673Z" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<p>
Chaque achat, <b>c’est 1% du prix reversé pour la planète.</b> </p>
</div>
<hr>
<div class="addtocart-routine-success" x-show="count === 3">
<div class="products-slider routine max-w-[820px] w-full md:mx-auto mx-2.5">
<span class="block font-sans font-light text-xs tracking-normal text-primary text-center mt-3">
LA ROUTINE </span>
<span class="font-abhayalibre font-extrabold leading-none text-28 md:text-44 tracking-normal text-center text-primary mb-6 block"
x-text="routine.title">
</span>
<div class="swiper pl-5" id="slider-routines">
<ul class="product-items swiper-wrapper" :class="{ 'hidden': !initialized }">
<template x-for="(product, index) in routine.products">
<li class="swiper-slide h-auto flex flex-col">
<div class="w-full flex flex-col items-center justify-center mb-8">
<span
class="font-abhayalibre font-extrabold text-40 leading-[90%] tracking-normal text-primary"
x-text="index + 1"
></span>
<span
class="font-sans font-light text-xs leading-none text-primary tracking-normal mb-6"
x-text="routine.step_title[index + 1]">
</span>
<div class="w-full" x-html="product"></div>
</div>
</li>
</template>
</ul>
<div class="flex items-center justify-between mb-10 pr-6">
<div class="flex">
<div class="custom-pagination custom-pagination-routine flex gap-2"></div>
</div>
<div class="flex gap-2 w-20 shrink-0 justify-end">
<button class="swiper-button-prev">
<svg xmlns="http://www.w3.org/2000/svg" width="5" height="10" viewbox="0 0 7 12" fill="none" aria-hidden="true">
<path d="M6 1L1 6L6 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<button class="swiper-button-next">
<svg xmlns="http://www.w3.org/2000/svg" width="5" height="10" viewbox="0 0 7 12" fill="none" class="rotate-180" aria-hidden="true">
<path d="M6 1L1 6L6 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="overlay" :class="{'active': open}" @click="open = false;"></div>
</div>
<script>
function addToCartSuccess_6acf38a49e069_cart_product_success() {
return {
open: false,
initialized: false,
count: 0,
swiper: null,
routine: [],
quoteItems: [],
lastItemAjaxUrl: "https://www.avril-beaute.fr/checkout/ajax/getlastitemadded/",
init() {
this.execute();
window.addEventListener('ajax:addToCart', () => {
this.execute();
});
},
execute() {
const cookieName = 'COOKIE_INFO_ADD_TO_CART';
if (window.location.pathname.includes('/checkout/cart')) {
hyva.setCookie(cookieName, '', -1);
return;
}
if (hyva.getCookie(cookieName) && hyva.getCookie(cookieName) !== '') {
let cookieValue = hyva.getCookie(cookieName);
cookieValue = decodeURIComponent(cookieValue);
cookieValue = JSON.parse(cookieValue);
this.getLastItemAjaxUrl(cookieValue.product, cookieValue.giftcard_amount ?? 0);
hyva.setCookie(cookieName, '', -1);
}
},
getLastItemAjaxUrl: function (id, giftcardAmount) {
let self = this;
fetch(this.lastItemAjaxUrl + '?id=' + encodeURIComponent(id) + '&_=' + Date.now(), {
method: 'GET'
})
.then(async response => {
if (!response.ok) throw new Error("Erreur réseau");
return response.json();
})
.then(response => {
let newAddtocartProductSuccess = new DOMParser().parseFromString(response.html.product, 'text/html')
.querySelector('.addtocart-product-success');
if (giftcardAmount > 0) {
let priceEl = newAddtocartProductSuccess.querySelector('[data-price-amount]');
if (priceEl && parseFloat(priceEl.getAttribute('data-price-amount')) === 0) {
priceEl.setAttribute('data-price-amount', giftcardAmount);
let priceSpan = priceEl.querySelector('.price');
if (priceSpan) {
const amountNum = parseFloat(giftcardAmount);
const options = amountNum % 1 === 0
? { minimumFractionDigits: 0, maximumFractionDigits: 0 }
: {};
priceSpan.innerHTML = hyva.formatPrice(amountNum, false, options);
}
}
}
let addtocartProductSuccess = document.querySelector('.addtocart-product-success');
addtocartProductSuccess.replaceWith(newAddtocartProductSuccess);
if (response.html.routine) {
this.routine = response.html.routine;
this.count = response.html.routine.count;
for (const [key] of Object.entries(response.html.items)) self.quoteItems.push(key);
this.initSlider();
}
window.dispatchEvent(new CustomEvent('get-last-item-success', { detail: { productId: id } }));
self.open = true;
})
.catch(error => {
console.error("Erreur :", error);
});
},
initSlider() {
if (this.swiper) this.swiper.destroy(true, true);
let swiperContainer = document.querySelector('#slider-routines');
if (!swiperContainer) return;
const parent = swiperContainer.closest('.addtocart-routine-success');
const btnPrev = parent.querySelector('.swiper-button-prev');
const btnNext = parent.querySelector('.swiper-button-next');
this.swiper = new Swiper(swiperContainer, {
centeredSlides: false,
slidesPerView: 2.5,
slidesPerGroup: 1,
spaceBetween: 10,
keyboard: { enabled: true },
speed: 500,
loop: false,
navigation: {
nextEl: btnNext,
prevEl: btnPrev,
},
pagination: {
el: swiperContainer.querySelector('.custom-pagination-routine'),
clickable: true,
renderBullet: (index, className) => `<span class="${className}"></span>`
},
breakpoints: {
967: {slidesPerView: 2.5, slidesPerGroup: 1},
0: {slidesPerView: 2.2, slidesPerGroup: 1}
}
});
this.initialized = true;
},
isInCart(sku) {
return this.quoteItems.includes(sku);
}
}
}
</script>
<div class="cn_page_category" style="display:none">/Default Category/Cadeaux /Cadeaux</div>
</div></div></main><div class="page-bottom"><div class="bg-container-lighter"> <div class="description py-10 px-10"
x-data="{ expanded: false, showButton: false, fullHeight: 0, collapsedHeight: 0, lineLimit: 3, init() { const contentEl = this.$refs.content; const style = window.getComputedStyle(contentEl); const lineHeight = parseFloat(style.lineHeight); this.fullHeight = contentEl.scrollHeight; this.collapsedHeight = this.lineLimit * lineHeight; this.showButton = contentEl.scrollHeight > this.collapsedHeight; } }">
<div class="container mx-auto">
<div x-ref="content"
class="relative overflow-hidden transition-all duration-300"
:style="expanded ? `max-height:${fullHeight}px` : `max-height:${collapsedHeight}px`">
<style>#html-body [data-pb-style=HFUDQXQ]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="HFUDQXQ"><div data-content-type="text" data-appearance="default" data-element="main"><p><span style="font-size: 16px;">Avril, ce sont des soins pour vous, mais pas que ! Faites plaisir à vos proches avec les cartes cadeaux et <span style="color: #000000;"><strong><a style="color: #000000;" tabindex="0" href="/cadeaux/cadeaux/coffrets-cadeaux.html">idées de cadeau, maquillage</a></strong></span> ou soin, certifiés bio, Avril Beauté.</span></p>
<p>Parce que faire plaisir doit rester un plaisir, on a essayé de réfléchir, chez Avril*, à une gamme de cadeaux certifiés bio, à des emballages réutilisables ainsi qu’à des cartes cadeaux virtuelles… pour limiter, du mieux que l’on peut, notre impact sur l’environnement.</p>
<p>Ainsi, vous trouverez chez Avril :<br>- des <span style="color: #000000;"><strong><a style="color: #000000;" tabindex="0" href="/cadeaux/cadeaux/coffrets-cadeaux.html">coffrets de produits de beauté</a></strong></span>, majoritairement certifiés bio et fabriqués en France <br>- des <strong><span style="color: #000000;"><a style="color: #000000;" tabindex="0" href="/cadeaux/cadeaux/carte-cadeau.html">cartes cadeaux</a></span></strong> virtuelles, de ce fait, sans emballage et sans plastique <br>- ainsi que des emballages justement, réutilisables : pochons en coton bio, pochettes en carton recyclé et recyclable, et furoshiki (des <span style="color: #000000;"><strong><a style="color: #000000;" href="/cadeaux/cadeaux/emballage-cadeau.html">emballages cadeaux plus naturels</a></strong></span>, en coton bio) </p>
<p>Cette gamme de cadeaux bio s’inscrit dans une volonté de faire au mieux pour notre environnement et Mère Nature. De la même façon, chez Avril, <br>- on réduit au maximum l’utilisation d’emballages superflus ou en plastique, et on favorise ainsi l’utilisation de carton recyclé <br>- nos boutiques n’impriment pas de ticket de caisse <br>- on se fournit en électricité chez Enercoop <br>- et on plante des arbres pour compenser nos émissions de CO2 (car c’est vrai qu’on n’est pas encore parfait… mais on y travaille) </p>
<p>Et parce qu’on est bien conscient que cette manière de penser doit s’étendre un maximum pour un jour fonctionner, et avoir ainsi plus d’impact, on essaie de fixer des prix justes. Pour nous comme pour vous. Notre mission est de faciliter l’accès à la cosmétique, et aux cadeaux, bio grâce à des petits prix. Pour Noël, un anniversaire, la simple volonté de faire plaisir, à un homme, une femme ou toute autre personne, découvrez ainsi notre gamme de cadeaux certifiés bio, et nos emballages réutilisables Avril. </p>
<p>*Avril, pour ceux qui ne nous connaissent pas, se définit comme une marque française de cosmétiques bio, engagée et accessible.</p></div></div></div> </div>
<template x-if="showButton">
<button type="button"
class="underline mt-4 font-medium md:font-light"
@click="expanded = !expanded"
x-text="expanded ? 'Lire moins' : 'Lire plus'">
</button>
</template>
</div>
</div>
</div></div><footer class="page-footer"><div class="footer content"><div class="footer-reassurance px-6 mb-20 md:mb-12"><style>#html-body [data-pb-style=WELNJIA]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-attachment:scroll}#html-body [data-pb-style=O56UUWY]{align-self:stretch}#html-body [data-pb-style=HYT5PXU]{display:flex;width:100%}#html-body [data-pb-style=DIHY02H],#html-body [data-pb-style=EOMOYHO],#html-body [data-pb-style=T8OC2VC],#html-body [data-pb-style=VLG56UG]{display:flex;flex-direction:column;align-self:stretch}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div class="footer_reassurance" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="false" data-element="inner" data-pb-style="WELNJIA"><div class="pagebuilder-column-group reassurance-line" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="4" data-background-lazy-load="false" data-element="main" data-pb-style="O56UUWY"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="HYT5PXU"><div class="pagebuilder-column reassurance-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="DIHY02H"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewbox="0 0 48 48" fill="none" class="text-primary" role="img">
<path d="M1.5012 46.641C4.3137 44.4202 6.6087 42.1972 10.2762 41.691C13.4512 41.6902 16.5078 42.8967 18.8262 45.066C20.0294 45.9088 21.4206 46.4443 22.8783 46.6257C24.3361 46.8072 25.8161 46.629 27.1892 46.1068C28.5622 45.5846 29.7866 44.7343 30.7554 43.63C31.7242 42.5257 32.4079 41.2011 32.747 39.7717C34.2068 40.032 35.7104 39.8748 37.0849 39.3182C38.4593 38.7616 39.6487 37.8283 40.5161 36.6257C41.3835 35.423 41.8938 33.9999 41.9881 32.52C42.0825 31.0402 41.7571 29.5638 41.0495 28.2607C42.3393 27.844 43.4997 27.1014 44.4185 26.1048C45.3372 25.1083 45.9832 23.8914 46.2939 22.572C46.6045 21.2526 46.5694 19.8754 46.1918 18.5736C45.8143 17.2717 45.1071 16.0894 44.1387 15.141C44.87 14.4097 45.4501 13.5415 45.8459 12.586C46.2417 11.6305 46.4454 10.6064 46.4454 9.57221C46.4454 8.538 46.2417 7.51391 45.8459 6.55842C45.4501 5.60293 44.87 4.73476 44.1387 4.00346C43.4074 3.27216 42.5392 2.69206 41.5837 2.29629C40.6283 1.90051 39.6042 1.69681 38.57 1.69681C36.4813 1.69681 34.4781 2.52653 33.0012 4.00346C32.0528 3.03507 30.8704 2.32789 29.5686 1.95033C28.2668 1.57278 26.8895 1.53763 25.5702 1.84831C24.2508 2.15898 23.0339 2.80494 22.0373 3.72369C21.0407 4.64245 20.2982 5.80288 19.8815 7.09271C18.5784 6.38504 17.102 6.05966 15.6221 6.15402C14.1423 6.24837 12.7191 6.75863 11.5165 7.62606C10.3138 8.4935 9.38052 9.68287 8.82396 11.0573C8.2674 12.4317 8.1102 13.9354 8.37045 15.3952C6.95353 15.7403 5.64169 16.4245 4.54783 17.389C3.45397 18.3534 2.61087 19.5693 2.09108 20.9318C1.5713 22.2944 1.39041 23.7628 1.56397 25.2108C1.73754 26.6588 2.26036 28.0429 3.08745 29.244C4.87395 31.836 6.92145 34.743 6.4512 37.866C5.8347 41.5627 3.7827 43.788 1.5012 46.641ZM1.5012 46.641L35.2512 12.891" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
<title>heroicons/outline/footer/produit-bio</title></svg>
</div><div data-content-type="text" data-appearance="default" data-element="main">
<p style="text-align: center;">
<a tabindex="0" title="des produits certifiés bio" href="/le-projet-avril#projet">des produits certifiés bio</a>
</p>
</div><div class="reassurance-description" data-content-type="text" data-appearance="default" data-element="main">
<p style="text-align: center;">
<span style="white-space: pre-wrap;">Nos produits sont audités chaque année par Ecocert et répondent au référentiel exigeant de la cosmétique bio COSMOS.</span>
</p>
</div></div><div class="pagebuilder-column reassurance-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="VLG56UG"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewbox="0 0 48 48" fill="none" class="text-primary" role="img">
<path d="M12.4182 24.1416H23.6682M5.33066 16.5366C5.00225 15.0573 5.05268 13.519 5.47726 12.0643C5.90185 10.6097 6.68684 9.28583 7.75946 8.21545C8.83208 7.14507 10.1576 6.36285 11.6131 5.94131C13.0686 5.51978 14.607 5.47257 16.0857 5.80408C16.8995 4.53125 18.0207 3.48378 19.3458 2.75822C20.6709 2.03265 22.1574 1.65234 23.6682 1.65234C25.1789 1.65234 26.6654 2.03265 27.9905 2.75822C29.3157 3.48378 30.4368 4.53125 31.2507 5.80408C32.7315 5.47113 34.2726 5.51812 35.7304 5.94068C37.1882 6.36324 38.5155 7.14764 39.5888 8.22092C40.6621 9.2942 41.4465 10.6215 41.8691 12.0793C42.2916 13.5372 42.3386 15.0782 42.0057 16.5591C43.2785 17.3729 44.3259 18.4941 45.0515 19.8192C45.7771 21.1443 46.1574 22.6308 46.1574 24.1416C46.1574 25.6523 45.7771 27.1388 45.0515 28.4639C44.3259 29.7891 43.2785 30.9102 42.0057 31.7241C42.3372 33.2027 42.29 34.7411 41.8684 36.1966C41.4469 37.6521 40.6647 38.9777 39.5943 40.0503C38.5239 41.1229 37.2 41.9079 35.7454 42.3325C34.2908 42.7571 32.7525 42.8075 31.2732 42.4791C30.4604 43.7568 29.3383 44.8087 28.0109 45.5375C26.6835 46.2664 25.1937 46.6484 23.6794 46.6484C22.1651 46.6484 20.6753 46.2664 19.3479 45.5375C18.0205 44.8087 16.8984 43.7568 16.0857 42.4791C14.607 42.8106 13.0686 42.7634 11.6131 42.3418C10.1576 41.9203 8.83208 41.1381 7.75946 40.0677C6.68684 38.9973 5.90185 37.6734 5.47726 36.2188C5.05268 34.7642 5.00225 33.2259 5.33066 31.7466C4.04806 30.9349 2.99159 29.812 2.25952 28.4823C1.52745 27.1527 1.14355 25.6594 1.14355 24.1416C1.14355 22.6237 1.52745 21.1305 2.25952 19.8008C2.99159 18.4712 4.04806 17.3483 5.33066 16.5366Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M30.4185 18.2906C29.2227 16.8926 27.6271 15.8945 25.8468 15.431C24.0664 14.9675 22.1868 15.0607 20.461 15.698C18.7352 16.3354 17.2462 17.4864 16.1946 18.9959C15.1429 20.5054 14.5791 22.3009 14.5791 24.1406C14.5791 25.9803 15.1429 27.7759 16.1946 29.2854C17.2462 30.7949 18.7352 31.9458 20.461 32.5832C22.1868 33.2206 24.0664 33.3138 25.8468 32.8503C27.6271 32.3867 29.2227 31.3887 30.4185 29.9906" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
<title>heroicons/outline/footer/prix-moyen</title></svg>
</div><div data-content-type="text" data-appearance="default" data-element="main">
<p style="text-align: center;">
<a title="7€, c'est notre prix moyen" href="/qui-est-avril-marque-cosmetique-bio">7€, c'est notre prix moyen</a>
</p>
</div><div class="reassurance-description" data-content-type="text" data-appearance="default" data-element="main">
<p style="text-align: center;">
<span style="white-space: pre-wrap;">Notre secret ? Pas d'échantillon, pas d'égérie, (presque) pas de pub, pas de suremballage... Juste le produit !</span>
</p>
</div></div><div class="pagebuilder-column reassurance-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="EOMOYHO"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewbox="0 0 48 48" fill="none" class="text-primary" role="img">
<path d="M45.7988 30.8912H35.5838C34.3903 30.8912 33.2457 31.3654 32.4018 32.2093C31.5579 33.0532 31.0838 34.1978 31.0838 35.3912V45.6063M13.0838 4.65625V8.39125C13.0838 10.1815 13.7949 11.8984 15.0608 13.1642C16.3267 14.4301 18.0436 15.1412 19.8338 15.1412C21.0273 15.1412 22.1719 15.6154 23.0158 16.4593C23.8597 17.3032 24.3338 18.4478 24.3338 19.6412C24.3338 22.1162 26.3588 24.1412 28.8338 24.1412C30.0273 24.1412 31.1719 23.6671 32.0158 22.8232C32.8597 21.9793 33.3338 20.8347 33.3338 19.6412C33.3338 17.1662 35.3588 15.1412 37.8338 15.1412H44.9663M22.0838 46.5288V37.6412C22.0838 36.4478 21.6097 35.3032 20.7658 34.4593C19.9219 33.6154 18.7773 33.1412 17.5838 33.1412C16.3903 33.1412 15.2457 32.6671 14.4018 31.8232C13.5579 30.9793 13.0838 29.8347 13.0838 28.6412V26.3912C13.0838 25.1978 12.6097 24.0532 11.7658 23.2093C10.9219 22.3654 9.77726 21.8912 8.58379 21.8912H1.94629" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M24.333 46.6406C36.7594 46.6406 46.833 36.567 46.833 24.1406C46.833 11.7142 36.7594 1.64062 24.333 1.64062C11.9066 1.64062 1.83301 11.7142 1.83301 24.1406C1.83301 36.567 11.9066 46.6406 24.333 46.6406Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
<title>heroicons/outline/footer/planete</title></svg>
</div><div data-content-type="text" data-appearance="default" data-element="main">
<p style="text-align: center;">
<a title="1% de nos ventes pour la planète" href="/le-projet-avril-environnement">1% de nos ventes pour la planète</a>
</p>
</div><div class="reassurance-description" data-content-type="text" data-appearance="default" data-element="main"><p style="text-align: center;"><span style="white-space: pre-wrap;">En 2025, grâce à vous, nous avons reversé 384 000€ aux associations le Fonds pour l'arbre, Terre de liens et le Collectif les pieds dans le plat !</span></p></div></div><div class="pagebuilder-column reassurance-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="T8OC2VC"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewbox="0 0 54 55" fill="none" class="text-primary" role="img">
<path d="M29.8907 2.10547C29.5532 2.10547 26.6001 2.6423 26.6001 2.6423C26.463 7.03086 23.3939 10.9195 17.0763 11.5945L15.7263 9.16133L13.079 9.42289L14.2708 15.7605L2.26953 15.2437L3.55625 19.6207C16.4857 23.7867 15.895 35.7046 13.079 46.357C18.0361 51.9468 28.0345 51.3984 32.6962 50.9027C33.0232 44.3425 38.2228 44.1 47.0294 47.5066C48.2212 45.6504 49.0122 43.7097 51.7333 42.1593L46.8185 27.4464L43.9181 28.1004C45.0782 25.875 47.3142 22.8375 49.2337 21.4136L50.879 12.2484C41.5345 11.5839 35.4384 7.35887 29.8907 2.10547Z" stroke="black" stroke-width="2" stroke-linejoin="round"></path>
<title>heroicons/outline/footer/envoi-responsable</title></svg>
</div><div data-content-type="text" data-appearance="default" data-element="main">
<p style="text-align: center;">
<a tabindex="-1" title="85% de nos cosmétiques sont fabriqués en France" href="/le-projet-avril-nos-produits#madeinfrance">85% de nos cosmétiques sont fabriqués en France</a>
</p>
</div><div class="reassurance-description" data-content-type="text" data-appearance="default" data-element="main">
<p style="text-align: center;">Et le reste ? Ils viennent d’Italie, tout près de chez nous.</p>
</div></div></div></div></div></div><script>
(function () {
const pushEvent = (el) => {
const rawData = {"reassurance":"{{inner_text}}"};
const finalData = {
event: 'footer'
};
const keys = Object.keys(rawData);
keys.forEach((key, index) => {
let value = String(rawData[key]);
value = value.replace(/{{inner_text}}/g, el.innerText.trim());
value = value.replace(/{{value}}/g, el.value || '');
value = value.replace(/{{title}}/g, el.title || el.getAttribute('aria-label') || '');
value = value.replace(/{{href}}/g, el.href || '');
value = value.replace(/{{page_type}}/g, 'category');
const selectorRegex = /(?:{{)?selector:([^|{}]+)\|([^}|]+)(?:}})?/g;
value = value.replace(selectorRegex, (match, cssSelector, attr) => {
const targetEl = el.querySelector(cssSelector) || document.querySelector(cssSelector);
if (!targetEl) return '';
if (attr === 'inner_text') return targetEl.innerText.trim();
if (attr === 'value') return targetEl.value || '';
return targetEl.getAttribute(attr) || '';
});
const suffix = keys.length > 1 ? (index + 1) : '';
finalData['event_parameter' + suffix] = key;
finalData['event_value' + suffix] = value;
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(finalData);
};
// Using event delegation to support AJAX content
document.addEventListener('click', function (e) {
const el = e.target.closest('.footer-reassurance a');
if (el) {
pushEvent(el);
}
}, true);
document.addEventListener('auxclick', function (e) {
const el = e.target.closest('.footer-reassurance a');
if (el) {
pushEvent(el);
}
}, true);
})();
</script>
</div><div class="footer-main gap-12 px-0 lg:px-6 flex flex-col lg:flex-row">
<div class="w-full text-background py-11 h-fit dynamic-bg-color">
<form
class="form subscribe"
action="https://www.avril-beaute.fr/newsletter/subscriber/new/"
method="post"
x-data="initNewsletterForm"
@submit.prevent="submitForm"
id="newsletter-validate-detail"
aria-label="S'abonner à la lettre d’information"
>
<p class="font-abhayalibre font-extrabold text-38 md:text-3xl !leading-[90%] tracking-normal !text-background mx-auto max-w-[268px] md:max-w-[362px] text-center mb-4">
Envie de nous suivre ? </p>
<div class="footer-socials-container">
<style>#html-body [data-pb-style=QQPGORI], #html-body [data-pb-style=U5A73MB] {
background-position: left top;
background-size: cover;
background-repeat: no-repeat;
background-attachment: scroll
}
#html-body [data-pb-style=U5A73MB] {
justify-content: flex-start;
display: flex;
flex-direction: column
}
#html-body [data-pb-style=QQPGORI] {
align-self: stretch
}
#html-body [data-pb-style=YI3CS5T] {
display: flex;
width: 100%
}
#html-body [data-pb-style=AO0EO7O], #html-body [data-pb-style=BM557W3], #html-body [data-pb-style=UMRVPJJ], #html-body [data-pb-style=UQAH4WF], #html-body [data-pb-style=YE2RRD3] {
justify-content: flex-start;
display: flex;
flex-direction: column;
background-position: left top;
background-size: cover;
background-repeat: no-repeat;
background-attachment: scroll;
width: 16.6667%;
align-self: stretch
}
#html-body [data-pb-style=AO0EO7O], #html-body [data-pb-style=UMRVPJJ] {
width: 25%
}</style>
<div data-content-type="row" data-appearance="contained" data-element="main">
<div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="U5A73MB">
<div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="10" data-background-lazy-load="false" data-element="main" data-pb-style="QQPGORI">
<div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="YI3CS5T">
<div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="" data-element="main" data-pb-style="YE2RRD3">
<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true">
<a href="https://www.instagram.com/avrilcosmetiques" title="instagram" target="_blank" rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewbox="0 0 28 27" fill="none" role="img">
<path d="M8.40033 0.181641H19.6003C23.867 0.181641 27.3337 3.64831 27.3337 7.91497V19.115C27.3337 21.166 26.5189 23.133 25.0686 24.5833C23.6183 26.0335 21.6513 26.8483 19.6003 26.8483H8.40033C4.13366 26.8483 0.666992 23.3816 0.666992 19.115V7.91497C0.666992 5.86397 1.48175 3.89696 2.93203 2.44668C4.38231 0.9964 6.34932 0.181641 8.40033 0.181641ZM8.13366 2.84831C6.86062 2.84831 5.63972 3.35402 4.73955 4.25419C3.83937 5.15437 3.33366 6.37527 3.33366 7.64831V19.3816C3.33366 22.035 5.48033 24.1816 8.13366 24.1816H19.867C21.14 24.1816 22.3609 23.6759 23.2611 22.7758C24.1613 21.8756 24.667 20.6547 24.667 19.3816V7.64831C24.667 4.99497 22.5203 2.84831 19.867 2.84831H8.13366ZM21.0003 4.84831C21.4424 4.84831 21.8663 5.0239 22.1788 5.33646C22.4914 5.64902 22.667 6.07295 22.667 6.51497C22.667 6.957 22.4914 7.38092 22.1788 7.69348C21.8663 8.00605 21.4424 8.18164 21.0003 8.18164C20.5583 8.18164 20.1344 8.00605 19.8218 7.69348C19.5093 7.38092 19.3337 6.957 19.3337 6.51497C19.3337 6.07295 19.5093 5.64902 19.8218 5.33646C20.1344 5.0239 20.5583 4.84831 21.0003 4.84831ZM14.0003 6.84831C15.7684 6.84831 17.4641 7.55069 18.7144 8.80093C19.9646 10.0512 20.667 11.7469 20.667 13.515C20.667 15.2831 19.9646 16.9788 18.7144 18.229C17.4641 19.4793 15.7684 20.1816 14.0003 20.1816C12.2322 20.1816 10.5365 19.4793 9.28628 18.229C8.03604 16.9788 7.33366 15.2831 7.33366 13.515C7.33366 11.7469 8.03604 10.0512 9.28628 8.80093C10.5365 7.55069 12.2322 6.84831 14.0003 6.84831ZM14.0003 9.51497C12.9395 9.51497 11.922 9.9364 11.1719 10.6865C10.4218 11.4367 10.0003 12.4541 10.0003 13.515C10.0003 14.5758 10.4218 15.5933 11.1719 16.3434C11.922 17.0935 12.9395 17.515 14.0003 17.515C15.0612 17.515 16.0786 17.0935 16.8288 16.3434C17.5789 15.5933 18.0003 14.5758 18.0003 13.515C18.0003 12.4541 17.5789 11.4367 16.8288 10.6865C16.0786 9.9364 15.0612 9.51497 14.0003 9.51497Z" fill="currentColor"></path>
<title>heroicons/outline/socials/instagram</title></svg>
</a>
</div>
</div>
<div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="" data-element="main" data-pb-style="UQAH4WF">
<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true">
<a href="https://www.facebook.com/avril.cosmetique" title="facebook" target="_blank" rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewbox="0 0 28 27" fill="none" role="img">
<path d="M27.3346 13.515C27.3346 6.15497 21.3613 0.181641 14.0013 0.181641C6.6413 0.181641 0.667969 6.15497 0.667969 13.515C0.667969 19.9683 5.25464 25.3416 11.3346 26.5816V17.515H8.66797V13.515H11.3346V10.1816C11.3346 7.60831 13.428 5.51497 16.0013 5.51497H19.3346V9.51497H16.668C15.9346 9.51497 15.3346 10.115 15.3346 10.8483V13.515H19.3346V17.515H15.3346V26.7816C22.068 26.115 27.3346 20.435 27.3346 13.515Z" fill="currentColor"></path>
<title>heroicons/outline/socials/facebook</title></svg>
</a>
</div>
</div>
<div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="" data-element="main" data-pb-style="BM557W3">
<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true">
<a href="https://www.pinterest.fr/avrilbeaute/" title="pinterest" target="_blank" rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewbox="0 0 28 27" fill="none" role="img">
<path d="M10.0546 26.235C11.3346 26.6216 12.628 26.8483 14.0013 26.8483C17.5375 26.8483 20.9289 25.4435 23.4294 22.9431C25.9299 20.4426 27.3346 17.0512 27.3346 13.515C27.3346 11.764 26.9898 10.0302 26.3197 8.41253C25.6496 6.79485 24.6675 5.325 23.4294 4.08688C22.1913 2.84877 20.7214 1.86664 19.1037 1.19658C17.4861 0.526518 15.7523 0.181641 14.0013 0.181641C12.2503 0.181641 10.5165 0.526518 8.89886 1.19658C7.28118 1.86664 5.81133 2.84877 4.57321 4.08688C2.07273 6.58737 0.667969 9.97875 0.667969 13.515C0.667969 19.1816 4.22797 24.0483 9.25463 25.9683C9.13463 24.9283 9.01463 23.2083 9.25463 22.0216L10.788 15.435C10.788 15.435 10.4013 14.6616 10.4013 13.435C10.4013 11.595 11.548 10.2216 12.8546 10.2216C14.0013 10.2216 14.5346 11.0616 14.5346 12.1416C14.5346 13.2883 13.7746 14.9283 13.388 16.5016C13.1613 17.8083 14.0813 18.955 15.4146 18.955C17.788 18.955 19.628 16.4216 19.628 12.8483C19.628 9.64831 17.3346 7.46164 14.0413 7.46164C10.2813 7.46164 8.06797 10.2616 8.06797 13.2083C8.06797 14.355 8.4413 15.515 9.05464 16.275C9.17463 16.355 9.17464 16.4616 9.13463 16.6616L8.74797 18.115C8.74797 18.3416 8.6013 18.4216 8.37464 18.2616C6.66797 17.515 5.6813 15.0883 5.6813 13.1283C5.6813 8.91497 8.66797 5.08831 14.428 5.08831C19.0146 5.08831 22.588 8.38164 22.588 12.755C22.588 17.3416 19.748 21.0216 15.6813 21.0216C14.388 21.0216 13.1213 20.3283 12.668 19.515L11.7746 22.675C11.468 23.8216 10.628 25.355 10.0546 26.275V26.235Z" fill="currentColor"></path>
<title>heroicons/outline/socials/pinterest</title></svg>
</a>
</div>
</div>
<div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="" data-element="main" data-pb-style="AO0EO7O">
<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true">
<a href="https://www.linkedin.com/company/18163493" title="linkedin" target="_blank" rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewbox="0 0 24 25" fill="none" role="img">
<path d="M21.3333 0.515625C22.0406 0.515625 22.7189 0.796576 23.219 1.29667C23.719 1.79677 24 2.47505 24 3.18229V21.849C24 22.5562 23.719 23.2345 23.219 23.7346C22.7189 24.2347 22.0406 24.5156 21.3333 24.5156H2.66667C1.95942 24.5156 1.28115 24.2347 0.781048 23.7346C0.280951 23.2345 0 22.5562 0 21.849V3.18229C0 2.47505 0.280951 1.79677 0.781048 1.29667C1.28115 0.796576 1.95942 0.515625 2.66667 0.515625H21.3333ZM20.6667 21.1823V14.1156C20.6667 12.9628 20.2087 11.8572 19.3936 11.0421C18.5784 10.2269 17.4728 9.76896 16.32 9.76896C15.1867 9.76896 13.8667 10.4623 13.2267 11.5023V10.0223H9.50667V21.1823H13.2267V14.609C13.2267 13.5823 14.0533 12.7423 15.08 12.7423C15.5751 12.7423 16.0499 12.939 16.3999 13.289C16.75 13.6391 16.9467 14.1139 16.9467 14.609V21.1823H20.6667ZM5.17333 7.92896C5.76742 7.92896 6.33717 7.69296 6.75725 7.27288C7.17733 6.8528 7.41333 6.28304 7.41333 5.68896C7.41333 4.44896 6.41333 3.43563 5.17333 3.43563C4.57571 3.43563 4.00257 3.67303 3.57999 4.09561C3.1574 4.51819 2.92 5.09134 2.92 5.68896C2.92 6.92896 3.93333 7.92896 5.17333 7.92896ZM7.02667 21.1823V10.0223H3.33333V21.1823H7.02667Z" fill="currentColor"></path>
<title>heroicons/outline/socials/linkedin</title></svg>
</a>
</div>
</div>
<div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="" data-element="main" data-pb-style="UMRVPJJ">
<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true">
<a href="https://www.tiktok.com/@avrilcosmetiquebio" title="tiktok" target="_blank" rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewbox="0 0 22 25" fill="none" role="img">
<path d="M17.1335 4.27563C16.2223 3.23499 15.7201 1.89882 15.7202 0.515625H11.6002V17.049C11.5691 17.9439 11.1916 18.7917 10.5473 19.4136C9.903 20.0355 9.04234 20.3828 8.14687 20.3823C6.25354 20.3823 4.68021 18.8356 4.68021 16.9156C4.68021 14.6223 6.89354 12.9023 9.17354 13.609V9.39563C4.57354 8.78229 0.546875 12.3556 0.546875 16.9156C0.546875 21.3556 4.22688 24.5156 8.13354 24.5156C12.3202 24.5156 15.7202 21.1156 15.7202 16.9156V8.52896C17.3909 9.72876 19.3967 10.3725 21.4535 10.369V6.24896C21.4535 6.24896 18.9469 6.36896 17.1335 4.27563Z" fill="currentColor"></path>
<title>heroicons/outline/socials/tiktok</title></svg>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="max-w-[80%] w-full mx-auto text-center font-sans font-light text-sm leading-[140%] tracking-normal">
Que ce soit par mail ou sur nos réseaux, on partage l’essentiel : actus, inspirations beauté et nos engagements pour la planète. </div>
<div class="relative max-w-[358px] mx-auto my-4 px-4">
<label for="newsletter-subscribe" class="sr-only">
Adresse email </label>
<input
name="email"
type="email"
required
id="newsletter-subscribe"
class="form-input block py-6"
placeholder="Mon e-mail"
autocomplete="email"
aria-describedby="footer-newsletter-heading"
>
<input name="form_key" type="hidden" value="ThSMex3EkPNfSLKM" /> <button class="btn-newsletter absolute right-10 md:right-8 top-1/2 p-0 cursor-pointer border-none bg-transparent -translate-y-1/2 before:block before:w-6 before:h-6 before:bg-contain before:bg-center before:bg-no-repeat">
<span class="hidden">Inscription</span>
</button>
</div>
<div>
<template x-if="displayErrorMessage">
<p class="flex items-center text-red">
<span class="inline-block w-8 h-8 mr-3">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
</span>
<template x-for="errorMessage in errorMessages">
<span x-html="errorMessage"></span>
</template>
</p>
</template>
</div>
</form>
<div class="max-w-[358px] w-full mx-auto text-center font-sans font-light text-11 leading-[140%] tracking-normal">
En validant mon e-mail, j’accepte de recevoir des emails et newsletters personnalisés et suivis (ouverture, clics) de la part d'Avril, conformément à notre <a href="/politique-de-confidentialite" class="underline">
Politique de confidentialité. </a>
</div>
<script>
function initNewsletterForm() {
return {
errors: 0,
hasCaptchaToken: 0,
displayErrorMessage: false,
errorMessages: [],
setErrorMessages(messages) {
this.errorMessages = [messages]
this.displayErrorMessage = this.errorMessages.length
},
submitForm() {
// Do not rename $form, the variable is expected to be declared in the recaptcha output
const $form = document.querySelector('#newsletter-validate-detail');
if (this.errors === 0) {
$form.submit();
}
}
}
}
window.addEventListener('alpine:init', () => Alpine.data('initNewsletterForm', initNewsletterForm), {once: true})
</script>
</div>
<div class="footer-links flex flex-col px-6 md:px-0 gap-6 md:gap-7 w-full"><div class="footer-links-content"><style>#html-body [data-pb-style=O6WKSW1],#html-body [data-pb-style=SU3S600]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=O6WKSW1]{justify-content:flex-start;display:flex;flex-direction:column}#html-body [data-pb-style=SU3S600]{align-self:stretch}#html-body [data-pb-style=BLX9QCC]{display:flex;width:100%}#html-body [data-pb-style=FG91EK0],#html-body [data-pb-style=LKLUFLS],#html-body [data-pb-style=YTQ1T9X]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:33.3333%;align-self:stretch}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="O6WKSW1"><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="3" data-background-lazy-load="false" data-element="main" data-pb-style="SU3S600"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="BLX9QCC"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="" data-element="main" data-pb-style="LKLUFLS"><div class="block-title" data-content-type="text" data-appearance="default" data-element="main">
<p>Besoin d'aide?</p>
</div><div data-content-type="text" data-appearance="default" data-element="main"><ul>
<li><a tabindex="0" title="Nos boutiques" href="/points-de-vente/">Venir en boutique</a></li>
<li><a tabindex="0" title="Paiement et livraison Avril" href="/livraison-paiement">Paiement & livraison</a></li>
<li><a tabindex="0" title="Foire aux questions" href="/foire-aux-questions">Foire aux questions</a></li>
<li><a tabindex="0" title="Contactez Avril" href="/contact">Nous contacter</a></li>
</ul></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="" data-element="main" data-pb-style="FG91EK0"><div class="block-title" data-content-type="text" data-appearance="default" data-element="main">
<p>L'envers du décor</p>
</div><div data-content-type="text" data-appearance="default" data-element="main"><ul>
<li><a tabindex="0" title="Le projet Avril" href="/le-projet-avril">Le projet Avril</a></li>
<li><a tabindex="0" href="/qui-est-avril-marque-cosmetique-bio">Notre histoire</a></li>
<li><a tabindex="0" title="Démarche architecturale Avril" href="/demarche-architecturale-boutiques-avril">Architecture</a></li>
<li><a tabindex="0" title="Travailler chez Avril" href="/travailler-chez-avril">Travailler chez Avril</a></li>
<li><a tabindex="0" title="La presse parle d'Avril" href="/ils-parlent-de-nous">Ils parlent de nous</a></li>
</ul></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="" data-element="main" data-pb-style="YTQ1T9X"><div class="block-title" data-content-type="text" data-appearance="default" data-element="main">
<p>Pour les pros</p>
</div><div data-content-type="text" data-appearance="default" data-element="main">
<ul>
<li><a tabindex="0" title="Devenir franchisé Avril" href="/devenir-franchise-boutique-avril-cosmetique-bio">Devenir franchisé</a></li>
<li><a tabindex="0" href="/grossiste-fournisseur-maquillage-bio-et-cosmetiques-bio">Devenir revendeur</a></li>
<li><a tabindex="0" title="Espace revendeurs" href="https://www.avril-pro.fr/" target="_blank" rel="noopener">Espace revendeurs</a></li>
</ul>
</div></div></div></div></div></div></div></div></div><script>
addEventListener('DOMContentLoaded', () => {
for (const [selector, label] of Object.entries({"aside.sidebar-main":"Sidebar Main"})) {
const target = document.querySelector(selector);
target && target.setAttribute('aria-label', label);
}
}, {once: true})
</script>
</div></footer>
<script>
function initBssSeoToolbar() {
function getUrlVars() {
let vars = [], hash;
let hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
for(let i = 0; i < hashes.length; i++)
{
hash = hashes[i].split('=');
vars.push(hash[0]);
vars[hash[0]] = hash[1];
}
return vars;
}
function createCookie(name, value, days) {
let expires;
if (days) {
let date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
}
else {
expires = "";
}
document.cookie = name + "=" + value + expires + "; path=/";
}
function getCookie(cookie_name) {
let cookie_value = "";
if (document.cookie.length > 0) {
let c_start = document.cookie.indexOf(cookie_name + "=");
if (c_start !== -1) {
c_start = c_start + cookie_name.length + 1;
let c_end = document.cookie.indexOf(";", c_start);
if (c_end === -1) {
c_end = document.cookie.length;
}
cookie_value = unescape(document.cookie.substring(c_start, c_end));
}
}
return cookie_value;
}
function renderToolbar(DOMToolbar) {
document.querySelector('#bss_seo_toolbar').innerHTML = DOMToolbar;
document.querySelector('#bss_seo_toolbar').classList.remove('hidden');
}
return {
statusHide: false,
urlEdit: '',
dataToolbar: {
url: '',
canonicalTag: '',
title: '',
metaTitle: '',
metaDescription: '',
metaKeyword: '',
headings: {
h1Elements: '',
h2Elements: '',
h3Elements: '',
h4Elements: '',
h5Elements: ''
},
imageObject: [],
openGraph: {
ogTitle: '',
ogImage: '',
ogDescription: '',
ogUrl: '',
ogType: ''
},
twitterCard: {
twitterSite: '',
twitterTitle: '',
twitterDescription: '',
twitterImage: ''
}
},
translations: {
seo_toolbar: "SEO Toolbar",
url: "URL:",
canonical_tag: "Canonical Tag:",
title: "Titre :",
meta_description: "Meta Description:",
meta_keywords: "Meta Keywords:",
headings: "Headings",
all_images_have_alt_attribute: "All images have ALT attribute.",
image_without_alt: " image without ALT.",
images_without_alt: " images without ALT.",
we_have_found_several_open_graph_objects: "Great! We have found several Open Graph objects.",
your_page_does_not_have_any_open_graph_objects: "Your page does not have any Open Graph objects.",
open_graph: "Open Graph:",
we_have_found_twitter_cards_on_your_page: "Nice! We have found Twitter Cards on your page.",
your_page_does_not_have_any_twitter_cards: "Your page does not have any Twitter Cards.",
twitter_card: "Twitter Card:",
edit_in_backend: "Edit In Backend",
},
iconToolbar: {
success: '<svg viewBox="0 0 512 512" class="float-left"><path fill="#28a745" d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"></path></svg>',
false: ' <svg viewBox="0 0 512 512" class="tooltip-toggle float-left"><path fill="#dc3545" d="M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"></path></svg>',
warming: ' <svg viewBox="0 0 512 512" class="tooltip-toggle float-left"><path fill="#aaa" d="M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z"></path></svg>'
},
toolTipObject: {
url: 'A SEO-friendly URL should be easy-to-read, definitive, and keyword-rich so that Google can easily index your website.',
headings: 'You only use one <H1> heading for each page to strengthen your SEO.<br/>This <H1> heading should contain your main keyword.',
images: 'You should add ALT text to your images to help search engines easily index them.<br/>The reason is search engines don\'t physically see images like the way people do. Hence, ALT text plays a role in describing the image so that they show up in Google™ and other search engine\'s image results.<br/>Make sure your website images have their own specific ALT text.',
openGraph: 'Open Graph is a technology introduced by Facebook that integrates between Facebook and its user data and a website. When integrating Open Graph meta tags into your page, you can identify which elements of your page you desire to display when your page is shared.',
twitterCard: 'By using Twitter Cards, you can easily attach photo, videos, and media experience to Tweets to increase traffic to your site.',
canonicalTag: 'A canonical tag is used to prevent issues caused by duplicated content appearing on multiple URLs. On the other hand, the canonical tag lets search engines which version of URL will be included in search results.',
title: 'A perfect length of a title should be about 50-70 characters, including spaces. You need to make your title concise and contain the main keyword.',
description: 'Meta description determines how your pages are displayed in the search results. Hence, you should keep it 200-255 characters long for the best effectiveness. Also, don\'t forget to include your main keyword in the meta description and make it attractive to encourage customers to click.',
metaKeyword: 'Meta keywords are words or phrases that pertain to your site\'s content. In the past, people have tried to take advantage of this tag so now it doesn\'t affect your search rankings the way that it used to.'
},
initToolbar() {
let urlVars = getUrlVars();
let cookieName = 'bss_seo_toolbar_token';
if (typeof urlVars.token !== "undefined") {
let token = urlVars.token;
//Set to Cookie
createCookie(cookieName, token, 30);
}
//get Token from Cookie
let cookieValue = getCookie(cookieName);
let hideCookieName = 'bss_seo_toolbar_hide';
let statusHideValue = getCookie(hideCookieName);
this.statusHide = statusHideValue !== '' && statusHideValue !== null && Number(statusHideValue) === 1;
this.handleToolbarStatus();
// this.handleClickToolbar();
if (cookieValue !== '' && cookieValue !== null) {
//Show Loading
this.setData();
this.handleAjaxCheckAdmin(cookieValue);
}
},
handleToolbarStatus: function() {
let bssSeoToolbarDOM = document.querySelector('#bss_seo_toolbar');
bssSeoToolbarDOM.classList.remove('toolbar_hide', 'p-0');
if (this.statusHide) {
bssSeoToolbarDOM.classList.add('toolbar_hide', 'p-0');
}
},
handleClickToolbar: function() {
let valueCookieHide = '0';
if (!this.statusHide) {
//Save a Cookie and Hide it
valueCookieHide = '1';
this.statusHide = true;
} else {
this.statusHide = false;
}
let hideCookieName = 'bss_seo_toolbar_hide';
createCookie(hideCookieName, valueCookieHide, 30);
this.handleToolbarStatus();
let DOMToolbar = this.getDOMToolbar();
renderToolbar(DOMToolbar);
},
getDOMToolbar: function() {
let headerToolbar = this.getHeaderToolbar(),
bodyToolbar = this.getBodyToolbar();
return headerToolbar + bodyToolbar;
},
getHeaderToolbar: function() {
return '<div class="bss_toolbar_header float-left w-full"><img src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Bss_SeoToolbar/images/logo_bss.svg" alt="Logo" class="w-12 float-left" /><p class="float-left font-black text-base text-white text-center">' + this.translations.seo_toolbar + '</p><svg viewBox="0 0 448 512" @click="handleClickToolbar()" class="fill-white float-right cursor-pointer"><path d="M441.9 167.3l-19.8-19.8c-4.7-4.7-12.3-4.7-17 0L224 328.2 42.9 147.5c-4.7-4.7-12.3-4.7-17 0L6.1 167.3c-4.7 4.7-4.7 12.3 0 17l209.4 209.4c4.7 4.7 12.3 4.7 17 0l209.4-209.4c4.7-4.7 4.7-12.3 0-17z"></path></svg></div>';
},
getBodyToolbar: function() {
let firstBodyToolbar = '';
if (this.statusHide) {
firstBodyToolbar = '<div class="bss_toolbar_body hidden">';
} else {
firstBodyToolbar = '<div class="bss_toolbar_body block float-left w-full">';
}
let lastBodyToolbar = '</div>';
let urlDOM = this.getItemToolbar(
this.translations.url,
this.dataToolbar.url,
"success",
this.toolTipObject.url
);
//For Canonical Tag
let statusCanonicalTag = "success";
if (this.dataToolbar.canonicalTag === '' || this.dataToolbar.canonicalTag === null) {
statusCanonicalTag = "false";
}
let canonicalTagDOM = this.getItemToolbar(
this.translations.canonical_tag,
this.dataToolbar.canonicalTag,
statusCanonicalTag,
this.toolTipObject.canonicalTag
);
//For Meta Title
let statusMetaTitle = "false";
if (this.dataToolbar.title === '' || this.dataToolbar.title === null) {
statusMetaTitle = "false";
} else {
if (this.dataToolbar.title.length >= 50 && this.dataToolbar.title.length <= 70) {
statusMetaTitle = "success";
}
if (this.dataToolbar.title.length > 70) {
statusMetaTitle = "false"
}
if (this.dataToolbar.title.length < 50) {
statusMetaTitle = "warming";
}
}
let titleDOM = this.getItemToolbar(
this.translations.title,
this.dataToolbar.title,
statusMetaTitle,
this.toolTipObject.title
);
//For Meta Description
let statusMetaDescription = "false";
if (this.dataToolbar.metaDescription === '' || this.dataToolbar.metaDescription === null) {
statusMetaDescription = "false";
} else {
if (this.dataToolbar.metaDescription.length >= 200 && this.dataToolbar.metaDescription.length <= 255) {
statusMetaDescription = "success";
}
if (this.dataToolbar.metaDescription.length > 255) {
statusMetaDescription = "false"
}
if (this.dataToolbar.metaDescription.length >= 100 && this.dataToolbar.metaDescription.length < 200) {
statusMetaDescription = "warming";
}
}
let metaDescriptionDOM = this.getItemToolbar(
this.translations.meta_description,
this.dataToolbar.metaDescription,
statusMetaDescription,
this.toolTipObject.description
);
//For Meta Keyword
let statusMetaKeywords = "success";
if (this.dataToolbar.metaKeyword === '' || this.dataToolbar.metaKeyword === null) {
statusMetaKeywords = "warming";
}
let metaKeywordDOM = this.getItemToolbar(
this.translations.meta_keywords,
this.dataToolbar.metaKeyword,
statusMetaKeywords,
this.toolTipObject.metaKeyword
);
//For Headings Status
let headingText = 'H1 [' + this.dataToolbar.headings.h1Elements + '] - H2 [' + this.dataToolbar.headings.h2Elements + '] - H3 [' + this.dataToolbar.headings.h3Elements + '] - H4 [' + this.dataToolbar.headings.h4Elements + '] - H5 [' + this.dataToolbar.headings.h5Elements + ']';
let statusHeading = "false";
if (this.dataToolbar.headings.h1Elements === 1 && this.dataToolbar.headings.h2Elements > 0) {
statusHeading = "success";
}
if (this.dataToolbar.headings.h1Elements === 1 && this.dataToolbar.headings.h2Elements === 0) {
statusHeading = "warming";
}
let headingsDOM = this.getItemToolbar(
this.translations.headings,
headingText,
statusHeading,
this.toolTipObject.headings
);
//For Image status
let lostAltNumbmer = 0;
this.dataToolbar.imageObject.forEach(function(image) {
let alt = image.getAttribute("alt");
if (typeof alt === 'undefined' || alt === null || alt === '') {
lostAltNumbmer++;
}
});
let imageAltDOM = '';
let statusImages = "false";
if (lostAltNumbmer === 0) {
statusImages = "success";
imageAltDOM = this.getItemToolbar(
this.translations.all_images_have_alt_attribute,
'',
statusImages,
statusHeading,
this.toolTipObject.images
);
} else {
let textImageAltDOM = '';
if (lostAltNumbmer === 1) {
textImageAltDOM = lostAltNumbmer + this.translations.image_without_alt;
} else {
textImageAltDOM = lostAltNumbmer + this.translations.images_without_alt;
}
imageAltDOM = this.getItemToolbar(
textImageAltDOM,
'',
statusImages,
this.toolTipObject.images
);
}
//For Open Graph
let countOpenGraph = 0;
if (typeof this.dataToolbar.openGraph.ogTitle !== "undefined" && this.dataToolbar.openGraph.ogTitle !== '' && this.dataToolbar.openGraph.ogTitle !== null) {
countOpenGraph++;
}
if (typeof this.dataToolbar.openGraph.ogDescription !== "undefined" && this.dataToolbar.openGraph.ogDescription !== '' && this.dataToolbar.openGraph.ogDescription !== null) {
countOpenGraph++;
}
if (typeof this.dataToolbar.openGraph.ogImage !== "undefined" && this.dataToolbar.openGraph.ogImage !== '' && this.dataToolbar.openGraph.ogImage !== null) {
countOpenGraph++;
}
if (typeof this.dataToolbar.openGraph.ogUrl !== "undefined" && this.dataToolbar.openGraph.ogUrl !== '' && this.dataToolbar.openGraph.ogUrl !== null) {
countOpenGraph++;
}
if (typeof this.dataToolbar.openGraph.ogType !== "undefined" && this.dataToolbar.openGraph.ogType !== '' && this.dataToolbar.openGraph.ogType !== null) {
countOpenGraph++;
}
let textOpenGraph = '';
let statusOpenGraphRender = "false";
if (countOpenGraph > 0) {
textOpenGraph = this.translations.we_have_found_several_open_graph_objects;
statusOpenGraphRender = "success";
} else {
textOpenGraph = this.translations.your_page_does_not_have_any_open_graph_objects;
}
let openGraphDOM = this.getItemToolbar(
this.translations.open_graph,
textOpenGraph,
statusOpenGraphRender,
this.toolTipObject.openGraph
);
//For Twitter Card
let countTwitterCard = 0;
if (typeof this.dataToolbar.twitterCard.twitterSite !== "undefined" && this.dataToolbar.twitterCard.twitterSite !== '' && this.dataToolbar.twitterCard.twitterSite !== null) {
countTwitterCard++;
}
if (typeof this.dataToolbar.twitterCard.twitterTitle !== "undefined" && this.dataToolbar.twitterCard.twitterTitle !== '' && this.dataToolbar.twitterCard.twitterTitle !== null) {
countTwitterCard++;
}
if (typeof this.dataToolbar.twitterCard.twitterDescription !== "undefined" && this.dataToolbar.twitterCard.twitterDescription !== '' && this.dataToolbar.twitterCard.twitterDescription !== null) {
countTwitterCard++;
}
if (typeof this.dataToolbar.twitterCard.twitterImage !== "undefined" && this.dataToolbar.twitterCard.twitterImage !== '' && this.dataToolbar.twitterCard.twitterImage !== null) {
countTwitterCard++;
}
let textTwitterCard = '';
let statusTwitterCardRender = "false";
if (countTwitterCard > 0) {
textTwitterCard = this.translations.we_have_found_twitter_cards_on_your_page;
statusTwitterCardRender = "success";
} else {
textTwitterCard = this.translations.your_page_does_not_have_any_twitter_cards;
}
let twitterCardDOM = this.getItemToolbar(
this.translations.twitter_card,
textTwitterCard,
statusTwitterCardRender,
this.toolTipObject.twitterCard
);
let editLink = this.urlEdit;
let editBody = '';
if (editLink) {
editBody = '<div class="edit_body_toolbar float-left text-center"><a href="' + editLink + '" target="_blank">' + this.translations.edit_in_backend + '</a></div>';
}
return firstBodyToolbar + urlDOM + canonicalTagDOM + titleDOM + metaDescriptionDOM + metaKeywordDOM + headingsDOM + imageAltDOM + openGraphDOM + twitterCardDOM + editBody + lastBodyToolbar;
},
getItemToolbar: function(title, value, status, toolTip) {
let icon = '';
let self = this;
switch (status) {
case 'success':
icon = self.iconToolbar.success;
break;
case 'false':
icon = self.iconToolbar.false;
break;
case 'warming':
icon = self.iconToolbar.warming;
break;
}
return '<div class="bss_toolbar_item tooltip-toggle relative whitespace-pre-line border-b float-left">' + icon + '<div class="toolbar_content float-right"> <strong>' + title + '</strong> ' + value + ' </div><span class="tooltip-content invisible text-white text-left p-2.5 absolute z-10 mr-0 opacity-0">'+toolTip+'</span> </div>';
},
setData: function() {
this.dataToolbar.url = window.location.href;
let canonicalTag = document.querySelector('link[rel=canonical]') ?
document.querySelector('link[rel=canonical]').getAttribute("href") : undefined;
if (typeof canonicalTag !== "undefined") {
this.dataToolbar.canonicalTag = canonicalTag;
}
let title = document.title;
if (typeof title !== "undefined") {
this.dataToolbar.title = title;
}
let metaTitle = document.querySelector('meta[name=title]') ?
document.querySelector('meta[name=title]').getAttribute("content") : undefined;
if (typeof metaTitle !== "undefined") {
this.dataToolbar.metaTitle = metaTitle;
}
let metaDescription = document.querySelector('meta[name=description]') ?
document.querySelector('meta[name=description]').getAttribute("content") : undefined;
if (typeof metaDescription !== "undefined") {
this.dataToolbar.metaDescription = metaDescription;
}
let metaKeyword = document.querySelector('meta[name=keywords]') ?
document.querySelector('meta[name=keywords]').getAttribute("content") : undefined;
if (typeof metaKeyword !== "undefined") {
this.dataToolbar.metaKeyword = metaKeyword;
}
this.dataToolbar.headings.h1Elements = document.querySelectorAll('h1').length;
this.dataToolbar.headings.h2Elements = document.querySelectorAll('h2').length;
this.dataToolbar.headings.h3Elements = document.querySelectorAll('h3').length;
this.dataToolbar.headings.h4Elements = document.querySelectorAll('h4').length;
this.dataToolbar.headings.h5Elements = document.querySelectorAll('h5').length;
this.dataToolbar.imageObject = document.querySelectorAll('img');
this.dataToolbar.openGraph.ogTitle = document.querySelector('meta[property="og:title"]') ?
document.querySelector('meta[property="og:title"]').getAttribute("content") : '';
this.dataToolbar.openGraph.ogImage = document.querySelector('meta[property="og:image"]') ?
document.querySelector('meta[property="og:image"]').getAttribute("content") : '';
this.dataToolbar.openGraph.ogDescription = document.querySelector('meta[property="og:description"]') ?
document.querySelector('meta[property="og:description"]').getAttribute("content") : '';
this.dataToolbar.openGraph.ogUrl = document.querySelector('meta[property="og:url"]') ?
document.querySelector('meta[property="og:url"]').getAttribute("content") : '';
this.dataToolbar.openGraph.ogType = document.querySelector('meta[property="og:type"]') ?
document.querySelector('meta[property="og:type"]').getAttribute("content") : '';
this.dataToolbar.twitterCard.twitterSite = document.querySelector('meta[name="twitter:site"]') ?
document.querySelector('meta[name="twitter:site"]').getAttribute("content") : '';
this.dataToolbar.twitterCard.twitterTitle = document.querySelector('meta[name="twitter:title"]') ?
document.querySelector('meta[name="twitter:title"]').getAttribute("content") : '';
this.dataToolbar.twitterCard.twitterDescription = document.querySelector('meta[name="twitter:description"]') ?
document.querySelector('meta[name="twitter:description"]').getAttribute("content") : '';
this.dataToolbar.twitterCard.twitterImage = document.querySelector('meta[name="twitter:image"]') ?
document.querySelector('meta[name="twitter:image"]').getAttribute("content") : '';
},
handleAjaxCheckAdmin: function (token) {
let ajaxUrl = 'https://www.avril-beaute.fr/seo_toolbar/index/checktoken/';
let self = this;
fetch(ajaxUrl, {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body": `form_key=${hyva.getFormKey()}&isAjax=true&token=${token}&entity_id=216&entity_type=category`,
"method": "POST",
"mode": "cors",
"credentials": "include"
}).then(response => {
if (response.redirected) {
window.location.href = response.url;
} else if (response.ok) {
return response.json();
} else {
window.dispatchMessages && window.dispatchMessages([{
type: 'warning',
text: 'Could\u0020not\u0020get\u0020toolbar.'
}]);
}
}).then(result => {
if (!result.status) {
window.dispatchMessages && window.dispatchMessages([{
type: 'error',
text: result.message
}]);
} else {
self.urlEdit = result.data.backend_url;
let DOMToolbar = self.getDOMToolbar();
renderToolbar(DOMToolbar);
}
});
},
}
}
</script>
<div id="bss_seo_toolbar" x-data="initBssSeoToolbar()" x-init="initToolbar()" class="hidden h-auto fixed z-50 bg-white rounded-lg"></div>
<style>
#bss_seo_toolbar {
width: 500px;
bottom: 15px;
right: 15px;
-webkit-box-shadow: 0 7px 8px -4px rgba(0,0,0,.2), 0 13px 19px 2px rgba(0,0,0,.14), 0 5px 24px 4px rgba(0,0,0,.12);
box-shadow: 0 7px 8px -4px rgba(0,0,0,.2), 0 13px 19px 2px rgba(0,0,0,.14), 0 5px 24px 4px rgba(0,0,0,.12);
}
#bss_seo_toolbar.toolbar_hide .bss_toolbar_header {
height: 20px;
border-radius: 8px;
display: inline-table;
padding: 5px 10px;
}
#bss_seo_toolbar .bss_toolbar_header {
padding: 15px;
background: rgb(242 133 42);
border-radius: 8px 8px 0 0;
}
#bss_seo_toolbar .bss_toolbar_header img {
margin: 3px 0 0 0;
}
#bss_seo_toolbar .bss_toolbar_header p {
width: calc(100% - 100px);
margin: 7px 0 0 0;
font-weight: 700;
}
#bss_seo_toolbar .bss_toolbar_header svg {
width: 18px;
height: 18px;
margin: 10px 0 0 0;
fill: white;
float: right;
}
#bss_seo_toolbar .bss_toolbar_header svg path {
stroke: #ffffff;
stroke-width: 30px;
}
#bss_seo_toolbar .bss_toolbar_item {
width: calc(100% - 30px);
padding: 10px 0 10px 0;
margin: 0 15px 0 15px;
-ms-word-break: break-all;
word-break: break-word;
word-wrap: break-word;
-webkit-hyphens: auto;
-moz-hyphens: auto;
border-bottom: 1px rgb(240 240 240) solid;
hyphens: auto;
}
#bss_seo_toolbar .bss_toolbar_item svg {
width: 16px;
height: 16px;
margin: 4px 15px 0 0;
}
#bss_seo_toolbar.toolbar_hide .bss_toolbar_header svg {
transform: rotate(180deg);
margin: 10px 5px 0 0;
}
#bss_seo_toolbar .bss_toolbar_item .toolbar_content {
width: calc(100% - 35px);
}
#bss_seo_toolbar .bss_toolbar_item .tooltip-content {
width: 400px;
background-color: rgb(85 85 85);
border-radius: 6px;
bottom: calc(100% - 40px);
right: calc(100% + 15px);
transition: opacity .3s;
}
#bss_seo_toolbar .bss_toolbar_item .tooltip-content::after {
content: "";
position: absolute;
top: calc(100% - 30px);
left: calc(100% + 5px);
margin-left: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent transparent #555;
}
#bss_seo_toolbar .edit_body_toolbar {
width: calc(100% - 30px);
padding: 10px 0 15px 0;
margin: 0 15px 0 15px;
}
#bss_seo_toolbar.toolbar_hide {
width: 260px;
opacity: 0.6;
}
@media only screen and (max-width: 768px) {
#bss_seo_toolbar {
width: calc(100% - 30px);
height: calc(100% - 30px);
}
#bss_seo_toolbar .bss_toolbar_body {
height: -webkit-fill-available;
overflow: scroll;
position: absolute;
margin-top: 65px;
}
}
</style>
<script>
function primaryMenu()
{
const animation_time = 0.7;
const display_overlay = 0;
const nav = document.querySelector('.horizontal-menu');
const stickyHeaderTop = nav.offsetTop;
const windowWidth = window.innerWidth;
const $stickyMenu = document.querySelector('.horizontal-menu .stickymenu');
const $horizontalMenu = document.querySelector('.section-item-content .menu-container.horizontal-menu');
const $stickyAlias = document.querySelector('.stickyalias');
const $dropdowns = document.querySelectorAll('.section-item-content .menu-container.horizontal-menu .menu div > ul li.dropdown');
const $subdropdowns = document.querySelectorAll('.section-item-content .menu-container.horizontal-menu .menu div > ul li.product-menu > ul li.category-item');
const displayOverlay = 0;
return {
init() {
window.addEventListener('scroll', () => {
if (windowWidth >= 768) {
if ($stickyMenu) {
if (window.pageYOffset > stickyHeaderTop) {
if ($stickyMenu.classList.contains('vertical-right')) {
const outerWidth = document.querySelector('.section-items.nav-sections-items').offsetWidth;
const innerWidth = $horizontalMenu.offsetWidth;
const rightMargin = ((outerWidth - innerWidth) / 2) + 'px';
$stickyMenu.style.position = 'fixed';
$stickyMenu.style.top = '0px';
$stickyMenu.style.right = rightMargin;
} else {
$stickyMenu.style.position = 'fixed';
$stickyMenu.style.top = '0px';
}
// $stickyAlias.style.display = 'block';
} else {
$stickyMenu.style.position = 'static';
$stickyMenu.style.top = '0px';
// $stickyAlias.style.display = 'none';
}
}
}
});
$dropdowns.forEach(dropdown => {
if (!dropdown.querySelector('.plus')) {
const plusSpan = document.createElement('span');
plusSpan.className = 'plus';
dropdown.querySelector('a').insertAdjacentElement('afterend', plusSpan);
plusSpan.addEventListener('click', function() {
dropdown.classList.toggle('active');
const ulSibling = dropdown.querySelector('ul');
if (ulSibling) {
ulSibling.style.display = (ulSibling.style.display === 'block' ? 'none' : 'block');
}
});
}
});
$subdropdowns.forEach(subdropdown => {
if (!subdropdown.querySelector('.plus')) {
const plusSpan = document.createElement('span');
plusSpan.className = 'plus';
subdropdown.querySelector('a').insertAdjacentElement('afterend', plusSpan);
plusSpan.addEventListener('click', function() {
subdropdown.classList.toggle('active');
const ulSibling = subdropdown.querySelector('ul');
if (ulSibling) {
ulSibling.style.display = (ulSibling.style.display === 'block' ? 'none' : 'block');
}
});
}
});
if (displayOverlay) {
const $menuItems = document.querySelectorAll('.horizontal-menu ul li');
$menuItems.forEach(menuItem => {
menuItem.addEventListener('mouseover', () => {
document.body.classList.add('md-overlay-bg');
});
menuItem.addEventListener('mouseout', () => {
document.body.classList.remove('md-overlay-bg');
});
});
}
},
}
}
function amazonMenu()
{
const $mdAmazonMenu = document.querySelector('.md-amazon-menu');
const $mdAmazonMenuUl = $mdAmazonMenu.querySelector('ul');
const $mdAmazonMenuFirstUl = $mdAmazonMenuUl.firstElementChild;
const $mdMenuBackBtn = document.querySelectorAll('.md-menu-back-btn');
const $mdMenuCloseBtn = document.querySelector('.md-menu-close-btn');
const $mdAmazonMenuCloseBtn = document.querySelector('.amazon-menu-close-btn');
return {
init() {
// Select elements
var mdAmazonMenu = document.querySelector('.md-amazon-menu');
var mdAmazonMenuUl = mdAmazonMenu.querySelectorAll('ul');
var mdAmazonMenuFirstUl = mdAmazonMenuUl[0];
var mdMenuCloseBtn = document.querySelector('.md-menu-close-btn');
// Helper function to add/remove classes
function addClass(el, className) {
el.classList.add(className);
}
function removeClass(el, className) {
el.classList.remove(className);
}
function hasClass(el, className) {
return el.classList.contains(className);
}
function toggleClass(el, className) {
el.classList.toggle(className);
}
// Handle parent click to show child menu
document.querySelectorAll('.md-amazon-parent > span').forEach(function (link) {
link.addEventListener('click', function (e) {
var currentItem = this.parentElement; // Current clicked parent <li>
var parentMenu = currentItem.closest('ul'); // Parent <ul>
var childMenu = currentItem.querySelector('ul'); // Child <ul>
if (childMenu) {
e.preventDefault(); // Prevent default link behavior
// Stop propagation to prevent conflicts
e.stopPropagation();
// Remove visibility and active classes from the parent menu
removeClass(parentMenu, 'hmenu-visible');
removeClass(parentMenu, 'md-translateX');
addClass(parentMenu, 'md-translateX-left');
addClass(parentMenu, 'active')
// Add visibility and active classes to the child menu
addClass(childMenu, 'hmenu-visible');
addClass(childMenu, 'md-translateX');
removeClass(childMenu, 'md-translateX-right');
}
});
});
// Prevent click propagation on child menus
document.querySelectorAll('.md-amazon-parent > ul').forEach(function (menu) {
menu.addEventListener('click', function (e) {
e.stopPropagation(); // Stop click propagation on child menus
});
});
// Close button functionality
if (mdMenuCloseBtn) {
mdMenuCloseBtn.addEventListener('click', function () {
document.documentElement.classList.remove('amz-nav-open');
mdAmazonMenuUl.forEach(function (menu) {
removeClass(menu, 'hmenu-visible');
removeClass(menu, 'md-translateX');
removeClass(menu, 'md-translateX-left');
removeClass(menu, 'md-translateX-right');
});
});
}
// Handle navigation reset
document.querySelectorAll('.amazon-menu-btn > a').forEach(function (button) {
button.addEventListener('click', function (e) {
e.preventDefault();
// removeClass(document.getElementsByClassName('.amazon-menu-btn'),'hidden')
// Reset all menus to initial state
document.documentElement.classList.add('amazon-nav-open', 'amz-nav-open');
mdAmazonMenuUl.forEach(function (menu) {
removeClass(menu, 'hmenu-visible');
removeClass(menu, 'md-translateX');
removeClass(menu, 'md-translateX-left');
removeClass(menu, 'md-translateX-right');
});
addClass(mdAmazonMenuFirstUl, 'hmenu-visible');
});
});
// Back button functionality
document.querySelectorAll('.md-menu-back-btn').forEach(function (button) {
button.addEventListener('click', function (e) {
var currentItem = this.parentElement; // Current clicked parent <li>
var parentMenu = currentItem.closest('ul'); // Parent <ul>
removeClass(parentMenu, 'hmenu-visible');
removeClass(parentMenu, 'md-translateX');
addClass(parentMenu, 'md-translateX-left');
var grandParentMenu = parentMenu.parentElement.closest('ul');
if (grandParentMenu) {
addClass(grandParentMenu, 'hmenu-visible');
addClass(grandParentMenu, 'md-translateX');
removeClass(grandParentMenu, 'md-translateX-left');
removeClass(grandParentMenu, 'active');
}
});
});
}
}
}
function burgerMenu()
{
const mdMegamenuBurger = document.querySelector('#md-megamenu-burger');
const html = document.querySelector('html');
const horizontalMenuUlLi = document.querySelectorAll('.horizontal-menu ul li');
const burger_status = "";
const display_overlay = 0;
return {
menu: {"responsive":true, "expanded":true, "position":{"my":"left top","at":"left bottom"}},
init() {
mdMegamenuBurger.style.display = 'block';
html.classList.toggle('md-burger-menu', burger_status);
if (display_overlay) {
horizontalMenuUlLi.forEach(item => {
item.addEventListener('mouseover', () => {
document.body.classList.add('md-overlay-bg');
});
item.addEventListener('mouseout', () => {
document.body.classList.remove('md-overlay-bg');
});
});
}
}
}
}
</script>
<script>
(function () {
'use strict';
window.AvrilWishlist = window.AvrilWishlist || {};
window.AvrilWishlist.urls = {"fetch":"https:\/\/www.avril-beaute.fr\/wishlist\/ajax\/getitems\/","add":"https:\/\/www.avril-beaute.fr\/wishlist\/index\/add\/","remove":"https:\/\/www.avril-beaute.fr\/wishlist\/index\/remove\/","login":"https:\/\/www.avril-beaute.fr\/customer\/account\/login\/"};
window.AvrilWishlist.messages = Object.assign(
{"added":"Le produit a \u00e9t\u00e9 ajout\u00e9 \u00e0 votre liste d'achats.","removed":"Le produit a bien \u00e9t\u00e9 retir\u00e9 de votre liste d'achats.","error":"Une erreur s'est produite. Veuillez r\u00e9essayez s\u2019il vous pla\u00eet.","login":"Vous devez vous connecter pour ajouter des produits \u00e0 votre liste d'achats."},
window.AvrilWishlist.messages || {}
);
if (window.AvrilWishlistClient) {
return;
}
function encodeUenc(url) {
try {
var bytes = new TextEncoder().encode(url);
var bin = '';
for (var i = 0; i < bytes.length; i++) { bin += String.fromCharCode(bytes[i]); }
return window.btoa(bin).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '~');
} catch (e) { return ''; }
}
function getFormKey() {
var input = document.querySelector('input[name="form_key"]');
if (input && input.value) { return input.value; }
var match = document.cookie.match(/(?:^|;\s*)form_key=([^;]+)/);
return match ? decodeURIComponent(match[1]) : '';
}
var state = {
byProduct: {}, // productId -> wishlistItemId
skus: {}, // wishlistItemId -> sku
requiresLogin: false,
loginUrl: '',
loaded: false,
inflight: null
};
function emit(name, detail) {
window.dispatchEvent(new CustomEvent('avril-wishlist:' + name, { detail: detail }));
}
function snapshot() {
return {
byProduct: Object.assign({}, state.byProduct),
skus: Object.assign({}, state.skus),
requiresLogin: state.requiresLogin,
loginUrl: state.loginUrl
};
}
function fetchItems(force) {
if (state.loaded && !force) {
return Promise.resolve(snapshot());
}
if (state.inflight) {
return state.inflight;
}
state.inflight = fetch(window.AvrilWishlist.urls.fetch, {
method: 'GET',
credentials: 'include',
headers: { 'X-Requested-With': 'XMLHttpRequest', 'Accept': 'application/json' }
})
.then(function (r) { return r.json(); })
.then(function (response) {
state.byProduct = {};
state.skus = {};
if (response.byProduct) {
Object.keys(response.byProduct).forEach(function (pid) {
state.byProduct[String(pid)] = String(response.byProduct[pid]);
});
}
if (response.result) {
Object.keys(response.result).forEach(function (itemId) {
state.skus[String(itemId)] = String(response.result[itemId]);
});
}
state.requiresLogin = !!response.requiresLogin;
state.loginUrl = response.loginUrl || window.AvrilWishlist.urls.login;
state.loaded = true;
state.inflight = null;
emit('loaded', snapshot());
if (!state.requiresLogin) {
try {
var pendingAddRaw = window.sessionStorage.getItem('avril-wishlist:pending-add');
if (pendingAddRaw) {
window.sessionStorage.removeItem('avril-wishlist:pending-add');
var pa = JSON.parse(pendingAddRaw);
add(String(pa.productId), { sku: pa.sku }).then(function () {
var msgs = window.AvrilWishlist.messages;
if (typeof window.dispatchMessages === 'function') {
window.dispatchMessages([{ type: 'success', text: msgs.added }], 5000);
}
});
}
} catch (epa) { /* noop */ }
}
return snapshot();
})
.catch(function (err) {
state.inflight = null;
throw err;
});
return state.inflight;
}
function post(url, body) {
return fetch(url, {
method: 'POST',
credentials: 'include',
headers: {
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
},
body: body
}).then(function (response) {
if (!response.ok && !response.redirected && response.status !== 0) {
throw new Error('HTTP ' + response.status);
}
return response;
});
}
function add(productId, opts) {
opts = opts || {};
productId = String(productId);
var sku = opts.sku || ('pid:' + productId);
if (state.requiresLogin) {
try {
window.sessionStorage.setItem('avril-wishlist:pending-add', JSON.stringify({ productId: productId, sku: sku }));
} catch (epa) { /* noop */ }
emit('requires-login', { loginUrl: state.loginUrl });
return Promise.reject(new Error('requires-login'));
}
var optimisticId = '__optimistic_' + productId;
state.byProduct[productId] = optimisticId;
state.skus[optimisticId] = sku;
emit('changed', snapshot());
var body = 'form_key=' + encodeURIComponent(getFormKey())
+ '&product=' + encodeURIComponent(productId)
+ '&uenc=' + encodeURIComponent(encodeUenc(window.location.href));
return post(window.AvrilWishlist.urls.add, body)
.then(function () {
window.dispatchEvent(new CustomEvent('reload-customer-section-data'));
return fetchItems(true);
})
.catch(function (err) {
delete state.byProduct[productId];
delete state.skus[optimisticId];
emit('changed', snapshot());
throw err;
});
}
function remove(itemId, opts) {
opts = opts || {};
itemId = String(itemId);
var productId = null;
Object.keys(state.byProduct).forEach(function (pid) {
if (state.byProduct[pid] === itemId) { productId = pid; }
});
var prevSku = state.skus[itemId];
if (productId) { delete state.byProduct[productId]; }
delete state.skus[itemId];
emit('changed', snapshot());
var body = 'form_key=' + encodeURIComponent(getFormKey())
+ '&item=' + encodeURIComponent(itemId)
+ '&uenc=' + encodeURIComponent(encodeUenc(window.location.href));
return post(window.AvrilWishlist.urls.remove, body)
.then(function () {
window.dispatchEvent(new CustomEvent('reload-customer-section-data'));
return fetchItems(true);
})
.catch(function (err) {
if (productId) { state.byProduct[productId] = itemId; }
if (prevSku) { state.skus[itemId] = prevSku; }
emit('changed', snapshot());
throw err;
});
}
try {
var pending = window.sessionStorage.getItem('avril-wishlist:pending-message');
if (pending) {
window.sessionStorage.removeItem('avril-wishlist:pending-message');
var parsed = JSON.parse(pending);
var show = function () {
if (typeof window.dispatchMessages === 'function') {
window.dispatchMessages([{ type: parsed.type || 'warning', text: parsed.text }], 5000);
} else {
window.dispatchEvent(new CustomEvent('avril-wishlist:flash', { detail: parsed }));
}
};
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', show);
} else {
show();
}
}
} catch (e) { /* noop */ }
window.AvrilWishlistClient = {
fetchItems: fetchItems,
add: add,
remove: remove,
getState: snapshot,
isLoaded: function () { return state.loaded; },
hasProduct: function (productId) {
return Object.prototype.hasOwnProperty.call(state.byProduct, String(productId));
},
getItemIdForProduct: function (productId) {
return state.byProduct[String(productId)] || null;
}
};
// --- Base/B2B theme: click handling + state sync (no-op on Hyva — buttons lack data-action) ---
var toastTimer = null;
function showToast(message, type) {
var existing = document.getElementById('avril-wishlist-toast');
if (existing) { existing.remove(); }
var toast = document.createElement('div');
toast.id = 'avril-wishlist-toast';
toast.className = 'avril-wishlist-toast avril-wishlist-toast--' + (type || 'success');
toast.textContent = message;
document.body.appendChild(toast);
requestAnimationFrame(function () { toast.classList.add('is-visible'); });
if (toastTimer) { clearTimeout(toastTimer); }
toastTimer = setTimeout(function () {
toast.classList.remove('is-visible');
setTimeout(function () { if (toast.parentNode) { toast.remove(); } }, 300);
}, 3000);
}
function applyState(s) {
var containers = document.querySelectorAll('[data-role="add-to-links"][class*="product-id-"]');
for (var i = 0; i < containers.length; i++) {
var container = containers[i];
var match = container.className.match(/product-id-(\d+)/);
if (!match) { continue; }
var productId = match[1];
var inWishlist = Object.prototype.hasOwnProperty.call(s.byProduct, productId);
container.classList.toggle('in_wishlist', inWishlist);
container.classList.toggle('not_wishlist', !inWishlist);
var link = container.querySelector('[data-action="add-to-wishlist"]');
if (!link) { continue; }
link.classList.toggle('in_wishlist', inWishlist);
if (inWishlist) {
link.setAttribute('data-wishlist-item-id', s.byProduct[productId]);
} else {
link.removeAttribute('data-wishlist-item-id');
}
}
}
var pendingProducts = {};
document.addEventListener('click', function (e) {
var el = e.target.closest && e.target.closest('[data-action="add-to-wishlist"]');
if (!el) { return; }
var container = el.closest('[data-role="add-to-links"]');
var productId = el.getAttribute('data-product-id')
|| (container && (container.className.match(/product-id-(\d+)/) || [])[1]);
if (!productId) { return; }
e.preventDefault();
e.stopImmediatePropagation();
if (pendingProducts[productId]) { return; }
var msgs = window.AvrilWishlist.messages;
var isAdd = window.AvrilWishlistClient.isLoaded()
? !window.AvrilWishlistClient.hasProduct(productId)
: (!el.classList.contains('in_wishlist') && !(container && container.classList.contains('in_wishlist')));
var itemId = window.AvrilWishlistClient.getItemIdForProduct(productId)
|| el.getAttribute('data-wishlist-item-id');
if (!isAdd && !itemId) { return; }
var clientState = window.AvrilWishlistClient.getState();
if (isAdd && clientState.requiresLogin) {
try {
window.sessionStorage.setItem('avril-wishlist:pending-add', JSON.stringify({ productId: productId }));
} catch (ex) { /* noop */ }
window.location.href = clientState.loginUrl;
return;
}
pendingProducts[productId] = true;
var promise = isAdd
? window.AvrilWishlistClient.add(productId)
: window.AvrilWishlistClient.remove(itemId);
showToast(isAdd ? msgs.added : msgs.removed, 'success');
promise.catch(function (err) {
if (err && err.message === 'requires-login') {
try {
window.sessionStorage.setItem(
'avril-wishlist:pending-message',
JSON.stringify({ type: 'warning', text: msgs.login })
);
} catch (ex) { /* noop */ }
window.location.href = window.AvrilWishlistClient.getState().loginUrl;
return;
}
showToast(msgs.error, 'error');
}).finally(function () {
delete pendingProducts[productId];
});
}, true);
window.addEventListener('avril-wishlist:loaded', function (e) { applyState(e.detail); });
window.addEventListener('avril-wishlist:changed', function (e) { applyState(e.detail); });
var initDone = false;
function initState() {
if (initDone) { return; }
initDone = true;
window.AvrilWishlistClient.fetchItems().then(applyState);
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initState);
} else {
initState();
}
})();
</script>
<script>try {
smileTracker.addPageVar('type.identifier', 'catalog_category_view');
smileTracker.addPageVar('type.label', 'Catalog Category');
smileTracker.addPageVar('locale', 'fr_FR');
} catch (err) { ; }</script><script>try {
smileTracker.addPageVar('category.id', '216');
smileTracker.addPageVar('category.label', 'Cadeaux');
smileTracker.addPageVar('category.path', '1/2/215/216');
smileTracker.addPageVar('category.breadcrumb', 'Cadeaux ');
smileTracker.addPageVar('product_list.page_count', '2');
smileTracker.addPageVar('product_list.product_count', '39');
smileTracker.addPageVar('product_list.current_page', '1');
smileTracker.addPageVar('product_list.sort_order', 'position');
smileTracker.addPageVar('product_list.sort_direction', 'asc');
smileTracker.addPageVar('product_list.display_mode', 'grid');
} catch (err) { ; }</script>
<script>
let SnapSlider = class {
constructor(el, {
labelSepparator = 'sur',
autoPager,
groupPager,
loop,
forcePager
} = {}) {
this.el = el;
this.track = this.el.querySelector("[data-track]");
if (!this.track) {
console.warn(
"No Slider track defined, reverting back to CSS slider.\nPlease create a wrapper for your slides with the attribute data-track",
this.el
);
return;
}
this.initialLoad = true;
this.slides = [];
this.inViewObserver;
this.mutationObserver;
this.resizeObserver;
this.pager = this.el.querySelector("[data-pager]");
this.navBtns = Array.from(
this.el.querySelectorAll("[data-next], [data-prev]")
);
this.slideLabelSepparator = this.el.dataset.slideLabelSepparator || labelSepparator;
this.useAutoPager = autoPager || this.el.hasAttribute("data-auto-pager") || false;
this.useGroupPager = groupPager || this.el.hasAttribute("data-group-pager") || false;
this.useLoop = loop || this.el.hasAttribute("data-loop") || false;
this.forcePager = forcePager || this.el.hasAttribute("data-force-pager") || false;
this.sliderLabel = this.el.hasAttribute("aria-label") && this.el.getAttribute("aria-label").toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "");
this.sliderId = this.el.id || this.sliderLabel || "slider";
this.markerIdName = "data-target-id";
this.pagerClasses = this.el.dataset.pagerClass || "snap-pager";
this.markerClasses = this.el.dataset.markerClass || "snap-marker";
this.init();
}
init() {
this.setupSlides();
this.setupNav();
if (this.useAutoPager) {
this.createPager();
} else {
this.setupPager();
}
this.setupObservers();
this.setupMutationObserver();
this.setupResizeObserver();
this.el.addEventListener("click", this.eventHandler.bind(this));
this.el.addEventListener("keydown", this.eventHandler.bind(this));
if ("onscrollend" in window) {
this.track.addEventListener("scrollend", () => {
this.isNavigating = false;
});
} else {
this.track.addEventListener("scroll", () => {
clearTimeout(this.scrollEndTimer);
this.scrollEndTimer = setTimeout(() => {
this.isNavigating = false;
}, 100);
});
}
}
destroy() {
this.inViewObserver?.disconnect();
this.mutationObserver?.disconnect();
this.resizeObserver?.disconnect();
this.el.removeEventListener("click", this.eventHandler.bind(this));
this.el.removeEventListener("keydown", this.eventHandler.bind(this));
}
roundUpIfGreaterThan(number, min = 8) {
const decimalPart = number - Math.floor(number);
return decimalPart >= min ? Math.ceil(number) : Math.floor(number);
}
getInViewItems() {
const inViewSlides = Array.from(this.track.querySelectorAll("[data-in-view]")).filter((el) => this.slides.includes(el));
const firstInViewSlide = inViewSlides[0] || null;
const lastInViewSlide = inViewSlides[inViewSlides.length - 1] || null;
const isAtStart = firstInViewSlide === this.slides[0];
const isAtEnd = lastInViewSlide === this.slides[this.slides.length - 1];
return {
inViewSlides,
totalInViewSlides: inViewSlides.length,
firstInViewSlide,
lastInViewSlide,
isAtStart,
isAtEnd,
hasNoOverflow: isAtStart && isAtEnd
};
}
groupPagerMarkers() {
if (this.slides.length === 0 || !this.pager || !this.useGroupPager) return;
const totalVisibleSlides = this.roundUpIfGreaterThan(
this.track.offsetWidth / this.slides[0].offsetWidth
);
const markers = Array.from(this.pager.querySelectorAll("a, button"));
markers.forEach((marker, index) => {
marker.style.display = index % totalVisibleSlides === 0 ? null : "none";
});
}
handleInView(entries) {
entries.forEach((entry) => {
const marker = this.pager && (this.pager.querySelector(`[href="#${entry.target.id}"]`) || this.pager.querySelector(
`[${this.markerIdName}="${entry.target.id}"]`
));
entry.target.toggleAttribute("data-in-view", entry.isIntersecting);
entry.target.toggleAttribute("inert", !entry.isIntersecting);
marker?.setAttribute("aria-current", entry.isIntersecting);
marker?.setAttribute("tabindex", entry.isIntersecting ? "0" : "-1");
});
const { isAtStart, isAtEnd, hasNoOverflow } = this.getInViewItems();
this.navBtns.forEach((btn) => {
if (btn.hasAttribute("data-next")) {
btn.style.visibility = hasNoOverflow ? "hidden" : null;
isAtEnd && !this.useLoop ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled");
}
if (btn.hasAttribute("data-prev")) {
btn.style.visibility = hasNoOverflow ? "hidden" : null;
isAtStart && !this.useLoop ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled");
}
});
if (this.pager) {
const hidePager = hasNoOverflow && !this.forcePager;
this.pager.style.visibility = hidePager ? "hidden" : null;
this.pager.toggleAttribute("inert", hidePager);
}
if (!this.initialLoad) {
this.el.dispatchEvent(
new CustomEvent("slideChange", {
detail: this.getInViewItems()
})
);
} else {
this.initialLoad = false;
}
if (document.activeElement.parentElement.hasAttribute("data-pager")) {
const activeItems = this.pager.querySelectorAll('[tabindex="0"]');
if (activeItems.length) {
activeItems[0].focus({ preventScroll: true });
}
}
}
getSlides() {
if (!this.track) return [];
return Array.from(this.track.children).filter(
(child) => child.tagName.toLowerCase() !== "template" && child.tagName.toLowerCase() !== "style" && child.tagName.toLowerCase() !== "script" && child.style.display !== "none"
);
}
refreshSlides() {
this.initialLoad = true;
this.slides = this.getSlides();
this.setupSlides();
if (this.useAutoPager) {
this.createPager();
} else {
this.setupPager();
}
this.groupPagerMarkers();
this.setupObservers();
}
setupSlides() {
this.slides = this.getSlides();
this.slides.forEach((slide, index) => {
const totalSlides = this.slides.length;
const currentSlide = index + 1;
const existingLabel = slide.getAttribute("aria-label") || "";
const isImage = slide.tagName.toLowerCase() === "img" || slide.tagName.toLowerCase() === "picture";
const slideLabelTag = isImage ? "alt" : "aria-label";
const hasAutoLabel = existingLabel.startsWith(
`${currentSlide} ${this.slideLabelSepparator} `
);
if (!slide.hasAttribute("id")) {
slide.setAttribute(
"id",
`${this.sliderId}-item-${currentSlide}`
);
}
if (!slide.hasAttribute(slideLabelTag) || slide.getAttribute(slideLabelTag) === "" || hasAutoLabel) {
slide.setAttribute(
slideLabelTag,
`${currentSlide} ${this.slideLabelSepparator} ${totalSlides}`
);
}
if (slide.tagName.toLowerCase() === "div" && !slide.hasAttribute("role")) {
slide.setAttribute("role", "group");
}
if (this.pager && !isImage) {
slide.setAttribute("role", "tabpanel");
}
if (slide.getAttribute("role") === "group") {
slide.setAttribute("aria-roledescription", "item");
}
});
if (!this.el.hasAttribute("role") && this.el.tagName !== "SECTION") {
this.el.setAttribute("role", "region");
}
if (!this.el.hasAttribute("aria-roledescription")) {
this.el.setAttribute("aria-roledescription", "carousel");
}
if (!this.track.hasAttribute("tabindex")) {
this.track.setAttribute("tabindex", 0);
}
this.track.setAttribute("aria-live", "polite");
}
setupNav() {
this.navBtns.forEach((btn) => {
btn.setAttribute("disabled", "");
btn.removeAttribute("hidden");
btn.classList.remove("invisible");
btn.style.visibility = null;
});
}
createPager() {
const newPager = document.createElement("nav");
newPager.setAttribute("data-pager", "");
newPager.setAttribute("role", "tablist");
newPager.classList.add(...this.pagerClasses.split(" "));
this.slides.forEach((slide, index) => {
const marker = document.createElement("button");
const slideId = slide.id || `${this.sliderId}-item-${index + 1}`;
marker.setAttribute(this.markerIdName, slideId);
marker.classList.add(...this.markerClasses.split(" "));
this.setupPagerMarker(marker, index);
newPager.appendChild(marker);
if (slide.tagName.toLowerCase() !== "img" && slide.tagName.toLowerCase() !== "picture") {
slide.removeAttribute("aria-roledescription");
slide.setAttribute("role", "tabpanel");
}
});
if (this.pager) {
this.pager.setAttribute("role", "tablist");
this.pager.replaceChildren(...newPager.children);
} else {
this.track.after(newPager);
this.pager = this.el.querySelector("[data-pager]");
}
}
setupPager() {
if (!this.pager) return;
this.pager.setAttribute("role", "tablist");
const items = Array.from(this.pager.querySelectorAll("a, button"));
items.forEach((marker, index) => this.setupPagerMarker(marker, index));
}
setupPagerMarker(marker, index) {
const markerId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName);
const slideId = markerId || `${this.sliderId}-item-${index + 1}`;
if (!markerId) {
marker.setAttribute(this.markerIdName, slideId);
}
marker.setAttribute("role", "tab");
marker.setAttribute("aria-controls", slideId);
marker.setAttribute("aria-posinset", index + 1);
marker.setAttribute("aria-setsize", this.slides.length);
marker.setAttribute("tabindex", "-1");
if (!marker.hasAttribute("aria-label")) {
marker.setAttribute("aria-label", `Slide ${index + 1}`);
}
}
setupObservers() {
if (this.inViewObserver) {
this.inViewObserver.disconnect();
}
this.inViewObserver = new IntersectionObserver(
this.handleInView.bind(this), {
root: this.track,
threshold: 0.8
}
);
this.slides.forEach((slide) => this.inViewObserver.observe(slide));
}
setupMutationObserver() {
this.mutationObserver = new MutationObserver((mutations) => {
if (mutations.some((m) => m.type === "childList" || m.target.parentElement === this.track)) {
this.refreshSlides();
}
});
this.mutationObserver.observe(this.track, {
childList: true,
subtree: true,
attributeFilter: ["style"]
});
}
setupResizeObserver() {
this.resizeObserver = new ResizeObserver(
this.groupPagerMarkers.bind(this)
);
this.resizeObserver.observe(this.el);
}
goToSlideDir(dir = "next") {
if (this.isNavigating) return;
const { firstInViewSlide, lastInViewSlide } = this.getInViewItems();
const isPrev = dir === "prev";
const referenceSlide = isPrev ? firstInViewSlide : lastInViewSlide;
const currentIndex = this.slides.indexOf(referenceSlide);
let targetIndex = isPrev ? currentIndex - 1 : currentIndex + 1;
if (targetIndex < 0 || targetIndex >= this.slides.length) {
if (!this.useLoop) return;
targetIndex = isPrev ? this.slides.length - 1 : 0;
}
const targetSlide = this.slides[targetIndex];
if (!targetSlide) return;
this.isNavigating = true;
targetSlide.scrollIntoView({
block: "nearest",
inline: isPrev ? "end" : "start"
});
}
pagerToSlide(event) {
if (!event.target.closest("[data-pager]")) return;
const marker = event.target.closest("a, button");
if (!marker) return;
event.preventDefault();
const slideId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName);
const targetSlide = this.track.querySelector(`#${slideId}`);
targetSlide?.scrollIntoView({ block: "nearest", inline: "start" });
}
eventHandler(event) {
const target = event.target.closest(
"[data-next], [data-prev], [data-pager]"
);
if (!target) return;
if (event.type === "click") {
if (target.hasAttribute("data-next")) {
this.goToSlideDir("next");
} else if (target.hasAttribute("data-prev")) {
this.goToSlideDir("prev");
} else if (target.closest("[data-pager]")) {
this.pagerToSlide(event);
}
}
if (event.type === "keydown" && target.closest("[data-pager]")) {
if (event.key === "ArrowRight" || event.key === "ArrowDown") {
event.preventDefault();
this.goToSlideDir("next");
} else if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
event.preventDefault();
this.goToSlideDir("prev");
}
}
}
};
(() => {
function alpineSnapSlider(Alpine) {
Alpine.directive("snap-slider", (el, {
modifiers
}, {
cleanup
}) => {
const slider = new SnapSlider(el, {
autoPager: modifiers.includes("auto-pager"),
groupPager: modifiers.includes("group-pager"),
loop: modifiers.includes("loop"),
forcePager: modifiers.includes("force-pager")
});
cleanup(() => {
slider.destroy();
});
});
}
document.addEventListener("alpine:init", () => {
window.Alpine.plugin(alpineSnapSlider);
});
})();
//# sourceURL=alpine-snap-slider.js
</script>
<script>
(() => {
// src/dialog.js
function dialog_default(Alpine) {
Alpine.directive("htmldialog", fylgjaAlpineDialog);
function fylgjaAlpineDialog(el, { expression, modifiers }, { evaluateLater, cleanup }) {
const evaluate = expression.length ? evaluateLater(expression) : () => {};
const lockPageScroll = modifiers.includes("noscroll");
const isModeless = modifiers.includes("modeless");
const closeBy = el.getAttribute("closeby") || modifierValue(modifiers, "closeby", "closerequest");
el.style.display = null;
el.style.length === 0 && el.removeAttribute("style");
if (el._x_isShown) {
open();
}
const closeBySupported = (() => {
return "closedBy" in HTMLDialogElement.prototype;
})();
function scrollLock(use = true) {
document.body.style.overflow = use ? "hidden" : "";
}
function dialogSubmit(event) {
if (event.target.getAttribute("method") === "dialog" || event.submitter?.getAttribute("formmethod") === "dialog") {
event.preventDefault();
evaluate();
}
}
function escapeDialog(event) {
if (event.key !== "Escape") return;
event.preventDefault();
if (closeBy === "none") return;
evaluate();
}
function handleCloseByEvent(event) {
if (event.target !== el) return;
const rect = el.getBoundingClientRect();
const isInDialog = rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width;
if (!isInDialog) {
if (closeBy === "any") {
if (closeBySupported) {
event.preventDefault();
}
evaluate();
}
}
}
function handleCloseEvent() {
evaluate();
}
function open() {
if (el.hasAttribute("open")) return;
isModeless ? el.show() : el.showModal();
scrollLock(lockPageScroll);
}
function close() {
if (!el.hasAttribute("open")) return;
el.close();
scrollLock(false);
}
el._x_doShow = () => open();
el._x_doHide = () => close();
el.addEventListener("keydown", escapeDialog);
el.addEventListener("submit", dialogSubmit);
el.addEventListener("click", handleCloseByEvent);
el.addEventListener("cancel", handleCloseEvent);
cleanup(() => {
el.removeEventListener("keydown", escapeDialog);
el.removeEventListener("submit", dialogSubmit);
el.removeEventListener("click", handleCloseByEvent);
el.removeEventListener("cancel", handleCloseEvent);
scrollLock(false);
});
}
}
function modifierValue(modifiers, key, fallback) {
if (modifiers.indexOf(key) === -1) return fallback;
const rawValue = modifiers[modifiers.indexOf(key) + 1];
if (!rawValue) return fallback;
if (key === "closeby") {
const allowedValues = ["auto", "none", "closerequest", "any"];
const options = allowedValues.join(", ");
if (!allowedValues.includes(rawValue)) {
console.warn(
`"${rawValue}" is not one of the allowed values for closeby: ${options}`
);
return fallback;
}
}
return rawValue;
}
// src/cdn.js
document.addEventListener("alpine:init", () => {
window.Alpine.plugin(dialog_default);
});
})();
//# sourceURL=alpine-htmldialog.js
</script>
<script>
(() => {
function src_default(Alpine) {
Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => {
let evaluate = evaluateLater(expression);
let options = {
rootMargin: getRootMargin(modifiers),
threshold: getThreshold(modifiers)
};
let observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting === (value === "leave"))
return;
evaluate();
modifiers.includes("once") && observer.disconnect();
});
}, options);
observer.observe(el);
cleanup(() => {
observer.disconnect();
});
}));
}
function getThreshold(modifiers) {
if (modifiers.includes("full"))
return 0.99;
if (modifiers.includes("half"))
return 0.5;
if (!modifiers.includes("threshold"))
return 0;
let threshold = modifiers[modifiers.indexOf("threshold") + 1];
if (threshold === "100")
return 1;
if (threshold === "0")
return 0;
return Number(`.${threshold}`);
}
function getLengthValue(rawValue) {
let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/);
return match ? match[1] + (match[2] || "px") : void 0;
}
function getRootMargin(modifiers) {
const key = "margin";
const fallback = "0px 0px 0px 0px";
const index = modifiers.indexOf(key);
if (index === -1)
return fallback;
let values = [];
for (let i = 1; i < 5; i++) {
values.push(getLengthValue(modifiers[index + i] || ""));
}
values = values.filter((v) => v !== void 0);
return values.length ? values.join(" ").trim() : fallback;
}
document.addEventListener("alpine:init", () => {
window.Alpine.plugin(src_default);
});
})();
//# sourceURL=alpine-intersect.js
</script>
<script>
for (const [selector, deferUntil] of Object.entries({".product-slider section[x-data]:not([x-data] [x-data])":"intersect",".product-info [x-data]:not([x-data] [x-data])":"intersect","#filters-content [x-data]:not([x-data] [x-data])":"intersect","#review_form":"intersect","section[x-data^=initRecentlyViewedProductsComponent]":"intersect","div[x-data^=initBundleOptions]":"intersect","#product_addtocart_form [x-data]:not([x-data] [x-data])":"intersect","#notice-cookie-block":"idle"})) {
document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`));
}
//# sourceURL=alpine-defer-rules.js
</script>
<script>
(() => {
const hasAlpine = new Promise(resolve => {
window.addEventListener('alpine:initialized', resolve, {once: true, passive: true});
});
const hasInteract = new Promise(resolve => {
(events => {
const onInteract = () => {
resolve();
events.forEach(type => window.removeEventListener(type, onInteract));
}
events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true}))
})(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown'])
});
const onIntersect = (el) => {
return new Promise(resolve => {
const observer = new IntersectionObserver(entries => {
for (const entry of entries) {
if (entry.isIntersecting) {
observer.disconnect()
resolve();
}
}
}, {});
observer.observe(el);
});
}
function runComponent(el) {
hasAlpine.then(() => {
el.removeAttribute('x-ignore');
queueMicrotask(() => Alpine.initTree(el));
});
}
function initDeferredComponents() {
document.querySelectorAll('[x-data][x-defer]').forEach(el => {
el.setAttribute('x-ignore', '');
const deferUntil = (el.getAttribute('x-defer') || '').trim();
switch (deferUntil) {
case 'interact':
hasInteract.then(() => runComponent(el));
break;
case 'intersect':
onIntersect(el).then(() => runComponent(el))
break;
case 'idle':
window.requestIdleCallback
? window.requestIdleCallback(() => runComponent(el), {timeout: 4000})
: setTimeout(() => runComponent(el), 4000);
break;
case 'eager':
runComponent(el);
break;
default:
if (deferUntil.startsWith('event:') && deferUntil.length > 6) {
window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true});
}
}
});
}
window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true});
})();
//# sourceURL=alpine-defer.js
</script>
<script type="module"
src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Hyva_Theme/js/alpine3.min.js"
defer
crossorigin
></script>
<script>
function dispatchMessages(messages, hideAfter) {
const messagesEvent = new CustomEvent("messages-loaded", {
detail: {
messages: messages,
hideAfter: hideAfter
}
});
window.dispatchEvent(messagesEvent);
}
if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) {
console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script");
}
(function( hyva, undefined ) {
hyva.initFormKey = () => {
if (typeof hyva.getFormKey !== 'function') return;
const formKey = hyva.getFormKey();
if (!formKey) return;
document.querySelectorAll('input[name="form_key"]').forEach((input) => {
input.value = formKey;
});
}
hyva.initMessages = () => {
try {
const messages = hyva.getCookie('mage-messages');
window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : [];
dispatchMessages(window.mageMessages);
// empty `mage-messages` cookie
const skipSetDomain = true;
hyva.setCookie('mage-messages','', -1, skipSetDomain);
} catch (error) {
console.warn('Error parsing Cookie Messages:', error);
}
}
window.addEventListener('DOMContentLoaded', hyva.initFormKey);
window.addEventListener('pageshow', (event) => {
if (event.persisted) {
hyva.initFormKey();
}
});
hyva.alpineInitialized(hyva.initMessages)
}( window.hyva = window.hyva || {} ));
//# sourceURL=hyva-cookies.js
</script>
<script>
(() => {
const private_content_key = 'mage-cache-storage';
const private_content_expire_key = 'mage-cache-timeout';
const private_content_version_key = 'private_content_version';
const section_data_ids_key = 'section_data_ids';
const mage_cache_session_id_key = 'mage-cache-sessid';
const last_visited_store_key = 'last_visited_store';
const ttl = 34187400;
if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) {
console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script");
}
function loadSectionData () {
const browserStorage = hyva.getBrowserStorage();
if (!browserStorage) {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "warning",
text: "Please enable LocalStorage in your browser."
}]
);
return;
}
try {
let isInvalid = false;
if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) {
isInvalid = true;
}
hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false);
if (!hyva.getCookie(mage_cache_session_id_key)) {
isInvalid = true;
browserStorage.removeItem(private_content_key);
const skipSetDomain = true;
const days = false;
hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain)
}
const cookieVersion = hyva.getCookie(private_content_version_key);
const storageVersion = browserStorage.getItem(private_content_version_key);
if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) {
isInvalid = true;
}
const privateContentExpires = browserStorage.getItem(private_content_expire_key);
if (privateContentExpires && new Date(privateContentExpires) < new Date()) {
browserStorage.removeItem(private_content_key);
}
if (isInvalid && cookieVersion) {
fetchPrivateContent([]);
} else if (cookieVersion && storageVersion && cookieVersion === storageVersion) {
const privateContent = JSON.parse(browserStorage.getItem(private_content_key));
if (
privateContent &&
privateContentExpires &&
privateContent.cart &&
privateContent.customer
) {
dispatchPrivateContent(privateContent);
} else {
fetchPrivateContent([]);
}
} else {
if (document.getElementById('default-section-data')) {
const privateContent = JSON.parse(document.getElementById('default-section-data').textContent.trim());
dispatchPrivateContent(privateContent);
} else {
dispatchPrivateContent({});
}
}
} catch (error) {
console.warn('Error retrieving Private Content:', error);
}
}
hyva.alpineInitialized(loadSectionData)
window.addEventListener('reload-customer-section-data', loadSectionData);
window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data);
function dispatchPrivateContent(data) {
const privateContentEvent = new CustomEvent("private-content-loaded", {
detail: {
data: window.processSectionDataBeforeDispatch(data)
}
});
window.dispatchEvent(privateContentEvent);
}
function fetchPrivateContent(sections) {
fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
})
.then(response => response.ok && response.json())
.then(
data => {
if (data) {
try {
const browserStorage = hyva.getBrowserStorage();
// merge new data preserving non-invalidated sections
const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {};
if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) {
delete oldSectionData['checkout-data'];
}
const newSectionData = Object.assign(oldSectionData, data);
dispatchPrivateContent(newSectionData);
// don't persist messages, they've been dispatched already
if (newSectionData.messages && newSectionData.messages.messages ) {
newSectionData.messages.messages = [];
}
browserStorage.setItem(private_content_key, JSON.stringify(newSectionData));
const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString();
browserStorage.setItem(private_content_expire_key, expiresAt);
const newCookieVersion = hyva.getCookie(private_content_version_key);
browserStorage.setItem(private_content_version_key, newCookieVersion);
// We don't need the section_data_ids in Hyvä, but we store them for compatibility
// with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout
hyva.setCookie(
section_data_ids_key,
JSON.stringify(
Object.keys(data).reduce((sectionDataIds, sectionKey) => {
sectionDataIds[sectionKey] = data[sectionKey]['data_id'];
return sectionDataIds;
}, {})
),
false,
true
);
} catch (error) {
console.warn("Couldn't store privateContent", error);
}
}
}
)
.catch(error => {
console.warn("Couldn't fetch privateContent", error);
});
}
})();
//# sourceURL=hyva-private-content.js
</script>
<script>
(() => {
document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc()));
})()
</script>
<script>
(events => {
const dispatchUserInteractionEvent = () => {
events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent))
window.dispatchEvent(new Event('init-external-scripts'))
};
events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true}))
})(['touchstart', 'mousemove', 'wheel', 'scroll', 'keydown']);
//# sourceURL=hyva-init-external-scripts.js
</script>
<script>
function initCompareOnProductList() {
return {
addToCompare(productId) {
const formKey = hyva.getFormKey();
const postUrl = BASE_URL + 'catalog/product_compare/add/';
fetch(postUrl, {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body": "form_key=" + formKey + "&product=" + productId + "&uenc=" + hyva.getUenc(),
"method": "POST",
"mode": "cors",
"credentials": "include"
}).then(function (response) {
if (response.redirected) {
window.location.href = response.url;
}
}).catch(function (error) {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "error",
text: error
}], 5000
);
});
}
};
}
</script>
<script>
function initProductItemImage() {
return {
updateImage() {
const image = this.$event.detail.medium;
if (!image) return;
this.$el.src = image;
}
}
}
window.addEventListener('alpine:init', () => {
Alpine.data('initProductItemImage', initProductItemImage);
}, { once: true });
</script>
<script>
function initPriceBox()
{
return {
updatePrice(priceData) {
const regularPriceLabel = this.$root.querySelector('.normal-price .price-label');
const regularPriceElement = this.$root.querySelector('.normal-price [data-price-type=finalPrice].price-wrapper .price');
const basePriceElement = this.$root.querySelector('.normal-price [data-price-type=basePrice].price-wrapper .price');
if (priceData.finalPrice.amount < priceData.oldPrice.amount) {
regularPriceLabel && regularPriceLabel.classList.add('hidden');
} else {
regularPriceLabel && regularPriceLabel.classList.remove('hidden');
}
regularPriceElement && (regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount));
basePriceElement && (basePriceElement.innerText = hyva.formatPrice(priceData.basePrice.amount));
}
}
}
</script>
<div class="page-footer-bottom bg-white"><div class="footer content pt-6 pb-4 px-6"><div class="footer-bottom-links flex flex-col md:flex-row justify-between mb-11 gap-6"><div class="footer-bottom-links-wrapper"><style>#html-body [data-pb-style=LLKYYIV]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="LLKYYIV"><div data-content-type="text" data-appearance="default" data-element="main"><ul>
<li><a tabindex="0" href="/conditions-generales-de-vente-avril-cosmetique-bio">Conditions générales de vente</a></li>
<li><a tabindex="0" href="/mentions-legales">Mentions légales</a></li>
<li><a tabindex="0" href="/sitemaps/fr/sitemap.xml">Plan du site</a></li>
<li><a tabindex="0" href="/politique-de-confidentialite">Politique de confidentialité</a></li>
</ul></div></div></div></div> <div class="flex flex-wrap gap-8">
<div x-data="{ open: false }" class="w-full pr-4">
<div class="relative text-right">
<div class="flex justify-start">
<button
@click="open = !open"
@click.outside="open = false"
@keydown.window.escape="open = false"
type="button"
class="w-full border-none p-0 text-sm shadow-none leading-[140%] font-light font-sans min-h-fit flex items-center pr-5 gap-2"
:aria-expanded="open.toString()"
aria-haspopup="true"
>
Français
<img src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/svg/FR.svg"
alt=""
width="17"
height="17"
aria-hidden="true"
loading="lazy" />
<span
:class="open ? 'inline-block rotate-90 transition-transform duration-300' : 'inline-block -rotate-90 transition-transform duration-300'"
>
<svg xmlns="http://www.w3.org/2000/svg" width="5" height="10" viewbox="0 0 7 12" fill="none" aria-hidden="true" class="block">
<path d="M6 1L1 6L6 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
</button>
</div>
<nav
x-cloak
x-show="open"
x-transition.origin.top.left
class="absolute mdonly:left-0 md:right-0 top-full z-20 w-auto py-2 mt-1 overflow-auto origin-top-left rounded-sm shadow-lg lg:mt-3 bg-container-lighter"
>
<div class="my-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
<a
x-data
@click.prevent="$el.setAttribute('href', atob($el.dataset.enc)); window.location.href = atob($el.dataset.enc)"
href="#"
role="link"
data-enc="aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL3N0b3Jlcy9zdG9yZS9yZWRpcmVjdC9fX19zdG9yZS9iMmNfZW4vX19fZnJvbV9zdG9yZS9iMmNfZnIvdWVuYy9hSFIwY0hNNkx5OTNkM2N1WVhaeWFXd3RiM0puWVc1cFl5NWpiMjB2WTJGa1pXRjFlQzlqWVdSbFlYVjRMbWgwYld3X1gxOWZjM1J2Y21VOVlqSmpYMlZ1Lw=="
class="px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100 leading-[140%] font-light font-sans text-sm flex items-center gap-4 md:justify-end"
>
Anglais <img src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/svg/EN.svg"
alt=""
width="17"
height="17"
aria-hidden="true"
loading="lazy" />
</a>
<a
x-data
@click.prevent="$el.setAttribute('href', atob($el.dataset.enc)); window.location.href = atob($el.dataset.enc)"
href="#"
role="link"
data-enc="aHR0cHM6Ly93d3cuYXZyaWwtYmVhdXRlLmZyL3N0b3Jlcy9zdG9yZS9yZWRpcmVjdC9fX19zdG9yZS9iMmNfZXMvX19fZnJvbV9zdG9yZS9iMmNfZnIvdWVuYy9hSFIwY0hNNkx5OTNkM2N1WVhaeWFXd3RZbWx2TG1WekwyTmhaR1ZoZFhndlkyRmtaV0YxZUM1b2RHMXNQMTlmWDNOMGIzSmxQV0l5WTE5bGN3fn4v"
class="px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100 leading-[140%] font-light font-sans text-sm flex items-center gap-4 md:justify-end"
>
Espagnol <img src="https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/images/svg/ES.svg"
alt=""
width="17"
height="17"
aria-hidden="true"
loading="lazy" />
</a>
</div>
</nav>
</div>
</div>
</div>
</div>
<div class="flower relative flex flex-col justify-center items-center mt-20">
<svg xmlns="http://www.w3.org/2000/svg" width="59" height="59" viewbox="0 0 60 59" fill="none" class="absolute top-0 -translate-y-[60%] transition-all ease-in-out duration-500 z-1" aria-hidden="true">
<path d="M29.4639 31.8385C27.0808 32.9817 18.778 29.1936 13.6575 23.4436C8.54188 17.6889 8.18775 9.05668 14.227 4.46448C31.2393 -8.45957 31.9237 11.1639 32.206 16.8411C32.4788 22.5523 32.6845 30.2835 29.4639 31.8385Z" fill="#37424C"/>
<path d="M36.758 32.5609C35.2027 31.907 32.4176 14.1243 34.6811 7.44427C36.1311 3.22991 43.9314 2.97802 48.669 6.05402C52.1241 8.33559 55.0241 12.2835 54.3589 19.3075C54.3589 19.3075 60.4795 21.0368 59.3645 31.8391C58.2208 42.656 54.2441 45.1992 50.7172 45.6497C47.1999 46.1195 45.6111 46.1195 45.6111 46.1195C45.6111 46.1195 42.5293 58.6464 32.1974 59C21.8417 59.3536 14.8453 49.2779 15.9651 48.1105C17.1041 46.9672 36.5857 43.3875 38.007 41.3965C40.0408 38.6112 33.4417 39.2312 44.3669 30.4731C48.7456 26.9854 51.5212 22.8437 51.4015 21.9378C51.2867 21.032 44.3669 27.2421 42.4288 29.0683C40.4954 30.9188 37.8634 33.0259 36.7628 32.5512V32.5609H36.758Z" fill="#37424C"/>
<path d="M25.9372 37.9434C25.8798 34.4024 14.7775 26.6955 11.8344 25.6298C7.18776 23.9392 -0.435486 26.4968 0.593389 36.8923C1.25857 43.7951 7.12555 47.5105 13.3419 46.7306C19.6587 45.941 25.9755 41.3779 25.9372 37.9483V37.9434Z" fill="#37424C"/>
<path d="M29.1152 37.3707C29.1152 35.6607 30.4934 34.2656 32.1971 34.2656C33.9007 34.2656 35.2741 35.6607 35.2741 37.3707C35.2741 39.0807 33.8911 40.4758 32.1971 40.4758C30.503 40.4758 29.1152 39.1 29.1152 37.3707Z" fill="#37424C"/>
</svg>
<div class="flower-text mt-0 px-6 py-4 bg-container rounded-[10px] text-center z-[2]">
<span class="block font-sans font-light text-xs leading-[120%] tracking-normal text-blue_avril-100">
Pourquoi la fleur de magnolia ? </span>
<span class="block font-sans font-light text-xs leading-[120%] tracking-normal text-blue_avril-100">
<a href="https://www.avril-beaute.fr/le-logo-avril-fleur-magnolia" class="underline">
On vous raconte ici </a>
</span>
</div>
</div>
<script>
const flower = document.querySelector('.flower-text');
const flower_svg = document.querySelector('.flower svg');
flower.addEventListener('mouseenter', () => {
flower_svg.classList.add('-translate-y-[90%]');
});
flower.addEventListener('mouseleave', () => {
flower_svg.classList.remove('-translate-y-[90%]');
});
</script>
<script>
(function () {
const pushEvent = (el) => {
const rawData = {"pourquoi_logo":""};
const finalData = {
event: 'footer'
};
const keys = Object.keys(rawData);
keys.forEach((key, index) => {
let value = String(rawData[key]);
value = value.replace(/{{inner_text}}/g, el.innerText.trim());
value = value.replace(/{{value}}/g, el.value || '');
value = value.replace(/{{title}}/g, el.title || el.getAttribute('aria-label') || '');
value = value.replace(/{{href}}/g, el.href || '');
value = value.replace(/{{page_type}}/g, 'category');
const selectorRegex = /(?:{{)?selector:([^|{}]+)\|([^}|]+)(?:}})?/g;
value = value.replace(selectorRegex, (match, cssSelector, attr) => {
const targetEl = el.querySelector(cssSelector) || document.querySelector(cssSelector);
if (!targetEl) return '';
if (attr === 'inner_text') return targetEl.innerText.trim();
if (attr === 'value') return targetEl.value || '';
return targetEl.getAttribute(attr) || '';
});
const suffix = keys.length > 1 ? (index + 1) : '';
finalData['event_parameter' + suffix] = key;
finalData['event_value' + suffix] = value;
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(finalData);
};
// Using event delegation to support AJAX content
document.addEventListener('click', function (e) {
const el = e.target.closest('.flower-text a');
if (el) {
pushEvent(el);
}
}, true);
document.addEventListener('auxclick', function (e) {
const el = e.target.closest('.flower-text a');
if (el) {
pushEvent(el);
}
}, true);
})();
</script>
</div></div><script>
function initConfigurableOptions(productId, optionConfig) {
function findPathParam(key) {
const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL;
const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/');
const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3);
for (let i = 0; i < pathParts.length; i += 2) {
if (pathParts[i] === key && pathParts.length > i) {
return pathParts[i + 1];
}
}
}
return {
optionConfig,
productId,
itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'),
allowedAttributeOptions: [],
selectedValues: [],
selectedOptions: {},
init() {
this.baseInit();
},
baseInit() {
this.buildLookupMap();
this.findAllowedAttributeOptions();
this.$nextTick(() => {
if (typeof this.optionConfig.defaultValues === 'object') {
for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) {
this.changeOption(attributeId, value + '');
}
}
this.applyCheckedState();
});
},
applyCheckedState() {
this.$root.querySelectorAll('input[data-attribute-id], select[data-attribute-id]').forEach(el => {
const val = this.selectedValues[el.dataset.attributeId];
if (!val) return;
if (el.tagName === 'SELECT') {
el.value = val;
this.selectedOptions[el.dataset.attributeId] = el.options[el.selectedIndex]?.text || '';
} else if (el.value === val && this.optionIsActive(el.dataset.attributeId, el.value)) {
el.checked = true;
this.selectedOptions[el.dataset.attributeId] = el.dataset.optionLabel || '';
}
});
},
productIndex: 0,
productIndexForPrice: 0,
productIndexesMap: null,
productIndexesKeys: null,
attributeCount: 0,
optionIsActive(attributeId, optionId) {
return !!this.getAllowedAttributeOptions(attributeId).find(
option => option.id === optionId
)
},
optionIsDisabled() {
const attributeId = this.$el.dataset.attributeId;
if (!attributeId) {
throw new Error('data-attribute-id missing, in item template');
}
return !this.optionIsActive(attributeId, this.$el.value);
},
findSimpleIndex() {
this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues);
this.productIndexForPrice = this.findCheapestProductForPartialSelection(this.selectedValues);
},
calculateSimpleIndexForPartialSelection(selectedValues) {
if (selectedValues.length === 0) return 0;
return this.findProductIdsForPartialSelection(selectedValues)[0];
},
buildLookupMap() {
this.productIndexesMap = new Map();
this.attributeCount = Object.keys(this.optionConfig.attributes).length;
for (const id in this.optionConfig.index) {
const options = this.optionConfig.index[id];
if (! this.productIndexesKeys) {
this.productIndexesKeys = Object.keys(options).sort();
}
const key = JSON.stringify(options, this.productIndexesKeys);
this.productIndexesMap.set(key, id);
}
},
findAllowedAttributeOptions() {
this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues);
},
calculateAllowedAttributeOptions(selectedValues) {
const allAttributes = this.optionConfig.attributes;
const allAttributesSorted = Object.values(allAttributes).sort((a,b) => {
return a.position - b.position
});
const newAllowedAttributeOptions = [];
allAttributesSorted.forEach(attribute => {
const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id));
const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr);
newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => {
return !!option.products.find(product => {
return availableIndexes.includes(product);
})
});
});
return newAllowedAttributeOptions;
},
calculateAvailableProductIndexes(selectedOptions) {
if (Object.keys(selectedOptions).length === 0) {
if (Object.values(this.optionConfig.salable || {}).length) {
return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i)
}
return Object.keys(this.optionConfig.index);
}
const selectedIds = Object.keys(selectedOptions);
if (Object.values(this.optionConfig.salable || {}).length) {
const selectedOptionIndexes = selectedIds.map(attrId => {
const optionValue = selectedOptions[attrId];
return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || []
})
return selectedOptionIndexes.reduce((acc, optionIndexes) => {
return acc.filter(index => optionIndexes.includes(index));
});
} else {
const productIndexes = this.optionConfig.index;
return Object.keys(productIndexes).filter(index => {
for (const attrId of selectedIds) {
if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false
}
return true
});
}
},
findAttributeByOptionId(optionId) {
for (const attributeId in this.optionConfig.attributes) {
const attributeOptions = this.optionConfig.attributes[attributeId].options || [];
if (attributeOptions.find(option => option.id === optionId)) {
return attributeId;
}
}
},
getAllowedAttributeOptions(attributeId) {
return this.allowedAttributeOptions[attributeId] || []
},
getAllAttributeOptions(attributeId) {
return (
this.optionConfig.attributes[attributeId] &&
this.optionConfig.attributes[attributeId].options
) || []
},
getProductIdsForOption(option) {
const attributeId = this.findAttributeByOptionId(option.id);
const allOptions = this.optionConfig.attributes[attributeId];
const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id);
return opt && opt.products
? opt.products
: [];
},
findProductIdsForPartialSelection(optionSelection) {
const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => {
const newCandidates = this.getProductIdsForOption({id: optionId});
return candidates === null
? newCandidates
: candidates.filter(productId => newCandidates.includes(productId));
}, null);
return candidateProducts || [];
},
findCheapestProductForPartialSelection(optionSelection) {
const candidateProducts = this.findProductIdsForPartialSelection(optionSelection);
return candidateProducts.reduce((cheapest, simpleIdx) => {
// in the first iteration we start with simpleIdx as the currently cheapest product
if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx;
const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount;
return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount
? simpleIdx
: cheapest;
}, 0)
},
removeAttrFromSelection(selectedValues, attributeId) {
attributeId = parseInt(attributeId);
return selectedValues.reduce((newSelection, val, attr) => {
if (attr !== attributeId) {
newSelection[attr] = val;
}
return newSelection;
}, []);
},
reflectOption(event) {
const attributeId = event.target.dataset.attributeId;
const label = event.target.dataset.optionLabel
|| event.target.options?.[event.target.selectedIndex]?.text
|| '';
this.selectedOptions[attributeId] = label;
this.changeOption(attributeId, event.target.value);
},
baseChangeOption(attributeId, value) {
if (value === '') {
this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId)
} else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) {
this.selectedValues[attributeId] = value;
}
this.findSimpleIndex();
this.findAllowedAttributeOptions();
this.updatePrices();
this.updateGallery();
},
changeOption(attributeId, value) {
this.baseChangeOption(attributeId, value);
const candidates = this.findProductIdsForPartialSelection(this.selectedValues);
window.dispatchEvent(
new CustomEvent(
'configurable-selection-changed',
{
detail: {
productId: this.productId,
optionId: attributeId,
value: value,
productIndex: this.productIndex,
selectedValues: this.selectedValues,
candidates: candidates,
skuCandidates: Object.values(candidates).map(id => this.optionConfig.sku?.[id] ?? null).filter(Boolean),
}
}
)
);
},
calculateIsMinimalPrice() {
return ! this.isFullSelection(this.selectedValues);
},
isFullSelection(selectedValues) {
return Object.keys(selectedValues).length === this.attributeCount;
},
updatePrices() {
const value = this.optionConfig.optionPrices[this.productIndexForPrice] || this.optionConfig.prices;
window.dispatchEvent(
new CustomEvent(
"update-prices-" + this.productId,
{
detail: Object.assign(
value,
{ isMinimalPrice: this.calculateIsMinimalPrice() }
)
}
)
);
},
updateGallery () {
if (this.productIndex) {
const images = this.optionConfig.images[this.productIndex];
images && window.dispatchEvent(new CustomEvent(
"update-gallery",
{ detail: this.sortImagesByPosition(images) }
));
} else {
window.dispatchEvent(new Event("reset-gallery"));
}
},
sortImagesByPosition(images) {
return images.sort((x, y) => {
return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1)
});
},
preselectQuerystringItems() {
// pre-select option like ?size=167
const urlQueryParams = new URLSearchParams(window.location.search.replace('?',''));
this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code));
},
preselectLocationHashItems() {
// pre-select option like #144=167
const urlHashParams = new URLSearchParams(window.location.hash.replace('#',''));
this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id));
},
preselectItemsBasedOnLocation(getLocationValue) {
Object.values(this.optionConfig.attributes).map(attribute => {
const v = getLocationValue(attribute);
v && this.changeOption(attribute.id, v)
});
},
findProductForOptionPrice(attributeId, value) {
const options = this.optionConfig.attributes[attributeId]?.options || [];
const option = options.find(o => o.id === value);
if (!option?.products?.length) return null;
return option.products.reduce((cheapest, productId) => {
if (!cheapest) return productId;
const cheapestPrice = this.optionConfig.optionPrices[cheapest]?.finalPrice?.amount ?? Infinity;
const thisPrice = this.optionConfig.optionPrices[productId]?.finalPrice?.amount ?? Infinity;
return thisPrice < cheapestPrice ? productId : cheapest;
}, null);
},
getOptionLabel() {
const value = this.$el.value;
const attributeId = this.$el.dataset.attributeId;
const label = this.$el.dataset.optionLabel || '';
if (!value || !attributeId) return label;
const productId = this.findProductForOptionPrice(attributeId, value);
if (!productId) return label;
const optionPrice = this.optionConfig.optionPrices[productId]?.finalPrice?.amount;
const basePrice = this.optionConfig.prices?.finalPrice?.amount;
if (optionPrice == null || basePrice == null) return label;
const adjustment = optionPrice - basePrice;
if (Math.abs(adjustment) < 0.001) return label;
const formatted = hyva.formatPrice(Math.abs(adjustment));
return `${label} (${adjustment > 0 ? '+' : '-'}${formatted})`;
},
}
}
</script>
<script>
function initSwatchOptions() {
return {
activeTooltipItem: false,
tooltipPositionElement: false,
isTooltipVisible() {
return !!this.activeTooltipItem;
},
isCurrentTooltipVisual() {
return this.activeTooltipItem && ['color', 'image'].includes(this.activeTooltipItem.type);
},
getTooltipImageStyle() {
const item = this.activeTooltipItem;
if (item?.type === 'color') return {
backgroundColor: item.preview,
width: `${item.width ?? 90}px`,
height: `${item.height ?? 90}px`
};
if (item?.type === 'image') return {
backgroundImage: `url(${item.preview})`,
backgroundSize: 'cover',
backgroundPosition: 'center',
backgroundRepeat: 'no-repeat',
width: `${item.width ?? 90}px`,
height: `${item.height ?? 90}px`
};
return null;
},
getTooltipPosition() {
if (!this.tooltipPositionElement) return null;
const el = this.tooltipPositionElement;
const elRect = el.getBoundingClientRect();
const left = elRect.left + elRect.width / 2;
return {
bottom: `${window.innerHeight - elRect.top}px`,
left: `${left}px`,
translate: '-50% 0'
};
},
getTooltipLabel() {
return this.activeTooltipItem ? this.activeTooltipItem.label : '';
},
showTooltip(event) {
if (!window.matchMedia('(hover: hover) and (pointer: fine)').matches) return;
const input = event.currentTarget.querySelector('input');
this.activeTooltipItem = JSON.parse(input.dataset.tooltip);
this.tooltipPositionElement = event.currentTarget;
},
hideTooltip() {
this.activeTooltipItem = false;
},
}
}
</script>
<script>
'use strict';
const grecaptchaV2LoadCallbacks = [];
function executeRecaptchaLoadCallbacks () {
while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) {
const callback = grecaptchaV2LoadCallbacks.pop();
typeof callback === 'string' ? window[callback]() : callback();
}
}
(function() {
const loadRecaptchaScript = (event) => {
if (window.grecaptcha || !event.target.form) {
return;
}
const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks';
const siteKey = '6LcFYF4qAAAAADImTOaJzO6csad6UWhk\u002D3kW7m4q';
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`;
script.async = true;
document.head.appendChild(script);
script.addEventListener('load', () => {
Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled'));
});
}
window.forceLoadRecaptchaScript = (form) => {
loadRecaptchaScript({target: {form: form || 'dummy'}});
executeRecaptchaLoadCallbacks();
};
document.body.addEventListener('input', loadRecaptchaScript, { once: true });
document.body.addEventListener('focus', loadRecaptchaScript, { once: true });
}());
</script>
<script>
(function () {
const pushEvent = (el) => {
const rawData = {"click":"{{inner_text}}"};
const finalData = {
event: 'breadcrumb'
};
const keys = Object.keys(rawData);
keys.forEach((key, index) => {
let value = String(rawData[key]);
value = value.replace(/{{inner_text}}/g, el.innerText.trim());
value = value.replace(/{{value}}/g, el.value || '');
value = value.replace(/{{title}}/g, el.title || el.getAttribute('aria-label') || '');
value = value.replace(/{{href}}/g, el.href || '');
value = value.replace(/{{page_type}}/g, 'category');
const selectorRegex = /(?:{{)?selector:([^|{}]+)\|([^}|]+)(?:}})?/g;
value = value.replace(selectorRegex, (match, cssSelector, attr) => {
const targetEl = el.querySelector(cssSelector) || document.querySelector(cssSelector);
if (!targetEl) return '';
if (attr === 'inner_text') return targetEl.innerText.trim();
if (attr === 'value') return targetEl.value || '';
return targetEl.getAttribute(attr) || '';
});
const suffix = keys.length > 1 ? (index + 1) : '';
finalData['event_parameter' + suffix] = key;
finalData['event_value' + suffix] = value;
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(finalData);
};
// Using event delegation to support AJAX content
document.addEventListener('click', function (e) {
const el = e.target.closest('.breadcrumbs a,.ultracrumbs-list a');
if (el) {
pushEvent(el);
}
}, true);
document.addEventListener('auxclick', function (e) {
const el = e.target.closest('.breadcrumbs a,.ultracrumbs-list a');
if (el) {
pushEvent(el);
}
}, true);
})();
</script>
<script>
(function () {
const pushEvent = (el) => {
const rawData = {"click_rs":"{{title}}"};
const finalData = {
event: 'footer'
};
const keys = Object.keys(rawData);
keys.forEach((key, index) => {
let value = String(rawData[key]);
value = value.replace(/{{inner_text}}/g, el.innerText.trim());
value = value.replace(/{{value}}/g, el.value || '');
value = value.replace(/{{title}}/g, el.title || el.getAttribute('aria-label') || '');
value = value.replace(/{{href}}/g, el.href || '');
value = value.replace(/{{page_type}}/g, 'category');
const selectorRegex = /(?:{{)?selector:([^|{}]+)\|([^}|]+)(?:}})?/g;
value = value.replace(selectorRegex, (match, cssSelector, attr) => {
const targetEl = el.querySelector(cssSelector) || document.querySelector(cssSelector);
if (!targetEl) return '';
if (attr === 'inner_text') return targetEl.innerText.trim();
if (attr === 'value') return targetEl.value || '';
return targetEl.getAttribute(attr) || '';
});
const suffix = keys.length > 1 ? (index + 1) : '';
finalData['event_parameter' + suffix] = key;
finalData['event_value' + suffix] = value;
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(finalData);
};
// Using event delegation to support AJAX content
document.addEventListener('click', function (e) {
const el = e.target.closest('.footer-socials-container a');
if (el) {
pushEvent(el);
}
}, true);
document.addEventListener('auxclick', function (e) {
const el = e.target.closest('.footer-socials-container a');
if (el) {
pushEvent(el);
}
}, true);
})();
</script>
<script>
(function () {
const pushEvent = (el) => {
const rawData = {"message":"{{inner_text}}","zone":"{{page_type}}"};
const finalData = {
event: 'rse_banner'
};
const keys = Object.keys(rawData);
keys.forEach((key, index) => {
let value = String(rawData[key]);
value = value.replace(/{{inner_text}}/g, el.innerText.trim());
value = value.replace(/{{value}}/g, el.value || '');
value = value.replace(/{{title}}/g, el.title || el.getAttribute('aria-label') || '');
value = value.replace(/{{href}}/g, el.href || '');
value = value.replace(/{{page_type}}/g, 'category');
const selectorRegex = /(?:{{)?selector:([^|{}]+)\|([^}|]+)(?:}})?/g;
value = value.replace(selectorRegex, (match, cssSelector, attr) => {
const targetEl = el.querySelector(cssSelector) || document.querySelector(cssSelector);
if (!targetEl) return '';
if (attr === 'inner_text') return targetEl.innerText.trim();
if (attr === 'value') return targetEl.value || '';
return targetEl.getAttribute(attr) || '';
});
const suffix = keys.length > 1 ? (index + 1) : '';
finalData['event_parameter' + suffix] = key;
finalData['event_value' + suffix] = value;
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(finalData);
};
// Using event delegation to support AJAX content
document.addEventListener('click', function (e) {
const el = e.target.closest('.footer_reassurance a, .project-slider a, .hp-project-link a');
if (el) {
pushEvent(el);
}
}, true);
document.addEventListener('auxclick', function (e) {
const el = e.target.closest('.footer_reassurance a, .project-slider a, .hp-project-link a');
if (el) {
pushEvent(el);
}
}, true);
})();
</script>
<script>
(function () {
const pushEvent = (el) => {
const rawData = {"search_term":"{{inner_text}}","search_method":"frequent_query","keyword":"selector:#search|value"};
const finalData = {
event: 'search_select'
};
const keys = Object.keys(rawData);
keys.forEach((key, index) => {
let value = String(rawData[key]);
value = value.replace(/{{inner_text}}/g, el.innerText.trim());
value = value.replace(/{{value}}/g, el.value || '');
value = value.replace(/{{title}}/g, el.title || el.getAttribute('aria-label') || '');
value = value.replace(/{{href}}/g, el.href || '');
value = value.replace(/{{page_type}}/g, 'category');
const selectorRegex = /(?:{{)?selector:([^|{}]+)\|([^}|]+)(?:}})?/g;
value = value.replace(selectorRegex, (match, cssSelector, attr) => {
const targetEl = el.querySelector(cssSelector) || document.querySelector(cssSelector);
if (!targetEl) return '';
if (attr === 'inner_text') return targetEl.innerText.trim();
if (attr === 'value') return targetEl.value || '';
return targetEl.getAttribute(attr) || '';
});
const suffix = keys.length > 1 ? (index + 1) : '';
finalData['event_parameter' + suffix] = key;
finalData['event_value' + suffix] = value;
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(finalData);
};
// Using event delegation to support AJAX content
document.addEventListener('click', function (e) {
const el = e.target.closest('.tracking-search-frequent a');
if (el) {
pushEvent(el);
}
}, true);
document.addEventListener('auxclick', function (e) {
const el = e.target.closest('.tracking-search-frequent a');
if (el) {
pushEvent(el);
}
}, true);
})();
</script>
<script>
(function () {
const pushEvent = (el) => {
const rawData = {"search_term":"{{inner_text}}","search_method":"suggestion_click","keyword":"selector:#search|value"};
const finalData = {
event: 'search_select'
};
const keys = Object.keys(rawData);
keys.forEach((key, index) => {
let value = String(rawData[key]);
value = value.replace(/{{inner_text}}/g, el.innerText.trim());
value = value.replace(/{{value}}/g, el.value || '');
value = value.replace(/{{title}}/g, el.title || el.getAttribute('aria-label') || '');
value = value.replace(/{{href}}/g, el.href || '');
value = value.replace(/{{page_type}}/g, 'category');
const selectorRegex = /(?:{{)?selector:([^|{}]+)\|([^}|]+)(?:}})?/g;
value = value.replace(selectorRegex, (match, cssSelector, attr) => {
const targetEl = el.querySelector(cssSelector) || document.querySelector(cssSelector);
if (!targetEl) return '';
if (attr === 'inner_text') return targetEl.innerText.trim();
if (attr === 'value') return targetEl.value || '';
return targetEl.getAttribute(attr) || '';
});
const suffix = keys.length > 1 ? (index + 1) : '';
finalData['event_parameter' + suffix] = key;
finalData['event_value' + suffix] = value;
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(finalData);
};
// Using event delegation to support AJAX content
document.addEventListener('click', function (e) {
const el = e.target.closest('.tracking-search-suggestion a');
if (el) {
pushEvent(el);
}
}, true);
document.addEventListener('auxclick', function (e) {
const el = e.target.closest('.tracking-search-suggestion a');
if (el) {
pushEvent(el);
}
}, true);
})();
</script>
<script>
(function () {
const pushEvent = (el) => {
const rawData = {"search_term":"selector:.product-item-name|inner_text","search_method":"product","keyword":"selector:#search|value"};
const finalData = {
event: 'search_select'
};
const keys = Object.keys(rawData);
keys.forEach((key, index) => {
let value = String(rawData[key]);
value = value.replace(/{{inner_text}}/g, el.innerText.trim());
value = value.replace(/{{value}}/g, el.value || '');
value = value.replace(/{{title}}/g, el.title || el.getAttribute('aria-label') || '');
value = value.replace(/{{href}}/g, el.href || '');
value = value.replace(/{{page_type}}/g, 'category');
const selectorRegex = /(?:{{)?selector:([^|{}]+)\|([^}|]+)(?:}})?/g;
value = value.replace(selectorRegex, (match, cssSelector, attr) => {
const targetEl = el.querySelector(cssSelector) || document.querySelector(cssSelector);
if (!targetEl) return '';
if (attr === 'inner_text') return targetEl.innerText.trim();
if (attr === 'value') return targetEl.value || '';
return targetEl.getAttribute(attr) || '';
});
const suffix = keys.length > 1 ? (index + 1) : '';
finalData['event_parameter' + suffix] = key;
finalData['event_value' + suffix] = value;
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(finalData);
};
// Using event delegation to support AJAX content
document.addEventListener('click', function (e) {
const el = e.target.closest('.tracking-search-product a');
if (el) {
pushEvent(el);
}
}, true);
document.addEventListener('auxclick', function (e) {
const el = e.target.closest('.tracking-search-product a');
if (el) {
pushEvent(el);
}
}, true);
})();
</script>
<script>
function initWishlist({sku, productId, name}) {
return {
isLoading: false,
sku,
productId: String(productId),
name,
inWishlist: false,
wishlistItemId: null,
showMessage(type, text) {
if (typeof window.dispatchMessages === 'function') {
window.dispatchMessages([{type, text}], 5000);
}
},
syncFromClient(state) {
this.wishlistItemId = state.byProduct[this.productId] || null;
this.inWishlist = !!this.wishlistItemId;
},
getWishlistItems() {
if (!window.AvrilWishlistClient) { return; }
const apply = (state) => this.syncFromClient(state);
window.AvrilWishlistClient.fetchItems().then(apply);
window.addEventListener('avril-wishlist:changed', (e) => apply(e.detail));
window.addEventListener('avril-wishlist:loaded', (e) => apply(e.detail));
},
addToWishlist(productId) {
if (this.isLoading || !window.AvrilWishlistClient) { return; }
if (this.inWishlist) { return this.removeFromWishlist(); }
const msgs = (window.AvrilWishlist && window.AvrilWishlist.messages) || {};
const clientState = window.AvrilWishlistClient.getState();
if (clientState.requiresLogin) {
try {
window.sessionStorage.setItem('avril-wishlist:pending-add', JSON.stringify({ productId: this.productId, sku: this.sku }));
} catch (e) { /* noop */ }
window.location.href = clientState.loginUrl;
return;
}
const addedTpl = "__NAME__\u0020a\u0020\u00E9t\u00E9\u0020ajout\u00E9\u0020\u00E0\u0020votre\u0020liste\u0020d\u2019envies";
this.isLoading = true;
this.showMessage('success', addedTpl.replace('__NAME__', this.name));
window.AvrilWishlistClient.add(productId, { sku: this.sku })
.catch((err) => {
if (err && err.message === 'requires-login') {
window.location.href = window.AvrilWishlistClient.getState().loginUrl;
return;
}
this.showMessage('error', msgs.error || (err && err.message) || err);
})
.finally(() => { this.isLoading = false; });
},
removeFromWishlist() {
if (!this.wishlistItemId || !window.AvrilWishlistClient) { return; }
const msgs = (window.AvrilWishlist && window.AvrilWishlist.messages) || {};
const removedTpl = "__NAME__\u0020a\u0020\u00E9t\u00E9\u0020retir\u00E9\u0020de\u0020votre\u0020liste\u0020d\u0027achats.";
this.isLoading = true;
this.showMessage('success', removedTpl.replace('__NAME__', this.name));
window.AvrilWishlistClient.remove(this.wishlistItemId)
.catch((err) => {
this.showMessage('error', msgs.error || (err && err.message) || err);
})
.finally(() => { this.isLoading = false; });
}
}
}
</script>
<script>
function initPriceBox()
{
return {
updatePrice(priceData) {
const regularPriceLabel = this.$root.querySelector('.normal-price .price-label');
const regularPriceElement = this.$root.querySelector('.normal-price [data-price-type=finalPrice].price-wrapper .price');
const basePriceElement = this.$root.querySelector('.normal-price [data-price-type=basePrice].price-wrapper .price');
if (priceData.finalPrice.amount < priceData.oldPrice.amount) {
regularPriceLabel && regularPriceLabel.classList.add('hidden');
} else {
regularPriceLabel && regularPriceLabel.classList.remove('hidden');
}
regularPriceElement && (regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount));
basePriceElement && (basePriceElement.innerText = hyva.formatPrice(priceData.basePrice.amount));
}
}
}
</script>
<script>
'use strict';
(() => {
function _calculateStrength({elementID, valid}) {
const password = document.getElementById(elementID),
emailElm = document.getElementById('email_address');
let displayScore;
if (!password || !password.value) {
displayScore = 0;
} else {
if (emailElm && password.value && emailElm.value &&
password.value.toLowerCase() === emailElm.value.toLowerCase()) {
displayScore = 1;
} else {
const zxcvbnScore = zxcvbn(password.value).score;
displayScore = valid && zxcvbnScore > 0 ? zxcvbnScore : 1;
}
}
_displayStrength(displayScore);
}
function _displayStrength(displayScore) {
let strengthLabel = '',
className;
switch (displayScore) {
case 0:
strengthLabel = "Aucun\u0020mot\u0020de\u0020passe";
className = 'password-none';
break;
case 1:
strengthLabel = "Faible";
className = 'password-weak';
break;
case 2:
strengthLabel = "Moyen";
className = 'password-medium';
break;
case 3:
strengthLabel = "Elev\u00E9";
className = 'password-strong';
break;
case 4:
strengthLabel = "Tr\u00E8s\u0020\u00E9lev\u00E9";
className = 'password-very-strong';
break;
}
const meterElm = document.getElementById('password-strength-meter-container'),
meterLabelElm = document.getElementById('password-strength-meter-label');
meterElm.className = '';
meterElm.classList.add(className);
meterLabelElm.textContent = strengthLabel;
}
let loading = false;
const callbacks = [];
function loadZxcvbn(cb) {
callbacks.push(cb);
if (loading) return;
loading = true;
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https\u003A\u002F\u002Fwww.avril\u002Dbeaute.fr\u002Fstatic\u002Fversion1791884672\u002Ffrontend\u002FAvril\u002Fhyva\u002Ffr_FR\u002Fjs\u002Fzxcvbn.min.js';
script.async = true;
script.onload = () => callbacks.forEach(cb => cb());
document.head.appendChild(script);
}
window.addEventListener('password-validate', function (evt) {
const meterElm = document.getElementById('password-strength-meter-container'),
meterLabelElm = document.getElementById('password-strength-meter-label');
if (meterElm && meterLabelElm) {
if (evt.detail && evt.detail.elementID) {
const cb = () => _calculateStrength(evt.detail);
window.zxcvbn ? cb() : loadZxcvbn(cb)
}
}
});
document.addEventListener('afterValidateField', (event) => {
const field = event.detail.field;
if (field.name === 'password') {
const msgLis = document.querySelectorAll('.messages');
msgLis.forEach(li => li.remove());
}
});
const observer = new MutationObserver((mutationsList) => {
mutationsList.forEach(mutation => {
mutation.addedNodes.forEach(node => {
if (node.nodeType === 1 && node.matches('ul.messages')) {
if (node.querySelector('li[data-msg-field="password"]')) {
node.remove(); // supprime l'UL complète
}
}
});
});
});
observer.observe(document.body, { childList: true, subtree: true });
document.addEventListener('DOMContentLoaded', () => {
if (hyva && hyva.formValidation) {
hyva.formValidation.addRule('password-strength', function (value, options, field, context) {
const minCharacterSets = options.minCharacterSets !== undefined ? options.minCharacterSets : 1;
const minimumPasswordLength = options.minimumPasswordLength !== undefined ? options.minimumPasswordLength : 8;
const criteriaContainer = field.element.closest('.field')?.querySelector('.password-criteria');
const criteria = {
length: value.length >= minimumPasswordLength,
lowercase: /[a-z]/.test(value),
uppercase: /[A-Z]/.test(value),
number: /\d/.test(value)
};
if (criteriaContainer) {
queueMicrotask(() => {
Object.keys(criteria).forEach(key => {
const li = criteriaContainer.querySelector(`li[data-criterion="${key}"]`);
if (li) li.classList.toggle('valid', criteria[key]);
});
});
}
let counter = 0;
if (criteria.number) counter++;
if (criteria.lowercase) counter++;
if (criteria.uppercase) counter++;
if (counter < minCharacterSets || value.length < minimumPasswordLength) {
return false;
}
return true;
});
}
});
})();
</script>
<script>
(function () {
const pushEvent = (el) => {
const rawData = {"click_nav_chips":"{{inner_text}}"};
const finalData = {
event: 'listing_page'
};
const keys = Object.keys(rawData);
keys.forEach((key, index) => {
let value = String(rawData[key]);
value = value.replace(/{{inner_text}}/g, el.innerText.trim());
value = value.replace(/{{value}}/g, el.value || '');
value = value.replace(/{{title}}/g, el.title || el.getAttribute('aria-label') || '');
value = value.replace(/{{href}}/g, el.href || '');
value = value.replace(/{{page_type}}/g, 'category');
const selectorRegex = /(?:{{)?selector:([^|{}]+)\|([^}|]+)(?:}})?/g;
value = value.replace(selectorRegex, (match, cssSelector, attr) => {
const targetEl = el.querySelector(cssSelector) || document.querySelector(cssSelector);
if (!targetEl) return '';
if (attr === 'inner_text') return targetEl.innerText.trim();
if (attr === 'value') return targetEl.value || '';
return targetEl.getAttribute(attr) || '';
});
const suffix = keys.length > 1 ? (index + 1) : '';
finalData['event_parameter' + suffix] = key;
finalData['event_value' + suffix] = value;
});
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(finalData);
};
// Using event delegation to support AJAX content
document.addEventListener('click', function (e) {
const el = e.target.closest('.subcategories-list a');
if (el) {
pushEvent(el);
}
}, true);
document.addEventListener('auxclick', function (e) {
const el = e.target.closest('.subcategories-list a');
if (el) {
pushEvent(el);
}
}, true);
})();
</script>
<script>
function initLayeredSwatch() {
return {
activeTooltipItem: false,
tooltipPositionElement: false,
isTooltipVisible() {
return !!this.activeTooltipItem;
},
getTooltipImageStyle() {
const item = this.activeTooltipItem;
if (item?.type === 'color') return {
backgroundColor: item.preview,
width: `${item.width ?? 90}px`,
height: `${item.height ?? 90}px`
};
if (item?.type === 'image') return {
backgroundImage: `url(${item.preview})`,
backgroundSize: 'cover',
backgroundPosition: 'center',
backgroundRepeat: 'no-repeat',
width: `${item.width ?? 90}px`,
height: `${item.height ?? 90}px`
};
return null;
},
getTooltipPosition() {
if (!this.tooltipPositionElement) return null;
const el = this.tooltipPositionElement;
const elRect = el.getBoundingClientRect();
const left = elRect.left + elRect.width / 2;
return {
bottom: `${window.innerHeight - elRect.top}px`,
left: `${left}px`,
translate: '-50% 0'
};
},
getTooltipLabel() {
return this.activeTooltipItem ? this.activeTooltipItem.label : '';
},
showTooltip() {
if (!window.matchMedia('(hover: hover) and (pointer: fine)').matches) return;
this.activeTooltipItem = JSON.parse(this.$event.currentTarget.dataset.tooltip);
this.tooltipPositionElement = this.$event.currentTarget;
},
hideTooltip() {
this.activeTooltipItem = false;
}
}
}
window.addEventListener('alpine:init', () => {
Alpine.data('initLayeredSwatch', initLayeredSwatch)
}, { once: true });
</script>
<script>
function rangeSlider(options, isPriceSlider) {
"use strict";
return {
options: options,
priceSlider: isPriceSlider,
lastThumbUpdatedMax: true,
minfocused: false,
maxfocused: false,
sliderZindex: 20,
messageTemplates: {
"displayOne": '<span class="msg">1 article</span>',
"displayCount": '<span class="msg"><%- count %> articles</span>',
"displayEmpty": '<span class="msg-error">No items in the current range.</span>'
},
minprice: 0,
maxprice: 0,
fromLabel: '',
toLabel: '',
min: 0,
max: 0,
minZindex: 0,
maxZindex: 0,
minthumb: 0,
maxthumb: 0,
message: '',
url: '',
showAdaptiveSlider: false,
intervals: [],
initialize: function () {
this.options = Object.assign({}, this.options, options);
this.url = this.options.urlTemplate;
if (this.options.sliderZindex !== undefined) {
this.sliderZindex = this.options.sliderZindex;
}
this.showAdaptiveSlider = false;
if (this.options.showAdaptiveSlider !== undefined) {
this.showAdaptiveSlider = this.options.showAdaptiveSlider;
}
if (this.options.maxLabelOffset === undefined) {
this.options.maxLabelOffset = 0.01;
}
if (this.options.rate === undefined) {
this.options.rate = 1.0000;
}
if (this.showAdaptiveSlider) {
this._initAdaptiveSliderValues();
} else {
this._initSliderValues();
}
this.mintrigger();
this.maxtrigger();
},
_initSliderValues: function () {
this.rate = parseFloat(this.options.rate);
this.minprice = Math.floor(this.options.currentValue.from * this.rate);
this.maxprice = Math.round(this.options.currentValue.to * this.rate);
this.intervals = this.options.intervals.map(
function(item) { item.value = Math.round(item.value * this.rate); return item}.bind(this)
);
this.min = Math.floor(this.options.minValue * this.rate);
this.max = Math.round(this.options.maxValue * this.rate);
},
_initAdaptiveSliderValues: function () {
this.intervals = this.options.adaptiveIntervals;
this.options.adaptiveIntervals[0].value = Math.floor(this.options.adaptiveIntervals[0].value);
this.minprice = this._getAdaptiveValue(Number(this.options.currentValue.from));
this.maxprice = this._getAdaptiveValue(Number(this.options.currentValue.to));
this.rate = parseFloat(this.options.rate);
this.intervals = this.intervals.map(
function(item) { item.originalValue = Math.ceil(item.originalValue * this.rate); return item}.bind(this)
);
this.min = this.intervals[0].value;
this.max = this.intervals[this.intervals.length - 1].value;
},
mintrigger: function () {
this.lastThumbUpdatedMax = false;
this.validation();
this.minprice = this._getClosestAdaptiveValue(Math.min(this.minprice, this.maxprice));
this.minthumb = ((this.minprice - this.min) / (this.max - this.min)) * 100;
this._onChangeAfter();
},
maxtrigger: function () {
this.lastThumbUpdatedMax = true;
this.validation();
this.maxprice = this._getClosestAdaptiveValue(Math.max(this.maxprice, this.minprice));
this.maxthumb = ((this.maxprice - this.min) / (this.max - this.min)) * 100;
this._onChangeAfter();
},
updateFocusState: function (targetName, stateValue) {
this[`${targetName}focused`] = stateValue
},
_onChangeAfter: function () {
this._updateSliderZindexes();
this._applyRange();
this._refreshDisplay();
},
validation: function () {
if (/^[\d.]*$/.test(this.minprice)) {
if (this.minprice > this.max) {
this.minprice = this._getAdaptiveValue(Number(this.options.currentValue.from));
}
if (this.minprice < this.min) {
this.minprice = this.min;
}
} else {
this.minprice = this._getAdaptiveValue(Number(this.options.currentValue.from));
}
if (/^[\d.]*$/.test(this.maxprice)) {
if (this.maxprice > this.max) {
this.maxprice = this.max;
}
if (this.maxprice < this.min) {
this.maxprice = this._getAdaptiveValue(Number(this.options.currentValue.to));
}
} else {
this.maxprice = this._getAdaptiveValue(Number(this.options.currentValue.to))
}
},
getItemCount: function () {
var from = this.minprice, to = this.maxprice, intervals = this.intervals;
return intervals.map(function (item) {
return item.value >= from && item.value < to ? item.count : 0;
})
.reduce(function (a, b) {
return a + b;
});
},
_refreshDisplay: function () {
this.count = this.getItemCount();
let minprice = this._getOriginalValue(this.minprice);
if (minprice >= this._getOriginalValue(this.max) ) {
minprice = this._getOriginalValue(this.max) - this.options.maxLabelOffset;
}
this.fromLabel = this._formatLabel(minprice);
let maxprice = this._getOriginalValue(this.maxprice) - this.options.maxLabelOffset;
if (maxprice < this._getOriginalValue(this.min)) {
maxprice = this._getOriginalValue(this.maxprice);
}
this.toLabel = this._formatLabel(maxprice);
var messageTemplate = this.messageTemplates[this.count > 0 ? (this.count > 1 ? 'displayCount' : 'displayOne') : 'displayEmpty'];
this.message = this._unescape(messageTemplate.replace('<%- count %>', this.count));
},
_formatLabel: function (value) {
var formattedValue = value;
if (this.priceSlider && this.options.fieldFormat) {
formattedValue = this._formatPrice(value);
} else if (this.options.fieldFormat) {
var pattern = this.options.fieldFormat.pattern || '%s';
formattedValue = pattern.replace(
'%s',
Number.parseFloat(formattedValue).toFixed(this.options.fieldFormat.precision)
);
}
return formattedValue;
},
_formatPrice: function (value) {
var formatter = new Intl.NumberFormat(
document.documentElement.lang,
{
style: 'currency',
currency: 'EUR',
}
);
return formatter.format(value);
},
_applyRange: function () {
var range = {
from : this._getOriginalValue(this.minprice) * (1 / this.rate),
to : this._getOriginalValue(this.maxprice) * (1 / this.rate),
};
this.url = this._unescape(this.options.urlTemplate.replace('<%- from %>', range.from).replace('<%- to %>', range.to));
},
_updateSliderZindexes: function () {
this.minZindex = this.sliderZindex;
this.maxZindex = this.sliderZindex;
if (this.minprice == this.maxprice) {
if (this.minprice === this.min || (this.minprice !== this.min && this.lastThumbUpdatedMax)) {
this.maxZindex = this.sliderZindex + 1;
}
if (this.maxprice === this.max || (this.maxprice !== this.max && !this.lastThumbUpdatedMax)) {
this.minZindex = this.sliderZindex + 1;
}
}
},
_getAdaptiveValue : function (value) {
if (!this.showAdaptiveSlider) {
return value;
}
var adaptiveValue = this.intervals[0].value;
var found = false;
this.intervals.forEach(function (item) {
if (found === false && item.originalValue === value) {
adaptiveValue = item.value;
found = true;
}
if (found === false && item.originalValue < value) {
adaptiveValue = item.value;
}
});
return adaptiveValue;
},
_getClosestAdaptiveValue : function (value) {
if (!this.showAdaptiveSlider) {
return value;
}
var closestValue = this.intervals[0].value;
var found = false;
this.intervals.forEach(function (item) {
if (item.value === value) {
closestValue = value;
found = true;
}
if (found === false && item.value < value) {
closestValue = item.value;
}
});
return closestValue;
},
_getOriginalValue : function (value) {
if (!this.showAdaptiveSlider) {
return value;
}
var originalValue = null;
this.intervals.forEach(function (item) {
if (item.value === value) {
originalValue = item.originalValue;
}
});
return originalValue;
},
_unescape: function (str) {
return str.replace(/<%|%3C%/g, '<%').replace(/%>|%%3E/g, '%>');
},
}
}
</script>
<script>
window.axeptioSettings = {
clientId: '61aa1fa3ca42105043f1ad17',
cookiesVersion: 'avril-base_BtoC_FR',
};
(function (d, s) {
var t = d.getElementsByTagName(s)[0], e = d.createElement(s);
e.async = true;
e.src = "//static.axept.io/sdk.js";
t.parentNode.insertBefore(e, t);
})(document, "script");
</script>
<script type="module">
import { initTracking } from 'https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Adexos_Tracking/js/helper/init.min.js';
import { initGa4Bridge } from 'https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Adexos_Tracking/js/helper/ga4-bridge.min.js';
import * as cookies from 'https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Adexos_Tracking/js/helper/cookies.min.js';
import { onCartSection } from 'https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Adexos_Tracking/js/helper/cart-section.min.js';
import { getItems } from 'https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Avril_Tracking/js/helper/utils.min.js';
import {
getStoredItemData,
getCartStoredItemData,
initDataPersistence,
initCartFromQuote,
updateListContext,
setCookieNames,
clearCartListContext
} from 'https://www.avril-beaute.fr/static/version1791884672/frontend/Avril/hyva/fr_FR/Adexos_Tracking/js/helper/data-persistence.min.js';
window.updateListContext = updateListContext;
window.clearCartListContext = clearCartListContext;
class TrackingEvents {
constructor(options) {
this.options = options;
this.currency = options.currency;
this.cookieAddToCart = options.cookieAddToCart;
this.cookieRemoveFromCart = options.cookieRemoveFromCart;
this.cookieCustomerLogin = options.cookieCustomerLogin;
this.cookieCustomerRegister = options.cookieCustomerRegister;
this.tagId = options.tagId;
this.analytics = options.analytics;
this.gtm = options.gtm;
this.itemHtmlClass = options.itemHtmlClass;
this.listHtmlClass = options.listHtmlClass;
this.itemSelectorId = options.itemSelectorId;
window.dataLayer = window.dataLayer || [];
this.init();
// The tarteaucitron gtag service already sends js/config before calling the tracking
if (options.analyticsDirect === '1' && this.tagId) {
initGa4Bridge(this.tagId, options.tarteaucitron !== '1');
}
}
init() {
const cookieNames = {
cookieKey: this.options.cookieTrackingData,
listCookieKey: this.options.cookieTrackingList,
cartCookieKey: this.options.cookieTrackingCartData,
cartListCookieKey: this.options.cookieTrackingCartList,
};
setCookieNames(cookieNames);
// The page may come from the full page cache: the cart content comes from its private section
onCartSection(cart => initCartFromQuote(cart.tracking_item_ids.map(id => ({item_id: id})), cookies));
initDataPersistence(cookies, cookieNames, this.options.persistentDataKeys || []);
this.subscribeCart();
this.subscribeAjaxCart();
this.subscribeSearch();
this.subscribeCustomer();
this.subscribeSelectItem();
}
subscribeSearch() {
const input = document.querySelector('input[name="q"]');
if (input) {
const form = input.closest('form');
if (form) {
form.addEventListener('submit', e => {
const q = input.value || '';
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'search',
search_term: q
});
});
}
}
}
subscribeCustomer() {
const reg = cookies.get(this.cookieCustomerRegister);
if (reg) {
const data = JSON.parse(reg);
if (data) {
data.email = decodeURIComponent(data.email);
window.dataLayer.push({event: 'sign_up', email: data.email});
}
cookies.clear(this.cookieCustomerRegister);
}
const log = cookies.get(this.cookieCustomerLogin);
if (log) {
const data = JSON.parse(log);
if (data) {
data.email = decodeURIComponent(data.email);
window.dataLayer.push({event: 'login', email: data.email});
}
cookies.clear(this.cookieCustomerLogin);
}
}
subscribeCart() {
this.addToCart();
this.removeFromCart();
}
subscribeAjaxCart() {
const handler = () => this.addToCart();
window.addEventListener('ajax:addToCart', handler);
const removeHandler = () => this.removeFromCart();
window.addEventListener('ajax:removeFromCart', removeHandler);
// Luma triggers these events through jQuery, which RequireJS may not have loaded yet at this point
if (typeof window.require === 'function') {
window.require(['jquery'], $ => {
$(document).on('ajax:addToCart', handler);
$(document).on('ajax:removeFromCart', removeHandler);
});
}
// Hyvä quantity update: re-read cookies after cart form POST completes
window.addEventListener('cart-is-loading', (event) => {
if (event.detail && event.detail.isLoading === false) {
this.addToCart();
this.removeFromCart();
}
});
}
addToCart() {
const rawCookie = cookies.get(this.cookieAddToCart);
if (!rawCookie) return;
try {
const data = JSON.parse(decodeURIComponent(rawCookie));
const items = Array.isArray(data.items) ? data.items : [];
const value = parseFloat(data.value) || 0;
const getPersistedData = (itemId) => {
const cartData = getCartStoredItemData(itemId);
if (cartData.item_list_id) return cartData;
return getStoredItemData(itemId);
};
if (items.length && value > 0) {
window.dataLayer.push({
event: 'add_to_cart',
ecommerce: {
currency: this.currency,
value: value,
items: getItems(items, getPersistedData)
}
});
}
} catch (err) {
console.error('Error parsing add_to_cart cookie:', err);
}
cookies.clear(this.cookieAddToCart);
}
removeFromCart() {
if (cookies.get(this.cookieRemoveFromCart)) {
let data = JSON.parse(decodeURIComponent(cookies.get(this.cookieRemoveFromCart)));
if (data?.value) {
window.dataLayer.push({
event: 'remove_from_cart',
ecommerce: {
currency: this.currency,
value: data.value,
items: getItems(data.items, getCartStoredItemData)
}
});
}
cookies.clear(this.cookieRemoveFromCart);
}
}
subscribeSelectItem() {
const matches = [...document.querySelectorAll(this.listHtmlClass)];
// Several selectors may match nested elements (Luma .products-grid > .product-items): one listener each
const lists = matches.filter(list => !matches.some(other => other !== list && other.contains(list)));
if (!lists.length) return;
lists.forEach(list => {
list.addEventListener('click', (event) => {
// Only a click on a product link selects the item. Controls may sit inside that link
// (add to cart, wishlist) or inside a label (quantity steppers): they stay in the list
if (event.target.closest('button, input, select, label, [role="button"]')) {
return;
}
const link = event.target.closest('a[href]');
if (!link || !list.contains(link)) {
return;
}
const item = event.target.closest(this.itemHtmlClass);
if (!item) return;
const productId = this.getProductId(item);
if (!productId) return;
const result = this.findProductInViewList(productId);
if (!result) return;
const { productData, item_list_id, item_list_name } = result;
window.dataLayer.push({
event: 'select_item',
ecommerce: {
currency: this.currency,
item_list_id,
item_list_name,
items: [productData]
}
});
});
});
}
/**
* The product id comes from the configured container id (product-item-info_1234), or from the
* add to cart form field when the theme does not render such a container (Hyvä default).
*/
getProductId(item) {
const container = this.findProductContainer(item);
if (container) {
return this.extractProductIdFromContainer(container);
}
return item.querySelector('input[name="product"]')?.value || null;
}
findProductContainer(item) {
const baseId = this.itemSelectorId.replace('#', '');
return item.querySelector(`[id^="${baseId}_"]`) ||
item.querySelector(`[id^="${baseId}-"]`);
}
extractProductIdFromContainer(container) {
const baseId = this.itemSelectorId.replace('#', '');
let match = container.id.match(new RegExp(`${baseId}_(\\d+)`));
if (match) return match[1];
match = container.id.match(new RegExp(`${baseId}-(\\d+)`));
return match ? match[1] : null;
}
findProductInViewList(productId) {
if (!window.dataLayer) return null;
const viewEvent = [...window.dataLayer]
.reverse()
.find(e => e.event === 'view_item_list');
if (!viewEvent?.ecommerce?.items) {
return null;
}
const flatItems = viewEvent.ecommerce.items.flat(Infinity);
const productData = flatItems.find(i => i.item_internal_id === productId);
if (!productData) return null;
return {
productData,
item_list_id: viewEvent.ecommerce.item_list_id || null,
item_list_name: viewEvent.ecommerce.item_list_name || null
};
}
}
document.addEventListener('DOMContentLoaded', () => {
initTracking(TrackingEvents, {
currency: "EUR",
cookieAddToCart: "tracking_cookie_add_to_cart",
cookieRemoveFromCart: "tracking_cookie_remove_from_cart",
cookieCustomerLogin: "tracking_cookie_customer_login",
cookieCustomerRegister: "tracking_cookie_customer_register",
axeptio: "1",
tarteaucitron: "",
tagId: "",
analytics: "",
analyticsDirect: "",
matomo: "",
gtmTagId: "GTM\u002DN95VVZ2",
gtm: "1",
itemHtmlClass: ".product\u002Ditem",
listHtmlClass: ".product\u002Ditems",
itemSelectorId: "\u0023product\u002Ditem\u002Dinfo",
cookieTrackingData: "tracking_last_view_item_list_data_product",
cookieTrackingList: "tracking_last_view_item_list_data",
cookieTrackingCartData: "tracking_cart_last_view_item_list_data_product",
cookieTrackingCartList: "tracking_cart_last_view_item_list_data",
persistentDataKeys: ["item_list_id","item_list_name","shopping_tool","position"] }, cookies);
});
</script>
<script data-datalayer-script="1">window.dataLayer = window.dataLayer || [];window.dataLayer.push({ ecommerce: null });window.dataLayer.push({"event":"view_item_list","ecommerce":{"item_list_id":"category_216","item_list_name":"Cadeaux","items":[{"item_id":"2325","item_internal_id":"1932","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Calendrier de l'Avent 2026 - 24 jours pour bien \u00eatre soi","price":94.5,"quantity":1,"position":0,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Coffret cadeau Soin","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Nouveaut\u00e9","item_list_highlight":false},{"item_id":"2293","item_internal_id":"1934","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Essentiels soins","price":22,"quantity":1,"position":1,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 30\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Nouveaut\u00e9","item_list_highlight":false},{"item_id":"2291","item_internal_id":"1928","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Routine soin visage","price":39,"quantity":1,"position":2,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 40\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Nouveaut\u00e9","item_list_highlight":true},{"item_id":"1891","item_internal_id":"1601","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Routine \u00e9clat","price":23,"quantity":1,"position":3,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 30\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Nouveaut\u00e9","item_list_highlight":false},{"item_id":"2294","item_internal_id":"1929","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Rituel douceur","price":30,"quantity":1,"position":4,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 30\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Nouveaut\u00e9","item_list_highlight":false},{"item_id":"2295","item_internal_id":"1931","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Cocooning","price":30,"quantity":1,"position":5,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 30\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Nouveaut\u00e9","item_list_highlight":false},{"item_id":"2296","item_internal_id":"1933","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Essentiels Make-up","price":27,"quantity":1,"position":6,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 30\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Nouveaut\u00e9","item_list_highlight":false},{"item_id":"2292","item_internal_id":"1930","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Mes essentiels rechargeables","price":21,"quantity":1,"position":7,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 30\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Nouveaut\u00e9","item_list_highlight":false},{"item_id":"1872","item_internal_id":"1025","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Mon duo visage quotidien","price":16.5,"quantity":1,"position":8,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"cc4","item_internal_id":"1697","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Trio soins \u00e9clat visage","price":30.5,"quantity":1,"position":9,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"giftcard","item_internal_id":"1913","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Carte cadeau","price":0,"quantity":1,"position":10,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Carte cadeau","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"1873","item_internal_id":"1026","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Duo soins \u00e9clat visage","price":15.5,"quantity":1,"position":11,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"1874","item_internal_id":"1027","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Mon duo visage au masculin","price":16.5,"quantity":1,"position":12,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"1879","item_internal_id":"1032","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Duo soins quotidiens corps","price":16.5,"quantity":1,"position":13,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"1862","item_internal_id":"1037","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Soins parfum\u00e9s visage & corps ","price":22.5,"quantity":1,"position":14,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"1876","item_internal_id":"1035","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Duo soins corps","price":21.5,"quantity":1,"position":15,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"cc1","item_internal_id":"1649","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Rasage & soins visage homme ","price":32.5,"quantity":1,"position":16,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"cc12","item_internal_id":"1738","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Kit d\u00e9couverte Soins visage, corps et maquillage","price":47.8,"quantity":1,"position":17,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"cc14","item_internal_id":"1740","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Duo maquillage & soin paillet\u00e9","price":20.5,"quantity":1,"position":18,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"cc2","item_internal_id":"1653","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Trio soins visage & corps homme","price":22.5,"quantity":1,"position":19,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"cc10","item_internal_id":"1736","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Trio vernis \u00e0 ongles","price":17.5,"quantity":1,"position":20,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"cc7","item_internal_id":"1700","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Coffret cadeau Soins visage peau mature","price":38.5,"quantity":1,"position":21,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"cc15","item_internal_id":"1741","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Kit d\u00e9couverte maquillage","price":57.5,"quantity":1,"position":22,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Coffrets cadeaux","item_category4":"Moins de 20\u20ac","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"oui","item_label":"","item_list_highlight":false},{"item_id":"1848","item_internal_id":"1056","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Petit coffret jaune motif carreaux vide","price":1,"quantity":1,"position":23,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Emballage cadeau","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"","item_list_highlight":false},{"item_id":"1847","item_internal_id":"1057","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Grand coffret jaune motif feuillage vide","price":2,"quantity":1,"position":24,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Emballage cadeau","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"","item_list_highlight":false},{"item_id":"1466","item_internal_id":"573","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Pochon en coton bio Petit mod\u00e8le (12x15cm)","price":4,"quantity":1,"position":25,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Maquillage","item_category2":"Maquillage\t\t\t\t","item_category3":"Palettes de maquillage","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Z\u00e9ro plastique","item_list_highlight":false},{"item_id":"1465","item_internal_id":"572","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Pochon en coton bio Moyen Mod\u00e8le (16x19cm)","price":4.8,"quantity":1,"position":26,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Maquillage","item_category2":"Maquillage\t\t\t\t","item_category3":"Palettes de maquillage","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Z\u00e9ro plastique","item_list_highlight":false},{"item_id":"1464","item_internal_id":"571","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Pochon en coton bio Grand Mod\u00e8le (16x23cm)","price":5,"quantity":1,"position":27,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Maquillage","item_category2":"Maquillage\t\t\t\t","item_category3":"Palettes de maquillage","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Z\u00e9ro plastique","item_list_highlight":false},{"item_id":"1905","item_internal_id":"1688","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Pochon en coton bio Mod\u00e8le XL (25x28cm)","price":6,"quantity":1,"position":28,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Maquillage","item_category2":"Maquillage\t\t\t\t","item_category3":"Palettes de maquillage","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Z\u00e9ro plastique","item_list_highlight":false},{"item_id":"1214","item_internal_id":"582","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Furoshiki Carreaux 52 x 52 cm Coton bio","price":3.5,"quantity":1,"position":29,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Emballage cadeau","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Z\u00e9ro plastique","item_list_highlight":false},{"item_id":"1215","item_internal_id":"583","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Furoshiki Z\u00e8bre 52 x 52 cm Coton bio","price":3.5,"quantity":1,"position":30,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Emballage cadeau","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Z\u00e9ro plastique","item_list_highlight":false},{"item_id":"1213","item_internal_id":"581","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Furoshiki Feuillage 32 x 32 cm Coton bio","price":2.5,"quantity":1,"position":31,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Emballage cadeau","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Z\u00e9ro plastique","item_list_highlight":false},{"item_id":"1212","item_internal_id":"580","item_list_id":"category_216","item_list_name":"Cadeaux","item_name":"Furoshiki P\u00e9tales 32 x 32 cm Coton bio","price":2.5,"quantity":1,"position":32,"item_brand":"Avril beaut\u00e9","item_variant":"","shopping_tool":"catalog_category_view","item_category":"Cadeaux\t\t","item_category2":"Cadeaux","item_category3":"Emballage cadeau","location_id":"ChIJIQBpAG2ahYAR_6128GcTUEo","discount":"non","item_label":"Z\u00e9ro plastique","item_list_highlight":false}]}});window.dataLayer.push({"event":"dataEnrichmentIsReady","page_env":"prod","user_status":"not logged","account_status":"","user_id":"","page_template":"category","page_name_global":"b2c_fr_category"});</script>
<script>
let resizeTimer = null;
setTimeout(() => {
updateImageProperties();
}, 500);
// Gestion du resize
window.addEventListener('resize', () => {
if (resizeTimer) {
clearTimeout(resizeTimer);
}
resizeTimer = setTimeout(() => {
resizeTimer = null;
const event = new Event('resizeend');
window.dispatchEvent(event);
}, 100);
});
window.addEventListener('resizeend', () => {
updateImageProperties();
});
function updateImageProperties() {
const quality = "";
const background = "";
const coverFactor = "2";
document.querySelectorAll('img').forEach(function(img) {
if (img.src.indexOf('media/') === -1) return;
if (img.classList.contains('no-responsive')) return;
let width = img.width;
let height = img.height;
let currentWidth = 0;
if (width > 0 && height > 0) {
img.width = width;
img.height = height;
const widthFactor = width * coverFactor;
const heightFactor = height * coverFactor;
const url = new URL(img.src);
const query = url.searchParams.get("twic");
if (query) {
const match = query.match(/cover=([^/]+)/);
if (match) {
const cover = match[1];
currentWidth = parseInt(cover.split('x')[0]);
}
}
if (widthFactor !== currentWidth) { // To prevent unnecessary loading
if (img.src.indexOf('cover=') !== -1) {
img.src = img.src.replace(/cover=\d+x\d+/, 'cover=' + parseInt(widthFactor) + 'x' + parseInt(heightFactor));
} else {
let newSrc = img.src;
if (quality) {
newSrc += '?twic=v1/cover=' + parseInt(widthFactor) + 'x' + parseInt(heightFactor) + '/quality=' + quality;
} else {
newSrc += '?twic=v1/cover=' + parseInt(widthFactor) + 'x' + parseInt(heightFactor);
}
if (background) {
newSrc += '/background=' + background;
}
img.src = newSrc;
}
}
if (!img.classList.contains('no-full-width')) {
img.style.width = '100%';
}
}
});
}
</script>
<script type="text/json" id="default-section-data">
{"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"AD":{"name":"Andorre"},"AE":{"name":"\u00c9mirats arabes unis"},"AF":{"name":"Afghanistan"},"AG":{"name":"Antigua-et-Barbuda"},"AI":{"name":"Anguilla"},"AL":{"name":"Albanie","regions":{"512":{"code":"AL-01","name":"Berat"},"513":{"code":"AL-09","name":"Dib\u00ebr"},"514":{"code":"AL-02","name":"Durr\u00ebs"},"515":{"code":"AL-03","name":"Elbasan"},"516":{"code":"AL-04","name":"Fier"},"517":{"code":"AL-05","name":"Gjirokast\u00ebr"},"518":{"code":"AL-06","name":"Kor\u00e7\u00eb"},"519":{"code":"AL-07","name":"Kuk\u00ebs"},"520":{"code":"AL-08","name":"Lezh\u00eb"},"521":{"code":"AL-10","name":"Shkod\u00ebr"},"522":{"code":"AL-11","name":"Tiran\u00eb"},"523":{"code":"AL-12","name":"Vlor\u00eb"}}},"AM":{"name":"Arm\u00e9nie"},"AN":{"name":null},"AO":{"name":"Angola"},"AQ":{"name":"Antarctique"},"AR":{"name":"Argentine","regions":{"525":{"code":"AR-B","name":"Buenos Aires"},"526":{"code":"AR-K","name":"Catamarca"},"527":{"code":"AR-H","name":"Chaco"},"528":{"code":"AR-U","name":"Chubut"},"524":{"code":"AR-C","name":"Ciudad Aut\u00f3noma de Buenos Aires"},"529":{"code":"AR-X","name":"C\u00f3rdoba"},"530":{"code":"AR-W","name":"Corrientes"},"531":{"code":"AR-E","name":"Entre R\u00edos"},"532":{"code":"AR-P","name":"Formosa"},"533":{"code":"AR-Y","name":"Jujuy"},"534":{"code":"AR-L","name":"La Pampa"},"535":{"code":"AR-F","name":"La Rioja"},"536":{"code":"AR-M","name":"Mendoza"},"537":{"code":"AR-N","name":"Misiones"},"538":{"code":"AR-Q","name":"Neuqu\u00e9n"},"539":{"code":"AR-R","name":"R\u00edo Negro"},"540":{"code":"AR-A","name":"Salta"},"541":{"code":"AR-J","name":"San Juan"},"542":{"code":"AR-D","name":"San Luis"},"543":{"code":"AR-Z","name":"Santa Cruz"},"544":{"code":"AR-S","name":"Santa Fe"},"545":{"code":"AR-G","name":"Santiago del Estero"},"546":{"code":"AR-V","name":"Tierra del Fuego"},"547":{"code":"AR-T","name":"Tucum\u00e1n"}}},"AS":{"name":"Samoa am\u00e9ricaines"},"AT":{"name":"Autriche","regions":{"102":{"code":"BL","name":"Burgenland"},"99":{"code":"KN","name":"K\u00e4rnten"},"96":{"code":"NO","name":"Nieder\u00f6sterreich"},"97":{"code":"OO","name":"Ober\u00f6sterreich"},"98":{"code":"SB","name":"Salzburg"},"100":{"code":"ST","name":"Steiermark"},"101":{"code":"TI","name":"Tirol"},"103":{"code":"VB","name":"Vorarlberg"},"95":{"code":"WI","name":"Wien"}}},"AU":{"name":"Australie","regions":{"605":{"code":"ACT","name":"Australian Capital Territory"},"606":{"code":"NSW","name":"New South Wales"},"612":{"code":"NT","name":"Northern Territory"},"608":{"code":"QLD","name":"Queensland"},"609":{"code":"SA","name":"South Australia"},"610":{"code":"TAS","name":"Tasmania"},"607":{"code":"VIC","name":"Victoria"},"611":{"code":"WA","name":"Western Australia"}}},"AW":{"name":"Aruba"},"AX":{"name":"\u00celes \u00c5land"},"AZ":{"name":"Azerba\u00efdjan"},"BA":{"name":"Bosnie-Herz\u00e9govine"},"BB":{"name":"Barbade"},"BD":{"name":"Bangladesh"},"BE":{"name":"Belgique","regions":{"620":{"code":"VAN","name":"Antwerpen"},"621":{"code":"WBR","name":"Brabant wallon"},"622":{"code":"BRU","name":"Brussels-Capital Region"},"623":{"code":"WHT","name":"Hainaut"},"625":{"code":"WLG","name":"Li\u00e8ge"},"624":{"code":"VLI","name":"Limburg"},"626":{"code":"WLX","name":"Luxembourg"},"627":{"code":"WNA","name":"Namur"},"628":{"code":"VOV","name":"Oost-Vlaanderen"},"629":{"code":"VBR","name":"Vlaams-Brabant"},"630":{"code":"VWV","name":"West-Vlaanderen"}}},"BF":{"name":"Burkina Faso"},"BG":{"name":"Bulgarie","regions":{"640":{"code":"BG-01","name":"Blagoevgrad"},"641":{"code":"BG-02","name":"Burgas"},"647":{"code":"BG-08","name":"Dobrich"},"646":{"code":"BG-07","name":"Gabrovo"},"665":{"code":"BG-26","name":"Haskovo"},"648":{"code":"BG-09","name":"Kardzhali"},"649":{"code":"BG-10","name":"Kyustendil"},"650":{"code":"BG-11","name":"Lovech"},"651":{"code":"BG-12","name":"Montana"},"652":{"code":"BG-13","name":"Pazardzhik"},"653":{"code":"BG-14","name":"Pernik"},"654":{"code":"BG-15","name":"Pleven"},"655":{"code":"BG-16","name":"Plovdiv"},"656":{"code":"BG-17","name":"Razgrad"},"657":{"code":"BG-18","name":"Ruse"},"666":{"code":"BG-27","name":"Shumen"},"658":{"code":"BG-19","name":"Silistra"},"659":{"code":"BG-20","name":"Sliven"},"660":{"code":"BG-21","name":"Smolyan"},"661":{"code":"BG-22","name":"Sofia City"},"662":{"code":"BG-23","name":"Sofia Province"},"663":{"code":"BG-24","name":"Stara Zagora"},"664":{"code":"BG-25","name":"Targovishte"},"642":{"code":"BG-03","name":"Varna"},"643":{"code":"BG-04","name":"Veliko Tarnovo"},"644":{"code":"BG-05","name":"Vidin"},"645":{"code":"BG-06","name":"Vratsa"},"667":{"code":"BG-28","name":"Yambol"}}},"BH":{"name":"Bahre\u00efn"},"BI":{"name":"Burundi"},"BJ":{"name":"B\u00e9nin"},"BL":{"name":"Saint-Barth\u00e9lemy"},"BM":{"name":"Bermudes"},"BN":{"name":"Brunei"},"BO":{"name":"Bolivie","regions":{"632":{"code":"BO-H","name":"Chuquisaca"},"631":{"code":"BO-C","name":"Cochabamba"},"633":{"code":"BO-B","name":"El Beni"},"634":{"code":"BO-L","name":"La Paz"},"635":{"code":"BO-O","name":"Oruro"},"636":{"code":"BO-N","name":"Pando"},"637":{"code":"BO-P","name":"Potos\u00ed"},"638":{"code":"BO-S","name":"Santa Cruz"},"639":{"code":"BO-T","name":"Tarija"}}},"BQ":{"name":"Pays-Bas carib\u00e9ens"},"BR":{"name":"Br\u00e9sil","regions":{"485":{"code":"AC","name":"Acre"},"486":{"code":"AL","name":"Alagoas"},"487":{"code":"AP","name":"Amap\u00e1"},"488":{"code":"AM","name":"Amazonas"},"489":{"code":"BA","name":"Bahia"},"490":{"code":"CE","name":"Cear\u00e1"},"511":{"code":"DF","name":"Distrito Federal"},"491":{"code":"ES","name":"Esp\u00edrito Santo"},"492":{"code":"GO","name":"Goi\u00e1s"},"493":{"code":"MA","name":"Maranh\u00e3o"},"494":{"code":"MT","name":"Mato Grosso"},"495":{"code":"MS","name":"Mato Grosso do Sul"},"496":{"code":"MG","name":"Minas Gerais"},"497":{"code":"PA","name":"Par\u00e1"},"498":{"code":"PB","name":"Para\u00edba"},"499":{"code":"PR","name":"Paran\u00e1"},"500":{"code":"PE","name":"Pernambuco"},"501":{"code":"PI","name":"Piau\u00ed"},"502":{"code":"RJ","name":"Rio de Janeiro"},"503":{"code":"RN","name":"Rio Grande do Norte"},"504":{"code":"RS","name":"Rio Grande do Sul"},"505":{"code":"RO","name":"Rond\u00f4nia"},"506":{"code":"RR","name":"Roraima"},"507":{"code":"SC","name":"Santa Catarina"},"508":{"code":"SP","name":"S\u00e3o Paulo"},"509":{"code":"SE","name":"Sergipe"},"510":{"code":"TO","name":"Tocantins"}}},"BS":{"name":"Bahamas"},"BT":{"name":"Bhoutan"},"BV":{"name":"\u00cele Bouvet"},"BW":{"name":"Botswana"},"BY":{"name":"Bi\u00e9lorussie","regions":{"613":{"code":"BY-BR","name":"Bresckaja voblas\u0107"},"614":{"code":"BY-HO","name":"Homie\u013askaja voblas\u0107"},"615":{"code":"BY-HM","name":"Horad Minsk"},"616":{"code":"BY-HR","name":"Hrodzienskaja voblas\u0107"},"617":{"code":"BY-MA","name":"Mahilio\u016dskaja voblas\u0107"},"618":{"code":"BY-MI","name":"Minskaja voblas\u0107"},"619":{"code":"BY-VI","name":"Viciebskaja voblas\u0107"}}},"BZ":{"name":"Belize"},"CA":{"name":"Canada","regions":{"66":{"code":"AB","name":"Alberta"},"67":{"code":"BC","name":"British Columbia"},"68":{"code":"MB","name":"Manitoba"},"70":{"code":"NB","name":"New Brunswick"},"69":{"code":"NL","name":"Newfoundland and Labrador"},"72":{"code":"NT","name":"Northwest Territories"},"71":{"code":"NS","name":"Nova Scotia"},"73":{"code":"NU","name":"Nunavut"},"74":{"code":"ON","name":"Ontario"},"75":{"code":"PE","name":"Prince Edward Island"},"76":{"code":"QC","name":"Quebec"},"77":{"code":"SK","name":"Saskatchewan"},"78":{"code":"YT","name":"Yukon Territory"}}},"CC":{"name":"\u00celes Cocos"},"CD":{"name":"Congo-Kinshasa"},"CF":{"name":"R\u00e9publique centrafricaine"},"CG":{"name":"Congo-Brazzaville"},"CH":{"name":"Suisse","regions":{"104":{"code":"AG","name":"Aargau"},"106":{"code":"AR","name":"Appenzell Ausserrhoden"},"105":{"code":"AI","name":"Appenzell Innerrhoden"},"108":{"code":"BL","name":"Basel-Landschaft"},"109":{"code":"BS","name":"Basel-Stadt"},"107":{"code":"BE","name":"Bern"},"110":{"code":"FR","name":"Friburg"},"111":{"code":"GE","name":"Geneva"},"112":{"code":"GL","name":"Glarus"},"113":{"code":"GR","name":"Graub\u00fcnden"},"114":{"code":"JU","name":"Jura"},"115":{"code":"LU","name":"Lucerne"},"116":{"code":"NE","name":"Neuch\u00e2tel"},"117":{"code":"NW","name":"Nidwalden"},"118":{"code":"OW","name":"Obwalden"},"120":{"code":"SH","name":"Schaffhausen"},"122":{"code":"SZ","name":"Schwyz"},"121":{"code":"SO","name":"Solothurn"},"119":{"code":"SG","name":"St. Gallen"},"123":{"code":"TG","name":"Thurgau"},"124":{"code":"TI","name":"Ticino"},"125":{"code":"UR","name":"Uri"},"126":{"code":"VD","name":"Vaud"},"127":{"code":"VS","name":"Wallis"},"128":{"code":"ZG","name":"Zug"},"129":{"code":"ZH","name":"Z\u00fcrich"}}},"CI":{"name":"C\u00f4te d\u2019Ivoire"},"CK":{"name":"\u00celes Cook"},"CL":{"name":"Chili","regions":{"668":{"code":"CL-AI","name":"Ais\u00e9n del General Carlos Iba\u00f1ez del Campo"},"669":{"code":"CL-AN","name":"Antofagasta"},"670":{"code":"CL-AP","name":"Arica y Parinacota"},"672":{"code":"CL-AT","name":"Atacama"},"673":{"code":"CL-BI","name":"Biob\u00edo"},"674":{"code":"CL-CO","name":"Coquimbo"},"671":{"code":"CL-AR","name":"La Araucan\u00eda"},"675":{"code":"CL-LI","name":"Libertador General Bernardo O'Higgins"},"676":{"code":"CL-LL","name":"Los Lagos"},"677":{"code":"CL-LR","name":"Los R\u00edos"},"678":{"code":"CL-MA","name":"Magallanes"},"679":{"code":"CL-ML","name":"Maule"},"680":{"code":"CL-NB","name":"\u00d1uble"},"681":{"code":"CL-RM","name":"Regi\u00f3n Metropolitana de Santiago"},"682":{"code":"CL-TA","name":"Tarapac\u00e1"},"683":{"code":"CL-VS","name":"Valpara\u00edso"}}},"CM":{"name":"Cameroun"},"CN":{"name":"Chine","regions":{"684":{"code":"CN-AH","name":"Anhui Sheng"},"685":{"code":"CN-BJ","name":"Beijing Shi"},"686":{"code":"CN-CQ","name":"Chongqing Shi"},"687":{"code":"CN-FJ","name":"Fujian Sheng"},"688":{"code":"CN-GS","name":"Gansu Sheng"},"689":{"code":"CN-GD","name":"Guangdong Sheng"},"690":{"code":"CN-GX","name":"Guangxi Zhuangzu Zizhiqu"},"691":{"code":"CN-GZ","name":"Guizhou Sheng"},"692":{"code":"CN-HI","name":"Hainan Sheng"},"693":{"code":"CN-HE","name":"Hebei Sheng"},"694":{"code":"CN-HL","name":"Heilongjiang Sheng"},"695":{"code":"CN-HA","name":"Henan Sheng"},"696":{"code":"CN-HK","name":"Hong Kong SAR"},"697":{"code":"CN-HB","name":"Hubei Sheng"},"698":{"code":"CN-HN","name":"Hunan Sheng"},"699":{"code":"CN-JS","name":"Jiangsu Sheng"},"700":{"code":"CN-JX","name":"Jiangxi Sheng"},"701":{"code":"CN-JL","name":"Jilin Sheng"},"702":{"code":"CN-LN","name":"Liaoning Sheng"},"703":{"code":"CN-MO","name":"Macao SAR"},"704":{"code":"CN-NM","name":"Nei Mongol Zizhiqu"},"705":{"code":"CN-NX","name":"Ningxia Huizi Zizhiqu"},"706":{"code":"CN-QH","name":"Qinghai Sheng"},"707":{"code":"CN-SN","name":"Shaanxi Sheng"},"708":{"code":"CN-SD","name":"Shandong Sheng"},"709":{"code":"CN-SH","name":"Shanghai Shi"},"710":{"code":"CN-SX","name":"Shanxi Sheng"},"711":{"code":"CN-SC","name":"Sichuan Sheng"},"712":{"code":"CN-TW","name":"Taiwan Sheng"},"713":{"code":"CN-TJ","name":"Tianjin Shi"},"714":{"code":"CN-XJ","name":"Xinjiang Uygur Zizhiqu"},"715":{"code":"CN-XZ","name":"Xizang Zizhiqu"},"716":{"code":"CN-YN","name":"Yunnan Sheng"},"717":{"code":"CN-ZJ","name":"Zhejiang Sheng"}}},"CO":{"name":"Colombie","regions":{"718":{"code":"CO-AMA","name":"Amazonas"},"719":{"code":"CO-ANT","name":"Antioquia"},"720":{"code":"CO-ARA","name":"Arauca"},"721":{"code":"CO-ATL","name":"Atl\u00e1ntico"},"722":{"code":"CO-BOL","name":"Bol\u00edvar"},"723":{"code":"CO-BOY","name":"Boyac\u00e1"},"724":{"code":"CO-CAL","name":"Caldas"},"725":{"code":"CO-CAQ","name":"Caquet\u00e1"},"726":{"code":"CO-CAS","name":"Casanare"},"727":{"code":"CO-CAU","name":"Cauca"},"728":{"code":"CO-CES","name":"Cesar"},"729":{"code":"CO-CHO","name":"Choc\u00f3"},"730":{"code":"CO-COR","name":"C\u00f3rdoba"},"731":{"code":"CO-CUN","name":"Cundinamarca"},"732":{"code":"CO-GUA","name":"Guain\u00eda"},"733":{"code":"CO-GUV","name":"Guaviare"},"734":{"code":"CO-HUL","name":"Huila"},"735":{"code":"CO-LAG","name":"La Guajira"},"736":{"code":"CO-MAG","name":"Magdalena"},"737":{"code":"CO-MET","name":"Meta"},"738":{"code":"CO-NAR","name":"Nari\u00f1o"},"739":{"code":"CO-NSA","name":"Norte de Santander"},"740":{"code":"CO-PUT","name":"Putumayo"},"741":{"code":"CO-QUI","name":"Quind\u00edo"},"742":{"code":"CO-RIS","name":"Risaralda"},"743":{"code":"CO-SAP","name":"San Andr\u00e9s y Providencia"},"744":{"code":"CO-SAN","name":"Santander"},"745":{"code":"CO-SUC","name":"Sucre"},"746":{"code":"CO-TOL","name":"Tolima"},"747":{"code":"CO-VAC","name":"Valle del Cauca"},"748":{"code":"CO-VAU","name":"Vaup\u00e9s"},"749":{"code":"CO-VID","name":"Vichada"}}},"CR":{"name":"Costa Rica","regions":{"1125":{"code":"CR-AL","name":"Alajuela"},"1126":{"code":"CR-CA","name":"Cartago"},"1128":{"code":"CR-GU","name":"Guanacaste"},"1127":{"code":"CR-HE","name":"Heredia"},"1130":{"code":"CR-LI","name":"Lim\u00f3n"},"1129":{"code":"CR-PU","name":"Puntarenas"},"1124":{"code":"CR-SJ","name":"San Jos\u00e9"}}},"CU":{"name":"Cuba"},"CV":{"name":"Cap-Vert"},"CW":{"name":"Cura\u00e7ao"},"CX":{"name":"\u00cele Christmas"},"CY":{"name":"Chypre"},"CZ":{"name":"Tch\u00e9quie","regions":{"752":{"code":"CZ-31","name":"Jiho\u010desk\u00fd kraj"},"760":{"code":"CZ-64","name":"Jihomoravsk\u00fd kraj"},"754":{"code":"CZ-41","name":"Karlovarsk\u00fd kraj"},"759":{"code":"CZ-63","name":"Kraj Vyso\u010dina"},"757":{"code":"CZ-52","name":"Kr\u00e1lov\u00e9hradeck\u00fd kraj"},"756":{"code":"CZ-51","name":"Libereck\u00fd kraj"},"763":{"code":"CZ-80","name":"Moravskoslezsk\u00fd kraj"},"761":{"code":"CZ-71","name":"Olomouck\u00fd kraj"},"758":{"code":"CZ-53","name":"Pardubick\u00fd kraj"},"753":{"code":"CZ-32","name":"Plze\u0148sk\u00fd kraj"},"750":{"code":"CZ-10","name":"Praha, Hlavn\u00ed m\u011bsto"},"751":{"code":"CZ-20","name":"St\u0159edo\u010desk\u00fd kraj"},"755":{"code":"CZ-42","name":"\u00dasteck\u00fd kraj"},"762":{"code":"CZ-72","name":"Zl\u00ednsk\u00fd kraj"}}},"DE":{"name":"Allemagne","regions":{"80":{"code":"BAW","name":"Baden-W\u00fcrttemberg"},"81":{"code":"BAY","name":"Bayern"},"82":{"code":"BER","name":"Berlin"},"83":{"code":"BRG","name":"Brandenburg"},"84":{"code":"BRE","name":"Bremen"},"85":{"code":"HAM","name":"Hamburg"},"86":{"code":"HES","name":"Hessen"},"87":{"code":"MEC","name":"Mecklenburg-Vorpommern"},"79":{"code":"NDS","name":"Niedersachsen"},"88":{"code":"NRW","name":"Nordrhein-Westfalen"},"89":{"code":"RHE","name":"Rheinland-Pfalz"},"90":{"code":"SAR","name":"Saarland"},"91":{"code":"SAS","name":"Sachsen"},"92":{"code":"SAC","name":"Sachsen-Anhalt"},"93":{"code":"SCN","name":"Schleswig-Holstein"},"94":{"code":"THE","name":"Th\u00fcringen"}}},"DJ":{"name":"Djibouti"},"DK":{"name":"Danemark","regions":{"764":{"code":"DK-84","name":"Hovedstaden"},"765":{"code":"DK-82","name":"Midtjylland"},"766":{"code":"DK-81","name":"Nordjylland"},"767":{"code":"DK-85","name":"Sj\u00e6lland"},"768":{"code":"DK-83","name":"Syddanmark"}}},"DM":{"name":"Dominique"},"DO":{"name":"R\u00e9publique dominicaine"},"DZ":{"name":"Alg\u00e9rie"},"EC":{"name":"\u00c9quateur","regions":{"769":{"code":"EC-A","name":"Azuay"},"770":{"code":"EC-B","name":"Bol\u00edvar"},"771":{"code":"EC-F","name":"Ca\u00f1ar"},"772":{"code":"EC-C","name":"Carchi"},"773":{"code":"EC-H","name":"Chimborazo"},"774":{"code":"EC-X","name":"Cotopaxi"},"775":{"code":"EC-O","name":"El Oro"},"776":{"code":"EC-E","name":"Esmeraldas"},"777":{"code":"EC-W","name":"Gal\u00e1pagos"},"778":{"code":"EC-G","name":"Guayas"},"779":{"code":"EC-I","name":"Imbabura"},"780":{"code":"EC-L","name":"Loja"},"781":{"code":"EC-R","name":"Los R\u00edos"},"782":{"code":"EC-M","name":"Manab\u00ed"},"783":{"code":"EC-S","name":"Morona Santiago"},"784":{"code":"EC-N","name":"Napo"},"785":{"code":"EC-D","name":"Orellana"},"786":{"code":"EC-Y","name":"Pastaza"},"787":{"code":"EC-P","name":"Pichincha"},"788":{"code":"EC-SE","name":"Santa Elena"},"789":{"code":"EC-SD","name":"Santo Domingo de los Ts\u00e1chilas"},"790":{"code":"EC-U","name":"Sucumb\u00edos"},"791":{"code":"EC-T","name":"Tungurahua"},"792":{"code":"EC-Z","name":"Zamora Chinchipe"}}},"EE":{"name":"Estonie","regions":{"340":{"code":"EE-37","name":"Harjumaa"},"341":{"code":"EE-39","name":"Hiiumaa"},"342":{"code":"EE-44","name":"Ida-Virumaa"},"344":{"code":"EE-51","name":"J\u00e4rvamaa"},"343":{"code":"EE-49","name":"J\u00f5gevamaa"},"346":{"code":"EE-59","name":"L\u00e4\u00e4ne-Virumaa"},"345":{"code":"EE-57","name":"L\u00e4\u00e4nemaa"},"348":{"code":"EE-67","name":"P\u00e4rnumaa"},"347":{"code":"EE-65","name":"P\u00f5lvamaa"},"349":{"code":"EE-70","name":"Raplamaa"},"350":{"code":"EE-74","name":"Saaremaa"},"351":{"code":"EE-78","name":"Tartumaa"},"352":{"code":"EE-82","name":"Valgamaa"},"353":{"code":"EE-84","name":"Viljandimaa"},"354":{"code":"EE-86","name":"V\u00f5rumaa"}}},"EG":{"name":"\u00c9gypte"},"EH":{"name":"Sahara occidental"},"ER":{"name":"\u00c9rythr\u00e9e"},"ES":{"name":"Espagne","regions":{"130":{"code":"A Coru\u0441a","name":"A Coru\u00f1a"},"131":{"code":"Alava","name":"Alava"},"132":{"code":"Albacete","name":"Albacete"},"133":{"code":"Alicante","name":"Alicante"},"134":{"code":"Almeria","name":"Almeria"},"135":{"code":"Asturias","name":"Asturias"},"136":{"code":"Avila","name":"Avila"},"137":{"code":"Badajoz","name":"Badajoz"},"138":{"code":"Baleares","name":"Baleares"},"139":{"code":"Barcelona","name":"Barcelona"},"140":{"code":"Burgos","name":"Burgos"},"141":{"code":"Caceres","name":"Caceres"},"142":{"code":"Cadiz","name":"Cadiz"},"143":{"code":"Cantabria","name":"Cantabria"},"144":{"code":"Castellon","name":"Castellon"},"145":{"code":"Ceuta","name":"Ceuta"},"146":{"code":"Ciudad Real","name":"Ciudad Real"},"147":{"code":"Cordoba","name":"Cordoba"},"148":{"code":"Cuenca","name":"Cuenca"},"149":{"code":"Girona","name":"Girona"},"150":{"code":"Granada","name":"Granada"},"151":{"code":"Guadalajara","name":"Guadalajara"},"152":{"code":"Guipuzcoa","name":"Guipuzcoa"},"153":{"code":"Huelva","name":"Huelva"},"154":{"code":"Huesca","name":"Huesca"},"155":{"code":"Jaen","name":"Jaen"},"156":{"code":"La Rioja","name":"La Rioja"},"157":{"code":"Las Palmas","name":"Las Palmas"},"158":{"code":"Leon","name":"Leon"},"159":{"code":"Lleida","name":"Lleida"},"160":{"code":"Lugo","name":"Lugo"},"161":{"code":"Madrid","name":"Madrid"},"162":{"code":"Malaga","name":"Malaga"},"163":{"code":"Melilla","name":"Melilla"},"164":{"code":"Murcia","name":"Murcia"},"165":{"code":"Navarra","name":"Navarra"},"166":{"code":"Ourense","name":"Ourense"},"167":{"code":"Palencia","name":"Palencia"},"168":{"code":"Pontevedra","name":"Pontevedra"},"169":{"code":"Salamanca","name":"Salamanca"},"170":{"code":"Santa Cruz de Tenerife","name":"Santa Cruz de Tenerife"},"171":{"code":"Segovia","name":"Segovia"},"172":{"code":"Sevilla","name":"Sevilla"},"173":{"code":"Soria","name":"Soria"},"174":{"code":"Tarragona","name":"Tarragona"},"175":{"code":"Teruel","name":"Teruel"},"176":{"code":"Toledo","name":"Toledo"},"177":{"code":"Valencia","name":"Valencia"},"178":{"code":"Valladolid","name":"Valladolid"},"179":{"code":"Vizcaya","name":"Vizcaya"},"180":{"code":"Zamora","name":"Zamora"},"181":{"code":"Zaragoza","name":"Zaragoza"}}},"ET":{"name":"\u00c9thiopie"},"FI":{"name":"Finlande","regions":{"339":{"code":"Ahvenanmaa","name":"Ahvenanmaa"},"333":{"code":"Etel\u00e4-Karjala","name":"Etel\u00e4-Karjala"},"326":{"code":"Etel\u00e4-Pohjanmaa","name":"Etel\u00e4-Pohjanmaa"},"325":{"code":"Etel\u00e4-Savo","name":"Etel\u00e4-Savo"},"337":{"code":"It\u00e4-Uusimaa","name":"It\u00e4-Uusimaa"},"322":{"code":"Kainuu","name":"Kainuu"},"335":{"code":"Kanta-H\u00e4me","name":"Kanta-H\u00e4me"},"330":{"code":"Keski-Pohjanmaa","name":"Keski-Pohjanmaa"},"331":{"code":"Keski-Suomi","name":"Keski-Suomi"},"338":{"code":"Kymenlaakso","name":"Kymenlaakso"},"320":{"code":"Lappi","name":"Lappi"},"334":{"code":"P\u00e4ij\u00e4t-H\u00e4me","name":"P\u00e4ij\u00e4t-H\u00e4me"},"328":{"code":"Pirkanmaa","name":"Pirkanmaa"},"327":{"code":"Pohjanmaa","name":"Pohjanmaa"},"323":{"code":"Pohjois-Karjala","name":"Pohjois-Karjala"},"321":{"code":"Pohjois-Pohjanmaa","name":"Pohjois-Pohjanmaa"},"324":{"code":"Pohjois-Savo","name":"Pohjois-Savo"},"329":{"code":"Satakunta","name":"Satakunta"},"336":{"code":"Uusimaa","name":"Uusimaa"},"332":{"code":"Varsinais-Suomi","name":"Varsinais-Suomi"}}},"FJ":{"name":"Fidji"},"FK":{"name":"\u00celes Malouines"},"FM":{"name":"Micron\u00e9sie"},"FO":{"name":"\u00celes F\u00e9ro\u00e9"},"FR":{"name":"France","regions":{"182":{"code":"1","name":"Ain"},"183":{"code":"2","name":"Aisne"},"184":{"code":"3","name":"Allier"},"185":{"code":"4","name":"Alpes-de-Haute-Provence"},"187":{"code":"6","name":"Alpes-Maritimes"},"188":{"code":"7","name":"Ard\u00e8che"},"189":{"code":"8","name":"Ardennes"},"190":{"code":"9","name":"Ari\u00e8ge"},"191":{"code":"10","name":"Aube"},"192":{"code":"11","name":"Aude"},"193":{"code":"12","name":"Aveyron"},"249":{"code":"67","name":"Bas-Rhin"},"194":{"code":"13","name":"Bouches-du-Rh\u00f4ne"},"195":{"code":"14","name":"Calvados"},"196":{"code":"15","name":"Cantal"},"197":{"code":"16","name":"Charente"},"198":{"code":"17","name":"Charente-Maritime"},"199":{"code":"18","name":"Cher"},"200":{"code":"19","name":"Corr\u00e8ze"},"201":{"code":"2A","name":"Corse-du-Sud"},"203":{"code":"21","name":"C\u00f4te-d'Or"},"204":{"code":"22","name":"C\u00f4tes-d'Armor"},"205":{"code":"23","name":"Creuse"},"261":{"code":"79","name":"Deux-S\u00e8vres"},"206":{"code":"24","name":"Dordogne"},"207":{"code":"25","name":"Doubs"},"208":{"code":"26","name":"Dr\u00f4me"},"273":{"code":"91","name":"Essonne"},"209":{"code":"27","name":"Eure"},"210":{"code":"28","name":"Eure-et-Loir"},"211":{"code":"29","name":"Finist\u00e8re"},"212":{"code":"30","name":"Gard"},"214":{"code":"32","name":"Gers"},"215":{"code":"33","name":"Gironde"},"250":{"code":"68","name":"Haut-Rhin"},"202":{"code":"2B","name":"Haute-Corse"},"213":{"code":"31","name":"Haute-Garonne"},"225":{"code":"43","name":"Haute-Loire"},"234":{"code":"52","name":"Haute-Marne"},"252":{"code":"70","name":"Haute-Sa\u00f4ne"},"256":{"code":"74","name":"Haute-Savoie"},"269":{"code":"87","name":"Haute-Vienne"},"186":{"code":"5","name":"Hautes-Alpes"},"247":{"code":"65","name":"Hautes-Pyr\u00e9n\u00e9es"},"274":{"code":"92","name":"Hauts-de-Seine"},"216":{"code":"34","name":"H\u00e9rault"},"217":{"code":"35","name":"Ille-et-Vilaine"},"218":{"code":"36","name":"Indre"},"219":{"code":"37","name":"Indre-et-Loire"},"220":{"code":"38","name":"Is\u00e8re"},"221":{"code":"39","name":"Jura"},"222":{"code":"40","name":"Landes"},"223":{"code":"41","name":"Loir-et-Cher"},"224":{"code":"42","name":"Loire"},"226":{"code":"44","name":"Loire-Atlantique"},"227":{"code":"45","name":"Loiret"},"228":{"code":"46","name":"Lot"},"229":{"code":"47","name":"Lot-et-Garonne"},"230":{"code":"48","name":"Loz\u00e8re"},"231":{"code":"49","name":"Maine-et-Loire"},"232":{"code":"50","name":"Manche"},"233":{"code":"51","name":"Marne"},"235":{"code":"53","name":"Mayenne"},"236":{"code":"54","name":"Meurthe-et-Moselle"},"237":{"code":"55","name":"Meuse"},"1123":{"code":"98","name":"Monaco"},"238":{"code":"56","name":"Morbihan"},"239":{"code":"57","name":"Moselle"},"240":{"code":"58","name":"Ni\u00e8vre"},"241":{"code":"59","name":"Nord"},"242":{"code":"60","name":"Oise"},"243":{"code":"61","name":"Orne"},"1122":{"code":"OM","name":"Outre-Mer"},"257":{"code":"75","name":"Paris"},"244":{"code":"62","name":"Pas-de-Calais"},"245":{"code":"63","name":"Puy-de-D\u00f4me"},"246":{"code":"64","name":"Pyr\u00e9n\u00e9es-Atlantiques"},"248":{"code":"66","name":"Pyr\u00e9n\u00e9es-Orientales"},"251":{"code":"69","name":"Rh\u00f4ne"},"253":{"code":"71","name":"Sa\u00f4ne-et-Loire"},"254":{"code":"72","name":"Sarthe"},"255":{"code":"73","name":"Savoie"},"259":{"code":"77","name":"Seine-et-Marne"},"258":{"code":"76","name":"Seine-Maritime"},"275":{"code":"93","name":"Seine-Saint-Denis"},"262":{"code":"80","name":"Somme"},"263":{"code":"81","name":"Tarn"},"264":{"code":"82","name":"Tarn-et-Garonne"},"272":{"code":"90","name":"Territoire-de-Belfort"},"277":{"code":"95","name":"Val-d'Oise"},"276":{"code":"94","name":"Val-de-Marne"},"265":{"code":"83","name":"Var"},"266":{"code":"84","name":"Vaucluse"},"267":{"code":"85","name":"Vend\u00e9e"},"268":{"code":"86","name":"Vienne"},"270":{"code":"88","name":"Vosges"},"271":{"code":"89","name":"Yonne"},"260":{"code":"78","name":"Yvelines"}}},"GA":{"name":"Gabon"},"GB":{"name":"Royaume-Uni"},"GD":{"name":"Grenade"},"GE":{"name":"G\u00e9orgie"},"GF":{"name":"Guyane fran\u00e7aise"},"GG":{"name":"Guernesey"},"GH":{"name":"Ghana"},"GI":{"name":"Gibraltar"},"GL":{"name":"Groenland"},"GM":{"name":"Gambie"},"GN":{"name":"Guin\u00e9e"},"GP":{"name":"Guadeloupe"},"GQ":{"name":"Guin\u00e9e \u00e9quatoriale"},"GR":{"name":"Gr\u00e8ce","regions":{"806":{"code":"GR-69","name":"\u00c1gion \u00d3ros"},"793":{"code":"GR-A","name":"Anatolik\u00ed Makedon\u00eda kai Thr\u00e1ki"},"794":{"code":"GR-I","name":"Attik\u00ed"},"795":{"code":"GR-G","name":"Dytik\u00ed Ell\u00e1da"},"796":{"code":"GR-C","name":"Dytik\u00ed Makedon\u00eda"},"797":{"code":"GR-F","name":"Ion\u00eda N\u00edsia"},"798":{"code":"GR-D","name":"\u00cdpeiros"},"799":{"code":"GR-B","name":"Kentrik\u00ed Makedon\u00eda"},"800":{"code":"GR-M","name":"Kr\u00edti"},"801":{"code":"GR-L","name":"N\u00f3tio Aiga\u00edo"},"802":{"code":"GR-J","name":"Pelop\u00f3nnisos"},"803":{"code":"GR-H","name":"Stere\u00e1 Ell\u00e1da"},"804":{"code":"GR-E","name":"Thessal\u00eda"},"805":{"code":"GR-K","name":"V\u00f3reio Aiga\u00edo"}}},"GS":{"name":"G\u00e9orgie du Sud-et-les \u00celes Sandwich du Sud"},"GT":{"name":"Guatemala"},"GU":{"name":"Guam"},"GW":{"name":"Guin\u00e9e-Bissau"},"GY":{"name":"Guyana","regions":{"807":{"code":"GY-BA","name":"Barima-Waini"},"808":{"code":"GY-CU","name":"Cuyuni-Mazaruni"},"809":{"code":"GY-DE","name":"Demerara-Mahaica"},"810":{"code":"GY-EB","name":"East Berbice-Corentyne"},"811":{"code":"GY-ES","name":"Essequibo Islands-West Demerara"},"812":{"code":"GY-MA","name":"Mahaica-Berbice"},"813":{"code":"GY-PM","name":"Pomeroon-Supenaam"},"814":{"code":"GY-PT","name":"Potaro-Siparuni"},"815":{"code":"GY-UD","name":"Upper Demerara-Berbice"},"816":{"code":"GY-UT","name":"Upper Takutu-Upper Essequibo"}}},"HK":{"name":"R.A.S. chinoise de Hong Kong"},"HM":{"name":"\u00celes Heard-et-MacDonald"},"HN":{"name":"Honduras"},"HR":{"name":"Croatie","regions":{"554":{"code":"HR-07","name":"Bjelovarsko-bilogorska \u017eupanija"},"559":{"code":"HR-12","name":"Brodsko-posavska \u017eupanija"},"566":{"code":"HR-19","name":"Dubrova\u010dko-neretvanska \u017eupanija"},"568":{"code":"HR-21","name":"Grad Zagreb"},"565":{"code":"HR-18","name":"Istarska \u017eupanija"},"551":{"code":"HR-04","name":"Karlova\u010dka \u017eupanija"},"553":{"code":"HR-06","name":"Koprivni\u010dko-kri\u017eeva\u010dka \u017eupanija"},"549":{"code":"HR-02","name":"Krapinsko-zagorska \u017eupanija"},"556":{"code":"HR-09","name":"Li\u010dko-senjska \u017eupanija"},"567":{"code":"HR-20","name":"Me\u0111imurska \u017eupanija"},"561":{"code":"HR-14","name":"Osje\u010dko-baranjska \u017eupanija"},"558":{"code":"HR-11","name":"Po\u017ee\u0161ko-slavonska \u017eupanija"},"555":{"code":"HR-08","name":"Primorsko-goranska \u017eupanija"},"562":{"code":"HR-15","name":"\u0160ibensko-kninska \u017eupanija"},"550":{"code":"HR-03","name":"Sisa\u010dko-moslava\u010dka \u017eupanija"},"564":{"code":"HR-17","name":"Splitsko-dalmatinska \u017eupanija"},"552":{"code":"HR-05","name":"Vara\u017edinska \u017eupanija"},"557":{"code":"HR-10","name":"Viroviti\u010dko-podravska \u017eupanija"},"563":{"code":"HR-16","name":"Vukovarsko-srijemska \u017eupanija"},"560":{"code":"HR-13","name":"Zadarska \u017eupanija"},"548":{"code":"HR-01","name":"Zagreba\u010dka \u017eupanija"}}},"HT":{"name":"Ha\u00efti"},"HU":{"name":"Hongrie"},"ID":{"name":"Indon\u00e9sie"},"IE":{"name":"Irlande"},"IL":{"name":"Isra\u00ebl"},"IM":{"name":"\u00cele de Man"},"IN":{"name":"Inde","regions":{"569":{"code":"AN","name":"Andaman and Nicobar Islands"},"570":{"code":"AP","name":"Andhra Pradesh"},"571":{"code":"AR","name":"Arunachal Pradesh"},"572":{"code":"AS","name":"Assam"},"573":{"code":"BR","name":"Bihar"},"574":{"code":"CH","name":"Chandigarh"},"575":{"code":"CT","name":"Chhattisgarh"},"576":{"code":"DN","name":"Dadra and Nagar Haveli"},"577":{"code":"DD","name":"Daman and Diu"},"578":{"code":"DL","name":"Delhi"},"579":{"code":"GA","name":"Goa"},"580":{"code":"GJ","name":"Gujarat"},"581":{"code":"HR","name":"Haryana"},"582":{"code":"HP","name":"Himachal Pradesh"},"583":{"code":"JK","name":"Jammu and Kashmir"},"584":{"code":"JH","name":"Jharkhand"},"585":{"code":"KA","name":"Karnataka"},"586":{"code":"KL","name":"Kerala"},"1158":{"code":"LA","name":"Ladakh"},"587":{"code":"LD","name":"Lakshadweep"},"588":{"code":"MP","name":"Madhya Pradesh"},"589":{"code":"MH","name":"Maharashtra"},"590":{"code":"MN","name":"Manipur"},"591":{"code":"ML","name":"Meghalaya"},"592":{"code":"MZ","name":"Mizoram"},"593":{"code":"NL","name":"Nagaland"},"594":{"code":"OR","name":"Odisha"},"595":{"code":"PY","name":"Puducherry"},"596":{"code":"PB","name":"Punjab"},"597":{"code":"RJ","name":"Rajasthan"},"598":{"code":"SK","name":"Sikkim"},"599":{"code":"TN","name":"Tamil Nadu"},"600":{"code":"TG","name":"Telangana"},"601":{"code":"TR","name":"Tripura"},"602":{"code":"UP","name":"Uttar Pradesh"},"603":{"code":"UT","name":"Uttarakhand"},"604":{"code":"WB","name":"West Bengal"}}},"IO":{"name":"Territoire britannique de l\u2019oc\u00e9an Indien"},"IQ":{"name":"Irak"},"IR":{"name":"Iran"},"IS":{"name":"Islande","regions":{"823":{"code":"IS-07","name":"Austurland"},"817":{"code":"IS-01","name":"H\u00f6fu\u00f0borgarsv\u00e6\u00f0i"},"822":{"code":"IS-06","name":"Nor\u00f0urland eystra"},"821":{"code":"IS-05","name":"Nor\u00f0urland vestra"},"824":{"code":"IS-08","name":"Su\u00f0urland"},"818":{"code":"IS-02","name":"Su\u00f0urnes"},"820":{"code":"IS-04","name":"Vestfir\u00f0ir"},"819":{"code":"IS-03","name":"Vesturland"}}},"IT":{"name":"Italie","regions":{"825":{"code":"AG","name":"Agrigento"},"826":{"code":"AL","name":"Alessandria"},"827":{"code":"AN","name":"Ancona"},"828":{"code":"AO","name":"Aosta"},"830":{"code":"AR","name":"Arezzo"},"831":{"code":"AP","name":"Ascoli-Piceno"},"832":{"code":"AT","name":"Asti"},"833":{"code":"AV","name":"Avellino"},"834":{"code":"BA","name":"Bari"},"835":{"code":"BT","name":"Barletta-Andria-Trani"},"836":{"code":"BL","name":"Belluno"},"837":{"code":"BN","name":"Benevento"},"838":{"code":"BG","name":"Bergamo"},"839":{"code":"BI","name":"Biella"},"840":{"code":"BO","name":"Bologna"},"841":{"code":"BZ","name":"Bolzano"},"842":{"code":"BS","name":"Brescia"},"843":{"code":"BR","name":"Brindisi"},"844":{"code":"CA","name":"Cagliari"},"845":{"code":"CL","name":"Caltanissetta"},"846":{"code":"CB","name":"Campobasso"},"847":{"code":"CI","name":"Carbonia Iglesias"},"848":{"code":"CE","name":"Caserta"},"849":{"code":"CT","name":"Catania"},"850":{"code":"CZ","name":"Catanzaro"},"851":{"code":"CH","name":"Chieti"},"852":{"code":"CO","name":"Como"},"853":{"code":"CS","name":"Cosenza"},"854":{"code":"CR","name":"Cremona"},"855":{"code":"KR","name":"Crotone"},"856":{"code":"CN","name":"Cuneo"},"857":{"code":"EN","name":"Enna"},"858":{"code":"FM","name":"Fermo"},"859":{"code":"FE","name":"Ferrara"},"860":{"code":"FI","name":"Firenze"},"861":{"code":"FG","name":"Foggia"},"862":{"code":"FC","name":"Forli-Cesena"},"863":{"code":"FR","name":"Frosinone"},"864":{"code":"GE","name":"Genova"},"865":{"code":"GO","name":"Gorizia"},"866":{"code":"GR","name":"Grosseto"},"867":{"code":"IM","name":"Imperia"},"868":{"code":"IS","name":"Isernia"},"829":{"code":"AQ","name":"L'Aquila"},"869":{"code":"SP","name":"La-Spezia"},"870":{"code":"LT","name":"Latina"},"871":{"code":"LE","name":"Lecce"},"872":{"code":"LC","name":"Lecco"},"873":{"code":"LI","name":"Livorno"},"874":{"code":"LO","name":"Lodi"},"875":{"code":"LU","name":"Lucca"},"876":{"code":"MC","name":"Macerata"},"877":{"code":"MN","name":"Mantova"},"878":{"code":"MS","name":"Massa-Carrara"},"879":{"code":"MT","name":"Matera"},"880":{"code":"VS","name":"Medio Campidano"},"881":{"code":"ME","name":"Messina"},"882":{"code":"MI","name":"Milano"},"883":{"code":"MO","name":"Modena"},"884":{"code":"MB","name":"Monza-Brianza"},"885":{"code":"NA","name":"Napoli"},"886":{"code":"NO","name":"Novara"},"887":{"code":"NU","name":"Nuoro"},"888":{"code":"OG","name":"Ogliastra"},"889":{"code":"OT","name":"Olbia Tempio"},"890":{"code":"OR","name":"Oristano"},"891":{"code":"PD","name":"Padova"},"892":{"code":"PA","name":"Palermo"},"893":{"code":"PR","name":"Parma"},"894":{"code":"PV","name":"Pavia"},"895":{"code":"PG","name":"Perugia"},"896":{"code":"PU","name":"Pesaro-Urbino"},"897":{"code":"PE","name":"Pescara"},"898":{"code":"PC","name":"Piacenza"},"899":{"code":"PI","name":"Pisa"},"900":{"code":"PT","name":"Pistoia"},"901":{"code":"PN","name":"Pordenone"},"902":{"code":"PZ","name":"Potenza"},"903":{"code":"PO","name":"Prato"},"904":{"code":"RG","name":"Ragusa"},"905":{"code":"RA","name":"Ravenna"},"906":{"code":"RC","name":"Reggio-Calabria"},"907":{"code":"RE","name":"Reggio-Emilia"},"908":{"code":"RI","name":"Rieti"},"909":{"code":"RN","name":"Rimini"},"910":{"code":"RM","name":"Roma"},"911":{"code":"RO","name":"Rovigo"},"912":{"code":"SA","name":"Salerno"},"913":{"code":"SS","name":"Sassari"},"914":{"code":"SV","name":"Savona"},"915":{"code":"SI","name":"Siena"},"916":{"code":"SR","name":"Siracusa"},"917":{"code":"SO","name":"Sondrio"},"918":{"code":"TA","name":"Taranto"},"919":{"code":"TE","name":"Teramo"},"920":{"code":"TR","name":"Terni"},"921":{"code":"TO","name":"Torino"},"922":{"code":"TP","name":"Trapani"},"923":{"code":"TN","name":"Trento"},"924":{"code":"TV","name":"Treviso"},"925":{"code":"TS","name":"Trieste"},"926":{"code":"UD","name":"Udine"},"927":{"code":"VA","name":"Varese"},"928":{"code":"VE","name":"Venezia"},"929":{"code":"VB","name":"Verbania"},"930":{"code":"VC","name":"Vercelli"},"931":{"code":"VR","name":"Verona"},"932":{"code":"VV","name":"Vibo-Valentia"},"933":{"code":"VI","name":"Vicenza"},"934":{"code":"VT","name":"Viterbo"}}},"JE":{"name":"Jersey"},"JM":{"name":"Jama\u00efque"},"JO":{"name":"Jordanie"},"JP":{"name":"Japon"},"KE":{"name":"Kenya"},"KG":{"name":"Kirghizstan"},"KH":{"name":"Cambodge"},"KI":{"name":"Kiribati"},"KM":{"name":"Comores"},"KN":{"name":"Saint-Christophe-et-Ni\u00e9v\u00e8s"},"KP":{"name":"Cor\u00e9e du Nord"},"KR":{"name":"Cor\u00e9e du Sud"},"KW":{"name":"Kowe\u00eft"},"KY":{"name":"\u00celes Ca\u00efmans"},"KZ":{"name":"Kazakhstan"},"LA":{"name":"Laos"},"LB":{"name":"Liban"},"LC":{"name":"Sainte-Lucie"},"LI":{"name":"Liechtenstein"},"LK":{"name":"Sri Lanka"},"LR":{"name":"Liberia"},"LS":{"name":"Lesotho"},"LT":{"name":"Lituanie","regions":{"475":{"code":"LT-AL","name":"Alytaus Apskritis"},"476":{"code":"LT-KU","name":"Kauno Apskritis"},"477":{"code":"LT-KL","name":"Klaip\u0117dos Apskritis"},"478":{"code":"LT-MR","name":"Marijampol\u0117s Apskritis"},"479":{"code":"LT-PN","name":"Panev\u0117\u017eio Apskritis"},"480":{"code":"LT-SA","name":"\u0160iauli\u0173 Apskritis"},"481":{"code":"LT-TA","name":"Taurag\u0117s Apskritis"},"482":{"code":"LT-TE","name":"Tel\u0161i\u0173 Apskritis"},"483":{"code":"LT-UT","name":"Utenos Apskritis"},"484":{"code":"LT-VL","name":"Vilniaus Apskritis"}}},"LU":{"name":"Luxembourg"},"LV":{"name":"Lettonie","regions":{"471":{"code":"\u0100da\u017eu novads","name":"\u0100da\u017eu novads"},"366":{"code":"Aglonas novads","name":"Aglonas novads"},"367":{"code":"LV-AI","name":"Aizkraukles novads"},"368":{"code":"Aizputes novads","name":"Aizputes novads"},"369":{"code":"Akn\u012bstes novads","name":"Akn\u012bstes novads"},"370":{"code":"Alojas novads","name":"Alojas novads"},"371":{"code":"Alsungas novads","name":"Alsungas novads"},"372":{"code":"LV-AL","name":"Al\u016bksnes novads"},"373":{"code":"Amatas novads","name":"Amatas novads"},"374":{"code":"Apes novads","name":"Apes novads"},"375":{"code":"Auces novads","name":"Auces novads"},"376":{"code":"Bab\u012btes novads","name":"Bab\u012btes novads"},"377":{"code":"Baldones novads","name":"Baldones novads"},"378":{"code":"Baltinavas novads","name":"Baltinavas novads"},"379":{"code":"LV-BL","name":"Balvu novads"},"380":{"code":"LV-BU","name":"Bauskas novads"},"381":{"code":"Bever\u012bnas novads","name":"Bever\u012bnas novads"},"382":{"code":"Broc\u0113nu novads","name":"Broc\u0113nu novads"},"383":{"code":"Burtnieku novads","name":"Burtnieku novads"},"384":{"code":"Carnikavas novads","name":"Carnikavas novads"},"387":{"code":"LV-CE","name":"C\u0113su novads"},"385":{"code":"Cesvaines novads","name":"Cesvaines novads"},"386":{"code":"Ciblas novads","name":"Ciblas novads"},"388":{"code":"Dagdas novads","name":"Dagdas novads"},"355":{"code":"LV-DGV","name":"Daugavpils"},"389":{"code":"LV-DA","name":"Daugavpils novads"},"390":{"code":"LV-DO","name":"Dobeles novads"},"391":{"code":"Dundagas novads","name":"Dundagas novads"},"392":{"code":"Durbes novads","name":"Durbes novads"},"393":{"code":"Engures novads","name":"Engures novads"},"472":{"code":"\u0112rg\u013cu novads","name":"\u0112rg\u013cu novads"},"394":{"code":"Garkalnes novads","name":"Garkalnes novads"},"395":{"code":"Grobi\u0146as novads","name":"Grobi\u0146as novads"},"396":{"code":"LV-GU","name":"Gulbenes novads"},"397":{"code":"Iecavas novads","name":"Iecavas novads"},"398":{"code":"Ik\u0161\u0137iles novads","name":"Ik\u0161\u0137iles novads"},"399":{"code":"Il\u016bkstes novads","name":"Il\u016bkstes novads"},"400":{"code":"In\u010dukalna novads","name":"In\u010dukalna novads"},"401":{"code":"Jaunjelgavas novads","name":"Jaunjelgavas novads"},"402":{"code":"Jaunpiebalgas novads","name":"Jaunpiebalgas novads"},"403":{"code":"Jaunpils novads","name":"Jaunpils novads"},"357":{"code":"J\u0113kabpils","name":"J\u0113kabpils"},"405":{"code":"LV-JK","name":"J\u0113kabpils novads"},"356":{"code":"LV-JEL","name":"Jelgava"},"404":{"code":"LV-JL","name":"Jelgavas novads"},"358":{"code":"LV-JUR","name":"J\u016brmala"},"406":{"code":"Kandavas novads","name":"Kandavas novads"},"412":{"code":"K\u0101rsavas novads","name":"K\u0101rsavas novads"},"473":{"code":"\u0136eguma novads","name":"\u0136eguma novads"},"474":{"code":"\u0136ekavas novads","name":"\u0136ekavas novads"},"407":{"code":"Kokneses novads","name":"Kokneses novads"},"410":{"code":"LV-KR","name":"Kr\u0101slavas novads"},"408":{"code":"Krimuldas novads","name":"Krimuldas novads"},"409":{"code":"Krustpils novads","name":"Krustpils novads"},"411":{"code":"LV-KU","name":"Kuld\u012bgas novads"},"413":{"code":"Lielv\u0101rdes novads","name":"Lielv\u0101rdes novads"},"359":{"code":"LV-LPX","name":"Liep\u0101ja"},"360":{"code":"LV-LE","name":"Liep\u0101jas novads"},"417":{"code":"L\u012bgatnes novads","name":"L\u012bgatnes novads"},"414":{"code":"LV-LM","name":"Limba\u017eu novads"},"418":{"code":"L\u012bv\u0101nu novads","name":"L\u012bv\u0101nu novads"},"415":{"code":"Lub\u0101nas novads","name":"Lub\u0101nas novads"},"416":{"code":"LV-LU","name":"Ludzas novads"},"419":{"code":"LV-MA","name":"Madonas novads"},"421":{"code":"M\u0101lpils novads","name":"M\u0101lpils novads"},"422":{"code":"M\u0101rupes novads","name":"M\u0101rupes novads"},"420":{"code":"Mazsalacas novads","name":"Mazsalacas novads"},"423":{"code":"Nauk\u0161\u0113nu novads","name":"Nauk\u0161\u0113nu novads"},"424":{"code":"Neretas novads","name":"Neretas novads"},"425":{"code":"N\u012bcas novads","name":"N\u012bcas novads"},"426":{"code":"LV-OG","name":"Ogres novads"},"427":{"code":"Olaines novads","name":"Olaines novads"},"428":{"code":"Ozolnieku novads","name":"Ozolnieku novads"},"432":{"code":"P\u0101rgaujas novads","name":"P\u0101rgaujas novads"},"433":{"code":"P\u0101vilostas novads","name":"P\u0101vilostas novads"},"434":{"code":"P\u013cavi\u0146u novads","name":"P\u013cavi\u0146u novads"},"429":{"code":"LV-PR","name":"Prei\u013cu novads"},"430":{"code":"Priekules novads","name":"Priekules novads"},"431":{"code":"Prieku\u013cu novads","name":"Prieku\u013cu novads"},"435":{"code":"Raunas novads","name":"Raunas novads"},"361":{"code":"LV-REZ","name":"R\u0113zekne"},"442":{"code":"LV-RE","name":"R\u0113zeknes novads"},"436":{"code":"Riebi\u0146u novads","name":"Riebi\u0146u novads"},"362":{"code":"LV-RIX","name":"R\u012bga"},"363":{"code":"LV-RI","name":"R\u012bgas novads"},"437":{"code":"Rojas novads","name":"Rojas novads"},"438":{"code":"Ropa\u017eu novads","name":"Ropa\u017eu novads"},"439":{"code":"Rucavas novads","name":"Rucavas novads"},"440":{"code":"Rug\u0101ju novads","name":"Rug\u0101ju novads"},"443":{"code":"R\u016bjienas novads","name":"R\u016bjienas novads"},"441":{"code":"Rund\u0101les novads","name":"Rund\u0101les novads"},"444":{"code":"Salacgr\u012bvas novads","name":"Salacgr\u012bvas novads"},"445":{"code":"Salas novads","name":"Salas novads"},"446":{"code":"Salaspils novads","name":"Salaspils novads"},"447":{"code":"LV-SA","name":"Saldus novads"},"448":{"code":"Saulkrastu novads","name":"Saulkrastu novads"},"455":{"code":"S\u0113jas novads","name":"S\u0113jas novads"},"449":{"code":"Siguldas novads","name":"Siguldas novads"},"451":{"code":"Skr\u012bveru novads","name":"Skr\u012bveru novads"},"450":{"code":"Skrundas novads","name":"Skrundas novads"},"452":{"code":"Smiltenes novads","name":"Smiltenes novads"},"453":{"code":"Stopi\u0146u novads","name":"Stopi\u0146u novads"},"454":{"code":"Stren\u010du novads","name":"Stren\u010du novads"},"456":{"code":"LV-TA","name":"Talsu novads"},"458":{"code":"T\u0113rvetes novads","name":"T\u0113rvetes novads"},"457":{"code":"LV-TU","name":"Tukuma novads"},"459":{"code":"Vai\u0146odes novads","name":"Vai\u0146odes novads"},"460":{"code":"LV-VK","name":"Valkas novads"},"364":{"code":"Valmiera","name":"Valmiera"},"461":{"code":"LV-VM","name":"Valmieras novads"},"462":{"code":"Varak\u013c\u0101nu novads","name":"Varak\u013c\u0101nu novads"},"469":{"code":"V\u0101rkavas novads","name":"V\u0101rkavas novads"},"463":{"code":"Vecpiebalgas novads","name":"Vecpiebalgas novads"},"464":{"code":"Vecumnieku novads","name":"Vecumnieku novads"},"365":{"code":"LV-VEN","name":"Ventspils"},"465":{"code":"LV-VE","name":"Ventspils novads"},"466":{"code":"Vies\u012btes novads","name":"Vies\u012btes novads"},"467":{"code":"Vi\u013cakas novads","name":"Vi\u013cakas novads"},"468":{"code":"Vi\u013c\u0101nu novads","name":"Vi\u013c\u0101nu novads"},"470":{"code":"Zilupes novads","name":"Zilupes novads"}}},"LY":{"name":"Libye"},"MA":{"name":"Maroc"},"MC":{"name":"Monaco"},"MD":{"name":"Moldavie"},"ME":{"name":"Mont\u00e9n\u00e9gro"},"MF":{"name":"Saint-Martin"},"MG":{"name":"Madagascar"},"MH":{"name":"\u00celes Marshall"},"MK":{"name":"Mac\u00e9doine du Nord"},"ML":{"name":"Mali"},"MM":{"name":"Myanmar (Birmanie)"},"MN":{"name":"Mongolie"},"MO":{"name":"R.A.S. chinoise de Macao"},"MP":{"name":"\u00celes Mariannes du Nord"},"MQ":{"name":"Martinique"},"MR":{"name":"Mauritanie"},"MS":{"name":"Montserrat"},"MT":{"name":"Malte"},"MU":{"name":"Maurice"},"MV":{"name":"Maldives"},"MW":{"name":"Malawi"},"MX":{"name":"Mexique","regions":{"935":{"code":"AGU","name":"Aguascalientes"},"936":{"code":"BCN","name":"Baja California"},"937":{"code":"BCS","name":"Baja California Sur"},"938":{"code":"CAM","name":"Campeche"},"939":{"code":"CHP","name":"Chiapas"},"940":{"code":"CHH","name":"Chihuahua"},"941":{"code":"CMX","name":"Ciudad de M\u00e9xico"},"942":{"code":"COA","name":"Coahuila"},"943":{"code":"COL","name":"Colima"},"944":{"code":"DUR","name":"Durango"},"945":{"code":"MEX","name":"Estado de M\u00e9xico"},"946":{"code":"GUA","name":"Guanajuato"},"947":{"code":"GRO","name":"Guerrero"},"948":{"code":"HID","name":"Hidalgo"},"949":{"code":"JAL","name":"Jalisco"},"950":{"code":"MIC","name":"Michoac\u00e1n"},"951":{"code":"MOR","name":"Morelos"},"952":{"code":"NAY","name":"Nayarit"},"953":{"code":"NLE","name":"Nuevo Le\u00f3n"},"954":{"code":"OAX","name":"Oaxaca"},"955":{"code":"PUE","name":"Puebla"},"956":{"code":"QUE","name":"Quer\u00e9taro"},"957":{"code":"ROO","name":"Quintana Roo"},"958":{"code":"SLP","name":"San Luis Potos\u00ed"},"959":{"code":"SIN","name":"Sinaloa"},"960":{"code":"SON","name":"Sonora"},"961":{"code":"TAB","name":"Tabasco"},"962":{"code":"TAM","name":"Tamaulipas"},"963":{"code":"TLA","name":"Tlaxcala"},"964":{"code":"VER","name":"Veracruz"},"965":{"code":"YUC","name":"Yucat\u00e1n"},"966":{"code":"ZAC","name":"Zacatecas"}}},"MY":{"name":"Malaisie"},"MZ":{"name":"Mozambique"},"NA":{"name":"Namibie"},"NC":{"name":"Nouvelle-Cal\u00e9donie"},"NE":{"name":"Niger"},"NF":{"name":"\u00cele Norfolk"},"NG":{"name":"Nigeria"},"NI":{"name":"Nicaragua"},"NL":{"name":"Pays-Bas"},"NO":{"name":"Norv\u00e8ge"},"NP":{"name":"N\u00e9pal"},"NR":{"name":"Nauru"},"NU":{"name":"Niue"},"NZ":{"name":"Nouvelle-Z\u00e9lande"},"OM":{"name":"Oman"},"PA":{"name":"Panama"},"PE":{"name":"P\u00e9rou","regions":{"986":{"code":"PE-AMA","name":"Amazonas"},"987":{"code":"PE-ANC","name":"Ancash"},"988":{"code":"PE-APU","name":"Apur\u00edmac"},"989":{"code":"PE-ARE","name":"Arequipa"},"990":{"code":"PE-AYA","name":"Ayacucho"},"991":{"code":"PE-CAJ","name":"Cajamarca"},"992":{"code":"PE-CUS","name":"Cusco"},"993":{"code":"PE-CAL","name":"El Callao"},"994":{"code":"PE-HUV","name":"Huancavelica"},"995":{"code":"PE-HUC","name":"Hu\u00e1nuco"},"996":{"code":"PE-ICA","name":"Ica"},"997":{"code":"PE-JUN","name":"Jun\u00edn"},"998":{"code":"PE-LAL","name":"La Libertad"},"999":{"code":"PE-LAM","name":"Lambayeque"},"1000":{"code":"PE-LIM","name":"Lima"},"1001":{"code":"PE-LOR","name":"Loreto"},"1002":{"code":"PE-MDD","name":"Madre de Dios"},"1003":{"code":"PE-MOQ","name":"Moquegua"},"985":{"code":"PE-LMA","name":"Municipalidad Metropolitana de Lima"},"1004":{"code":"PE-PAS","name":"Pasco"},"1005":{"code":"PE-PIU","name":"Piura"},"1006":{"code":"PE-PUN","name":"Puno"},"1007":{"code":"PE-SAM","name":"San Mart\u00edn"},"1008":{"code":"PE-TAC","name":"Tacna"},"1009":{"code":"PE-TUM","name":"Tumbes"},"1010":{"code":"PE-UCA","name":"Ucayali"}}},"PF":{"name":"Polyn\u00e9sie fran\u00e7aise"},"PG":{"name":"Papouasie-Nouvelle-Guin\u00e9e"},"PH":{"name":"Philippines"},"PK":{"name":"Pakistan"},"PL":{"name":"Pologne","regions":{"1011":{"code":"PL-02","name":"dolno\u015bl\u0105skie"},"1012":{"code":"PL-04","name":"kujawsko-pomorskie"},"1013":{"code":"PL-06","name":"lubelskie"},"1014":{"code":"PL-08","name":"lubuskie"},"1017":{"code":"PL-14","name":"mazowieckie"},"1016":{"code":"PL-12","name":"ma\u0142opolskie"},"1018":{"code":"PL-16","name":"opolskie"},"1019":{"code":"PL-18","name":"podkarpackie"},"1020":{"code":"PL-20","name":"podlaskie"},"1021":{"code":"PL-22","name":"pomorskie"},"1022":{"code":"PL-24","name":"\u015bl\u0105skie"},"1023":{"code":"PL-26","name":"\u015bwi\u0119tokrzyskie"},"1024":{"code":"PL-28","name":"warmi\u0144sko-mazurskie"},"1025":{"code":"PL-30","name":"wielkopolskie"},"1026":{"code":"PL-32","name":"zachodniopomorskie"},"1015":{"code":"PL-10","name":"\u0142\u00f3dzkie"}}},"PM":{"name":"Saint-Pierre-et-Miquelon"},"PN":{"name":"\u00celes Pitcairn"},"PS":{"name":"Territoires palestiniens"},"PT":{"name":"Portugal","regions":{"1027":{"code":"PT-01","name":"Aveiro"},"1028":{"code":"PT-02","name":"Beja"},"1029":{"code":"PT-03","name":"Braga"},"1030":{"code":"PT-04","name":"Bragan\u00e7a"},"1031":{"code":"PT-05","name":"Castelo Branco"},"1032":{"code":"PT-06","name":"Coimbra"},"1033":{"code":"PT-07","name":"\u00c9vora"},"1034":{"code":"PT-08","name":"Faro"},"1035":{"code":"PT-09","name":"Guarda"},"1036":{"code":"PT-10","name":"Leiria"},"1037":{"code":"PT-11","name":"Lisboa"},"1038":{"code":"PT-12","name":"Portalegre"},"1039":{"code":"PT-13","name":"Porto"},"1046":{"code":"PT-30","name":"Regi\u00e3o Aut\u00f3noma da Madeira"},"1045":{"code":"PT-20","name":"Regi\u00e3o Aut\u00f3noma dos A\u00e7ores"},"1040":{"code":"PT-14","name":"Santar\u00e9m"},"1041":{"code":"PT-15","name":"Set\u00fabal"},"1042":{"code":"PT-16","name":"Viana do Castelo"},"1043":{"code":"PT-17","name":"Vila Real"},"1044":{"code":"PT-18","name":"Viseu"}}},"PW":{"name":"Palaos"},"PY":{"name":"Paraguay","regions":{"968":{"code":"PY-16","name":"Alto Paraguay"},"969":{"code":"PY-10","name":"Alto Paran\u00e1"},"970":{"code":"PY-13","name":"Amambay"},"967":{"code":"PY-ASU","name":"Asunci\u00f3n"},"971":{"code":"PY-19","name":"Boquer\u00f3n"},"972":{"code":"PY-5","name":"Caaguaz\u00fa"},"973":{"code":"PY-6","name":"Caazap\u00e1"},"974":{"code":"PY-14","name":"Canindey\u00fa"},"975":{"code":"PY-11","name":"Central"},"976":{"code":"PY-1","name":"Concepci\u00f3n"},"977":{"code":"PY-3","name":"Cordillera"},"978":{"code":"PY-4","name":"Guair\u00e1"},"979":{"code":"PY-7","name":"Itap\u00faa"},"980":{"code":"PY-8","name":"Misiones"},"981":{"code":"PY-12","name":"\u00d1eembuc\u00fa"},"982":{"code":"PY-9","name":"Paraguar\u00ed"},"983":{"code":"PY-15","name":"Presidente Hayes"},"984":{"code":"PY-2","name":"San Pedro"}}},"QA":{"name":"Qatar"},"RE":{"name":"La R\u00e9union"},"RO":{"name":"Roumanie","regions":{"278":{"code":"AB","name":"Alba"},"279":{"code":"AR","name":"Arad"},"280":{"code":"AG","name":"Arge\u015f"},"281":{"code":"BC","name":"Bac\u0103u"},"282":{"code":"BH","name":"Bihor"},"283":{"code":"BN","name":"Bistri\u0163a-N\u0103s\u0103ud"},"284":{"code":"BT","name":"Boto\u015fani"},"286":{"code":"BR","name":"Br\u0103ila"},"285":{"code":"BV","name":"Bra\u015fov"},"287":{"code":"B","name":"Bucure\u015fti"},"288":{"code":"BZ","name":"Buz\u0103u"},"290":{"code":"CL","name":"C\u0103l\u0103ra\u015fi"},"289":{"code":"CS","name":"Cara\u015f-Severin"},"291":{"code":"CJ","name":"Cluj"},"292":{"code":"CT","name":"Constan\u0163a"},"293":{"code":"CV","name":"Covasna"},"294":{"code":"DB","name":"D\u00e2mbovi\u0163a"},"295":{"code":"DJ","name":"Dolj"},"296":{"code":"GL","name":"Gala\u0163i"},"297":{"code":"GR","name":"Giurgiu"},"298":{"code":"GJ","name":"Gorj"},"299":{"code":"HR","name":"Harghita"},"300":{"code":"HD","name":"Hunedoara"},"301":{"code":"IL","name":"Ialomi\u0163a"},"302":{"code":"IS","name":"Ia\u015fi"},"303":{"code":"IF","name":"Ilfov"},"304":{"code":"MM","name":"Maramure\u015f"},"305":{"code":"MH","name":"Mehedin\u0163i"},"306":{"code":"MS","name":"Mure\u015f"},"307":{"code":"NT","name":"Neam\u0163"},"308":{"code":"OT","name":"Olt"},"309":{"code":"PH","name":"Prahova"},"311":{"code":"SJ","name":"S\u0103laj"},"310":{"code":"SM","name":"Satu-Mare"},"312":{"code":"SB","name":"Sibiu"},"313":{"code":"SV","name":"Suceava"},"314":{"code":"TR","name":"Teleorman"},"315":{"code":"TM","name":"Timi\u015f"},"316":{"code":"TL","name":"Tulcea"},"318":{"code":"VL","name":"V\u00e2lcea"},"317":{"code":"VS","name":"Vaslui"},"319":{"code":"VN","name":"Vrancea"}}},"RS":{"name":"Serbie"},"RU":{"name":"Russie"},"RW":{"name":"Rwanda"},"SA":{"name":"Arabie saoudite"},"SB":{"name":"\u00celes Salomon"},"SC":{"name":"Seychelles"},"SD":{"name":"Soudan"},"SE":{"name":"Su\u00e8de","regions":{"1057":{"code":"SE-K","name":"Blekinge l\u00e4n"},"1058":{"code":"SE-W","name":"Dalarnas l\u00e4n"},"1060":{"code":"SE-X","name":"G\u00e4vleborgs l\u00e4n"},"1059":{"code":"SE-I","name":"Gotlands l\u00e4n"},"1061":{"code":"SE-N","name":"Hallands l\u00e4n"},"1062":{"code":"SE-Z","name":"J\u00e4mtlands l\u00e4n"},"1063":{"code":"SE-F","name":"J\u00f6nk\u00f6pings l\u00e4n"},"1064":{"code":"SE-H","name":"Kalmar l\u00e4n"},"1065":{"code":"SE-G","name":"Kronobergs l\u00e4n"},"1066":{"code":"SE-BD","name":"Norrbottens l\u00e4n"},"1076":{"code":"SE-T","name":"\u00d6rebro l\u00e4n"},"1077":{"code":"SE-E","name":"\u00d6sterg\u00f6tlands l\u00e4n"},"1067":{"code":"SE-M","name":"Sk\u00e5ne l\u00e4n"},"1069":{"code":"SE-D","name":"S\u00f6dermanlands l\u00e4n"},"1068":{"code":"SE-AB","name":"Stockholms l\u00e4n"},"1070":{"code":"SE-C","name":"Uppsala l\u00e4n"},"1071":{"code":"SE-S","name":"V\u00e4rmlands l\u00e4n"},"1072":{"code":"SE-AC","name":"V\u00e4sterbottens l\u00e4n"},"1073":{"code":"SE-Y","name":"V\u00e4sternorrlands l\u00e4n"},"1074":{"code":"SE-U","name":"V\u00e4stmanlands l\u00e4n"},"1075":{"code":"SE-O","name":"V\u00e4stra G\u00f6talands l\u00e4n"}}},"SG":{"name":"Singapour"},"SH":{"name":"Sainte-H\u00e9l\u00e8ne"},"SI":{"name":"Slov\u00e9nie"},"SJ":{"name":"Svalbard et Jan Mayen"},"SK":{"name":"Slovaquie"},"SL":{"name":"Sierra Leone"},"SM":{"name":"Saint-Marin"},"SN":{"name":"S\u00e9n\u00e9gal"},"SO":{"name":"Somalie"},"SR":{"name":"Suriname","regions":{"1047":{"code":"SR-BR","name":"Brokopondo"},"1048":{"code":"SR-CM","name":"Commewijne"},"1049":{"code":"SR-CR","name":"Coronie"},"1050":{"code":"SR-MA","name":"Marowijne"},"1051":{"code":"SR-NI","name":"Nickerie"},"1052":{"code":"SR-PR","name":"Para"},"1053":{"code":"SR-PM","name":"Paramaribo"},"1054":{"code":"SR-SA","name":"Saramacca"},"1055":{"code":"SR-SI","name":"Sipaliwini"},"1056":{"code":"SR-WA","name":"Wanica"}}},"ST":{"name":"Sao Tom\u00e9-et-Principe"},"SV":{"name":"Salvador"},"SX":{"name":"Saint-Martin (partie n\u00e9erlandaise)"},"SY":{"name":"Syrie"},"SZ":{"name":"Eswatini"},"TC":{"name":"\u00celes Turques-et-Ca\u00efques"},"TD":{"name":"Tchad"},"TF":{"name":"Terres australes fran\u00e7aises"},"TG":{"name":"Togo"},"TH":{"name":"Tha\u00eflande"},"TJ":{"name":"Tadjikistan"},"TK":{"name":"Tokelau"},"TL":{"name":"Timor oriental"},"TM":{"name":"Turkm\u00e9nistan"},"TN":{"name":"Tunisie"},"TO":{"name":"Tonga"},"TR":{"name":"Turquie"},"TT":{"name":"Trinit\u00e9-et-Tobago"},"TV":{"name":"Tuvalu"},"TW":{"name":"Ta\u00efwan"},"TZ":{"name":"Tanzanie"},"UA":{"name":"Ukraine","regions":{"1155":{"code":"UA-43","name":"Avtonomna Respublika Krym"},"1131":{"code":"UA-71","name":"Cherkaska oblast"},"1132":{"code":"UA-74","name":"Chernihivska oblast"},"1133":{"code":"UA-77","name":"Chernivetska oblast"},"1134":{"code":"UA-12","name":"Dnipropetrovska oblast"},"1135":{"code":"UA-14","name":"Donetska oblast"},"1136":{"code":"UA-26","name":"Ivano-Frankivska oblast"},"1137":{"code":"UA-63","name":"Kharkivska oblast"},"1138":{"code":"UA-65","name":"Khersonska oblast"},"1139":{"code":"UA-68","name":"Khmelnytska oblast"},"1140":{"code":"UA-35","name":"Kirovohradska oblast"},"1156":{"code":"UA-30","name":"Kyiv"},"1141":{"code":"UA-32","name":"Kyivska oblast"},"1142":{"code":"UA-09","name":"Luhanska oblast"},"1143":{"code":"UA-46","name":"Lvivska oblast"},"1144":{"code":"UA-48","name":"Mykolaivska oblast"},"1145":{"code":"UA-51","name":"Odeska oblast"},"1146":{"code":"UA-53","name":"Poltavska oblast"},"1147":{"code":"UA-56","name":"Rivnenska oblast"},"1157":{"code":"UA-40","name":"Sevastopol"},"1148":{"code":"UA-59","name":"Sumska oblast"},"1149":{"code":"UA-61","name":"Ternopilska oblast"},"1150":{"code":"UA-05","name":"Vinnytska oblast"},"1151":{"code":"UA-07","name":"Volynska oblast"},"1152":{"code":"UA-21","name":"Zakarpatska oblast"},"1153":{"code":"UA-23","name":"Zaporizka oblast"},"1154":{"code":"UA-18","name":"Zhytomyrska oblast"}}},"UG":{"name":"Ouganda"},"UM":{"name":"\u00celes mineures \u00e9loign\u00e9es des \u00c9tats-Unis"},"US":{"name":"\u00c9tats-Unis","regions":{"1":{"code":"AL","name":"Alabama"},"2":{"code":"AK","name":"Alaska"},"3":{"code":"AS","name":"American Samoa"},"4":{"code":"AZ","name":"Arizona"},"5":{"code":"AR","name":"Arkansas"},"6":{"code":"AE","name":"Armed Forces Africa"},"7":{"code":"AA","name":"Armed Forces Americas"},"8":{"code":"AE","name":"Armed Forces Canada"},"9":{"code":"AE","name":"Armed Forces Europe"},"10":{"code":"AE","name":"Armed Forces Middle East"},"11":{"code":"AP","name":"Armed Forces Pacific"},"12":{"code":"CA","name":"California"},"13":{"code":"CO","name":"Colorado"},"14":{"code":"CT","name":"Connecticut"},"15":{"code":"DE","name":"Delaware"},"16":{"code":"DC","name":"District of Columbia"},"17":{"code":"FM","name":"Federated States Of Micronesia"},"18":{"code":"FL","name":"Florida"},"19":{"code":"GA","name":"Georgia"},"20":{"code":"GU","name":"Guam"},"21":{"code":"HI","name":"Hawaii"},"22":{"code":"ID","name":"Idaho"},"23":{"code":"IL","name":"Illinois"},"24":{"code":"IN","name":"Indiana"},"25":{"code":"IA","name":"Iowa"},"26":{"code":"KS","name":"Kansas"},"27":{"code":"KY","name":"Kentucky"},"28":{"code":"LA","name":"Louisiana"},"29":{"code":"ME","name":"Maine"},"30":{"code":"MH","name":"Marshall Islands"},"31":{"code":"MD","name":"Maryland"},"32":{"code":"MA","name":"Massachusetts"},"33":{"code":"MI","name":"Michigan"},"34":{"code":"MN","name":"Minnesota"},"35":{"code":"MS","name":"Mississippi"},"36":{"code":"MO","name":"Missouri"},"37":{"code":"MT","name":"Montana"},"38":{"code":"NE","name":"Nebraska"},"39":{"code":"NV","name":"Nevada"},"40":{"code":"NH","name":"New Hampshire"},"41":{"code":"NJ","name":"New Jersey"},"42":{"code":"NM","name":"New Mexico"},"43":{"code":"NY","name":"New York"},"44":{"code":"NC","name":"North Carolina"},"45":{"code":"ND","name":"North Dakota"},"46":{"code":"MP","name":"Northern Mariana Islands"},"47":{"code":"OH","name":"Ohio"},"48":{"code":"OK","name":"Oklahoma"},"49":{"code":"OR","name":"Oregon"},"50":{"code":"PW","name":"Palau"},"51":{"code":"PA","name":"Pennsylvania"},"52":{"code":"PR","name":"Puerto Rico"},"53":{"code":"RI","name":"Rhode Island"},"54":{"code":"SC","name":"South Carolina"},"55":{"code":"SD","name":"South Dakota"},"56":{"code":"TN","name":"Tennessee"},"57":{"code":"TX","name":"Texas"},"58":{"code":"UT","name":"Utah"},"59":{"code":"VT","name":"Vermont"},"60":{"code":"VI","name":"Virgin Islands"},"61":{"code":"VA","name":"Virginia"},"62":{"code":"WA","name":"Washington"},"63":{"code":"WV","name":"West Virginia"},"64":{"code":"WI","name":"Wisconsin"},"65":{"code":"WY","name":"Wyoming"}}},"UY":{"name":"Uruguay","regions":{"1078":{"code":"UY-AR","name":"Artigas"},"1079":{"code":"UY-CA","name":"Canelones"},"1080":{"code":"UY-CL","name":"Cerro Largo"},"1081":{"code":"UY-CO","name":"Colonia"},"1082":{"code":"UY-DU","name":"Durazno"},"1083":{"code":"UY-FS","name":"Flores"},"1084":{"code":"UY-FD","name":"Florida"},"1085":{"code":"UY-LA","name":"Lavalleja"},"1086":{"code":"UY-MA","name":"Maldonado"},"1087":{"code":"UY-MO","name":"Montevideo"},"1088":{"code":"UY-PA","name":"Paysandu"},"1089":{"code":"UY-RN","name":"R\u00edo Negro"},"1090":{"code":"UY-RV","name":"Rivera"},"1091":{"code":"UY-RO","name":"Rocha"},"1092":{"code":"UY-SA","name":"Salto"},"1093":{"code":"UY-SJ","name":"San Jos\u00e9"},"1094":{"code":"UY-SO","name":"Soriano"},"1095":{"code":"UY-TA","name":"Tacuaremb\u00f3"},"1096":{"code":"UY-TT","name":"Treinta y Tres"}}},"UZ":{"name":"Ouzb\u00e9kistan"},"VA":{"name":"\u00c9tat de la Cit\u00e9 du Vatican"},"VC":{"name":"Saint-Vincent-et-les Grenadines"},"VE":{"name":"Venezuela","regions":{"1099":{"code":"VE-Z","name":"Amazonas"},"1100":{"code":"VE-B","name":"Anzo\u00e1tegui"},"1101":{"code":"VE-C","name":"Apure"},"1102":{"code":"VE-D","name":"Aragua"},"1103":{"code":"VE-E","name":"Barinas"},"1104":{"code":"VE-F","name":"Bol\u00edvar"},"1105":{"code":"VE-G","name":"Carabobo"},"1106":{"code":"VE-H","name":"Cojedes"},"1107":{"code":"VE-Y","name":"Delta Amacuro"},"1097":{"code":"VE-W","name":"Dependencias Federales"},"1098":{"code":"VE-A","name":"Distrito Capital"},"1108":{"code":"VE-I","name":"Falc\u00f3n"},"1109":{"code":"VE-J","name":"Gu\u00e1rico"},"1110":{"code":"VE-K","name":"Lara"},"1111":{"code":"VE-L","name":"M\u00e9rida"},"1112":{"code":"VE-M","name":"Miranda"},"1113":{"code":"VE-N","name":"Monagas"},"1114":{"code":"VE-O","name":"Nueva Esparta"},"1115":{"code":"VE-P","name":"Portuguesa"},"1116":{"code":"VE-R","name":"Sucre"},"1117":{"code":"VE-S","name":"T\u00e1chira"},"1118":{"code":"VE-T","name":"Trujillo"},"1119":{"code":"VE-X","name":"Vargas"},"1120":{"code":"VE-U","name":"Yaracuy"},"1121":{"code":"VE-V","name":"Zulia"}}},"VG":{"name":"\u00celes Vierges britanniques"},"VI":{"name":"\u00celes Vierges des \u00c9tats-Unis"},"VN":{"name":"Vi\u00eat Nam"},"VU":{"name":"Vanuatu"},"WF":{"name":"Wallis-et-Futuna"},"WS":{"name":"Samoa"},"XK":{"name":"Kosovo"},"YE":{"name":"Y\u00e9men"},"YT":{"name":"Mayotte"},"ZA":{"name":"Afrique du Sud"},"ZM":{"name":"Zambie"},"ZW":{"name":"Zimbabwe"},"data_id":1791965348},"captcha":[],"instant-purchase":[],"loggedAsCustomer":[],"persistent":[],"review":[],"payments":[],"wishlist":{"items":[]},"amasty-storepickup-data":[],"billing_amount_shipping":[],"avrilb2b-homepage-activity":[],"hyva_checkout":[],"payplug-payments-cards":[],"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[],"paypal-buyer-country":[],"connectif":[]}</script>
<script>
window.ajaxCart = (selectors = '.product_addtocart_form', recursive = true) => {
const forms = document.querySelectorAll(selectors);
const createLoader = () => {
const loader = document.createElement('div');
loader.className = 'absolute inset-0 flex justify-center items-center loader';
loader.innerHTML = `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="32" height="32">
<path fill="#fff"
d="M73 50c0-12.7-10.3-23-23-23S27 37.3 27 50m3.9 0c0-10.5 8.5-19.1 19.1-19.1S69.1 39.5 69.1 50">
<animateTransform attributeName="transform" type="rotate" dur="1s"
from="0 50 50" to="360 50 50" repeatCount="indefinite"/>
</path>
</svg>`;
return loader;
};
const getButtonForForm = (form) => {
return form.querySelector('.btn-add-to-cart')
|| form.querySelector('[type="submit"]')
|| (form.id ? document.querySelector(`button[form="${CSS.escape(form.id)}"]`) : null);
};
const setButtonLoading = (button, loader, loading) => {
if (!button) return;
if (loading) {
button.classList.add('relative', 'is-loading');
button.disabled = true;
button.prepend(loader);
} else {
setTimeout(() => {
loader.remove();
button.classList.remove('is-loading');
button.disabled = false;
}, 250);
}
};
forms.forEach(form => {
let isSubmitting = false;
const externalButtons = form.id
? document.querySelectorAll(`button[form="${CSS.escape(form.id)}"]`)
: [];
externalButtons.forEach((button) => {
button.addEventListener('click', (e) => {
e.preventDefault();
if (isSubmitting) return;
if (typeof form.requestSubmit === 'function') {
form.requestSubmit(button);
return;
}
if (typeof form.checkValidity === 'function' && !form.checkValidity()) {
form.reportValidity?.();
return;
}
form.submit();
});
});
form.addEventListener('submit', async (e) => {
e.preventDefault();
// Keep native browser validation (required/email/etc.) before AJAX add-to-cart.
if (typeof form.checkValidity === 'function' && !form.checkValidity()) {
if (typeof form.reportValidity === 'function') {
form.reportValidity();
}
return;
}
if (isSubmitting) return;
isSubmitting = true;
const formData = new FormData(form);
const button = getButtonForForm(form);
const loader = createLoader();
const startTime = Date.now();
externalButtons.forEach(btn => { btn.disabled = true; });
setButtonLoading(button, loader, true);
const getCleanFormAction = (form) => {
try {
const url = new URL(form.action);
['p', 'isAjax', 'q'].forEach(param => url.searchParams.delete(param));
return url.toString();
} catch (e) {
return form.action;
}
};
try {
const response = await fetch(getCleanFormAction(form), {
method: 'POST',
body: formData,
headers: { 'X-Requested-With': 'XMLHttpRequest' }
});
if (!response.ok) {
form.submit();
return;
}
if (response.redirected) {
window.location.href = response.url;
return;
}
const data = await response.json();
if (data.backUrl) {
window.location.href = data.backUrl;
return;
}
window.dispatchEvent(new CustomEvent('reload-customer-section-data'));
if (recursive) {
window.dispatchEvent(new CustomEvent('ajax:addToCart'));
}
} catch (err) {
if (typeof window.dispatchMessages !== 'undefined') {
window.dispatchMessages(
[{ type: 'error', text: 'Il\u0020y\u0020a\u0020eu\u0020un\u0020probl\u00E8me\u0020dans\u0020l\u0027ajout\u0020de\u0020votre\u0020article\u0020au\u0020panier.' }],
5000
);
}
} finally {
document.cookie = 'mage-messages=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
const elapsed = Date.now() - startTime;
const delay = Math.max(0, 250 - elapsed);
setTimeout(() => {
setButtonLoading(button, loader, false);
externalButtons.forEach(btn => { btn.disabled = false; });
isSubmitting = false;
}, delay);
}
});
});
};
window.ajaxCart();
</script>
</div><script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a4a5aa443d627b1d',t:'MTc5MTk3MTI3Mg=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>