import React, { useState, useEffect, useRef, useMemo } from 'react'; import { BookOpen, Calculator, ChevronRight, ChevronLeft, Play, Pause, Info, ArrowLeft, ArrowUpAZ, ArrowDownZA, Moon, Home as HomeIcon, Search, Bookmark, Coins, Volume2, X, Sparkles, Menu, Calendar as CalendarIcon, Clock, MapPin, Sunrise, Sun, Sunset, Globe, RefreshCw, TrendingUp, Wifi, HelpCircle, AlertCircle, Settings, FileText, Share2, ShieldCheck, Crown, Download, History, CheckCircle, Lock } from 'lucide-react'; // ========================================== // 1. CONSTANTES & DATA // ========================================== const DREAMS_DATA = [ { keyword: "Abeille", interpretation: "Symbolise la fertilité, la richesse obtenue par un effort, ou un homme utile à la communauté. Si elle pique, c'est un bienfait." }, { keyword: "Ablutions", interpretation: "Faire ses ablutions (Woudou) complètement signifie l'exaucement d'un besoin, la protection contre les peurs et la purification des péchés." }, { keyword: "Accouchement", interpretation: "Pour une personne en difficulté, c'est la fin des soucis. Pour une femme enceinte, c'est une bonne nouvelle. Peut aussi signifier la sortie d'une épreuve." }, { keyword: "Adhan", interpretation: "Entendre l'appel à la prière indique le Hajj si c'est la saison, ou une nouvelle véridique. Peut aussi signifier un appel à la droiture." }, { keyword: "Araignée", interpretation: "Représente souvent une femme malveillante, ou un homme faible et ascétique. Sa toile symbolise la fragilité." }, { keyword: "Argent", interpretation: "L'argent en métal (pièces) représente des soucis ou des paroles futiles. Les billets peuvent signifier la richesse mais avec des responsabilités." }, { keyword: "Arbre", interpretation: "Un arbre représente un homme. S'il est fruitier, c'est un homme profitable. S'il est sec, un homme avare ou hypocrite." }, { keyword: "Bateau", interpretation: "Le bateau symbolise le salut, la délivrance des soucis, ou le mariage pour le célibataire." }, { keyword: "Chat", interpretation: "Souvent interprété comme un voleur (parfois de la famille) ou un serviteur. S'il est calme, c'est une année de confort ; sauvage, une année de troubles." }, { keyword: "Cheval", interpretation: "Symbolise la force, la puissance, l'honneur et la victoire sur les ennemis. Monter un cheval indique la dignité et le pouvoir." }, { keyword: "Cheveux", interpretation: "Les cheveux longs sont une augmentation de biens pour la femme, mais des soucis pour l'homme (selon le contexte). Les couper peut signifier payer une dette." }, { keyword: "Chien", interpretation: "Un ennemi faible, ou un homme avare et méprisable. L'aboiement est une parole désagréable d'une personne sans honneur." }, { keyword: "Chute", interpretation: "Tomber d'un endroit élevé signifie passer d'une situation à une autre moins favorable, ou un péché." }, { keyword: "Ciel", interpretation: "Regarder le ciel symbolise l'ambition ou le regard vers l'Imam/Dirigeant. S'il est pur, c'est une bonne nouvelle." }, { keyword: "Ccimetière", interpretation: "Peut indiquer la prise de conscience, l'ascétisme, ou la visite de prisonniers. Parfois signe de frayeur." }, { keyword: "Dents", interpretation: "Les dents représentent la famille. Celles du haut : les hommes (père, oncles). Celles du bas : les femmes. Une dent qui tombe peut signifier une longue vie (survivre à ses proches) ou une dette payée." }, { keyword: "Eau", interpretation: "L'eau pure est signe de vie, de miséricorde et de pureté. L'eau trouble ou stagnante peut indiquer des soucis ou une maladie." }, { keyword: "Enfer", interpretation: "Le voir est un avertissement contre le péché. Y entrer peut signifier commettre des fautes graves." }, { keyword: "Etoiles", interpretation: "Les étoiles symbolisent les nobles, les savants ou les riches. Les voir tomber peut annoncer la mort de grands personnages." }, { keyword: "Feu", interpretation: "Le feu peut symboliser la guerre, la tentation (fitna) ou parfois la guidance s'il éclaire sans brûler." }, { keyword: "Kaaba", interpretation: "La voir symbolise la sécurité, la guidance, ou une rencontre avec une personne d'autorité. Y entrer peut annoncer le Hajj." }, { keyword: "Lait", interpretation: "Le lait représente la Fitra (nature innée) et la connaissance religieuse pure. Le boire est signe de science et de richesse licite." }, { keyword: "Larmes", interpretation: "Des larmes froides sont une joie. Des larmes chaudes sont une tristesse. Pleurer sans crier est souvent un soulagement." }, { keyword: "Lion", interpretation: "Un ennemi puissant et redoutable, ou un dirigeant injuste. Le vaincre est une grande victoire." }, { keyword: "Lune", interpretation: "La lune représente un dirigeant juste, un savant, un mari ou un fils vertueux." }, { keyword: "Maison", interpretation: "La maison symbolise la sécurité, la femme, ou l'état spirituel du rêveur. Une maison neuve est un bienfait." }, { keyword: "Mariage", interpretation: "Le mariage dans un rêve peut signifier l'honneur, la richesse, un nouveau métier, ou la providence divine." }, { keyword: "Miel", interpretation: "L'argent licite obtenu sans effort, ou la douceur de la foi et la lecture du Coran." }, { keyword: "Montagne", interpretation: "Symbolise un homme de haut rang, une épreuve difficile ou un objectif élevé. La gravir signifie l'ascension sociale." }, { keyword: "Mort", interpretation: "Peut symboliser la fin d’un cycle, le repentir, la corruption religieuse ou parfois... la vie (longévité)." }, { keyword: "Oiseau", interpretation: "Un oiseau représente la joie, les bonnes nouvelles ou les actions de l'homme." }, { keyword: "Or", interpretation: "Pour les hommes, l'or est souvent synonyme de soucis ou de perte d'argent. Pour les femmes, c'est une parure et une joie." }, { keyword: "Paradis", interpretation: "Bonne nouvelle, entrée dans la sécurité, fin heureuse et bonnes actions." }, { keyword: "Pluie", interpretation: "Si elle ne cause pas de dégâts, c'est une miséricorde et un soulagement venant d'Allah. Si elle est torrentielle, c'est une épreuve." }, { keyword: "Poisson", interpretation: "En nombre connu, ce sont des femmes. En nombre inconnu ou grand nombre, c'est de l'argent et du butin." }, { keyword: "Prière", interpretation: "Faire la prière indique l'accomplissement des promesses, l'atteinte des objectifs et la purification des péchés." }, { keyword: "Prophète", interpretation: "Voir le Prophète (Salla Allahou Alayhi wa Sallam) sous sa véritable apparence est une vision véridique annonçant succès et guidance." }, { keyword: "Rire", interpretation: "Le rire bruyant (éclat de rire) peut annoncer une tristesse. Le sourire est toujours positif et prophétique." }, { keyword: "Roi", interpretation: "Représente l'autorité, le pouvoir ou l'élévation sociale. S'il est juste, c'est un bienfait." }, { keyword: "Sang", interpretation: "Le sang qui coule peut signifier une perte d'argent ou une parole mensongère. Boire du sang est un péché." }, { keyword: "Serpent", interpretation: "Un ennemi caché. Sa taille et sa dangerosité dépendent de la taille du serpent. Le tuer est une victoire." }, { keyword: "Soleil", interpretation: "Le soleil représente le dirigeant suprême ou le père. S'il est éclipsé, cela indique un événement grave touchant le chef." }, { keyword: "Voler", interpretation: "Voler avec des ailes symbolise le voyage. Sans ailes, cela peut signifier un changement d'état ou un souhait exaucé." }, { keyword: "Voyage", interpretation: "Indique un changement d'état, le passage d'une situation à une autre, ou la recherche de gain." } ]; // ========================================== // 2. SERVICES & LIB // ========================================== const API_BASE = "https://api.alquran.cloud/v1"; const fetchSurahs = async () => { const res = await fetch(`${API_BASE}/surah`); const data = await res.json(); return data.data; }; const fetchSurahDetails = async (number) => { const res = await fetch(`${API_BASE}/surah/${number}/editions/quran-uthmani,fr.hamidullah`); const data = await res.json(); return { arabic: data.data[0], french: data.data[1] }; }; // ========================================== // 3. SCHEMA.ORG GENERATORS // ========================================== const getBreadcrumbSchema = (items) => ({ "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": items.map((item, index) => ({ "@type": "ListItem", "position": index + 1, "name": item.name, "item": item.url ? `https://islam.quran${item.url}` : undefined })) }); const getFaqSchema = (faqs) => ({ "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": faqs.map(faq => ({ "@type": "Question", "name": faq.q, "acceptedAnswer": { "@type": "Answer", "text": faq.a } })) }); const getCalculatorSchema = (name, description) => ({ "@context": "https://schema.org", "@type": "SoftwareApplication", "name": name, "applicationCategory": "FinanceApplication", "operatingSystem": "Web", "description": description, "offers": { "@type": "Offer", "price": "0", "priceCurrency": "EUR" } }); const getLocalBusinessSchema = (city, country) => ({ "@context": "https://schema.org", "@type": "Place", "name": `Horaires de prière à ${city}`, "address": { "@type": "PostalAddress", "addressLocality": city, "addressCountry": country }, "publicAccess": true, "geo": { "@type": "GeoCoordinates" } }); // ========================================== // 4. COMPOSANTS UI & SEO & ADS // ========================================== const AdSenseBanner = ({ className = "" }) => { return (
Publicité Partenaire
Espace Publicitaire (Filtrage Catégories Sensibles)
); }; const SeoHead = ({ title, description, schema }) => { useEffect(() => { document.title = `${title} | islam.quran`; const metaDesc = document.querySelector('meta[name="description"]'); if (metaDesc) metaDesc.setAttribute('content', description); }, [title, description]); const jsonLd = schema ? (Array.isArray(schema) || schema['@graph'] ? schema : { ...schema }) : null; return (
{jsonLd && ( )}
); }; const Button = ({ children, onClick, variant = 'primary', className = "", disabled = false, ...props }) => { const variants = { primary: "bg-emerald-600 text-white hover:bg-emerald-700 active:bg-emerald-800 shadow-sm", secondary: "bg-slate-100 text-slate-700 hover:bg-slate-200 active:bg-slate-300", outline: "border-2 border-emerald-600 text-emerald-600 hover:bg-emerald-50", premium: "bg-amber-400 text-amber-950 hover:bg-amber-500 shadow-sm font-bold" }; return ( ); }; const Header = ({ setPage, activePage, isPremium }) => (
setPage('home')} role="button" tabIndex={0} >
islam.quran
); const AudioPlayer = ({ currentSurah, isPlaying, togglePlay, progress, onClose }) => { if (!currentSurah) return null; return (
{currentSurah.number}

{currentSurah.englishName}

{currentSurah.englishNameTranslation}

); }; // ========================================== // 5. PAGES // ========================================== // ------------------------------------------ // PAGE: DISCLAIMER // ------------------------------------------ const DisclaimerPage = () => (

