TAMSS MALL
Cover BORAQ CLEAN
Logo BORAQ CLEAN
Boutique Officielle Certifiée

BORAQ CLEAN

نقضي على البقع بقوة العلم

Sousse 13 Références 4.9 Score de Confiance

À Propos de Nous

Navigation Rayons

Collection Exclusive

Découvrez notre sélection rigoureuse de produits.

Trier par :
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-YROAHJBF"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "D\u00e9tartrant 0,5 litre" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/detartrant-05-litre-6a0b29a557c8e", name: "D\u00e9tartrant 0,5 litre", summary: "", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "l", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/770dq6vKIci3BduuKtBIFUHJjoUtaQHFirSMRUXV.png", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/770dq6vKIci3BduuKtBIFUHJjoUtaQHFirSMRUXV.png", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: "D\u00e9tergent", wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+D%C3%A9tartrant+0%2C5+litre", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/770dq6vKIci3BduuKtBIFUHJjoUtaQHFirSMRUXV.png"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "D\u00e9tartrant 0,5 litre", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Détartrant 0,5 litre

Aucun avis
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-JROJWK6V"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Lessive liquide pour lavage normal 5 litres" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/lessive-liquide-pour-lavage-normal-5-litres-6a0b28daacb0b", name: "Lessive liquide pour lavage normal 5 litres", summary: "", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "l", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/q6X53HCoUS7plviZXhyAt4CnKPSpsOLbStEoKZxY.png", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/q6X53HCoUS7plviZXhyAt4CnKPSpsOLbStEoKZxY.png", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: "D\u00e9tergent", wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+Lessive+liquide+pour+lavage+normal+5+litres", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/q6X53HCoUS7plviZXhyAt4CnKPSpsOLbStEoKZxY.png"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Lessive liquide pour lavage normal 5 litres", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Lessive liquide pour lavage normal 5 litres

Aucun avis
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-O8CZBFA5"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Persil Gel 1 litre" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/persil-gel-1-litre-6a0b26633c2f7", name: "Persil Gel 1 litre", summary: "", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "l", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/k1nYsm097IUdRqD8r7j3f7HvE9oLEziQ4W8FhAQk.png", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/k1nYsm097IUdRqD8r7j3f7HvE9oLEziQ4W8FhAQk.png", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: "D\u00e9tergent", wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+Persil+Gel+1+litre", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/k1nYsm097IUdRqD8r7j3f7HvE9oLEziQ4W8FhAQk.png"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Persil Gel 1 litre", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Persil Gel 1 litre

Aucun avis
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-K1RIZB2Y"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Cajoline 1 Litre" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/cajoline-1-litre-6a0b2228b2ca5", name: "Cajoline 1 Litre", summary: "", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "l", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/SDeB9qaybI9o9zbuJuM7RdtJGJRJluuX00vPPpF8.png", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/SDeB9qaybI9o9zbuJuM7RdtJGJRJluuX00vPPpF8.png", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: "D\u00e9tergent", wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+Cajoline+1+Litre", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/SDeB9qaybI9o9zbuJuM7RdtJGJRJluuX00vPPpF8.png"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Cajoline 1 Litre", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Cajoline 1 Litre

Aucun avis
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-7SYTYWO8"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Eau de Javel pour v\u00eatements color\u00e9s 1 litre" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/eau-de-javel-pour-vetements-colores-1-litre-6a0b1e784d8a1", name: "Eau de Javel pour v\u00eatements color\u00e9s 1 litre", summary: "", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "l", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/5NCQsVmEx5TVXLoafHk1iCZJ4lq6cLXExFBydLUF.png", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/5NCQsVmEx5TVXLoafHk1iCZJ4lq6cLXExFBydLUF.png", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: "D\u00e9tergent", wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+Eau+de+Javel+pour+v%C3%AAtements+color%C3%A9s+1+litre", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/5NCQsVmEx5TVXLoafHk1iCZJ4lq6cLXExFBydLUF.png"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Eau de Javel pour v\u00eatements color\u00e9s 1 litre", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Eau de Javel pour vêtements colorés 1 litre

