| <!DOCTYPE html> |
| <html lang="fr"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>MediBook - Votre solution de rendez-vous médicaux</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| <style> |
| |
| .calendar-day { |
| transition: all 0.2s ease; |
| } |
| .calendar-day:hover:not(.disabled) { |
| background-color: #3b82f6; |
| color: white; |
| cursor: pointer; |
| } |
| .calendar-day.selected { |
| background-color: #3b82f6; |
| color: white; |
| } |
| .time-slot:hover { |
| background-color: #3b82f6; |
| color: white; |
| cursor: pointer; |
| } |
| .time-slot.selected { |
| background-color: #3b82f6; |
| color: white; |
| } |
| .doctor-card:hover { |
| transform: translateY(-5px); |
| box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); |
| } |
| #searchResults { |
| max-height: 400px; |
| overflow-y: auto; |
| } |
| .nav-link.active { |
| border-bottom: 3px solid #3b82f6; |
| color: #3b82f6; |
| } |
| .dropdown:hover .dropdown-menu { |
| display: block; |
| } |
| .tab-content { |
| display: none; |
| } |
| .tab-content.active { |
| display: block; |
| } |
| .fade-in { |
| animation: fadeIn 0.3s ease-in; |
| } |
| @keyframes fadeIn { |
| from { opacity: 0; } |
| to { opacity: 1; } |
| } |
| </style> |
| </head> |
| <body class="font-sans bg-gray-50"> |
| |
| <header class="bg-white shadow-sm sticky top-0 z-50"> |
| <div class="container mx-auto px-4 py-3 flex justify-between items-center"> |
| <div class="flex items-center space-x-8"> |
| <a href="#" class="text-2xl font-bold text-blue-600">MediBook</a> |
| <nav class="hidden md:flex space-x-6"> |
| <a href="#" class="nav-link active py-2 px-1">Trouver un médecin</a> |
| <a href="#" class="nav-link py-2 px-1">Prendre RDV</a> |
| <a href="#" class="nav-link py-2 px-1">Téléconsultation</a> |
| <div class="dropdown relative"> |
| <button class="nav-link py-2 px-1 flex items-center"> |
| Professionnels <i class="fas fa-chevron-down ml-1 text-xs"></i> |
| </button> |
| <div class="dropdown-menu absolute hidden bg-white shadow-lg rounded-md mt-1 py-1 w-48"> |
| <a href="#" class="block px-4 py-2 hover:bg-blue-50">Espace professionnel</a> |
| <a href="#" class="block px-4 py-2 hover:bg-blue-50">Devenir partenaire</a> |
| <a href="#" class="block px-4 py-2 hover:bg-blue-50">Solutions pour cliniques</a> |
| </div> |
| </div> |
| </nav> |
| </div> |
| <div class="flex items-center space-x-4"> |
| <button class="hidden md:block bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 transition"> |
| Se connecter |
| </button> |
| <button class="md:hidden text-gray-600"> |
| <i class="fas fa-bars text-xl"></i> |
| </button> |
| </div> |
| </div> |
| </header> |
|
|
| |
| <section class="bg-gradient-to-r from-blue-500 to-blue-700 text-white py-16"> |
| <div class="container mx-auto px-4"> |
| <div class="flex flex-col md:flex-row items-center"> |
| <div class="md:w-1/2 mb-8 md:mb-0"> |
| <h1 class="text-4xl md:text-5xl font-bold mb-4">Prenez rendez-vous avec votre médecin en ligne</h1> |
| <p class="text-xl mb-8">Trouvez un professionnel de santé disponible près de chez vous et réservez votre consultation en quelques clics.</p> |
| <div class="flex flex-col sm:flex-row gap-4"> |
| <button class="bg-white text-blue-600 px-6 py-3 rounded-md font-semibold hover:bg-blue-50 transition"> |
| Trouver un médecin |
| </button> |
| <button class="bg-transparent border-2 border-white px-6 py-3 rounded-md font-semibold hover:bg-blue-600 transition"> |
| En savoir plus |
| </button> |
| </div> |
| </div> |
| <div class="md:w-1/2 flex justify-center"> |
| <img src="https://via.placeholder.com/500x350" alt="Doctor consultation" class="rounded-lg shadow-xl"> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="container mx-auto px-4 py-8 -mt-12 relative z-10"> |
| <div class="bg-white rounded-xl shadow-lg p-6"> |
| <div class="flex flex-col md:flex-row gap-4"> |
| <div class="flex-1 relative"> |
| <input type="text" id="searchInput" placeholder="Spécialité, médecin, établissement..." |
| class="w-full p-4 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"> |
| <i class="fas fa-search absolute right-4 top-1/2 transform -translate-y-1/2 text-gray-400"></i> |
| <div id="searchResults" class="absolute left-0 right-0 mt-2 bg-white border border-gray-200 rounded-lg shadow-lg hidden"> |
| |
| </div> |
| </div> |
| <div class="flex-1 relative"> |
| <input type="text" id="locationInput" placeholder="Ville, code postal ou adresse" |
| class="w-full p-4 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"> |
| <i class="fas fa-map-marker-alt absolute right-4 top-1/2 transform -translate-y-1/2 text-gray-400"></i> |
| </div> |
| <button class="bg-blue-600 text-white px-6 py-4 rounded-lg font-semibold hover:bg-blue-700 transition whitespace-nowrap"> |
| <i class="fas fa-search mr-2"></i> Rechercher |
| </button> |
| </div> |
| <div class="mt-4 flex flex-wrap gap-2"> |
| <span class="text-sm font-medium">Recherches fréquentes :</span> |
| <a href="#" class="text-sm text-blue-600 hover:underline">Médecin généraliste</a> |
| <span class="text-gray-400">•</span> |
| <a href="#" class="text-sm text-blue-600 hover:underline">Dentiste</a> |
| <span class="text-gray-400">•</span> |
| <a href="#" class="text-sm text-blue-600 hover:underline">Dermatologue</a> |
| <span class="text-gray-400">•</span> |
| <a href="#" class="text-sm text-blue-600 hover:underline">Ophtalmologue</a> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="container mx-auto px-4 py-12"> |
| <h2 class="text-3xl font-bold mb-8 text-center">Spécialités médicales</h2> |
| <div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-4"> |
| <a href="#" class="bg-white p-6 rounded-lg shadow-sm hover:shadow-md transition text-center"> |
| <div class="bg-blue-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-3"> |
| <i class="fas fa-user-md text-blue-600 text-2xl"></i> |
| </div> |
| <span class="font-medium">Médecin généraliste</span> |
| </a> |
| <a href="#" class="bg-white p-6 rounded-lg shadow-sm hover:shadow-md transition text-center"> |
| <div class="bg-blue-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-3"> |
| <i class="fas fa-tooth text-blue-600 text-2xl"></i> |
| </div> |
| <span class="font-medium">Dentiste</span> |
| </a> |
| <a href="#" class="bg-white p-6 rounded-lg shadow-sm hover:shadow-md transition text-center"> |
| <div class="bg-blue-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-3"> |
| <i class="fas fa-eye text-blue-600 text-2xl"></i> |
| </div> |
| <span class="font-medium">Ophtalmologue</span> |
| </a> |
| <a href="#" class="bg-white p-6 rounded-lg shadow-sm hover:shadow-md transition text-center"> |
| <div class="bg-blue-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-3"> |
| <i class="fas fa-heart text-blue-600 text-2xl"></i> |
| </div> |
| <span class="font-medium">Cardiologue</span> |
| </a> |
| <a href="#" class="bg-white p-6 rounded-lg shadow-sm hover:shadow-md transition text-center"> |
| <div class="bg-blue-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-3"> |
| <i class="fas fa-brain text-blue-600 text-2xl"></i> |
| </div> |
| <span class="font-medium">Psychiatre</span> |
| </a> |
| <a href="#" class="bg-white p-6 rounded-lg shadow-sm hover:shadow-md transition text-center"> |
| <div class="bg-blue-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-3"> |
| <i class="fas fa-bone text-blue-600 text-2xl"></i> |
| </div> |
| <span class="font-medium">Rhumatologue</span> |
| </a> |
| </div> |
| <div class="text-center mt-8"> |
| <a href="#" class="text-blue-600 font-medium hover:underline">Voir toutes les spécialités <i class="fas fa-chevron-right ml-1"></i></a> |
| </div> |
| </section> |
|
|
| |
| <section class="bg-gray-100 py-12"> |
| <div class="container mx-auto px-4"> |
| <h2 class="text-3xl font-bold mb-12 text-center">Comment ça marche</h2> |
| <div class="grid md:grid-cols-3 gap-8"> |
| <div class="bg-white p-6 rounded-lg shadow-sm text-center"> |
| <div class="bg-blue-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4"> |
| <span class="text-blue-600 font-bold text-2xl">1</span> |
| </div> |
| <h3 class="text-xl font-semibold mb-2">Trouvez votre médecin</h3> |
| <p class="text-gray-600">Recherchez par spécialité, localisation ou nom de médecin parmi nos 300 000 professionnels de santé.</p> |
| </div> |
| <div class="bg-white p-6 rounded-lg shadow-sm text-center"> |
| <div class="bg-blue-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4"> |
| <span class="text-blue-600 font-bold text-2xl">2</span> |
| </div> |
| <h3 class="text-xl font-semibold mb-2">Choisissez un créneau</h3> |
| <p class="text-gray-600">Consultez les disponibilités en temps réel et sélectionnez le créneau qui vous convient.</p> |
| </div> |
| <div class="bg-white p-6 rounded-lg shadow-sm text-center"> |
| <div class="bg-blue-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4"> |
| <span class="text-blue-600 font-bold text-2xl">3</span> |
| </div> |
| <h3 class="text-xl font-semibold mb-2">Confirmez votre RDV</h3> |
| <p class="text-gray-600">Recevez une confirmation par email et SMS avec des rappels automatiques avant votre consultation.</p> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="container mx-auto px-4 py-12"> |
| <div class="flex justify-between items-center mb-8"> |
| <h2 class="text-3xl font-bold">Médecins disponibles près de chez vous</h2> |
| <a href="#" class="text-blue-600 font-medium hover:underline">Voir plus <i class="fas fa-chevron-right ml-1"></i></a> |
| </div> |
| <div class="grid md:grid-cols-2 lg:grid-cols-3 gap-6" id="doctorsContainer"> |
| |
| </div> |
| </section> |
|
|
| |
| <div id="bookingModal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 hidden"> |
| <div class="bg-white rounded-lg shadow-xl w-full max-w-4xl max-h-[90vh] overflow-y-auto"> |
| <div class="p-6"> |
| <div class="flex justify-between items-center mb-6"> |
| <h3 class="text-2xl font-bold">Prendre rendez-vous</h3> |
| <button id="closeModal" class="text-gray-500 hover:text-gray-700"> |
| <i class="fas fa-times text-xl"></i> |
| </button> |
| </div> |
| |
| <div class="flex flex-col md:flex-row gap-6"> |
| |
| <div class="md:w-1/3"> |
| <div class="bg-gray-100 p-4 rounded-lg mb-4"> |
| <div class="flex items-center mb-4"> |
| <img src="https://via.placeholder.com/80" alt="Doctor" class="w-16 h-16 rounded-full mr-4"> |
| <div> |
| <h4 class="font-bold" id="modalDoctorName">Dr. Jean Dupont</h4> |
| <p class="text-gray-600 text-sm" id="modalDoctorSpecialty">Médecin généraliste</p> |
| </div> |
| </div> |
| <div class="flex items-center text-sm mb-2"> |
| <i class="fas fa-map-marker-alt text-gray-500 mr-2"></i> |
| <span id="modalDoctorAddress">15 Rue de la Paix, 75002 Paris</span> |
| </div> |
| <div class="flex items-center text-sm"> |
| <i class="fas fa-euro-sign text-gray-500 mr-2"></i> |
| <span id="modalDoctorPrice">25€ (non remboursé)</span> |
| </div> |
| </div> |
| |
| <div class="bg-blue-50 p-4 rounded-lg"> |
| <h4 class="font-bold mb-2">Motif de consultation</h4> |
| <select class="w-full p-2 border border-gray-300 rounded mb-2"> |
| <option>Consultation générale</option> |
| <option>Certificat médical</option> |
| <option>Renouvellement ordonnance</option> |
| <option>Autre motif</option> |
| </select> |
| <p class="text-sm text-gray-600">Durée estimée : 30 minutes</p> |
| </div> |
| </div> |
| |
| |
| <div class="md:w-2/3"> |
| <div class="mb-6"> |
| <h4 class="font-bold mb-4">Choisissez une date</h4> |
| <div class="flex justify-between mb-4"> |
| <button id="prevMonth" class="text-blue-600"><i class="fas fa-chevron-left"></i></button> |
| <h5 class="font-semibold" id="currentMonth">Juillet 2023</h5> |
| <button id="nextMonth" class="text-blue-600"><i class="fas fa-chevron-right"></i></button> |
| </div> |
| <div class="grid grid-cols-7 gap-2 mb-2"> |
| <div class="text-center text-sm font-medium text-gray-500">Lun</div> |
| <div class="text-center text-sm font-medium text-gray-500">Mar</div> |
| <div class="text-center text-sm font-medium text-gray-500">Mer</div> |
| <div class="text-center text-sm font-medium text-gray-500">Jeu</div> |
| <div class="text-center text-sm font-medium text-gray-500">Ven</div> |
| <div class="text-center text-sm font-medium text-gray-500">Sam</div> |
| <div class="text-center text-sm font-medium text-gray-500">Dim</div> |
| </div> |
| <div class="grid grid-cols-7 gap-2" id="calendarDays"> |
| |
| </div> |
| </div> |
| |
| <div id="timeSlotsSection" class="hidden"> |
| <h4 class="font-bold mb-4">Choisissez un horaire</h4> |
| <div class="grid grid-cols-2 md:grid-cols-3 gap-2" id="timeSlots"> |
| |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <div class="mt-6 pt-6 border-t border-gray-200 flex justify-end"> |
| <button id="confirmBooking" class="bg-blue-600 text-white px-6 py-2 rounded-md font-semibold hover:bg-blue-700 transition hidden"> |
| Confirmer le rendez-vous |
| </button> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <section class="bg-blue-50 py-12"> |
| <div class="container mx-auto px-4"> |
| <h2 class="text-3xl font-bold mb-8 text-center">Ce que nos patients disent</h2> |
| <div class="grid md:grid-cols-3 gap-8"> |
| <div class="bg-white p-6 rounded-lg shadow-sm"> |
| <div class="flex items-center mb-4"> |
| <div class="flex items-center mr-4"> |
| <i class="fas fa-star text-yellow-400"></i> |
| <i class="fas fa-star text-yellow-400"></i> |
| <i class="fas fa-star text-yellow-400"></i> |
| <i class="fas fa-star text-yellow-400"></i> |
| <i class="fas fa-star text-yellow-400"></i> |
| </div> |
| <span class="text-sm text-gray-500">12 juillet 2023</span> |
| </div> |
| <p class="text-gray-700 mb-4">"Très pratique pour prendre rendez-vous rapidement avec mon médecin traitant. Les rappels par SMS sont très utiles."</p> |
| <div class="flex items-center"> |
| <img src="https://via.placeholder.com/40" alt="Patient" class="w-8 h-8 rounded-full mr-2"> |
| <span class="font-medium">Marie L.</span> |
| </div> |
| </div> |
| <div class="bg-white p-6 rounded-lg shadow-sm"> |
| <div class="flex items-center mb-4"> |
| <div class="flex items-center mr-4"> |
| <i class="fas fa-star text-yellow-400"></i> |
| <i class="fas fa-star text-yellow-400"></i> |
| <i class="fas fa-star text-yellow-400"></i> |
| <i class="fas fa-star text-yellow-400"></i> |
| <i class="fas fa-star-half-alt text-yellow-400"></i> |
| </div> |
| <span class="text-sm text-gray-500">5 juillet 2023</span> |
| </div> |
| <p class="text-gray-700 mb-4">"J'ai trouvé un dentiste disponible le week-end grâce à MediBook. La prise de rendez-vous est très simple et intuitive."</p> |
| <div class="flex items-center"> |
| <img src="https://via.placeholder.com/40" alt="Patient" class="w-8 h-8 rounded-full mr-2"> |
| <span class="font-medium">Pierre D.</span> |
| </div> |
| </div> |
| <div class="bg-white p-6 rounded-lg shadow-sm"> |
| <div class="flex items-center mb-4"> |
| <div class="flex items-center mr-4"> |
| <i class="fas fa-star text-yellow-400"></i> |
| <i class="fas fa-star text-yellow-400"></i> |
| <i class="fas fa-star text-yellow-400"></i> |
| <i class="fas fa-star text-yellow-400"></i> |
| <i class="fas fa-star text-yellow-400"></i> |
| </div> |
| <span class="text-sm text-gray-500">28 juin 2023</span> |
| </div> |
| <p class="text-gray-700 mb-4">"En tant que professionnel de santé, MediBook m'a permis d'optimiser mon agenda et de réduire considérablement les rendez-vous manqués."</p> |
| <div class="flex items-center"> |
| <img src="https://via.placeholder.com/40" alt="Patient" class="w-8 h-8 rounded-full mr-2"> |
| <span class="font-medium">Dr. Sophie M.</span> |
| </div> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="container mx-auto px-4 py-12"> |
| <div class="bg-gradient-to-r from-blue-600 to-blue-800 text-white rounded-xl p-8 md:p-12"> |
| <div class="flex flex-col md:flex-row items-center"> |
| <div class="md:w-1/2 mb-8 md:mb-0"> |
| <h2 class="text-3xl md:text-4xl font-bold mb-4">Téléchargez notre application mobile</h2> |
| <p class="text-lg mb-6">Prenez rendez-vous avec votre médecin où que vous soyez et gérez vos consultations en quelques clics.</p> |
| <div class="flex flex-col sm:flex-row gap-4"> |
| <a href="#" class="bg-black text-white px-6 py-3 rounded-md font-semibold hover:bg-gray-800 transition flex items-center justify-center"> |
| <i class="fab fa-apple text-2xl mr-2"></i> |
| <div class="text-left"> |
| <div class="text-xs">Disponible sur</div> |
| <div class="text-lg">App Store</div> |
| </div> |
| </a> |
| <a href="#" class="bg-black text-white px-6 py-3 rounded-md font-semibold hover:bg-gray-800 transition flex items-center justify-center"> |
| <i class="fab fa-google-play text-2xl mr-2"></i> |
| <div class="text-left"> |
| <div class="text-xs">Disponible sur</div> |
| <div class="text-lg">Google Play</div> |
| </div> |
| </a> |
| </div> |
| </div> |
| <div class="md:w-1/2 flex justify-center"> |
| <img src="https://via.placeholder.com/300x400" alt="Mobile App" class="rounded-lg shadow-xl"> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <footer class="bg-gray-900 text-white py-12"> |
| <div class="container mx-auto px-4"> |
| <div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-5 gap-8"> |
| <div class="col-span-2"> |
| <h3 class="text-2xl font-bold mb-4">MediBook</h3> |
| <p class="text-gray-400 mb-4">La solution de prise de rendez-vous médicaux en ligne la plus utilisée en France.</p> |
| <div class="flex space-x-4"> |
| <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-facebook-f"></i></a> |
| <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-twitter"></i></a> |
| <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-linkedin-in"></i></a> |
| <a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-instagram"></i></a> |
| </div> |
| </div> |
| <div> |
| <h4 class="font-bold mb-4 text-lg">Patients</h4> |
| <ul class="space-y-2"> |
| <li><a href="#" class="text-gray-400 hover:text-white">Trouver un médecin</a></li> |
| <li><a href="#" class="text-gray-400 hover:text-white">Prendre RDV</a></li> |
| <li><a href="#" class="text-gray-400 hover:text-white">Téléconsultation</a></li> |
| <li><a href="#" class="text-gray-400 hover:text-white">Mon compte</a></li> |
| <li><a href="#" class="text-gray-400 hover:text-white">Aide</a></li> |
| </ul> |
| </div> |
| <div> |
| <h4 class="font-bold mb-4 text-lg">Professionnels</h4> |
| <ul class="space-y-2"> |
| <li><a href="#" class="text-gray-400 hover:text-white">Espace pro</a></li> |
| <li><a href="#" class="text-gray-400 hover:text-white">Devenir partenaire</a></li> |
| <li><a href="#" class="text-gray-400 hover:text-white">Solutions pour cliniques</a></li> |
| <li><a href="#" class="text-gray-400 hover:text-white">Tarifs</a></li> |
| <li><a href="#" class="text-gray-400 hover:text-white">Formation</a></li> |
| </ul> |
| </div> |
| <div> |
| <h4 class="font-bold mb-4 text-lg">Entreprise</h4> |
| <ul class="space-y-2"> |
| <li><a href="#" class="text-gray-400 hover:text-white">À propos</a></li> |
| <li><a href="#" class="text-gray-400 hover:text-white">Carrières</a></li> |
| <li><a href="#" class="text-gray-400 hover:text-white">Presse</a></li> |
| <li><a href="#" class="text-gray-400 hover:text-white">Blog</a></li> |
| <li><a href="#" class="text-gray-400 hover:text-white">Contact</a></li> |
| </ul> |
| </div> |
| </div> |
| <div class="border-t border-gray-800 mt-12 pt-8 flex flex-col md:flex-row justify-between items-center"> |
| <div class="text-gray-400 text-sm mb-4 md:mb-0"> |
| © 2023 MediBook. Tous droits réservés. |
| </div> |
| <div class="flex space-x-6"> |
| <a href="#" class="text-gray-400 hover:text-white text-sm">Mentions légales</a> |
| <a href="#" class="text-gray-400 hover:text-white text-sm">Politique de confidentialité</a> |
| <a href="#" class="text-gray-400 hover:text-white text-sm">Conditions générales</a> |
| <a href="#" class="text-gray-400 hover:text-white text-sm">Cookies</a> |
| </div> |
| </div> |
| </div> |
| </footer> |
|
|
| <script> |
| |
| const doctors = [ |
| { |
| id: 1, |
| name: "Dr. Jean Dupont", |
| specialty: "Médecin généraliste", |
| address: "15 Rue de la Paix, 75002 Paris", |
| distance: "0.5 km", |
| price: "25€ (non remboursé)", |
| rating: 4.8, |
| reviews: 124, |
| availableToday: true, |
| image: "https://via.placeholder.com/100" |
| }, |
| { |
| id: 2, |
| name: "Dr. Sophie Martin", |
| specialty: "Dermatologue", |
| address: "22 Avenue des Champs-Élysées, 75008 Paris", |
| distance: "1.2 km", |
| price: "50€ (remboursé à 70%)", |
| rating: 4.9, |
| reviews: 87, |
| availableToday: false, |
| image: "https://via.placeholder.com/100" |
| }, |
| { |
| id: 3, |
| name: "Dr. Pierre Lambert", |
| specialty: "Dentiste", |
| address: "8 Boulevard Saint-Germain, 75005 Paris", |
| distance: "0.8 km", |
| price: "30€ (remboursé à 70%)", |
| rating: 4.7, |
| reviews: 56, |
| availableToday: true, |
| image: "https://via.placeholder.com/100" |
| }, |
| { |
| id: 4, |
| name: "Dr. Claire Dubois", |
| specialty: "Ophtalmologue", |
| address: "5 Rue de Rivoli, 75004 Paris", |
| distance: "1.5 km", |
| price: "45€ (remboursé à 60%)", |
| rating: 4.6, |
| reviews: 42, |
| availableToday: true, |
| image: "https://via.placeholder.com/100" |
| }, |
| { |
| id: 5, |
| name: "Dr. Antoine Leroy", |
| specialty: "Cardiologue", |
| address: "12 Rue de Sèvres, 75006 Paris", |
| distance: "2.1 km", |
| price: "60€ (remboursé à 70%)", |
| rating: 4.9, |
| reviews: 103, |
| availableToday: false, |
| image: "https://via.placeholder.com/100" |
| }, |
| { |
| id: 6, |
| name: "Dr. Élise Petit", |
| specialty: "Pédiatre", |
| address: "18 Rue du Faubourg Saint-Honoré, 75008 Paris", |
| distance: "1.8 km", |
| price: "35€ (remboursé à 80%)", |
| rating: 4.8, |
| reviews: 76, |
| availableToday: true, |
| image: "https://via.placeholder.com/100" |
| } |
| ]; |
| |
| |
| const specialties = [ |
| "Médecin généraliste", "Dentiste", "Dermatologue", "Ophtalmologue", |
| "Cardiologue", "Gynécologue", "Pédiatre", "Psychiatre", |
| "ORL", "Rhumatologue", "Urologue", "Chirurgien" |
| ]; |
| |
| |
| const locations = [ |
| "Paris", "Lyon", "Marseille", "Toulouse", "Nice", |
| "Nantes", "Strasbourg", "Montpellier", "Bordeaux", "Lille" |
| ]; |
| |
| |
| const searchInput = document.getElementById('searchInput'); |
| const locationInput = document.getElementById('locationInput'); |
| const searchResults = document.getElementById('searchResults'); |
| const doctorsContainer = document.getElementById('doctorsContainer'); |
| const bookingModal = document.getElementById('bookingModal'); |
| const closeModal = document.getElementById('closeModal'); |
| const currentMonth = document.getElementById('currentMonth'); |
| const calendarDays = document.getElementById('calendarDays'); |
| const timeSlotsSection = document.getElementById('timeSlotsSection'); |
| const timeSlots = document.getElementById('timeSlots'); |
| const confirmBooking = document.getElementById('confirmBooking'); |
| const prevMonth = document.getElementById('prevMonth'); |
| const nextMonth = document.getElementById('nextMonth'); |
| const modalDoctorName = document.getElementById('modalDoctorName'); |
| const modalDoctorSpecialty = document.getElementById('modalDoctorSpecialty'); |
| const modalDoctorAddress = document.getElementById('modalDoctorAddress'); |
| const modalDoctorPrice = document.getElementById('modalDoctorPrice'); |
| |
| |
| let currentDate = new Date(); |
| let selectedDate = null; |
| let selectedTime = null; |
| let selectedDoctor = null; |
| |
| |
| document.addEventListener('DOMContentLoaded', function() { |
| renderDoctors(); |
| setupEventListeners(); |
| renderCalendar(); |
| }); |
| |
| |
| function renderDoctors() { |
| doctorsContainer.innerHTML = ''; |
| doctors.forEach(doctor => { |
| const doctorCard = document.createElement('div'); |
| doctorCard.className = 'bg-white rounded-lg shadow-sm p-6 doctor-card transition'; |
| doctorCard.innerHTML = ` |
| <div class="flex mb-4"> |
| <img src="${doctor.image}" alt="${doctor.name}" class="w-16 h-16 rounded-full mr-4"> |
| <div> |
| <h3 class="font-bold">${doctor.name}</h3> |
| <p class="text-gray-600">${doctor.specialty}</p> |
| <div class="flex items-center mt-1"> |
| <div class="flex items-center mr-2"> |
| ${renderStars(doctor.rating)} |
| </div> |
| <span class="text-sm text-gray-500">${doctor.reviews} avis</span> |
| </div> |
| </div> |
| </div> |
| <div class="flex items-center text-sm mb-2"> |
| <i class="fas fa-map-marker-alt text-gray-500 mr-2"></i> |
| <span>${doctor.address} (${doctor.distance})</span> |
| </div> |
| <div class="flex items-center text-sm mb-4"> |
| <i class="fas fa-euro-sign text-gray-500 mr-2"></i> |
| <span>${doctor.price}</span> |
| </div> |
| <div class="flex justify-between items-center"> |
| ${doctor.availableToday ? |
| '<span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded">Disponible aujourd\'hui</span>' : |
| '<span class="bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded">Prochain RDV dans 3 jours</span>'} |
| <button class="bg-blue-600 text-white px-4 py-2 rounded-md text-sm font-medium hover:bg-blue-700 transition book-button" data-id="${doctor.id}"> |
| Prendre RDV |
| </button> |
| </div> |
| `; |
| doctorsContainer.appendChild(doctorCard); |
| }); |
| } |
| |
| |
| function renderStars(rating) { |
| let stars = ''; |
| const fullStars = Math.floor(rating); |
| const hasHalfStar = rating % 1 >= 0.5; |
| |
| for (let i = 0; i < fullStars; i++) { |
| stars += '<i class="fas fa-star text-yellow-400"></i>'; |
| } |
| |
| if (hasHalfStar) { |
| stars += '<i class="fas fa-star-half-alt text-yellow-400"></i>'; |
| } |
| |
| const emptyStars = 5 - fullStars - (hasHalfStar ? 1 : 0); |
| for (let i = 0; i < emptyStars; i++) { |
| stars += '<i class="far fa-star text-yellow-400"></i>'; |
| } |
| |
| return stars; |
| } |
| |
| |
| function setupEventListeners() { |
| |
| searchInput.addEventListener('input', handleSearch); |
| locationInput.addEventListener('input', handleLocationSearch); |
| |
| |
| closeModal.addEventListener('click', () => bookingModal.classList.add('hidden')); |
| bookingModal.addEventListener('click', (e) => { |
| if (e.target === bookingModal) { |
| bookingModal.classList.add('hidden'); |
| } |
| }); |
| |
| |
| prevMonth.addEventListener('click', () => { |
| currentDate.setMonth(currentDate.getMonth() - 1); |
| renderCalendar(); |
| }); |
| |
| nextMonth.addEventListener('click', () => { |
| currentDate.setMonth(currentDate.getMonth() + 1); |
| renderCalendar(); |
| }); |
| |
| |
| confirmBooking.addEventListener('click', () => { |
| alert(`Rendez-vous confirmé avec ${selectedDoctor.name} le ${selectedDate.toLocaleDateString()} à ${selectedTime}`); |
| bookingModal.classList.add('hidden'); |
| }); |
| |
| |
| document.querySelectorAll('.book-button').forEach(button => { |
| button.addEventListener('click', (e) => { |
| const doctorId = parseInt(e.target.getAttribute('data-id')); |
| openBookingModal(doctorId); |
| }); |
| }); |
| } |
| |
| |
| function handleSearch() { |
| const query = searchInput.value.toLowerCase(); |
| if (query.length < 2) { |
| searchResults.classList.add('hidden'); |
| return; |
| } |
| |
| const matches = specialties.filter(spec => |
| spec.toLowerCase().includes(query) |
| ); |
| |
| if (matches.length > 0) { |
| searchResults.innerHTML = matches.map(spec => ` |
| <div class="p-3 hover:bg-gray-100 cursor-pointer">${spec}</div> |
| `).join(''); |
| searchResults.classList.remove('hidden'); |
| } else { |
| searchResults.classList.add('hidden'); |
| } |
| } |
| |
| |
| function handleLocationSearch() { |
| const query = locationInput.value.toLowerCase(); |
| if (query.length < 2) { |
| return; |
| } |
| |
| |
| console.log("Searching for location:", query); |
| } |
| |
| |
| function openBookingModal(doctorId) { |
| selectedDoctor = doctors.find(d => d.id === doctorId); |
| if (!selectedDoctor) return; |
| |
| |
| modalDoctorName.textContent = selectedDoctor.name; |
| modalDoctorSpecialty.textContent = selectedDoctor.specialty; |
| modalDoctorAddress.textContent = selectedDoctor.address; |
| modalDoctorPrice.textContent = selectedDoctor.price; |
| |
| |
| selectedDate = null; |
| selectedTime = null; |
| timeSlotsSection.classList.add('hidden'); |
| confirmBooking.classList.add('hidden'); |
| |
| |
| bookingModal.classList.remove('hidden'); |
| } |
| |
| |
| function renderCalendar() { |
| |
| const options = { month: 'long', year: 'numeric' }; |
| currentMonth.textContent = currentDate.toLocaleDateString('fr-FR', options); |
| |
| |
| const firstDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1).getDay(); |
| const daysInMonth = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0).getDate(); |
| |
| |
| const adjustedFirstDay = firstDay === 0 ? 6 : firstDay - 1; |
| |
| |
| calendarDays.innerHTML = ''; |
| |
| |
| for (let i = 0; i < adjustedFirstDay; i++) { |
| const emptyCell = document.createElement('div'); |
| emptyCell.className = 'h-10'; |
| calendarDays.appendChild(emptyCell); |
| } |
| |
| |
| for (let i = 1; i <= daysInMonth; i++) { |
| const dayCell = document.createElement('div'); |
| dayCell.className = 'calendar-day h-10 flex items-center justify-center rounded-full'; |
| dayCell.textContent = i; |
| |
| |
| const today = new Date(); |
| if (currentDate.getMonth() === today.getMonth() && |
| currentDate.getFullYear() === today.getFullYear() && |
| i === today.getDate()) { |
| dayCell.classList.add('font-bold', 'border-2', 'border-blue-500'); |
| } |
| |
| |
| if (currentDate.getMonth() === today.getMonth() && |
| currentDate.getFullYear() === today.getFullYear() && |
| i < today.getDate()) { |
| dayCell.classList.add('disabled', 'text-gray-400'); |
| } else { |
| dayCell.addEventListener('click', () => selectDate(i)); |
| } |
| |
| calendarDays.appendChild(dayCell); |
| } |
| } |
| |
| |
| function selectDate(day) { |
| |
| document.querySelectorAll('.calendar-day').forEach(cell => { |
| cell.classList.remove('selected'); |
| }); |
| |
| |
| const selectedCell = [...document.querySelectorAll('.calendar-day')].find(cell => |
| cell.textContent == day && !cell.classList.contains('disabled') |
| ); |
| |
| if (selectedCell) { |
| selectedCell.classList.add('selected'); |
| |
| |
| selectedDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), day); |
| |
| |
| generateTimeSlots(); |
| timeSlotsSection.classList.remove('hidden'); |
| |
| |
| selectedTime = null; |
| confirmBooking.classList.add('hidden'); |
| } |
| } |
| |
| |
| function generateTimeSlots() { |
| timeSlots.innerHTML = ''; |
| |
| |
| const slots = [ |
| '08:00', '08:30', '09:00', '09:30', '10:00', |
| '10:30', '11:00', '11:30', '14:00', '14:30', |
| '15:00', '15:30', '16:00', '16:30', '17:00' |
| ]; |
| |
| slots.forEach(slot => { |
| const slotElement = document.createElement('div'); |
| slotElement.className = 'time-slot p-2 text-center border border-gray-200 rounded-md'; |
| slotElement.textContent = slot; |
| slotElement.addEventListener('click', () => selectTime(slot)); |
| timeSlots.appendChild(slotElement); |
| }); |
| } |
| |
| |
| function selectTime(time) { |
| |
| document.querySelectorAll('.time-slot').forEach(slot => { |
| slot.classList.remove('selected'); |
| }); |
| |
| |
| const selectedSlot = [...document.querySelectorAll('.time-slot')].find(slot => |
| slot.textContent === time |
| ); |
| |
| if (selectedSlot) { |
| selectedSlot.classList.add('selected'); |
| selectedTime = time; |
| confirmBooking.classList.remove('hidden'); |
| } |
| } |
| </script> |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=jkind/medibook" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
| </html> |