🎯 Vue d'ensemble
🎯 Overview
LectioTempo chronomètre votre lecture page par page. Vous fixez un nombre de pages, un temps minimum par page, et l'app calcule votre rythme réel, votre régularité et votre ETA de fin de document. Quatre modes couvrent les usages : lecture confortable, entraînement à un rythme imposé, mesure libre, et entraînement examen / QCM.
LectioTempo times your reading page by page. You set a number of pages, a minimum time per page, and the app computes your real pace, consistency, and the document end ETA. Four modes cover every use case: comfortable reading, training at an imposed pace, free measurement, and exam / MCQ practice.
📚 Les 4 modes
📚 The 4 modes
Temps mesuré
Measured time
Chrono libre ; la page peut être validée dès que le temps minimum est atteint.
Free timer; the page can be validated as soon as the minimum time is reached.
Temps imposé
Imposed time
La page reste verrouillée pendant la durée minimum puis se déverrouille automatiquement.
The page stays locked for the minimum duration then unlocks automatically.
Vitesse libre
Free speed
Aucune contrainte. L'app mesure la vitesse réelle et calcule la moyenne, avec un graphique par page.
No constraint. The app measures real speed and computes the average, with a per-page chart.
Quiz / QCM
Quiz / MCQ
Examen / entraînement : décompte global de session + décompte par question. Bannière de fin quand le temps est écoulé.
Exam / training: global session countdown + per-question countdown. End banner when time is up.
✨ Fonctionnalités
✨ Features
- Métriques live : temps sur la page, moyenne, régularité (%), ETA.
- Graphique de vitesse par page (mode libre).
- Mode focus plein écran avec overlay minimaliste.
- Thème clair / sombre persistant.
- Bilingue FR / EN.
- Raccourcis clavier (clavier externe) :
Espacevalider,←reculer,Ppause,Ffocus,⇧+Rreset. - Restauration de session automatique au lancement.
- Haptics contextuels.
- 100 % hors-ligne.
- Live metrics: page time, average, consistency (%), ETA.
- Speed chart per page (free mode).
- Full-screen focus mode with a minimalist overlay.
- Persistent light / dark theme.
- Bilingual FR / EN.
- Keyboard shortcuts (external keyboard):
Spacevalidate,←back,Ppause,Ffocus,⇧+Rreset. - Automatic session restore on launch.
- Contextual haptics.
- 100% offline.
🚀 Build & run
🚀 Build & run
Prérequis :
Requirements:
- Xcode 16+ avec le SDK iOS 26.
- iOS 17+ sur l'appareil cible (Simulator ou physique).
- Aucune dépendance externe (SPM vide).
- Xcode 16+ with the iOS 26 SDK.
- iOS 17+ on the target device (Simulator or physical).
- No external dependencies (empty SPM).
git clone <repo>
cd LectioTempo
open LectioTempo.xcodeproj
Puis ⌘R dans Xcode. C'est tout.
Then ⌘R in Xcode. That's it.
🏗️ Architecture
🏗️ Architecture
Architecture MVVM légère avec SessionViewModel comme état central,
observé par toutes les vues via @StateObject / @ObservedObject.
Le timer est piloté par un Timer.publish Combine.
L'état est sérialisé dans UserDefaults pour la restauration.
Lightweight MVVM with SessionViewModel as the central state,
observed by all views through @StateObject / @ObservedObject.
The timer is driven by a Combine Timer.publish.
State is serialized to UserDefaults for resume.
Structure du projet
Project structure
LectioTempo/
├── LectioTempoApp.swift # Entry point (@main)
├── ContentView.swift
├── ViewModels/
│ └── SessionViewModel.swift # State machine + Combine timer
├── Models/
│ ├── PageRecord.swift # Page log entry
│ ├── ReadingMode.swift # .measured | .imposed | .free | .quiz
│ └── SessionState.swift # UserDefaults persistence
├── Views/
│ ├── RootView.swift # Main composition
│ ├── HeaderView.swift
│ ├── BannersView.swift
│ ├── ConfigCard.swift
│ ├── TimerCard.swift
│ ├── MetricsGrid.swift
│ ├── SpeedMetricsGrid.swift
│ ├── SpeedChartView.swift
│ ├── DocProgressCard.swift
│ ├── PageLogCard.swift
│ ├── StatusRow.swift
│ ├── ControlsRow.swift
│ ├── NavButtonsRow.swift
│ ├── ModeToggleView.swift
│ ├── ImposedCountdownView.swift
│ ├── FocusOverlayView.swift
│ ├── CompletionView.swift
│ ├── FAQView.swift
│ ├── PrivacyView.swift
│ └── PreviewContainer.swift
├── Theme/
│ └── AppTheme.swift # Color + typography tokens
├── Localization/
│ └── LocalizationManager.swift # FR / EN
└── Utils/
├── HapticsManager.swift
└── TimeFormatter.swift
Composants principaux
Main components
| Type | Rôle |
|---|---|
SessionViewModel | Machine à états (stopped / running / paused / completed), timers, calculs métriques, persistance. |
ReadingMode | Enum des 4 modes. |
PageRecord | Tuple page + durée + horodatage. |
SessionState | Encodage Codable + I/O UserDefaults. |
LocalizationManager | Dictionnaires FR / EN injectés via @Environment. |
AppTheme | Palette dark / light alignée sur cette doc. |
| Type | Role |
|---|---|
SessionViewModel | State machine (stopped / running / paused / completed), timers, metric computation, persistence. |
ReadingMode | Enum of the 4 modes. |
PageRecord | Page + duration + timestamp tuple. |
SessionState | Codable encoding + UserDefaults I/O. |
LocalizationManager | FR / EN dictionaries injected via @Environment. |
AppTheme | Dark / light palette aligned with these docs. |
🌍 Localisation
🌍 Localization
Tous les textes passent par LocalizationManager.t(.cle).
Pour ajouter une langue : étendre l'enum Lang et ajouter une entrée dans le dictionnaire de LocalizationManager.swift.
All texts go through LocalizationManager.t(.key).
To add a language: extend the Lang enum and add an entry in the dictionary in LocalizationManager.swift.
🔐 Confidentialité
🔐 Privacy
UserDefaults
et disparaissent avec l'application.
Lire la politique complète →
UserDefaults
and disappears with the app.
Read the full policy →
📬 Contact
📬 Contact
Auteur : Valérie Otero
Email : valerie.otero@free.fr
Author: Valérie Otero
Email: valerie.otero@free.fr
📄 Licence
📄 License
© 2026 Valérie Otero — Tous droits réservés.
© 2026 Valérie Otero — All rights reserved.