Avertissement Important

Veuillez lire attentivement avant d'utiliser nos outils.

1. Nature Informatif

Les outils disponibles sur islam.quran sont conçus à des fins éducatives et informatives uniquement. Bien que nous nous efforcions d'assurer l'exactitude des algorithmes, des erreurs peuvent exister.

2. Consultation Professionnelle

Ces outils numériques ne remplacent pas la consultation d'experts qualifiés :

  • Zakat & Héritage : Consultez un savant (Mufti) ou un notaire.
  • Rêves : Les interprétations ne sont que des indications basées sur des textes anciens.
  • Prières : Vérifiez les horaires avec votre mosquée locale.

3. Responsabilité

L'utilisateur reste seul responsable de ses décisions et de ses actes basés sur les informations fournies par ce site.

"Allah est le plus Savant." (Allahu A'lam)
); // ------------------------------------------ // PAGE: PREMIUM // ------------------------------------------ const PremiumPage = ({ isPremium, onTogglePremium }) => (

Espace Premium

Soutenez la plateforme et accédez à des outils pratiques pour faciliter votre quotidien.

Gratuit

  • Coran Complet
  • Horaires de Prière
  • Calculateur Zakat Basique
  • Dictionnaire des Rêves
Inclus

Premium

  • Tout le contenu Gratuit
  • Sauvegarde de l'historique
  • Export PDF des calculs
  • Zéro Publicité
); // ------------------------------------------ // PAGE: SEO PAGE GENERATOR // ------------------------------------------ const SeoPageGenerator = ({ type, param, onBack }) => { let content = {}; let schemaGraph = []; const breadcrumb = getBreadcrumbSchema([ { name: 'Accueil', url: '/' }, { name: 'Ressources', url: '/ressources' }, { name: param, url: null } ]); switch(type) { case 'dream': const dream = DREAMS_DATA.find(d => d.keyword === param) || { keyword: param, interpretation: "Interprétation non disponible." }; content = { title: `Rêver de ${dream.keyword}`, description: `Signification du rêve de ${dream.keyword} selon Ibn Sirine.`, intro: "Interprétation basée sur les textes classiques.", body: (

