Sync push_then_sync : préserve les absences 'publiee_escada' contre
écrasement/orphelines après push (PDF Escada stale). UI reconnaît le
statut (calendrier, éditeur, KPIs) au lieu d'afficher 'présent'.
Sync_esacada : timeout grille 20s → 45s + retry après reload (AUTOMAT 1
échouait à la 1re classe après changement de langue).
Telegram : ajoute liste d'erreurs + tail du log dans les notifs d'échec
même en mode normal — avant on avait juste 'a échoué (code 1)'.
UX :
- Calendrier toujours visible (même sans absences) et démarre sur le
mois courant (pas sur le 1er mois d'absence) ; tous les jours
cliquables pour pouvoir ajouter une absence.
- Date du jour pré-sélectionnée aussi via navigate_to (clic depuis
/classe).
- KPIs cards taggées kpi-card/kpi-value pour CSS responsive mobile.
- Badge 'DEV' dans la sidebar (APP_ENV=dev) — invisible en prod.
- Badge 'Built with Reflex' masqué.
- KPIs retirés du dashboard /accueil.
Prod :
- Dockerfile.prod multi-stage (Reflex export bundle + runtime slim).
- docker-compose.prod.yml séparé (port 3002, projet eptm-dashboard-prod).
- .gitignore + .dockerignore nettoyés.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- panneau d'édition des absences : P1-5 dans la colonne gauche, P6-10
à droite (au lieu d'un grid à 2 colonnes en flux ligne par ligne).
Sur mobile, les deux colonnes s'empilent.
- tables BN et Notes d'examen : ajout d'un min-width forcé pour
qu'elles débordent de la largeur d'un écran mobile, wrapper
overflow-x:auto fonctionnel pour le swipe horizontal.
- exclu les tables de la règle CSS .content-area * { min-width: 0 }
pour éviter la casse caractère par caractère du contenu cellule.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>