diff --git a/src/App.tsx b/src/App.tsx index 1bf0ed7..b49f0c0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,305 +1,295 @@ -import { useMemo, useState } from 'react'; -import { AnimatePresence, motion } from 'framer-motion'; +type Destination = { + name: string; + vibe: string; + duration: string; + price: string; + image: string; +}; -const missions = [ - "Transforme ton cahier en magazine spatial en n'utilisant que ce qu'il y a dans ta trousse.", - 'Compose un haïku dramatique sur la leçon actuelle en trois emojis mentaux.', - 'Crée une mini bande-annonce dans ta tête pour un film inspiré de ce chapitre.', - 'Imagine une version rétro-futuriste de la classe et note trois éléments déco.', - 'Conçois un signal secret pour prévenir un camarade qu\'il est temps de sourire.', - 'Dresse l\'inventaire de ton sac comme si tu étais un explorateur temporel.', - 'Réécris la consigne entendue comme un slogan publicitaire mystérieux.', -]; +type Offer = { + title: string; + description: string; + badge: string; + includes: string[]; +}; -const ambiances = [ - 'Ambiance agent secret feutré : tout bruit devient un indice sonore.', - 'Ambiance studio de création : chaque objet est un prototype en devenir.', - 'Ambiance capsule temporelle : tu rédiges pour le toi du futur.', - 'Ambiance festival minimaliste : les lumières néon sont imaginaires mais intenses.', - 'Ambiance café littéraire : les chuchotements deviennent des dialogues stylés.', -]; +type Testimonial = { + name: string; + trip: string; + quote: string; +}; -const twists = [ - 'Ajoute une contrainte couleur (uniquement des tons glaciaux ou solaires).', - 'Insère un symbole secret qui n\'a de sens que pour toi.', - 'Tout doit pouvoir être raconté en trente secondes chrono.', - 'Imagine que tu dois présenter le résultat à un extraterrestre courtois.', - 'Inclue une référence subtile à ta chanson favorite du moment.', +const destinations: Destination[] = [ + { + name: 'Bali, Indonésie', + vibe: 'Temples, jungle, beach clubs et retraites bien-être', + duration: '10 jours', + price: 'Dès 1 490€', + image: + 'https://images.unsplash.com/photo-1537953773345-d172ccf13cf1?auto=format&fit=crop&w=1400&q=80', + }, + { + name: 'Kyoto, Japon', + vibe: 'Traditions, ryokans, gastronomie et quartiers historiques', + duration: '9 jours', + price: 'Dès 1 980€', + image: + 'https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e?auto=format&fit=crop&w=1400&q=80', + }, + { + name: 'Marrakech, Maroc', + vibe: 'Riads premium, désert d’Agafay et expériences artisanales', + duration: '6 jours', + price: 'Dès 890€', + image: + 'https://images.unsplash.com/photo-1597212618440-806262de4f6d?auto=format&fit=crop&w=1400&q=80', + }, + { + name: 'Reykjavik, Islande', + vibe: 'Roadtrip volcanique, cascades et aurores boréales', + duration: '8 jours', + price: 'Dès 1 650€', + image: + 'https://images.unsplash.com/photo-1504893524553-b855bce32c67?auto=format&fit=crop&w=1400&q=80', + }, ]; -const microQuests = [ +const offers: Offer[] = [ { - title: 'Flash-croquis', - duration: '2 min', - description: - 'Croque en cinq traits maximum ce qui se passe devant toi comme si c\'était une scène de théâtre.', + title: 'Voyage sur-mesure', + description: 'Une proposition 100% personnalisée selon vos dates, envies et niveau de confort.', + badge: 'Signature', + includes: ['Conseiller dédié', 'Itinéraire personnalisé', 'Assistance 7j/7'], }, { - title: 'Cartographie secrète', - duration: '3 min', - description: 'Dessine un mini-plan de la classe et invente un surnom pour trois endroits.', + title: 'Lune de miel', + description: 'Des séjours romantiques haut de gamme avec expériences exclusives à deux.', + badge: 'Romance', + includes: ['Hôtels d’exception', 'Moments privés', 'Surprises sur place'], }, { - title: 'Playlist silencieuse', - duration: '1 min', - description: 'Choisis la musique imaginaire parfaite pour le moment et écris-en trois adjectifs.', + title: 'Family first', + description: 'Des vacances fluides pour les familles, sans stress logistique.', + badge: 'Famille', + includes: ['Activités multi-âges', 'Transferts optimisés', 'Support réactif'], }, { - title: 'Emoji météo', - duration: '30 s', - description: 'Décris l\'ambiance générale avec deux emojis météo que tu garderais en mémoire.', + title: 'Évasion express', + description: 'City break premium prêt rapidement avec rapport qualité/prix maîtrisé.', + badge: 'Week-end', + includes: ['Départ rapide', 'Programme équilibré', 'Budget transparent'], + }, +]; + +const stats = [ + { value: '12 000+', label: 'voyageurs accompagnés' }, + { value: '48', label: 'pays partenaires' }, + { value: '4.9/5', label: 'note moyenne clients' }, + { value: '24h', label: 'délai de proposition' }, +]; + +const testimonials: Testimonial[] = [ + { + name: 'Camille & Idriss', + trip: 'Lune de miel au Japon', + quote: + 'On a eu un voyage parfaitement pensé, avec des adresses incroyables et un rythme vraiment adapté à nous.', + }, + { + name: 'Sophie R.', + trip: 'Family trip à Bali', + quote: 'Tout était clair, fluide, et l’équipe nous a aidés dès qu’on avait une question pendant le séjour.', }, { - title: 'Selfie mental', - duration: '2 min', - description: 'Imagine un selfie cinématique de toi ici et décris le décor en une phrase.', + name: 'Nassim M.', + trip: 'Roadtrip Islande', + quote: 'L’itinéraire était impeccable. On a profité à fond sans perdre de temps sur l’organisation.', }, ]; -const timeline = [ +const faqs = [ { - label: 'Calibration', - detail: 'Observe la salle comme si tu faisais un repérage de scène.', - length: '1 min', + question: 'Combien de temps pour recevoir un devis ? ', + answer: 'Nous envoyons une première proposition sous 24h ouvrées.', }, { - label: 'Mission', - detail: 'Lance ton mix et note les premières idées qui débordent.', - length: '4 min', + question: 'Pouvez-vous gérer les vols + hôtels + activités ?', + answer: 'Oui, nous pouvons gérer l’ensemble du séjour ou seulement une partie selon vos besoins.', }, { - label: 'Finition', - detail: 'Peaufine un détail qui fera sourire ton toi du futur.', - length: '3 min', + question: 'Proposez-vous des paiements échelonnés ?', + answer: 'Oui, plusieurs options de paiement peuvent être proposées selon le dossier.', }, ]; -type MissionMix = { - mission: string; - ambiance: string; - twist: string; -}; - -function pickAnother(items: T[], previous?: T) { - if (items.length === 1) return items[0]; - let candidate = items[Math.floor(Math.random() * items.length)]; - while (candidate === previous) { - candidate = items[Math.floor(Math.random() * items.length)]; - } - return candidate; -} - -function createMix(previous?: MissionMix): MissionMix { - return { - mission: pickAnother(missions, previous?.mission), - ambiance: pickAnother(ambiances, previous?.ambiance), - twist: pickAnother(twists, previous?.twist), - }; -} - export default function App() { - const [mix, setMix] = useState(() => createMix()); - const [stepIndex, setStepIndex] = useState(0); - - const vibeCards = useMemo(() => microQuests.concat(microQuests.slice(0, 2)), []); - - const progress = ((stepIndex + 1) / timeline.length) * 100; - return ( -
-
-
-
-
-
- -
-
-

Mode incognito

-

- Kit anti-ennui ultra discret pour transformer la classe en studio créatif. -

-

- Pas de jeux, pas besoin de bouger de ta chaise : juste des micro missions stylées à déclencher du bout des doigts. Mobile - first, iPad ready, imagination maximale. -

-
+
+
+
+
+

Aetheria Travel

+

Agence de voyage premium

+
+ + + Demander un devis + +
+
-
-
-
-
-

Mix instantané

-

Ton brief secret

-
- setMix((previous) => createMix(previous))} - className="rounded-full bg-accent px-5 py-3 text-sm font-semibold text-night shadow-halo transition focus:outline-none focus:ring focus:ring-accent/40" - > - Remix éclair - +
+
+
+

+ Voyagez mieux +

+

+ Une agence qui transforme vos envies en vrais souvenirs. +

+

+ Nous créons des voyages sur-mesure élégants, structurés et sans friction. Vous profitez pleinement, on orchestre + chaque détail. +

+ +
    + {stats.map((item) => ( +
  • +
    {item.value}
    +

    {item.label}

    +
  • + ))} +
+
-
- - - Mission : {mix.mission} - - - - - Ambiance : {mix.ambiance} - - - - - Twist : {mix.twist} - - -
+
+ Voyage premium au bord de la mer
+
-
-
-
-

Timeline

-

Sprint créatif de 8 minutes

-
-
-

Étape {stepIndex + 1}

-

{timeline[stepIndex].length}

-
-
-
- -
-
- - -

{timeline[stepIndex].length}

-

{timeline[stepIndex].label}

-

{timeline[stepIndex].detail}

-
-
-
-
- setStepIndex((index) => (index - 1 + timeline.length) % timeline.length)} - className="w-full rounded-full border border-white/20 px-4 py-3 text-sm font-semibold text-chrome/80 transition hover:border-white/40 focus:outline-none focus:ring focus:ring-ember/30 sm:w-auto" - > - Étape précédente - - setStepIndex((index) => (index + 1) % timeline.length)} - className="w-full rounded-full bg-ember px-4 py-3 text-sm font-semibold text-night transition focus:outline-none focus:ring focus:ring-ember/30 sm:w-auto" - > - Prochaine étincelle - -
+
+
+

Des offres nettes, premium et efficaces

+

On garde le style, la simplicité et le sens du détail.

+
+
+ {offers.map((offer) => ( +
+ {offer.badge} +

{offer.title}

+

{offer.description}

+
    + {offer.includes.map((item) => ( +
  • • {item}
  • + ))} +
+
+ ))}
-
-
-
-

Micro-quêtes

-

Scroll discret, idées XL

-
- Glisse latéralement ➜ +
+
+

Destinations qui déclenchent le départ

-
-
- {vibeCards.map((quest, index) => ( - -
- {quest.duration} - #{index + 1} +
+ {destinations.map((destination) => ( +
+ {destination.name} +
+

{destination.name}

+

{destination.vibe}

+
+ {destination.duration} + {destination.price}
-

{quest.title}

-

{quest.description}

- - ))} -
+
+ + ))}
-
-
-

Garde-fous

-

Règles d\'ultra discrétion

-
    -
  • • Tout reste silencieux : c\'est ton cinéma intérieur.
  • -
  • • Un carnet ou l\'app Notes suffit comme plateau de tournage.
  • -
  • • Chrono souple : tu peux couper ou relancer le mix quand tu veux.
  • -
  • • Bonus : partage la mission finale uniquement avec quelqu\'un qui saura apprécier.
  • -
+
+
+

Ce que disent nos voyageurs

- -
-

Upgrade

-

Si la séance dure plus longtemps

-
    -
  • • Assemble plusieurs missions pour créer un mini magazine clandestin.
  • -
  • • Écris une lettre à toi-même de demain en relatant ta meilleure trouvaille.
  • -
  • • Crée un classement des objets les plus dramatiques de la classe.
  • -
  • • Imagine une affiche de film inspirée du prof du jour (attention : respect total !).
  • -
+
+ {testimonials.map((testimonial) => ( +
+

“{testimonial.quote}”

+

{testimonial.name}

+

{testimonial.trip}

+
+ ))}
-
-

- Glisse, griffonne, respire : c\'est ton laboratoire secret pour survivre aux heures longues. -

-

- Optimisé pour iPad et smartphones : tout se joue à un doigt, sans jamais attirer l\'attention. Quand tu veux revenir au - monde réel, il suffit de fermer l\'onglet. +

+

FAQ

+ {faqs.map((faq) => ( +
+

{faq.question}

+

{faq.answer}

+
+ ))} +
+ +
+

Parlons de votre prochain départ

+

+ Dites-nous vos dates, budget et style de voyage. On vous envoie une proposition claire et personnalisée sous 24h.

-
-
+
+ + + + +