diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 7a2003b..fc3cd50 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -211,6 +211,7 @@ function TutorApp({ currentUser, onLogout }) { const [programLessons, setProgramLessons] = useState([]) const [programStatus, setProgramStatus] = useState(null) const [studentProgram, setStudentProgram] = useState(null) + const [activeAssetIndex, setActiveAssetIndex] = useState(0) const [progressPanelOpen, setProgressPanelOpen] = useState(false) const [settingsPanelOpen, setSettingsPanelOpen] = useState(false) const mediaRecorderRef = useRef(null) @@ -319,6 +320,10 @@ function TutorApp({ currentUser, onLogout }) { } }, [selectedVoiceProfileId]) + useEffect(() => { + setActiveAssetIndex(0) + }, [studentProgram?.id]) + useEffect(() => { loadVoiceProfiles() return () => { @@ -932,6 +937,8 @@ function TutorApp({ currentUser, onLogout }) { const lastAssistantMessage = [...messages].reverse().find((message) => message.role === 'assistant') const lastUserMessage = [...messages].reverse().find((message) => message.role === 'user') const activeLessonTitle = studentProgram?.title || lessonFocus?.label || 'Cours du jour' + const lessonAssets = studentProgram?.assets || [] + const activeAsset = lessonAssets[activeAssetIndex] || lessonAssets[0] || null const lessonSummary = lastAssistantMessage?.content || 'Aucune ancienne séance trouvée pour le moment. Professeur TOP commencera par une reprise courte.' const lastStudentWork = lastUserMessage?.content || 'Aucune réponse récente enregistrée.' const nextLessonAdvice = studentProgram @@ -1020,17 +1027,43 @@ function TutorApp({ currentUser, onLogout }) {
- Professeur TOP +
+ Professeur TOP + {activeAsset && ( + + Fiche {activeAssetIndex + 1}/{lessonAssets.length} + + )} +
{currentInstruction ? ( -

{currentInstruction}

+

{currentInstruction}

) : ( -

Professeur TOP prépare la suite de la leçon.

+

Professeur TOP prépare la suite de la leçon.

)} - {studentProgram?.assets?.length > 0 && ( -
- {studentProgram.assets.map((asset) => ( - {asset.title} - ))} + {activeAsset && ( +
+
+ {activeAsset.title} +
+ + +
+
+ {activeAsset.title}
)}
diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 211addb..f2fca2f 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -452,7 +452,7 @@ button:disabled { opacity: 0.5; cursor: not-allowed; } min-height: 0; display: flex; flex-direction: column; - gap: 0.75rem; + gap: 0.6rem; overflow: hidden; background: #eef6ff; border: 1px solid #cfe4ff; @@ -461,24 +461,52 @@ button:disabled { opacity: 0.5; cursor: not-allowed; } } .lesson-display p { margin: 0; - overflow: auto; white-space: pre-wrap; - font-size: clamp(1rem, 2.2vw, 1.35rem); - line-height: 1.5; } -.lesson-assets { +.lesson-display-head, +.lesson-asset-toolbar, +.lesson-asset-actions { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.75rem; +} +.asset-counter { + color: #64748b; + font-size: 0.9rem; + font-weight: 700; +} +.teacher-transcript { + max-height: 4.8rem; + overflow: auto; + color: #14213d; + font-size: clamp(0.95rem, 1.5vw, 1.08rem); + line-height: 1.45; +} +.lesson-asset-view { min-height: 0; flex: 1 1 auto; display: flex; + flex-direction: column; gap: 0.75rem; - overflow-x: auto; - overflow-y: hidden; - padding-bottom: 0.25rem; + overflow: hidden; } -.lesson-assets img { - width: min(100%, 720px); - max-height: 100%; - flex: 0 0 min(100%, 720px); +.lesson-asset-toolbar { + flex: 0 0 auto; +} +.lesson-asset-toolbar strong { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.lesson-asset-actions button { + padding: 0.6rem 0.8rem; +} +.lesson-asset-view img { + width: 100%; + min-height: 0; + flex: 1 1 auto; object-fit: contain; border: 1px solid #dbeafe; border-radius: 14px; @@ -717,10 +745,24 @@ button:disabled { opacity: 0.5; cursor: not-allowed; } border-radius: 16px; } - .lesson-display p { + .teacher-transcript { + max-height: 3.1rem; font-size: 1rem; } + .lesson-display-head, + .lesson-asset-toolbar { + align-items: stretch; + flex-direction: column; + gap: 0.4rem; + } + + .lesson-asset-actions { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0.5rem; + } + .lesson-composer { grid-template-columns: 1fr 1fr; gap: 0.5rem;