"{dream.interpretation}"

Voir "{dream.keyword}" peut avoir des significations variées selon le contexte.

), faq: [{ q: "Est-ce fiable ?", a: "C'est une indication, pas une certitude." }] }; schemaGraph = [breadcrumb, getFaqSchema(content.faq)]; break; case 'zakat': content = { title: `Zakat en ${param}`, description: `Guide Zakat pour ${param}.`, intro: "Obligation pour tout musulman éligible.", body:

Le calcul se base sur le Nisab local en {param}.

, faq: [{ q: "Quel taux ?", a: "2.5% du patrimoine." }] }; schemaGraph = [breadcrumb, getFaqSchema(content.faq)]; break; case 'prayer': content = { title: `Prières à ${param}`, description: `Horaires pour ${param}.`, intro: "La prière est le pilier de la religion.", body:

Horaires calculés pour {param}. Vérifiez avec votre mosquée.

, faq: [{ q: "Quelle méthode ?", a: "Dépend de la région." }] }; schemaGraph = [breadcrumb, getLocalBusinessSchema(param, ""), getFaqSchema(content.faq)]; break; case 'calendar': content = { title: `Calendrier ${param}`, description: `Dates clés pour ${param}.`, intro: "Basé sur le cycle lunaire.", body:

Dates estimées pour {param} (Ramadan, Aïd).

, faq: [{ q: "Début Ramadan ?", a: "Dépend de la lune." }] }; schemaGraph = [breadcrumb, getFaqSchema(content.faq)]; break; default: return null; } const schema = { "@context": "https://schema.org", "@graph": schemaGraph }; return (

{content.title}

{content.intro}

{content.body}

FAQ

{content.faq.map((item, idx) => (

{item.q}

{item.a}

))}
); }; // ------------------------------------------ // PAGE: HUB SEO / RESSOURCES // ------------------------------------------ const SeoResourcesPage = () => { const [selectedPage, setSelectedPage] = useState(null); if (selectedPage) return setSelectedPage(null)} />; const sections = [ { title: "Rêves", icon: Moon, color: "bg-indigo-50 text-indigo-600", links: [{ label: "Rêver de Serpent", type: 'dream', param: 'Serpent' }, { label: "Rêver d'Eau", type: 'dream', param: 'Eau' }] }, { title: "Zakat", icon: Coins, color: "bg-amber-50 text-amber-600", links: [{ label: "Zakat France", type: 'zakat', param: 'France' }, { label: "Zakat Maroc", type: 'zakat', param: 'Maroc' }] }, { title: "Prières", icon: Clock, color: "bg-sky-50 text-sky-600", links: [{ label: "Paris", type: 'prayer', param: 'Paris' }, { label: "Lyon", type: 'prayer', param: 'Lyon' }] }, { title: "Calendrier", icon: CalendarIcon, color: "bg-teal-50 text-teal-600", links: [{ label: "Ramadan 2025", type: 'calendar', param: '2025' }] } ]; return (

