// Sections : Nav, Hero, Manifesto, Services, Portfolio, Process, Locations, FAQ, Devis, Footer const { useState, useEffect, useRef } = React; // ------- Reveal-on-scroll hook ------- function useReveal() { const ref = useRef(null); useEffect(() => { const el = ref.current; if (!el) return; const io = new IntersectionObserver( (entries) => entries.forEach((e) => e.isIntersecting && e.target.classList.add("in")), { threshold: 0.12, rootMargin: "0px 0px -60px 0px" } ); io.observe(el); return () => io.disconnect(); }, []); return ref; } // ------- WhatsApp icon ------- const WhatsappIcon = ({ size = 16 }) => ; // ------- Instagram icon ------- const InstagramIcon = ({ size = 16 }) => ; const WHATSAPP_URL = "https://wa.me/33613481628?text=Bonjour%20Nova%20Studio%2C%20j'aimerais%20\u00e9changer%20au%20sujet%20d'un%20mariage."; // ------- TOP STRIP ------- function TopStrip() { return (
Réservations 2026 ouvertes
WhatsApp Demander un devis
); } // ------- NAV ------- function Nav({ onDevis }) { const [scrolled, setScrolled] = useState(false); const [menuOpen, setMenuOpen] = useState(false); useEffect(() => { const onS = () => setScrolled(window.scrollY > 60); onS(); window.addEventListener("scroll", onS, { passive: true }); return () => window.removeEventListener("scroll", onS); }, []); useEffect(() => { document.body.style.overflow = menuOpen ? "hidden" : ""; return () => {document.body.style.overflow = "";}; }, [menuOpen]); const close = () => setMenuOpen(false); const LINKS = [ ["#manifeste", "Manifeste"], ["#univers", "Accompagnement"], ["#processus", "Méthode"], ["#lieux", "Lieux"], ["#faq", "FAQ"]]; return (
Nova Studio
Demander un devis
Appeler
Demander un devis WhatsApp
); } // ------- HERO ------- function Hero({ image }) { const [loaded, setLoaded] = useState(false); useEffect(() => { const t = setTimeout(() => setLoaded(true), 80); return () => clearTimeout(t); }, []); return (
Wedding planner · Sud de la France

Vous allez
vous dire OUI.
On s'occupe du reste.

Nova Studio crée des célébrations raffinées et immersives en Provence et sur la Côte d’Azur, pensées pour laisser une empreinte durable dans les souvenirs de chacun.

Demander un devis WhatsApp
Découvrir
Photo by Léa Nivet / neashoot
); } // ------- Ribbon marquee ------- function Ribbon() { const items = [ "Mariages d'exception", "Cérémonie laïque", "Décor floral", "Coordination jour J", "Vin d'honneur & dîner", "Wedding design"]; const seq = [...items, ...items, ...items]; return (
{seq.map((w, i) => {w} )}
); } // ------- MANIFESTO ------- function Manifesto() { const ref = useReveal(); return (
— I Manifeste

Des célébrations à votre image,
pensées avec exigence.

Nova Studio est né d’une envie simple : créer des événements qui se ressentent avant même de se raconter.

Entre Méditerranée, architecture du Sud et esthétique intemporelle, nous imaginons des mariages et célébrations élégants, vivants et profondément personnels.

On aime les expériences pensées avec soin, les lieux qui ont du caractère et les soirées qui donnent envie de prolonger la nuit.

Nous croyons à la beauté discrète, aux ambiances sincères et aux événements qui ressemblent réellement à ceux qui les vivent.

Basées à Marseille, nous accompagnons un nombre limité de projets chaque saison afin d’offrir une attention entière à chaque histoire.

— Lucie & Mina, Marseille
Photo by Léa Nivet / neashoot
); } // ------- SERVICES ------- function Services() { return (
— IIAccompagnement

Deux façons de
nous confier le oui.

Que vous souhaitiez être accompagnés à chaque étape ou simplement profiter de votre journée en toute sérénité, nous proposons un accompagnement adapté à vos besoins, avec la même attention portée à chaque détail.

{UNIVERS.map((u) =>
{u.title} {u.n} Photo by Léa Nivet / neashoot

{u.title}

{u.desc}

)}
); } // ------- PORTFOLIO ------- function Portfolio() { return (
— IIIRéalisations

Des oui
que l'on n'oublie pas.

Quelques instants de mariages récents, parés par respect pour l'intimité des couples qui nous ont fait confiance.

{PORTFOLIO.map((p, i) =>
{p.title}

{p.title}

{p.place} · {p.year}
)}
); } // ------- PROCESS ------- function Process() { return (
— IVMéthode

Une expérience pensée dans les moindres détails.

De la première conversation au dernier verre partagé, nous vous accompagnons avec exigence, fluidité et sens du détail afin de créer un événement aussi élégant qu’inoubliable.

{PROCESS.map((s) =>
{s.n}/ {s.suffix}

{s.title}

{s.body}

)}
); } // ------- LOCATIONS ------- function Locations() { return (
— VLieux

Mariages en
Provence et Côte d'Azur.

Notre carnet d’adresses rassemble des domaines privés, maisons de caractère et lieux confidentiels à travers le Sud de la France, sélectionnés pour leur charme, leur lumière et l’atmosphère unique qu’ils offrent à chaque célébration.

