/*
Theme Name: Sutil Fragancia Astra Child
Theme URI: https://sutilfragancia.com/
Description: Child theme de Astra optimizado para Sutil Fragancia, compatible con WooCommerce y FunnelKit.
Author: Sutil Fragancia
Template: astra
Version: 3.2.17
Text Domain: sutil-fragancia-astra-child
*/

/*
 * v3.2.17 — Fix definitivo: card bg escrito inline en wp_head con valor calculado. Elimina dependencia de CSS cacheado.
 * v3.2.16 — Fix caché: version strings de CSS bumpeados a 3.2.16 (homepage.css, pdp.css). Sin esto LiteSpeed servía el CSS viejo.
 * v3.2.15 — Fix homepage cards: !important en review-card, prod-card__body, testi-card homepage (sin JS).
 * v3.2.14 — var(--sf-card-bg) aplicado a todas las tarjetas: catálogo, homepage prod, review carousel, testimonios (JS), pair cards PDP. Fix !important en grid.
 * v3.2.13 — Fondo de tarjetas de producto configurable: select (paleta/custom/transparente) + color picker + toggle imagen independiente. Customizer → Paleta.
 * v3.2.12 — object-fit contain para imágenes de producto (grid + PDP gallery). Toggle + color picker en Customizer → sección Paleta.
 * v3.2.11 — Cabecera desktop custom: sticky 70px, paleta dinámica, nav horizontal configurable (6 items), íconos search/cuenta/carrito, border inferior. Oculta Astra native header en desktop. Search btn reusa el overlay del mobile. Breakpoint 921px coherente con mobile header.
 * v3.2.10 — Quadruple defensive fix: stars y pills ahora universales con especificidad aumentada (body-level), palette-system.php fuerza display/visibility/opacity, eliminadas reglas duplicadas legacy.
 * v3.2.5 — Fix badge bestseller PDP gallery: regex que parseaba el CSS dinámico no hacía match con var(--), caía a fallback hardcoded #B8924A. Eliminado regex, ahora usa var() directamente.
 * v3.2.4 — Fix DEFINITIVO: 27 setProperty() en JS embebido inyectaban hex hardcoded via DOM (badges, estrellas, leer más, CTA card, status badge). Ahora todos usan var(--sf-*). También bloque sf-pdp-custom CSS ahora lee del sistema de paleta en vez de Customizer hex independientes.
 * v3.2.3 — Fix raíz: theme-overrides.css legacy variables ahora son alias del sistema de paleta. Inline header search también respeta la paleta.
 * v3.2.2 — Refactor masivo: 84 hex hardcoded restantes (mostazas, blancos, negros) → variables. Forzados de estrellas y badges expandidos.
 * v3.2.1 — Paleta robusta: accent_contrast, stars/stock fijos, banner palette toggle, fixes de contraste en CTAs/badges/pills
 * v3.2.0 — Sistema de paleta dinámica: 6 presets × 2 modos + personalización completa + guardar paletas custom
 * v3.1.12 — Catalog title cleaner (limpia "Perfume", marca duplicada, género al final — solo en grids, NO en PDP, SEO intacto)
 * v3.1.11 — Catálogo WooCommerce alineado con homepage (cards Cormorant, marca dorada, badges, sin add-to-cart)
 * v3.1.10 — Fase B homepage: pulido visual + fix UGC roto en homepage (CSS missing)
 * v3.1.9 — Fase A homepage: Customizer expandido (tabs 12, banners 12, marcas 20, CTA dinámico, micro-claims, UGC homepage, footer expandido)
 * v3.1.8 — Fix botón hamburger (focus pegado + feedback visual)
 * v3.1.7 — Fix bugs históricos del mobile menu (toggle hamburger + defensas iOS)
 * v3.1.6 — Fix FOUC del header search (visible 3-5s al cargar el home)
 * v3.1.5 — Hotfix crítico: 3 bugs del search (CSS price, header layout, drawer listener)
 * v3.1.4 — Search mejorado: velocidad, UX, header independiente,
 *          historial, búsquedas populares reales, highlight
 *
 * OPTIMIZACIÓN DE VELOCIDAD
 * - Transient cache 5 min por query (repeticiones <50ms)
 * - Taxonomía de marca cacheada 1 día (elimina iteración de 5 tax)
 * - Queries consolidadas donde posible
 * - Estimado: 300-800ms → 80-200ms (primera), <50ms (repetidas)
 *
 * FIX RACE CONDITION "NO SE ENCONTRARON PRODUCTOS"
 * - Backend devuelve status explícito: too_short / empty / results
 * - JS descarta respuestas stale (query cambió mientras llegaba)
 * - AbortController usado consistentemente
 * - Estado "too_short" muestra sugerencias en vez de empty state
 *
 * SEARCH INDEPENDIENTE EN HEADER (alternativa B — expandible)
 * - Ícono lupa del header se expande in-place sobre el header
 * - Input toma focus automático, ESC o X cierran
 * - Click fuera cierra
 * - Resultados caen directo bajo el header (no abre drawer)
 * - Fallback: "sf_mm_header_search_mode" = 'drawer' vuelve al
 *   comportamiento anterior (abre drawer + focus)
 *
 * HIGHLIGHT DEL TÉRMINO EN RESULTADOS
 * - El término buscado se resalta con <mark> en el nombre del producto
 * - Color de highlight: dorado semi-transparente
 *
 * HISTORIAL DE BÚSQUEDAS RECIENTES
 * - Guardado en localStorage del navegador (privado por usuario)
 * - Muestra las últimas 5 al enfocar el input sin escribir
 * - Botón "Limpiar" para borrarlas
 * - Checkbox en Customizer para desactivar
 *
 * BÚSQUEDAS POPULARES REALES (CON REGISTRO AUTOMÁTICO)
 * - Cada búsqueda exitosa se registra en wp_options (sf_search_log)
 * - Decay semanal del 10% para reflejar tendencias actuales
 * - Bootstrap con 5 defaults manuales hasta que haya 20+ búsquedas
 * - Tope de 100 términos para evitar bloat
 * - Filtros de privacidad: solo 3-40 chars, solo alfa+num+espacios,
 *   máximo 5 palabras, no se loggea si usuario es admin
 * - Endpoint wp_ajax_sf_log_search (nonce sf_drawer_search)
 * - Cron semanal sf_search_log_decay (lunes 3am)
 * - Admin action sf_reset_search_log para limpiar manualmente
 *
 * JS REFACTORIZADO: MOTOR COMPARTIDO
 * - sfCreateSearchEngine() — factory reutilizable
 * - Drawer y header usan el mismo engine, solo cambian selectores
 * - Reducción de duplicación ~40%
 *
 * CUSTOMIZER
 * - Nuevos campos en sección Search:
 *   · Acción del ícono de búsqueda (expandir/drawer)
 *   · Mostrar búsquedas recientes (checkbox)
 *   · Mostrar búsquedas populares (checkbox)
 *   · Número de sugerencias (3/5/7)
 *   · Umbral de bootstrap (número)
 *   · 5 slots de defaults manuales
 *
 * v3.1.3 — Buscador custom AJAX (reemplaza Ivory Search)
 * - Motor de búsqueda propio dentro del drawer: no depende de plugins
 * - Busca por: título del producto, SKU (_sku meta), marca (taxonomía)
 * - Resultados live mientras escribes (debounce 300ms, min 2 caracteres)
 * - Cada resultado muestra: imagen, marca, nombre, precio con descuento
 * - Navegación con teclado (flechas + Enter)
 * - Fallback: Enter sin seleccionar → va a /tienda/?s={query}
 * - Loading spinner dorado durante búsqueda
 * - Empty state cuando no hay resultados
 * - Resultados se limpian al cerrar el drawer
 * - AJAX handler: wp_ajax_sf_drawer_search / wp_ajax_nopriv_sf_drawer_search
 * - Nonce: sf_drawer_search (pasado via sfHomeData.searchNonce)
 * - Resuelve definitivamente: Ivory Search interceptaba queries, form
 *   nativo no funcionaba, pre_get_posts era pisado por plugins
 *
 * v3.1.2 — Hotfix: Ivory Search integration
 * - Drawer search ahora usa shortcode [ivory-search id="..."] por default
 * - Resuelve: búsqueda devolvía posts en vez de productos (el pre_get_posts
 *   filter no servía porque Ivory Search intercepta las queries con su
 *   propio engine)
 * - 2 campos nuevos Customizer (sección Search): modo de búsqueda
 *   (Ivory/Nativo) + ID del form de Ivory (default 8975)
 * - CSS overrides para que el form de Ivory herede estética del drawer
 *   (input marfil + border piedra + ícono lupa + focus dorado)
 * - Ajax live search de Ivory estilizado (si está activado en el form)
 * - Fallback automático a form nativo si el shortcode de Ivory no está
 *   disponible (plugin desactivado o no instalado)
 *
 * v3.1.1 — Fixes mobile menu: search, logo, WhatsApp, header layout
 *
 * SEARCH DEL DRAWER (fix)
 * - Form action ahora apunta a la URL del shop de WooCommerce
 * - Filtro pre_get_posts fuerza post_type=product en resultados de
 *   búsqueda cuando el parámetro está presente en la URL
 * - Resuelve: búsqueda devolvía posts en vez de productos
 *
 * LOGO CONFIGURABLE (nueva sección "Header mobile")
 * - Header fijo: select tipo de logo (sitio / imagen custom / SF)
 * - Drawer: logo independiente O compartido con header (checkbox)
 * - Media uploaders separados para header y drawer
 * - Max-height: 32px header / 36px drawer
 *
 * WHATSAPP CTA (fix)
 * - Campos nuevos en Customizer: número + mensaje pre-cargado
 * - URL construida como: https://wa.me/{num}?text={msg url-encoded}
 * - Fallback a sf_get_whatsapp_url() si no hay número configurado
 * - Resuelve: botón WhatsApp no funcionaba (link vacío)
 *
 * HEADER EXTENDIDO (nuevos campos en "Header mobile")
 * - Posición del logo: centro / izquierda (junto al hamburguesa)
 * - Toggle: mostrar/ocultar ícono búsqueda
 * - Toggle: mostrar/ocultar ícono carrito
 *
 * CARRITO CLICK (fix defensivo)
 * - z-index del header subido a 10000 (antes 9998)
 * - .sf-drawer:not(.is-open) fuerza pointer-events: none !important
 * - Fallback explícito de cart URL si wc_get_cart_url() vacío
 * - Clase .sf-mobile-header__cart lista para selector de Funnel Kit
 * - Resuelve: click en ícono carrito solo recargaba la página
 *
 * ACCIÓN REQUERIDA POST-UPDATE: ir a Funnel Kit → Cart Menu →
 * Visibility Method → "Use CSS Selector" → pegar: .sf-mobile-header__cart
 *
 * v3.1.0 — Mobile Menu custom + mejoras hero carousel
 *
 * MOBILE MENU (nuevo, global)
 * - Reemplaza el mobile header de Astra con drawer custom brand-aligned
 * - Renderiza en TODAS las páginas (front, producto, categoría, cuenta)
 * - Drawer con: search funcional WC, categorías auto-expandibles,
 *   marcas scrollables, links secundarios, USPs, CTA WhatsApp
 * - Auto-detección de sub-categorías desde WooCommerce (si URL de
 *   categoría padre coincide, sus hijos se listan automáticamente)
 * - ~80 campos configurables en Customizer (panel "Mobile Menu"):
 *   7 secciones (General, Search, Categorías, Marcas, Links, USPs, WA)
 * - Accesibilidad: focus trap, Escape cierra, body scroll lock con
 *   restore de posición, prefers-reduced-motion, ARIA completo
 * - Breakpoint configurable (768/921/1024px)
 * - Ancho configurable (80/83/85/100%)
 * - Astra mobile header auto-oculto cuando el custom está activo
 *
 * HERO CAROUSEL — mejoras
 * - touch-action: pan-y para evitar que swipe horizontal arrastre
 *   la página verticalmente
 * - Espaciado entre H1/Sub/CTA/Social proof aumentado (mobile +
 *   desktop) para mejor jerarquía visual
 * - Nuevos campos por slide: tamaño del titular y subtítulo
 *   (Compacto/Medio/Grande) para control editorial sin romper
 *   el brand book
 *
 * ENQUEUE
 * - homepage.css y homepage.js ahora cargan globalmente (necesario
 *   para que el mobile menu funcione en todas las páginas)
 * - pdp.css solo se carga en páginas de producto/categoría/tienda
 *   (ahorra 143KB en páginas donde no se usa)
 *
 * v3.0.8 — Hotfix: image control del hero slide
 * - WP_Customize_Image_Control → WP_Customize_Media_Control
 *   (el primero guarda URL como string, el segundo guarda attachment ID
 *    que es lo que espera absint() + wp_get_attachment_image_url())
 * - Acción requerida post-update: re-seleccionar la imagen en cada slide
 *   del Customizer (el valor guardado con la versión anterior es URL
 *   string, no ID — no es compatible con el renderer)
 *
 * v3.0.7 — Hero convertido en carrusel configurable (hasta 5 slides)
 * - Nueva sección Customizer: "Hero · Carrusel (configuración general)"
 *   + 5 secciones "Hero · Slide 1..5" cada una con ~20 campos
 * - Hero con imagen de fondo full, overlay configurable (color + opacidad),
 *   texto + CTA + social proof + timer por slide
 * - Auto-play con pausa inteligente (hover, focus, swipe, off-screen),
 *   dots, flechas desktop opcionales, swipe mobile, keyboard nav
 * - Altura configurable por device (mobile/desktop × compact/medium/tall)
 * - Respeta prefers-reduced-motion (WCAG 2.2.2)
 * - Fallback: si ningún slide tiene imagen, renderiza texto sobre noir
 *   usando valores del Slide 1 (backward compatible con v3.0.6)
 * - Cache-bust version bump
 *
 * v3.0.6 — Polish pass: 9 correcciones visuales
 * - Tabs: text-transform none (Astra override)
 * - Hero: CTA + rating forzados en línea
 * - Hero: subtítulo más conciso
 * - Espaciado entre secciones reducido
 * - WhatsApp flotante: no tapa "Ver todo"
 * - Footer con identidad de marca (logo, claim, redes, links)
 * - Astra footer oculto en homepage
 *
 * v3.0.5 — Hero recortado + carrusel de reviews independiente
 * - Hero: sin testimonio incrustado, CTA + rating en línea
 * - Nuevo widget: carrusel horizontal de reviews entre hero y USPs
 * - Cards compactas con avatar, nombre, estrellas, texto truncado 2 líneas
 * - Scroll horizontal con snap, datos del CPT sf_testimonio
 *
 * v3.0.4 — Testimonios CSS independiente de JS
 * - Todos los estilos de tarjetas estilo B movidos de JS a CSS
 * - Grid, cards, imagen 1:1, initials, header, stars, text clamp, "Leer más"
 * - Funciona en homepage y PDP sin depender de is_product()
 *
 * v3.0.3 — Alineación visual homepage ↔ PDP
 * - Product cards: imagen full-width sin padding, object-fit cover, 1:1 forzado
 * - Card body: fondo blanco (como cross-sell PDP)
 * - Badge "Ahorras": fondo oscuro (como PDP)
 * - Badge "Más vendido": dorado, agregado al homepage
 * - FAQ: estilos de acordeón idénticos al PDP
 * - Botones outline pill unificados
 *
 * v3.0.2 — Tabs como filtros AJAX
 * - Tabs de categoría ahora filtran el grid sin recargar página
 * - Customizer: campo URL reemplazado por slug de categoría
 * - AJAX endpoint para consultar productos por categoría
 * - Animación de carga en el grid al cambiar de tab
 * - "Ver todo" actualiza su URL según tab activo
 *
 * v3.0.0 — Rediseno completo homepage
 * - Hero: testimonio integrado, un solo CTA
 * - USPs: SVG icons configurables desde Customizer
 * - Tabs de categoria como filtro sobre el grid
 * - Product cards sin boton (card clicable completa)
 * - Marca y rating en cada product card
 * - Badge de ahorro en pesos
 * - 6 banners de categoria con imagenes
 * - UGC + testimonios como seccion propia
 * - Marcas con circulos
 * - FAQ configurable desde Customizer
 * - WhatsApp como boton flotante
 * - Un solo titulo por seccion (sin eyebrows)
 * - Todo configurable desde Customizer
 */
