/* global React */ const { useState, useEffect, useCallback, useMemo, useRef } = React; // ============================================================ // Le 1821 — Refonte // - Single React app, hash-routed // - 2 directions esthétiques pilotées via Tweaks (data-theme) // - Prototype cliquable complet (navigation + formulaire + lightbox) // ============================================================ // ============================================================ // Données dynamiques — chargées depuis data/*.json // (édition via le back-office /admin/, sans toucher au code) // ============================================================ const GALLERY_FALLBACK = [ { id: "g0", src: "assets/gite/entree.jpg", alt: "Façade en pierre du gîte Le 1821 avec terrasse", cap: "Façade en pierre · 1821", layout: "c-hero" }, ]; function useJSON(path, fallback) { const [data, setData] = useState(fallback); useEffect(() => { let alive = true; fetch(path, { cache: "no-store" }) .then(r => r.ok ? r.json() : Promise.reject(r.status)) .then(j => { if (alive) setData(j); }) .catch(() => {}); return () => { alive = false; }; }, [path]); return data; } const FEATURES = [ { title: "4 personnes", desc: "1 chambre lit double + mezzanine avec lit double", ico: "users" }, { title: "Accès piscine", desc: "Saison juin → sept., non chauffée, horaires sur place", ico: "pool" }, { title: "Cuisine équipée", desc: "Lave-vaisselle, four, plaque induction, frigo", ico: "kitchen" }, { title: "Borne électrique",desc: "Recharge véhicule type 2, 7 kW", ico: "ev" }, { title: "Wifi fibre", desc: "Connexion stable, télétravail possible", ico: "wifi" }, { title: "Animaux",desc: "Sur demande", ico: "paw" }, ]; // Endpoint Formspree / Web3Forms — laisser vide pour utiliser mailto: en fallback. // Ex: "https://formspree.io/f/xxxxxxx" ou "https://api.web3forms.com/submit" const FORM_ENDPOINT = ""; const CONTACT_EMAIL = "gite.le1821@gmail.com"; // Lien Google pour laisser un avis sur la fiche établissement. // ⚠️ À remplacer par l'URL réelle de votre fiche ("Écrire un avis") : // 1) Cherchez "Gîte Le 1821" sur Google Maps // 2) Cliquez sur "Écrire un avis" // 3) Copiez l'URL de cette page ici. // En attendant, le lien ouvre une recherche Google sur le nom du gîte. const GOOGLE_REVIEW_URL = "https://www.google.com/search?q=G%C3%AEte+Le+1821+Frayssinet+avis"; const REGION = [ { name: "Rocamadour", km: "32 km", type: "Cité médiévale · UNESCO", summary: "Cité médiévale suspendue à la falaise, classée UNESCO.", paragraphs: [ "Rocamadour, classé parmi les Plus Beaux Villages de France, s'accroche à 120 mètres au-dessus du canyon de l'Alzou. La cité s'étage en trois niveaux — village, sanctuaires, château — reliés par le Grand Escalier de 216 marches que les pèlerins gravissaient autrefois à genoux.", "La Chapelle Notre-Dame, qui abrite la Vierge Noire vénérée depuis le XIIᵉ siècle, et la basilique Saint-Sauveur composent l'ensemble sanctuaire, inscrit au patrimoine mondial au titre des chemins de Saint-Jacques-de-Compostelle. Vue à couper le souffle depuis le belvédère de l'Hospitalet, au coucher du soleil.", ], tags: ["Patrimoine", "Vue panoramique", "30 min en voiture"], img: "assets/regions/rocamadour.webp", }, { name: "Gouffre de Padirac", km: "38 km", type: "Site souterrain", summary: "Rivière souterraine et grotte aux dimensions impressionnantes.", paragraphs: [ "Une descente en ascenseur de 75 mètres dans la terre vous mène à la rivière plana, navigable en barque sur 700 mètres. Des stalactites monumentales — dont la Grande Pendeloque, 60 mètres de haut — éclairent un parcours sculpté par des millions d'années.", "Comptez 1h30 de visite, températures fraîches (13°C constants). Réservation en ligne fortement conseillée en juillet-août. Idéal en famille à partir de 4 ans.", ], tags: ["Famille", "Tout temps", "Réserver à l'avance"], img: "assets/regions/padirac.webp", }, { name: "Saint-Cirq-Lapopie", km: "45 km", type: "Plus beau village de France", summary: "Village perché au-dessus du Lot, classé Plus beau village.", paragraphs: [ "Saint-Cirq-Lapopie est élu Village préféré des Français en 2012. Ses ruelles médiévales en pente raide, ses maisons à pans de bois et ses ateliers d'artisans (verriers, ébénistes, peintres) en font une halte vivante au-dessus d'une boucle spectaculaire du Lot.", "À combiner avec une balade le long du chemin de halage taillé dans la roche, ou une descente en gabare. Marché de producteurs le mercredi matin en été.", ], tags: ["Artisanat", "Randonnée", "1h en voiture"], img: "assets/regions/saintcirq.jpg", }, { name: "Causses du Quercy", km: "Sur place", type: "Parc Naturel Régional", summary: "Géoparc UNESCO — paysages de pierre sèche, dolmens, lavognes.", paragraphs: [ "Le Parc Naturel Régional des Causses du Quercy, classé Géoparc mondial UNESCO, étire ses plateaux calcaires juste autour du gîte. Murets de pierre sèche, bories, lavognes (mares pavées) et chemins de transhumance forment un paysage façonné par 5 000 ans d'agropastoralisme.", "Une vingtaine de circuits balisés démarrent à moins de 15 minutes du gîte — du sentier d'interprétation accessible à tous (Frayssinet-le-Gélat) aux boucles plus exigeantes au-dessus du Lot. Topo-guides remis sur place.", ], tags: ["Randonnée", "Patrimoine naturel", "À pied depuis le gîte"], img: "assets/regions/caussesquercy.jpg", }, { name: "Forêt des Singes & Rocher des Aigles", km: "30 km", type: "Parcs animaliers", summary: "20 hectares en liberté pour 150 macaques de Barbarie, à Rocamadour.", paragraphs: [ "Sur les hauteurs de Rocamadour, la Forêt des Singes laisse évoluer en liberté 150 macaques de Barbarie sur 20 hectares — vous distribuez des graines, ils s'approchent à 50 cm. Programme de réintroduction des animaux dans l'Atlas marocain depuis 1980.", "À 2 km, le Rocher des Aigles présente des démonstrations de vol libre quotidiennes : aigles, vautours, condors. Les deux sites se font sur une demi-journée, idéal avec des enfants.", ], tags: ["Famille", "Avril → novembre"], img: "assets/regions/singes.jpg", }, { name: "Vignobles de Cahors", km: "55 km", type: "Œnotourisme", summary: "Le Malbec noir, cépage emblématique de la vallée du Lot.", paragraphs: [ "Au sud du gîte, la vallée du Lot serpente entre les domaines viticoles de l'appellation Cahors — vins rouges puissants, charpentés, issus du cépage Malbec (ou Côt). Plusieurs domaines en biodynamie ouvrent leur chai pour des dégustations sur rendez-vous.", "Pour une découverte sur une journée : Pont Valentré, vieille ville de Cahors, et 2-3 domaines en boucle.", ], tags: ["Œnologie", "Gastronomie", "Visite sur RDV"], img: "assets/regions/vignobles.jpg", }, { name: "Marché aux truffes de Lalbenque", km: "50 km", type: "Marché saisonnier", summary: "L'un des plus grands marchés de truffe noire de France.", paragraphs: [ "De début décembre à mi-mars, le mardi à 14h30 précises : le coup de sifflet ouvre le marché aux truffes de Lalbenque. Les rabassiers déballent leurs paniers, les négociants comparent, le ballet dure une heure. Une institution du Quercy depuis les années 1890.", "Hors saison, plusieurs trufficulteurs autour du gîte organisent des cavages avec leur chien et des dégustations à la ferme.", ], tags: ["Gastronomie", "Décembre → mars"], img: "assets/regions/truffes.jpg", }, { name: "Gourdon, Figeac, Cahors", km: "20 → 75 km", type: "Patrimoine · Trois cités", summary: "Trois cités d'histoire à explorer en journée.", paragraphs: [ "Gourdon, la plus proche (20 km), est une cité médiévale étagée sur une butte, dont les ruelles convergent vers la place couverte de la halle aux grains. Idéale pour une matinée flânerie + marché du samedi.", "Figeac (60 km) abrite le Musée Champollion-Les Écritures du Monde, dans la maison natale du déchiffreur des hiéroglyphes — collection unique d'écritures du monde entier. Cahors (75 km) avec son Pont Valentré, le seul pont fortifié médiéval encore intact en France.", ], tags: ["Patrimoine", "Musées", "Journée complète"], img: "assets/regions/gourdon.jpg", }, { name: "Randonnée & canoë", km: "Sur place", type: "Nature & Activités", summary: "GR652, canoë sur la Dordogne ou le Célé.", paragraphs: [ "Le sentier de Grande Randonnée GR652 passe à proximité du gîte et relie Rocamadour à Conques. Plusieurs boucles de 10 à 25 km traversent les Causses depuis Frayssinet-le-Gourdonnais — patrimoine de pierre sèche, points de vue sur les vallées.", "Pour l'eau : canoë-kayak sur la Dordogne au nord (Carennac, Saint-Sozy) ou sur le Célé à l'est (Marcilhac-sur-Célé) — locations en demi-journée ou journée complète, avec navette retour.", ], tags: ["Randonnée", "Famille", "Toute saison"], img: "assets/regions/randonnee.webp", }, { name: "Triangle Noir du Quercy", km: "Sur place", type: "Astronomie · Ciel nocturne", summary: "L'un des ciels les plus purs de France métropolitaine.", paragraphs: [ "Le gîte est situé au cœur du Triangle Noir du Quercy, l'une des zones de France métropolitaine où la pollution lumineuse est la plus faible. Les nuits sans lune révèlent la Voie lactée à l'œil nu, et les étoiles filantes des Perséides (août) ou des Géminides (décembre) y sont spectaculaires.", "Un télescope d'initiation est disponible sur place. Le Parc Naturel Régional organise plusieurs soirées d'observation publiques chaque été — programme remis à l'arrivée.", ], tags: ["Nature", "Soir", "Tout public"], img: "assets/regions/triangle_noir.jpg", }, ]; const TARIFS_FALLBACK = { rows: [ { id: "low", period: "Basse saison", dates: "Janv. → mai · oct. → déc.", week: "420 €", night: "70 €" }, { id: "high", period: "Moyenne et haute saison", dates: "Juin à septembre", week: "600 €", night: "—" } ], included: [], options: [], conditions: "" }; const TESTIMONIALS_FALLBACK = [ { id: "t1", quote: "Un havre de paix dans les Causses.", author: "—" } ]; // ============================================================ // Icons (line, minimal — no decorative SVG) // ============================================================ const Ico = ({ name, size = 22 }) => { const s = size; switch (name) { case "users": return ; case "pool": return ; case "kitchen": return ; case "ev": return ; case "wifi": return ; case "paw": return ; case "arrow": return ; case "close": return ; default: return null; } }; // ============================================================ // NAV // ============================================================ function Nav({ route, go, theme }) { const [open, setOpen] = useState(false); const links = [ { id: "home", label: "Le Gîte" }, { id: "photos", label: "Photos" }, { id: "region", label: "La Région" }, { id: "tarifs", label: "Tarifs" }, { id: "contact", label: "Contact" }, ]; return ( ); } // ============================================================ // HERO // ============================================================ function Hero({ go }) { return (
Frayssinet-le-Gourdonnais · Lot · 46310

