I Bravi Ragazzi

📌 34 Grande Rue, 21700 Nuits-Saint-Georges

4.7 / 5
(508 avis)

Horaires d'Ouverture

  • Lundi Fermé
  • Mardi 18:45–23:00
  • Mercredi 12:00–14:30, 18:45–23:00
  • Jeudi 12:00–14:30, 18:45–23:00
  • Vendredi 12:00–14:30, 18:45–23:00
  • Samedi 12:00–14:30, 18:45–23:00
  • DimancheFermé

A propos :

Découvrez toutes les informations concernant Pizzeria I Bravi Ragazzi qui se situe au 34 Grande Rue, 21700 Nuits-Saint-Georges (21). Cette fiche inclut les photos, les horaires d'ouverture, l'adresse, le numéro de téléphone et les avis des clients.

Galerie Photos

Services disponibles

  • Terrasse
  • Vente à emporter
  • Repas sur place
  • Livraison

Accessibilité

  • Entrée accessible en fauteuil roulant
  • Parking accessible en fauteuil roulant
  • Places assises accessibles en fauteuil roulant
  • Toilettes accessibles en fauteuil roulant

Offre

  • Alcools
  • Bière
  • Cafés
  • Cocktails et apéritifs
  • Convient aux végétariens
  • Produits sains
  • Spiritueux
  • Vin

Services de restauration

  • Déjeuner
  • Dîner
  • Traiteur
  • Desserts
  • Places assises
  • Service à table

Services

  • Toilettes

Clientèle

  • Groupes
  • Étudiants
  • Touristes

Planning

  • Réservations acceptées
  • Réservation obligatoire

Paiements

  • Cartes de crédit
  • Paiements mobiles NFC
  • Pluxee
  • Titres restaurant
  • Cartes de débit

Ambiance

  • Ambiance décontractée
  • Cadre agréable
  • Romantique
  • Branché
  • Calme

Parking

  • Parking gratuit
  • Parking gratuit dans la rue

Animaux de compagnie

  • Chiens acceptés

Populaire pour

  • Déjeuner
  • Dîner
  • Dîner en solo

Points forts

  • Excellent café
  • Excellents cocktails
  • Excellents desserts
  • Grand choix de vins

Enfants

  • Convient aux enfants

Contribution & Gestion de la fiche

Êtes-vous le propriétaire de cet établissement ? Aidez-nous à garder cette fiche à jour ou demandez sa suppression.

🖋️ Écrire un avis (Google)

Avis des clients

Avis de : ferihane.c.
Note de : 5 / 5

"Excellente cuisine italienne, raffinée, et excellent service. Le tiramisu au citron vert est une tuerie"

Posté le 21/01/1970 à 08:55
Avis de : Laetitia.e.
Note de : 4 / 5

"De passage dans le coin j'avais réservé ce petit resto suite a la note et aux beau avis que j'vais pu lire . L'endroit est très petit et nous avons était installer dehors , on m'avait demander a la réservation si par beau temps nous voulions êtres en terrasse et j'avais affirmer mais ce soir la il y avait 16 degrés . Ce restaurant prônes les bon produits , bio ; AOP etc.. et effectivement l'on ressent que les Pizzas sont faites avec de bons produits mais le tout ne casse pas trop pattes a un canards. Ça commence dans le choix des Pizzas , il ne faut pas s'attendre a trouver de la bonne charcuterie Italienne , les Pizzas sont toutes avec du Fromages ou a la limite des légumes mais ni charcuteries , ni anchois ou autres c'est vraiment du basic . La Pâte a Pizza est bonne mais pas exceptionnel et c'est vite transformer en gros chewing gum avec l'humidité extérieur . Pour les desserts nous avions deux choix , Panna Cotta ou Tiramisu , nous avons opter pour la Panne Cotta qui était bonne . Ce que je n'ai vraiment pas apprécier c'est leur façon de faire , des gens demandait a manger mais il n'avaient pas réserver on les renvoyaient en leur disant revenez d'ici 30Min ou 1H , puis d'un coup pour les suivants qui n'avaient pas réserver non plus on sortaient et dressaient de nouvelles tables , puis les suivant se faisait renvoyer et ainsi de suite ce n'est pas correct . Nous somme déçues et ne recommandont pas"

