📖 Documentation

LectioTempo — README

Application iOS native (SwiftUI) qui transforme la lecture en mesure : vitesse, régularité, temps total.

Native iOS app (SwiftUI) that turns reading into measurement: speed, consistency, total time.

🎯 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

🚀 Build & run

🚀 Build & run

Prérequis :

Requirements:

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

TypeRôle
SessionViewModelMachine à états (stopped / running / paused / completed), timers, calculs métriques, persistance.
ReadingModeEnum des 4 modes.
PageRecordTuple page + durée + horodatage.
SessionStateEncodage Codable + I/O UserDefaults.
LocalizationManagerDictionnaires FR / EN injectés via @Environment.
AppThemePalette dark / light alignée sur cette doc.
TypeRole
SessionViewModelState machine (stopped / running / paused / completed), timers, metric computation, persistence.
ReadingModeEnum of the 4 modes.
PageRecordPage + duration + timestamp tuple.
SessionStateCodable encoding + UserDefaults I/O.
LocalizationManagerFR / EN dictionaries injected via @Environment.
AppThemeDark / 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

LectioTempo ne collecte rien. Pas de compte, pas de réseau, pas d'analytique, pas de SDK tiers. Toutes les données restent localement dans UserDefaults et disparaissent avec l'application. Lire la politique complète →
LectioTempo collects nothing. No account, no network, no analytics, no third-party SDK. All data stays locally in 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.