// 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 });