.avis-premium-wrapper{--ap-bg: #f9fafc;--ap-card-bg: #ffffff;--ap-text: #1e2a41;--ap-text-muted: #5b6f87;--ap-text-light: #6f7e95;--ap-border: #edf2f9;--ap-border-light: #e2e8f0;--ap-primary: var(--primary-color, #1e2a41);--ap-accent: var(--accent-color, #f5b342);--ap-star-filled: var(--ap-accent);--ap-star-empty: #d1d9e6;--ap-success: #1f7b4d;--ap-success-bg: #eaf6e7;--ap-radius-lg: 28px;--ap-radius-md: 20px;--ap-radius-pill: 60px;--ap-shadow: 0 12px 30px rgba(0,0,0,.05), 0 4px 8px rgba(0,0,0,.02);--ap-shadow-card: 0 5px 18px rgba(0,0,0,.02), 0 0 0 1px rgba(0,0,0,.01);--ap-transition: .25s ease;display:block;width:100%;background:var(--ap-bg);padding:2rem 1rem}.avis-premium-container{max-width:820px;width:100%;margin:0 auto;background:var(--ap-card-bg);border-radius:var(--ap-radius-lg);box-shadow:var(--ap-shadow);padding:2rem 1.8rem;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;line-height:1.5;color:var(--ap-text)}.avis-premium-container *,.avis-premium-container *:before,.avis-premium-container *:after{box-sizing:border-box;margin:0;padding:0}.avis-premium-title{font-size:1.8rem;font-weight:650;color:var(--ap-text);margin-bottom:.25rem;letter-spacing:-.01em}.avis-premium-subtitle{font-size:.95rem;color:var(--ap-text-muted);margin-bottom:1.8rem;border-bottom:1px solid var(--ap-border);padding-bottom:1rem}.avis-premium-header{margin-bottom:1.5rem}.avis-premium-summary{display:flex;flex-wrap:wrap;align-items:center;gap:1.5rem 2.5rem}.avis-premium-average{display:flex;flex-direction:column}.avis-premium-big-score{font-size:3.8rem;font-weight:700;line-height:1;color:var(--ap-text);letter-spacing:-.02em}.avis-premium-stars-wrapper{display:flex;align-items:center;gap:4px;margin:6px 0 4px}.avis-premium-star-filled{color:var(--ap-star-filled)!important;font-size:1.5rem;line-height:1}.avis-premium-star-empty{color:var(--ap-star-empty)!important;font-size:1.5rem;line-height:1}.avis-premium-star-sm.avis-premium-star-filled,.avis-premium-star-sm.avis-premium-star-empty{font-size:1rem!important}.avis-premium-total-text{font-size:.9rem;color:var(--ap-text-muted);margin-top:4px}.avis-premium-trust{font-size:.85rem;color:var(--ap-text-light);margin-top:.5rem;display:flex;align-items:center;gap:6px}.avis-premium-breakdown{flex:1;min-width:240px}.avis-premium-rating-row{display:flex;align-items:center;gap:8px;margin-bottom:6px;transition:all .2s ease}.avis-premium-rating-row:hover{transform:translate(2px)}.avis-premium-rating-row--active{box-shadow:inset 0 0 0 1.5px #00000014}.avis-premium-rating-row:not(.avis-premium-rating-row--active){opacity:.75}.avis-premium-rating-row:not(.avis-premium-rating-row--active):hover{opacity:1}.avis-premium-rating-label{font-size:.85rem;font-weight:500;width:28px;color:var(--ap-text);background:none;border:none;cursor:pointer;padding:2px 0;text-align:left;font-family:inherit;transition:color var(--ap-transition),transform var(--ap-transition)}.avis-premium-rating-label:hover{color:var(--ap-star-filled);transform:scale(1.15)}.avis-premium-rating-label:focus-visible{outline:2px solid var(--ap-accent);outline-offset:2px;border-radius:4px}.avis-premium-progress-bg{flex:1;height:10px;border-radius:20px;overflow:hidden}.avis-premium-progress-fill{height:100%;border-radius:20px;width:0%;transition:width .6s cubic-bezier(.25,.46,.45,.94);position:relative}.avis-premium-progress-fill:after{content:"";position:absolute;top:0;left:0;right:0;height:50%;background:linear-gradient(180deg,#ffffff4d,#fff0);border-radius:20px 20px 0 0}.avis-premium-rating-percent{font-size:.8rem;font-weight:500;color:var(--ap-text-muted);min-width:24px;text-align:right}.avis-premium-toolbar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;margin-bottom:1.2rem;padding-bottom:1rem;border-bottom:1px solid var(--ap-border)}.avis-premium-filter-info{display:none;align-items:center;gap:10px;font-size:.9rem;color:var(--ap-text-muted)}.avis-premium-filter-clear{background:none;border:1px solid var(--ap-border);color:var(--ap-text-muted);font-size:.8rem;font-weight:500;padding:4px 12px;border-radius:var(--ap-radius-pill);cursor:pointer;font-family:inherit;transition:all var(--ap-transition);display:none}.avis-premium-filter-clear:hover{background:var(--ap-border);color:var(--ap-text)}.avis-premium-filter-clear:focus-visible{outline:2px solid var(--ap-accent);outline-offset:2px}.avis-premium-sort-select{appearance:none;-webkit-appearance:none;background:var(--ap-card-bg);border:1px solid var(--ap-border);color:var(--ap-text);font-size:.85rem;font-weight:500;padding:8px 36px 8px 14px;border-radius:var(--ap-radius-pill);cursor:pointer;font-family:inherit;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%235b6f87' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center;transition:border-color var(--ap-transition)}.avis-premium-sort-select:hover,.avis-premium-sort-select:focus{border-color:var(--ap-text-muted);outline:none}.avis-premium-list{display:flex;flex-direction:column;gap:1.5rem;margin:1.5rem 0 1.8rem}.avis-premium-empty{text-align:center;padding:3rem 1rem;color:var(--ap-text-muted);font-size:.95rem}.avis-premium-skeleton{height:140px;background:linear-gradient(90deg,var(--ap-border-light) 25%,var(--ap-border) 50%,var(--ap-border-light) 75%);background-size:200% 100%;animation:avisShimmer 1.5s infinite;border-radius:var(--ap-radius-md)}@media(prefers-reduced-motion:reduce){.avis-premium-skeleton{animation:none}}@keyframes avisShimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.avis-premium-card{background:var(--ap-card-bg);border-radius:var(--ap-radius-md);padding:1.5rem 1.5rem 1.4rem;box-shadow:var(--ap-shadow-card);border:1px solid var(--ap-border);opacity:0;transform:translateY(10px);animation:avisFadeIn .4s ease forwards}@media(prefers-reduced-motion:reduce){.avis-premium-card{opacity:1;transform:none;animation:none}}.avis-premium-card--featured{border:2px solid var(--ap-primary);box-shadow:0 8px 18px #1e2a4114}@keyframes avisFadeIn{to{opacity:1;transform:translateY(0)}}.avis-premium-card-header{display:flex;align-items:flex-start;gap:14px;margin-bottom:10px}.avis-premium-avatar{width:48px;height:48px;border-radius:48px;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:1.2rem;flex-shrink:0;box-shadow:0 2px 6px #0000000d;border:1.5px solid var(--ap-card-bg);overflow:hidden;position:relative}.avis-premium-avatar--image{background:none;border-color:var(--ap-border-light)}.avis-premium-avatar--image img{width:100%;height:100%;object-fit:cover;display:block;border-radius:48px}.avis-premium-reviewer-info{flex:1;min-width:0}.avis-premium-reviewer-name-line{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:8px}.avis-premium-reviewer-name{font-weight:650;font-size:1.1rem;color:var(--ap-text)}.avis-premium-verified-badge{display:inline-flex;align-items:center;background:var(--ap-success-bg);color:var(--ap-success);font-size:.7rem;font-weight:600;padding:.2rem .6rem;border-radius:40px;white-space:nowrap}.avis-premium-review-date{font-size:.8rem;color:var(--ap-text-light);margin-top:2px}.avis-premium-review-stars{display:flex;gap:2px;margin:6px 0 8px}.avis-premium-review-text{font-size:.98rem;color:var(--ap-text);opacity:.85;line-height:1.65}.avis-premium-trust-footer{font-size:.75rem;color:var(--ap-text-light);margin-top:10px;display:flex;align-items:center;gap:4px;border-top:1px dashed var(--ap-border-light);padding-top:10px}.avis-premium-helpful{margin-top:12px;display:flex;justify-content:flex-end}.avis-premium-helpful-btn{display:inline-flex;align-items:center;gap:5px;background:none;border:1px solid var(--ap-border);color:var(--ap-text-muted);font-size:.8rem;font-weight:500;padding:5px 14px;border-radius:var(--ap-radius-pill);cursor:pointer;font-family:inherit;transition:all var(--ap-transition);line-height:1.4}.avis-premium-helpful-btn:hover:not(:disabled){border-color:var(--ap-star-filled);color:var(--ap-star-filled);background:#f5b3420f}.avis-premium-helpful-btn:focus-visible{outline:2px solid var(--ap-accent);outline-offset:2px}.avis-premium-helpful-btn--voted{border-color:var(--ap-star-filled);background:#f5b3421a;color:var(--ap-star-filled);cursor:default}.avis-premium-footer{display:flex;justify-content:center;margin-top:.5rem}.avis-premium-btn{background:var(--ap-card-bg);border:1.5px solid var(--ap-border);color:var(--ap-text);font-weight:600;font-size:1rem;padding:.9rem 2.5rem;border-radius:var(--ap-radius-pill);cursor:pointer;box-shadow:0 4px 8px #00000005;transition:all var(--ap-transition);font-family:inherit}.avis-premium-btn:hover{background:var(--ap-primary);border-color:var(--ap-primary);color:#fff;box-shadow:0 12px 20px -8px #1e2a4133;transform:scale(1.02)}.avis-premium-btn:focus-visible{outline:2px solid var(--ap-accent);outline-offset:3px}.avis-premium-btn.avis-premium-loading{opacity:.7;pointer-events:none}.live-purchase-notif{position:fixed;bottom:20px;left:20px;background:#1e2a41;color:#fff;padding:12px 18px;border-radius:var(--ap-radius-pill);font-size:.9rem;font-weight:500;box-shadow:0 10px 25px -5px #00000040;z-index:9999;display:flex;align-items:center;gap:10px;animation:avisSlideIn .3s ease;max-width:calc(100vw - 40px);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.08);line-height:1.4}.live-purchase-notif--leaving{opacity:0;transform:translate(-20px);transition:all .4s ease}.live-purchase-notif-icon{background:#ffffff1f;border-radius:20px;padding:4px 8px;font-size:.8rem;flex-shrink:0}@media(prefers-reduced-motion:reduce){.live-purchase-notif{animation:none}.live-purchase-notif--leaving{transition:none;opacity:0}}@keyframes avisSlideIn{0%{opacity:0;transform:translate(-20px)}to{opacity:1;transform:translate(0)}}@media(max-width:550px){.avis-premium-wrapper{padding:1.5rem .5rem}.avis-premium-container{padding:1.5rem 1.2rem;border-radius:24px}.avis-premium-title{font-size:1.5rem}.avis-premium-big-score{font-size:3rem}.avis-premium-card{padding:1.2rem}.avis-premium-summary{gap:1rem}.avis-premium-toolbar{flex-direction:column;align-items:stretch}.avis-premium-sort-select{width:100%}.avis-premium-reviewer-name-line{flex-direction:column;gap:4px}.live-purchase-notif{bottom:15px;left:15px;right:15px;padding:10px 15px;font-size:.85rem}}Nous devons cr\e9 er les fichiers reviews.css et reviews.js qui seront r\e9 f\e9renc\e9s dans le code Liquid. Le CSS (function() {"use strict"; function escapeHtml(str) {if (!str) return ""; var div = document.createElement("div"); div.textContent = str; return div.innerHTML;} function initReviewsSection(wrapper) {var sectionId = wrapper.dataset.sectionId; var reviewsPerLoad = parseInt(wrapper.dataset.reviewsPerLoad) || 3; var initialReviews = parseInt(wrapper.dataset.initialReviews) || 3; var maxReviews = parseInt(wrapper.dataset.maxReviews) || 30; var showNotifications = wrapper.dataset.showNotifications === "true"; var showHelpful = wrapper.dataset.showHelpful !== "false"; var enableFilter = wrapper.dataset.enableFilter !== "false"; var enableSort = wrapper.dataset.enableSort !== "false"; var reviewsDataScript = document.getElementById("reviewsData-" + sectionId); var baseReviews = []; if (reviewsDataScript) {try {baseReviews = JSON.parse(reviewsDataScript.textContent).map(function(r,i) {return {id: r.id || "rev-" + i + "-" + Math.random().toString(36).substr(2,6),name: r.name || "Anonyme",rating: Math.min(5,Math.max(1,parseInt(r.rating) || 5)),date: r.date || new Date().toISOString().split("T")[0],text: r.body || r.text || "",avatarLetter: (r.name || "?").charAt(0).toUpperCase(),avatar: r.avatar || null,avatarColor: r.avatarColor || null,verified: r.verified !== false,helpful: parseInt(r.helpful) || 0,pending: r.pending || false};});} catch (e) {console.error("[Avis Premium] Erreur parsing:",e); baseReviews = [];}} if (baseReviews.length === 0) {wrapper.style.display = "none"; return;} baseReviews.sort(function(a,b) {return new Date(b.date) - new Date(a.date);}); var firstNames = ["Lucas","Emma","Louis","Chlo\e9","Hugo","Lina","Nathan","Jade","Mathis","L\e9 a","Camille","Sophie","Thomas","In\e8s","Jules","Marie","Rapha\ebl","Alice","Enzo","Louise"]; var cities = ["Paris","Lyon","Marseille","Bordeaux","Lille","Toulouse","Nice","Nantes","Strasbourg","Montpellier","Rennes","Bruxelles","Gen\e8ve","Grenoble","Dijon"]; var reviewsList = document.getElementById("reviewsList-" + sectionId); var loadMoreBtn = document.getElementById("loadMoreBtn-" + sectionId); var avgScoreEl = document.getElementById("avgScore-" + sectionId); var avgStarsEl = document.getElementById("avgStars-" + sectionId); var totalReviewsEl = document.getElementById("totalReviews-" + sectionId); var ratingBarsEl = document.getElementById("ratingBars-" + sectionId); var filterInfo = document.getElementById("filterInfo-" + sectionId); var clearFilterBtn = document.getElementById("clearFilter-" + sectionId); var sortSelect = document.getElementById("sortSelect-" + sectionId); var structuredDataEl = document.getElementById("structuredData-" + sectionId); if (!reviewsList) return; var totalLoaded = 0; var isLoading = false; var activeFilter = null; var activeSort = "recent"; var helpfulVotes = {}; var votedReviews = new Set(); try {var savedState = localStorage.getItem("ap_helpful_" + sectionId); if (savedState) {var parsed = JSON.parse(savedState); helpfulVotes = parsed.v || {}; votedReviews = new Set(parsed.u || []);}} catch (e) {} function saveVotes() {try {localStorage.setItem("ap_helpful_" + sectionId,JSON.stringify({v: helpfulVotes,u: Array.from(votedReviews)}));} catch (e) {}} function computeStats(reviews) {reviews = reviews || baseReviews; var total = reviews.length; var sum = 0; var distribution = {5: 0,4: 0,3: 0,2: 0,1: 0}; for (var i = 0; i < reviews.length; i++) {sum += reviews[i].rating; if (distribution[reviews[i].rating] !== undefined) {distribution[reviews[i].rating]++;}} var avg = total > 0 ? sum / total : 0; var percentages = {}; for (var s = 5; s >= 1; s--) {percentages[s] = total > 0 ? (distribution[s] / total) * 100 : 0;} return {total: total,avg: avg,distribution: distribution,percentages: percentages};} function renderStars(rating,container,small) {container.innerHTML = ""; for (var i = 1; i <= 5; i++) {var star = document.createElement("span"); star.className = (i <= rating ? "avis-premium-star-filled" : "avis-premium-star-empty"); if (small) star.classList.add("avis-premium-star-sm"); star.innerHTML = i <= rating ? "&#9733;" : "&#9734;"; container.appendChild(star);}} function updateHeader() {var stats = computeStats(); if (avgScoreEl) avgScoreEl.textContent = stats.avg.toFixed(1); if (avgStarsEl) renderStars(Math.round(stats.avg),avgStarsEl); if (totalReviewsEl) totalReviewsEl.textContent = "Basu00e9 sur " + stats.total + " avis clients vu00e9rifiu00e9s"; if (ratingBarsEl) {ratingBarsEl.innerHTML = ""; var barThemes = {5: {color: "#10B981",bg: "rgba(16,185,129,0.08)",gradient: "linear-gradient(90deg, #10B981, #34D399)"},4: {color: "#34D399",bg: "rgba(52,211,153,0.06)",gradient: "linear-gradient(90deg, #34D399, #6EE7B7)"},3: {color: "#F59E0B",bg: "rgba(245,158,11,0.06)",gradient: "linear-gradient(90deg, #F59E0B, #FBBF24)"},2: {color: "#F97316",bg: "rgba(249,115,22,0.06)",gradient: "linear-gradient(90deg, #F97316, #FB923C)"},1: {color: "#EF4444",bg: "rgba(239,68,68,0.06)",gradient: "linear-gradient(90deg, #EF4444, #F87171)"}}; for (var star = 5; star >= 1; star--) {var pct = stats.percentages[star]; var cnt = stats.distribution[star]; var theme = barThemes[star]; var row = document.createElement("div"); row.className = "avis-premium-rating-row"; row.style.background = theme.bg; row.style.borderRadius = "8px"; row.style.padding = "5px 8px"; row.style.marginLeft = "-8px"; row.style.marginRight = "-8px"; row.style.transition = "all 0.2s ease"; if (activeFilter === star) row.classList.add("avis-premium-rating-row--active"); var label = document.createElement("button"); label.className = "avis-premium-rating-label"; label.type = "button"; label.textContent = star + "u2605"; label.style.color = theme.color; label.setAttribute("aria-label","Filtrer les avis " + star + " u00e9toiles"); if (enableFilter) {(function(s) {label.addEventListener("click",function() {toggleFilter(s);});})(star);} var barBg = document.createElement("div"); barBg.className = "avis-premium-progress-bg"; barBg.style.background = "rgba(0,0,0,0.04)"; var barFill = document.createElement("div"); barFill.className = "avis-premium-progress-fill"; barFill.style.width = pct + "%"; barFill.style.background = theme.gradient; barBg.appendChild(barFill); var countText = document.createElement("span"); countText.className = "avis-premium-rating-percent"; countText.textContent = cnt; countText.style.color = theme.color; countText.style.fontWeight = "600"; row.appendChild(label); row.appendChild(barBg); row.appendChild(countText); ratingBarsEl.appendChild(row);}} if (structuredDataEl) {try {var sd = JSON.parse(structuredDataEl.textContent); if (sd.aggregateRating) {sd.aggregateRating.ratingValue = stats.avg.toFixed(1); sd.aggregateRating.reviewCount = String(stats.total);} structuredDataEl.textContent = JSON.stringify(sd);} catch (e) {}}} function getAvatarColor(name,customColor) {var bg,r,g,b,lum; if (customColor && customColor.charAt(0) === "#") {bg = customColor; r = parseInt(bg.slice(1,3),16); g = parseInt(bg.slice(3,5),16); b = parseInt(bg.slice(5,7),16); lum = (.299 * r + .587 * g + .114 * b) / 255; return {bg: bg,fg: lum > .5 ? "#1e2a41" : "#ffffff"};} var palette = ["#4F46E5","#0EA5E9","#10B981","#F59E0B","#EF4444","#8B5CF6","#EC4899","#14B8A6","#F97316","#6366F1"]; var hash = 0; for (var i = 0; i < name.length; i++) {hash = ((hash << 5) - hash) + name.charCodeAt(i); hash |= 0;} var idx = Math.abs(hash) % palette.length; bg = palette[idx]; r = parseInt(bg.slice(1,3),16); g = parseInt(bg.slice(3,5),16); b = parseInt(bg.slice(5,7),16); lum = (.299 * r + .587 * g + .114 * b) / 255; return {bg: bg,fg: lum > .5 ? "#1e2a41" : "#ffffff"};} function formatDate(dateString) {try {var date = new Date(dateString); var now = new Date(); var diffDays = Math.floor((now - date) / (1000 * 60 * 60 * 24)); if (diffDays === 0) return "Aujourd'hui"; if (diffDays === 1) return "Hier"; if (diffDays < 7) return "Il y a " + diffDays + " jours"; if (diffDays < 30) {var w = Math.floor(diffDays / 7); return "Il y a " + w + " semaine" + (w > 1 ? "s" : "");} if (diffDays < 365) {var m = Math.floor(diffDays / 30); return "Il y a " + m + " mois";} return date.toLocaleDateString("fr-FR",{day: "numeric",month: "long",year: "numeric"});} catch (e) {return dateString;}} function getFilteredReviews() {var filtered = baseReviews.filter(function(r) {return !r.pending;}); if (activeFilter !== null) {filtered = filtered.filter(function(r) {return r.rating === activeFilter;});} switch (activeSort) {case "highest": filtered.sort(function(a,b) {return b.rating - a.rating || new Date(b.date) - new Date(a.date);}); break; case "lowest": filtered.sort(function(a,b) {return a.rating - b.rating || new Date(b.date) - new Date(a.date);}); break; default: filtered.sort(function(a,b) {return new Date(b.date) - new Date(a.date);});} return filtered;} function createCard(review,isFeatured) {var card = document.createElement("article"); card.className = "avis-premium-card" + (isFeatured ? " avis-premium-card--featured" : ""); card.setAttribute("data-review-id",review.id); var colors = getAvatarColor(review.name,review.avatarColor); var avatar = document.createElement("div"); avatar.className = "avis-premium-avatar"; if (review.avatar) {avatar.classList.add("avis-premium-avatar--image"); var img = document.createElement("img"); img.src = review.avatar; img.alt = escapeHtml(review.name); img.loading = "lazy"; img.onerror = function() {avatar.classList.remove("avis-premium-avatar--image"); avatar.innerHTML = ""; avatar.style.backgroundColor = colors.bg; avatar.style.color = colors.fg; avatar.textContent = review.avatarLetter;}; avatar.appendChild(img);} else {avatar.style.backgroundColor = colors.bg; avatar.style.color = colors.fg; avatar.textContent = review.avatarLetter;} var header = document.createElement("div"); header.className = "avis-premium-card-header"; var info = document.createElement("div"); info.className = "avis-premium-reviewer-info"; var nameLine = document.createElement("div"); nameLine.className = "avis-premium-reviewer-name-line"; var nameSpan = document.createElement("span"); nameSpan.className = "avis-premium-reviewer-name"; nameSpan.textContent = review.name; nameLine.appendChild(nameSpan); if (review.verified) {var badge = document.createElement("span"); badge.className = "avis-premium-verified-badge"; badge.innerHTML = "&#10003; Client vu00e9rifiu00e9"; nameLine.appendChild(badge);} var dateDiv = document.createElement("div"); dateDiv.className = "avis-premium-review-date"; dateDiv.textContent = formatDate(review.date); info.appendChild(nameLine); info.appendChild(dateDiv); header.appendChild(avatar); header.appendChild(info); var starsDiv = document.createElement("div"); starsDiv.className = "avis-premium-review-stars"; renderStars(review.rating,starsDiv); var textP = document.createElement("p"); textP.className = "avis-premium-review-text"; textP.textContent = review.text; var footer = document.createElement("div"); footer.className = "avis-premium-trust-footer"; footer.innerHTML = "&#10004; Basu00e9 sur un achat vu00e9rifiu00e9"; card.appendChild(header); card.appendChild(starsDiv); card.appendChild(textP); card.appendChild(footer); if (showHelpful) {var helpfulDiv = document.createElement("div"); helpfulDiv.className = "avis-premium-helpful"; var helpfulBtn = document.createElement("button"); helpfulBtn.type = "button"; helpfulBtn.className = "avis-premium-helpful-btn"; helpfulBtn.setAttribute("aria-label","Marquer cet avis comme utile"); var totalHelpful = review.helpful + (helpfulVotes[review.id] || 0); helpfulBtn.textContent = "uD83DuDC4D Utile (" + totalHelpful + ")"; if (votedReviews.has(review.id)) {helpfulBtn.classList.add("avis-premium-helpful-btn--voted"); helpfulBtn.disabled = true;} (function(revId,btn,baseHelpful) {btn.addEventListener("click",function() {if (votedReviews.has(revId)) return; votedReviews.add(revId); helpfulVotes[revId] = (helpfulVotes[revId] || 0) + 1; var newTotal = baseHelpful + helpfulVotes[revId]; btn.textContent = "uD83DuDC4D Utile (" + newTotal + ")"; btn.classList.add("avis-premium-helpful-btn--voted"); btn.disabled = true; saveVotes();});})(review.id,helpfulBtn,review.helpful); helpfulDiv.appendChild(helpfulBtn); card.appendChild(helpfulDiv);} return card;} function appendReviews(count) {var filtered = getFilteredReviews(); var fragment = document.createDocumentFragment(); var isFirstBatch = (totalLoaded === 0); for (var i = 0; i < count; i++) {var idx = totalLoaded + i; if (idx >= filtered.length) break; fragment.appendChild(createCard(filtered[idx],isFirstBatch && i === 0));} if (fragment.children.length > 0) {reviewsList.appendChild(fragment); totalLoaded += fragment.children.length;} if (loadMoreBtn) {loadMoreBtn.style.display = (totalLoaded >= filtered.length) ? "none" : "";} updateFilterInfo();} function toggleFilter(rating) {activeFilter = (activeFilter === rating) ? null : rating; resetAndReload();} function updateFilterInfo() {if (!filterInfo) return; if (activeFilter !== null) {var count = getFilteredReviews().length; filterInfo.style.display = "flex"; filterInfo.querySelector("span").textContent = count + " avis avec " + activeFilter + "u2605"; if (clearFilterBtn) clearFilterBtn.style.display = "";} else {filterInfo.style.display = "none"; if (clearFilterBtn) clearFilterBtn.style.display = "none";}} function resetAndReload() {reviewsList.innerHTML = ""; totalLoaded = 0; var filtered = getFilteredReviews(); var count = Math.min(initialReviews,filtered.length); if (count === 0) {var empty = document.createElement("div"); empty.className = "avis-premium-empty"; empty.textContent = "Aucun avis trouvu00e9 pour ce filtre."; reviewsList.appendChild(empty); if (loadMoreBtn) loadMoreBtn.style.display = "none";} else {appendReviews(count);} updateHeader(); updateFilterInfo();} function showSkeletons(count) {for (var i = 0; i < count; i++) {var sk = document.createElement("div"); sk.className = "avis-premium-skeleton"; reviewsList.appendChild(sk);}} function removeSkeletons() {var skeletons = reviewsList.querySelectorAll(".avis-premium-skeleton"); for (var i = 0; i < skeletons.length; i++) skeletons[i].remove();} function loadMore() {if (isLoading) return; isLoading = true; if (loadMoreBtn) {loadMoreBtn.textContent = "Chargement..."; loadMoreBtn.classList.add("avis-premium-loading");} setTimeout(function() {appendReviews(reviewsPerLoad); if (loadMoreBtn) {loadMoreBtn.textContent = "Voir plus d'avis"; loadMoreBtn.classList.remove("avis-premium-loading");} isLoading = false;},350);} var lastNotifName = ""; var lastNotifCity = ""; function showLiveNotification() {if (!showNotifications) return; var name,city; do {name = firstNames[Math.floor(Math.random() * firstNames.length)];} while (name === lastNotifName && firstNames.length > 1); lastNotifName = name; do {city = cities[Math.floor(Math.random() * cities.length)];} while (city === lastNotifCity && cities.length > 1); lastNotifCity = city; var actions = [{icon: "&#128722;",text: "vient d'acheter ce produit"},{icon: "&#128717;",text: "a ajoutu00e9 au panier"},{icon: "&#128065;",text: "regarde ce produit en ce moment"}]; var action = actions[Math.floor(Math.random() * actions.length)]; var notif = document.createElement("div"); notif.className = "live-purchase-notif"; notif.setAttribute("role","status"); notif.setAttribute("aria-live","polite"); notif.innerHTML = '<span class="live-purchase-notif-icon">' + action.icon + "</span> " + escapeHtml(name) + " de " + escapeHtml(city) + " " + action.text; document.body.appendChild(notif); setTimeout(function() {notif.classList.add("live-purchase-notif--leaving"); setTimeout(function() {if (notif.parentNode) notif.remove();},400);},4500);} var reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; updateHeader(); showSkeletons(Math.min(initialReviews,baseReviews.length)); setTimeout(function() {removeSkeletons(); totalLoaded = 0; appendReviews(Math.min(initialReviews,baseReviews.length));},reducedMotion ? 50 : 600); if (loadMoreBtn) loadMoreBtn.addEventListener("click",loadMore); if (sortSelect) {sortSelect.addEventListener("change",function() {activeSort = this.value; resetAndReload();});} if (clearFilterBtn) {clearFilterBtn.addEventListener("click",function() {activeFilter = null; resetAndReload();});} if (showNotifications && !reducedMotion) {setInterval(showLiveNotification,25000); setTimeout(showLiveNotification,6000);}} document.addEventListener("DOMContentLoaded",function() {var wrappers = document.querySelectorAll(".avis-premium-wrapper"); for (var i = 0; i < wrappers.length; i++) initReviewsSection(wrappers[i]);}); if (window.Shopify && Shopify.designMode) {document.addEventListener("shopify:section:load",function(e) {var w = e.target.querySelector(".avis-premium-wrapper"); if (w) initReviewsSection(w);});}})(); Nous avons maintenant le CSS et le JavaScript du widget d"avis. L"utilisateur demande implicitement une r\e9vision ou une validation,Continue{}
/*# sourceMappingURL=/cdn/shop/t/3/assets/reviews.css.map */
