Acondicionador suavizante con aceite de ricino
Rated 4.8 out of 5 stars
6 Reviews
variant.price){
onSale = true;
}else{
onSale = false;
}
}"
@set-onetime-price.window="if($event.detail.id == 10315739300021) {
if(!$event.detail.subscribe){
variant.price = $event.detail.new_price;
variant.orignal_price = $event.detail.new_orignal_price;
}
}"
@set-subscription-price.window="if($event.detail.id == 10315739300021) {
if($event.detail.subscribe){
variant.price = $event.detail.new_price;
variant.orignal_price = $event.detail.new_orignal_price;
}
}"
@discounted-price.window="if($event.detail.id == 10315739300021) {
variant.price = $event.detail.new_price;
variant.orignal_price = $event.detail.new_orignal_price;
}"
@variant-updated.window="variant.price = $event.detail.variant.price; if(!isBundle){ soldOut = !$event.detail.availibility }"
@discount-applied.window="$nextTick(() => checkDiscountCode())"
@discount-removed.window="$nextTick(() => checkDiscountCode())"
class="price text-xl justify-center lg:justify-between font-semibold flex gap-x-2 items-center price--on-sale price--show-badge ">
Precio unitario
por
{
discount_percentage = $event.detail?.percentage || 0;
})"
x-init="$watch('selected', value => {
if (value.length != total_items) {
discount_percentage = 0;
}else{
discount_percentage = 0;
}
const cookieDiscount = Unick.getCookie('discount_code');
if(cookieDiscount){
const discount = discount_table.find((item) => {
return item.toLowerCase().includes(cookieDiscount.toLowerCase());
});
const discountValue = discount?.split(':')[1] || 0;
discount_percentage += parseInt(discountValue);
}
})"
x-data="{
discount_table: JSON.parse(JSON.stringify(`SECRETSALE:25,FB20:20,Madison20:20,Shawn26:26,SPRING25:25,Kitsch26:26,SPRING20:20,BFCM30:30,Abi25:25,Cat25:25,Ashley26:26`)).split(','),
renderPrice(price){
let total = price;
if(this.discount_percentage > 0){
total = price - (price * (this.discount_percentage / 100));
}
return Unick.formatMoney(total);
},
selected: [],
fixed_product: false,
discount_percentage: 0,
total_items: 3,
add(item) {
this.selected.push(item)
},
remove(id) {
this.selected = this.selected.filter(item => item.id !== id)
},
isInBundle(id) {
return this.selected.some(item => item.id === id)
},
priceBeforeDiscount(){
let total = 0;
this.selected.forEach(function (item) {
total += item.price;
})
return total;
},
totalPrice(){
let total = 0;
this.selected.forEach(function (item) {
total += item.price;
})
total = total - (total * (this.discount_percentage / 100));
let extraDiscount = 0;
return total - extraDiscount;
},
addToCart(){
let cartObj = [];
let bundleTitle = `Acondicionador suavizante con aceite de ricino`;
let bundleHandle = `castor-oil-nourishing-conditioner`;
let bundleCount = 3;
let bundleQty = 1;
let index = 0;
// Update button text to 'adding...'
this.$refs.addToCartButton.textContent = 'Adding...';
this.selected.forEach(function (item) {
cartObj.push({
quantity: 1,
id: item.variants[0].id,
properties: {
'_fbt_bundle': bundleTitle,
'_fbt_bundle_handle': bundleHandle,
'_fbt_bundle_count': bundleCount,
}
})
})
if(this.fixed_product && this.total_items == this.selected.length){
cartObj = [];
cartObj.push({
quantity: 1,
id: this.fixed_product,
})
}
fetch(routes.cart_add_url + '.js', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
items: cartObj
})
})
.then(response => {
// Update button text back to 'add to cart'
this.$refs.addToCartButton.textContent = 'Add to cart';
// Update cart with event dispatch
this.$dispatch('update-cart', { cart: response });
// Open cart after adding product
this.$dispatch('toggle-cart-drawer');
});
}
}">
+
Frequently Bought Together
Total price:
Acondicionador suavizante con aceite de ricino
€11,95
Champú suavizante con aceite de ricino
€11,95
100% Aceite de Ricino - 60ml
€9,95
{
discount_percentage = $event.detail?.percentage || 0;
})"
x-data="{
block_id: '01KQ0Y9KY8BAMRH2V5CCW46KE6',
loading: true,
error: false,
products: [],
selected: [],
fixed_product: false,
discount_percentage: 0,
base_discount_percentage: 0,
total_items: 0,
discount_table: JSON.parse(JSON.stringify(`SECRETSALE:25,FB20:20,Madison20:20,Shawn26:26,SPRING25:25,Kitsch26:26,SPRING20:20,BFCM30:30,Abi25:25,Cat25:25,Ashley26:26`)).split(','),
normalize(p) {
const variant = p.first_or_matched_variant || {};
const priceCents = Math.round(parseFloat(variant.price || 0) * 100);
return {
id: p.id,
title: p.title,
handle: p.handle,
featured_image: (p.images && p.images[0]) ? p.images[0].src : '',
price: priceCents,
tags: p.tags || [],
variants: [{ id: variant.id }]
};
},
async fetchLayers() {
try {
const configEl = document.getElementById('layers-config');
if (!configEl) { throw new Error('Layers pixel config not found on page'); }
const config = JSON.parse(configEl.textContent);
const storefrontToken = config.storefrontAccessToken || config.apiToken;
let sessionContext = {};
const sessionEl = document.getElementById('layers-session-context');
if (sessionEl) {
try { sessionContext = JSON.parse(sessionEl.textContent) || {}; }
catch (e) { console.warn('[Layers] Could not parse layers-session-context:', e); }
}
sessionContext.currentProduct = {
productId: 10315739300021,
variantId: 52107606098101,
title: "Acondicionador suavizante con aceite de ricino",
type: "Liquid Conditioner",
price: 11.95
};
const res = await fetch(
`https://app.uselayers.com/api/storefront/v1/blocks/${this.block_id}/products`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-Storefront-Access-Token': storefrontToken
},
body: JSON.stringify({
pagination: { page: 1, limit: 4 },
attributes: ['id','title','handle','images','price_range','available','vendor','tags','first_or_matched_variant'],
context: sessionContext
})
}
);
const data = await res.json().catch(() => ({}));
if (!res.ok || data.error) {
throw new Error('Layers API error (' + res.status + '): ' + (data.error || 'Unknown') + ' — blockId=' + this.block_id);
}
this.products = (data.results || []).filter(p => p.available !== false);
this.total_items = this.products.length;
this.selected = this.products.map(p => this.normalize(p));
this.loading = false;
this.applyDiscountFromCookie();
} catch (e) {
console.error('[Layers] Bundle-together fetch failed:', e);
this.error = true;
this.loading = false;
}
},
applyDiscountFromCookie() {
const cookieDiscount = (typeof Unick !== 'undefined' && Unick.getCookie) ? Unick.getCookie('discount_code') : null;
if (cookieDiscount) {
const discount = this.discount_table.find((item) =>
item.toLowerCase().includes(cookieDiscount.toLowerCase())
);
const discountValue = (discount && discount.split(':')[1]) || 0;
this.discount_percentage = this.base_discount_percentage + parseInt(discountValue);
}
},
renderPrice(price) {
let total = price;
if (this.discount_percentage > 0) {
total = price - (price * (this.discount_percentage / 100));
}
return Unick.formatMoney(total);
},
add(item) { this.selected.push(item); },
remove(id) { this.selected = this.selected.filter(item => item.id !== id); },
isInBundle(id) { return this.selected.some(item => item.id === id); },
priceBeforeDiscount() {
return this.selected.reduce((t, item) => t + item.price, 0);
},
totalPrice() {
let total = this.selected.reduce((t, item) => t + item.price, 0);
if (this.selected.length !== this.total_items) {
return total;
}
total = total - (total * (this.discount_percentage / 100));
let extraDiscount = 0;
return total - extraDiscount;
},
addToCart() {
let cartObj = [];
const bundleTitle = `Acondicionador suavizante con aceite de ricino`;
const bundleHandle = `castor-oil-nourishing-conditioner`;
const bundleCount = this.products.length;
this.$refs.addToCartButton.textContent = 'Adding...';
this.selected.forEach((item) => {
cartObj.push({
quantity: 1,
id: item.variants[0].id,
properties: {
'_fbt_bundle': bundleTitle,
'_fbt_bundle_handle': bundleHandle,
'_fbt_bundle_count': bundleCount,
}
});
});
if (this.fixed_product && this.total_items === this.selected.length) {
cartObj = [{ quantity: 1, id: this.fixed_product }];
}
fetch(routes.cart_add_url + '.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ items: cartObj })
}).then((response) => {
this.$refs.addToCartButton.textContent = `Add selected to cart`;
this.$dispatch('update-cart', { cart: response });
this.$dispatch('toggle-cart-drawer');
});
}
}"
x-init="$nextTick(() => {
$watch('selected', (value) => {
if (value.length !== total_items) {
discount_percentage = 0;
} else {
discount_percentage = base_discount_percentage;
applyDiscountFromCookie();
}
});
fetchLayers();
})"
x-show="!loading && products.length > 0">
+
Frequently Bought Together
Total price:
{
let mainAddToCart = document.querySelector('.product__info-wrapper .button-add-to-cart, .product__info-wrapper .product-form__submit');
if(mainAddToCart) {
let rect = mainAddToCart.getBoundingClientRect();
// Hide floating cart when main button is visible (with some buffer)
show = rect.top > window.innerHeight || rect.bottom < 0;
} else {
// If main button not found, show floating cart
show = true;
}
})"
x-init="$nextTick(() => {
// Delay initialization to ensure Alpine has rendered the main add-to-cart button
setTimeout(() => {
let mainAddToCart = document.querySelector('.product__info-wrapper .button-add-to-cart, .product__info-wrapper .product-form__submit');
if(mainAddToCart) {
let rect = mainAddToCart.getBoundingClientRect();
show = rect.top > window.innerHeight || rect.bottom < 0;
} else {
// Fallback: show sticky cart if main button not found after delay
show = true;
}
}, 500);
})"
class="add-to-cart-footer p-3 bg-white text-black fixed bottom-0 w-full z-20 shadow border-t">
{
selectOptions[$event.detail?.position] = $event.detail?.event?.target.value;
let getVariant = Unick.findVariant(variants , selectOptions);
selectedVariant = (getVariant) ? getVariant : null;
})">
Acondicionador suavizante con aceite de ricino
variant.price){
onSale = true;
}else{
onSale = false;
}
}"
@set-onetime-price.window="if($event.detail.id == 10315739300021) {
if(!$event.detail.subscribe){
variant.price = $event.detail.new_price;
variant.orignal_price = $event.detail.new_orignal_price;
}
}"
@set-subscription-price.window="if($event.detail.id == 10315739300021) {
if($event.detail.subscribe){
variant.price = $event.detail.new_price;
variant.orignal_price = $event.detail.new_orignal_price;
}
}"
@discounted-price.window="if($event.detail.id == 10315739300021) {
variant.price = $event.detail.new_price;
variant.orignal_price = $event.detail.new_orignal_price;
}"
@variant-updated.window="variant.price = $event.detail.variant.price; if(!isBundle){ soldOut = !$event.detail.availibility }"
@discount-applied.window="$nextTick(() => checkDiscountCode())"
@discount-removed.window="$nextTick(() => checkDiscountCode())"
class="price flex gap-x-2 items-center price--on-sale ">
Precio unitario
por
{
qty = $event.detail.qty;
})"
x-init="$nextTick(() => {
$watch('qty', value => {
console.log('qty', value);
$dispatch('quantity-updated', { qty: value });
});
});"
@quantity-updated.window="$nextTick(() => {
qty = $event.detail.qty;
})"
x-data="{ qty: 1 }">
4 razones por las que millones de personas se están pasando al acondicionador alisador con aceite de ricino Kitsch
1. Alisa en profundidad
2. Nutre
3. Aporta equilibrio
4. Cabello con aspecto más saludable