Un gîte
de pierre,
depuis 1821

Maison du Quercy restaurée pour 4 personnes, accès piscine en saison et silence des Causses. À l'écart, tout en restant à 30 minutes de Rocamadour et des plus beaux villages de France.

Capacité
4 personnes · 1 chambre + mezzanine
Classement
★★★ — 3 étoiles France
Disponible
Semaine toute l'année · Nuitée d'octobre à mai (2 nuits min.)
Façade en pierre du gîte Le 1821 avec terrasse
★★★ Classement officiel
); } // ============================================================ // SECTION HEAD // ============================================================ function SectionHead({ idx, kicker, title, em }) { return (
— {idx} {kicker}

{title} {em && {em}}

); } // ============================================================ // HOME — composition complète // ============================================================ function Home({ go, openLightbox, gallery }) { return ( <> {/* LE GÎTE */}

Cette ancienne dépendance agricole, datée de 1821 sur sa clé de voûte, a gardé ses murs de pierre sèche et sa charpente apparente en chêne. La restauration, menée en matériaux naturels (chaux, terre crue, bois local), conserve l'esprit du lieu tout en intégrant un chauffage et une climatisation modernes par pompe à chaleur.

« 200 ans de pierre, restaurées avec patience et respect des matières. »

À noter — Le gîte n'est pas adapté aux personnes à mobilité réduite (escalier vers l'étage).

