/* Production site — Direction C, refined + wired up to the booking wizard. * Single-page mobile-first landing for Soutenance.ma. */ const { BRAND: SBRAND, UNIVERSITIES: SUNIS, ALL_UNIVERSITIES: SALL_UNIS, PACKS: SPACKS, SERVICES: SSERVICES, SERVICE_ICONS: SSI, PhotoSlot: SPhoto, Icon: SIcon, UniMark: SUni } = window; const sColors = { bg: '#ffffff', paper: '#f5f3ef', ink: '#111111', inkSoft: '#6b6b6b', pink: '#e63462', pinkSoft: '#fef0f3', rule: 'rgba(0,0,0,0.08)' }; const sType = { display: { fontFamily: 'Manrope, system-ui, sans-serif', fontWeight: 600, letterSpacing: -1 }, sans: { fontFamily: 'Manrope, system-ui, sans-serif' }, mono: { fontFamily: '"DM Mono", ui-monospace, monospace' } }; function SiteRoot() { const openBooking = (pack = '') => { const url = 'reserver.html' + (pack ? '?pack=' + encodeURIComponent(pack) : ''); window.location.href = url; }; // Expose globally so any inline button (or Tweaks) can trigger React.useEffect(() => {window.openBooking = openBooking;}, []); return (
); } /* ── Nav ── */ function SiteNav({ openBooking }) { return (
Soutenance.ma
WhatsApp
); } /* ── Hero ── */ function SiteHero({ openBooking }) { return (

Capturez vos
moments de
soutenance.

Services de photographie, vidéo production et autres, dédiés aux étudiants qui souhaitent capturer leur moment de soutenance.

Voir les packs
{/* Universities sliding marquee */} {/* Stats strip */}
{[ { n: '+200', l: 'étudiants photographiés' }, { n: '6', l: 'universités couvertes' }, { n: '24h*', l: 'livraison express' }]. map((s, i) =>
{s.n}
{s.l}
)}
); } /* ── Universities Marquee ── */ function UnisMarquee() { // Duplicate the list so the loop is seamless const items = [...SALL_UNIS, ...SALL_UNIS]; return (
{items.map((u, i) =>
{u.short} {u.name}
)}
); } /* ── Services ── */ function SiteServices() { return (

Trois formats.
Un seul standard.

Toute prestation est livrée retouchée à la main, avec une galerie en ligne privée.

{SSERVICES.map((s, i) => { return (
{s.title}
{s.body}
0{i + 1}
); })}
); } /* ── Gallery ── */ function SiteGallery() { return (
— Portfolio

Quelques images
récentes.

Voir tout sur Instagram
); } /* ── Packs ── */ function SitePackCard({ pack, idx, openBooking }) { return (
{pack.featured &&
Recommandé
}
0{idx + 1} · {pack.duration}
{pack.name}
{pack.tagline}
{pack.price} MAD
{window.PACK_NOTE}
); } function SiteCustomCard({ openBooking }) { return (
Sur mesure
04 · Pack personnalisé
Construisez
votre pack.

Photos, vidéo, Reel, livraison express… choisissez exactement ce dont vous avez besoin et voyez le prix se mettre à jour en direct.

); } function SitePacks({ openBooking }) { return (

Trois formules
transparentes.

Pas d'extras cachés. Tous les packs incluent la retouche, la galerie privée et les droits d'usage personnel.

{SPACKS.map((p, i) => )}
); } /* ── Booking teaser (replaces the inline calendar — wizard does the real picking) ── */ function SiteBookingTeaser({ openBooking }) { return (
— Réservation

Réservez en
quatre étapes.

Pack, date, coordonnées, validation. On revient vers vous sur WhatsApp et par email avec la confirmation.

{[ { n: '01', t: 'Choisir un pack', d: 'Essentiel, Signature ou Prestige.' }, { n: '02', t: 'Sélectionner une date', d: 'Calendrier des disponibilités en juin & juillet.' }, { n: '03', t: 'Vos coordonnées', d: 'Pour qu\u2019on puisse vous joindre.' }, { n: '04', t: 'Confirmation', d: 'Email et message WhatsApp immédiats.' }]. map((s) =>
{s.n}
{s.t}
{s.d}
)}
); } /* ── Testimonials ── */ function SiteTestimonials() { const items = [ { quote: 'Service au top, photos magnifiques. Mes parents ont adoré l\u2019album.', author: 'Yasmine A.', school: 'ENCG Rabat' }, { quote: 'L\u2019équipe est super pro et le reel souvenir a fait le tour de la famille.', author: 'Mehdi B.', school: 'UM6P' }, { quote: 'Réservation simple, livraison rapide. Je recommande vivement !', author: 'Salma K.', school: 'UM5 Souissi' }]; return (
{items.map((it, i) =>
« {it.quote} »
{it.author.split(' ').map((s) => s[0]).join('')}
{it.author}
{it.school}
)}
); } /* ── Footer ── */ function SiteFooter() { return ( ); } window.SiteRoot = SiteRoot;