import React, { useEffect, useRef, useState } from 'react'; import { ArrowUpRight, Sparkles, Instagram, ArrowRight, CheckCircle2, Menu, X, MessageCircle, Send, Loader2 } from 'lucide-react'; /** * JOLIE MAIN STUDIO - V6.0 AI INTEGRATED EDITORIAL * Aesthetic: High-Efficiency Editorial * Features: GROQ AI Concierge, Authentic Asset Integration * Fonts: Playfair Display & Inter */ const LOGO_URL = "https://res.cloudinary.com/dj2bicb8m/image/upload/v1768110895/582444434_122098417347116827_1842383411626331584_n.jpg_lcjehg.jpg"; const BOOKING_URL = "https://www.dashbooking.com/salon/jolie-main-studio/booking"; const GROQ_API_KEY = "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"; const ASSETS = { hero: "https://images.unsplash.com/photo-1604654894610-df63bc536371?q=80&w=987&auto=format&fit=crop", runway1: "https://res.cloudinary.com/dt8xxhite/image/upload/v1768210575/610960098_122118266817120610_8883433092097801868_n.jpg_ikl1nq.jpg", runway2: "https://res.cloudinary.com/dt8xxhite/image/upload/v1768210648/611715666_122117595867120610_9221523005684423611_n.jpg_u3ojsr.jpg", runway3: "https://images.unsplash.com/photo-1607779097040-26e80aa78e66?q=80&w=1200&auto=format&fit=crop", // Updated Creative Art Link runway4: "https://res.cloudinary.com/dt8xxhite/image/upload/v1768210941/599413249_122113809267120610_6322608646623385751_n.jpg_wzxpau.jpg", }; const TRANSLATIONS = { fr: { tagline: "Studio de manucure éditorial de luxe. Spécialisé dans les manucures russes de haute précision.", location: "Verdun, Montréal", est: "Établi 2024", beyond: "Au-delà des conventions", philosophy: "Nous créons des expériences visuelles pour vos doigts. Précis. Artistique. Rebelle.", scroll: "DÉFILER POUR DÉCOUVRIR", marquee: "* Art sur mesure * Haute Précision * Haute Couture * Verdun QC *", runwayTitle: "Le Défilé", runwaySub: "Sélection Archive", look: "Look", editTitle: "La Sélection", editSub: "Le Menu", editDesc: "Chaque séance est une collaboration entre l'artiste et le sujet. Nous nous concentrons sur la structure, la longévité et l'esthétique haute couture.", priceFrom: "À partir de", book: "Réserver", standard: "Redéfinir le Standard.", identity: "Affirmer votre Identité.", request: "Demander une séance", footerQuote: "\"La précision est notre seule devise. L'art est notre seule langue.\"", rights: "Tous droits réservés. Conçu pour l'avant-garde.", chatHeader: "Concierge IA", chatPlaceholder: "Posez-nous une question...", }, en: { tagline: "A luxury nail editorial studio. Specializing in high-precision hardware manicures.", location: "Verdun, Montreal", est: "Est. 2024", beyond: "Beyond Convention", philosophy: "We curate visual experiences for your fingertips. Precise. Artistic. Rebel.", scroll: "SCROLL TO DISCOVER", marquee: "* Bespoke Artistry * High Precision * High Fashion * Verdun QC *", runwayTitle: "The Runway", runwaySub: "Portfolio 01", look: "Look", editTitle: "The Edit", editSub: "The Menu", editDesc: "Each session is a collaboration between artist and subject. We focus on structure, longevity, and high-fashion aesthetics.", priceFrom: "Starting at", book: "Book Now", standard: "Redefining the Standard.", identity: "Claiming your Identity.", request: "Request Session", footerQuote: "\"Precision is our only currency. Artistry is our only language.\"", rights: "All Rights Reserved. Built for the Avant-Garde.", chatHeader: "AI Concierge", chatPlaceholder: "Ask us anything...", } }; const loadScript = (src) => { return new Promise((resolve) => { if (document.querySelector(`script[src="${src}"]`)) return resolve(); const script = document.createElement('script'); script.src = src; script.onload = resolve; document.head.appendChild(script); }); }; /** * ChatBot Component */ const ChatBot = ({ lang, t }) => { const [isOpen, setIsOpen] = useState(false); const [messages, setMessages] = useState([ { role: 'assistant', content: lang === 'fr' ? 'Bonjour. Comment puis-je vous aider aujourd\'hui?' : 'Hello. How can I assist you today?' } ]); const [input, setInput] = useState(''); const [loading, setLoading] = useState(false); const scrollRef = useRef(null); useEffect(() => { if (scrollRef.current) { scrollRef.current.scrollTop = scrollRef.current.scrollHeight; } }, [messages]); const handleSend = async () => { if (!input.trim() || loading) return; const userMsg = { role: 'user', content: input }; setMessages(prev => [...prev, userMsg]); setInput(''); setLoading(true); try { const response = await fetch('https://api.groq.com/openai/v1/chat/completions', { method: 'POST', headers: { 'Authorization': `Bearer ${GROQ_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model: "llama-3.3-70b-versatile", messages: [ { role: "system", content: `You are the high-end AI Concierge for Jolie Main Studio, a luxury nail salon in Verdun, Montreal. Be elegant, concise, and professional. You specialize in Russia Biab, Shellac, Extensions, and Creative Art. Always respond in the language used by the user: ${lang.toUpperCase()}. Pricing starts at $65-110. Booking is available at DashBooking. Address: 3800 Wellington St, Montreal.` }, ...messages, userMsg ], temperature: 0.7, max_tokens: 500 }) }); const data = await response.json(); const aiContent = data.choices?.[0]?.message?.content || "I apologize, I am experiencing a connection issue. Please try again."; setMessages(prev => [...prev, { role: 'assistant', content: aiContent }]); } catch (error) { setMessages(prev => [...prev, { role: 'assistant', content: "Error connecting to server." }]); } finally { setLoading(false); } }; return (
{isOpen && (
{t('chatHeader')}
{messages.map((m, i) => (
{m.content}
))} {loading &&
}
setInput(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSend()} placeholder={t('chatPlaceholder')} className="flex-1 bg-transparent border-none outline-none font-sans text-xs italic" />
)}
); }; export default function App() { const [libsReady, setLibsReady] = useState(false); const [loading, setLoading] = useState(true); const [mobileMenu, setMobileMenu] = useState(false); const [lang, setLang] = useState('fr'); const runwayRef = useRef(null); const horizontalRef = useRef(null); const t = (key) => TRANSLATIONS[lang][key]; useEffect(() => { const init = async () => { await loadScript('https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js'); await loadScript('https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/ScrollTrigger.min.js'); await loadScript('https://unpkg.com/lenis@1.1.13/dist/lenis.min.js'); setLibsReady(true); }; init(); }, []); useEffect(() => { if (!libsReady) return; const { gsap, ScrollTrigger, Lenis } = window; gsap.registerPlugin(ScrollTrigger); const lenis = new Lenis({ lerp: 0.1 }); function raf(time) { lenis.raf(time); requestAnimationFrame(raf); } requestAnimationFrame(raf); gsap.to(".preloader", { yPercent: -100, duration: 1.4, ease: "expo.inOut", delay: 1.5, onComplete: () => setLoading(false) }); gsap.to(".hero-img", { yPercent: 15, ease: "none", scrollTrigger: { trigger: ".hero", start: "top top", end: "bottom top", scrub: true } }); if (window.innerWidth > 1024) { const cards = gsap.utils.toArray('.runway-card'); gsap.to(cards, { xPercent: -100 * (cards.length - 1), ease: "none", scrollTrigger: { trigger: runwayRef.current, pin: true, scrub: 1, end: () => "+=" + runwayRef.current.offsetWidth } }); } gsap.utils.toArray('.reveal').forEach(el => { gsap.from(el, { y: 30, opacity: 0, duration: 1, ease: "power2.out", scrollTrigger: { trigger: el, start: "top 90%" } }); }); return () => { lenis.destroy(); ScrollTrigger.getAll().forEach(t => t.kill()); }; }, [libsReady]); const services = [ { name: "Russia Biab", img: ASSETS.runway1, price: "85+" }, { name: "Shellac", img: ASSETS.runway2, price: "65+" }, { name: "Extensions", img: ASSETS.runway3, price: "110+" }, { name: "Creative Art", img: ASSETS.runway4, price: "Bespoke" } ]; return (
{/* --- PRELOADER --- */}

Jolie Main

{/* --- CHATBOT --- */} {/* --- NAVIGATION --- */} {/* --- MOBILE NAV --- */}
{['fr', 'en'].map(l => ( ))}
{/* --- HERO SECTION --- */}

Jolie Main

Editorial Nail Art
{/* Absolute Detail Elements */}

{t('tagline')}

{t('location')}

{t('est')}

{t('beyond')}

{t('philosophy')}

{/* Floating Scroll Indicator */}
{t('scroll')}
{/* --- STATEMENT MARQUEE --- */}
{t('marquee')}
{t('marquee')}
{/* --- THE RUNWAY (HORIZONTAL) --- */}

{t('runwaySub')}

{t('runwayTitle')}

{services.map((service, idx) => (
{service.name}
{t('look')} 0{idx + 1}

{service.name}

))}
{/* --- SERVICE EDITORIAL --- */}

{t('editSub')}

{t('editTitle').split(' ')[0]}
{t('editTitle').split(' ')[1] || ''}

{t('editDesc')}

{services.map((s, i) => (
0{i+1}

{s.name}

{t('priceFrom')} ${s.price}

1024 ? 40 : 24} />
))}
{/* --- STUDIO STATEMENT --- */}

Verdun / Montréal

{lang === 'fr' ? 'Redéfinir le' : 'Redefining the'} Standard. {lang === 'fr' ? 'Affirmer votre' : 'Claiming your'} Identity.

{/* --- HIGH-DETAIL LOGO SHOWCASE --- */}

Brand Insignia

Logo Detail
{/* Duplicate title "Jolie Main Studio" removed here */}

{t('footerQuote')}

{/* --- FOOTER --- */}
); }