Posté le 21/01/1970 à 08:30
Avis de : Sandra.i.
Note de : 5 / 5

"Au top je recommande les pizzas excellente et l equipe toujours souriante et bien vaillant envers ses clients et le cadre est magnifique"

Posté le 21/01/1970 à 08:26
Avis de : Didier.a.
Note de : 5 / 5

"Très bonne pizza, serveuses agréables et professionnelles."

Posté le 21/01/1970 à 08:22
Avis de : PA.A.
Note de : 5 / 5

"La pizza du jour et une merveille et la pâte est cuite à la perfection font de ce repas un excellent moment. Les desserts sont classiques mais tout en finesse . L'équipe est très efficace et sympathique. Au pays des grands vins il y a une très belle pizzeria."

Posté le 21/01/1970 à 08:13
Avis de : Gilles..
Note de : 3 / 5

"Pizzéria dans la zone piétonne de Nuits St Georges. Petite terrasse extérieure. Une trentaine de places à l'intérieur. Les serveuses sont charmantes, sympathiques et efficaces. Première bémol: Pas de bière pression même si la bière en pression est excellente Deuxième bémol: Toutes les pizzas sont végétariennes, pas de viande, il parait que c'est la tradition Napolitaine. 17€ pour une pizza Rucola e Parmigiano (pate, tomates séchées, rucola) ca fait cher. Elle fut néanmoins bonne Troisième bémol: Il y a 100 sortes de vin sur la cartes en bouteilles et une demi douzaine de choix possibles au verre, de plus ils sont griffonnés sur une petite carte posées uniquement sur certaines tables Quatrième bémol: Le dessert, pas de cartes, la serveuse vous énoncent les 3 choix sans vous indiquer le prix. 9.50€ pour une Panacotta maison toute rikiki. Addition: 50€ pour une bière, un verre de vin, une pizza, un dessert et un cappuccino. Heureusement que le charme des serveuses a sauvé la soirée"

Posté le 21/01/1970 à 07:53
Avis de : Constance.O.
Note de : 5 / 5

"Pizzeria très agréable en plein centre de Nuits-St-Georges Serveurs très polis et agréables. Pizzas majoritairement végétales Très bon desserts"

Posté le 21/01/1970 à 07:47
Avis de : Philippe.E.
Note de : 5 / 5

"Nous sommes arrivés sur la fin du service et nous sommes partagé une focaccia, une salade caprese ainsi qu’un assortiment de parmesan. Tout était excellent! Quel plaisir! Merci beaucoup!"

Posté le 21/01/1970 à 07:35
Avis de : Charlotte.g.
Note de : 5 / 5

"La dolce vita ! L'ambiance du restaurant est belle et agréable, le service est impeccable et les pizzas délicieuses."

Posté le 21/01/1970 à 07:32
Avis de : Amelie.O.
Note de : 5 / 5

"Nous allons dans ce restaurant au moins 1 fois par mois et nous n’arrivons pas à le détrôner ! Une ambiance chaleureuse et cosy (été comme hiver), un personnel au top et les pizzas… même à Naples nous n’en avons pas mangés d’aussi bonnes !"

Posté le 21/01/1970 à 07:14

Entreprises à proximité

La Gentilhommière à Nuits-Saint-Georges

La Gentilhommière

13 Rte de la Serrée

21700 Nuits-Saint-Georges

669 Avis
CHEZ GEORGES à Nuits-Saint-Georges

CHEZ GEORGES

7 Rue Saint-Joseph

21700 Nuits-Saint-Georges

8 Avis
REGIE PINARD ALLEMAND à Nuits-Saint-Georges

REGIE PINARD ALLEMAND

11 Rue Caumont Breon

21700 Nuits-Saint-Georges

1 Avis
Gandon Transports à Nuits-Saint-Georges

Gandon Transports

21700 Nuits-Saint-Georges

