// Shared primitives across the three directions. // Striped image placeholder — the design-canvas style guide says use these // instead of hand-drawn SVGs for photography that hasn't been shot yet. function ImgPH({ label, ratio, height, tint, labelColor, labelBg, style, src, objectPosition, showLabel, children }) { const s = { width: '100%', aspectRatio: ratio, height, '--ph-tint': tint, '--ph-label': labelColor, '--ph-label-bg': labelBg, ...style, }; const showLbl = showLabel ?? !src; return (
{src ? ( {label ) : null} {children} {label && showLbl ? {label} : null}
); } // Photo registry — pre-curated mapping of photos for each context. // USER PHOTOS (from Ali's actual trips) take priority where they fit. const PHOTOS = { // === USER PHOTOS — the real thing === dahchour: 'photos/dahchour-couple.jpg', // couple walking toward Red Pyramid — hero gold aliMastaba: 'photos/ali-mastaba.jpg', // Ali with flashlight on a relief — signature toutankhamon: 'photos/toutankhamon.jpg', // Tut mask, gold/lapis on black nilSunset: 'photos/nil-coucher-soleil.jpg', // boat silhouette at sunset on the Nile pharaonGranit: 'photos/pharaon-granit.jpg', // granite pharaoh head, dark backdrop alleeSphinx: 'photos/allee-sphinx-louxor.jpg', // avenue of sphinxes + Coptic church // === Mapped slots (used across the three directions) === // Hero — wide cinematic. Now uses user photos. cairo: 'photos/dahchour-couple.jpg', // couple at Dahchour — humans + monument luxorTemples: 'photos/allee-sphinx-louxor.jpg', // avenue of sphinxes luxorNight: 'photos/pharaon-granit.jpg', // dramatic dark portrait nile: 'photos/nil-coucher-soleil.jpg', // sunset boat on Nile desert: 'photos/p12.jpg', // dunes & reflections // Detail / atmosphere hieroglyphs: 'photos/ali-mastaba.jpg', // Ali at work — best detail shot stainedGlass: 'photos/allee-sphinx-louxor.jpg', copticChurch: 'photos/allee-sphinx-louxor.jpg', mashrabiya: 'photos/ali-mastaba.jpg', ramesseum: 'photos/pharaon-granit.jpg', // moody granite head museum: 'photos/toutankhamon.jpg', // Tut mask // People ali: 'photos/ali-mastaba.jpg', // Ali in the field, lighting a relief aliWithTraveler: 'photos/ali-mastaba.jpg', group: 'photos/dahchour-couple.jpg', family: 'photos/dahchour-couple.jpg', // couple at pyramid // Extras philaeBoat: 'photos/nil-coucher-soleil.jpg', templeWall: 'photos/ali-mastaba.jpg', reliefWide: 'photos/ali-mastaba.jpg', duneDetail: 'photos/p13.jpg', felucca: 'photos/nil-coucher-soleil.jpg', }; // Minimal egypt outline (very stylized — just the Nile + a few destination // dots). Kept simple and abstract; not a literal map. function EgyptOutline({ color = '#000', accent = '#c96442', dots = [], onDot, activeId }) { // Coordinate system 100x140. Dots use the same coords. return ( {/* Country silhouette — abstracted */} {/* Nile — a flowing line from south to north */} {/* Red Sea hint */} {dots.map((d) => { const active = d.id === activeId; return ( onDot && onDot(d.id)} style={{ cursor: 'pointer' }}> {active && ( )} {d.label} ); })} ); } // Common destinations data — each direction can tweak labels/tagline. const DESTINATIONS = [ { id: 'cairo', label: 'Le Caire', x: 52, y: 22, labelAnchor: 'right', tagline: 'Pyramides, Sphinx, Khan el-Khalili', blurb: 'Gizeh au lever du soleil, le Grand Musée Égyptien sans la foule, Saqqara, le vieux Caire copte et un thé à Khan el-Khalili.' }, { id: 'luxor', label: 'Louxor', x: 56, y: 70, labelAnchor: 'right', tagline: 'Karnak & Vallée des Rois', blurb: 'L\'essentiel en une journée — ou trois. Karnak, Vallée des Rois, temples de Louxor, rive ouest, et la possibilité d\'une montgolfière à l\'aube.' }, { id: 'redsea', label: 'Mer Rouge', x: 84, y: 56, labelAnchor: 'left', tagline: 'Hurghada · Marsa Alam', blurb: 'Pause balnéaire en fin de circuit : récifs coralliens, snorkeling, désert oriental — pour souffler après les sites.' }, ]; // Real testimonials sourced from TripAdvisor (5 sur 5 — 40 avis) const REVIEWS = [ { author: 'Jonathan L', context: 'Famille · novembre 2025', rating: 5, title: 'Le meilleur guide pour découvrir Louxor en 1 jour', body: "Une journée incroyable à Louxor grâce à Ali. En une seule journée, il a réussi à nous faire découvrir l'essentiel tout en prenant le temps d'expliquer chaque endroit. Aucun stress, aucune attente — un guide passionné, patient et attentionné." }, { author: 'Françoise S.', context: 'Couple · croisière sur le Nil', rating: 5, title: 'Inoubliable croisière sur le Nil', body: "Merveilleuse croisière sur le Nil avec Ali. Il nous a fait partager sa passion pour l'égyptologie et découvrir la culture de son pays avec simplicité, gentillesse et une constante disponibilité doublée d'un sourire permanent." }, { author: 'Shirine T.', context: 'Groupe · 7 adultes & 6 enfants', rating: 5, title: 'Une très belle rencontre', body: "Ali a tout organisé depuis l'atterrissage au Caire jusqu'au départ — visites de musées, réservations, minibus. Un très bon niveau de français, une vraie connaissance de l'Égypte, et la capacité de s'adapter à toutes nos demandes." }, { author: 'Remacle L.', context: 'Famille · 6 personnes, vallée du Nil', rating: 5, title: 'Visites parfaitement adaptées aux enfants', body: "5 jours sur la vallée du Nil avec deux ados. Les visites étaient parfaitement adaptées à leurs besoins. Ali est un excellent égyptologue qui nous fait aimer son pays et son histoire. Tout était parfaitement organisé." }, { author: 'Anastasie N.', context: 'Solo · Gizeh', rating: 5, title: 'Journée à Gizeh exceptionnelle', body: "Ali est un égyptologue passionné aux connaissances incroyables. Il m'a captivée toute la journée. J'ai tellement appris à ses côtés — je sais que je reviendrai." }, { author: 'NorthStar', context: 'Couple · 3 jours', rating: 5, title: 'Guide exceptionnel', body: "Sa grande culture nous a impressionnés, ainsi que sa parfaite connaissance du français et de l'étymologie. 3 jours à découvrir les trésors égyptiens dans une franche gaieté." }, ]; // Signature thematic experiences — what Ali offers as advertised const THEMES = [ { k: '01', t: 'Archéologie', d: 'Sites royaux, fouilles récentes, lecture de stratigraphies sur le terrain.' }, { k: '02', t: 'Hiéroglyphes', d: 'Décryptage in situ — cartouches, formules, noms royaux, mythologies gravées.' }, { k: '03', t: 'Étymologie', d: 'Doctorat à l\'appui : la racine des mots, des dieux, des lieux.' }, { k: '04', t: 'Théologie', d: 'Cosmogonies égyptiennes, panthéon, rites — du temple au tombeau.' }, { k: '05', t: 'Spiritualité', d: 'Voyage initiatique pour qui cherche autre chose qu\'une visite.' }, { k: '06', t: 'Vie quotidienne', d: 'Le Caire des Cairotes : marchés, ruelles, cafés, familles.' }, ]; // Real public booking signature const ALI = { name: 'Ali', title: 'Guide égyptologue francophone', whatsapp: '+20 11 22 58 00 58', whatsappRaw: '00201122580058', city: 'Le Caire, Égypte', rating: '5,0', reviewCount: '40', experience: '27', signaturePrice: '40€', signature: 'Visite privée — Pyramides & Grand Sphinx', langs: 'Français · Anglais · Arabe', credentials: [ 'Études supérieures en archéologie', 'Hiéroglyphes & étymologie', 'Théologie égyptienne', 'Doctorat en étymologie', ], }; // Tiny helpers const cls = (...xs) => xs.filter(Boolean).join(' '); // Territoires développés — données enrichies pour la section magazine. const TERRITOIRES = [ { id: 'cairo', label: 'Le Caire', region: 'Basse-Égypte', tagline: 'Pyramides, Sphinx & vieux Caire', photo: 'photos/dahchour-couple.jpg', imgLabel: 'Pyramide rouge — Dahchour', tint: 'rgba(184,107,58,0.10)', intro: "La capitale et son désert royal — Gizeh, Saqqara, Dahchour — puis le Caire copte, le Caire fatimide, et Khan el-Khalili pour le thé.", highlights: [ { t: 'Gizeh à l\'aube', d: 'Pyramides et Grand Sphinx avant les bus.' }, { t: 'Saqqara & Dahchour', d: 'Pyramide à degrés, pyramide rouge, mastabas.' }, { t: 'Grand Musée Égyptien', d: 'La salle Toutankhamon, sans la foule.' }, { t: 'Vieux Caire copte', d: 'Églises suspendues, ruelles, synagogue.' }, ], duration: '3 à 5 jours', season: 'Octobre → avril', }, { id: 'luxor', label: 'Louxor', region: 'Haute-Égypte', tagline: 'Karnak, Vallée des Rois & le Nil', photo: 'photos/allee-sphinx-louxor.jpg', imgLabel: 'Allée des sphinx — Louxor', tint: 'rgba(169,129,66,0.12)', intro: "Thèbes l'antique, des deux côtés du Nil. Temples sur la rive est, tombes royales sur la rive ouest, et la possibilité d'une montgolfière à l'aube.", highlights: [ { t: 'Karnak', d: 'Salle hypostyle, lecture de cartouches in situ.' }, { t: 'Vallée des Rois', d: 'Tombes ouvertes choisies selon vos envies.' }, { t: 'Rive ouest', d: 'Hatchepsout, Ramesseum, Memnon.' }, { t: 'Felouque au coucher', d: 'Le Nil, calme, à voile latine.' }, ], duration: '2 à 4 jours', season: 'Novembre → mars', }, { id: 'nile', label: 'Le Nil & au-delà', region: 'Croisière · Mer Rouge', tagline: 'Edfou, Kom Ombo, Assouan, mer Rouge', photo: 'photos/nil-coucher-soleil.jpg', imgLabel: 'Coucher de soleil sur le Nil', tint: 'rgba(60,40,20,0.18)', intro: "La descente du Nil entre Louxor et Assouan, temple par temple — puis la pause balnéaire en mer Rouge si l'envie est là.", highlights: [ { t: 'Edfou & Kom Ombo', d: 'Horus, Sobek — temples ptolémaïques.' }, { t: 'Philae & Assouan', d: 'Temple d\'Isis, marché nubien, dîner local.' }, { t: 'Abou Simbel', d: 'Lever de soleil sur la façade colossale.' }, { t: 'Mer Rouge', d: 'Hurghada ou Marsa Alam pour souffler.' }, ], duration: '4 à 7 jours', season: 'Octobre → mai', }, ]; function useCarousel(length, autoMs) { const [i, setI] = React.useState(0); React.useEffect(() => { if (!autoMs) return; const t = setInterval(() => setI((v) => (v + 1) % length), autoMs); return () => clearInterval(t); }, [length, autoMs]); return { i, next: () => setI((v) => (v + 1) % length), prev: () => setI((v) => (v - 1 + length) % length), go: setI, }; } Object.assign(window, { ImgPH, EgyptOutline, DESTINATIONS, REVIEWS, THEMES, ALI, PHOTOS, cls, useCarousel, TERRITOIRES });