Ressources

Guides détaillés et réponses à vos questions.

{sections.map((section, idx) => (

{section.title}

    {section.links.map((link, i) => (
  • ))}
))}
); }; // ------------------------------------------ // PAGE: ZAKAT // ------------------------------------------ const ZakatPage = ({ isPremium }) => { const [assets, setAssets] = useState({ cash: 0, gold: 0, silver: 0, actions: 0, debts: 0 }); const [result, setResult] = useState(null); const calculateZakat = () => { const total = assets.cash + assets.actions; setResult({ total, due: total * 0.025, eligible: true }); }; return (

Calculateur Zakat

{isPremium && Premium}
setAssets({...assets, cash: parseFloat(e.target.value) || 0})} />
{result && (

Montant Zakat

{result.due} €

)}
); }; // ------------------------------------------ // PAGE: HEURES DE PRIÈRE // ------------------------------------------ const PrayerTimesPage = ({ isPremium }) => { const [times, setTimes] = useState(null); const [locationName, setLocationName] = useState("Localisation..."); const [locationDetails, setLocationDetails] = useState({ city: null, country: null }); const [loading, setLoading] = useState(true); useEffect(() => { if (!navigator.geolocation) { setLoading(false); return; } navigator.geolocation.getCurrentPosition( async (position) => { const { latitude, longitude } = position.coords; const date = Math.floor(Date.now() / 1000); const res = await fetch(`https://api.aladhan.com/v1/timings/${date}?latitude=${latitude}&longitude=${longitude}&method=3`); const data = await res.json(); setTimes(data.data.timings); fetch(`https://nominatim.openstreetmap.org/reverse?format=json&lat=${latitude}&lon=${longitude}`).then(r=>r.json()).then(d => { setLocationName(d.address.city || "Ville détectée"); setLocationDetails({ city: d.address.city, country: d.address.country }); }); setLoading(false); }, () => setLoading(false) ); }, []); const prayers = times ? [{n:'Fajr',t:times.Fajr,i:Sunrise},{n:'Dhuhr',t:times.Dhuhr,i:Sun},{n:'Asr',t:times.Asr,i:Sun},{n:'Maghrib',t:times.Maghrib,i:Sunset},{n:'Isha',t:times.Isha,i:Moon}] : []; return (