0 Avis
BZ Création à Nuits-Saint-Georges

BZ Création

21700 Nuits-Saint-Georges

1 Avis
A3pics à Nuits-Saint-Georges

A3pics

21700 Nuits-Saint-Georges

1 Avis
Besson-Ratel Dominique à Nuits-Saint-Georges

Besson-Ratel Dominique

31 Quai Fleury

21700 Nuits-Saint-Georges

1 Avis
COIFFURE PROFEEL à Nuits-Saint-Georges

COIFFURE PROFEEL

14 Grande Rue

21700 Nuits-Saint-Georges

41 Avis
Amplifon Audioprothésiste Nuits Saint Georges à Nuits-Saint-Georges

Amplifon Audioprothésiste Nuits Saint Georges

9 Rue Dr Louis Legrand

21700 Nuits-Saint-Georges

39 Avis
Rosebelle Céramique à Nuits-Saint-Georges

Rosebelle Céramique

9 Rue du Grenier À Sel

21700 Nuits-Saint-Georges

29 Avis
Ambiance Beauté à Nuits-Saint-Georges

Ambiance Beauté

29 Grande Rue

21700 Nuits-Saint-Georges

1 Avis
Foucher Céline à Nuits-Saint-Georges

Foucher Céline

6 Quai Poyen

21700 Nuits-Saint-Georges

3 Avis
Restaurant La Côte d'Or à Nuits-Saint-Georges

Restaurant La Côte d'Or

37 Rue Thurot

21700 Nuits-Saint-Georges

724 Avis
Boucherie Le Goût d'ici à Nuits-Saint-Georges

Boucherie Le Goût d'ici

8 Rue Charles André Rémi Arnoult

21700 Nuits-Saint-Georges

44 Avis
Dr Sandrine FORESTIER-GARDON à Nuits-Saint-Georges

Dr Sandrine FORESTIER-GARDON

33 Quai Fleury

21700 Nuits-Saint-Georges

5 Avis
Nuits St George Lot. à Nuits-Saint-Georges

Nuits St George Lot.

21700 Nuits-Saint-Georges

0 Avis
CTI centre technique intercommunales à Nuits-Saint-Georges

CTI centre technique intercommunales

21700 Nuits-Saint-Georges

4 Avis
Thibert Delphine à Nuits-Saint-Georges

Thibert Delphine

21 Quai Fleury

21700 Nuits-Saint-Georges

5 Avis
TASTEVINAGE à Nuits-Saint-Georges

TASTEVINAGE

21701 Nuits-Saint-Georges