{FEATURES.map(f => (

{f.title}

{f.desc}

))}
{/* PHOTOS */}
{gallery.map((g, i) => ( ))}
{/* TESTIMONIAL */}
{/* REGION */}
{REGION.slice(0, 3).map(r => (
{r.img ? {r.name} :
Photo {r.name} ·
à fournir
} {r.km}

{r.name}

{r.summary}

))}
); } // ============================================================ // REGION PAGE — long-form éditorial // ============================================================ function RegionPage({ go }) { const [filter, setFilter] = useState("all"); const tags = ["all", "Patrimoine", "Nature", "Famille", "Randonnée", "Gastronomie", "Œnologie"]; const filtered = filter === "all" ? REGION : REGION.filter(r => r.tags.some(t => t === filter)); return (

Le 1821 est niché dans le Parc Naturel Régional des Causses du Quercy, à mi-chemin entre la vallée de la Dordogne et celle du Lot. Voici les dix lieux que nous recommandons en priorité — du château accroché à la falaise au ciel étoilé du Triangle Noir, en passant par les vignobles de Cahors et le marché aux truffes de Lalbenque.

{tags.map(t => ( ))}
{filtered.map((r, i) => (
{r.img ? {r.name} :
Photo {r.name} ·
à fournir
} {r.km}
— {String(i + 1).padStart(2, "0")} {r.type}

{r.name}

{r.paragraphs.map((p, k) =>

{p}

)}
{r.tags.map(t => {t})}
))}
); } // ============================================================ // TARIFS // ============================================================ function Tarifs({ go }) { const T = useJSON("data/tarifs.json", TARIFS_FALLBACK); return (
{(T.rows || []).map(t => ( ))}
Période Semaine Nuit (basse)
{t.period} {t.dates} {t.week} {t.night}
); } // ============================================================ // CALENDAR (statique mais interactif) // ============================================================ function Calendar() { const today = new Date(); const [m, setM] = useState({ y: today.getFullYear(), mo: today.getMonth() }); const MONTH_NAMES = ["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"]; const DOW = ["L","M","M","J","V","S","D"]; // génère un set de jours réservés / options selon le mois const generated = useMemo(() => { const seed = m.y * 12 + m.mo; const booked = new Set(); const option = new Set(); const rng = (i) => Math.abs(Math.sin(seed * 13.37 + i)) % 1; for (let d = 1; d <= 31; d++) { const r = rng(d); if (r < 0.18) booked.add(d); else if (r < 0.24) option.add(d); } return { booked, option }; }, [m]); const first = new Date(m.y, m.mo, 1); const startDow = (first.getDay() + 6) % 7; const daysInMonth = new Date(m.y, m.mo + 1, 0).getDate(); const nav = (delta) => { const d = new Date(m.y, m.mo + delta, 1); setM({ y: d.getFullYear(), mo: d.getMonth() }); }; return (
{MONTH_NAMES[m.mo]} {m.y}
{DOW.map((d, i) =>
{d}
)} {Array.from({ length: startDow }).map((_, i) =>
)} {Array.from({ length: daysInMonth }).map((_, i) => { const d = i + 1; const cls = generated.booked.has(d) ? "booked" : generated.option.has(d) ? "option" : "free"; return
{d}
; })}
Disponible Option Réservé
); } // ============================================================ // CONTACT // ============================================================ function Contact() { const [data, setData] = useState({ name: "", email: "", phone: "", arrive: "", depart: "", people: 2, message: "" }); const [errors, setErrors] = useState({}); const [sent, setSent] = useState(false); const submit = async (e) => { e.preventDefault(); const err = {}; if (!data.name.trim()) err.name = "Votre nom est requis."; if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(data.email)) err.email = "Email invalide."; if (!data.arrive) err.arrive = "Date d'arrivée requise."; if (!data.depart) err.depart = "Date de départ requise."; if (data.arrive && data.depart && data.depart <= data.arrive) err.depart = "La date de départ doit être après l'arrivée."; setErrors(err); if (Object.keys(err).length > 0) return; // ── Mode 1 : Formspree / Web3Forms si FORM_ENDPOINT renseigné ── if (FORM_ENDPOINT) { try { await fetch(FORM_ENDPOINT, { method: "POST", headers: { "Content-Type": "application/json", "Accept": "application/json" }, body: JSON.stringify(data) }); } catch (_) {} setSent(true); return; } // ── Mode 2 (par défaut, statique NAS) : mailto: pré-rempli ── const subject = encodeURIComponent(`Demande de réservation — ${data.name}`); const body = encodeURIComponent( `Bonjour Patricia et Philippe,\n\n` + `Je souhaite réserver le gîte Le 1821 :\n` + `• Arrivée : ${data.arrive}\n` + `• Départ : ${data.depart}\n` + `• Voyageurs : ${data.people}\n` + `• Téléphone : ${data.phone || "—"}\n\n` + `Message :\n${data.message || "—"}\n\n` + `Cordialement,\n${data.name}\n${data.email}` ); window.location.href = `mailto:${CONTACT_EMAIL}?subject=${subject}&body=${body}`; setSent(true); }; return (
Vos hôtes
Patricia et Philippe
Adresse
1213 route du Plegat
46310 Frayssinet-le-Gourdonnais
Téléphone
06 66 58 63 61 · Patricia
06 95 14 31 68 · Philippe
Email
{CONTACT_EMAIL}
Accessibilité
Non adapté aux personnes à mobilité réduite.
Accueil
L'accueil au gîte est assuré par vos hôtes.
Le 1821 44.6555°N · 1.4945°E
{!sent ? (
setData({ ...data, name: e.target.value })} /> {errors.name && {errors.name}}
setData({ ...data, email: e.target.value })} /> {errors.email && {errors.email}}
setData({ ...data, phone: e.target.value })} />
setData({ ...data, arrive: e.target.value })} /> {errors.arrive && {errors.arrive}}
setData({ ...data, depart: e.target.value })} /> {errors.depart && {errors.depart}}