// Shared helpers & data const WA_NUMBER = '50246664086'; const IG_URL = 'https://www.instagram.com/isfer502_tattoos'; const TT_URL = 'https://www.tiktok.com/@isfer502'; const MAP_URL = 'https://maps.app.goo.gl/NvEAvpbuezRvTecE9'; function sanitize(str) { return String(str).replace(/[<>"'\/\\&]/g, ''); } function sanitizeForm(str) { return String(str).replace(/[<>"'\/\\]/g, '').slice(0, 500); } function waLink(text) { return `https://wa.me/${WA_NUMBER}?text=${encodeURIComponent(text)}`; } // Scroll reveal wrapper (requires framer-motion globals) const _FM = window.Motion || window.FramerMotion || {}; const { motion, AnimatePresence, useMotionValue, useTransform, useScroll, useInView } = _FM; const fadeUp = { hidden: { opacity: 0, y: 30 }, show: (i = 0) => ({ opacity: 1, y: 0, transition: { duration: 0.7, delay: i * 0.08, ease: [0.22, 1, 0.36, 1] } }) }; function Reveal({ children, delay = 0, as = 'div', className, ...rest }) { const Comp = motion[as] || motion.div; return ( {children} ); } // Icon set (inline SVG — no emoji) const Icon = { WhatsApp: (p) => ( ), Instagram: (p) => ( ), TikTok: (p) => ( ), Pin: (p) => ( ), Clock: (p) => ( ), Needle: (p) => ( ), Check: (p) => ( ), Shield: (p) => ( ), Sparkle: (p) => ( ), Chat: (p) => ( ), Arrow: (p) => ( ), Search: (p) => ( ), Close: (p) => ( ), Menu: (p) => ( ), ChevronUp: (p) => ( ) }; Object.assign(window, { WA_NUMBER, IG_URL, TT_URL, MAP_URL, sanitize, sanitizeForm, waLink, Reveal, Icon, fadeUp });