philpelerin commited on
Commit
ac459f7
·
verified ·
1 Parent(s): 8c7fda5

Structure du Cahier des Charges

Browse files

1. Contexte et Objectifs

Public cible : Jeunes en insertion (18-25 ans), habitués aux smartphones.
Objectif principal : Permettre une révision autonome du code de la route, avec un suivi des progrès et un mode "examen blanc".
Problématique : Manque d’outils adaptés, accessibles et motivants pour ce public.

2. Fonctionnalités Clés
Fonctionnalités Indispensables




Fonctionnalité
Description
Exemple/Précision




QCM interactifs
Questions à choix multiples avec corrections détaillées (explications des réponses).
Source : Base officielle ANTS (Agence Nationale des Titres Sécurisés).


Suivi des progrès
Historique des scores, temps passé par thème, identification des points faibles.
Visualisation sous forme de graphiques ou tableaux.


Mode "examen blanc"
Simulation d’examen officiel (40 questions, 35 bonnes réponses requises, chronométré).
Respect des règles officielles (durée, notation).


Accessibilité
Interface simple, compatible smartphones, pas d’identification requise.
Pas de création de compte, accès direct.




Fonctionnalités Optionnelles (à discuter)

Multilingue : Traduction des questions en langues régionales (occitan, etc.).
Gamification : Badges ou récompenses pour motiver les utilisateurs.
Mode hors ligne : Téléchargement des QCM pour réviser sans connexion.

3. Contenu et Ressources

Source des questions : Exclusivement les bases officielles (ANTS, code de la route 2025).
Mises à jour :

Fréquence : Trimestrielle (pour suivre les changements réglementaires).
Responsable : À définir (partenaire, administrateur local).


4. Technologies et Contraintes




Élément
Détail




Hébergement
Local (sur serveur dédié ou machine en atelier).


Compatibilité
Navigateurs mobiles (Chrome, Safari) et desktop (Firefox, Edge).


Sécurité
Pas de collecte de données personnelles (RGPD).


Technologies
Framework front-end : React ou Vue.js (pour une interface dynamique).


Budget
À préciser : développement interne ou prestataire externe ?

Files changed (6) hide show
  1. README.md +8 -5
  2. components/footer.js +71 -0
  3. components/navbar.js +62 -0
  4. index.html +94 -19
  5. script.js +31 -0
  6. style.css +30 -18
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Roadmaster Rev
3
- emoji: 😻
4
- colorFrom: red
5
- colorTo: indigo
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
1
  ---
2
+ title: RoadMaster Rev 🚗💨
3
+ colorFrom: gray
4
+ colorTo: blue
5
+ emoji: 🐳
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite-v3
10
  ---
11
 