{locationName}

{loading ?
Chargement...
: (
{prayers.map((p,i)=>(

{p.n}

{p.t}

))}
)} {!isPremium && } {locationDetails.city && (

Prières à {locationDetails.city}

Retrouvez les horaires exacts pour {locationDetails.city}, {locationDetails.country}. Ces horaires sont calculés selon la méthode de la Ligue Islamique Mondiale.

)}
); }; // ------------------------------------------ // PAGE: CALENDRIER // ------------------------------------------ const CalendarPage = ({ isPremium }) => { return (

Calendrier Hijri

Aujourd'hui

1445 H

Date basée sur le calcul Umm al-Qura

{!isPremium && }
); }; // ------------------------------------------ // PAGE: RÊVES // ------------------------------------------ const DreamsPage = ({ isPremium }) => { const [search, setSearch] = useState(""); const [history, setHistory] = useState([]); const handleSearch = (term) => { setSearch(term); if(isPremium && term) setHistory(prev => [term, ...prev.filter(t=>t!==term)].slice(0,5)); }; const processedData = useMemo(() => DREAMS_DATA.filter(d => d.keyword.toLowerCase().includes(search.toLowerCase())), [search]); return (

Tafsir Al-Ahlam

Important : Les rêves ne sont pas une source de législation. Seuls les rêves véridiques viennent d'Allah.
handleSearch(e.target.value)} />
{isPremium && history.length > 0 && (
{history.map((h,i)=>setSearch(h)}>{h})}
)}
{processedData.map((d,i)=>(

{d.keyword}

{d.interpretation}

))}
{/* Pas de publicité sur cette page sensible */}
); }; // ------------------------------------------ // PAGE: CORAN // ------------------------------------------ const CoranPage = () => (

Le Saint Coran

Liste des sourates (Chargement...)

); // ------------------------------------------ // PAGE: HERITAGE // ------------------------------------------ const HeritagePage = () => (

Héritage (Farâïd)

Outil éducatif uniquement. Consultez un savant.

Formulaire de calcul (En construction)

); // ------------------------------------------ // PAGE: ACCUEIL // ------------------------------------------ const HomePage = ({ setPage, isPremium }) => (

islam.quran

Votre compagnon quotidien pour la pratique et le savoir.

{[ { id: 'coran', label: 'Coran', icon: BookOpen, col: 'bg-emerald-50 text-emerald-600' }, { id: 'prayers', label: 'Prières', icon: Clock, col: 'bg-sky-50 text-sky-600' }, { id: 'zakat', label: 'Zakat', icon: Coins, col: 'bg-amber-50 text-amber-600' }, { id: 'dreams', label: 'Rêves', icon: Moon, col: 'bg-indigo-50 text-indigo-600' } ].map(i => ( ))}
{!isPremium && }
); // ------------------------------------------ // ROOT COMPONENT // ------------------------------------------ export default function App() { const [activePage, setActivePage] = useState('home'); const [isPremium, setIsPremium] = useState(false); useEffect(() => { window.scrollTo(0, 0); }, [activePage]); const renderPage = () => { switch (activePage) { case 'home': return ; case 'coran': return ; case 'heritage': return ; case 'zakat': return ; case 'dreams': return ; case 'calendar': return ; case 'prayers': return ; case 'premium': return setIsPremium(!isPremium)} />; case 'disclaimer': return ; case 'seo_hub': return ; default: return ; } }; return (
{renderPage()}
); }