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; }