diff --git a/frontend/index.html b/frontend/index.html
index f7b6838..3eeb9c7 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -5,8 +5,8 @@
-
-
+
+
Professeur virtuel
diff --git a/frontend/public/icons/professeur-top-192.png b/frontend/public/icons/professeur-top-192.png
deleted file mode 100644
index d75cd46..0000000
Binary files a/frontend/public/icons/professeur-top-192.png and /dev/null differ
diff --git a/frontend/public/icons/professeur-top-512.png b/frontend/public/icons/professeur-top-512.png
deleted file mode 100644
index 384ce8c..0000000
Binary files a/frontend/public/icons/professeur-top-512.png and /dev/null differ
diff --git a/frontend/public/icons/professeur-top-install-v2-192.png b/frontend/public/icons/professeur-top-install-v2-192.png
new file mode 100644
index 0000000..22b1d93
Binary files /dev/null and b/frontend/public/icons/professeur-top-install-v2-192.png differ
diff --git a/frontend/public/icons/professeur-top-install-v2-512.png b/frontend/public/icons/professeur-top-install-v2-512.png
new file mode 100644
index 0000000..2714db4
Binary files /dev/null and b/frontend/public/icons/professeur-top-install-v2-512.png differ
diff --git a/frontend/public/manifest.webmanifest b/frontend/public/manifest.webmanifest
index 0227b6b..e8d2ee9 100644
--- a/frontend/public/manifest.webmanifest
+++ b/frontend/public/manifest.webmanifest
@@ -9,13 +9,13 @@
"theme_color": "#2563eb",
"icons": [
{
- "src": "/icons/professeur-top-192.png",
+ "src": "/icons/professeur-top-install-v2-192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "any maskable"
},
{
- "src": "/icons/professeur-top-512.png",
+ "src": "/icons/professeur-top-install-v2-512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "any maskable"
diff --git a/frontend/public/sw.js b/frontend/public/sw.js
new file mode 100644
index 0000000..d4356c3
--- /dev/null
+++ b/frontend/public/sw.js
@@ -0,0 +1,9 @@
+self.addEventListener('install', () => {
+ self.skipWaiting()
+})
+
+self.addEventListener('activate', (event) => {
+ event.waitUntil(self.clients.claim())
+})
+
+self.addEventListener('fetch', () => {})
diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
index bdfff08..5e3fab6 100644
--- a/frontend/src/App.jsx
+++ b/frontend/src/App.jsx
@@ -209,6 +209,7 @@ function TutorApp({ currentUser, onLogout }) {
const [voiceProfiles, setVoiceProfiles] = useState([])
const [selectedVoiceProfileId, setSelectedVoiceProfileId] = useState('')
const [progressPanelOpen, setProgressPanelOpen] = useState(false)
+ const [settingsPanelOpen, setSettingsPanelOpen] = useState(false)
const mediaRecorderRef = useRef(null)
const mediaStreamRef = useRef(null)
const recordedChunksRef = useRef([])
@@ -493,6 +494,7 @@ function TutorApp({ currentUser, onLogout }) {
deactivateAutoListening(false)
setSessionActive(false)
setProgressPanelOpen(false)
+ setSettingsPanelOpen(false)
setCurrentInstruction('')
setAssessment(null)
setAssessmentAnswer('')
@@ -942,6 +944,15 @@ function TutorApp({ currentUser, onLogout }) {
{lessonFocus?.label || 'Cours du jour'}
+
@@ -973,18 +984,6 @@ function TutorApp({ currentUser, onLogout }) {
}
placeholder={assessment ? 'Ta reponse au mini-test...' : 'Ecris ta reponse...'}
/>
-
@@ -1012,6 +1011,38 @@ function TutorApp({ currentUser, onLogout }) {
)}
+
+ {settingsPanelOpen && (
+ setSettingsPanelOpen(false)}>
+
+
+ )}
)}
diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx
index 84181a8..28cc2c1 100644
--- a/frontend/src/main.jsx
+++ b/frontend/src/main.jsx
@@ -8,3 +8,9 @@ ReactDOM.createRoot(document.getElementById('root')).render(
)
+
+if ('serviceWorker' in navigator) {
+ window.addEventListener('load', () => {
+ navigator.serviceWorker.register('/sw.js').catch(() => {})
+ })
+}
diff --git a/frontend/src/styles.css b/frontend/src/styles.css
index ab82b39..1b68ee0 100644
--- a/frontend/src/styles.css
+++ b/frontend/src/styles.css
@@ -307,6 +307,14 @@ button:disabled { opacity: 0.5; cursor: not-allowed; }
display: flex;
gap: 0.75rem;
}
+.icon-button {
+ width: 44px;
+ min-width: 44px;
+ padding: 0.8rem 0;
+ background: #e2e8f0;
+ color: #14213d;
+ font-weight: 800;
+}
.student-home-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -379,7 +387,7 @@ button:disabled { opacity: 0.5; cursor: not-allowed; }
}
.lesson-composer {
display: grid;
- grid-template-columns: minmax(0, 1fr) 150px 120px 110px;
+ grid-template-columns: minmax(0, 1fr) 120px 110px;
gap: 0.6rem;
}
.lesson-status {
@@ -410,6 +418,14 @@ button:disabled { opacity: 0.5; cursor: not-allowed; }
gap: 1rem;
margin-bottom: 1rem;
}
+.settings-field {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+.settings-field span {
+ font-weight: 700;
+}
@keyframes pulse {
from { transform: scale(1); }
@@ -538,6 +554,11 @@ button:disabled { opacity: 0.5; cursor: not-allowed; }
width: 100%;
}
+ .icon-button {
+ width: 44px;
+ min-width: 44px;
+ }
+
.student-home {
padding: 0.5rem;
}
@@ -594,8 +615,7 @@ button:disabled { opacity: 0.5; cursor: not-allowed; }
gap: 0.5rem;
}
- .lesson-composer input,
- .lesson-composer select {
+ .lesson-composer input {
grid-column: 1 / -1;
}