Envíos a todo el país Recibí tu prenda en la puerta de tu casa.
100% Hecho a Mano Tejido cuidadosamente prenda por prenda.
Pagos Seguros Transferencia y tarjetas de crédito/débito.
Nombre del Producto
$0
Stock disponible
Descripción del producto...
¡Producto añadido al carrito!
precio: '$25.000',
stock: 'Stock disponible',
fotos: [
'cardigan-abrazo-portada.jpg',
'cardigan-abrazo-detalle.jpg'
],
especificaciones: [
{ label: 'Material', valor: 'Hilado de algodón grosor fino' },
{ label: 'Talle', valor: 'Personalizado' },
{ label: 'Cuidados', valor: 'Lavado a mano, no retorcer y secar sobre superficie plana' }
],
descripcion: 'Es un diseño cómodo, suave y pensado para usar todos los días, de esos que no te querés sacar.'
},
'chaleco-abrazo': {
nombre: 'CHALECO ABRAZO',
precio: '$15.000',
stock: 'Stock disponible',
fotos: [
'chaleco-abrazo-portada.jpg',
'chaleco-abrazo-detalle.jpg'
],
especificaciones: [
{ label: 'Material', valor: 'Lana con brillo papayta grosor intermedio' },
{ label: 'Talle', valor: 'Personalizado' },
{ label: 'Cuidados', valor: 'Lavado a mano, no retorcer y secar sobre superficie plana' }
],
descripcion: 'Este chaleco lo pensé para usar sin vueltas: con jean, con algo más arreglado o simplemente para estar cómoda y linda al mismo tiempo.\nEs liviano y super adaptable… de esos que terminan siendo un básico sin darte cuenta.'
},
'bufanda-capucha-abrazo': {
nombre: 'BUFANDA CON CAPUCHA ABRAZO',
precio: '$12.000',
stock: 'Stock disponible',
fotos: [
'bufanda-capucha-abrazo-portada.jpg',
'bufanda-capucha-abrazo.jpg'
],
especificaciones: [
{ label: 'Material', valor: 'Lana nevilan' },
{ label: 'Talle', valor: 'Personalizado' },
{ label: 'Cuidados', valor: 'Lavado a mano, no retorcer y secar sobre superficie plana' }
],
descripcion: 'Hay tejidos que llegan para quedarse en el día a día.\nEsta bufanda con capucha está pensada para eso: para abrigarte sin complicaciones, para salir rápido y sentirte cómoda al mismo tiempo.\nEs práctica, versátil y tiene ese toque especial de lo hecho a mano que transforma algo simple en único.\nOjalá la disfrutes tanto como yo disfruté crearla.'
},
'poncho-abrazo': {
nombre: 'PONCHO ABRAZO',
precio: '$20.000',
stock: 'Stock disponible',
fotos: [
'poncho-abrazo-portada.jpg',
'poncho-abrazo-detalle.jgp'
],
especificaciones: [
{ label: 'Material', valor: 'Lana nevilan o cualquier lana que tengan en grosor intermedio (recomiendo lana con porcentaje de acrílico y lana porque es más calentita y tiene mejor caída que la lana totalmente acrílica)' },
{ label: 'Talle', valor: 'Personalizado' },
{ label: 'Cuidados', valor: 'Lavado a mano, no retorcer y secar sobre superficie plana' }
],
descripcion: 'Este poncho nació granny por granny, entre ideas, pruebas y muchas ganas de crear algo lindo y abrigado para este invierno.\nVamos a tejerlo juntas paso a paso, de manera simple y acompañada, para que puedas disfrutar el proceso y ver cómo va tomando forma con tus propias manos.\nEspero que disfrutes muchísimo este proyecto tanto como disfruté creándolo.'
},
'chaleco-suave': {
nombre: 'CHALECO ABRAZO SUAVE',
precio: '$15.000',
stock: 'Stock disponible',
fotos: [
'chaleco-suave-portada.jpg',
'chaleco-suave-detalle.jpg'
],
especificaciones: [
{ label: 'Material', valor: 'Lana pansy de L.H.O (260 grs)' },
{ label: 'Talle', valor: 'Único' },
{ label: 'Cuidados', valor: 'Lavado a mano, no retorcer y secar sobre superficie plana' }
],
descripcion: 'Es un chaleco cómodo, amplio y para utilizar en cualquier momento del día.'
},
'cardigan-calido': {
nombre: 'CÁRDIGAN ABRAZO CÁLIDO',
precio: '$20.000',
stock: 'Stock disponible',
fotos: [
'cardigan-calido-portada.jpg',
'cardigan-calido-detalle.jpg'
],
especificaciones: [
{ label: 'Material', valor: 'Profano de L.H.O' },
{ label: 'Talle', valor: 'Personalizado' },
{ label: 'Cuidados', valor: 'Lavado a mano, no retorcer y secar sobre superficie plana' }
],
descripcion: 'Es un cárdigan cómodo, versátil y pensado para acompañarte en esos días en los que queremos sentirnos abrigadas y lindas.'
}
};
// Elementos del Modal
const modalOverlay = document.getElementById('modal-producto-overlay');
const btnCerrarModal = document.getElementById('btn-cerrar-modal');
const modalFotoPrincipal = document.getElementById('modal-foto-principal');
const modalMiniaturas = document.getElementById('modal-miniaturas');
const modalNombre = document.getElementById('modal-nombre');
const modalPrecio = document.getElementById('modal-precio');
const modalStock = document.getElementById('modal-stock');
const modalEspecificaciones = document.getElementById('modal-especificaciones');
const modalDescripcion = document.getElementById('modal-descripcion');
const inputCantidad = document.getElementById('modal-input-cantidad');
const btnMenosCant = document.getElementById('btn-menos-cant');
const btnMasCant = document.getElementById('btn-mas-cant');
const btnComprarAhora = document.getElementById('btn-comprar-ahora');
const btnModalAgregarCarrito = document.getElementById('btn-modal-agregar-carrito');
const toastCarrito = document.getElementById('toast-carrito');
const toastMensaje = document.getElementById('toast-mensaje');
const contadorCarrito = document.querySelector('.contador-rojo');
let cantidadEnCarrito = 0;
let productoActualSeleccionado = null;
let productoActualIdSeleccionado = null;
// Función para mostrar Toast de notificación
function mostrarToast(mensaje) {
toastMensaje.textContent = mensaje;
toastCarrito.classList.add('activo');
setTimeout(() => {
toastCarrito.classList.remove('activo');
}, 2500);
}
// Función para abrir modal con la información del producto
function abrirModalProducto(idProducto) {
const data = PRODUCTOS_DATA[idProducto];
if (!data) return;
productoActualSeleccionado = data;
productoActualIdSeleccionado = idProducto;
inputCantidad.value = 1;
modalNombre.textContent = data.nombre;
modalPrecio.textContent = data.precio;
modalStock.textContent = data.stock;
modalDescripcion.textContent = data.descripcion;
// Renderizar especificaciones
modalEspecificaciones.innerHTML = data.especificaciones.map(spec =>
`
${spec.label}: ${spec.valor}
`
).join('');
// Configurar fotos y miniaturas
modalFotoPrincipal.src = data.fotos[0];
modalFotoPrincipal.onerror = () => { modalFotoPrincipal.src = data.fotos[0]; };
modalMiniaturas.innerHTML = '';
data.fotos.forEach((foto, index) => {
const item = document.createElement('div');
item.className = `miniatura-item ${index === 0 ? 'activo' : ''}`;
const img = document.createElement('img');
img.src = foto;
img.alt = `${data.nombre} foto ${index + 1}`;
img.onerror = function() {
this.src = data.fotos[0]; // fallback a la foto principal si aún no existe
};
item.appendChild(img);
item.addEventListener('mouseenter', () => {
document.querySelectorAll('.miniatura-item').forEach(m => m.classList.remove('activo'));
item.classList.add('activo');
modalFotoPrincipal.style.opacity = '0.5';
setTimeout(() => {
modalFotoPrincipal.src = img.src;
modalFotoPrincipal.style.opacity = '1';
}, 100);
});
item.addEventListener('click', () => {
document.querySelectorAll('.miniatura-item').forEach(m => m.classList.remove('activo'));
item.classList.add('activo');
modalFotoPrincipal.src = img.src;
});
modalMiniaturas.appendChild(item);
});
modalOverlay.classList.add('activo');
document.body.style.overflow = 'hidden';
}
// Función para cerrar modal
function cerrarModal() {
modalOverlay.classList.remove('activo');
document.body.style.overflow = 'auto';
}
btnCerrarModal.addEventListener('click', cerrarModal);
modalOverlay.addEventListener('click', (e) => {
if (e.target === modalOverlay) cerrarModal();
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && modalOverlay.classList.contains('activo')) cerrarModal();
});
// Controles de cantidad en modal
btnMenosCant.addEventListener('click', () => {
let val = parseInt(inputCantidad.value) || 1;
if (val > 1) inputCantidad.value = val - 1;
});
btnMasCant.addEventListener('click', () => {
let val = parseInt(inputCantidad.value) || 1;
inputCantidad.value = val + 1;
});
// Eventos para abrir modal al hacer clic en fotos o títulos de la grilla
document.querySelectorAll('.tarjeta-producto').forEach(tarjeta => {
const id = tarjeta.getAttribute('data-id');
const enlaces = tarjeta.querySelectorAll('.enlace-detalle-producto, .contenedor-imagen img');
enlaces.forEach(enlace => {
enlace.addEventListener('click', (e) => {
e.preventDefault();
abrirModalProducto(id);
});
});
});
// Botón "Agregar al carrito" dentro del Modal
btnModalAgregarCarrito.addEventListener('click', () => {
const cant = parseInt(inputCantidad.value) || 1;
if (window.agregarAlCarrito) {
window.agregarAlCarrito(productoActualIdSeleccionado, productoActualSeleccionado.nombre, cant);
}
cerrarModal();
});
// Botón "Comprar ahora" dentro del Modal
btnComprarAhora.addEventListener('click', () => {
const cant = parseInt(inputCantidad.value) || 1;
if (window.iniciarCompraProducto) {
window.iniciarCompraProducto(productoActualIdSeleccionado, productoActualSeleccionado.nombre, cant);
}
});
// Botones de agregar rápido en la grilla
const botonesAgregar = document.querySelectorAll('.boton-agregar-rapido');
botonesAgregar.forEach(button => {
button.addEventListener('click', (e) => {
e.stopPropagation();
const tarjeta = button.closest('.tarjeta-producto');
const id = tarjeta.getAttribute('data-id');
const nombre = tarjeta.querySelector('.nombre-producto').textContent.trim();
if (window.agregarAlCarrito) {
window.agregarAlCarrito(id, nombre, 1);
}
});
});
// Funcionalidad de favoritos (corazones)
const botonesFavorito = document.querySelectorAll('.boton-favorito');
botonesFavorito.forEach(button => {
button.addEventListener('click', (e) => {
e.stopPropagation();
button.classList.toggle('activo');
});
});
// Buscador desplegable y filtro
const botonLupa = document.getElementById('boton-lupa');
const cajaBusqueda = document.getElementById('caja-busqueda');
const inputBuscar = document.getElementById('input-buscar');
botonLupa.addEventListener('click', (e) => {
e.stopPropagation();
cajaBusqueda.classList.toggle('activo');
if (cajaBusqueda.classList.contains('activo')) {
inputBuscar.focus();
}
});
document.addEventListener('click', (e) => {
if (!cajaBusqueda.contains(e.target) && e.target !== botonLupa && !botonLupa.contains(e.target)) {
cajaBusqueda.classList.remove('activo');
}
});
inputBuscar.addEventListener('input', (e) => {
const textoBusqueda = e.target.value.toLowerCase().trim();
const tarjetas = document.querySelectorAll('.tarjeta-producto');
tarjetas.forEach(tarjeta => {
const nombreProducto = tarjeta.querySelector('.nombre-producto').textContent.toLowerCase();
if (nombreProducto.includes(textoBusqueda)) {
tarjeta.style.display = 'block';
} else {
tarjeta.style.display = 'none';
}
});
});