12
+ # Welcome to your new DeepSite project!
13
+ This project was created with [DeepSite](https://huggingface.co/deepsite).
components/footer.js ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class CustomFooter extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ footer {
7
+ background: #1f2937;
8
+ color: white;
9
+ }
10
+ .footer-link {
11
+ transition: color 0.3s ease;
12
+ }
13
+ .footer-link:hover {
14
+ color: #3b82f6;
15
+ }
16
+ .social-icon {
17
+ transition: all 0.3s ease;
18
+ }
19
+ .social-icon:hover {
20
+ transform: translateY(-3px);
21
+ }
22
+ </style>
23
+ <footer class="py-12">
24
+ <div class="container mx-auto px-4">
25
+ <div class="grid grid-cols-1 md:grid-cols-4 gap-8">
26
+ <div>
27
+ <h3 class="text-lg font-semibold mb-4">RoadMaster Rev</h3>
28
+ <p class="text-gray-300">L'application ultime pour réviser et réussir votre code de la route.</p>
29
+ </div>
30
+ <div>
31
+ <h3 class="text-lg font-semibold mb-4">Navigation</h3>
32
+ <ul class="space-y-2">
33
+ <li><a href="index.html" class="footer-link text-gray-300">Accueil</a></li>
34
+ <li><a href="quizz.html" class="footer-link text-gray-300">QCM</a></li>
35
+ <li><a href="exam.html" class="footer-link text-gray-300">Examen Blanc</a></li>
36
+ <li><a href="progress.html" class="footer-link text-gray-300">Progression</a></li>
37
+ </ul>
38
+ </div>
39
+ <div>
40
+ <h3 class="text-lg font-semibold mb-4">Ressources</h3>
41
+ <ul class="space-y-2">
42
+ <li><a href="#" class="footer-link text-gray-300">FAQ</a></li>
43
+ <li><a href="#" class="footer-link text-gray-300">Mentions légales</a></li>
44
+ <li><a href="#" class="footer-link text-gray-300">Confidentialité</a></li>
45
+ </ul>
46
+ </div>
47
+ <div>
48
+ <h3 class="text-lg font-semibold mb-4">Nous suivre</h3>
49
+ <div class="flex space-x-4">
50
+ <a href="#" class="social-icon text-gray-300 hover:text-white">
51
+ <i data-feather="facebook"></i>
52
+ </a>
53
+ <a href="#" class="social-icon text-gray-300 hover:text-white">
54
+ <i data-feather="twitter"></i>
55
+ </a>
56
+ <a href="#" class="social-icon text-gray-300 hover:text-white">
57
+ <i data-feather="instagram"></i>
58
+ </a>
59
+ </div>
60
+ </div>
61
+ </div>
62
+ <div class="border-t border-gray-700 mt-8 pt-8 text-center text-gray-400">
63
+ <p>&copy; 2023 RoadMaster Rev. Tous droits réservés.</p>
64
+ </div>
65
+ </div>
66
+ </footer>
67
+ `;
68
+ }
69
+ }
70
+
71
+ customElements.define('custom-footer', CustomFooter);
components/navbar.js ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class CustomNavbar extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ nav {
7
+ background: white;
8
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
9
+ }
10
+ .nav-container {
11
+ max-width: 1200px;
12
+ }
13
+ .nav-link {
14
+ transition: color 0.3s ease;
15
+ }
16
+ .nav-link:hover {
17
+ color: #3b82f6;
18
+ }
19
+ .mobile-menu {
20
+ transition: all 0.3s ease;
21
+ }
22
+ </style>
23
+ <nav class="py-4">
24
+ <div class="nav-container mx-auto px-4 flex justify-between items-center">
25
+ <a href="index.html" class="flex items-center">
26
+ <div class="bg-primary text-white p-2 rounded-lg mr-3">
27
+ <i data-feather="car"></i>
28
+ </div>
29
+ <span class="text-xl font-bold text-gray-800">RoadMaster Rev</span>
30
+ </a>
31
+
32
+ <div class="hidden md:flex items-center space-x-8">
33
+ <a href="index.html" class="nav-link text-gray-700 font-medium">Accueil</a>
34
+ <a href="quizz.html" class="nav-link text-gray-700 font-medium">QCM</a>
35
+ <a href="exam.html" class="nav-link text-gray-700 font-medium">Examen Blanc</a>
36
+ <a href="progress.html" class="nav-link text-gray-700 font-medium">Progression</a>
37
+ </div>
38
+
39
+ <button id="mobile-menu-button" class="md:hidden text-gray-700">
40
+ <i data-feather="menu"></i>
41
+ </button>
42
+ </div>
43
+
44
+ <!-- Mobile menu -->
45
+ <div id="mobile-menu" class="mobile-menu hidden md:hidden px-4 pt-2 pb-4">
46
+ <a href="index.html" class="block py-2 text-gray-700">Accueil</a>
47
+ <a href="quizz.html" class="block py-2 text-gray-700">QCM</a>
48
+ <a href="exam.html" class="block py-2 text-gray-700">Examen Blanc</a>
49
+ <a href="progress.html" class="block py-2 text-gray-700">Progression</a>
50
+ </div>
51
+ </nav>
52
+ `;
53
+
54
+ // Add mobile menu toggle functionality
55
+ this.shadowRoot.getElementById('mobile-menu-button').addEventListener('click', () => {
56
+ const menu = this.shadowRoot.getElementById('mobile-menu');
57
+ menu.classList.toggle('hidden');
58
+ });
59
+ }
60
+ }
61
+
62
+ customElements.define('custom-navbar', CustomNavbar);
index.html CHANGED
@@ -1,19 +1,94 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>RoadMaster Rev - Révision Code de la Route</title>
7
+ <link rel="stylesheet" href="style.css">
8
+ <script src="https://cdn.tailwindcss.com"></script>
9
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
10
+ <script src="https://unpkg.com/feather-icons"></script>
11
+ <script>
12
+ tailwind.config = {
13
+ theme: {
14
+ extend: {
15
+ colors: {
16
+ primary: '#3b82f6',
17
+ secondary: '#10b981'
18
+ }
19
+ }
20
+ }
21
+ }
22
+ </script>
23
+ </head>
24
+ <body class="bg-gray-50">
25
+ <custom-navbar></custom-navbar>
26
+
27
+ <main class="container mx-auto px-4 py-8">
28
+ <section class="hero bg-gradient-to-r from-primary to-secondary rounded-xl p-8 text-white mb-12">
29
+ <div class="max-w-2xl mx-auto text-center">
30
+ <h1 class="text-4xl font-bold mb-4">Maîtrisez le Code de la Route</h1>
31
+ <p class="text-xl mb-6">La méthode simple et efficace pour réussir votre examen</p>
32
+ <div class="flex flex-col sm:flex-row gap-4 justify-center">
33
+ <a href="quizz.html" class="bg-white text-primary px-6 py-3 rounded-lg font-medium hover:bg-gray-100 transition duration-200">Commencer les QCM</a>
34
+ <a href="exam.html" class="bg-white bg-opacity-20 px-6 py-3 rounded-lg font-medium hover:bg-opacity-30 transition duration-200">Mode Examen Blanc</a>
35
+ </div>
36
+ </div>
37
+ </section>
38
+
39
+ <section class="features grid grid-cols-1 md:grid-cols-3 gap-8 mb-16">
40
+ <div class="feature-card bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition duration-200">
41
+ <div class="icon bg-primary bg-opacity-10 text-primary p-3 rounded-full w-12 h-12 flex items-center justify-center mb-4">
42
+ <i data-feather="book"></i>
43
+ </div>
44
+ <h3 class="text-xl font-semibold mb-2">QCM Interactifs</h3>
45
+ <p class="text-gray-600">Répondez aux questions officielles avec corrections détaillées et explications.</p>
46
+ </div>
47
+ <div class="feature-card bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition duration-200">
48
+ <div class="icon bg-secondary bg-opacity-10 text-secondary p-3 rounded-full w-12 h-12 flex items-center justify-center mb-4">
49
+ <i data-feather="bar-chart-2"></i>
50
+ </div>
51
+ <h3 class="text-xl font-semibold mb-2">Suivi des Progrès</h3>
52
+ <p class="text-gray-600">Visualisez vos scores et identifiez vos points faibles pour progresser efficacement.</p>
53
+ </div>
54
+ <div class="feature-card bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition duration-200">
55
+ <div class="icon bg-primary bg-opacity-10 text-primary p-3 rounded-full w-12 h-12 flex items-center justify-center mb-4">
56
+ <i data-feather="clock"></i>
57
+ </div>
58
+ <h3 class="text-xl font-semibold mb-2">Examen Blanc</h3>
59
+ <p class="text-gray-600">Entraînez-vous en conditions réelles avec le mode examen chronométré.</p>
60
+ </div>
61
+ </section>
62
+
63
+ <section class="stats bg-white p-8 rounded-xl shadow-md mb-16">
64
+ <h2 class="text-2xl font-bold mb-6 text-center">Nos Chiffres</h2>
65
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-6 text-center">
66
+ <div>
67
+ <div class="text-4xl font-bold text-primary mb-2">500+</div>
68
+ <div class="text-gray-600">Questions officielles</div>
69
+ </div>
70
+ <div>
71
+ <div class="text-4xl font-bold text-secondary mb-2">95%</div>
72
+ <div class="text-gray-600">Taux de réussite</div>
73
+ </div>
74
+ <div>
75
+ <div class="text-4xl font-bold text-primary mb-2">10k</div>
76
+ <div class="text-gray-600">Utilisateurs satisfaits</div>
77
+ </div>
78
+ <div>
79
+ <div class="text-4xl font-bold text-secondary mb-2">24/7</div>
80
+ <div class="text-gray-600">Accessible à tout moment</div>
81
+ </div>
82
+ </div>
83
+ </section>
84
+ </main>
85
+
86
+ <custom-footer></custom-footer>
87
+
88
+ <script src="components/navbar.js"></script>
89
+ <script src="components/footer.js"></script>
90
+ <script src="script.js"></script>
91
+ <script>feather.replace();</script>
92
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
93
+ </body>
94
+ </html>
script.js ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Global functions and event listeners
2
+ document.addEventListener('DOMContentLoaded', () => {
3
+ // Initialize tooltips
4
+ const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
5
+ tooltipTriggerList.map(function (tooltipTriggerEl) {
6
+ return new bootstrap.Tooltip(tooltipTriggerEl);
7
+ });
8
+
9
+ // Track user progress (mock function)
10
+ if (localStorage.getItem('userProgress')) {
11
+ const progress = JSON.parse(localStorage.getItem('userProgress'));
12
+ console.log('User progress loaded:', progress);
13
+ } else {
14
+ localStorage.setItem('userProgress', JSON.stringify({
15
+ scores: [],
16
+ weakTopics: [],
17
+ lastSession: null
18
+ }));
19
+ }
20
+ });
21
+
22
+ // Shared utility functions
23
+ function formatTime(seconds) {
24
+ const mins = Math.floor(seconds / 60);
25
+ const secs = seconds % 60;
26
+ return `${mins}:${secs < 10 ? '0' : ''}${secs}`;
27
+ }
28
+
29
+ function calculatePercentage(score, total) {
30
+ return Math.round((score / total) * 100);
31
+ }
style.css CHANGED
@@ -1,28 +1,40 @@
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
4
  }
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
28
  }
 
 
 
 
 
 
 
 
 
 
 
1
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
2
+
3
  body {
4
+ font-family: 'Inter', sans-serif;
5
+ min-height: 100vh;
6
+ display: flex;
7
+ flex-direction: column;
8
+ }
9
+
10
+ .hero {
11
+ background-size: cover;
12
+ background-position: center;
13
  }
14
 
15
+ .feature-card {
16
+ transition: all 0.3s ease;
 
17
  }
18
 
19
+ .feature-card:hover {
20
+ transform: translateY(-5px);
 
 
 
21
  }
22
 
23
+ .icon i {
24
+ width: 24px;
25
+ height: 24px;
 
 
 
26
  }
27
 
28
+ main {
29
+ flex: 1;
30
  }
31
+
32
+ /* Animation for buttons */
33
+ .btn-animate:hover {
34
+ transform: translateY(-2px);
35
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
36
+ }
37
+
38
+ .btn-animate {
39
+ transition: all 0.3s ease;
40
+ }