{LIEUX.map((l, i) =>
{l.img && {l.name} {e.target.style.display = 'none';e.target.closest('.place').classList.remove('has-photo');}} onLoad={(e) => e.target.closest('.place').classList.add('has-photo')} />}
{l.coord} 0{i + 1}

{l.name}

{l.tag}
{l.note}
)}
); } // ------- FAQ ------- function FaqSection() { const [open, setOpen] = useState(0); return (
— VIFAQ

Vos questions
les plus fréquentes...

Et si la réponse n'est pas ici, écrivez-nous. Nous répondons sous 24h, toujours en personne.

{FAQ.map((f, i) =>
setOpen(open === i ? -1 : i)}>
{f.q}

{f.a}

)}
); } // ------- DEVIS ------- function Devis() { const [form, setForm] = useState({ name: "", email: "", phone: "", date: "", place: "", desc: "" }); const [mode, setMode] = useState("Coordination Jour J"); const [guests, setGuests] = useState("50 – 100"); const [budget, setBudget] = useState(""); const [presta, setPresta] = useState([]); const [status, setStatus] = useState("idle"); // idle | sending | sent | error const submit = async (e) => { e.preventDefault(); // ⚠️ Remplacez VOTRE_ID par l'identifiant de votre formulaire Formspree // (voir https://formspree.io — créez un formulaire, copiez l'URL fournie). const ENDPOINT = "https://formspree.io/f/xjgdyovn"; const payload = { "Accompagnement": mode, "Prénom & Nom": form.name, "Email": form.email, "Téléphone": form.phone, "Date envisagée": form.date, "Nombre d'invités": guests, "Budget": budget, "Lieu": form.place, "Prestataires": presta.join(", "), "Message": form.desc, _subject: `Nouvelle demande de devis — ${form.name || "Nova Studio"}` }; // Tant que l'identifiant n'est pas configuré, on simule un envoi réussi. if (ENDPOINT.includes("VOTRE_ID")) { setStatus("sent"); setTimeout(() => setStatus("idle"), 4500); return; } setStatus("sending"); try { const res = await fetch(ENDPOINT, { method: "POST", headers: { "Content-Type": "application/json", "Accept": "application/json" }, body: JSON.stringify(payload) }); if (res.ok) { setStatus("sent"); setForm({ name: "", email: "", phone: "", date: "", place: "", desc: "" }); setPresta([]); setBudget(""); setTimeout(() => setStatus("idle"), 5000); } else { setStatus("error"); } } catch (err) { setStatus("error"); } }; const sent = status === "sent"; const togglePresta = (p) => setPresta((cur) => cur.includes(p) ? cur.filter((x) => x !== p) : [...cur, p]); const pickMode = (m) => {setMode(m);setPresta([]);setBudget("");}; const GUESTS = ["Moins de 50", "50 – 100", "100 – 150", "Plus de 150"]; const MODES = ["Coordination Jour J", "Design de A à Z"]; const PRESTA_BY_MODE = { "Coordination Jour J": ["Photographe", "Vidéaste", "DJ / Live Music", "Fleuriste", "Maquillage", "Officiant", "Transport invités"], "Design de A à Z": ["Décoration", "Art floral", "Papeterie", "Art de table", "Mobilier", "Lighting design", "Photographe", "Vidéaste", "DJ / Live Music", "Officiant", "Installation sur mesure"] }; const PRESTA_LABEL = { "Coordination Jour J": "Prestataires déjà réservés", "Design de A à Z": "Prestataires souhaités" }; const LIEU_LABEL = { "Coordination Jour J": "Lieu choisi", "Design de A à Z": "Lieu recherché" }; const LIEU_PLACEHOLDER = { "Coordination Jour J": "Domaine, château, lieu déjà réservé…", "Design de A à Z": "Provence, domaine privé, bord de mer…" }; const BUDGET_BY_MODE = { "Coordination Jour J": ["< 1 500 €", "1 500 – 2 500 €", "2 500 – 4 000 €", "4 000 € +"], "Design de A à Z": ["< 5 000 €", "5 000 – 10 000 €", "10 000 – 20 000 €", "20 000 – 40 000 €", "40 000 – 80 000 €", "80 000 € +"] }; const BUDGET_LABEL = { "Coordination Jour J": "Budget coordination", "Design de A à Z": "Budget global estimé" }; const INTRO_BY_MODE = { "Coordination Jour J": "Vous avez imaginé votre mariage, nous veillons à ce que tout se déroule avec fluidité. Partagez-nous les premières lignes de votre projet, et orchestrons ensemble un jour J serein.", "Design de A à Z": "De la première idée au dernier détail, nous imaginons et orchestrons l'intégralité de votre mariage. Partagez-nous les premières lignes de votre projet, et créons ensemble une célébration entièrement à votre image." }; return (
— VIIIDevis

Imaginons une
célébration à
votre image.

{INTRO_BY_MODE[mode]}

Détails de préparatifs — Nova Studio Photo by Léa Nivet / neashoot
Quel accompagnement ?
{MODES.map((m) => )}
setForm({ ...form, name: e.target.value })} placeholder="Camille Dubois" required />
setForm({ ...form, email: e.target.value })} placeholder="camille@email.fr" required />
setForm({ ...form, phone: e.target.value })} placeholder="06 12 34 56 78" />
setForm({ ...form, date: e.target.value })} placeholder="Été 2026" />
{GUESTS.map((g) => )}
{BUDGET_BY_MODE[mode].map((b) => )}
setForm({ ...form, place: e.target.value })} placeholder={LIEU_PLACEHOLDER[mode]} />
{PRESTA_BY_MODE[mode].map((p) => )}