| <!DOCTYPE html> |
| <html lang="fr"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Cours 1ère D - Côte d'Ivoire</title> |
| |
| <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet"> |
| |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| |
| <style> |
| :root { |
| |
| --primary-color: #0056D2; |
| --secondary-color: #F77F00; |
| --accent-color: #FCBF49; |
| --bg-light: #F8F9FA; |
| --bg-white: #FFFFFF; |
| --text-main: #2B2D42; |
| --text-light: #8D99AE; |
| --border-color: #E9ECEF; |
| --sidebar-width: 280px; |
| --header-height: 70px; |
| --shadow-sm: 0 2px 4px rgba(0,0,0,0.05); |
| --shadow-md: 0 4px 12px rgba(0,0,0,0.08); |
| --transition: all 0.3s ease; |
| } |
| |
| * { |
| margin: 0; |
| padding: 0; |
| box-sizing: border-box; |
| } |
| |
| body { |
| font-family: 'Inter', sans-serif; |
| background-color: var(--bg-light); |
| color: var(--text-main); |
| height: 100vh; |
| display: flex; |
| flex-direction: column; |
| overflow: hidden; |
| } |
| |
| |
| header { |
| height: var(--header-height); |
| background-color: var(--bg-white); |
| border-bottom: 1px solid var(--border-color); |
| display: flex; |
| align-items: center; |
| justify-content: space-between; |
| padding: 0 2rem; |
| position: fixed; |
| top: 0; |
| width: 100%; |
| z-index: 100; |
| box-shadow: var(--shadow-sm); |
| } |
| |
| .brand { |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| font-weight: 700; |
| font-size: 1.25rem; |
| color: var(--primary-color); |
| } |
| |
| .brand i { |
| font-size: 1.5rem; |
| color: var(--secondary-color); |
| } |
| |
| .header-actions { |
| display: flex; |
| align-items: center; |
| gap: 20px; |
| } |
| |
| .anycoder-link { |
| font-size: 0.85rem; |
| color: var(--text-light); |
| text-decoration: none; |
| transition: var(--transition); |
| font-weight: 500; |
| } |
| |
| .anycoder-link:hover { |
| color: var(--primary-color); |
| } |
| |
| .mobile-menu-btn { |
| display: none; |
| background: none; |
| border: none; |
| font-size: 1.5rem; |
| color: var(--text-main); |
| cursor: pointer; |
| } |
| |
| |
| .app-container { |
| display: flex; |
| margin-top: var(--header-height); |
| height: calc(100vh - var(--header-height)); |
| width: 100%; |
| } |
| |
| |
| aside { |
| width: var(--sidebar-width); |
| background-color: var(--bg-white); |
| border-right: 1px solid var(--border-color); |
| overflow-y: auto; |
| display: flex; |
| flex-direction: column; |
| transition: transform 0.3s ease-in-out; |
| } |
| |
| .search-container { |
| padding: 1.5rem; |
| position: sticky; |
| top: 0; |
| background: var(--bg-white); |
| z-index: 10; |
| } |
| |
| .search-box { |
| position: relative; |
| } |
| |
| .search-box input { |
| width: 100%; |
| padding: 10px 15px 10px 40px; |
| border: 1px solid var(--border-color); |
| border-radius: 8px; |
| font-family: inherit; |
| font-size: 0.9rem; |
| background-color: var(--bg-light); |
| transition: var(--transition); |
| } |
| |
| .search-box input:focus { |
| outline: none; |
| border-color: var(--primary-color); |
| background-color: var(--bg-white); |
| box-shadow: 0 0 0 3px rgba(0, 86, 210, 0.1); |
| } |
| |
| .search-box i { |
| position: absolute; |
| left: 14px; |
| top: 50%; |
| transform: translateY(-50%); |
| color: var(--text-light); |
| } |
| |
| .subject-list { |
| list-style: none; |
| padding: 0 1rem 2rem 1rem; |
| } |
| |
| .subject-item { |
| margin-bottom: 0.5rem; |
| } |
| |
| .subject-btn { |
| width: 100%; |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| padding: 12px 16px; |
| border: none; |
| background: none; |
| border-radius: 8px; |
| cursor: pointer; |
| text-align: left; |
| font-size: 0.95rem; |
| font-weight: 500; |
| color: var(--text-main); |
| transition: var(--transition); |
| } |
| |
| .subject-btn:hover { |
| background-color: var(--bg-light); |
| color: var(--primary-color); |
| } |
| |
| .subject-btn.active { |
| background-color: rgba(0, 86, 210, 0.1); |
| color: var(--primary-color); |
| font-weight: 600; |
| } |
| |
| .subject-icon { |
| width: 32px; |
| height: 32px; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| background-color: var(--bg-light); |
| border-radius: 6px; |
| font-size: 0.9rem; |
| transition: var(--transition); |
| } |
| |
| .subject-btn.active .subject-icon { |
| background-color: var(--primary-color); |
| color: white; |
| } |
| |
| |
| main { |
| flex: 1; |
| background-color: var(--bg-light); |
| overflow-y: auto; |
| padding: 2rem; |
| position: relative; |
| } |
| |
| |
| .empty-state { |
| display: flex; |
| flex-direction: column; |
| align-items: center; |
| justify-content: center; |
| height: 100%; |
| color: var(--text-light); |
| text-align: center; |
| } |
| |
| .empty-state i { |
| font-size: 4rem; |
| margin-bottom: 1.5rem; |
| color: #DEE2E6; |
| } |
| |
| .empty-state h2 { |
| font-size: 1.5rem; |
| color: var(--text-main); |
| margin-bottom: 0.5rem; |
| } |
| |
| |
| .content-header { |
| margin-bottom: 2rem; |
| } |
| |
| .breadcrumb { |
| font-size: 0.85rem; |
| color: var(--text-light); |
| margin-bottom: 0.5rem; |
| } |
| |
| .content-title { |
| font-size: 2rem; |
| font-weight: 700; |
| color: var(--text-main); |
| } |
| |
| .chapters-grid { |
| display: grid; |
| grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); |
| gap: 1.5rem; |
| } |
| |
| .chapter-card { |
| background: var(--bg-white); |
| border: 1px solid var(--border-color); |
| border-radius: 12px; |
| padding: 1.5rem; |
| cursor: pointer; |
| transition: var(--transition); |
| display: flex; |
| flex-direction: column; |
| height: 100%; |
| } |
| |
| .chapter-card:hover { |
| transform: translateY(-4px); |
| box-shadow: var(--shadow-md); |
| border-color: var(--primary-color); |
| } |
| |
| .chapter-meta { |
| font-size: 0.8rem; |
| text-transform: uppercase; |
| letter-spacing: 0.5px; |
| color: var(--secondary-color); |
| font-weight: 600; |
| margin-bottom: 0.75rem; |
| } |
| |
| .chapter-title { |
| font-size: 1.1rem; |
| font-weight: 600; |
| margin-bottom: 0.75rem; |
| line-height: 1.4; |
| } |
| |
| .chapter-desc { |
| font-size: 0.9rem; |
| color: var(--text-light); |
| line-height: 1.5; |
| margin-bottom: 1.5rem; |
| flex-grow: 1; |
| } |
| |
| .chapter-footer { |
| display: flex; |
| align-items: center; |
| justify-content: space-between; |
| font-size: 0.85rem; |
| color: var(--primary-color); |
| font-weight: 500; |
| } |
| |
| |
| .lesson-view { |
| background: var(--bg-white); |
| border-radius: 12px; |
| padding: 3rem; |
| box-shadow: var(--shadow-sm); |
| max-width: 900px; |
| margin: 0 auto; |
| animation: fadeIn 0.4s ease; |
| } |
| |
| .lesson-header { |
| border-bottom: 1px solid var(--border-color); |
| padding-bottom: 2rem; |
| margin-bottom: 2rem; |
| } |
| |
| .lesson-title { |
| font-size: 2.25rem; |
| font-weight: 800; |
| color: var(--text-main); |
| margin-bottom: 1rem; |
| } |
| |
| .lesson-tags { |
| display: flex; |
| gap: 10px; |
| } |
| |
| .tag { |
| padding: 4px 12px; |
| background-color: var(--bg-light); |
| border-radius: 20px; |
| font-size: 0.8rem; |
| color: var(--text-light); |
| font-weight: 500; |
| } |
| |
| .lesson-content { |
| font-size: 1.1rem; |
| line-height: 1.8; |
| color: #374151; |
| } |
| |
| .lesson-content h3 { |
| font-size: 1.5rem; |
| color: var(--text-main); |
| margin-top: 2.5rem; |
| margin-bottom: 1rem; |
| } |
| |
| .lesson-content p { |
| margin-bottom: 1.5rem; |
| } |
| |
| .lesson-content ul { |
| margin-bottom: 1.5rem; |
| padding-left: 1.5rem; |
| } |
| |
| .lesson-content li { |
| margin-bottom: 0.5rem; |
| } |
| |
| .lesson-content blockquote { |
| border-left: 4px solid var(--secondary-color); |
| padding-left: 1.5rem; |
| font-style: italic; |
| color: #555; |
| background: #FFF8F0; |
| padding: 1.5rem; |
| border-radius: 0 8px 8px 0; |
| margin: 2rem 0; |
| } |
| |
| .back-btn { |
| display: inline-flex; |
| align-items: center; |
| gap: 8px; |
| padding: 10px 20px; |
| background-color: var(--bg-light); |
| border: 1px solid var(--border-color); |
| border-radius: 8px; |
| color: var(--text-main); |
| font-weight: 500; |
| cursor: pointer; |
| transition: var(--transition); |
| margin-bottom: 2rem; |
| } |
| |
| .back-btn:hover { |
| background-color: #E9ECEF; |
| } |
| |
| |
| @media (max-width: 768px) { |
| header { |
| padding: 0 1rem; |
| } |
| |
| .mobile-menu-btn { |
| display: block; |
| } |
| |
| aside { |
| position: fixed; |
| left: 0; |
| top: var(--header-height); |
| height: calc(100vh - var(--header-height)); |
| transform: translateX(-100%); |
| z-index: 90; |
| box-shadow: var(--shadow-md); |
| } |
| |
| aside.open { |
| transform: translateX(0); |
| } |
| |
| main { |
| padding: 1.5rem; |
| } |
| |
| .lesson-view { |
| padding: 1.5rem; |
| } |
| |
| .lesson-title { |
| font-size: 1.75rem; |
| } |
| |
| .content-title { |
| font-size: 1.5rem; |
| } |
| } |
| |
| @keyframes fadeIn { |
| from { opacity: 0; transform: translateY(10px); } |
| to { opacity: 1; transform: translateY(0); } |
| } |
| |
| |
| .app-footer { |
| margin-top: auto; |
| padding-top: 3rem; |
| text-align: center; |
| font-size: 0.85rem; |
| color: var(--text-light); |
| border-top: 1px solid var(--border-color); |
| } |
| </style> |
| </head> |
| <body> |
|
|
| |
| <header> |
| <div class="brand"> |
| <button class="mobile-menu-btn" id="menuToggle" aria-label="Menu"> |
| <i class="fa-solid fa-bars"></i> |
| </button> |
| <i class="fa-solid fa-graduation-cap"></i> |
| <span>Première D CI</span> |
| </div> |
| <div class="header-actions"> |
| <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" class="anycoder-link"> |
| Built with anycoder |
| </a> |
| <div style="width: 35px; height: 35px; background: #e0e0e0; border-radius: 50%; overflow: hidden;"> |
| <img src="https://picsum.photos/seed/student/100/100" alt="Avatar" style="width: 100%; height: 100%; object-fit: cover;"> |
| </div> |
| </div> |
| </header> |
|
|
| |
| <div class="app-container"> |
| |
| |
| <aside id="sidebar"> |
| <div class="search-container"> |
| <div class="search-box"> |
| <i class="fa-solid fa-search"></i> |
| <input type="text" id="searchInput" placeholder="Rechercher un cours..."> |
| </div> |
| </div> |
| <ul class="subject-list" id="subjectList"> |
| |
| </ul> |
| </aside> |
|
|
| |
| <main id="mainContent"> |
| |
| </main> |
|
|
| </div> |
|
|
| <script> |
| // --- DONNÉES PÉDAGOGIQUES (Simulation du programme 1ère D CI) --- |
| const curriculumData = { |
| mathematiques: { |
| title: "Mathématiques", |
| icon: "fa-calculator", |
| color: "#e74c3c", |
| chapters: [ |
| { |
| id: "m1", |
| title: "Généralités sur les suites numériques", |
| desc: "Définitions, suites arithmétiques et géométriques, sens de variation.", |
| content: ` |
| <h2>1. Définition d'une suite</h2> |
| <p>Une suite numérique est une fonction définie sur l'ensemble des entiers naturels <strong>N</strong> (ou une partie de N) à valeurs dans <strong>R</strong>.</p> |
| <p>On note généralement <em>(u<sub>n</sub>)</em> ou <em>u<sub>n</sub></em> le terme de rang <em>n</em>.</p> |
| |
| <h2>2. Modes de génération d'une suite</h2> |
| <ul> |
| <li><strong>Par formule explicite :</strong> u<sub>n</sub> = f(n). Exemple : u<sub>n</sub> = 2n + 1.</li> |
| <li><strong>Par récurrence :</strong> u<sub>n+1</sub> = f(u<sub>n</sub>). Exemple : u<sub>0</sub> = 1 et u<sub>n+1</sub> = 2u<sub>n</sub> + 3.</li> |
| </ul> |
| |
| <h2>3. Suites arithmétiques</h2> |
| <p>Une suite (u<sub>n</sub>) est arithmétique s'il existe un réel <strong>r</strong> (raison) tel que pour tout n, u<sub>n+1</sub> = u<sub>n</sub> + r.</p> |
| <blockquote>Propriété : Pour tout n, u<sub>n</sub> = u<sub>0</sub> + nr. La somme des n premiers termes est S<sub>n</sub> = n(u<sub>0</sub> + u<sub>n-1</sub>)/2.</blockquote> |
| |
| <h2>4. Suites géométriques</h2> |
| <p>Une suite (u<sub>n</sub>) est géométrique s'il existe un réel <strong>q</strong> (raison) tel que pour tout n, u<sub>n+1</sub> = q × u<sub>n</sub>.</p> |
| ` |
| }, |
| { |
| id: "m2", |
| title: "Étude de fonctions", |
| desc: "Limites, continuité, dérivabilité et variations des fonctions usuelles.", |
| content: ` |
| <h2>1. Limites de fonctions</h2> |
| <p>Soit f une fonction définie sur un intervalle contenant a ou admettant a comme borne.</p> |
| <p>On dit que f admet une limite finie L en a si tout intervalle ouvert contenant L contient toutes les valeurs f(x) pour x assez proche de a.</p> |
| |
| <h2>2. Continuité</h2> |
| <p>Une fonction f est continue en un point a si elle admet une limite finie en a et que cette limite est égale à f(a).</p> |
| <p><strong>Théorème des valeurs intermédiaires :</strong> Si f est continue sur [a; b], alors pour tout réel k compris entre f(a) et f(b), il existe au moins un réel c dans [a; b] tel que f(c) = k.</p> |
| |
| <h2>3. Dérivabilité</h2> |
| <p>Le nombre dérivé de f en a, noté f'(a), est le coefficient directeur de la tangente à la courbe au point d'abscisse a.</p> |
| ` |
| }, |
| { |
| id: "m3", |
| title: "Géométrie dans l'espace", |
| desc: "Positions relatives de droites et plans, vecteurs de l'espace, produit scalaire.", |
| content: ` |
| <h2>1. Positions relatives</h2> |
| <ul> |
| <li>Droites : Parallèles, sécantes ou non coplanaires.</li> |
| <li>Plans : Parallèles ou sécants (l'intersection est une droite).</li> |
| </ul> |
| <h2>2. Vecteurs de l'espace</h2> |
| <p>Les opérations sur les vecteurs du plan s'étendent à l'espace. Repère (O, i, j, k).</p> |
| ` |
| } |
| ] |
| }, |
| physique_chimie: { |
| title: "Physique-Chimie", |
| icon: "fa-flask", |
| color: "#2ecc71", |
| chapters: [ |
| { |
| id: "pc1", |
| title: "Chimie organique : Extraction", |
| desc: "Principes de l'extraction, hydrodistillation et chromatographie.", |
| content: ` |
| <h2>1. Les techniques d'extraction</h2> |
| <p>L'extraction consiste à séparer une substance (通常 un composé organique) d'un mélange (milieu biologique ou synthétique) en utilisant un solvant approprié.</p> |
| <p><strong>Choix du solvant :</strong> Il doit être non miscible avec le milieu initial, dissoudre efficacement la substance recherchée et être le moins toxique possible.</p> |
| |
| <h2>2. L'hydrodistillation</h2> |
| <p>Technique utilisée pour extraire les huiles essentielles de végétaux. Le mélange (eau et plante) est porté à ébullition. La vapeur d'eau entraîne les huiles, puis est refroidie dans un réfrigérant.</p> |
| ` |
| }, |
| { |
| id: "pc2", |
| title: "Électricité : Dipôle RC", |
| desc: "Charge et décharge d'un condensateur, énergie emmagasinée.", |
| content: ` |
| <h2>1. Le condensateur</h2> |
| <p>Un condensateur est constitué de deux armatures conductrices séparées par un isolant (diélectrique). Il est caractérisé par sa capacité C en Farads (F).</p> |
| |
| <h2>2. Charge d'un condensateur</h2> |
| <p>On soumet le dipôle RC à un échelon de tension E. La tension aux bornes du condensateur u<sub>c</sub> augmente progressivement selon la loi :</p> |
| <p style="text-align:center; font-family:serif; font-size:1.2em;">u<sub>c</sub>(t) = E(1 - e<sup>-t/τ</sup>)</p> |
| <p>Où τ = RC est la constante de temps du dipôle.</p> |
| ` |
| } |
| ] |
| }, |
| svt: { |
| title: "SVT", |
| icon: "fa-dna", |
| color: "#9b59b6", |
| chapters: [ |
| { |
| id: "svt1", |
| title: "La digestion chez l'homme", |
| desc: "Les enzymes digestives, l'absorption intestinale et l'assimilation.", |
| content: ` |
| <h2>1. Transformation des aliments</h2> |
| <p>La digestion est un processus mécanique et chimique. Les enzymes (protéines) catalysent l'hydrolyse des polymères alimentaires en monomères assimilables.</p> |
| <ul> |
| <li>Glucides → Oses (ex: Amidon → Glucose)</li> |
| <li>Protéines → Acides aminés</li> |
| <li>Lipides → Acides gras et Glycérol</li> |
| </ul> |
| <h2>2. Absorption intestinale</h2> |
| <p>Les nutriments passent de la lumière intestinale vers le sang (glucides, acides aminés) ou la lymphe (lipides) au niveau des villosités intestinales.</p> |
| ` |
| }, |
| { |
| id: "svt2", |
| title: "La transmission de la vie chez l'homme", |
| desc: "Le fonctionnement des appareils reproducteurs et le contrôle hormonal.", |
| content: ` |
| <h2>1. L'appareil reproducteur masculin</h2> |
| <p>Les testicules produisent les spermatozoïdes et la testostérone. L'éjaculation libère des millions de spermatozoïdes.</p> |
| |
| <h2>2. L'appareil reproducteur féminin</h2> |
| <p>Les ovaires produisent les ovules et les œstrogènes/progestérone. Le cycle utérin dure environ 28 jours.</p> |
| |
| <h2>3. La fécondation</h2> |
| <p>Rencontre de l'ovule et du spermatozoïde dans la trompe (ampoule tubaire), aboutissant à la formation d'un œuf diploïde.</p> |
| ` |
| } |
| ] |
| }, |
| francais: { |
| title: "Français", |
| icon: "fa-book-open", |
| color: "#f39c12", |
| chapters: [ |
| { |
| id: "fr1", |
| title: "L'argumentation", |
| desc: "Convaincre, persuader et délibérer. Analyse d'essais et discours.", |
| content: ` |
| <h2>1. Les buts de l'argumentation</h2> |
| <ul> |
| <li><strong>Convaincre :</strong> Faire appel à la raison (logos), utilisant des arguments rationnels.</li> |
| <li><strong>Persuader :</strong> Faire appel aux sentiments (pathos), cherchant à toucher l'émotion.</li> |
| <li><strong>Délibérer :</strong> Peser le pour et le contre pour prendre une décision.</li> |
| </ul> |
| <h2>2. Les types d'arguments</h2> |
| <p>On distingue l'argument d'autorité, l'argument par l'exemple, l'ad hominem, le causal, etc.</p> |
| ` |
| }, |
| { |
| id: "fr2", |
| title: "Le théâtre", |
| desc: "Le texte théâtral, la double énonciation et la représentation.", |
| content: ` |
| <h2>1. Spécificités du texte de théâtre</h2> |
| <p>Le texte théâtral est destiné à être joué. Il comprend des didascalies (indications scéniques) et des répliques.</p> |
| <h2>2. La double énonciation</h2> |
| <p>Le personnage s'adresse à un autre personnage, mais le spectateur reçoit aussi le message, souvent avec une compréhension différente (ironie, double sens).</p> |
| ` |
| } |
| ] |
| }, |
| histoire_geo: { |
| title: "Histoire-Géo", |
| icon: "fa-globe-africa", |
| color: "#34495e", |
| chapters: [ |
| { |
| id: "hg1", |
| title: "La Première Guerre Mondiale", |
| desc: "Les causes, les grandes phases et les conséquences du conflit.", |
| content: ` |
| <h2>1. Les causes de la guerre</h2> |
| <p>Un système d'alliances (Triple-Entente vs Triple-Alliance), les rivalités coloniales et nationalistes, ainsi que l'assassinat de l'archiduc François-Ferdinand à Sarajevo en 1914.</p> |
| <h2>2. Une guerre totale</h2> |
| <p>Mobilisation de toutes les ressources : économie de guerre, propagande, et implication des civils.</p> |
| ` |
| }, |
| { |
| id: "hg2", |
| title: "L'Afrique : défis et développement", |
| desc: "Démographie, urbanisation et enjeux économiques du continent africain.", |
| content: ` |
| <h2>1. La transition démographique</h2> |
| <p>L'Afrique connaît une forte croissance démographique, entraînant une population très jeune.</p> |
| <h2>2. L'urbanisation rapide</h2> |
| <p>Les villes africaines grossissent vite, posant des défis d'infrastructures (eau, électricité) mais offrant des opportunités économiques.</p> |
| ` |
| } |
| ] |
| }, |
| philosophie: { |
| title: "Philosophie", |
| icon: "fa-lightbulb", |
| color: "#d35400", |
| chapters: [ |
| { |
| id: "ph1", |
| title: "La conscience", |
| desc: "La conscience de soi, l'inconscient et l'identité personnelle.", |
| content: ` |
| <h2>1. Qu'est-ce que la conscience ?</h2> |
| <p>La conscience est la présence immédiate de l'esprit à lui-même. C'est le savoir réflexif que l'homme a de ses pensées et de ses actes.</p> |
| <h2>2. Conscience et Inconscient</h2> |
| <p>Freud a montré que la conscience n'est pas la totalité de la vie psychique. L'inconscient (pulsions, refoulements) influence nos comportements à notre insu.</p> |
| ` |
| } |
| ] |
| }, |
| anglais: { |
| title: "Anglais", |
| icon: "fa-language", |
| color: "#16a085", |
| chapters: [ |
| { |
| id: "en1", |
| title: "Communication Skills", |
| desc: "Expressing opinions, agreeing and disagreeing in debates.", |
| content: ` |
| <h2>1. Useful phrases for opinions</h2> |
| <ul> |
| <li>"In my opinion..."</li> |
| <li>"I strongly believe that..."</li> |
| <li>"From my point of view..."</li> |
| </ul> |
| <h2>2. Agreeing and Disagreeing</h2> |
| <p>"I couldn't agree more" (strong agreement).<br>"I see your point, but..." (polite disagreement).</p> |
| ` |
| } |
| ] |
| } |
| }; |
| |
| // --- ÉLÉMENTS DU DOM --- |
| const subjectListEl = document.getElementById('subjectList'); |
| const mainContentEl = document.getElementById('mainContent'); |
| const searchInput = document.getElementById('searchInput'); |
| const menuToggle = document.getElementById('menuToggle'); |
| const sidebar = document.getElementById('sidebar'); |
| |
| // --- ÉTAT DE L'APPLICATION --- |
| let currentSubject = null; |
| |
| // --- FONCTIONS --- |
| |
| // 1. Initialisation |
| function init() { |
| renderSubjects(); |
| renderEmptyState(); |
| |
| // Event Listeners |
| searchInput.addEventListener('input', handleSearch); |
| menuToggle.addEventListener('click', () => { |
| sidebar.classList.toggle('open'); |
| }); |
| |
| // Fermer la sidebar si on clique en dehors sur mobile |
| mainContentEl.addEventListener('click', () => { |
| if(window.innerWidth <= 768) { |
| sidebar.classList.remove('open'); |
| } |
| }); |
| } |
| |
| // 2. Rendu de la liste des matières |
| function renderSubjects(filter = "") { |
| subjectListEl.innerHTML = ""; |
| |
| Object.keys(curriculumData).forEach(key => { |
| const subject = curriculumData[key]; |
| |
| // Filtrage par recherche |
| if (filter && !subject.title.toLowerCase().includes(filter.toLowerCase())) { |
| return; |
| } |
| |
| const li = document.createElement('li'); |
| li.className = 'subject-item'; |
| |
| const btn = document.createElement('button'); |
| btn.className = `subject-btn ${currentSubject === key ? 'active' : ''}`; |
| btn.onclick = () => selectSubject(key); |
| |
| btn.innerHTML = ` |
| <div class="subject-icon" style="color: ${currentSubject === key ? 'white' : subject.color}"> |
| <i class="fa-solid ${subject.icon}"></i> |
| </div> |
| <span>${subject.title}</span> |
| `; |
| |
| li.appendChild(btn); |
| subjectListEl.appendChild(li); |
| }); |
| } |
| |
| // 3. Sélection d'une matière |
| function selectSubject(subjectKey) { |
| currentSubject = subjectKey; |
| renderSubjects(searchInput.value); // Re-render pour mettre à jour la classe active |
| renderChapterList(subjectKey); |
| |
| // Sur mobile, fermer le menu après sélection |
| if(window.innerWidth <= 768) { |
| sidebar.classList.remove('open'); |
| } |
| } |
| |
| // 4. Rendu de la liste des chapitres (Vue principale) |
| function renderChapterList(subjectKey) { |
| const subject = curriculumData[subjectKey]; |
| const chapters = subject.chapters; |
| |
| let html = ` |
| <div class="content-header"> |
| <div class="breadcrumb">Accueil > ${subject.title}</div> |
| <h1 class="content-title">${subject.title}</h1> |
| </div> |
| <div class="chapters-grid"> |
| `; |
| |
| chapters.forEach(chapter => { |
| html += ` |
| <div class="chapter-card" onclick="renderLesson('${subjectKey}', '${chapter.id}')"> |
| <div class="chapter-meta">Chapitre ${chapter.id.replace(/\D/g, '')}</div> |
| <h3 class="chapter-title">${chapter.title}</h3> |
| <p class="chapter-desc">${chapter.desc}</p> |
| <div class="chapter-footer"> |
| <span>Voir le cours</span> |
| <i class="fa-solid fa-arrow-right"></i> |
| </div> |
| </div> |
| `; |
| }); |
| |
| html += `</div>`; |
| mainContentEl.innerHTML = html; |
| } |
| |
| // 5. Rendu du détail d'une leçon |
| window.renderLesson = function(subjectKey, chapterId) { |
| const subject = curriculumData[subjectKey]; |
| const chapter = subject.chapters.find(c => c.id === chapterId); |
| |
| if (!chapter) return; |
| |
| const html = ` |
| <button class="back-btn" onclick="selectSubject('${subjectKey}')"> |
| <i class="fa-solid fa-arrow-left"></i> Retour aux chapitres |
| </button> |
| <div class="lesson-view"> |
| <div class="lesson-header"> |
| <div class="lesson-tags"> |
| <span class="tag">${subject.title}</span> |
| <span class="tag">1ère D</span> |
| </div> |
| <h1 class="lesson-title">${chapter.title}</h1> |
| </div> |
| <div class="lesson-content"> |
| ${chapter.content} |
| </div> |
| </div> |
| <div class="app-footer"> |
| <p>© 2023-2024 Cours Première D Côte d'Ivoire</p> |
| </div> |
| `; |
| |
| mainContentEl.innerHTML = html; |
| // Scroll to top |
| mainContentEl.scrollTop = 0; |
| }; |
| |
| // 6. État vide |
| function renderEmptyState() { |
| mainContentEl.innerHTML = ` |
| <div class="empty-state"> |
| <i class="fa-solid fa-book-open-reader"></i> |
| <h2>Bienvenue sur votre plateforme de cours</h2> |
| <p>Sélectionnez une matière dans le menu latéral pour accéder aux chapitres complets de la classe de Première D.</p> |
| <p style="margin-top: 10px; font-size: 0.9rem;">Programme officiel - Côte d'Ivoire</p> |
| </div> |
| `; |
| } |
| |
| // 7. Gestion de la recherche |
| function handleSearch(e) { |
| const term = e.target.value; |
| renderSubjects(term); |
| } |
| |
| // Lancer l'application |
| init(); |
| |
| </script> |
| </body> |
| </html> |