Aucun avis
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-X1HF0ZAN"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Air fresh 0.5 litres" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/air-fresh-05-litres-6a0b1c71c899a", name: "Air fresh 0.5 litres", summary: "", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "l", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/fmHt5DNAyyxZuflfXcjIz1ariDp6YDg6vUogcncH.png", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/fmHt5DNAyyxZuflfXcjIz1ariDp6YDg6vUogcncH.png", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: "D\u00e9tergent", wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+Air+fresh+0.5+litres", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/fmHt5DNAyyxZuflfXcjIz1ariDp6YDg6vUogcncH.png"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Air fresh 0.5 litres", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Air fresh 0.5 litres

Aucun avis
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-2H1CSOT1"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Lessive liquide pour machine automatique 5 litres" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/lessive-liquide-pour-machine-automatique-5-litres-6a0b164a94e20", name: "Lessive liquide pour machine automatique 5 litres", summary: "", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "pi\u00e8ce", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/h13DYSnRmCC4gNe74rr5dU2mjtFOJgsvwvDhS7Ct.png", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/h13DYSnRmCC4gNe74rr5dU2mjtFOJgsvwvDhS7Ct.png", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: "D\u00e9tergent", wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+Lessive+liquide+pour+machine+automatique+5+litres", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/h13DYSnRmCC4gNe74rr5dU2mjtFOJgsvwvDhS7Ct.png"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Lessive liquide pour machine automatique 5 litres", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Lessive liquide pour machine automatique 5 litres

Aucun avis
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-RTXWULLI"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Nettoyant vitres 0,5 litre" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/nettoyant-vitres-05-litre-6a0aeb8973b57", name: "Nettoyant vitres 0,5 litre", summary: "", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "l", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/QytbhsIQRkknJfqBzZ7g7DaJL6Rd7AVmQMI9jscZ.png", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/QytbhsIQRkknJfqBzZ7g7DaJL6Rd7AVmQMI9jscZ.png", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: "D\u00e9tergent", wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+Nettoyant+vitres+0%2C5+litre", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/QytbhsIQRkknJfqBzZ7g7DaJL6Rd7AVmQMI9jscZ.png"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Nettoyant vitres 0,5 litre", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Nettoyant vitres 0,5 litre

Aucun avis
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-HIPNZQCX"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "D\u00e9graissant 1 litre" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/degraissant-1-litre-6a0ae9d7163fa", name: "D\u00e9graissant 1 litre", summary: "", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "l", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/P5TffGhnabGP12VDx2dhT30qY3fWOAgNRvWBCtWN.jpg", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/P5TffGhnabGP12VDx2dhT30qY3fWOAgNRvWBCtWN.jpg", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: "D\u00e9tergent", wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+D%C3%A9graissant+1+litre", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/P5TffGhnabGP12VDx2dhT30qY3fWOAgNRvWBCtWN.jpg"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "D\u00e9graissant 1 litre", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Dégraissant 1 litre

Aucun avis
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-Z7B3JN0H"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Gel douche 0,5 litre" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/gel-douche-05-litre-6a0ae7bc146e3", name: "Gel douche 0,5 litre", summary: "", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "l", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/cdA0eEM1ItP5gOJ1nkLcutzMoA6Jn8RLDpkEItXo.png", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/cdA0eEM1ItP5gOJ1nkLcutzMoA6Jn8RLDpkEItXo.png", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: null, wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+Gel+douche+0%2C5+litre", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/cdA0eEM1ItP5gOJ1nkLcutzMoA6Jn8RLDpkEItXo.png"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Gel douche 0,5 litre", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Gel douche 0,5 litre

Aucun avis
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-NE7DNOBR"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Denol parfum pomme 5 litres" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/denol-parfum-pomme-5-litres-6a0ae3a36f09e", name: "Denol parfum pomme 5 litres", summary: "", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "l", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/lVLKFFbLqigY3sUm70pYDl8QuOK7J4vXrQfHCEZx.png", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/lVLKFFbLqigY3sUm70pYDl8QuOK7J4vXrQfHCEZx.png", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: "D\u00e9tergent", wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+Denol+parfum+pomme+5+litres", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/lVLKFFbLqigY3sUm70pYDl8QuOK7J4vXrQfHCEZx.png"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Denol parfum pomme 5 litres", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Denol parfum pomme 5 litres