2 Avis
// NOUVELLES FONCTIONS POUR LE MODAL TÉLÉPHONE (SVA) const phoneModal = document.getElementById('phone-modal'); const modalPhoneDisplay = document.getElementById('modal-phone-display'); const modalCallBtn = document.getElementById('modal-call-btn'); const modalRealPhoneDisplay = document.getElementById('modal-real-phone-display'); function openPhoneModal(svaNumber) { // Remplir les données du modal avec le numéro SVA modalPhoneDisplay.textContent = svaNumber; modalCallBtn.href = 'tel:' + svaNumber.replace(/\s/g, ''); phoneModal.classList.remove('hidden'); } function closePhoneModal() { phoneModal.classList.add('hidden'); } // ANCIEN MODAL (EXIT) - Renommage de la fonction pour éviter les conflits function closeExitModal() { document.getElementById('exit-modal').classList.remove('show'); } // 1. GESTION DU BOUTON "RETOUR EN HAUT" (Optimisé) const backToTopButton = document.getElementById('backtotop'); let isBackToTopVisible = false; // État pour éviter de toucher au DOM inutilement window.addEventListener('scroll', () => { // On lit la valeur (Lecture) const shouldBeVisible = window.scrollY > 300; // On écrit dans le DOM SEULEMENT si l'état change (Écriture) if (shouldBeVisible !== isBackToTopVisible) { isBackToTopVisible = shouldBeVisible; if (isBackToTopVisible) { backToTopButton.classList.remove('hidden'); } else { backToTopButton.classList.add('hidden'); } } }, { passive: true }); // 'passive: true' améliore la fluidité du scroll backToTopButton.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); // 2. GESTION DES TÉLÉPHONES ET DU RESTE (DOM Loaded) document.addEventListener('DOMContentLoaded', () => { const isMobile = window.innerWidth < 768; const showPhoneBtn = document.getElementById('show-phone-btn'); const showPhoneBtnFloating = document.getElementById('show-phone-btn-floating'); // Les anciens éléments d'affichage inline (phoneDisplayContainer, etc.) sont supprimés/ignorés const restaurantCard = document.querySelector('[data-place-id]'); const phoneErrorSpan = document.getElementById('phone-error'); // Éléments flottants const floatingPhoneBtn = document.getElementById('floating-phone-btn'); const phoneButtonContainer = document.getElementById('phone-button-container'); // Éléments du modal de suppression const suppressionModal = document.getElementById('suppression-modal'); const openSuppressionModal = document.getElementById('open-suppression-modal'); const openSuppressionModalBottom = document.getElementById('open-suppression-modal-bottom'); const closeSuppressionModal = document.getElementById('close-suppression-modal'); const smsHeader = document.getElementById('sms-header'); const callHeader = document.getElementById('call-header'); const smsContent = document.getElementById('sms-content'); const callContent = document.getElementById('call-content'); const smsArrow = document.getElementById('sms-arrow'); const callArrow = document.getElementById('call-arrow'); // --- LOGIQUE MODAL DE SUPPRESSION --- function toggleAccordion(header, content, arrow) { const isActive = content.classList.contains('active'); // Fermer tous les autres document.querySelectorAll('.accordion-content').forEach(c => c.classList.remove('active')); document.querySelectorAll('.accordion-arrow').forEach(a => a.classList.remove('rotate')); if (!isActive) { content.classList.add('active'); arrow.classList.add('rotate'); } } if (smsHeader && callHeader) { smsHeader.addEventListener('click', () => toggleAccordion(smsHeader, smsContent, smsArrow)); callHeader.addEventListener('click', () => toggleAccordion(callHeader, callContent, callArrow)); } // Gestion ouverture/fermeture du modal de suppression function openSuppressionModalFunc() { suppressionModal.classList.add('show'); // Réinitialiser les accordéons à l'ouverture document.querySelectorAll('.accordion-content').forEach(c => c.classList.remove('active')); document.querySelectorAll('.accordion-arrow').forEach(a => a.classList.remove('rotate')); } function closeSuppressionModalFunc() { suppressionModal.classList.remove('show'); } if (openSuppressionModal) { openSuppressionModal.addEventListener('click', openSuppressionModalFunc); } if (openSuppressionModalBottom) { openSuppressionModalBottom.addEventListener('click', openSuppressionModalFunc); } if (closeSuppressionModal) { closeSuppressionModal.addEventListener('click', closeSuppressionModalFunc); } if (suppressionModal) { suppressionModal.addEventListener('click', (e) => { if (e.target === suppressionModal) { closeSuppressionModalFunc(); } }); } // --- OPTIMISATION MAJEURE ICI : Intersection Observer au lieu de Scroll Event --- // Au lieu de calculer des maths à chaque scroll, on observe si le bouton principal sort de l'écran if (isMobile && phoneButtonContainer && floatingPhoneBtn) { const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { // Si le conteneur du bouton n'est plus visible (on a scrollé vers le bas) // On affiche le bouton flottant if (!entry.isIntersecting && entry.boundingClientRect.top < 0) { floatingPhoneBtn.classList.remove('translate-y-full'); } else { floatingPhoneBtn.classList.add('translate-y-full'); } }); }, { threshold: 0 }); // Se déclenche dès qu'un pixel sort/entre observer.observe(phoneButtonContainer); } // -------------------------------------------------------------------------------- // La fonction getPhoneNumber est mise à jour pour ouvrir le modal if (showPhoneBtn && restaurantCard && phoneErrorSpan) { const getPhoneNumber = async (btn) => { const placeId = restaurantCard.dataset.placeId; const modalRealPhoneDisplay = document.getElementById('modal-real-phone-display'); phoneErrorSpan.textContent = ''; phoneErrorSpan.classList.add('hidden'); const originalBtnContent = btn.innerHTML; // SVG Spinner inline pour éviter les sauts de ligne btn.innerHTML = `Chargement...`; btn.disabled = true; try { const response = await fetch('get_number.php?site=autour-de-moi.tel', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ place_id: placeId }) }); if (!response.ok) throw new Error(`Erreur HTTP: ${response.status}`); const data = await response.json(); const svaNumber = data.phone_number; const realNumber = modalRealPhoneDisplay.textContent; // Utilise le numéro par défaut dans le modal comme "vrai" numéro, car l'API n'en fournit qu'un. // Ouvre le modal et remplit les champs openPhoneModal(svaNumber); if (isMobile) { // Sur mobile, lancer directement l'appel SVA window.location.href = 'tel:' + svaNumber.replace(/\s/g, ''); } btn.innerHTML = originalBtnContent; btn.disabled = false; } catch (error) { console.error('Erreur:', error); // Affiche l'erreur sur le bouton ou span phoneErrorSpan.textContent = 'Erreur de connexion. Veuillez réessayer.'; phoneErrorSpan.classList.remove('hidden'); btn.innerHTML = originalBtnContent; btn.disabled = false; } }; showPhoneBtn.addEventListener('click', () => getPhoneNumber(showPhoneBtn)); if (showPhoneBtnFloating) { showPhoneBtnFloating.addEventListener('click', () => getPhoneNumber(showPhoneBtnFloating)); } } // --- GALERIE --- const galleryItems = document.querySelectorAll('.gallery-item'); if(galleryItems.length > 0) { const galleryOverlay = document.getElementById('gallery-overlay'); const galleryFullImg = document.getElementById('gallery-full-img'); const prevBtn = document.getElementById('gallery-prev'); const nextBtn = document.getElementById('gallery-next'); const closeBtn = document.getElementById('gallery-close'); let currentImageIndex = 0; let fullImages = []; galleryItems.forEach(item => { fullImages.push(item.dataset.fullImgSrc); item.addEventListener('click', () => { currentImageIndex = Array.from(galleryItems).indexOf(item); galleryFullImg.src = fullImages[currentImageIndex]; galleryOverlay.classList.remove('hidden'); }); }); // Utilisation de fonctions fléchées simples if(prevBtn) prevBtn.addEventListener('click', () => { currentImageIndex = (currentImageIndex > 0) ? currentImageIndex - 1 : fullImages.length - 1; galleryFullImg.src = fullImages[currentImageIndex]; }); if(nextBtn) nextBtn.addEventListener('click', () => { currentImageIndex = (currentImageIndex < fullImages.length - 1) ? currentImageIndex + 1 : 0; galleryFullImg.src = fullImages[currentImageIndex]; }); if(closeBtn) closeBtn.addEventListener('click', () => galleryOverlay.classList.add('hidden')); if(galleryOverlay) galleryOverlay.addEventListener('click', (e) => { if (e.target === galleryOverlay) galleryOverlay.classList.add('hidden'); }); } // --- CARROUSEL GALERIE --- const container = document.getElementById('gallery-carousel-container'); const prevGalleryBtn = document.getElementById('gallery-prev-btn'); const nextGalleryBtn = document.getElementById('gallery-next-btn'); if (container && prevGalleryBtn && nextGalleryBtn) { // Calculer scrollStep une seule fois, pas à chaque clic si possible, // ou le garder dynamique si la fenêtre change de taille prevGalleryBtn.addEventListener('click', () => { container.scrollBy({ left: -(container.offsetWidth * 0.8), behavior: 'smooth' }); }); nextGalleryBtn.addEventListener('click', () => { container.scrollBy({ left: (container.offsetWidth * 0.8), behavior: 'smooth' }); }); } // --- EXIT INTENT MODAL --- const modal = document.getElementById('exit-modal'); const closeModalBtn = document.getElementById('close-modal'); if (modal && !localStorage.getItem('visited_page')) { const showModal = () => { modal.classList.add('show'); localStorage.setItem('visited_page', 'true'); }; document.documentElement.addEventListener('mouseleave', (e) => { if (e.clientY <= 0) showModal(); }); if(closeModalBtn) closeModalBtn.addEventListener('click', () => closeExitModal()); } // --- AUTOCOMPLETE --- async function fetchAutocompleteData(phpFile, query) { try { const response = await fetch(`${phpFile}?query=${encodeURIComponent(query)}`); if (!response.ok) throw new Error(`Erreur HTTP: ${response.status}`); return await response.json(); } catch (error) { console.error("Erreur autocomplétion:", error); return []; } } function setupAutocomplete(inputId, dropdownId, phpFile) { const input = document.getElementById(inputId); const dropdown = document.getElementById(dropdownId); let timeout = null; if (!dropdown || !input) return; input.addEventListener('input', () => { const query = input.value.toLowerCase(); if (timeout) clearTimeout(timeout); if (query.length < 2) { dropdown.classList.add('hidden'); return; } // Optimisation: Afficher chargement seulement si pas trop rapide dropdown.innerHTML = '
Chargement...
'; dropdown.classList.remove('hidden'); timeout = setTimeout(async () => { const results = await fetchAutocompleteData(phpFile, query); dropdown.innerHTML = ''; if (results.length > 0) { const fragment = document.createDocumentFragment(); // Optimisation DOM results.forEach(result => { const item = document.createElement('div'); item.classList.add('autocomplete-item'); item.textContent = result; item.addEventListener('click', () => { input.value = result; dropdown.classList.add('hidden'); }); fragment.appendChild(item); }); dropdown.appendChild(fragment); } else { dropdown.innerHTML = '
Aucun résultat trouvé.
'; } }, 300); }); document.addEventListener('click', (e) => { if (!input.contains(e.target) && !dropdown.contains(e.target)) { dropdown.classList.add('hidden'); } }); } setupAutocomplete('activity-input', 'activity-dropdown', 'get_activities.php'); setupAutocomplete('city-input', 'city-dropdown', 'get_cities.php'); }); // Références aux éléments du DOM const statusDisplay = document.getElementById('status-display'); const locateButton = document.getElementById('locate-button'); const loadingSpinner = document.getElementById('loading-spinner'); const resultBox = document.getElementById('result-box'); const latitudeSpan = document.getElementById('latitude'); const longitudeSpan = document.getElementById('longitude'); const accuracySpan = document.getElementById('accuracy'); const buttonText = document.getElementById('button-text'); /** * Met à jour le statut affiché dans la boîte d'information. * @param {string} message - Le message à afficher. * @param {string} type - Le type de message ('info', 'success', 'error'). */ function updateStatus(message, type = 'info') { statusDisplay.style.display = "block"; statusDisplay.innerHTML = message; statusDisplay.className = 'p-4 rounded-lg text-sm text-center'; resultBox.classList.add('hidden'); switch (type) { case 'success': statusDisplay.classList.add('bg-green-50', 'border', 'border-green-200', 'text-green-800'); break; case 'error': statusDisplay.classList.add('bg-red-50', 'border', 'border-red-200', 'text-red-800'); break; case 'info': default: statusDisplay.classList.add('bg-blue-50', 'border', 'border-blue-200', 'text-blue-800'); break; } } /** * Gère la réussite de la géolocalisation. * @param {GeolocationPosition} position - L'objet de position retourné par l'API. */ function success(position) { locateButton.disabled = false; loadingSpinner.classList.add('hidden'); buttonText.textContent = 'Relancer la Géolocalisation'; const lat = position.coords.latitude.toFixed(6); const lon = position.coords.longitude.toFixed(6); const acc = position.coords.accuracy.toFixed(2); latitudeSpan.textContent = lat; longitudeSpan.textContent = lon; accuracySpan.textContent = `${acc} m`; //updateStatus(`Localisation réussie ! Vos coordonnées sont affichées ci-dessous.`, 'success'); resultBox.classList.remove('hidden'); window.location = "/recherche_gps.php?lat="+lat+"&lon="+lon }/** * Définit l'action de rechargement du bouton après un refus de permission. */ function setReloadButtonAction() { locateButton.setAttribute('onclick', 'window.location.search = \'?get_gps=1\''); } function getDeviceType() { const ua = navigator.userAgent; // 1. Détection Android if (/Android/i.test(ua)) { return "Android"; } // 2. Détection iOS (iPhone, iPod, iPad classique) // 'i' rend la recherche insensible à la casse (maj/min) if (/iPhone|iPad|iPod/i.test(ua)) { return "iOS"; } // 3. Détection iPad OS 13+ (Le Piège !) // Depuis iOS 13, les iPad se déclarent comme des Mac (MacIntel). // On vérifie s'il y a un écran tactile (maxTouchPoints > 1) pour faire la différence. if (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) { return "iOS"; // C'est un iPad } // 4. Tout le reste est considéré comme PC/Desktop (Mac, Windows, Linux) return "PC"; } /** * Gère l'échec de la géolocalisation. * @param {GeolocationPositionError} error - L'objet d'erreur retourné par l'API. */ function error(err) { locateButton.disabled = false; loadingSpinner.classList.add('hidden'); buttonText.textContent = 'Me Localiser'; let errorMessage = "Erreur inconnue."; let troubleshooting = "Vérifiez que votre connexion Internet est stable."; let devicetype = getDeviceType(); switch (err.code) { case err.PERMISSION_DENIED: setReloadButtonAction(); errorMessage = "Accès refusé (Code 1) : Vous devez autoriser le navigateur à accéder à votre position."; if(devicetype === 'iOS'){ // DÉTECTION SPÉCIFIQUE IOS POUR LE MESSAGE D'AIDE troubleshooting = '

Allez dans Réglages > Confidentialité et sécurité > Service de localisation. Sélectionnez Safari (ou votre navigateur) et cochez "Lorsque l\'app est active".'; }else if (getDeviceType() === 'Android') { // Texte Spécifique Android troubleshooting = '
1. Activez la "Position" (📍) dans le menu rapide du haut.
2. Si cela échoue, vérifiez que Chrome a la permission : Paramètres > Applis > Chrome > Autorisations.'; } else { // Texte par défaut (PC/Mac) troubleshooting = 'Cliquez sur le cadenas 🔒 à gauche de l\'adresse URL et autorisez la localisation, ou vérifiez les préférences de votre navigateur.'; } break; case err.POSITION_UNAVAILABLE: errorMessage = "Position indisponible (Code 2) : Impossible de déterminer votre position."; troubleshooting = "Ceci peut se produire si votre appareil n'a pas de signal GPS ou si vous êtes dans un environnement sans Wi-Fi/données mobiles."; break; case err.TIMEOUT: errorMessage = "Délai expiré (Code 3) : La recherche de position a pris trop de temps."; troubleshooting = "Essayez de vous déplacer vers un endroit avec un meilleur signal ou une meilleure connexion."; break; default: errorMessage = `Erreur : ${err.message}`; troubleshooting = "Veuillez vérifier les points ci-dessus."; break; } updateStatus(`${errorMessage}

Solution : ${troubleshooting}`, 'error'); } /** * Lance le processus de géolocalisation. */ function getGeolocation() { if (!navigator.geolocation) { updateStatus("Votre navigateur ne supporte pas l'API de géolocalisation.", 'error'); return; } // Désactivation du bouton et affichage du spinner locateButton.disabled = true; loadingSpinner.classList.remove('hidden'); //updateStatus("Lancement de la requête de géolocalisation...", 'info'); // Options de la requête de géolocalisation const options = { enableHighAccuracy: true, // Haute précision timeout: 15000, // 15 secondes avant le TIMEOUT maximumAge: 0 // Ne pas utiliser de position mise en cache }; navigator.geolocation.getCurrentPosition(success, error, options); } // Message initial //updateStatus("Bienvenue. Cliquez sur le bouton pour tester votre géolocalisation.");