Aucun avis
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-MX0F7PVH"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Denol parfum citron 5 litres" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/denol-parfum-citron-5-litres-6a0ae18650e8b", name: "Denol parfum citron 5 litres", summary: "", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "l", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/L0RVP2psVX6YJn0BYclgPxtQ2Odo4pGTiDFoBwrh.jpg", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/L0RVP2psVX6YJn0BYclgPxtQ2Odo4pGTiDFoBwrh.jpg", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: "D\u00e9tergent", wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+Denol+parfum+citron+5+litres", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/L0RVP2psVX6YJn0BYclgPxtQ2Odo4pGTiDFoBwrh.jpg"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Denol parfum citron 5 litres", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Denol parfum citron 5 litres

Aucun avis
0 && this.currentStock <= 5; }, get shouldForceQuote() { return this.isQuoteMode || (this.isService && this.currentPrice <= 0); }, get displaySku() { return (this.selectedVariant && this.selectedVariant.sku) ? this.selectedVariant.sku : "PRD-ZVRFPTHM"; }, get activeVariantLabel() { if (!this.selectedVariant) return ''; return this.selectedVariant.label || this.selectedVariant.name || ''; }, init() { if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); this.inWishlist = wl.includes(this.id); } window.addEventListener('wishlist-updated', (e) => { if (e.detail.product_id === this.id) { this.inWishlist = e.detail.added; } }); }, get currentPrice() { let p = this.selectedVariant ? parseFloat(this.selectedVariant.price) : this.basePrice; return p > 0 ? p : this.basePrice; }, formatPrice(p) { return Number(p).toLocaleString('fr-TN', { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false }); }, handleCardNavigation(event) { if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return; event.preventDefault(); if (typeof window.smartTrack === 'function') { window.smartTrack(this.isService ? 'service_click' : 'product_click', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Eau de javel" }); } this.openQuickView(); }, openQuickView() { const activeGallery = this.galleryImages && this.galleryImages.length ? this.galleryImages : [this.activeImage].filter(Boolean); const mappedVariants = (this.variants || []).map(v => ({ ...v, price_formatted: this.formatPrice(v.price || 0) })); window.dispatchEvent(new CustomEvent('open-product-quickview', { detail: { id: this.id, url: "https:\/\/tamssmall.tn\/catalogue\/produit\/eau-de-javel-6a0ae047b3042", name: "Eau de javel", summary: "Eau de javel 5 Litres", type: this.isService ? 'service' : 'product', is_service: this.isService, is_quote_mode: this.isQuoteMode, should_force_quote: this.shouldForceQuote, manage_stock: this.productManageStock, allow_backorder: this.allowBackorder, stock: this.currentStock, sku: this.displaySku, unit: "l", currency: "TND", image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/C3pcwfsHAXsAUFawvIhuMSKlLNCsSKSnDQba1Wgt.png", active_image: this.activeImage || "https:\/\/tamssmall.tn\/storage\/products\/C3pcwfsHAXsAUFawvIhuMSKlLNCsSKSnDQba1Wgt.png", gallery: activeGallery, price: this.currentPrice, price_formatted: this.formatPrice(this.currentPrice), compare_price_formatted: "0,000", seller: {"name":"BORAQ CLEAN","url":"https:\/\/tamssmall.tn\/catalogue\/boutique\/boraq-clean-42iu","logo":"https:\/\/tamssmall.tn\/storage\/sellers\/logos\/946JzPz8kytZvPrgHcVP5zWMJaGaowBzmkYKCDSe.png"}, category: "D\u00e9tergent", wa_link: "https:\/\/wa.me\/21694361475?text=Bonjour%2C+je+suis+int%C3%A9ress%C3%A9+par+%3A+Eau+de+javel", booking_enabled: true, variants: mappedVariants, selected_variant: this.selectedVariant ? { ...this.selectedVariant, price_formatted: this.formatPrice(this.selectedVariant.price || 0) } : null } })); }, selectVariant(v) { if (this.selectedVariant && this.selectedVariant.id === v.id) { this.selectedVariant = null; this.activeImage = "https:\/\/tamssmall.tn\/storage\/products\/C3pcwfsHAXsAUFawvIhuMSKlLNCsSKSnDQba1Wgt.png"; } else { this.selectedVariant = v; if(v.image) this.activeImage = v.image; } }, selectGalleryImage(img, idx) { this.selectedVariant = null; this.activeImage = img; this.galleryIndex = idx; }, stepGallery(direction) { if (!this.galleryImages.length) return; this.selectedVariant = null; this.galleryIndex = (this.galleryIndex + direction + this.galleryImages.length) % this.galleryImages.length; this.activeImage = this.galleryImages[this.galleryIndex]; }, openQuantityPopup() { if (this.variants.length > 0 && !this.selectedVariant) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.choose_option, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#f59e0b', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.choose_option); } return; } if (this.purchaseBlocked && !this.isQuoteMode) { if (typeof Toastify !== 'undefined') { Toastify({ text: this.trans.out_of_stock, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#ef4444', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(this.trans.out_of_stock); } return; } this.qty = 1; this.openQty = true; }, toggleWishlist() { this.inWishlist = !this.inWishlist; if (!this.isAuth) { let storageKey = 'smartbs_wishlist_' + this.tenantId; let wl = JSON.parse(localStorage.getItem(storageKey) || '[]'); if (this.inWishlist) { if (!wl.includes(this.id)) wl.push(this.id); } else { wl = wl.filter(id => id !== this.id); } localStorage.setItem(storageKey, JSON.stringify(wl)); window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { count: wl.length, product_id: this.id, added: this.inWishlist } })); } else { const url = 'https://tamssmall.tn/wishlist/toggle'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name=\'csrf-token\']').content, 'Accept': 'application/json' }, body: JSON.stringify({ product_id: this.id }) }).then(res => res.json()) .then(data => { window.dispatchEvent(new CustomEvent('wishlist-updated', { detail: { added: this.inWishlist, product_id: this.id } })); }) .catch(err => { this.inWishlist = !this.inWishlist; }); } if (typeof Toastify !== 'undefined') { Toastify({ text: this.inWishlist ? this.trans.added_fav : this.trans.removed_fav, duration: 2000, gravity: 'bottom', position: 'center', style: { background: this.inWishlist ? '#f43f5e' : '#64748b', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } }, addToCart() { this.openQty = false; let variantId = this.selectedVariant ? this.selectedVariant.id : null; let variantSku = this.selectedVariant ? this.selectedVariant.sku : null; let variantName = this.selectedVariant ? this.selectedVariant.name : null; let payload = { quantity: this.qty, variant_id: variantId, variant_sku: variantSku, variant_name: variantName }; const addUrl = 'https://tamssmall.tn/panier/ajouter/' + this.id; const csrfToken = document.querySelector('meta[name=\'csrf-token\']')?.content; fetch(addUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'Accept': 'application/json' }, body: JSON.stringify(payload) }).then(res => res.json()).then(data => { const count = data.cart_count ?? data.count ?? '+1'; const total = data.cart_total_formatted ?? data.total_formatted ?? null; document.querySelectorAll('.cart-count-badge').forEach(el => el.innerText = count); if (total) document.querySelectorAll('.cart-total-price').forEach(el => el.innerText = total); window.dispatchEvent(new Event('cart-updated')); if (typeof window.smartTrack === 'function') { window.smartTrack('add_to_cart', { entity_type: this.isService ? 'service' : 'product', item_id: this.id, item_name: "Eau de javel", quantity: this.qty }); } let successMsg = ''; if(this.isQuoteMode) { successMsg = variantName ? this.trans.opt_add_quote.replace(':name', variantName) : this.trans.prod_add_quote; } else { successMsg = variantName ? this.trans.opt_add.replace(':name', variantName) : this.trans.prod_add; } if (typeof Toastify !== 'undefined') { Toastify({ text: '✅ ' + successMsg, duration: 2500, gravity: 'bottom', position: 'center', style: { background: '#10b981', color: '#fff', borderRadius: '10px', fontWeight: 'bold', marginBottom: '80px' } }).showToast(); } else { alert(successMsg + ' !'); } }).catch(error => { console.error('Erreur:', error); }); } }" @mouseenter="isHovered = true" @mouseleave="isHovered = false" class="group relative bg-white rounded-[2rem] p-3 md:p-4 border border-slate-100 hover:border-slate-200 transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/50 flex flex-col h-full" style="--primary-color: #095155; --secondary-color: #ff429a;">
En Rupture

Vite, plus que

Eau de javel

Aucun avis

Sur devis

Reference

Stock