SPB Git

spb/uqo-chat

Public

adopt: état déployé sur M4M64a adopté comme source de vérité (remote-first, 2026-10-02)

mld committed (Oct 2, 2026) parent a2a27c6 Browse files

50 changed files +19,493 −482

50 changed files
modified README.md +48 −482
@@ -1,508 +1,74 @@
1 −# UQO-Chat — tuteur IA pour IMM1003 · IMM1033
1 +# UQO-Chat
2 2
3 −> **Tuteur IA des cours IMM1003 — Éléments d'évaluation immobilière et IMM1033 — Méthodes du coût en évaluation
4 −> immobilière (Université du Québec en Outaouais).** Il explique la matière en citant les notes de cours officielles,
5 −> exécute du Python dans un bac à sable isolé, produit et modifie des classeurs Excel à formules vivantes, calcule
6 −> avec des outils d'évaluation déterministes, cherche des données de marché actuelles, analyse les fichiers déposés,
7 −> génère des graphiques, des documents Word et des quiz interactifs.
3 +**Tuteur IA pour les cours IMM1003 — Éléments d'évaluation immobilière et IMM1033 — Méthodes du coût (UQO).**
4 +Production : https://www.uqo-chat.app · Spécification complète : [`CLAUDE.md`](CLAUDE.md).
8 5
9 −| | |
10 −|---|---|
11 −| **Production** | https://www.uqo-chat.app |
12 −| **Version** | v0.5 (auth par invitation) — `backend/pyproject.toml` et `frontend/package.json` portent encore `0.1.0` |
13 −| **App `mld`** | `uqo-chat` · API `:8190` · sandbox `:8191` · nœud actuel : `mld status` (au 2026-09-06 : **M4M64a**, `~/apps/uqo-chat`) |
14 −| **Processus PM2** | `uqo-chat-api` · `uqo-chat-sandbox` · `uqo-chat-ngrok` |
15 −| **Santé** | `GET /api/v1/ready` → `{"ok":true,"chunks":714}` · `GET /api/v1/health` → `{"ok":true,"service":"uqo-chat"}` |
16 −| **Dépôt** | `gitsrv:~/srv/git/uqo-chat.git` (spbgit, git.spboucher.ai) — source de vérité = **ce dépôt (laptop) + spbgit**, jamais la copie du nœud |
17 −| **Spécification produit** | [`CLAUDE.md`](CLAUDE.md) (résumé de la spec d'origine en 28 sections, règles d'or, écarts assumés) |
18 −| **Auteur / contact** | **Simon-Pierre Boucher** — contact@spboucher.ai |
6 +Le tuteur explique la matière en citant les notes de cours officielles (RAG), exécute du Python
7 +dans un bac à sable isolé, produit des classeurs Excel à formules vivantes, cherche des données
8 +de marché actuelles (Firecrawl), analyse les fichiers déposés et génère des quiz interactifs.
9 +Tous les modèles (Claude, GPT) passent par OpenRouter avec repli automatique.
19 10
20 −---
21 −
22 −## Sommaire
23 −
24 −1. [Vue d'ensemble](#1-vue-densemble)
25 −2. [Fonctionnalités](#2-fonctionnalités)
26 −3. [Les 13 outils du tuteur](#3-les-13-outils-du-tuteur)
27 −4. [Architecture](#4-architecture)
28 −5. [Arborescence du dépôt](#5-arborescence-du-dépôt)
29 −6. [Backend (FastAPI)](#6-backend-fastapi)
30 −7. [Authentification, rôles et comptes](#7-authentification-rôles-et-comptes)
31 −8. [RAG sur les notes de cours](#8-rag-sur-les-notes-de-cours)
32 −9. [Bac à sable Python (`sandbox-runner`)](#9-bac-à-sable-python-sandbox-runner)
33 −10. [Frontend (React PWA)](#10-frontend-react-pwa)
34 −11. [Configuration (variables d'environnement)](#11-configuration-variables-denvironnement)
35 −12. [Développement local](#12-développement-local)
36 −13. [Tests, lint, CI](#13-tests-lint-ci)
37 −14. [Déploiement sur le cluster MacLustr (`mld`)](#14-déploiement-sur-le-cluster-maclustr-mld)
38 −15. [Exploitation](#15-exploitation)
39 −16. [Coûts LLM](#16-coûts-llm)
40 −17. [Vie privée, sécurité, Loi 25](#17-vie-privée-sécurité-loi-25)
41 −18. [Écarts assumés par rapport à la spécification](#18-écarts-assumés-par-rapport-à-la-spécification)
42 −19. [Feuille de route](#19-feuille-de-route)
43 −20. [Historique des versions](#20-historique-des-versions)
44 −21. [Pièges connus](#21-pièges-connus)
45 −22. [Droits et licence](#22-droits-et-licence)
46 −23. [Contact](#23-contact)
47 −
48 −---
49 −
50 −## 1. Vue d'ensemble
51 −
52 −UQO-Chat est une application web (PWA) destinée aux étudiant·es des deux cours d'évaluation immobilière donnés
53 −par Simon-Pierre Boucher à l'UQO. Le professeur inscrit les courriels des étudiant·es ; chacun·e reçoit une
54 −invitation, choisit un mot de passe et converse en français avec un tuteur qui :
55 −
56 −- **s'appuie d'abord sur la matière du cours** : recherche BM25 dans le HTML des sites de notes interactives
57 − (https://www.uqo-imm1003.app, https://www.uqo-imm1033.app) avec citations cliquables vers la séance et la section ;
58 −- **calcule juste** : calculateurs déterministes d'évaluation (méthode du coût, dépréciation, terrain,
59 − capitalisation, comparables, six fonctions du dollar, conversions d'unités) plutôt que de l'arithmétique « de tête » ;
60 −- **produit des livrables** : classeurs Excel à formules vivantes (6 gabarits ou spec libre), modification de
61 − classeurs déposés, graphiques PNG, documents Word, quiz interactifs ;
62 −- **exécute du code** : Python (pandas, numpy, matplotlib…) dans un service séparé sous `sandbox-exec`, sans réseau ;
63 −- **va chercher le présent** : données de marché, taux, coûts, règlements via Firecrawl (cache 6 h) ;
64 −- **est piloté par le professeur** : tableau de bord (activité anonymisée, étudiants et invitations, contenu
65 − ingéré, consignes et annonces par cours, réglages), page admin des coûts.
66 −
67 −Tous les appels de modèles passent par **OpenRouter** (`anthropic/claude-fable-5.1` par défaut, repli
68 −`openai/gpt-5.5`, `anthropic/claude-opus-4.6` pour la réflexion approfondie, `openai/gpt-5.4-nano` pour les titres
69 −et classifications, `anthropic/claude-sonnet-4.6` pour la vision), en **streaming SSE** avec boucle agentique
70 −(jusqu'à 12 itérations d'outils, outils exécutés en parallèle, 16 000 jetons de sortie).
71 −
72 −## 2. Fonctionnalités
73 −
74 −### Pour l'étudiant·e
75 −- Conversations par cours (IMM1003 / IMM1033), titrées automatiquement, regroupées par date dans le tiroir,
76 − renommage, suppression, régénération d'une réponse, arrêt d'un tour en cours, rétroaction 👍/👎 par message.
77 −- Réponses en Markdown + **KaTeX** (formules), blocs de code colorés (**shiki** allégé), garde-fou `math-guard`
78 − pour que « 185 000 $ » en prose ne soit pas pris pour du LaTeX.
79 −- **Cartes d'outils** riches : source de cours (extrait + lien), calculateur d'évaluation (tableau des étapes),
80 − calculateur financier, conversion d'unités, **éditeur Python** (onglets Code / Sortie / Graphiques, modifier et
81 − ré-exécuter, télécharger `.py`), **aperçu Excel multi-feuilles** avec formules `ƒ` et bouton « Modifier avec le
82 − tuteur », graphique, document Word, analyse de fichier, recherche web (sources), **quiz interactif** (correction
83 − immédiate, explication, score enregistré).
84 −- Dépôt de fichiers (xlsx, csv, pdf, docx, pptx, images ; 20 Mo ; 20 / jour) conservés 7 jours (30 si épinglés),
85 − panneau des artefacts de la conversation, liens de téléchargement signés.
86 −- Préférences : tutoiement / vouvoiement, langue, thème ; consentement Loi 25, export et suppression du compte.
87 −- PWA installable (app shell + cache lecture ≈ 2 Mo), mobile-first 375 px, héros dégradé, composer flottant.
88 −
89 −### Pour le professeur (`/professeur`)
90 −- **Activité** : messages, conversations, étudiant·es actifs, outils appelés, sujets, rétroactions — agrégés et
91 − anonymisés (identifiants hachés), sans contenu de message.
92 −- **Étudiants** : ajout en lot (collage de courriels), rôles, statut *invité / activé*, **invitation Resend**
93 − « Bienvenue sur UQO-Chat — choisis ton mot de passe », relance individuelle ou « Inviter les N jamais invité·es »,
94 − mot de passe défini manuellement, suppression.
95 −- **Contenu** : ingestion de fichiers (PDF, DOCX, PPTX, MD) ou d'un site de notes, activation / désactivation d'un
96 − document, réindexation.
97 −- **Réglages par cours** : consignes additionnelles injectées dans le prompt, annonce affichée aux étudiant·es,
98 − échéances, modèle.
99 −- Promotion d'un compte au rôle professeur / admin.
100 −
101 −### Pour l'admin (`/admin`)
102 −- Coûts LLM (par jour, par modèle, par étudiant·e haché), budget mensuel et projection.
103 −
104 −## 3. Les 13 outils du tuteur
105 −
106 −Chaque outil = `backend/app/tools/<nom>.py` + schéma JSON `app/tools/schemas/<nom>.json` + test + carte React
107 −`frontend/src/components/tools/<nom>-card.tsx`. Les arguments sont **coercés avec tolérance** (`tools/coerce.py` :
108 −« 425 000 $ », « +3 % », « Oui » → nombres / booléens) et les appels tronqués par le modèle sont **réparés ou refusés**
109 −plutôt qu'exécutés à moitié.
110 −
111 −| Outil | Rôle | Détails |
112 −|---|---|---|
113 −| `search_course_content` | Matière du cours (à consulter d'abord) | BM25 sur 714 passages des deux sites de notes ; renvoie extraits + URL `seance/NN#ancre` |
114 −| `appraisal_calc` | 12 calculateurs d'évaluation déterministes | méthode du coût, **ventilation de la dépréciation anti-double-comptage**, coût indexé / unitaire, terrain (extraction, allocation, résiduelle, lotissement), capitalisation directe, MRB, grille de comparables, âge effectif par le marché |
115 −| `financial_calc` | Six fonctions du dollar, VAN / TRI, âge-vie | `numpy-financial` |
116 −| `unit_convert` | m² ↔ pi², arpent, acre, hectare, $/m² ↔ $/pi² | unités québécoises incluses |
117 −| `execute_python` | Calculs libres, statistiques, régressions, graphiques | via `sandbox-runner` ; les fichiers déposés **et les artefacts déjà générés** sont disponibles dans `inputs/<nom>` |
118 −| `make_chart` | Graphique rapide à partir de données | matplotlib in-process, palette UQO, PNG |
119 −| `create_excel` | Nouveau classeur à **formules vivantes** | gabarits `comparables_ajustes`, `methode_du_cout`, `age_vie`, `tableau_amortissement`, `six_fonctions`, `sensibilite`, ou spec libre normalisée (`tools/excel_spec.py`) ; la grille de comparables calcule les ajustements par formule (sujet + taux + échelles ordinales + tendance / mois) |
120 −| `inspect_excel` | Lire un classeur (déposé ou généré) | feuilles, dimensions, en-têtes, formules, aperçu |
121 −| `edit_excel` | **Modifier** un classeur existant | ajouter colonne / ligne / feuille / graphique, corriger une cellule, formater ; versions `_v2`, `_v3`… (`tools/excel_ops.py`) |
122 −| `create_docx` | Document Word depuis Markdown | fiche de révision, plan d'étude, gabarit de rapport (`python-docx`) |
123 −| `analyze_file` | Lire un fichier déposé | xlsx / csv / pdf (`pdfplumber`) / docx / pptx / image (modèle vision) |
124 −| `web_search` | Données actuelles seulement | Firecrawl, cache 6 h, 30 / jour / étudiant·e |
125 −| `generate_quiz` | Quiz interactif | questions à choix, explication, enregistrement des tentatives |
126 −
127 −Le prompt système (`app/llm/prompts/system_tutor.md` + `guardrails.md` + `course_imm10xx.md` + consignes du
128 −professeur + `TOOL_HINTS` dans `agent.py`) impose : chercher la matière avant de répondre, enchaîner les outils
129 −(ex. `search_course_content → appraisal_calc → create_excel → make_chart`), **modifier** un fichier existant avec
130 −`edit_excel` plutôt que d'en recréer un, pédagogie socratique, français québécois, pas de solution complète aux TP
131 −en cours.
132 −
133 −## 4. Architecture
134 −
135 −```
136 −Internet ── ngrok (www.uqo-chat.app, TLS) ──► uqo-chat-api :8190 FastAPI + SSE + SPA React (PM2)
137 − │
138 − ├──► uqo-chat-sandbox :8191 sandbox-runner (PM2) — python -I -B sous sandbox-exec,
139 − │ sans réseau, écriture confinée, rlimits, timeout ≤ 60 s
140 − ├──► SQLite data/uqochat.db (SQLAlchemy async ; Postgres via DATABASE_URL)
141 − │ index BM25 reconstruit en mémoire au démarrage
142 − ├──► fichiers data/files/<user>/<id>.<ext> (TTL 7 j / 30 j épinglés, purge horaire)
143 − └──► HTTPS sortant : OpenRouter (LLM), Firecrawl (web), Resend (courriels)
144 −```
145 −
146 −- **Un seul point d'entrée LLM** : `app/llm/openrouter.py` (`LLMClient`, SSE, repli de modèle, comptage des jetons
147 − et des coûts → table `llm_usage`). `app/llm/router.py` choisit le modèle (primaire / raisonnement / rapide / vision).
148 −- **Boucle agentique** : `app/llm/agent.py` — construit le prompt (cours, préférences, fichiers, échéances,
149 − annonce), streame les deltas au client (`token`, `tool_call`, `tool_result`, `done`, `error`), exécute les outils en
150 − parallèle via `app/tools/registry.py` (`ToolContext` = utilisateur, conversation, fichiers, cours), persiste
151 − messages et `tool_calls`, enregistre usage et analytics.
152 −- **Aucun code étudiant / LLM ne s'exécute dans le processus API** : toujours `sandbox-runner`
153 − (`app/sandbox/client.py`, jeton `SANDBOX_TOKEN`).
154 −- **Maintenance** (`main.py`, toutes les heures) : purge des fichiers expirés, anonymisation des messages de plus de
155 − `MESSAGE_RETENTION_MONTHS` (12).
156 −- **Sécurité HTTP** : CORS restreint, en-têtes `nosniff`, `X-Frame-Options: DENY`, `Referrer-Policy`,
157 − `Permissions-Policy`, HSTS en production, **CSP** stricte sur le HTML (`script-src 'self'`, `frame-ancestors 'none'`).
158 −- **Frontend servi par l'API** : `frontend/dist` monté sur `/assets` + repli SPA (`GET`/`HEAD` sur toute route
159 − → `index.html`), ce qui permet les vérifications d'uptime en `HEAD`.
160 −
161 −Les manifestes **Kubernetes** (`k8s/`) et `docker-compose.yml` reproduisent la cible décrite dans la spécification
162 −(Postgres + pgvector, Redis, MinIO, sandbox durci `network_mode: none`, NetworkPolicy deny-all, HPA) pour un futur
163 −cluster ; la production actuelle tourne sur un nœud Mac du cluster via `mld`.
164 −
165 −## 5. Arborescence du dépôt
11 +## Architecture (déploiement MacLustr)
166 12
167 13 ```
168 −uqo-chat/
169 −├── README.md · CLAUDE.md · Makefile · .env.example · docker-compose.yml
170 −├── .github/workflows/ ci.yml (ruff + pytest + tsc + build + trivy) · deploy.yml (images ghcr + kubectl, non utilisé en prod)
171 −├── deploy/uqo-chat.manifest.json gabarit du manifeste mld (les secrets sont dans M1M32:~/dispatch/apps/uqo-chat.json)
172 −├── backend/ Python 3.12 · FastAPI · SQLAlchemy async
173 −│ ├── pyproject.toml dépendances (fastapi, uvicorn, pydantic, sqlalchemy, aiosqlite, asyncpg, httpx[http2],
174 −│ │ structlog, python-jose, passlib, openpyxl, pandas, numpy(-financial), matplotlib,
175 −│ │ pdfplumber, python-docx, python-pptx, selectolax, markdown-it-py, aiosmtplib, orjson)
176 −│ ├── Dockerfile
177 −│ ├── app/
178 −│ │ ├── main.py application, middlewares, SPA, tâche de maintenance
179 −│ │ ├── db.py moteur async, SessionLocal, init_db (create_all + _add_missing_columns)
180 −│ │ ├── models/ User, MagicLink, Course, Conversation, Message, ToolCall, StoredFile, Quiz, QuizAttempt,
181 −│ │ │ CourseDocument, CourseChunk, AnalyticsEvent, LLMUsage, AppSetting
182 −│ │ ├── api/v1/ health, auth, conversations, chat, files, quiz, courses, professor, admin
183 −│ │ ├── core/ config (Settings), logging (structlog, masquage content/text/email), security (JWT,
184 −│ │ │ PBKDF2, hachage d'identifiants), ratelimit (mémoire), cache
185 −│ │ ├── llm/ openrouter.py, agent.py, router.py, schemas.py, prompts/*.md
186 −│ │ ├── rag/ ingest.py (HTML des sites / PDF / DOCX / PPTX / MD → chunks), chunking.py, retriever.py (BM25)
187 −│ │ ├── sandbox/client.py client HTTP du sandbox-runner
188 −│ │ ├── services/ users, invites, mail (Resend + SMTP), conversations, files, courses, analytics, costs
189 −│ │ └── tools/ registry, all, coerce, excel_spec, excel_ops, 13 outils, schemas/*.json, excel_templates/ (6)
190 −│ ├── scripts/ seed.py (cours + professeur), ingest.py (--course --site | --path)
191 −│ └── tests/ 41 tests (auth/invitations respx, SSE OpenRouter, RAG, préfiltre sandbox, outils)
192 −├── sandbox-runner/ service FastAPI minimal : POST /run {code, files_in, timeout_s} · runner.py (sandbox-exec,
193 −│ rlimits, prélude matplotlib Agg, capture des figures, troncature 50 Ko) · Dockerfile · requirements.txt
194 −├── frontend/ React 18 · Vite 5 · TypeScript · Tailwind 3 · PWA
195 −│ ├── src/app/router.tsx /connexion · /mot-de-passe · /confidentialite · /professeur · /admin · / · /c/:id
196 −│ ├── src/components/ chat/ (chat-view, composer, message-bubble, streaming-text, code-block, tool-call-timeline,
197 −│ │ empty-state) · tools/ (13 cartes + tool-card, artifact-chips) · layout/ (app-shell, sidebar) · ui/
198 −│ ├── src/features/ auth/ (login, set-password, privacy, settings) · conversations/artifacts-panel ·
199 −│ │ professor/ (professor-page, admin-costs-page)
200 −│ ├── src/stores/ zustand : auth, chat, ui (dont ui.draft pour « Modifier avec le tuteur »)
201 −│ ├── src/lib/ api.ts (fetch + SSE), types.ts, format.ts, math-guard.ts (+ test), cn.ts
202 −│ ├── src/theme/uqo.ts · src/i18n/fr-CA.json · src/index.css · tailwind.config.ts · vite.config.ts (PWA, proxy /api)
203 −│ └── public/ uqo-logo.png, uqo-logo-white.png, icons/ (favicon, 192/512, maskable, apple-touch, og.png)
204 −├── k8s/ base/ (namespace, api, web, worker, sandbox-runner, postgres, redis, minio, services,
205 −│ networkpolicies, hpa) · overlays/staging|prod · ngrok/ (operator, ingress)
206 −├── content/ (ignoré) copies locales des sites de notes pour l'ingestion
207 −└── data/ (ignoré) uqochat.db + files/
14 +Internet ── ngrok (www.uqo-chat.app) ──► uqo-chat-api :8190 FastAPI + SSE + SPA React (PM2)
15 + │
16 + ├──► uqo-chat-sandbox :8191 (PM2, sandbox-exec : sans réseau)
17 + ├──► SQLite data/uqochat.db (index BM25 en mémoire)
18 + ├──► fichiers data/files/ (TTL 7 j / 30 j épinglés)
19 + └──► OpenRouter · Firecrawl (HTTPS sortant)
208 20 ```
209 21
210 −## 6. Backend (FastAPI)
211 −
212 −Préfixe commun **`/api/v1`**. Authentification par **JWT** (`Authorization: Bearer`, 24 h) + jeton de
213 −rafraîchissement (30 j). Documentation OpenAPI disponible **en développement seulement** (`/api/docs`).
214 −
215 −| Groupe | Routes | Notes |
216 −|---|---|---|
217 −| Santé | `GET /health` · `GET /ready` | `ready` renvoie le nombre de passages indexés |
218 −| Auth | `POST /auth/login` · `POST /auth/forgot` · `GET /auth/password-token` · `POST /auth/set-password` · `POST /auth/verify` (legacy lien magique) · `POST /auth/refresh` · `POST /auth/logout` · `GET /auth/config` | voir §7 |
219 −| Moi | `GET /me` · `PATCH /me/preferences` · `POST /me/password` · `POST /me/consent` · `DELETE /me` | suppression = anonymisation + purge des fichiers |
220 −| Cours | `GET /courses` | cours actifs, annonces, échéances |
221 −| Conversations | `GET/POST /conversations` · `GET/PATCH/DELETE /conversations/{id}` · `POST /conversations/{id}/messages/{mid}/feedback` | |
222 −| Chat | `POST /chat/{id}/messages` (SSE) · `POST /chat/{id}/stop` · `POST /chat/{id}/messages/{mid}/regenerate` (SSE) | événements `token`, `tool_call`, `tool_result`, `title`, `usage`, `done`, `error` |
223 −| Fichiers | `POST /files` (201) · `GET /files/{id}` · `GET /files/{id}/link` · `POST /files/{id}/pin` · `GET /conversations/{id}/files` · `POST /tools/python/run` | `python/run` = ré-exécution depuis l'éditeur de la carte Python |
224 −| Quiz | `GET /quiz/{id}` · `POST /quiz/{id}/answers` | |
225 −| Professeur | `GET /dashboard` · `GET /settings` · `PATCH /settings/{course}` · `GET/POST /content` (202) · `PATCH/DELETE /content/{doc_id}` · `POST /promote` · `GET/POST /students` · `POST /students/invite-all` · `PATCH/DELETE /students/{id}` · `POST /students/{id}/invite` · `PUT /students/{id}/password` | rôle `professor` ou `admin` |
226 −| Admin | `GET /costs` | rôle `admin` |
227 −
228 −**Modèle de données** (SQLAlchemy, `create_all` au démarrage + ajout des colonnes manquantes) :
229 −
230 −| Table | Contenu |
231 −|---|---|
232 −| `users` | courriel, rôle (`student` / `professor` / `admin`), mot de passe PBKDF2, préférences JSON, consentement, `invited_at`, dernier accès |
233 −| `magic_links` | jetons à usage unique (`purpose` = `invite` / `reset` / legacy), expiration |
234 −| `courses` | IMM1003, IMM1033 : libellé, consignes du professeur, annonce, échéances, modèle |
235 −| `conversations` · `messages` · `tool_calls` | fil, rôle, contenu, jetons, coût, rétroaction, appels d'outils (args, résultat, durée) |
236 −| `files` | fichiers déposés / générés : propriétaire, conversation, type, taille, hachage, épinglé, expiration |
237 −| `quizzes` · `quiz_attempts` | quiz générés et tentatives |
238 −| `course_documents` · `course_chunks` | documents ingérés (site, PDF…) et passages BM25 |
239 −| `analytics_events` | événements anonymisés (identifiant haché) |
240 −| `llm_usage` | usage par appel : modèle, jetons entrée / sortie, coût USD |
241 −| `app_settings` | réglages clé-valeur modifiables à chaud |
242 −
243 −**Limites par étudiant·e** (config) : 60 messages / h, 400 / jour, 10 exécutions sandbox / h, 30 recherches web /
244 −jour, 20 dépôts / jour, 20 Mo par fichier. Dépassement → `429` avec message français.
245 −
246 −**Journalisation** : `structlog` JSON en production ; les clés `content`, `text`, `email`… sont masquées
247 −(`core/logging.py`). Jamais de contenu de message dans les logs.
248 −
249 −## 7. Authentification, rôles et comptes
250 −
251 −Flux **v0.5** (le code d'accès au cours des versions précédentes est supprimé) :
252 −
253 −1. Le professeur ajoute les courriels dans **Étudiants** (`POST /professor/students`, création en lot). Les comptes
254 − créés par le professeur sont acceptés même hors `@uqo.ca` ; sinon `ALLOWED_EMAIL_DOMAINS` s'applique.
255 −2. Invitation (`send_invitations`, `POST /students/{id}/invite`, `POST /students/invite-all`) : courriel **Resend**
256 − « Bienvenue sur UQO-Chat — choisis ton mot de passe » avec lien `/mot-de-passe?token=…` (`purpose=invite`,
257 − `INVITE_TTL_DAYS` = 14). Gabarits HTML aux couleurs UQO dans `services/mail.py` (Resend `/emails` et
258 − `/emails/batch` ≤ 100 ; repli SMTP `aiosmtplib`).
259 −3. L'étudiant·e choisit son mot de passe (`GET /auth/password-token` valide le jeton, `POST /auth/set-password`),
260 − puis se connecte (`POST /auth/login`, PBKDF2).
261 −4. « Première connexion ou mot de passe oublié » → `POST /auth/forgot` : lien `purpose=reset` de
262 − `RESET_TTL_MINUTES` = 60, envoyé **uniquement** aux adresses inscrites ou listées dans `PROFESSOR_EMAILS` /
263 − `ADMIN_EMAILS` / `INVITED_EMAILS` (sinon `404` avec un indice : « adresse non inscrite » ou « adresse non admise »).
264 − Limitation de débit : 20 demandes / h par IP, 5 / h par adresse. En dev, la réponse contient `dev_link`.
265 −5. Sans `RESEND_API_KEY` ni SMTP, les liens sont affichés dans le tableau de bord pour copie manuelle.
266 −
267 −Rôles : `student` (chat), `professor` (tableau de bord, étudiants, contenu, réglages), `admin` (coûts, promotion).
268 −Les adresses de `PROFESSOR_EMAILS` / `ADMIN_EMAILS` obtiennent leur rôle à la connexion.
269 −
270 −État des comptes en production au 2026-09-06 : le professeur (`boucsi02@uqo.ca`) a son mot de passe ; l'admin
271 −(`spbou4@icloud.com`) a reçu son courriel « choisis ton mot de passe » ; **19 étudiant·es sont inscrits sans avoir été
272 −invités** — le professeur déclenche l'envoi via « Inviter les 19 jamais invité·es ».
273 −
274 −## 8. RAG sur les notes de cours
275 −
276 −- **Source** : le HTML généré des sites de notes interactives (`dist/<cours>/seance/NN/index.html`, dépôts
277 − `uqo-imm1003` / `uqo-imm1033`), copié sur le nœud dans `~/apps/uqo-chat/content/<cours>/`. Aussi PDF, DOCX, PPTX,
278 − MD déposés par le professeur.
279 −- **Ingestion** (`rag/ingest.py`) : `selectolax` nettoie le HTML (scripts, SVG, widgets, navigation), reconvertit le
280 − KaTeX en `$…$` via l'annotation MathML, découpe par section (`chunking.py`, chevauchement), calcule un hachage par
281 − passage, écrit `course_documents` + `course_chunks` avec l'URL publique (`SITE_URLS`) et l'ancre.
282 −- **Index** : **BM25 en mémoire** (`rag/retriever.py`), reconstruit au démarrage (`/ready` renvoie le nombre de
283 − passages : 714 pour les deux cours) et après chaque ingestion.
284 −- **Embeddings** : optionnels via un endpoint OpenAI-compatible (`EMBEDDINGS_BASE_URL`, `MODEL_EMBEDDINGS`) ;
285 − OpenRouter n'en expose aucun (vérifié 2026-09-05), donc BM25 seul en production.
286 −- **Après un rebuild des sites de notes**, ré-ingérer (voir §15).
287 −
288 −## 9. Bac à sable Python (`sandbox-runner`)
22 +Les manifestes Kubernetes (`k8s/`) et `docker-compose.yml` reproduisent la cible décrite dans la
23 +spécification (Postgres + pgvector, Redis, MinIO, sandbox durci) pour un futur cluster ; la
24 +production actuelle tourne sur un nœud Mac du cluster via `mld` (voir `deploy/`).
289 25
290 −Service FastAPI minimal (`server.py`) : `GET /healthz`, `POST /run {code ≤ 200 000 car., files_in[], timeout_s 1–60}`,
291 −jeton `SANDBOX_TOKEN` en `Authorization: Bearer`, `SANDBOX_MAX_PARALLEL` = 4 exécutions simultanées (pool de threads +
292 −sémaphore).
293 −
294 −`runner.py` — couches d'isolation :
295 −
296 −| Couche | Détail |
297 −|---|---|
298 −| macOS | profil **`sandbox-exec`** (seatbelt) : réseau interdit, écriture uniquement dans le répertoire de la course, lecture de `~` bloquée |
299 −| Linux (conteneur) | pod durci attendu (NetworkPolicy deny-all, rootfs lecture seule, `cap_drop ALL`, `pids_limit 64`, 512 Mo) |
300 −| Toujours | `python -I -B`, rlimits (CPU, fichiers, processus ; `RLIMIT_AS` 512 Mo désactivé sur Darwin car il casse numpy), délai mur, sortie tronquée à 50 Ko, ≤ 10 fichiers / 20 Mo en sortie |
301 −| Prélude | `chdir` dans le répertoire de travail, `matplotlib` en `Agg` (130 dpi, grille), figures ouvertes sauvegardées automatiquement et renvoyées en base64 |
302 −
303 −Les fichiers déposés **et** les artefacts déjà générés dans la conversation (classeurs, graphiques, documents)
304 −sont copiés dans `inputs/` avant l'exécution ; les fichiers produits reviennent comme artefacts.
305 −
306 −## 10. Frontend (React PWA)
307 −
308 −- **Pile** : React 18, Vite 5, TypeScript 5, Tailwind 3, zustand, TanStack Query, react-router 6, react-markdown +
309 − remark-gfm + remark-math + rehype-katex, `shiki/core` (langages ciblés ; le paquet complet précachait 10 Mo), Radix
310 − (dialog, dropdown, tooltip), lucide-react, recharts, `@microsoft/fetch-event-source` (SSE avec en-têtes).
311 −- **Routes** : `/connexion`, `/mot-de-passe` (choix / réinitialisation), `/confidentialite`, `/professeur` (garde
312 − rôle), `/admin` (garde rôle), `/` et `/c/:id` (chat), `*` → `/`.
313 −- **Marque** : couleur `#0F6180` alignée sur le mot-symbole officiel UQO (`public/uqo-logo*.png`, recoloré depuis
314 − la source du dépôt de cours ; `VITE_USE_OFFICIAL_LOGO`), icônes PWA et image OG régénérées, police système.
315 −- **Mobile-first** : cible 375 px ; tiroir groupé par date, bulles et composer flottant, squelettes de chargement,
316 − bouton de défilement dégagé du composer, lien « mot de passe oublié » sous le champ sans retour à la ligne.
317 −- **PWA** (`vite-plugin-pwa`) : app shell + cache lecture (≈ 2 Mo précachés), manifest, icônes maskable.
318 −- **`lib/math-guard.ts`** : applique la règle Pandoc pour ne rendre en LaTeX que les `$…$` plausibles (test vitest).
319 −- **Build** : `tsc --noEmit && vite build` → `frontend/dist` servi par l'API en production.
320 −
321 −## 11. Configuration (variables d'environnement)
322 −
323 −Lues par `pydantic-settings` depuis `.env` (racine ou `backend/`) puis l'environnement ; gabarit complet dans
324 −`.env.example`. Les valeurs de production sont dans le manifeste `M1M32:~/dispatch/apps/uqo-chat.json` (jamais dans
325 −le dépôt).
326 −
327 −| Groupe | Variables (défaut) |
328 −|---|---|
329 −| App | `APP_ENV` (development), `APP_URL`, `PORT` (8190), `CORS_ORIGINS`, `LOG_LEVEL`, `DATA_DIR` (`./data`), `FRONTEND_DIST`, `COURSES` (IMM1003,IMM1033), `TERM_LABEL` |
330 −| LLM | `OPENROUTER_API_KEY`, `OPENROUTER_BASE_URL`, `MODEL_TUTOR_PRIMARY` (anthropic/claude-fable-5.1), `MODEL_TUTOR_FALLBACK` (openai/gpt-5.5), `MODEL_REASONING` (anthropic/claude-opus-4.6), `MODEL_FAST` (openai/gpt-5.4-nano), `MODEL_VISION` (anthropic/claude-sonnet-4.6), `LLM_MAX_TOOL_ITERATIONS` (12), `LLM_TIMEOUT_SECONDS` (120), `LLM_MAX_OUTPUT_TOKENS` (16000), `LLM_TURN_TIMEOUT_SECONDS` (300), `LLM_MONTHLY_BUDGET_USD` (2000) |
331 −| Embeddings (optionnel) | `EMBEDDINGS_BASE_URL`, `EMBEDDINGS_API_KEY`, `MODEL_EMBEDDINGS` |
332 −| Web | `FIRECRAWL_API_KEY`, `FIRECRAWL_BASE_URL`, `WEB_SEARCH_CACHE_TTL_S` (21600) |
333 −| Données | `DATABASE_URL` (vide = SQLite `DATA_DIR/uqochat.db`), `REDIS_URL` (vide = mémoire) |
334 −| Sandbox | `SANDBOX_URL` (http://127.0.0.1:8191), `SANDBOX_TOKEN`, `SANDBOX_TIMEOUT_S` (30), `SANDBOX_HEAVY_TIMEOUT_S` (60) ; côté runner : `SANDBOX_MAX_PARALLEL`, `SANDBOX_PYTHON` |
335 −| Auth | `JWT_SECRET`, `JWT_TTL_HOURS` (24), `REFRESH_TTL_DAYS` (30), `ALLOWED_EMAIL_DOMAINS` (uqo.ca), `INVITED_EMAILS`, `PROFESSOR_EMAILS`, `ADMIN_EMAILS`, `INVITE_TTL_DAYS` (14), `RESET_TTL_MINUTES` (60) |
336 −| Courriel | `RESEND_API_KEY`, `RESEND_BASE_URL`, `MAIL_FROM` (UQO-Chat <no-reply@uqo-chat.app>), `MAIL_REPLY_TO`, repli `SMTP_HOST/PORT/USER/PASSWORD/FROM` |
337 −| Limites | `RATE_MESSAGES_PER_HOUR` (60), `RATE_MESSAGES_PER_DAY` (400), `RATE_SANDBOX_PER_HOUR` (10), `RATE_WEBSEARCH_PER_DAY` (30), `RATE_UPLOADS_PER_DAY` (20), `UPLOAD_MAX_MB` (20), `FILE_TTL_DAYS` (7), `FILE_PINNED_TTL_DAYS` (30), `MESSAGE_RETENTION_MONTHS` (12) |
338 −| Frontend (build) | `VITE_API_URL` (/api/v1), `VITE_USE_OFFICIAL_LOGO`, `VITE_COURSES` |
339 −
340 −Le domaine `uqo-chat.app` est vérifié chez Resend (DNS GoDaddy) ; le CNAME `www` pointe vers ngrok.
341 −
342 −## 12. Développement local
26 +## Démarrage local
343 27
344 28 ```bash
345 −git clone gitsrv:~/srv/git/uqo-chat.git && cd uqo-chat
346 −cp .env.example .env # OPENROUTER_API_KEY, FIRECRAWL_API_KEY, RESEND_API_KEY, JWT_SECRET, PROFESSOR_EMAILS…
347 −make setup # uv venv 3.12 backend + sandbox-runner, npm install
348 −make migrate # schéma (create_all)
349 −make seed PROF=prof@uqo.ca # cours + compte professeur
29 +cp .env.example .env # OPENROUTER_API_KEY, FIRECRAWL_API_KEY, RESEND_API_KEY…
30 +make setup # venvs uv (backend, sandbox) + npm install
350 31 make sandbox & # :8191
351 −make api & # :8190 (sert frontend/dist s'il existe ; /api/docs en dev)
352 −make web # :5173, proxy /api → 8190
32 +make api & # :8190 (sert frontend/dist s'il existe)
33 +make web # :5173 avec proxy /api
353 34 make ingest COURSE=imm1033 SITE=~/Desktop/Academique/UQO/UQO_COURS/_Site_web/dist/imm1033
354 −make ingest COURSE=imm1003 SITE=~/Desktop/Academique/UQO/UQO_COURS/_Site_web/dist/imm1003
35 +make test && make lint
355 36 ```
356 37
357 −Prérequis : Python 3.12 via `uv`, Node 22, macOS pour `sandbox-exec` (sur Linux, utiliser `docker compose up`
358 −qui isole le sandbox avec `network_mode: none`). En dev, `POST /auth/forgot` renvoie `dev_link` pour se connecter
359 −sans courriel.
360 −
361 −## 13. Tests, lint, CI
362 −
363 −```bash
364 −make test # pytest (41 tests) + tsc --noEmit
365 −make lint # ruff (E, F, I, B, UP ; ligne 100) + tsc
366 −cd frontend && npm test # vitest (math-guard)
367 −python3 /tmp/uqo-qa/qa.py # QA Playwright : connexion + chat + captures 375/1440 + détection d'overflow (script local)
368 −```
369 −
370 −Tests backend : invitations et mots de passe (`respx` simule Resend), flux SSE OpenRouter, RAG (ingestion HTML +
371 −BM25), préfiltre du sandbox, coercition et normalisation de specs Excel, taux de la grille de comparables,
372 −`create_excel`, `financial_calc`, nouveaux outils (`make_chart`, `create_docx`…).
373 −
374 −CI GitHub Actions (`ci.yml`, si le dépôt est poussé sur GitHub) : ruff + pytest, `npm ci && npm run build`,
375 −construction des deux images Docker et analyse Trivy. `deploy.yml` (images ghcr + `kubectl apply -k`) correspond à la
376 −cible Kubernetes et **n'est pas** utilisé pour la production actuelle.
377 −
378 −## 14. Déploiement sur le cluster MacLustr (`mld`)
379 −
380 −L'app est orchestrée par **maclustr-dispatch (`mld`)** depuis la passerelle **M1M32**.
381 −
382 −Manifeste (`deploy/uqo-chat.manifest.json` = gabarit ; le vrai, avec secrets : `M1M32:~/dispatch/apps/uqo-chat.json`) :
38 +Connexion : le professeur inscrit les courriels des étudiant·es (onglet **Étudiants**) ; chacun·e reçoit
39 +un courriel Resend « Bienvenue sur UQO-Chat » avec un lien `/mot-de-passe?token=…` (valide
40 +`INVITE_TTL_DAYS`) pour choisir son mot de passe, puis se connecte avec courriel + mot de passe.
41 +« Première connexion ou mot de passe oublié » renvoie un lien (`RESET_TTL_MINUTES`). Seules les adresses
42 +inscrites (ou listées dans `PROFESSOR_EMAILS` / `ADMIN_EMAILS` / `INVITED_EMAILS`) peuvent demander un lien.
43 +Sans `RESEND_API_KEY` (ni SMTP), les liens sont affichés dans le tableau de bord pour être copiés ; en dev,
44 +`/auth/forgot` renvoie `dev_link`.
383 45
384 −| Clé | Valeur |
385 −|---|---|
386 −| `domain` / `port` / `health_path` | `www.uqo-chat.app` / `8190` / `/api/v1/ready` |
387 −| `requires` | runtimes `pm2`, `ngrok`, `uv`, `uv-python@3.12` · 3 Go RAM · ports 8190, 8191 (≈ 900 Mo observés) |
388 −| `placement` | `prefer: M4M64a`, `avoid: M3U96b` (réservé hfmarketdata), `M1M32` (passerelle) |
389 −| `sync_excludes` | `.venv/`, `data/`, `content/`, `.env`, `frontend/node_modules/`, caches, `.git/` |
390 −| `processes` | PM2 `uqo-chat-sandbox` (uvicorn `server:app` 127.0.0.1:8191, `max_memory_restart 2G`) · `uqo-chat-api` (uvicorn `app.main:app` 0.0.0.0:8190, keep-alive 75 s, `max_memory_restart 3G`, env de production) |
391 −| `ngrok` | PM2 `uqo-chat-ngrok` → `https://www.uqo-chat.app` |
392 −| `hooks.post_sync` | `uv venv` + `uv pip install -e .` (backend), `uv pip install -r requirements.txt` (sandbox), `mkdir -p data/files` |
393 −
394 −Procédure depuis le laptop (le dépôt = source de vérité ; **ne jamais éditer la copie du nœud**) :
46 +## Déploiement
395 47
396 48 ```bash
397 −make test lint build # vérifie puis produit frontend/dist
398 −git add -A && git commit -m "…" && git push origin main
399 −~/Desktop/cluster-skill/mld stage $PWD uqo-chat # laptop → M1M32:~/dispatch/stage/uqo-chat/dir
400 −~/Desktop/cluster-skill/mld deploy uqo-chat # nœud par score (ou --node M4M64a) ; santé locale + publique ; registre
401 −# raccourci équivalent : make deploy [NODE=M4M64a]
49 +make build # frontend/dist
50 +~/Desktop/cluster-skill/mld stage $PWD uqo-chat # laptop → passerelle
51 +~/Desktop/cluster-skill/mld deploy uqo-chat # nœud choisi par score (--node X pour forcer)
402 52 ```
403 53
404 −`data/` (SQLite + fichiers) et `content/` (sites ingérés) sont **exclus de la synchronisation** : ils persistent sur
405 −le nœud. Un `mld move uqo-chat --to <nœud>` déplace l'app mais il faut alors recopier `data/` et `content/`
406 −manuellement (ou ré-ingérer).
407 −
408 −## 15. Exploitation
54 +Le manifeste de production (`M1M32:~/dispatch/apps/uqo-chat.json`) contient les secrets ; la copie
55 +du dépôt (`deploy/uqo-chat.manifest.json`) n'a que des gabarits. Après un premier déploiement,
56 +ingérer le matériel de cours sur le nœud :
409 57
410 58 ```bash
411 −NODE=M4M64a # vérifier avec : ~/Desktop/cluster-skill/mld status | grep uqo-chat
412 −ssh $NODE 'pm2 ls | grep uqo-chat; pm2 logs uqo-chat-api --lines 100 --nostream'
413 −ssh $NODE 'pm2 restart uqo-chat-api' # après changement de manifeste / env
414 −curl -s https://www.uqo-chat.app/api/v1/ready # {"ok":true,"chunks":714}
415 −
416 −# Ré-ingestion des notes de cours après un rebuild des sites (dépôts uqo-imm1003 / uqo-imm1033)
417 −scp -r ~/Desktop/Academique/UQO/UQO_COURS/_Site_web/dist/imm10{03,33} $NODE:~/apps/uqo-chat/content/
418 −ssh $NODE 'cd ~/apps/uqo-chat/backend && for c in imm1003 imm1033; do \
59 +scp -r ~/Desktop/Academique/UQO/UQO_COURS/_Site_web/dist/imm10{03,33} <nœud>:~/apps/uqo-chat/content/
60 +ssh <nœud> 'cd ~/apps/uqo-chat/backend && for c in imm1003 imm1033; do \
419 61 DATA_DIR=~/apps/uqo-chat/data .venv/bin/python -m scripts.ingest --course $c --site ../content/$c; done'
420 −ssh $NODE 'pm2 restart uqo-chat-api'
421 −
422 −# Sauvegarde des données
423 −ssh $NODE 'sqlite3 ~/apps/uqo-chat/data/uqochat.db ".backup /tmp/uqochat-$(date +%F).db"'
62 +pm2 restart uqo-chat-api
424 63 ```
425 64
426 −- Registre `mld` (`M1M32:~/dispatch/registry.json`) : nœud, IP LAN, port, santé, processus ; consommé par les apps
427 − de monitoring MacLustr (macOS / iOS).
428 −- Réglages modifiables à chaud en base (`app_settings`) et depuis l'onglet **Réglages** du professeur.
429 −- Changer de modèle : `MODEL_*` dans le manifeste M1M32, `mld deploy uqo-chat` (ou `pm2 restart` avec env mis à jour).
430 − Vérifier le slug sur https://openrouter.ai/models avant.
431 −
432 −## 16. Coûts LLM
65 +## Écarts assumés par rapport à la spécification
433 66
434 −- Chaque appel est enregistré dans `llm_usage` (modèle, jetons, coût USD) ; `/admin` agrège par jour, modèle et
435 − étudiant·e (haché). Budget `LLM_MONTHLY_BUDGET_USD` = 2 000 $ US ; dépassement → refus poli avec message.
436 −- Ordres de grandeur mesurés : tour simple avec RAG ≈ 0,12 $ US (≈ 30 k jetons d'entrée avec outils et passages) ;
437 − tour riche (4 outils, classeur + graphique) ≈ 0,80 $ US.
438 −
439 −## 17. Vie privée, sécurité, Loi 25
440 −
441 −- Consentement explicite à la première connexion (`POST /me/consent`), page `/confidentialite`, export et
442 − **suppression du compte** (`DELETE /me` : anonymisation des messages, purge des fichiers).
443 −- Analytics du professeur **anonymisées** (identifiants hachés, `core/security.hash_user_id`), aucun contenu de
444 − message ; logs sans contenu ni courriel.
445 −- Rétention : fichiers 7 j (30 j épinglés), messages anonymisés après 12 mois (tâche horaire).
446 −- Secrets uniquement dans le manifeste M1M32 et `.env` local (ignoré par git) ; `SecretStr` côté config.
447 −- Code étudiant / LLM jamais exécuté dans l'API ; sandbox sans réseau ; CSP stricte ; JWT signés ; mots de passe PBKDF2 ;
448 − liens à usage unique et expirants ; limitation de débit sur `/auth/forgot` et sur les messages / outils.
449 −- Logo UQO : l'autorisation formelle du Service des communications de l'UQO reste à obtenir (`VITE_USE_OFFICIAL_LOGO`).
450 −
451 −## 18. Écarts assumés par rapport à la spécification
452 −
453 −| Spécification (CLAUDE.md d'origine) | Réalisation actuelle | Pourquoi |
67 +| Spécification | Réalisation actuelle | Pourquoi |
454 68 |---|---|---|
455 −| PostgreSQL + pgvector, Redis, MinIO, arq | SQLite (SQLAlchemy async), cache / limiteur en mémoire, fichiers sur disque, tâches asyncio | Déploiement mono-nœud sans dépendances ; `DATABASE_URL` accepte déjà Postgres, `k8s/` décrit la cible complète |
456 −| Embeddings `openai/text-embedding-3-large` via OpenRouter | BM25 en mémoire + embeddings optionnels via endpoint OpenAI-compatible | OpenRouter n'expose aucun modèle d'embeddings (vérifié 2026-09-05) |
457 −| Lien magique SMTP à chaque connexion | Invitation Resend → mot de passe choisi (PBKDF2) ; « mot de passe oublié » par courriel ; liste blanche gérée par le professeur | Une seule étape par courriel puis connexion classique ; Resend plutôt qu'un SMTP UQO |
458 −| Pods sandbox gVisor / Job k8s | Service `sandbox-runner` + `sandbox-exec` macOS + rlimits + timeout | Équivalent local ; Dockerfile + NetworkPolicy prêts pour k8s |
459 −| Alembic | `create_all` + `_add_missing_columns` | Migration initiale à écrire au premier changement de schéma incompatible |
460 −| Kubernetes + ngrok operator | `mld` + PM2 + agent ngrok sur un nœud Mac | Infrastructure réelle = cluster MacLustr |
461 −| Export PDF de conversation, hors-ligne complet | Non faits (PWA : app shell + cache lecture) | Phase 2 / 3 |
462 −
463 −## 19. Feuille de route
464 −
465 −Export PDF d'une conversation ; file d'attente hors-ligne (Background Sync) ; évaluation pédagogique automatique en
466 −CI (40 questions par cours, juge `MODEL_FAST`) ; tests adverses complets du sandbox ; Alembic ; migration éventuelle
467 −Postgres + pgvector ; autorisation officielle du logo UQO ; alignement des numéros de version (`pyproject`,
468 −`package.json`) sur v0.5.
469 −
470 −## 20. Historique des versions
471 −
472 −| Date | Commit | Version | Contenu |
473 −|---|---|---|---|
474 −| 2026-09-06 | `cd08d44` | v0.1.0 | Création : FastAPI + agent OpenRouter, 7 outils, sandbox, RAG, React PWA ; déployé `mld` sur M4M64a ; www.uqo-chat.app |
475 −| 2026-09-06 | `afb5ca4` | | `HEAD` accepté sur les routes SPA (vérifications d'uptime) |
476 −| 2026-09-06 | `f261ace` | v0.2 | Outils robustes (coercition, comparables flexibles, normalisation de spec, réparation JSON, sortie 16 k), comptes étudiants + liens d'invitation + code d'accès dans le tableau de bord |
477 −| 2026-09-06 | `9e6193a` | | Grille de comparables : ajustements par formule (sujet + taux unitaires) ; correction du collage de courriels en lot |
478 −| 2026-09-06 | `b3a57c0` | | Connexion par mot de passe (PBKDF2), changement de mot de passe, mots de passe fixés par le professeur, migration de colonnes |
479 −| 2026-09-06 | `7a51d30` · `d896f91` | | `anthropic/claude-fable-5.1` modèle par défaut ; budget mensuel 2 000 $ US |
480 −| 2026-09-06 | `1b07883` · `a783830` | v0.3 | 5 nouveaux outils (`inspect_excel`, `edit_excel`, `appraisal_calc`, `unit_convert`, `make_chart`, `create_docx`), artefacts visibles du sandbox, cartes refaites (éditeur Python, aperçu Excel multi-feuilles, « Modifier avec le tuteur ») |
481 −| 2026-09-06 | `d0aea63` · `1b12758` | v0.4 | Mot-symbole officiel UQO + bleu `#0F6180`, passe « premium mobile » (héros, tiroir par date, bulles, composer flottant, squelettes, icônes PWA / OG) |
482 −| 2026-09-06 | `d9fc592` · `f7b72d8` | **v0.5** | **Liste blanche + invitations Resend remplacent le code d'accès** ; lien « mot de passe oublié » sous le champ (375 px) |
483 −| 2026-09-06 | — | | README détaillé (ce document) |
484 −
485 −## 21. Pièges connus
486 −
487 −- `sandbox-exec` bloque bien le réseau et la lecture de `~`, mais `RLIMIT_AS` casse numpy sur macOS → désactivé sur Darwin.
488 −- `shiki` complet précache 10 Mo dans la PWA → utiliser `shiki/core` avec les langages ciblés.
489 −- Les montants « 185 000 $ » en prose cassent `remark-math` → `frontend/src/lib/math-guard.ts` (règle Pandoc).
490 −- Les gros arguments d'outils étaient tronqués à 4 k jetons de sortie (« JSON invalide ») → 16 k + réparation JSON +
491 − refus d'exécuter un appel tronqué.
492 −- Le manifeste `deploy/` du dépôt n'a que des gabarits `{{…}}` : ne pas le copier tel quel sur M1M32 sans renseigner
493 − les secrets.
494 −- Après `mld move`, `data/` et `content/` ne suivent pas (exclus du sync) : les recopier ou ré-ingérer.
495 −- PM2 sous zsh : `pm2` n'est pas dans le PATH des hooks → les hooks exportent `~/.local/bin` et `/opt/homebrew/bin`.
496 −
497 −## 22. Droits et licence
498 −
499 −© 2026 Simon-Pierre Boucher. Dépôt privé, tous droits réservés. Contenu pédagogique indexé : notes de cours
500 −IMM1003 / IMM1033 © Simon-Pierre Boucher, UQO. Le nom et le logo UQO appartiennent à l'Université du Québec en
501 −Outaouais. Modèles fournis par OpenRouter (Anthropic, OpenAI) ; recherche web par Firecrawl ; courriels par Resend.
502 −
503 −## 23. Contact
504 −
505 −**Simon-Pierre Boucher**
506 −Courriel : **contact@spboucher.ai**
507 −Git personnel : https://git.spboucher.ai (spbgit, dépôt `uqo-chat`)
508 −Application : https://www.uqo-chat.app · notes de cours : https://www.uqo-imm1003.app · https://www.uqo-imm1033.app
69 +| PostgreSQL + pgvector, Redis, MinIO, arq | SQLite (SQLAlchemy async), cache/limiteur en mémoire, fichiers sur disque, tâches asyncio | Déploiement mono-nœud sans dépendances ; `DATABASE_URL` accepte déjà Postgres, `k8s/` décrit la cible complète |
70 +| Embeddings `openai/text-embedding-3-large` via OpenRouter | BM25 (index en mémoire) + embeddings optionnels via un endpoint OpenAI-compatible (`EMBEDDINGS_BASE_URL`) | OpenRouter n'expose aucun modèle d'embeddings (vérifié 2026-09-05) |
71 +| Lien magique SMTP à chaque connexion | Invitation Resend → mot de passe choisi par l'étudiant·e (PBKDF2), « mot de passe oublié » par courriel ; liste blanche gérée par le professeur | Une seule étape par courriel, puis connexion classique ; Resend (`RESEND_API_KEY`) plutôt qu'un SMTP UQO |
72 +| Pods sandbox gVisor / Job k8s | Service `sandbox-runner` séparé, `sandbox-exec` macOS (réseau interdit, écriture confinée) + rlimits + timeout | Équivalent local ; `sandbox-runner/Dockerfile` + NetworkPolicy prêts pour k8s |
73 +| Alembic | `create_all` au démarrage | Une migration initiale sera ajoutée au premier changement de schéma |
74 +| Export PDF de conversation, mode hors-ligne complet | Non faits (PWA : app shell + cache lecture) | Phase 2/3 |
added content/imm1003/404.html +115 −0
@@ -0,0 +1,115 @@
1 +<!DOCTYPE html>
2 +<html lang="fr" data-theme="light">
3 +<head>
4 +<meta charset="utf-8">
5 +<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
6 +<title>Page introuvable · IMM1003 — Éléments d’évaluation immobilière</title>
7 +<meta name="description" content="Principes, méthodes et pratique de l’évaluation immobilière au Québec : fondements, cadre professionnel, analyse de marché et les trois méthodes d’évaluation.">
8 +<meta name="author" content="Simon-Pierre Boucher — Université du Québec en Outaouais">
9 +<meta name="theme-color" content="#0f6180">
10 +<meta property="og:site_name" content="IMM1003 — UQO">
11 +<meta property="og:title" content="Page introuvable · IMM1003 — Éléments d’évaluation immobilière">
12 +<meta property="og:description" content="Principes, méthodes et pratique de l’évaluation immobilière au Québec : fondements, cadre professionnel, analyse de marché et les trois méthodes d’évaluation.">
13 +<meta property="og:type" content="website">
14 +<meta property="og:url" content="https://www.uqo-imm1003.app/404.html">
15 +<meta property="og:image" content="https://www.uqo-imm1003.app/assets/og.png">
16 +<meta property="og:image:width" content="1200"><meta property="og:image:height" content="630">
17 +<meta property="og:image:alt" content="IMM1003 — Éléments d’évaluation immobilière — UQO">
18 +<meta property="og:locale" content="fr_CA">
19 +<meta name="twitter:card" content="summary_large_image">
20 +<meta name="twitter:title" content="Page introuvable · IMM1003 — Éléments d’évaluation immobilière">
21 +<meta name="twitter:description" content="Principes, méthodes et pratique de l’évaluation immobilière au Québec : fondements, cadre professionnel, analyse de marché et les trois méthodes d’évaluation.">
22 +<meta name="twitter:image" content="https://www.uqo-imm1003.app/assets/og.png">
23 +<link rel="canonical" href="https://www.uqo-imm1003.app/404.html">
24 +<link rel="icon" href="/favicon.svg" type="image/svg+xml">
25 +<link rel="icon" href="/assets/brand/favicon-32.png" sizes="32x32" type="image/png">
26 +<link rel="icon" href="/favicon.ico" sizes="any">
27 +<link rel="apple-touch-icon" href="/assets/brand/apple-touch-icon.png">
28 +<link rel="manifest" href="/manifest.webmanifest">
29 +<link rel="preconnect" href="https://fonts.googleapis.com">
30 +<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
31 +<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fira+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400;1,600&family=Fraunces:opsz,wght@9..144,500;9..144,600;9..144,700&family=Source+Serif+4:ital,opsz,wght@0,8..60,400;0,8..60,600;0,8..60,700;1,8..60,400&display=swap">
32 +<link rel="stylesheet" href="/assets/katex/katex.min.css">
33 +<link rel="stylesheet" href="/assets/css/site.css">
34 +<script>(function(){try{var t=localStorage.getItem('uqo:theme');if(t)document.documentElement.dataset.theme=JSON.parse(t);var f=localStorage.getItem('uqo:fs');if(f&&JSON.parse(f))document.documentElement.dataset.fs=JSON.parse(f);}catch(e){}})();</script>
35 +
36 +</head>
37 +<body class="course-imm1003 " data-course="imm1003">
38 +
39 +<svg xmlns="http://www.w3.org/2000/svg" style="display:none" aria-hidden="true">
40 + <symbol id="i-book" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M2 4h6a4 4 0 0 1 4 4v12a3 3 0 0 0-3-3H2zM22 4h-6a4 4 0 0 0-4 4v12a3 3 0 0 1 3-3h7z"/></symbol>
41 + <symbol id="i-formula" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M3 12h3l3 8 4-16 3 8h5"/></symbol>
42 + <symbol id="i-bulb" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M9 18h6M10 22h4M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.3h6c0-1 .4-1.8 1-2.3A7 7 0 0 0 12 2z"/></symbol>
43 + <symbol id="i-pencil" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"/></symbol>
44 + <symbol id="i-warning" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0zM12 9v4M12 17h.01"/></symbol>
45 + <symbol id="i-hardhat" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M2 18h20M4 18v-3a8 8 0 0 1 5-7.4V12M20 18v-3a8 8 0 0 0-5-7.4V12M10 4h4v8h-4z"/></symbol>
46 + <symbol id="i-pen" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M12 19l7-7 3 3-7 7-3-3zM18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5zM2 2l7.6 7.6"/><circle cx="11" cy="11" r="2" fill="none" stroke="currentColor" stroke-width="2"/></symbol>
47 + <symbol id="i-map" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M1 6v16l7-4 8 4 7-4V2l-7 4-8-4zM8 2v16M16 6v16"/></symbol>
48 + <symbol id="i-star" viewBox="0 0 24 24"><path fill="currentColor" d="M12 2l3.1 6.3 6.9 1-5 4.9 1.2 6.9L12 17.8 5.8 21l1.2-6.9-5-4.9 6.9-1z"/></symbol>
49 + <symbol id="i-target" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="12" cy="12" r="6" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="12" cy="12" r="2" fill="currentColor"/></symbol>
50 + <symbol id="i-clipboard" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v0a2 2 0 0 1-2 2h-2a2 2 0 0 1-2-2zM9 14l2 2 4-4"/></symbol>
51 + <symbol id="i-check" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="2"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M8 12l3 3 5-6"/></symbol>
52 + <symbol id="i-search" viewBox="0 0 24 24"><circle cx="11" cy="11" r="7" fill="none" stroke="currentColor" stroke-width="2"/><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M20 20l-3.5-3.5"/></symbol>
53 + <symbol id="i-sun" viewBox="0 0 24 24"><circle cx="12" cy="12" r="4" fill="none" stroke="currentColor" stroke-width="2"/><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></symbol>
54 + <symbol id="i-menu" viewBox="0 0 24 24"><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M4 6h16M4 12h16M4 18h16"/></symbol>
55 + <symbol id="i-text" viewBox="0 0 24 24"><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M4 7V5h16v2M12 5v14M9 19h6"/></symbol>
56 + <symbol id="i-slides" viewBox="0 0 24 24"><rect x="2" y="3" width="20" height="14" rx="2" fill="none" stroke="currentColor" stroke-width="2"/><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M8 21h8M12 17v4"/></symbol>
57 + <symbol id="i-quiz" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="2"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3M12 17h.01"/></symbol>
58 + <symbol id="i-cards" viewBox="0 0 24 24"><rect x="3" y="6" width="14" height="16" rx="2" fill="none" stroke="currentColor" stroke-width="2"/><path fill="none" stroke="currentColor" stroke-width="2" d="M7 2h12a2 2 0 0 1 2 2v14"/></symbol>
59 + <symbol id="i-calc" viewBox="0 0 24 24"><rect x="4" y="2" width="16" height="20" rx="2" fill="none" stroke="currentColor" stroke-width="2"/><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M8 6h8M8 11h.01M12 11h.01M16 11h.01M8 15h.01M12 15h.01M16 15h.01M8 19h.01M12 19h.01M16 19h.01"/></symbol>
60 + <symbol id="i-download" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/></symbol>
61 + <symbol id="i-eye" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3" fill="none" stroke="currentColor" stroke-width="2"/></symbol>
62 + <symbol id="i-arrow" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M13 6l6 6-6 6"/></symbol>
63 + <symbol id="i-bib" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></symbol>
64 + <symbol id="i-list" viewBox="0 0 24 24"><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"/></symbol>
65 + <symbol id="i-note" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M14 3v4a1 1 0 0 0 1 1h4M17 21H7a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7l5 5v11a2 2 0 0 1-2 2zM9 13h6M9 17h6"/></symbol>
66 + <symbol id="i-audio" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M11 5 6 9H2v6h4l5 4zM15.5 8.5a5 5 0 0 1 0 7M19 5a10 10 0 0 1 0 14"/></symbol>
67 + <symbol id="i-up" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M12 19V5M5 12l7-7 7 7"/></symbol>
68 + <symbol id="i-dumbbell" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M6 5v14M18 5v14M3 8v8M21 8v8M6 12h12"/></symbol>
69 + <symbol id="i-game" viewBox="0 0 24 24"><rect x="2" y="7" width="20" height="12" rx="4" fill="none" stroke="currentColor" stroke-width="2"/><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M7 11v4M5 13h4M15 12h.01M18 14h.01"/></symbol>
70 + <symbol id="i-chart" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M3 3v18h18M7 15l4-5 4 3 5-7"/></symbol>
71 + <symbol id="i-progress" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M4 20V10M10 20V4M16 20v-8M22 20H2"/></symbol>
72 + <symbol id="i-network" viewBox="0 0 24 24"><circle cx="12" cy="12" r="3" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="4" cy="6" r="2" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="20" cy="6" r="2" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="4" cy="18" r="2" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="20" cy="18" r="2" fill="none" stroke="currentColor" stroke-width="2"/><path stroke="currentColor" stroke-width="2" d="M6 7l4 3M18 7l-4 3M6 17l4-3M18 17l-4-3"/></symbol>
73 + <symbol id="i-report" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zM14 2v6h6M8 17l3-4 2 2 3-5"/></symbol>
74 +</svg>
75 +
76 +<a class="skip" href="#main">Aller au contenu</a>
77 +<header class="topbar">
78 + <div class="topbar-inner">
79 + <a class="brand" href="/" aria-label="IMM1003 — accueil"><img class="brand-logo" src="/assets/brand/uqo-logo.png" alt="UQO" width="568" height="238"><span class="brand-sep"></span><span class="brand-text"><span class="brand-code">IMM1003</span><span class="brand-title">Éléments d’évaluation immobilière</span></span></a>
80 + <nav class="topnav" aria-label="Navigation principale"><div class="dd"><button type="button" aria-expanded="false" aria-haspopup="true">Séances <span class="caret" aria-hidden="true">▾</span></button><div class="dd-menu wide"><div class="dd-part"><i style="background:#2976bb"></i>Partie I — Fondements de l’évaluation immobilière</div><a href="/seance/01/" data-ch="01"><span class="pastille" style="background:#2976bb">1</span><span>Introduction à l'évaluation immobilière</span></a><a href="/seance/02/" data-ch="02"><span class="pastille" style="background:#2976bb">2</span><span>Le cadre professionnel au Québec</span></a><a href="/seance/03/" data-ch="03"><span class="pastille" style="background:#2976bb">3</span><span>Les principes fondamentaux de l'évaluation</span></a><div class="dd-part"><i style="background:#0f8b8d"></i>Partie II — Valeur, marché et données</div><a href="/seance/04/" data-ch="04"><span class="pastille" style="background:#0f8b8d">4</span><span>La valeur : concepts et types</span></a><a href="/seance/05/" data-ch="05"><span class="pastille" style="background:#0f8b8d">5</span><span>Le marché immobilier québécois</span></a><a href="/seance/06/" data-ch="06"><span class="pastille" style="background:#0f8b8d">6</span><span>Collecte et analyse des données</span></a><a href="/seance/07/" data-ch="07"><span class="pastille" style="background:#0f8b8d">7</span><span>Examen mi-session : révision des blocs 1 et 2</span></a><div class="dd-part"><i style="background:#cca424"></i>Partie III — Les trois méthodes d’évaluation</div><a href="/seance/08/" data-ch="08"><span class="pastille" style="background:#cca424">8</span><span>La méthode de comparaison — Partie 1 : principes et sélection des comparables</span></a><a href="/seance/09/" data-ch="09"><span class="pastille" style="background:#cca424">9</span><span>La méthode de comparaison — Partie 2 : ajustements et réconciliation</span></a><a href="/seance/10/" data-ch="10"><span class="pastille" style="background:#cca424">10</span><span>La méthode du coût</span></a><a href="/seance/11/" data-ch="11"><span class="pastille" style="background:#cca424">11</span><span>La méthode du revenu — Partie 1 : du revenu brut au RNE</span></a><a href="/seance/12/" data-ch="12"><span class="pastille" style="background:#cca424">12</span><span>La méthode du revenu — Partie 2 : le taux et le DCF</span></a><div class="dd-part"><i style="background:#6b4fbb"></i>Partie IV — Synthèse et pratique professionnelle</div><a href="/seance/13/" data-ch="13"><span class="pastille" style="background:#6b4fbb">13</span><span>Le rapport d'évaluation</span></a><a href="/seance/14/" data-ch="14"><span class="pastille" style="background:#6b4fbb">14</span><span>Révision générale et cas intégrateur</span></a><div class="dd-part">Annexes</div><a href="/aide-memoire/"><span class="pastille">A</span><span>Aide-mémoire des formules</span></a><a href="/glossaire/"><span class="pastille">B</span><span>Glossaire</span></a><a href="/rapport/"><span class="pastille" style="background:var(--teal)">R</span><span>Rapport — Le marché de l’habitation au Québec</span></a></div></div><div class="dd"><button type="button" aria-expanded="false" aria-haspopup="true">Réviser <span class="caret" aria-hidden="true">▾</span></button><div class="dd-menu "><a href="/aide-memoire/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span>Aide-mémoire<span class="dd-desc">Toutes les formules commentées</span></span></a><a href="/glossaire/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-book"/></svg></span><span>Glossaire<span class="dd-desc">Termes du métier, équivalents anglais</span></span></a><a href="/definitions/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-list"/></svg></span><span>Toutes les définitions<span class="dd-desc">Les formulations attendues aux examens</span></span></a><a href="/fiches/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-cards"/></svg></span><span>Fiches de révision<span class="dd-desc">Recto-verso, suivi d’acquisition</span></span></a><a href="/carte/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-network"/></svg></span><span>Carte du cours<span class="dd-desc">Les 14 séances et leurs objectifs en un coup d’œil</span></span></a><a href="/exercices/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-pencil"/></svg></span><span>Banque d’exercices<span class="dd-desc">Tous les exercices corrigés</span></span></a></div></div><div class="dd"><button type="button" aria-expanded="false" aria-haspopup="true">S’exercer <span class="caret" aria-hidden="true">▾</span></button><div class="dd-menu "><a href="/quiz/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-quiz"/></svg></span><span>Quiz et examens blancs<span class="dd-desc">QCM avec rétroaction, chronomètre</span></span></a><a href="/entrainement/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-dumbbell"/></svg></span><span>Entraînement<span class="dd-desc">Problèmes à données aléatoires, corrigés pas à pas</span></span></a><a href="/jeux/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-game"/></svg></span><span>Jeux de révision<span class="dd-desc">Association, vrai ou faux, remise en ordre</span></span></a><a href="/outils/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-calc"/></svg></span><span>Calculateurs<span class="dd-desc">Les formules en interactif</span></span></a><a href="/progression/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-progress"/></svg></span><span>Ma progression<span class="dd-desc">Lecture, quiz, objectifs, notes</span></span></a></div></div><div class="dd"><button type="button" aria-expanded="false" aria-haspopup="true">Ressources <span class="caret" aria-hidden="true">▾</span></button><div class="dd-menu "><a href="/diapositives/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-slides"/></svg></span><span>Diapositives<span class="dd-desc">Les 14 présentations en ligne</span></span></a><a href="/ressources/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-download"/></svg></span><span>Téléchargements<span class="dd-desc">Manuel, plan, TP, gabarits Excel</span></span></a><a href="/rapport/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-report"/></svg></span><span>Rapport marché QC<span class="dd-desc">Indices de prix, macro, abordabilité — 26 sections, 67 figures</span></span></a><a href="/bibliographie/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-bib"/></svg></span><span>Bibliographie<span class="dd-desc">Références citées</span></span></a><a href="/recherche/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-search"/></svg></span><span>Recherche<span class="dd-desc">Tout le manuel indexé</span></span></a></div></div></nav>
81 + <div class="topbar-actions">
82 + <button class="icon-btn search-btn" type="button" data-action="search" aria-label="Rechercher"><svg class="" aria-hidden="true"><use href="#i-search"/></svg><span>Rechercher</span><kbd>⌘K</kbd></button>
83 + <button class="icon-btn" type="button" data-action="theme" aria-label="Thème clair ou sombre" title="Thème"><svg class="" aria-hidden="true"><use href="#i-sun"/></svg></button>
84 + <button class="icon-btn menu-btn" type="button" aria-label="Menu" aria-expanded="false"><svg class="" aria-hidden="true"><use href="#i-menu"/></svg></button>
85 + </div>
86 + </div>
87 +
88 +</header>
89 +<main id="main" class="page" style="text-align:center;padding:80px 20px"><div class="eyebrow" style="justify-content:center">Erreur 404</div><h1 style="color:var(--bleu);font-family:var(--display)">Cette page n’existe pas</h1><p class="lead" style="margin:0 auto 24px">La valeur d’une page introuvable est nulle — mais la substitution est facile.</p><div class="hero-cta" style="justify-content:center"><a class="btn" href="/">Accueil</a><a class="btn btn-ghost" href="/recherche/">Rechercher</a></div></main>
90 +<footer class="site-footer">
91 + <div class="footer-inner">
92 + <div class="footer-brand">
93 + <img src="/assets/brand/uqo-logo-white.png" alt="UQO" width="140" height="59" style="width:140px;height:auto;margin-bottom:10px">
94 + <div class="brand-code">IMM1003</div>
95 + <div>Éléments d’évaluation immobilière</div>
96 + <div style="opacity:.7;margin-top:6px;font-size:.85rem">Automne 2026 · 3 crédits · premier cycle · 14 séances</div>
97 + <div style="margin-top:14px;font-size:.85rem">Simon-Pierre Boucher, professeur<br>Département des sciences administratives<br>Université du Québec en Outaouais<br><a href="mailto:simon-pierre.boucher@uqo.ca" style="display:inline;padding:0">simon-pierre.boucher@uqo.ca</a></div>
98 + </div>
99 + <div><h4>Étudier</h4><a href="/seance/01/">Séances</a><a href="/aide-memoire/">Aide-mémoire</a><a href="/glossaire/">Glossaire</a><a href="/definitions/">Toutes les définitions</a><a href="/carte/">Carte du cours</a><a href="/exercices/">Banque d’exercices</a></div>
100 + <div><h4>S’exercer</h4><a href="/quiz/">Quiz et examens blancs</a><a href="/entrainement/">Entraînement</a><a href="/jeux/">Jeux de révision</a><a href="/fiches/">Fiches de révision</a><a href="/outils/">Calculateurs</a><a href="/progression/">Ma progression</a></div>
101 + <div><h4>Ressources</h4><a href="/diapositives/">Diapositives</a><a href="/ressources/">Téléchargements</a><a href="/rapport/">Rapport — marché de l’habitation</a><a href="/bibliographie/">Bibliographie</a><a href="/recherche/">Recherche</a><a href="https://www.uqo-imm1033.app" rel="noopener">IMM1033 — Méthodes du coût en évaluation immobilière</a></div>
102 + </div>
103 + <div class="footer-legal"><div><span>© 2026 Simon-Pierre Boucher — Université du Québec en Outaouais. Document destiné aux étudiantes et étudiants inscrits au cours IMM1003 ; toute reproduction ou diffusion sans autorisation écrite de l’auteur est interdite.</span><span>Généré depuis les sources LaTeX · KaTeX · TikZ</span></div></div>
104 +</footer>
105 +<div id="search-modal" class="search-modal" role="dialog" aria-modal="true" aria-label="Recherche dans les notes">
106 + <div class="search-box">
107 + <input type="search" placeholder="Rechercher une notion, une formule, un exemple…" autocomplete="off" spellcheck="false">
108 + <div class="search-results"></div>
109 + <div class="search-foot"><span><kbd>↑</kbd><kbd>↓</kbd> naviguer</span><span><kbd>↵</kbd> ouvrir</span><span><kbd>Échap</kbd> fermer</span><span style="margin-left:auto"><a href="/recherche/">Page de recherche complète</a></span></div>
110 + </div>
111 +</div>
112 +
113 +<script src="/assets/js/app.js" defer></script>
114 +</body>
115 +</html>
added content/imm1003/aide-memoire/index.html +204 −0
@@ -0,0 +1,204 @@
1 +<!DOCTYPE html>
2 +<html lang="fr" data-theme="light">
3 +<head>
4 +<meta charset="utf-8">
5 +<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
6 +<title>Aide-mémoire des formules · IMM1003 — Éléments d’évaluation immobilière</title>
7 +<meta name="description" content="Principes, méthodes et pratique de l’évaluation immobilière au Québec : fondements, cadre professionnel, analyse de marché et les trois méthodes d’évaluation.">
8 +<meta name="author" content="Simon-Pierre Boucher — Université du Québec en Outaouais">
9 +<meta name="theme-color" content="#0f6180">
10 +<meta property="og:site_name" content="IMM1003 — UQO">
11 +<meta property="og:title" content="Aide-mémoire des formules · IMM1003 — Éléments d’évaluation immobilière">
12 +<meta property="og:description" content="Principes, méthodes et pratique de l’évaluation immobilière au Québec : fondements, cadre professionnel, analyse de marché et les trois méthodes d’évaluation.">
13 +<meta property="og:type" content="website">
14 +<meta property="og:url" content="https://www.uqo-imm1003.app/aide-memoire/">
15 +<meta property="og:image" content="https://www.uqo-imm1003.app/assets/og.png">
16 +<meta property="og:image:width" content="1200"><meta property="og:image:height" content="630">
17 +<meta property="og:image:alt" content="IMM1003 — Éléments d’évaluation immobilière — UQO">
18 +<meta property="og:locale" content="fr_CA">
19 +<meta name="twitter:card" content="summary_large_image">
20 +<meta name="twitter:title" content="Aide-mémoire des formules · IMM1003 — Éléments d’évaluation immobilière">
21 +<meta name="twitter:description" content="Principes, méthodes et pratique de l’évaluation immobilière au Québec : fondements, cadre professionnel, analyse de marché et les trois méthodes d’évaluation.">
22 +<meta name="twitter:image" content="https://www.uqo-imm1003.app/assets/og.png">
23 +<link rel="canonical" href="https://www.uqo-imm1003.app/aide-memoire/">
24 +<link rel="icon" href="/favicon.svg" type="image/svg+xml">
25 +<link rel="icon" href="/assets/brand/favicon-32.png" sizes="32x32" type="image/png">
26 +<link rel="icon" href="/favicon.ico" sizes="any">
27 +<link rel="apple-touch-icon" href="/assets/brand/apple-touch-icon.png">
28 +<link rel="manifest" href="/manifest.webmanifest">
29 +<link rel="preconnect" href="https://fonts.googleapis.com">
30 +<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
31 +<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fira+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400;1,600&family=Fraunces:opsz,wght@9..144,500;9..144,600;9..144,700&family=Source+Serif+4:ital,opsz,wght@0,8..60,400;0,8..60,600;0,8..60,700;1,8..60,400&display=swap">
32 +<link rel="stylesheet" href="/assets/katex/katex.min.css">
33 +<link rel="stylesheet" href="/assets/css/site.css">
34 +<script>(function(){try{var t=localStorage.getItem('uqo:theme');if(t)document.documentElement.dataset.theme=JSON.parse(t);var f=localStorage.getItem('uqo:fs');if(f&&JSON.parse(f))document.documentElement.dataset.fs=JSON.parse(f);}catch(e){}})();</script>
35 +
36 +</head>
37 +<body class="course-imm1003 " data-course="imm1003">
38 +
39 +<svg xmlns="http://www.w3.org/2000/svg" style="display:none" aria-hidden="true">
40 + <symbol id="i-book" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M2 4h6a4 4 0 0 1 4 4v12a3 3 0 0 0-3-3H2zM22 4h-6a4 4 0 0 0-4 4v12a3 3 0 0 1 3-3h7z"/></symbol>
41 + <symbol id="i-formula" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M3 12h3l3 8 4-16 3 8h5"/></symbol>
42 + <symbol id="i-bulb" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M9 18h6M10 22h4M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.3h6c0-1 .4-1.8 1-2.3A7 7 0 0 0 12 2z"/></symbol>
43 + <symbol id="i-pencil" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"/></symbol>
44 + <symbol id="i-warning" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0zM12 9v4M12 17h.01"/></symbol>
45 + <symbol id="i-hardhat" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M2 18h20M4 18v-3a8 8 0 0 1 5-7.4V12M20 18v-3a8 8 0 0 0-5-7.4V12M10 4h4v8h-4z"/></symbol>
46 + <symbol id="i-pen" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M12 19l7-7 3 3-7 7-3-3zM18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5zM2 2l7.6 7.6"/><circle cx="11" cy="11" r="2" fill="none" stroke="currentColor" stroke-width="2"/></symbol>
47 + <symbol id="i-map" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M1 6v16l7-4 8 4 7-4V2l-7 4-8-4zM8 2v16M16 6v16"/></symbol>
48 + <symbol id="i-star" viewBox="0 0 24 24"><path fill="currentColor" d="M12 2l3.1 6.3 6.9 1-5 4.9 1.2 6.9L12 17.8 5.8 21l1.2-6.9-5-4.9 6.9-1z"/></symbol>
49 + <symbol id="i-target" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="12" cy="12" r="6" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="12" cy="12" r="2" fill="currentColor"/></symbol>
50 + <symbol id="i-clipboard" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v0a2 2 0 0 1-2 2h-2a2 2 0 0 1-2-2zM9 14l2 2 4-4"/></symbol>
51 + <symbol id="i-check" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="2"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M8 12l3 3 5-6"/></symbol>
52 + <symbol id="i-search" viewBox="0 0 24 24"><circle cx="11" cy="11" r="7" fill="none" stroke="currentColor" stroke-width="2"/><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M20 20l-3.5-3.5"/></symbol>
53 + <symbol id="i-sun" viewBox="0 0 24 24"><circle cx="12" cy="12" r="4" fill="none" stroke="currentColor" stroke-width="2"/><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></symbol>
54 + <symbol id="i-menu" viewBox="0 0 24 24"><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M4 6h16M4 12h16M4 18h16"/></symbol>
55 + <symbol id="i-text" viewBox="0 0 24 24"><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M4 7V5h16v2M12 5v14M9 19h6"/></symbol>
56 + <symbol id="i-slides" viewBox="0 0 24 24"><rect x="2" y="3" width="20" height="14" rx="2" fill="none" stroke="currentColor" stroke-width="2"/><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M8 21h8M12 17v4"/></symbol>
57 + <symbol id="i-quiz" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="2"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3M12 17h.01"/></symbol>
58 + <symbol id="i-cards" viewBox="0 0 24 24"><rect x="3" y="6" width="14" height="16" rx="2" fill="none" stroke="currentColor" stroke-width="2"/><path fill="none" stroke="currentColor" stroke-width="2" d="M7 2h12a2 2 0 0 1 2 2v14"/></symbol>
59 + <symbol id="i-calc" viewBox="0 0 24 24"><rect x="4" y="2" width="16" height="20" rx="2" fill="none" stroke="currentColor" stroke-width="2"/><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M8 6h8M8 11h.01M12 11h.01M16 11h.01M8 15h.01M12 15h.01M16 15h.01M8 19h.01M12 19h.01M16 19h.01"/></symbol>
60 + <symbol id="i-download" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/></symbol>
61 + <symbol id="i-eye" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3" fill="none" stroke="currentColor" stroke-width="2"/></symbol>
62 + <symbol id="i-arrow" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M13 6l6 6-6 6"/></symbol>
63 + <symbol id="i-bib" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></symbol>
64 + <symbol id="i-list" viewBox="0 0 24 24"><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"/></symbol>
65 + <symbol id="i-note" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M14 3v4a1 1 0 0 0 1 1h4M17 21H7a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7l5 5v11a2 2 0 0 1-2 2zM9 13h6M9 17h6"/></symbol>
66 + <symbol id="i-audio" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M11 5 6 9H2v6h4l5 4zM15.5 8.5a5 5 0 0 1 0 7M19 5a10 10 0 0 1 0 14"/></symbol>
67 + <symbol id="i-up" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M12 19V5M5 12l7-7 7 7"/></symbol>
68 + <symbol id="i-dumbbell" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M6 5v14M18 5v14M3 8v8M21 8v8M6 12h12"/></symbol>
69 + <symbol id="i-game" viewBox="0 0 24 24"><rect x="2" y="7" width="20" height="12" rx="4" fill="none" stroke="currentColor" stroke-width="2"/><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M7 11v4M5 13h4M15 12h.01M18 14h.01"/></symbol>
70 + <symbol id="i-chart" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M3 3v18h18M7 15l4-5 4 3 5-7"/></symbol>
71 + <symbol id="i-progress" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M4 20V10M10 20V4M16 20v-8M22 20H2"/></symbol>
72 + <symbol id="i-network" viewBox="0 0 24 24"><circle cx="12" cy="12" r="3" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="4" cy="6" r="2" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="20" cy="6" r="2" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="4" cy="18" r="2" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="20" cy="18" r="2" fill="none" stroke="currentColor" stroke-width="2"/><path stroke="currentColor" stroke-width="2" d="M6 7l4 3M18 7l-4 3M6 17l4-3M18 17l-4-3"/></symbol>
73 + <symbol id="i-report" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zM14 2v6h6M8 17l3-4 2 2 3-5"/></symbol>
74 +</svg>
75 +
76 +<a class="skip" href="#main">Aller au contenu</a>
77 +<header class="topbar">
78 + <div class="topbar-inner">
79 + <a class="brand" href="/" aria-label="IMM1003 — accueil"><img class="brand-logo" src="/assets/brand/uqo-logo.png" alt="UQO" width="568" height="238"><span class="brand-sep"></span><span class="brand-text"><span class="brand-code">IMM1003</span><span class="brand-title">Éléments d’évaluation immobilière</span></span></a>
80 + <nav class="topnav" aria-label="Navigation principale"><div class="dd"><button type="button" aria-expanded="false" aria-haspopup="true">Séances <span class="caret" aria-hidden="true">▾</span></button><div class="dd-menu wide"><div class="dd-part"><i style="background:#2976bb"></i>Partie I — Fondements de l’évaluation immobilière</div><a href="/seance/01/" data-ch="01"><span class="pastille" style="background:#2976bb">1</span><span>Introduction à l'évaluation immobilière</span></a><a href="/seance/02/" data-ch="02"><span class="pastille" style="background:#2976bb">2</span><span>Le cadre professionnel au Québec</span></a><a href="/seance/03/" data-ch="03"><span class="pastille" style="background:#2976bb">3</span><span>Les principes fondamentaux de l'évaluation</span></a><div class="dd-part"><i style="background:#0f8b8d"></i>Partie II — Valeur, marché et données</div><a href="/seance/04/" data-ch="04"><span class="pastille" style="background:#0f8b8d">4</span><span>La valeur : concepts et types</span></a><a href="/seance/05/" data-ch="05"><span class="pastille" style="background:#0f8b8d">5</span><span>Le marché immobilier québécois</span></a><a href="/seance/06/" data-ch="06"><span class="pastille" style="background:#0f8b8d">6</span><span>Collecte et analyse des données</span></a><a href="/seance/07/" data-ch="07"><span class="pastille" style="background:#0f8b8d">7</span><span>Examen mi-session : révision des blocs 1 et 2</span></a><div class="dd-part"><i style="background:#cca424"></i>Partie III — Les trois méthodes d’évaluation</div><a href="/seance/08/" data-ch="08"><span class="pastille" style="background:#cca424">8</span><span>La méthode de comparaison — Partie 1 : principes et sélection des comparables</span></a><a href="/seance/09/" data-ch="09"><span class="pastille" style="background:#cca424">9</span><span>La méthode de comparaison — Partie 2 : ajustements et réconciliation</span></a><a href="/seance/10/" data-ch="10"><span class="pastille" style="background:#cca424">10</span><span>La méthode du coût</span></a><a href="/seance/11/" data-ch="11"><span class="pastille" style="background:#cca424">11</span><span>La méthode du revenu — Partie 1 : du revenu brut au RNE</span></a><a href="/seance/12/" data-ch="12"><span class="pastille" style="background:#cca424">12</span><span>La méthode du revenu — Partie 2 : le taux et le DCF</span></a><div class="dd-part"><i style="background:#6b4fbb"></i>Partie IV — Synthèse et pratique professionnelle</div><a href="/seance/13/" data-ch="13"><span class="pastille" style="background:#6b4fbb">13</span><span>Le rapport d'évaluation</span></a><a href="/seance/14/" data-ch="14"><span class="pastille" style="background:#6b4fbb">14</span><span>Révision générale et cas intégrateur</span></a><div class="dd-part">Annexes</div><a href="/aide-memoire/"><span class="pastille">A</span><span>Aide-mémoire des formules</span></a><a href="/glossaire/"><span class="pastille">B</span><span>Glossaire</span></a><a href="/rapport/"><span class="pastille" style="background:var(--teal)">R</span><span>Rapport — Le marché de l’habitation au Québec</span></a></div></div><div class="dd current"><button type="button" aria-expanded="false" aria-haspopup="true">Réviser <span class="caret" aria-hidden="true">▾</span></button><div class="dd-menu "><a href="/aide-memoire/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span>Aide-mémoire<span class="dd-desc">Toutes les formules commentées</span></span></a><a href="/glossaire/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-book"/></svg></span><span>Glossaire<span class="dd-desc">Termes du métier, équivalents anglais</span></span></a><a href="/definitions/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-list"/></svg></span><span>Toutes les définitions<span class="dd-desc">Les formulations attendues aux examens</span></span></a><a href="/fiches/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-cards"/></svg></span><span>Fiches de révision<span class="dd-desc">Recto-verso, suivi d’acquisition</span></span></a><a href="/carte/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-network"/></svg></span><span>Carte du cours<span class="dd-desc">Les 14 séances et leurs objectifs en un coup d’œil</span></span></a><a href="/exercices/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-pencil"/></svg></span><span>Banque d’exercices<span class="dd-desc">Tous les exercices corrigés</span></span></a></div></div><div class="dd"><button type="button" aria-expanded="false" aria-haspopup="true">S’exercer <span class="caret" aria-hidden="true">▾</span></button><div class="dd-menu "><a href="/quiz/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-quiz"/></svg></span><span>Quiz et examens blancs<span class="dd-desc">QCM avec rétroaction, chronomètre</span></span></a><a href="/entrainement/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-dumbbell"/></svg></span><span>Entraînement<span class="dd-desc">Problèmes à données aléatoires, corrigés pas à pas</span></span></a><a href="/jeux/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-game"/></svg></span><span>Jeux de révision<span class="dd-desc">Association, vrai ou faux, remise en ordre</span></span></a><a href="/outils/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-calc"/></svg></span><span>Calculateurs<span class="dd-desc">Les formules en interactif</span></span></a><a href="/progression/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-progress"/></svg></span><span>Ma progression<span class="dd-desc">Lecture, quiz, objectifs, notes</span></span></a></div></div><div class="dd"><button type="button" aria-expanded="false" aria-haspopup="true">Ressources <span class="caret" aria-hidden="true">▾</span></button><div class="dd-menu "><a href="/diapositives/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-slides"/></svg></span><span>Diapositives<span class="dd-desc">Les 14 présentations en ligne</span></span></a><a href="/ressources/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-download"/></svg></span><span>Téléchargements<span class="dd-desc">Manuel, plan, TP, gabarits Excel</span></span></a><a href="/rapport/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-report"/></svg></span><span>Rapport marché QC<span class="dd-desc">Indices de prix, macro, abordabilité — 26 sections, 67 figures</span></span></a><a href="/bibliographie/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-bib"/></svg></span><span>Bibliographie<span class="dd-desc">Références citées</span></span></a><a href="/recherche/"><span class="dd-ico"><svg class="" aria-hidden="true"><use href="#i-search"/></svg></span><span>Recherche<span class="dd-desc">Tout le manuel indexé</span></span></a></div></div></nav>
81 + <div class="topbar-actions">
82 + <button class="icon-btn search-btn" type="button" data-action="search" aria-label="Rechercher"><svg class="" aria-hidden="true"><use href="#i-search"/></svg><span>Rechercher</span><kbd>⌘K</kbd></button>
83 + <button class="icon-btn" type="button" data-action="theme" aria-label="Thème clair ou sombre" title="Thème"><svg class="" aria-hidden="true"><use href="#i-sun"/></svg></button>
84 + <button class="icon-btn menu-btn" type="button" aria-label="Menu" aria-expanded="false"><svg class="" aria-hidden="true"><use href="#i-menu"/></svg></button>
85 + </div>
86 + </div>
87 +
88 +</header>
89 +
90 +<main id="main" class="page">
91 + <div class="page-head"><div class="eyebrow">Annexe A</div><h1>Aide-mémoire des formules</h1><p class="lead">Toutes les formules du cours, classées par thème, avec la définition de chaque variable et les repères chiffrés utiles.</p></div>
92 + <div class="two-col">
93 + <article class="prose"><p id="pA-1">Cette annexe regroupe toutes les formules du cours, classées par thème, avec la définition de chaque variable et les repères chiffrés utiles. C'est l'outil de révision par excellence : chaque formule doit pouvoir être écrite <em>et expliquée</em> de mémoire à l'examen final.</p>
94 +<h2 id="s-A-1" class="h-section"><span class="h-num">A.1</span><span class="h-text">Méthode de comparaison</span><a class="h-anchor" href="#s-A-1" aria-label="Lien vers cette section">#</a></h2>
95 +<div class="box box-form" id="form-A-1"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.1</span><span class="box-title">— valeur par comparaison</span><a class="box-anchor" href="#form-A-1" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>V</mi><mtext>sujet</mtext></msub><mtext>  </mtext><mo>≈</mo><mtext>  </mtext><mtext>Prix du comparable</mtext><mtext>  </mtext><mo>±</mo><mtext>  </mtext><mtext>Ajustements</mtext></mrow><annotation encoding="application/x-tex">V_{\text{sujet}} \;\approx\; \text{Prix du comparable} \;\pm\; \text{Ajustements}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3175em;"><span style="top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">sujet</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">Prix du comparable</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">±</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">Ajustements</span></span></span></span></span></span></div>
96 +<div class="center"><div class="table-wrap"><table class="tbl"><tbody><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>V</mi><mtext>sujet</mtext></msub></mrow><annotation encoding="application/x-tex">V_{\text{sujet}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3175em;"><span style="top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">sujet</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td>Indication de valeur du bien évalué</td></tr><tr><td>Prix du comparable</td><td>Prix de vente réel et vérifié du bien comparable</td></tr><tr><td>Ajustements</td><td>Corrections (en $ ou en %) pour chaque différence pertinente</td></tr></tbody></table></div></div></div></div>
97 +<div class="box box-form" id="form-A-2"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.2</span><span class="box-title">— ajustement en pourcentage</span><a class="box-anchor" href="#form-A-2" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>Ajustement (%)</mtext><mtext>  </mtext><mo>=</mo><mtext>  </mtext><mfrac><mrow><mtext>Diff</mtext><mover accent="true"><mtext>e</mtext><mo>ˊ</mo></mover><mtext>rence attribuable au facteur</mtext></mrow><mtext>Prix du comparable</mtext></mfrac><mo>×</mo><mn>100</mn></mrow><annotation encoding="application/x-tex">\text{Ajustement (\%)} \;=\; \frac{\text{Différence attribuable au facteur}}
98 +{\text{Prix du comparable}} \times 100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">Ajustement (%)</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.2519em;vertical-align:-0.8804em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">Prix du comparable</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">Diff</span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">e</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˊ</span></span></span></span></span></span></span><span class="mord">rence attribuable au facteur</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">100</span></span></span></span></span></div></div></div>
99 +<div class="box box-form" id="form-A-3"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.3</span><span class="box-title">— ajustement temporel (conditions de marché)</span><a class="box-anchor" href="#form-A-3" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>Ajustement temporel</mtext><mtext>  </mtext><mo>=</mo><mtext>  </mtext><mtext>Prix du comparable</mtext><mo>×</mo><msub><mi>g</mi><mtext>mensuel</mtext></msub><mo>×</mo><msub><mi>n</mi><mtext>mois</mtext></msub></mrow><annotation encoding="application/x-tex">\text{Ajustement temporel} \;=\; \text{Prix du comparable} \times g_{\text{mensuel}}
100 +\times n_{\text{mois}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">Ajustement temporel</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">Prix du comparable</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">mensuel</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3175em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">mois</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></div>
101 +<div class="center"><div class="table-wrap"><table class="tbl"><tbody><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>g</mi><mtext>mensuel</mtext></msub></mrow><annotation encoding="application/x-tex">g_{\text{mensuel}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">mensuel</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>Taux de variation mensuel du marché (p. ex. 0,5 %/mois)</td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>n</mi><mtext>mois</mtext></msub></mrow><annotation encoding="application/x-tex">n_{\text{mois}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3175em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">mois</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>Nombre de mois entre la vente et la date d'évaluation</td></tr></tbody></table></div></div></div></div>
102 +<div class="box box-rem" id="remarque-A-2"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-pen"/></svg></span><span class="box-label">règles de pratique — comparaison</span><a class="box-anchor" href="#remarque-A-2" aria-label="Lien">#</a></div><div class="box-body"><p id="pA-3">Les ajustements se font toujours <strong>du comparable vers le sujet</strong> : comparable supérieur <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> ajustement <strong>négatif</strong> ; comparable inférieur <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.3669em;"></span><span class="mrel">→</span></span></span></span> ajustement <strong>positif</strong>. Seuils usuels : ajustement <strong>net <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≤</mo></mrow><annotation encoding="application/x-tex">\leq</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mrel">≤</span></span></span></span> 15 %</strong> et <strong>brut <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≤</mo></mrow><annotation encoding="application/x-tex">\leq</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mrel">≤</span></span></span></span> 25 %</strong> du prix de vente ; au-delà, le comparable perd sa fiabilité.</p></div></div>
103 +<h2 id="s-A-2" class="h-section"><span class="h-num">A.2</span><span class="h-text">Méthode du coût</span><a class="h-anchor" href="#s-A-2" aria-label="Lien vers cette section">#</a></h2>
104 +<div class="box box-form" id="form-A-4"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.4</span><span class="box-title">— valeur par la méthode du coût</span><a class="box-anchor" href="#form-A-4" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><menclose notation="box"><mstyle scriptlevel="0" displaystyle="false"><mstyle scriptlevel="0" displaystyle="false"><mstyle scriptlevel="0" displaystyle="true"><mrow><mtext>  </mtext><mi>V</mi><mtext>  </mtext><mo>=</mo><mtext>  </mtext><msub><mi>C</mi><mtext>neuf</mtext></msub><mtext>  </mtext><mo>−</mo><mtext>  </mtext><msub><mi>D</mi><mtext>totale</mtext></msub><mtext>  </mtext><mo>+</mo><mtext>  </mtext><msub><mi>V</mi><mtext>terrain</mtext></msub><mtext>  </mtext></mrow></mstyle></mstyle></mstyle></menclose></mrow><annotation encoding="application/x-tex">\boxed{\;V \;=\; C_{\text{neuf}} \;-\; D_{\text{totale}} \;+\; V_{\text{terrain}}\;}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.5133em;vertical-align:-0.49em;"></span><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0233em;"><span style="top:-3.5133em;"><span class="pstrut" style="height:3.5133em;"></span><span class="boxpad"><span class="mord"><span class="mord"><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">neuf</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">totale</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3175em;"><span style="top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">terrain</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span></span></span></span></span><span style="top:-3.0233em;"><span class="pstrut" style="height:3.5133em;"></span><span class="katex-stretchy fbox" style="height:1.5133em;border-style:solid;border-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.49em;"><span></span></span></span></span></span></span></span></span></span></div>
105 +<div class="center"><div class="table-wrap"><table class="tbl"><tbody><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mtext>neuf</mtext></msub></mrow><annotation encoding="application/x-tex">C_{\text{neuf}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">neuf</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>Coût de remplacement (ou de reproduction) à neuf</td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mtext>totale</mtext></msub></mrow><annotation encoding="application/x-tex">D_{\text{totale}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">totale</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>Dépréciation totale (physique + fonctionnelle + économique)</td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>V</mi><mtext>terrain</mtext></msub></mrow><annotation encoding="application/x-tex">V_{\text{terrain}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3175em;"><span style="top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">terrain</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>Valeur du terrain comme s'il était vacant</td></tr></tbody></table></div></div></div></div>
106 +<div class="box box-form" id="form-A-5"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.5</span><span class="box-title">— coût de remplacement à neuf</span><a class="box-anchor" href="#form-A-5" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>C</mi><mtext>neuf</mtext></msub><mtext>  </mtext><mo>=</mo><mtext>  </mtext><mrow><mtext>Co</mtext><mover accent="true"><mtext>u</mtext><mo>ˆ</mo></mover><mtext>ts directs</mtext></mrow><mtext>  </mtext><mo>+</mo><mtext>  </mtext><mrow><mtext>Co</mtext><mover accent="true"><mtext>u</mtext><mo>ˆ</mo></mover><mtext>ts indirects</mtext></mrow><mtext>  </mtext><mo>+</mo><mtext>  </mtext><mtext>Profit de l’entrepreneur</mtext></mrow><annotation encoding="application/x-tex">C_{\text{neuf}} \;=\; \text{Coûts directs} \;+\; \text{Coûts indirects}
107 +\;+\; \text{Profit de l&#x27;entrepreneur}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">neuf</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord text"><span class="mord">Co</span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">u</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˆ</span></span></span></span></span></span></span><span class="mord">ts directs</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord text"><span class="mord">Co</span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">u</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˆ</span></span></span></span></span></span></span><span class="mord">ts indirects</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">Profit de l’entrepreneur</span></span></span></span></span></span></div>
108 +<div class="center"><div class="table-wrap"><table class="tbl"><tbody><tr><td>Coûts directs</td><td>Matériaux, main-d'œuvre, équipements (taux unitaires <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">×</span></span></span></span> superficies)</td></tr><tr><td>Coûts indirects</td><td>Honoraires professionnels, permis, financement de chantier, assurances (souvent 10–15 % des coûts directs)</td></tr><tr><td>Profit</td><td>Profit de l'entrepreneur (souvent 8–10 % des coûts directs)</td></tr></tbody></table></div></div></div></div>
109 +<div class="box box-form" id="form-A-6"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.6</span><span class="box-title">— dépréciation physique — méthode âge/vie</span><a class="box-anchor" href="#form-A-6" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>D</mi><mtext>physique</mtext></msub><mtext>  </mtext><mo>=</mo><mtext>  </mtext><mfrac><mrow><mover accent="true"><mtext>A</mtext><mo>ˆ</mo></mover><mtext>ge effectif</mtext></mrow><mrow><mtext>Vie utile </mtext><mover accent="true"><mtext>e</mtext><mo>ˊ</mo></mover><mtext>conomique</mtext></mrow></mfrac><mo>×</mo><msub><mi>C</mi><mtext>neuf</mtext></msub></mrow><annotation encoding="application/x-tex">D_{\text{physique}} \;=\; \frac{\text{Âge effectif}}{\text{Vie utile économique}}
110 +\times C_{\text{neuf}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">physique</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.5042em;vertical-align:-0.8804em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6238em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">Vie utile </span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">e</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˊ</span></span></span></span></span></span></span><span class="mord">conomique</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">A</span></span><span style="top:-3.2523em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˆ</span></span></span></span></span></span></span><span class="mord">ge effectif</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">neuf</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></div>
111 +<div class="center"><div class="table-wrap"><table class="tbl"><tbody><tr><td>Âge effectif</td><td>Âge apparent compte tenu de l'entretien et des rénovations (peut différer de l'âge chronologique)</td></tr><tr><td>Vie utile économique</td><td>Durée totale pendant laquelle le bâtiment contribue à la valeur</td></tr></tbody></table></div></div></div></div>
112 +<div class="box box-form" id="form-A-7"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.7</span><span class="box-title">— dépréciation totale ventilée</span><a class="box-anchor" href="#form-A-7" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><msub><mi>D</mi><mtext>totale</mtext></msub><mo>=</mo><mrow></mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msub><mi>D</mi><mtext>phys. curable</mtext></msub><mo>+</mo><msub><mi>D</mi><mtext>phys. incurable</mtext></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>+</mo><msub><mi>D</mi><mtext>fonct. curable</mtext></msub><mo>+</mo><msub><mi>D</mi><mtext>fonct. incurable</mtext></msub><mo>+</mo><msub><mi>D</mi><mrow><mover accent="true"><mtext>e</mtext><mo>ˊ</mo></mover><mtext>conomique</mtext></mrow></msub></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}D_{\text{totale}} = {} &amp; D_{\text{phys.\ curable}} + D_{\text{phys.\ incurable}} \\
113 +&amp; + D_{\text{fonct.\ curable}} + D_{\text{fonct.\ incurable}} + D_{\text{économique}}\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:2.7em;vertical-align:-1.1em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6em;"><span style="top:-3.76em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">totale</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"></span></span></span><span style="top:-2.26em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6em;"><span style="top:-3.76em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">phys. curable</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">phys. incurable</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.26em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">fonct. curable</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">fonct. incurable</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord katex-accent mtight"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-2.7em;"><span class="pstrut" style="height:2.7em;"></span><span class="mord mtight">e</span></span><span style="top:-2.7em;"><span class="pstrut" style="height:2.7em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord mtight">ˊ</span></span></span></span></span></span></span><span class="mord mtight">conomique</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1em;"><span></span></span></span></span></span></span></span></span></span></span></span></div>
114 +<p id="pA-4">Lorsque des éléments curables sont chiffrés d'abord, la dépréciation physique incurable se calcule sur la <strong>base résiduelle</strong> : <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mtext>phys. incurable</mtext></msub><mo>=</mo><mstyle scriptlevel="0" displaystyle="true"><mfrac><mrow><mover accent="true"><mtext>A</mtext><mo>ˆ</mo></mover><mtext>ge effectif</mtext></mrow><mtext>Vie utile</mtext></mfrac></mstyle><mo>×</mo><mrow><mo fence="true">(</mo><msub><mi>C</mi><mtext>neuf</mtext></msub><mo>−</mo><msub><mi>D</mi><mtext>phys. curable</mtext></msub><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">D_{\text{phys.\ incurable}} = \dfrac{\text{Âge effectif}}{\text{Vie utile}}
115 +\times \left(C_{\text{neuf}} - D_{\text{phys.\ curable}}\right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">phys. incurable</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.3098em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6238em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">Vie utile</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">A</span></span><span style="top:-3.2523em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˆ</span></span></span></span></span></span></span><span class="mord">ge effectif</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">neuf</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">phys. curable</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;">)</span></span></span></span></span>.</p></div></div>
116 +<div class="box box-rem" id="remarque-A-5"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-pen"/></svg></span><span class="box-label">remplacement ou reproduction</span><a class="box-anchor" href="#remarque-A-5" aria-label="Lien">#</a></div><div class="box-body"><p id="pA-6"><strong>Coût de remplacement</strong> : bâtiment d'<em>utilité équivalente</em>, matériaux et normes modernes — la base usuelle. <strong>Coût de reproduction</strong> : <em>réplique exacte</em>, mêmes matériaux et mêmes défauts — réservé aux bâtiments patrimoniaux ou à certains litiges.</p></div></div>
117 +<h2 id="s-A-3" class="h-section"><span class="h-num">A.3</span><span class="h-text">Méthode du revenu</span><a class="h-anchor" href="#s-A-3" aria-label="Lien vers cette section">#</a></h2>
118 +<div class="box box-form" id="form-A-8"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.8</span><span class="box-title">— cascade des revenus</span><a class="box-anchor" href="#form-A-8" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mtext>RBP</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mrow><mtext>Somme des loyers du march</mtext><mover accent="true"><mtext>e</mtext><mo>ˊ</mo></mover><mtext> </mtext><mover accent="true"><mtext>a</mtext><mo>ˋ</mo></mover><mtext> 100 % d’occupation</mtext></mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mtext>RBE</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mtext>RBP</mtext><mo>−</mo><mtext>Inoccupation</mtext><mo>−</mo><mrow><mtext>Mauvaises cr</mtext><mover accent="true"><mtext>e</mtext><mo>ˊ</mo></mover><mtext>ances</mtext></mrow><mo>+</mo><mtext>Autres revenus</mtext></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mtext>RNE</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mtext>RBE</mtext><mo>−</mo><mrow><mtext>D</mtext><mover accent="true"><mtext>e</mtext><mo>ˊ</mo></mover><mtext>penses d’exploitation</mtext></mrow></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}\text{RBP} &amp;= \text{Somme des loyers du marché à 100~\% d&#x27;occupation} \\
119 +\text{RBE} &amp;= \text{RBP} - \text{Inoccupation} - \text{Mauvaises créances}
120 ++ \text{Autres revenus} \\
121 +\text{RNE} &amp;= \text{RBE} - \text{Dépenses d&#x27;exploitation}\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:4.2em;vertical-align:-1.85em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.35em;"><span style="top:-4.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">RBP</span></span></span></span><span style="top:-3.01em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">RBE</span></span></span></span><span style="top:-1.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">RNE</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.85em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.35em;"><span style="top:-4.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord text"><span class="mord">Somme des loyers du march</span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">e</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˊ</span></span></span></span></span></span></span><span class="mord"> </span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">a</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˋ</span></span></span></span></span></span></span><span class="mord"> 100</span><span class="mord nobreak"> </span><span class="mord">% d’occupation</span></span></span></span><span style="top:-3.01em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord text"><span class="mord">RBP</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord text"><span class="mord">Inoccupation</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord text"><span class="mord">Mauvaises cr</span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">e</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˊ</span></span></span></span></span></span></span><span class="mord">ances</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord text"><span class="mord">Autres revenus</span></span></span></span><span style="top:-1.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord text"><span class="mord">RBE</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord text"><span class="mord">D</span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">e</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˊ</span></span></span></span></span></span></span><span class="mord">penses d’exploitation</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.85em;"><span></span></span></span></span></span></span></span></span></span></span></span></div>
122 +<div class="center"><div class="table-wrap"><table class="tbl"><tbody><tr><td>RBP</td><td>Revenu brut potentiel</td></tr><tr><td>RBE</td><td>Revenu brut effectif</td></tr><tr><td>RNE</td><td>Revenu net d'exploitation (avant service de la dette et impôts)</td></tr></tbody></table></div></div></div></div>
123 +<div class="box box-form" id="form-A-9"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.9</span><span class="box-title">— capitalisation directe</span><a class="box-anchor" href="#form-A-9" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><menclose notation="box"><mstyle scriptlevel="0" displaystyle="false"><mstyle scriptlevel="0" displaystyle="false"><mstyle scriptlevel="0" displaystyle="true"><mrow><mtext>  </mtext><mi>V</mi><mtext>  </mtext><mo>=</mo><mtext>  </mtext><mfrac><mtext>RNE</mtext><mtext>TGA</mtext></mfrac><mtext>  </mtext></mrow></mstyle></mstyle></mstyle></menclose><mspace width="2em"/><mrow><mtext>et, par sym</mtext><mover accent="true"><mtext>e</mtext><mo>ˊ</mo></mover><mtext>trie,</mtext></mrow><mspace width="2em"/><mtext>TGA</mtext><mo>=</mo><mfrac><mtext>RNE</mtext><mi>V</mi></mfrac></mrow><annotation encoding="application/x-tex">\boxed{\;V \;=\; \frac{\text{RNE}}{\text{TGA}}\;}
124 +\qquad\text{et, par symétrie,}\qquad
125 +\text{TGA} = \frac{\text{RNE}}{V}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:2.7263em;vertical-align:-1.026em;"></span><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7003em;"><span style="top:-4.7263em;"><span class="pstrut" style="height:4.7263em;"></span><span class="boxpad"><span class="mord"><span class="mord"><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">TGA</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">RNE</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span></span></span></span></span><span style="top:-3.7003em;"><span class="pstrut" style="height:4.7263em;"></span><span class="katex-stretchy fbox" style="height:2.7263em;border-style:solid;border-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.026em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:2em;"></span><span class="mord text"><span class="mord">et, par sym</span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">e</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˊ</span></span></span></span></span></span></span><span class="mord">trie,</span></span><span class="mspace" style="margin-right:2em;"></span><span class="mord text"><span class="mord">TGA</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.0463em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">RNE</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></div></div></div>
126 +<div class="box box-form" id="form-A-10"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.10</span><span class="box-title">— extraction du TGA sur ventes comparables</span><a class="box-anchor" href="#form-A-10" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mtext>TGA</mtext><mtext>extrait</mtext></msub><mtext>  </mtext><mo>=</mo><mtext>  </mtext><mfrac><mtext>RNE du comparable</mtext><mtext>Prix de vente du comparable</mtext></mfrac></mrow><annotation encoding="application/x-tex">\text{TGA}_{\text{extrait}} \;=\; \frac{\text{RNE du comparable}}
127 +{\text{Prix de vente du comparable}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord text"><span class="mord">TGA</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3175em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">extrait</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.2519em;vertical-align:-0.8804em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">Prix de vente du comparable</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">RNE du comparable</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></div>
128 +<p id="pA-7">Retenir un taux <em>jugé</em> à partir des extractions — pondérer les comparables les plus semblables, ne pas faire une moyenne aveugle.</p></div></div>
129 +<div class="box box-form" id="form-A-11"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.11</span><span class="box-title">— TGA par bande d'investissement (hypothèque–équité)</span><a class="box-anchor" href="#form-A-11" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><menclose notation="box"><mstyle scriptlevel="0" displaystyle="false"><mstyle scriptlevel="0" displaystyle="false"><mstyle scriptlevel="0" displaystyle="true"><mrow><mtext>  </mtext><mtext>TGA</mtext><mtext>  </mtext><mo>=</mo><mtext>  </mtext><mi>M</mi><mo>×</mo><msub><mi>R</mi><mi>m</mi></msub><mtext>  </mtext><mo>+</mo><mtext>  </mtext><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>M</mi><mo stretchy="false">)</mo><mo>×</mo><msub><mi>R</mi><mi>e</mi></msub><mtext>  </mtext></mrow></mstyle></mstyle></mstyle></menclose><mspace width="2em"/><msub><mi>R</mi><mi>m</mi></msub><mo>=</mo><mn>12</mn><mo>×</mo><mfrac><mrow><mi>i</mi><mi mathvariant="normal">/</mi><mn>12</mn></mrow><mrow><mn>1</mn><mo>−</mo><msup><mrow><mo fence="true">(</mo><mn>1</mn><mo>+</mo><mi>i</mi><mi mathvariant="normal">/</mi><mn>12</mn><mo fence="true">)</mo></mrow><mrow><mo>−</mo><mi>n</mi></mrow></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">\boxed{\;\text{TGA} \;=\; M \times R_m \;+\; (1 - M) \times R_e\;}
130 +\qquad
131 +R_m = 12 \times \frac{i/12}{1 - \left(1 + i/12\right)^{-n}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.68em;vertical-align:-0.59em;"></span><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.09em;"><span style="top:-3.68em;"><span class="pstrut" style="height:3.68em;"></span><span class="boxpad"><span class="mord"><span class="mord"><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord text"><span class="mord">TGA</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0077em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0077em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">e</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span></span></span></span></span><span style="top:-3.09em;"><span class="pstrut" style="height:3.68em;"></span><span class="katex-stretchy fbox" style="height:1.68em;border-style:solid;border-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.59em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:2em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0077em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">12</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.4782em;vertical-align:-1.0512em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.1988em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner"><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal">i</span><span class="mord">/12</span><span class="mclose delimcenter" style="top:0em;">)</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9112em;"><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">i</span><span class="mord">/12</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.0512em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></div>
132 +<div class="center"><div class="table-wrap"><table class="tbl"><tbody><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span></span></span></span></td><td>Ratio prêt/valeur (part hypothécaire du financement)</td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>R</mi><mi>m</mi></msub></mrow><annotation encoding="application/x-tex">R_m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0077em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>Constante hypothécaire annuelle (service de la dette <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>÷</mo></mrow><annotation encoding="application/x-tex">\div</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">÷</span></span></span></span> montant du prêt)</td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>R</mi><mi>e</mi></msub></mrow><annotation encoding="application/x-tex">R_e</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0077em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">e</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>Taux de rendement exigé sur l'équité</td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span></td><td>Taux d'intérêt nominal annuel ; <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> : nombre de mensualités</td></tr></tbody></table></div></div></div></div>
133 +<div class="box box-form" id="form-A-12"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.12</span><span class="box-title">— construction du TGA par sommation</span><a class="box-anchor" href="#form-A-12" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mtext>TGA</mtext><mo>=</mo><mrow></mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mtext>Taux sans risque</mtext><mo>+</mo><mtext>Prime de risque immobilier</mtext></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>+</mo><mrow><mtext>Prime de non-liquidit</mtext><mover accent="true"><mtext>e</mtext><mo>ˊ</mo></mover></mrow><mo>+</mo><mtext>Prime de gestion</mtext><mo>−</mo><mrow><mtext>Croissance anticip</mtext><mover accent="true"><mtext>e</mtext><mo>ˊ</mo></mover><mtext>e des revenus</mtext></mrow></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}\text{TGA} ={} &amp; \text{Taux sans risque} + \text{Prime de risque immobilier} \\
134 +&amp; + \text{Prime de non-liquidité} + \text{Prime de gestion}
135 +- \text{Croissance anticipée des revenus}\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:2.7em;vertical-align:-1.1em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6em;"><span style="top:-3.76em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">TGA</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"></span></span></span><span style="top:-2.26em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6em;"><span style="top:-3.76em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord text"><span class="mord">Taux sans risque</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord text"><span class="mord">Prime de risque immobilier</span></span></span></span><span style="top:-2.26em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord text"><span class="mord">Prime de non-liquidit</span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">e</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˊ</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord text"><span class="mord">Prime de gestion</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord text"><span class="mord">Croissance anticip</span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">e</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˊ</span></span></span></span></span></span></span><span class="mord">e des revenus</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1em;"><span></span></span></span></span></span></span></span></span></span></span></span></div></div></div>
136 +<div class="box box-form" id="form-A-13"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.13</span><span class="box-title">— multiplicateurs de revenu</span><a class="box-anchor" href="#form-A-13" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>MRB</mtext><mo>=</mo><mfrac><mtext>Prix de vente</mtext><mtext>RBE</mtext></mfrac><mspace width="1em"/><mo>⇔</mo><mspace width="1em"/><mi>V</mi><mo>=</mo><mtext>RBE</mtext><mo>×</mo><mtext>MRB</mtext><mspace width="2em"/><mspace width="2em"/><mtext>MRN</mtext><mo>=</mo><mfrac><mtext>Prix de vente</mtext><mtext>RNE</mtext></mfrac><mo>=</mo><mfrac><mn>1</mn><mtext>TGA</mtext></mfrac></mrow><annotation encoding="application/x-tex">\text{MRB} = \frac{\text{Prix de vente}}{\text{RBE}}
137 +\quad\Leftrightarrow\quad
138 +V = \text{RBE} \times \text{MRB}
139 +\qquad\qquad
140 +\text{MRN} = \frac{\text{Prix de vente}}{\text{RNE}} = \frac{1}{\text{TGA}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord text"><span class="mord">MRB</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.0574em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">RBE</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">Prix de vente</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⇔</span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord text"><span class="mord">RBE</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord text"><span class="mord">MRB</span></span><span class="mspace" style="margin-right:2em;"></span><span class="mspace" style="margin-right:2em;"></span><span class="mord text"><span class="mord">MRN</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.0574em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">RNE</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">Prix de vente</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">TGA</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></div>
141 +<div class="center"><div class="table-wrap"><table class="tbl"><tbody><tr><td>MRB</td><td>Multiplicateur de revenu brut (sur le RBE)</td></tr><tr><td>MRN</td><td>Multiplicateur de revenu net — l'inverse du TGA</td></tr></tbody></table></div></div></div></div>
142 +<h2 id="s-A-4" class="h-section"><span class="h-num">A.4</span><span class="h-text">Mathématiques financières et DCF</span><a class="h-anchor" href="#s-A-4" aria-label="Lien vers cette section">#</a></h2>
143 +<div class="box box-form" id="form-A-14"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.14</span><span class="box-title">— valeur future et valeur présente</span><a class="box-anchor" href="#form-A-14" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>F</mi><mi>V</mi><mo>=</mo><mi>P</mi><mi>V</mi><mo>×</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>r</mi><msup><mo stretchy="false">)</mo><mi>n</mi></msup><mspace width="2em"/><mspace width="2em"/><mi>P</mi><mi>V</mi><mo>=</mo><mfrac><mrow><mi>F</mi><mi>V</mi></mrow><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>r</mi><msup><mo stretchy="false">)</mo><mi>n</mi></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">FV = PV \times (1+r)^n
144 +\qquad\qquad
145 +PV = \frac{FV}{(1+r)^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">r</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:2em;"></span><span class="mspace" style="margin-right:2em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.2963em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">r</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.5904em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mord mathnormal" style="margin-right:0.2222em;">V</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></div>
146 +<div class="center"><div class="table-wrap"><table class="tbl"><tbody><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mi>V</mi></mrow><annotation encoding="application/x-tex">PV</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="mord mathnormal" style="margin-right:0.2222em;">V</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mi>V</mi></mrow><annotation encoding="application/x-tex">FV</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mord mathnormal" style="margin-right:0.2222em;">V</span></span></span></span></td><td>Valeur présente ; valeur future</td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">r</span></span></span></span></td><td>Taux d'intérêt ou d'actualisation par période</td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></td><td>Nombre de périodes</td></tr></tbody></table></div></div></div></div>
147 +<div class="box box-form" id="form-A-15"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.15</span><span class="box-title">— actualisation des flux monétaires (DCF)</span><a class="box-anchor" href="#form-A-15" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><menclose notation="box"><mstyle scriptlevel="0" displaystyle="false"><mstyle scriptlevel="0" displaystyle="false"><mstyle scriptlevel="0" displaystyle="true"><mrow><mtext>  </mtext><msub><mi>V</mi><mn>0</mn></msub><mtext>  </mtext><mo>=</mo><mtext>  </mtext><munderover><mo>∑</mo><mrow><mi>t</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mfrac><msub><mtext>RNE</mtext><mi>t</mi></msub><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>r</mi><msup><mo stretchy="false">)</mo><mi>t</mi></msup></mrow></mfrac><mtext>  </mtext><mo>+</mo><mtext>  </mtext><mfrac><msub><mi>V</mi><mi>n</mi></msub><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>r</mi><msup><mo stretchy="false">)</mo><mi>n</mi></msup></mrow></mfrac><mtext>  </mtext></mrow></mstyle></mstyle></mstyle></menclose><mspace width="2em"/><msub><mi>V</mi><mi>n</mi></msub><mo>=</mo><mfrac><msub><mtext>RNE</mtext><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msub><msub><mtext>TGA</mtext><mtext>sortie</mtext></msub></mfrac><mo>−</mo><mtext>frais de vente</mtext></mrow><annotation encoding="application/x-tex">\boxed{\;V_0 \;=\; \sum_{t=1}^{n} \frac{\text{RNE}_t}{(1+r)^t}
148 +\;+\; \frac{V_n}{(1+r)^n}\;}
149 +\qquad
150 +V_n = \frac{\text{RNE}_{n+1}}{\text{TGA}_{\text{sortie}}} - \text{frais de vente}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:3.5985em;vertical-align:-1.6071em;"></span><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.9914em;"><span style="top:-5.5985em;"><span class="pstrut" style="height:5.5985em;"></span><span class="boxpad"><span class="mord"><span class="mord"><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">r</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7196em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord text"><span class="mord">RNE</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">r</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.5904em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span></span></span></span></span><span style="top:-3.9914em;"><span class="pstrut" style="height:5.5985em;"></span><span class="katex-stretchy fbox" style="height:3.5985em;border-style:solid;border-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.6071em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:2em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.1963em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord text"><span class="mord">TGA</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3175em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">sortie</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord text"><span class="mord">RNE</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6944em;"></span><span class="mord text"><span class="mord">frais de vente</span></span></span></span></span></span></div>
151 +<div class="center"><div class="table-wrap"><table class="tbl"><tbody><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>V</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">V_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>Valeur actuelle de l'immeuble</td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mtext>RNE</mtext><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">\text{RNE}_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord text"><span class="mord">RNE</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>Revenu net d'exploitation de l'année <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span></td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">r</span></span></span></span></td><td>Taux d'actualisation (rendement exigé par l'investisseur)</td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></td><td>Période de détention (typiquement 5–10 ans)</td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>V</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">V_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>Valeur de réversion (revente) à la fin de l'année <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mtext>TGA</mtext><mtext>sortie</mtext></msub></mrow><annotation encoding="application/x-tex">\text{TGA}_{\text{sortie}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord text"><span class="mord">TGA</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3175em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">sortie</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>Taux de capitalisation à la revente (souvent <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>&gt;</mo></mrow><annotation encoding="application/x-tex">&gt;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&gt;</span></span></span></span> TGA d'entrée)</td></tr></tbody></table></div></div></div></div>
152 +<div class="box box-form" id="form-A-16"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.16</span><span class="box-title">— lien entre taux d'actualisation et TGA</span><a class="box-anchor" href="#form-A-16" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><menclose notation="box"><mstyle scriptlevel="0" displaystyle="false"><mstyle scriptlevel="0" displaystyle="false"><mstyle scriptlevel="0" displaystyle="true"><mrow><mtext>  </mtext><mi>r</mi><mtext>  </mtext><mo>≈</mo><mtext>  </mtext><mtext>TGA</mtext><mo>+</mo><mi>g</mi><mspace width="1em"/><mo>⇔</mo><mspace width="1em"/><mtext>TGA</mtext><mtext>  </mtext><mo>≈</mo><mtext>  </mtext><mi>r</mi><mo>−</mo><mi>g</mi><mtext>  </mtext></mrow></mstyle></mstyle></mstyle></menclose></mrow><annotation encoding="application/x-tex">\boxed{\;r \;\approx\; \text{TGA} + g
153 +\quad\Leftrightarrow\quad
154 +\text{TGA} \;\approx\; r - g\;}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.5578em;vertical-align:-0.5344em;"></span><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0233em;"><span style="top:-3.5578em;"><span class="pstrut" style="height:3.5578em;"></span><span class="boxpad"><span class="mord"><span class="mord"><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">r</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord text"><span class="mord">TGA</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⇔</span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord text"><span class="mord">TGA</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">r</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mspace" style="margin-right:0.2778em;"></span></span></span></span></span><span style="top:-3.0233em;"><span class="pstrut" style="height:3.5578em;"></span><span class="katex-stretchy fbox" style="height:1.5578em;border-style:solid;border-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.5344em;"><span></span></span></span></span></span></span></span></span></span></div>
155 +<p id="pA-8">où <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi></mrow><annotation encoding="application/x-tex">g</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span></span></span></span> est le taux de croissance anticipé des revenus. Un TGA <em>contient</em> implicitement les attentes de croissance ; un taux d'actualisation les isole.</p></div></div>
156 +<div class="box box-form" id="form-A-17"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.17</span><span class="box-title">— réconciliation pondérée</span><a class="box-anchor" href="#form-A-17" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>V</mi><mtext>conclue</mtext></msub><mtext>  </mtext><mo>=</mo><mtext>  </mtext><munder><mo>∑</mo><mi>i</mi></munder><msub><mi>w</mi><mi>i</mi></msub><mo>×</mo><msub><mi>V</mi><mi>i</mi></msub><mspace width="2em"/><mtext>avec </mtext><munder><mo>∑</mo><mi>i</mi></munder><msub><mi>w</mi><mi>i</mi></msub><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">V_{\text{conclue}} \;=\; \sum_{i} w_i \times V_i
157 +\qquad \text{avec } \sum_i w_i = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">conclue</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.3277em;vertical-align:-1.2777em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0269em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.3277em;vertical-align:-1.2777em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:2em;"></span><span class="mord text"><span class="mord">avec </span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0269em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span></div>
158 +<p id="pA-9">où <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>V</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">V_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.2222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> est l'indication de la méthode <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span> et <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>w</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">w_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0269em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> son poids, justifié par la pertinence de la méthode, la qualité des données et le comportement des acheteurs types.</p></div></div>
159 +<h2 id="s-A-5" class="h-section"><span class="h-num">A.5</span><span class="h-text">Ratios de marché et de financement</span><a class="h-anchor" href="#s-A-5" aria-label="Lien vers cette section">#</a></h2>
160 +<div class="box box-form" id="form-A-18"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.18</span><span class="box-title">— ratio prêt/valeur (RPV)</span><a class="box-anchor" href="#form-A-18" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>RPV</mtext><mtext>  </mtext><mo>=</mo><mtext>  </mtext><mfrac><mrow><mtext>Montant du pr</mtext><mover accent="true"><mtext>e</mtext><mo>ˆ</mo></mover><mtext>t</mtext></mrow><mtext>Valeur</mtext></mfrac><mo>×</mo><mn>100</mn></mrow><annotation encoding="application/x-tex">\text{RPV} \;=\; \frac{\text{Montant du prêt}}{\text{Valeur}} \times 100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord text"><span class="mord">RPV</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.0574em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">Valeur</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">Montant du pr</span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">e</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˆ</span></span></span></span></span></span></span><span class="mord">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">100</span></span></span></span></span></div>
161 +<p id="pA-10">Prêt <strong>conventionnel</strong> si RPV <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≤</mo></mrow><annotation encoding="application/x-tex">\leq</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mrel">≤</span></span></span></span> 80 % ; au-delà, assurance prêt obligatoire (SCHL, Sagen, Canada Guaranty).</p></div></div>
162 +<div class="box box-form" id="form-A-19"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.19</span><span class="box-title">— ratio de dépenses d'exploitation</span><a class="box-anchor" href="#form-A-19" aria-label="Lien">#</a></div><div class="box-body"><div class="eq"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mrow><mtext>Ratio de d</mtext><mover accent="true"><mtext>e</mtext><mo>ˊ</mo></mover><mtext>penses</mtext></mrow><mtext>  </mtext><mo>=</mo><mtext>  </mtext><mfrac><mrow><mtext>D</mtext><mover accent="true"><mtext>e</mtext><mo>ˊ</mo></mover><mtext>penses d’exploitation</mtext></mrow><mtext>RBE</mtext></mfrac><mo>×</mo><mn>100</mn></mrow><annotation encoding="application/x-tex">\text{Ratio de dépenses} \;=\; \frac{\text{Dépenses d&#x27;exploitation}}{\text{RBE}}
163 +\times 100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">Ratio de d</span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">e</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˊ</span></span></span></span></span></span></span><span class="mord">penses</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:2.0574em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">RBE</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">D</span><span class="mord katex-accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord">e</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˊ</span></span></span></span></span></span></span><span class="mord">penses d’exploitation</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">100</span></span></span></span></span></div>
164 +<p id="pA-11">Fourchette usuelle des multilogements québécois : <strong>35–45 %</strong> du RBE (chauffage à la charge du propriétaire, immeubles mixtes ou énergivores : davantage — documenter tout écart).</p></div></div>
165 +<div class="box box-form" id="form-A-20"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-formula"/></svg></span><span class="box-label">Formule A.20</span><span class="box-title">— droits de mutation immobilière (Québec, 2026)</span><a class="box-anchor" href="#form-A-20" aria-label="Lien">#</a></div><div class="box-body"><p id="pA-12">Barème général par tranches du plus élevé du prix payé ou de la valeur marchande :</p>
166 +<div class="center"><div class="table-wrap"><table class="tbl"><thead><tr><th>Tranche de la base d'imposition</th><th class="al-r">Taux</th></tr></thead><tbody><tr><td>Jusqu'à <span class="num">62 900 $</span></td><td class="al-r">0,5 %</td></tr><tr><td>De <span class="num">62 900 $</span> à <span class="num">315 000 $</span></td><td class="al-r">1,0 %</td></tr><tr><td>Au-delà de <span class="num">315 000 $</span></td><td class="al-r">1,5 %</td></tr></tbody></table></div></div>
167 +<p id="pA-13">Tranches indexées annuellement ; Montréal applique son propre barème (jusqu'à 4 % pour les tranches supérieures) <span class="citation">(<a class="cite" href="/bibliographie/#quebecMutations" data-cite="quebecMutations">Gouvernement du Québec, 2026</a>; <a class="cite" href="/bibliographie/#ldmi" data-cite="ldmi">Québec, 1976</a>)</span>.</p></div></div>
168 +<h2 id="s-A-6" class="h-section"><span class="h-num">A.6</span><span class="h-text">Tableaux de repères</span><a class="h-anchor" href="#s-A-6" aria-label="Lien vers cette section">#</a></h2>
169 +<h3 id="s-A-6-1" class="h-subsection"><span class="h-num">A.6.1</span><span class="h-text">Fourchettes indicatives</span><a class="h-anchor" href="#s-A-6-1" aria-label="Lien vers cette section">#</a></h3>
170 +<div class="center"><div class="table-wrap"><table class="tbl"><thead><tr><th>Paramètre</th><th>Repère indicatif (cours)</th></tr></thead><tbody><tr><td>TGA — multilogements Gatineau (2026)</td><td>environ 5,0–6,0 % selon l'âge, l'état et le secteur</td></tr><tr><td>MRB — immeubles à revenus</td><td>environ 9–11 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">×</span></span></span></span> le RBE</td></tr><tr><td>Inoccupation et mauvaises créances</td><td>3–5 % du RBP (selon SCHL et le secteur)</td></tr><tr><td>Ratio de dépenses</td><td>35–45 % du RBE</td></tr><tr><td>Coûts indirects de construction</td><td>10–15 % des coûts directs</td></tr><tr><td>Profit de l'entrepreneur</td><td>8–10 % des coûts directs</td></tr><tr><td>Gestion immobilière</td><td>environ 5 % du RBE</td></tr><tr><td>Frais de vente à la réversion (DCF)</td><td>environ 3 % de la valeur brute</td></tr><tr><td>Période de détention (DCF)</td><td>5–10 ans</td></tr></tbody></table></div></div>
171 +<div class="box box-att" id="attention-A-14"><div class="box-head"><span class="box-icon"><svg class="" aria-hidden="true"><use href="#i-warning"/></svg></span><span class="box-label">Attention</span><a class="box-anchor" href="#attention-A-14" aria-label="Lien">#</a></div><div class="box-body"><p id="pA-15">Ces fourchettes sont des <strong>repères pédagogiques</strong> tirés des cas du cours, pas des normes : à l'examen, utilisez toujours les données de l'énoncé ; en pratique, extrayez toujours les taux du marché du bien évalué.</p></div></div>
172 +<h3 id="s-A-6-2" class="h-subsection"><span class="h-num">A.6.2</span><span class="h-text">Seuils et règles à mémoriser</span><a class="h-anchor" href="#s-A-6-2" aria-label="Lien vers cette section">#</a></h3>
173 +<div class="center"><div class="table-wrap"><table class="tbl"><thead><tr><th>Règle</th><th>Valeur</th></tr></thead><tbody><tr><td>Ajustement net maximal (comparaison)</td><td>15 % du prix du comparable</td></tr><tr><td>Ajustement brut maximal (comparaison)</td><td>25 % du prix du comparable</td></tr><tr><td>RPV maximal d'un prêt conventionnel</td><td>80 %</td></tr><tr><td>Conservation des dossiers (OEAQ)</td><td>au moins 5 ans</td></tr><tr><td>Critères de l'utilisation optimale</td><td>légal, physique, financier, maximalement productif</td></tr><tr><td>Éléments de la certification</td><td>8 déclarations obligatoires</td></tr><tr><td>Note de passage du cours</td><td>60 %</td></tr></tbody></table></div></div>
174 +<h3 id="s-A-6-3" class="h-subsection"><span class="h-num">A.6.3</span><span class="h-text">Conversions utiles</span><a class="h-anchor" href="#s-A-6-3" aria-label="Lien vers cette section">#</a></h3>
175 +<div class="center"><div class="table-wrap"><table class="tbl"><thead><tr><th>Conversion</th><th>Facteur</th></tr></thead><tbody><tr><td>1 m<sup>2</sup></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≈</mo></mrow><annotation encoding="application/x-tex">\approx</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4831em;"></span><span class="mrel">≈</span></span></span></span> 10,764 pi<sup>2</sup></td></tr><tr><td>1 pi<sup>2</sup></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≈</mo></mrow><annotation encoding="application/x-tex">\approx</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4831em;"></span><span class="mrel">≈</span></span></span></span> 0,0929 m<sup>2</sup></td></tr><tr><td>1 mètre</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≈</mo></mrow><annotation encoding="application/x-tex">\approx</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4831em;"></span><span class="mrel">≈</span></span></span></span> 3,281 pieds</td></tr><tr><td>1 acre</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≈</mo></mrow><annotation encoding="application/x-tex">\approx</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4831em;"></span><span class="mrel">≈</span></span></span></span> <span class="num">43 560</span> pi<sup>2</sup> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≈</mo></mrow><annotation encoding="application/x-tex">\approx</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4831em;"></span><span class="mrel">≈</span></span></span></span> <span class="num">4047</span> m<sup>2</sup></td></tr><tr><td>1 hectare</td><td>= <span class="num">10 000</span> m<sup>2</sup> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≈</mo></mrow><annotation encoding="application/x-tex">\approx</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4831em;"></span><span class="mrel">≈</span></span></span></span> 2,471 acres</td></tr></tbody></table></div></div><hr class="sep"><h2 class="h-section" id="index-formules"><span class="h-text">Toutes les formules numérotées du cours</span></h2><p>Les 27 formules encadrées dans les séances, dans leur contexte.</p><ul class="form-index"><li><span class="fi-ch">1.1</span><a href="/seance/01/#form-1-1">ratio prêt/valeur</a></li><li><span class="fi-ch">8.1</span><a href="/seance/08/#form-8-1">ajustement temporel au prorata</a></li><li><span class="fi-ch">8.2</span><a href="/seance/08/#form-8-2">ajustements net et brut</a></li><li><span class="fi-ch">9.1</span><a href="/seance/09/#form-9-1">composition des ajustements transactionnels</a></li><li><span class="fi-ch">9.2</span><a href="/seance/09/#form-9-2">capitalisation d'une différence de loyer</a></li><li><span class="fi-ch">10.1</span><a href="/seance/10/#form-10-1">méthode du coût</a></li><li><span class="fi-ch">10.2</span><a href="/seance/10/#form-10-2">décomposition de la dépréciation</a></li><li><span class="fi-ch">10.3</span><a href="/seance/10/#form-10-3">méthode âge/vie modifiée</a></li><li><span class="fi-ch">10.4</span><a href="/seance/10/#form-10-4">dépréciation totale, forme développée</a></li><li><span class="fi-ch">10.5</span><a href="/seance/10/#form-10-5">méthode d'extraction du terrain</a></li><li><span class="fi-ch">10.6</span><a href="/seance/10/#form-10-6">méthode de répartition</a></li><li><span class="fi-ch">10.7</span><a href="/seance/10/#form-10-7">conclusion du cas</a></li><li><span class="fi-ch">11.1</span><a href="/seance/11/#form-11-1">capitalisation directe</a></li><li><span class="fi-ch">11.2</span><a href="/seance/11/#form-11-2">revenu brut effectif</a></li><li><span class="fi-ch">11.3</span><a href="/seance/11/#form-11-3">chaîne du RNE</a></li><li><span class="fi-ch">11.4</span><a href="/seance/11/#form-11-4">RNE du cas</a></li><li><span class="fi-ch">12.1</span><a href="/seance/12/#form-12-1">bande d'investissement</a></li><li><span class="fi-ch">12.2</span><a href="/seance/12/#form-12-2">constante hypothécaire</a></li><li><span class="fi-ch">12.3</span><a href="/seance/12/#form-12-3">taux construit</a></li><li><span class="fi-ch">12.4</span><a href="/seance/12/#form-12-4">DCF immobilier</a></li><li><span class="fi-ch">12.5</span><a href="/seance/12/#form-12-5">valeur de réversion</a></li><li><span class="fi-ch">12.6</span><a href="/seance/12/#form-12-6">relation entre <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">r</span></span></span></span>, TGA et croissance</a></li><li><span class="fi-ch">12.7</span><a href="/seance/12/#form-12-7">valeur par DCF</a></li><li><span class="fi-ch">12.8</span><a href="/seance/12/#form-12-8">multiplicateur du revenu brut</a></li><li><span class="fi-ch">12.9</span><a href="/seance/12/#form-12-9">multiplicateur du revenu net</a></li><li><span class="fi-ch">14.1</span><a href="/seance/14/#form-14-1">méthode du coût</a></li><li><span class="fi-ch">14.2</span><a href="/seance/14/#form-14-2">les quatre formules cardinales du cours</a></li></ul></article>
176 + <aside class="side"><h4>Aide-mémoire</h4><ol><li class="lvl2"><a href="#s-A-1">A.1 Méthode de comparaison</a></li><li class="lvl2"><a href="#s-A-2">A.2 Méthode du coût</a></li><li class="lvl2"><a href="#s-A-3">A.3 Méthode du revenu</a></li><li class="lvl2"><a href="#s-A-4">A.4 Mathématiques financières et DCF</a></li><li class="lvl2"><a href="#s-A-5">A.5 Ratios de marché et de financement</a></li><li class="lvl2"><a href="#s-A-6">A.6 Tableaux de repères</a></li><li class="lvl3"><a href="#s-A-6-1">A.6.1 Fourchettes indicatives</a></li><li class="lvl3"><a href="#s-A-6-2">A.6.2 Seuils et règles à mémoriser</a></li><li class="lvl3"><a href="#s-A-6-3">A.6.3 Conversions utiles</a></li></ol><h4>Voir aussi</h4><div class="toc-extra"><a href="#index-formules">Index des formules des séances</a><a href="/outils/">Calculateurs</a><a href="/entrainement/">Entraînement</a><a href="/fiches/">Fiches « formules »</a></div></aside>
177 + </div>
178 +</main>
179 +<footer class="site-footer">
180 + <div class="footer-inner">
181 + <div class="footer-brand">
182 + <img src="/assets/brand/uqo-logo-white.png" alt="UQO" width="140" height="59" style="width:140px;height:auto;margin-bottom:10px">
183 + <div class="brand-code">IMM1003</div>
184 + <div>Éléments d’évaluation immobilière</div>
185 + <div style="opacity:.7;margin-top:6px;font-size:.85rem">Automne 2026 · 3 crédits · premier cycle · 14 séances</div>
186 + <div style="margin-top:14px;font-size:.85rem">Simon-Pierre Boucher, professeur<br>Département des sciences administratives<br>Université du Québec en Outaouais<br><a href="mailto:simon-pierre.boucher@uqo.ca" style="display:inline;padding:0">simon-pierre.boucher@uqo.ca</a></div>
187 + </div>
188 + <div><h4>Étudier</h4><a href="/seance/01/">Séances</a><a href="/aide-memoire/">Aide-mémoire</a><a href="/glossaire/">Glossaire</a><a href="/definitions/">Toutes les définitions</a><a href="/carte/">Carte du cours</a><a href="/exercices/">Banque d’exercices</a></div>
189 + <div><h4>S’exercer</h4><a href="/quiz/">Quiz et examens blancs</a><a href="/entrainement/">Entraînement</a><a href="/jeux/">Jeux de révision</a><a href="/fiches/">Fiches de révision</a><a href="/outils/">Calculateurs</a><a href="/progression/">Ma progression</a></div>
190 + <div><h4>Ressources</h4><a href="/diapositives/">Diapositives</a><a href="/ressources/">Téléchargements</a><a href="/rapport/">Rapport — marché de l’habitation</a><a href="/bibliographie/">Bibliographie</a><a href="/recherche/">Recherche</a><a href="https://www.uqo-imm1033.app" rel="noopener">IMM1033 — Méthodes du coût en évaluation immobilière</a></div>
191 + </div>
192 + <div class="footer-legal"><div><span>© 2026 Simon-Pierre Boucher — Université du Québec en Outaouais. Document destiné aux étudiantes et étudiants inscrits au cours IMM1003 ; toute reproduction ou diffusion sans autorisation écrite de l’auteur est interdite.</span><span>Généré depuis les sources LaTeX · KaTeX · TikZ</span></div></div>
193 +</footer>
194 +<div id="search-modal" class="search-modal" role="dialog" aria-modal="true" aria-label="Recherche dans les notes">
195 + <div class="search-box">
196 + <input type="search" placeholder="Rechercher une notion, une formule, un exemple…" autocomplete="off" spellcheck="false">
197 + <div class="search-results"></div>
198 + <div class="search-foot"><span><kbd>↑</kbd><kbd>↓</kbd> naviguer</span><span><kbd>↵</kbd> ouvrir</span><span><kbd>Échap</kbd> fermer</span><span style="margin-left:auto"><a href="/recherche/">Page de recherche complète</a></span></div>
199 + </div>
200 +</div>
201 +
202 +<script src="/assets/js/app.js" defer></script>
203 +</body>
204 +</html>
added content/imm1003/assets/brand/apple-touch-icon.png +0 −0

Binary file not shown.

added content/imm1003/assets/brand/favicon-32.png +0 −0

Binary file not shown.

added content/imm1003/assets/brand/favicon-64.png +0 −0

Binary file not shown.

added content/imm1003/assets/brand/favicon.ico +0 −0

Binary file not shown.

added content/imm1003/assets/brand/favicon.svg +1 −0
@@ -0,0 +1 @@
1 +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect width="100" height="100" rx="22" fill="#0F6180"/><image href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjgAAADuCAYAAAA0jX3tAAAnyElEQVR42u2df4yd1ZnfP7k7stCKei3L9VqjKaWEdS0vS7IJsWa9JHGGYTAkNCUYA2ERYjFQarHhZxFCrkNdFCF+BIJc4mCHIgTmh4EQApjx9YUErzsylM1SZLmuSxF1Xdd1kWuhNLJGl/7xnFceD/Pr3vve932fc74faTSM8Nw57/nxvN/zPM95zhc+++wzhBBCCCFioqYuEEIIIYQEjhBCCCGEBI4QQgghhASOEEIIIYQEjhBCCCGEBI4QQgghJHCEEEIIISRwhBBCCCEkcIQQQggh8qNHXSCEaHNT1Aw/Z19NYFRdJBKY/71A3zT/dj9wYMxaERI4QogS6ANOBRYBc4A/ApaMES5jRcwgMDzG2A+G7/Vxn9kE9gH/FTgC7AU+AfbI4IuK0hvWwWJgNvA1YN64fzPY4meOXxeHgXeAo2EtfDhGCIkc+YLuohIiKWYDZwJnAX8Rfu5p03C3Sz2IowPAfwJ2AB8Egy9EUSwG+oE/Ab4MzBoj4IukEb4fA94D/g7YHb6EBI4QYhL6gKXAN4HTg5gZqGA7MyN/EPg1sDOIHiHyoh/4BvCtEkR9u5uAY8CbwG+AEQ2hBI4QqTMEfDcImlqFjfh0Br6Jue/fBF4DPtXQihbF/fIg7heEtTDg9FnGbgBeChsAhbUkcISIntnABcCFwPyK70zb5S3g98G4/0rGXUxCL/Ad4FIs4X0o0udshOd7QetBAkeIGFkOXBlEzWBCzz2MJSu/BGxBCcsS+CZkrqW6IdhuUscSl18AXtR6kMARwit9wZAvDYZsKPH+qGOns55EOQqpsRi4AViodXDCetgNbEBJyhI4QjhhCPPWLCAtb00rhr0JbAKeU3dEzfeCsJHAn3o9ADyKeXUkcIQQlWMlcDV2hHVA3TEtWW7CNuB+dUc01IC/Bi7WWmh5PRzDwlc/J7HwlQSOENVkFZYoqV1qewxj+RivAw+hCsueuQU4H3kuO6Ue1sODEjhCiDJYCVwT/lvCJj/D/irwE5SA6YmbgPOQxyZPMg/n88BGCZzJ6QUuc/KcTaxoWF3zm1vC95oDY9/ETsnsT0jYeK1b48W4v45CVx7WwrXhRbxc3dEVsqtW7o35vdiJwFkK/K2jZ71dhg2A7c52Q3+JFbWKlTOAO0nvqHdZZMb8vmDkRbXWwl1hLchjU5zoPwysI8LK4Z1ctunN1SvXtM9+iDl34m7gbBnzQhkcsw6uBm7GqsOK8tfCUon8wslsz1yszMIaCRwJBgkc0QnLgR+QZlGyqpDlN83D8nMeUpeUNg63otBsVYT/G8BaIqkp1YnAqWlOiAKIbZ49CpyGEoirZNibwNeAe1BxtCJZr7VQSZEDsA9YnfLLo5bQs8ZEj7qgtJ3qduwCTBn06o3N94FHOJ6EL7rHUqxO0UKURFzV9XBasFf9qb7sFOrwicateP418HUUjqo62fh8FauUe1RdkjvrgsDRWqg2mfC8Bwvhuqydk9JuXi92UTR92DHMBTLo7kTOfHTSKk9mY+FZnZDytx6aXkW/whVCdIcVwPUocdIrWW7OX2JJl6J9lgRPgNaC37WQif67gF0SOEKki45/x0GWK7UZuFzd0RarQt9pLcQhdGphPbiogqzEWyHy5VmUYxCbyJmPJcX2qTtaYh12n5rWQjwMhDFdJ4EjRDr0BXEzB7niYzTqg8CTWLhFTM9TqHBfrAyGsd0sgSNE/PQCm7A7dHQEPF6WhZ3rCnXFlGxGycQpiP55VRc5EjhCdMbZwOMSNskwhCWPr1RXfI4FWO0U3auWBoNB5GwPm7zKoSRjIdpHJ6XSNew14M+I7O6eDjgF82LKa5PeWiBs8q4B9lepcfLgCNEeKyVukmYAq/K6Tl1BH/CY1kLSDAWBW6lEfAkcIVpnBXYTtQy6dq+pi5w+4AkUohU2B56oksiRwBGidXFzDbpDR5woclK8wyoTNwpLiYyBKokcCRwhZs5S4FqJGzGByDmftE5XzUY5N2JykbOpCg1RkrEQM6MXq1CssJSYTORkG8YtCTzvBhSWElNTegVweXCEmNlu9QmJGzGDneu1wKIEXlzzNdxiCoaoQJ0cCRwhZrZblbgRMzXsjxDvtQ7rwotLoSkxHVmdnNKS8CVwhJiaR4G56gbRomG/L8Lnug27qkJiX7SyFpYA10ngCFG93eqpKNdAtM48YH1kL6rztRZEGwwBl2CnDSVwhKiIQT8LnZgS7c+fhcRxfHwOcAcKS4nO1sM9WD6jBI4QJXJyMOgSN6JTo35+GTvXnFmPwlKicwawkL8EjhAlorLzIu+dq1dbmyUVC5EHhSYdS+AIcSJ3oyOwIv+d62aH7R7CvE/KuxF5zqklWNFUCRwhCqQ/fCnXQOTNXEo6SdImPcDNyJMpuiNy1kjgCFEs67RbFV1iEDtJMsdJex9GOWiie8zC6kVJ4AhRkLgRotsi51EH7RzCToAJ0S0GsIrfXd1QSuAIYTHhfuSOF91nLrCq4m28XWtBFCT47+jmH9Blm0KY90YG/fM0gGb478PAO+HnGvA+8Lvwcz/mcm4C/2Tc7l/9eiJDof/+PTBa0bUgTqQexmwUeA/4X8D+8DUVfeHrj4GvhPdtU2tiwjnXlZwcCRyROjchT2ZmxDMhsx3YHb6OzOB3R6awL1/BqkF/EzgtCKHUk7gHgR8DN1asXUvQVQwAw8EmjAD/IYj5/Tl9dh9wJvAXwNnA70k71ymzBYuDvZHAESInZgPfTtigZzvTN4BfAHtz/vxRYFf4em6Mgf8O8HWsJkaqSd2LsaOyOyvUplsTHo8GcAB4BdgKHO3S38k8P6+Fn08JovKihNfDAHAncKUEjhD5kWJoqjFGeDwGfFzw398P/DR8zQYuAy4OQiulsRgADlZI4KwgvYJ+mdfyWeAZ4NMS2vBx+NoS1sNK7LRdauuhN8zBLRI4QnROP3BGYsb8CPA8x70pZXMU+Fn46gf2YWGsVHaxvcD3gBcr0JbrSSd0WAcOYceURyrUrqPAxvC1NLQxFa/OAJafJIEjRA7cmIhBbwRD+XDFjPl4RsLXAizhcGECO9hlwLEKCJzbSCMPbRj4BLtba0fF27ozfC3F8uLmJ7AealgxzJ9J4AjRPv3E746vYyGQR6lWnsd0HARWY96NNViOwgWRj9UtwIMlvlTOi1zsN8ashR3O2p4JnX7Mw9ET8VhlXpyNHD+9KYEjRIv8gLjdvnUsr2Cj42c4ANwQdrAnjTGAsZEdG38oL6PehriK2TPQwMKyP3X+HCNBiP6LiNcCYS7eAtyfl3oXIiX6sWJrsQqbn2AnwzZG8kw7gXOA17EQQ8xGvQzOiVjYPI0lsP80ouf6aXimp8Mzxkhuc1ICR6TGjcTpvakDGzDv1LEIn+9+YG14zhiFzrkl/M3biNOLX8dub7+CmdVx8saR8Gyxiv6eMDclcIRogSVYEmuMO9WryPkEQgUZCUJgL8eP+MZCDTsmWyTnEV94qh42MRuJn/uxG99j8+QMhrkpgSNEC1xFXLHrOrAn7OYOJDSON4bda0wiZxA7ql0UKyOz/3Wsls35YU2kwu4g+p8mLm9OLoJfAkekQh9x3ZBcx4r1rU50PB/EChXGJHJqFBc+vSYisT+M5WpdTjXv9+o2zbDJ+TAikTMAXNvph+gUlUiF64nHHT8MbKI6BfvK4jngo2DHlkVi1A8V8JLKLkeNga3Ab7H8rNS5AavOHksV5B4srWBXJzsGIVJgSSTPUZe4OYFd2B02sexc52Pexm5yRSSCsAG8i91jJIw1mDcrBs/mAJZW0DYSOCIFVkTyHBI3E7MfuJo4ki0H6G4uzsnYRZ/e2YoV7Vuj6f851kYkck7H7uiSwBFiEi7C/9HwOpZz8oyGc0IOAPdGInLO6uJnfx//uTfDwHsoLDWdyInhtOEQsFwCR4iJWYD/o+EN7Ii0PDfTv/jW4z9cdRLdy6G4OIK18Alwl6b7tKzG7rHyztUSOEJMzAXOd6zZUXC54mfGi1hexlbHz7AM8zrmTR/+D5aMYqelxMy4Av9enBpt5qVJ4IgUFrj3xb1aw9gSd+G/gm03Shpc71zsN7DCdmLmNLHq5p5FzhBtXrgrgSNipg/fdTHqEjdtcyW+vTiZYc+Tfudr4SmssJ1ojd3Y5bueRc4lEjhCnMgF+E0u3hqM0h4NY1uMAg87FjmDwHdz/Lxe5/b+EPBzTeu22Yj/fJyWw1QSOCJmLnHc9qOkcZ9Ot0XiLsc710U5i/0Bx+MoT2bnXO9c8Ld8mkoCR8TKbMdtbwC3aghzYS2Wh+CRJvkVqLzE8Vp4gThvBS9j0/QCfkspnCOBI4TRj89y5Q3gVax4nciHx5wa9bzCVCc7HrsDyJOZJxuBg07bPq9VzSKBI2LlQse79gc1fLmyxbFRz6Po3xJ85qI1gEc1fXNnvWPB31KivASOiBWPN4c3gA0auq7wCD5zcZrAnA4/41tOx+wgduWAyJedjgX/UgkckToL8FnQbBTzNoj8GcHnKZLldJ6H8xWnYl+XaHZX8Hv04rSUhyOBI2LkTPydGMnumhLdYz0+vThf7/D3T3L4zAeBjzVluyr4Dzhs96xWdIsEjoiRbzpscw15b7rNDnx6cTop0Hc2/k6RNYIYFd3lUYeCf4AWPJoSOCJGPLrkX9GwFcLz+HPNj9J+yHUx/k4TNlHuTRHsdKoBzpDAEanSg7/8mzrwjIauEF50aPeW037S/JccjpFCtcWx2WGbZzynJXBEbJzmcMd6CL+nGjyyw2GbF3ewHryJ/a2aooXxHP7CVDNeCxI4IjZOddjmlzVshe9avYWp2hEqNfx5Mw9hFXdFMRwNfe6J5kzntQSOiI0znbW3AbymYSuU3fhLvG0ncf50/HkzX9D01AZrGgaB+RI4IkX+3OGO9VMNW+HsctbeWW38zjyHYr+uqVk4Wx32+6kSOCJFvBn17RqyUnjFmVFvJ9S0xNmYNFF4qgyO4s+jOaPSCRI4IjY8zek6PhNeY2DEWXuP0Xqi8R87e8Ztmpal8Z5DMSyBI0TF2aMuEDNgCJjd4u+c5ewZ39Iwl8abzto7o8uUJXBETPTjy9U6qiErldedtfeMiMeiIbFfKiPAsKP2yoMjkt3pekEu+XJ531l7T454LI6h/JsyibLvJXBETPQ5a+8HGrJS2e+sva2cpPJm23s0HUunGdsDSeCImPBWtfWIhqxU9uHrJNW3In5ZvaHpWDrvx/ZAEjhCO5ByqOPv5EJsjDqbM614cHodjoUol//prL3Tev0kcERsLyy1V+RqJJ3Ol1PwVcVY5RLKZ7ejtg4yg1OCEjgiJr6oLhAtcsxRW1vxNnnLaflDTcXS8ZZoLA+OSIpF6gLRIp5OsrUSovLmHTymqSjynjMSOCImNJ9FzMQa0mwAH2t4S6cntvbqhSD0AhAp4ynJuBapzR4FDmgqls4xh/NGAkckg+aziH1+N7V2RZc4qkklhHbjQoj8GMJfkc4Yme2svbWO/4EQjlA1VNEqsxy1NWYB36upKPtZuAISwhHKwRGt8o8jfS5vtl3eV41B7u2VwBExsV1dIFrE0/UerbyAvIl9eV81BhI4QkyBammIVvEUomrFXv/O2Tgs1lQsna84a+8+CRyREt7msxIrNV9y3bGOYY+zZ5ut6Vg6njw4w8CnEjgScymNm6cY8qAETumcDAw4au9Ii2uh4ejZztd0LJ3znIkx1cFx+vITx2kll+BdZ892hoa3VLxd7fF/I7Z3ss/VEA3J7o6FKINPW/i33nJw/lzDWypnRi4CPIkGJRmXy2xn82VGbe1E4HgTRxJz/hgG9rbw772Vez9NQyyB2QKteig9naQaBZZoSpbGYixsHhWdvPTlAhVFzM9WjPQBfOUdzELJlWVyurP2tuqhfM/Rsw0B39CULI2znbX39W4LnE8SEnNCIrYbDDg0LLFwKv5Ojexr8Xf+t7MxUaJxeZwb4/u8k5f+h8465B9oDrujnfnpTeScp2EuhSX4OkHV08amcrezMRnFTraJYvlD/OVA7ei2wAGoO+qQfs1jd4y2sfBGnD2jTlKVw8UO10KrfOzsGYeApZqahfMdZ2If4Ei3BY7u/fGJt5MVrbb3/zgcD1VxLZYaMNdZm9vxmO91tgkFuEjTU30+DXVmePikUw+Op7wW5eD464fRNgTOLmfjMQhcrmlZKCvwd2LkP0e+mcnQycJimQ3Mc9bmYxRwTNzrAhJxi7EP8HWSChQ+LZqLHba5XeF+yOGaX6EpWugGy5vY/6io3bwETvyCwVt7jzqclzXge5qehdCLv/BUPQj3dvg7hy/cSzRNC+MGh23++6JeeJ4yr2soTDXbmVpvd/d52Nm4DDj1KnjkrxzuWGtBuLfDbxyO0RyUl1YESx1uBuvAb4sSOJ5K4w/g7+6ZvPH2/P+xzd97x+HYzEcnqrpND3COw3Yf7OB338VfovEQsFrTtevcGPraGzMO13YqcN5w1jGpV43tddbedk/q7cRfHs4gcL1sblf5G6cG/c0OfreJT8/1IqBPU7Zr9IVNlTdqXfvHEZB6jYVTnLW3Xbf8iNPxWSyj3lU8Vspt0HmYaafD5x4A7tSU7Rp34q/2TctzuVOB4+1yw68mPqm/7ay9ezv43d87NeoPyPZ2hVvweSii2eE6AHjb6ZgtRLk43aAfv8fxf12kwNnvrHPmJz6xvRVn7CTH6xWnYzQPHRvPmx7Me+MxPHUwh88YwV/IFixsu0bTN3d+ACx32O56q/O4U4HjsZpxqiGARQ4ncye3If/GqVEfANbKBufKw/g7OZWnUD/qeOzmoro4efLP8VfYb6xeabb6C53wW+yWW087glR3x99wptqbHQro3fit0zQLC6mIzunHQh0eySP/JuNZp30whCXfqxJ9Pqx2LPY3t6OIOuGYw4mX6l0n3uqs5FFjaa/TsRrAQirKP+icexwb9GPkE6ICeAt/x8XHbkwf0VTumEfwd2t4Rh34VdECB/yFqXpJ77h4n8OJnUeNpRecG3XlH3TGOnxXW385x8/a67wvTkehqk64LvThMqftb7Yj9vMQOJ8666hlwGWJTe7L8HckMI8aSw3n4zYvvKRF63wPKwvh1XtTB36Z82fucjyeWaiqV1O7rQ3upfhMLO5o7uYhcP7WYWddmtDkruHveDjA73LcuXplMLykdU9V6wb9BnzW+RhL3mU4nsKvRzNbDz/W9G6Zx52vhQbwaFkCZ4/TTluZyOS+CZ9uyQ9y+pyXnRv1ASwxUDvXmbMJv56bjBe68Jl78H9B8hzaSDZNmKfwn6A92q7Yz+PBP3L4AhkArk5gcs8CznWq2PMSOMP4LGcwfr4+EYy7mJrNERj0BvALR8KpSIaw0O3dmurTsg5YgH9PZttzNmUPTgpHce/Fb9w1z9oduyIYS50kmZ714eXn3XtzkPxOT43nl/jPTRsEzpbImVbcLI1A3DSAp8sUOODT7Rn7Udx+4Eynbc/7moVN+A5TZcxH7vnJuBsrZuld3DSAl7osng5FMN4DQeQoCT9ecQPmQGn7IFNeAudDxzuBWC90u9vxBP91zp/3cSRGPXPPP4sYP9djMehNYEuX/8Ym/HtxMpGzRCLnc2uhP5K10ACe7OQD8hI4bzruxAURLpBH8J2H8F4XPvNJ4vDiDGJ1nDajnByC2Dsb/56bjDcK+Bt1/CcbjxX9EjknCv3BiJ5ppAoC533HO4LBsECui2iSL3Y8yYeBd7vwuVsjWvTLsdpGz5Pu3WonB5E3N5LdaiY8nilQGNYj6beh8GJ/OGFx81Rk4qZOm0fDuyFw9kSwQC7Gf72RlcThqj/Spc99LDKjNoiFG1Kr8LoUy1O5LLLd6l5gf0F/a2Nkc2IAOCOI3pREf1945gWRrYVRcgjV5lm+f7fzF+tQ+D6rwF1U3uLm2ggmeTdPPG3BPERDERmCobBR+RJpXO1wC3BeZMYczAO+vuC/uS2yfszeP/OADXQ/l6lsVmDVnQcjfLZteXxInnkab0fysrgaf56c2yIRN3XyTzAeS5NichyKZhA4Cws7xLp7nROe77zIBGrGgbBJLJL7iSdMNX49XBsEY0+Ez1cLzxaDzZ/sPfBQHh+U5+BvDQ3z3uFDoV++BKx10N51WNZ8DBO9WYDBfQgrDxCbYcjqHc2NcPd6HXa9ygBxMkwO+QYdCv7Y1sNQ+Dodu94hlhy8mL02mbh5lZyS4PP04BwljqO4cLzGwrNU9+bxxVhiWX9Ek31fQUb9deJlELuHKYYiaEuxCs4xixuAT4CdJf3t+4nnRNVkQuf2YCs91zzL7P0NEYsbsNybh/L6sLzddy8D349I5GQ74teBByvUttuCFyImo9/tAmdjeYh4Qx1j5+5TwB0Ul7iaF33hpXRG5MIG4C3Kv0ByW8RrYbwt/xD4kaM10YfVajs98jHK2J7nh33hs88+y/PzapjLMzaF+RZWXXcT5br+VwQFT4SGfziIjqK4Drgk8t1Q1q+P4yNxfjHmfl+cwLhk/DvsMtUyqWFhgeWJ9PlwEDoPU90TwIuAG4GFCa2FengH5OZRzNuD08ROwcQ2IMvG9Nf1FJ/jsAJLKKtFvKPdVvDf+1kQOLGTnbL6U6p7ymoFcBF2FUUqxjwz6D+qQDuamPe9J5H+zzwhC7G0ipeA5yrQrp6wFr5LHHeqtbMRyzVcmrcHB8yl9njkg5Mlwu4OO5/hLvyNQaw2zynAScTtqq+HZz1a8N8dAm5OZOc6HIz5nVTDPT8URE0K83sy/m3FROcbpBEGGU8Dy/3YO8aeNwteCxdiYajlpMkzwOV5f2g3BA5Y4aHLEtqFEV4eb2PXDLRay6UH+HL4OgeLFZOQsSnTTf8sVkMoJa/BJooPWZ2CHWX/JseTPVPaoY5na3ipjVaoTUuAexIfl2xsjmJe5d3YdQF5CZ4aljzfj4VjauGzU+7zehD6I3l/cLcETnaV/UCig5XRDLuC/8bxcOCxMKm/GBR7NsGHEp3cw8A1JXoVerGTOqm5g/diMf48DDZj5vGCIGb6gNOCYO8J8z7V3elEHoMNVCMsMp71pJPQ2qpNPwj8PXba80CY80fDWhods1ldyPHTt4uxcNOXwveaBOTn+nZvtza43SqCtCNMgBQZP3llKKamyPL0E3GA48fGUzE8WV7OG1iIrt0Cc6swt/KApnFLHKqouCG8aLZriCa16X81zaY2JTuS55zrCt3y4IC54NZpsMU0noQyvTdj2ZboXK1jYbp27yZahN1eL8M+8/6+CPi0wm1chSXga3MmukkDuJfu5LAC+Rb6G88IcFhjKKZgH9WpR7EmLLgUd6eX0v49SHuAczFPXF1Telpx80bFxQ1B7B7RcIku80E3xU23BQ7BaG7VOIoJ2Eo1jsiOFeQ7Ep2vg1jexXbar/a6GvMEvaWpPSmHscrBHri+2y8fkTTDwK3d/iPdFjg7sIJKQoznXapXTXRtwjvXISyX5mGsCGK7O//VwXjJm3MiDY4X6fTAEeABiRzRJXHzAAWcIKwV8DA/Ik3Xv5h6glf1ItPbE5+vg1ihsXYvf9yNHX/dqZfjCfN9g0PxPIx5NuWFF3mxFSujUohtKELg7MeKJ0nkCMLO/gWqe8HffuwOp5Tn6wXYUe9t2H1Q7bAWq7eT+stxOBj055y2fy12GagQeXCEAotbdvMU1Xi2o+Okwgz9pQ7auQ4ryJX6nG1gx+jbzR05FSsel9o1DBlPA1c4f4ZTgMfQqSrR+eb2agpMTagV+HB3Ii+OJnh1Q1PjWYMV9kqdAeyU1FNt2ouPwgs+xZDVVuw2d+98HASO8qpEJ7b/XgrOu+wp8G/twuLzqZelTtkT8CrVvb13Iu5I2PMwlmznPj8I1J1tfMZa7CJBEvEEZImU+yN5ni3An4X/lv0W7dj+wgVykSGqjG1aIEnSlcvUCkD383x+J/Yq8FCbv98H3BfE0kDEffQ68GCEz/YIVtxR60HMdC3sIZ9rYVqmVsLfXItCVSlO8nuctn0X5p7XiaDju/cLsQt127Ef+4PQjTVklZ08ejDS8b8RFXAVM18Lh8sSN1BsiCpjZ3hp6PK9NGhgBeA+cPwMz2Hu+R6UdMyYPpgH3BXWc6usIb6QVXYL9ZrIx/8KYC5KOhbTU6rXvowQVcazwEqNf/TiZneZCj5n7gbOlsg5gU7DMbOxmjvec53q2CWaVyQy7n3A4yhUJSa3/VdRcg5arcS/fT3Kyo+d0YjEDVh49QPN2xMYBL5N+yGro0EUjOA7ZHU4IXFDeHFdqbUgqipuoFwPDlgRsQeQqzPWnf3VxHOKZCxPodNVkxm2u4JYaYflwM0O7UEduDiItdQ4BSvoqLUgKmf3yxY4YHH4G5DbPyayI7IxJ+ZuJu6TQJ2InJ20n4cyG0vqnuNE6LyFeTL2JzzmvcATEjla+2EtHKhKg2oVaMMWdG9NbJN8UwLjeTmWc6F5eyID2NH6zUGstMpRrNL1Lqp92rIevq5IXNwQXmhXoXBV6nb/qiqJG6iGByfjbqAfhas8Uw9idW1Cz7weWKjd66Tz4b4OROAQdvlp1fp2GLtT51IN8Qn0YonHsuFpMYyFpQ5UrWFVEjhgpylO0wJxO8l3Ef8R2YlYh3ktNG8nFjkjdB6ymlsRodPArvC4QkM7Ibq3Ki2bD3Atdp1H5aiawAFzbavGgsSNN3SEfGqRcxhYTfs3U6/DPLxlipzYyh50i9oYOy7PZrxr+hMq7sWsosABO6WyQC8LNxM9tbDUZKzAyh/IqE8uhO+j/VyNIeDWkjY/nSZPp4jCt3HSwK5fWF31hlZV4IAVApyDPDlVFzedhB9ipD94G2TUJzeOOzoQxGV4B4ax3JJnNHwtczewVOtBG1oJHC0Ob7vxEeS5mYg+4F4s6XKZumPCuXMYKw/Rbu2YW7ACgwMFtPUHYccq2kOlQOIRN48CL3ppcNUFDlQj9i4+b/SfBzaqK6YV6DoZOPU86sQzsjQI7KEute0TrK7HqIYqF9F/H8qv9LpOP8FONLoqifAHP/zhD6vexjeB/4eFq76ouVY6DeyUxJPqiml5C7tU9o80dyfki8DJWJ7GW238/n8P4mghdrLptBwN+jYs36epYcqFo8ALwD8Ffq/14IY68A7wL3FYqduDByejP+yIpf7LEzZN4BoqeiSw4rvXB1BO2VRz61CHO8R/BZxHZ2GQrLBgJ9dNiOmpan0jcaKwqWGhdrfFTD0JHLCaGBtQifyiyXImVPujM1QvZ3qjuon2Q1ZZgnezjT4eBj7EckVEcbZcIatqrsPDWLV213gTOHpRlLO7fgV4SF2RCysxL5jm7uTGtdOTea2Umcg8k51UXBbtswq4ROuhUpvZTcBzMTyMV4FDWBB3IE9ON4VNM7xo5K7Pl+yUlW4kn5itWLz/Ztov/34LcP40/auTgNWgB/gxsEjroVR7/wGWdxZNUr1ngQMWI3wEOF07gNxVvAx/91H14+mN7oYOdpNnhBdnbVwfZ6dC1mGViUU1WBLGpCahU+gaOxTWya7YHs67wMnIktbQwuhY2DTDi1dem2IYBO6UyJmUPEJW64N3YBSYFX7eoq6tLKuw/I+m7HlX11VWNDPach+xCJwM5eZ0NuFfRbk2ZVC1CyWruMscpbOCe6uwU2z3qzvdcBtwrux5Vzay21JYC7EJHMJO7W5gnnbFM3557MFyQnT8u1wUspreMKvAZFrUgL/B8qkkdDpfP68DPyGR+k4xCpyM/rDjm6dd8aTCJtrYq2MGsXCrjPnkRnofDi76E10ROt/m8zlVYmo738S888kImxQETsZlwFVhUeilYRP+IHanyA51RyWZHcZnLrBc3TGhyGlip6x0R1R6/DVWk2tUNn3KNdKDlUz4eaqdkILAyegHbmTm9TFio455bNZjt8GK6rMOOEsiZ8o5/SwKWaXKEHZXWC/y6IzdwB7ArtJJvq5TSgIn4wzg2vA99iz9LDlzBEti3a/179KIq6z91CJnLwpZpUwv8H3gHOyUXGpiJ7PzLwG/pP3aURI4kZFVlc1eJDEZ/UPY5XYvapq7JztlpcT5yec7WM6d6tqkzSIsfNVP3Lk6WW7NCBaGUqhWAmfKHcAFWO0Fr3HdBnZL7yvAL7A8GxEXOjY7NTplJcaLnX8W1kwzgnUzHETbNsxTI1EjgdMyfUH9Xxx2zFXdBWQ3Hx8EXgZeAz7V8EXP2dhxcnlyJmYrVqX4KiIqOS86ZjZWI+3rwb73OFhDY1MM3sZOux7VUErg5Mni8FL5FnaqpayFkVWePAi8iSUKyx2fJjUsiTDVhPmZ7nbXoBIIYmLmBNu+BPhaWEuUuJ7GbljfCfN2N3BEQyWBU/RO4IywMP4h8GXgpPD/OklaztyPzfCdIGL+B/B+mOxS72IsN2F1QZSAPPmmQNW5RSsbh7Mwz/1C4E+wew5rY2zzYAdzMfuMJlbL6b9gCfKHgXdJrEaNBI7PXcEiLJP/GHDamJ0B4wRMEzvVtH+MONL9T6JV+oF7kCdnqhfLYSy/TohOBVAmgnqYPgSa/Zt3xwgbIYEjhGiBHixkpardE5OdOFmjTYQQEjhCCH/cBFyIvDmTUcfu4nlQXSGEBI4Qwhf9WAVkeXImJruD7Up0ykoICRwhhCtq2CWqi1DNnMmoA2vRtSVCSOAIIdyxCrhEImdKkTOC5eYIISRwhBCOWIjdTA7KzZmILGR1A6o5IoQEjhDCHeuD2FFuzsRsxcJ6w+oKISRwhBC+WAVcKpEzKcNYyGqtukIICRwhhC8WY54KD3fxlCVyPgGuR5XDhZDAEUK4QyGrqakD94bvQggJHCGEIxSympoG8Gvg36grhJDAEUL4YjGWczIHHSefiOwuq2uBT9UdQkjgCCF8sQ5YIpEzpdC5D52yEkICRwjhjhWYp0IiZ3KRo8KAQkjgCCEc0od5KuajU1YTkRUGvBU4oO4QQgJHCOELhaympg5sALaoK4SQwBFC+EIhq6kZBnahkJUQEjhCCHf0YvVgFqDj5BORhaxuB/arO4SQwBFC+OIeLGQlkTMxdexS0xfVFUJI4AghfHEZcDUKWU1GA9iJQlZCSOAIIdwxG0uunSuhMyF17C6rtcAedYcQEjhCCF+sA5aio+STMQw8D2xUVwhRDj3qAiFEG6zBPDjN8LNyc47TCLb1H2EeL91KLkQJyIMjhOiUR4BFiYucehB7LwC/QkUAhSgdeXCEEJ1yYxA3TdLJy6mH73uwG8eHkadGiEohD44QIi9qwN3Em5vTAEax+6jewE5MCSEkcIQQibAoCJ15EQidBnAMCz29hkJPQkjgCCGSpx8LX/UCyxwJmiYWenob2IpCT0JI4AghxBRCZz7VTETOQk+7gFfCdyGEBI4QQsxY6FwFnF4BoVPHcoaeRaeehJDAEUKIHJiNXftwSfi5CLFTx7w0HwHb0aknISRwhBCii/QBFwDfBU7CvCrLchY17wGvolNPQkjgCCFESSwBvgF8FTuFlTETL09Wm+YgliD8y/DfQggJHCGEqBy9mKdnVvjvXqxI6WFgH3bq6QiwF/PYCCGEBI4QQggh4qOmLhBCCCGEBI4QQgghhASOEEIIIYQEjhBCCCGEBI4QQgghhASOEEIIISRwhBBCCCE88f8BF0OLxCbbzvMAAAAASUVORK5CYII=" x="11" y="31.7" width="78" height="32.7"/><rect x="30" y="80" width="40" height="3.5" rx="1.75" fill="#CCA424"/></svg>
\ No newline at end of file
added content/imm1003/assets/brand/icon-192.png +0 −0

Binary file not shown.

added content/imm1003/assets/brand/icon-512.png +0 −0

Binary file not shown.

added content/imm1003/assets/brand/uqo-logo-white.png +0 −0

Binary file not shown.

added content/imm1003/assets/brand/uqo-logo.png +0 −0

Binary file not shown.

added content/imm1003/assets/css/site.css +820 −0
@@ -0,0 +1,820 @@
1 +/* =============================================================================
2 + UQO — Notes de cours interactives — feuille de style v2
3 + Identité : bleu nuit / bleu UQO / or ; Fraunces (titres), Source Serif 4
4 + (prose), Fira Sans (interface). Couleur d’accent par partie du cours.
5 + ============================================================================= */
6 +
7 +:root {
8 + --navy: #091a33; --navy-2: #0f2a52; --navy-3: #133566;
9 + --uqo: #0f6180; --bleu: #0b4f78; --bleu-clair: #2a86b0; --bleu-pale: #e3f0f6;
10 + --or: #cca424; --or-fonce: #9e7d1c; --or-pale: #f7efd2;
11 + --gris: #606670; --gris-clair: #d0d5dc; --gris-pale: #e7ebf0;
12 + --vert: #107c4e; --rouge: #b22a20; --teal: #0f8b8d; --violet: #6b4fbb;
13 + --bg: #ffffff; --bg-clair: #f3f7fa; --bg-2: #f8fafc; --card: #ffffff; --border: #e3e8ee;
14 + --ink: #1d2430; --ink-2: #4d5665; --link: #0b4f78;
15 + --part: var(--uqo); --part-soft: rgba(15, 97, 128, .12);
16 + --shadow: 0 1px 2px rgba(9, 26, 51, .05), 0 10px 28px -16px rgba(9, 26, 51, .18);
17 + --shadow-sm: 0 1px 2px rgba(9, 26, 51, .07);
18 + --shadow-lg: 0 24px 60px -24px rgba(9, 26, 51, .35);
19 + --radius: 12px; --radius-sm: 8px; --radius-xs: 6px;
20 + --text-w: 68ch; --margin-w: 260px; --margin-gap: 40px; --topbar-h: 62px;
21 + --font: "Fira Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
22 + --serif: "Source Serif 4", "Iowan Old Style", Georgia, "Times New Roman", serif;
23 + --display: "Fraunces", "Source Serif 4", Georgia, serif;
24 + --mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
25 + --fs: 17.5px; --lh: 1.68;
26 + color-scheme: light;
27 +}
28 +[data-theme="dark"] {
29 + --navy: #070f1e; --navy-2: #0c1d38; --navy-3: #11284c;
30 + --uqo: #4fb0d6; --bleu: #7dbfe0; --bleu-clair: #98cde8; --bleu-pale: #17324a;
31 + --or: #e3c04f; --or-fonce: #d1ac36; --or-pale: #2d2812;
32 + --gris: #a4abb8; --gris-clair: #38414f; --gris-pale: #262d3a;
33 + --vert: #5cc496; --rouge: #f28078; --teal: #4fc0c2; --violet: #a893e8;
34 + --bg: #0e131d; --bg-clair: #151c2a; --bg-2: #121827; --card: #171e2d; --border: #27303f;
35 + --ink: #e7ebf2; --ink-2: #b9c1cd; --link: #93c1f0;
36 + --part-soft: rgba(147, 193, 240, .12);
37 + --shadow: 0 1px 2px rgba(0, 0, 0, .4), 0 12px 32px -16px rgba(0, 0, 0, .7);
38 + --shadow-sm: 0 1px 2px rgba(0, 0, 0, .5);
39 + --shadow-lg: 0 24px 60px -24px rgba(0, 0, 0, .8);
40 + color-scheme: dark;
41 +}
42 +body[data-part="1"] { --part: #2976bb; --part-soft: rgba(41, 118, 187, .13); }
43 +body[data-part="2"] { --part: #0f8b8d; --part-soft: rgba(15, 139, 141, .13); }
44 +body[data-part="3"] { --part: #cca424; --part-soft: rgba(204, 164, 36, .16); }
45 +body[data-part="4"] { --part: #6b4fbb; --part-soft: rgba(107, 79, 187, .13); }
46 +body[data-part="5"] { --part: #107c4e; --part-soft: rgba(16, 124, 78, .13); }
47 +[data-theme="dark"] body[data-part="1"] { --part: #7fb4ea; } [data-theme="dark"] body[data-part="2"] { --part: #4fc0c2; } [data-theme="dark"] body[data-part="3"] { --part: #e3c04f; } [data-theme="dark"] body[data-part="4"] { --part: #a893e8; } [data-theme="dark"] body[data-part="5"] { --part: #5cc496; }
48 +[data-fs="s"] { --fs: 15.5px; } [data-fs="l"] { --fs: 19.5px; } [data-fs="xl"] { --fs: 21.5px; }
49 +
50 +*, *::before, *::after { box-sizing: border-box; }
51 +html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; scroll-padding-top: calc(var(--topbar-h) + 70px); }
52 +@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } *, *::before, *::after { transition: none !important; animation: none !important; } }
53 +body { margin: 0; font-family: var(--font); font-size: var(--fs); line-height: var(--lh); color: var(--ink); background: var(--bg); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; }
54 +img { max-width: 100%; height: auto; }
55 +svg[aria-hidden="true"] { width: 1em; height: 1em; flex: 0 0 auto; vertical-align: -.12em; }
56 +.hero-deco, .ch-hero .deco { width: 100%; height: 100%; }
57 +svg.wchart, svg.course-map { width: 100%; height: auto; }
58 +a { color: var(--link); text-decoration-thickness: 1px; text-underline-offset: 3px; text-decoration-color: color-mix(in srgb, currentColor 40%, transparent); transition: text-decoration-color .15s; }
59 +a:hover { text-decoration-color: currentColor; }
60 +code, kbd { font-family: var(--mono); font-size: .88em; }
61 +code { background: var(--bg-clair); padding: .1em .4em; border-radius: 4px; }
62 +kbd { border: 1px solid var(--border); border-bottom-width: 2px; border-radius: 4px; padding: 0 .4em; background: var(--card); font-size: .78em; }
63 +hr.sep { border: 0; height: 1px; background: linear-gradient(90deg, transparent, var(--gris-clair) 20%, var(--gris-clair) 80%, transparent); margin: 2.4rem auto; position: relative; max-width: 60%; }
64 +hr.sep::after { content: ""; position: absolute; left: 50%; top: -3px; width: 7px; height: 7px; border-radius: 50%; background: var(--or); transform: translateX(-50%); }
65 +.skip { position: absolute; left: -999px; top: 8px; background: var(--or); color: var(--navy); padding: .5rem 1rem; border-radius: 6px; z-index: 1000; font-weight: 600; }
66 +.skip:focus { left: 8px; }
67 +.muted { color: var(--gris); }
68 +.c-bleu { color: var(--bleu); } .c-bleu-clair { color: var(--bleu-clair); } .c-or { color: var(--or-fonce); } [data-theme="dark"] .c-or { color: var(--or); }
69 +.c-gris { color: var(--gris); } .c-gris-clair { color: var(--gris-clair); } .c-vert { color: var(--vert); } .c-rouge { color: var(--rouge); } .c-navy { color: var(--navy); } [data-theme="dark"] .c-navy { color: var(--ink); } .c-white { color: inherit; }
70 +.upper { text-transform: uppercase; } .sc { font-variant: small-caps; } .num { white-space: nowrap; font-variant-numeric: tabular-nums; }
71 +
72 +/* révélation au défilement */
73 +.reveal { opacity: 0; transform: translateY(14px); transition: opacity .55s cubic-bezier(.2, .7, .2, 1), transform .55s cubic-bezier(.2, .7, .2, 1); }
74 +.reveal.in { opacity: 1; transform: none; }
75 +.reveal:nth-child(2) { transition-delay: .06s; } .reveal:nth-child(3) { transition-delay: .12s; } .reveal:nth-child(4) { transition-delay: .18s; }
76 +
77 +/* =============================================================================
78 + Barre supérieure (claire, logo UQO)
79 + ============================================================================= */
80 +.topbar { position: sticky; top: 0; z-index: 100; background: rgba(255, 255, 255, .86); backdrop-filter: saturate(160%) blur(12px); -webkit-backdrop-filter: saturate(160%) blur(12px); color: var(--ink); border-bottom: 1px solid var(--border); transition: box-shadow .2s; }
81 +[data-theme="dark"] .topbar { background: rgba(14, 19, 29, .86); }
82 +.topbar::after { content: ""; position: absolute; left: 0; right: 0; bottom: -2px; height: 2px; background: linear-gradient(90deg, var(--uqo), var(--or) 60%, var(--uqo)); opacity: .9; }
83 +.topbar.scrolled { box-shadow: 0 10px 30px -18px rgba(9, 26, 51, .35); }
84 +.topbar-inner { max-width: 1440px; margin: 0 auto; padding: 0 22px; height: var(--topbar-h); display: flex; align-items: center; gap: 18px; }
85 +.brand { display: flex; align-items: center; gap: 12px; color: var(--ink); text-decoration: none; min-width: 0; }
86 +.brand-logo { height: 30px; width: auto; display: block; }
87 +[data-theme="dark"] .brand-logo { filter: brightness(0) invert(1); opacity: .92; }
88 +.brand-sep { width: 1px; height: 30px; background: var(--border); }
89 +.brand-text { display: flex; flex-direction: column; min-width: 0; line-height: 1.05; }
90 +.brand-code { font-weight: 800; letter-spacing: .06em; font-size: 1rem; color: var(--uqo); }
91 +.brand-title { font-size: .76rem; color: var(--ink-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 300px; }
92 +.topnav { display: flex; gap: 2px; margin-left: auto; align-items: center; }
93 +.topnav > a, .topnav > .dd > button { color: var(--ink); text-decoration: none; font-size: .9rem; font-weight: 600; padding: 8px 12px; border-radius: 8px; background: none; border: 0; cursor: pointer; font-family: inherit; display: inline-flex; align-items: center; gap: 6px; transition: background .15s, color .15s; }
94 +.topnav > a:hover, .topnav > .dd > button:hover, .topnav > a[aria-current="page"], .topnav > .dd.current > button, .topnav > .dd.open > button { background: var(--bg-clair); color: var(--uqo); }
95 +.topnav > a[aria-current="page"], .topnav > .dd.current > button { box-shadow: inset 0 -2px 0 var(--or); }
96 +.dd { position: relative; }
97 +.dd > button .caret { font-size: .7em; opacity: .6; transition: transform .15s; }
98 +.dd.open > button .caret { transform: rotate(180deg); }
99 +.dd-menu { position: absolute; top: calc(100% + 10px); left: 0; min-width: 320px; background: var(--card); color: var(--ink); border: 1px solid var(--border); border-radius: var(--radius); box-shadow: var(--shadow-lg); padding: 10px; display: none; gap: 2px; z-index: 200; animation: pop .16s ease-out; }
100 +@keyframes pop { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } }
101 +.dd-menu.wide { min-width: 660px; grid-template-columns: 1fr 1fr; gap: 2px 14px; right: auto; }
102 +.dd.open .dd-menu { display: grid; }
103 +.dd:last-child .dd-menu { left: auto; right: 0; }
104 +.dd-menu a { display: flex; gap: 10px; align-items: flex-start; padding: 8px 10px; border-radius: 8px; text-decoration: none; color: var(--ink); font-size: .88rem; line-height: 1.3; }
105 +.dd-menu a:hover { background: var(--bg-clair); }
106 +.dd-menu a .dd-desc { display: block; font-size: .75rem; color: var(--gris); margin-top: 2px; font-weight: 400; }
107 +.dd-menu a .dd-ico { width: 30px; height: 30px; border-radius: 8px; background: var(--bleu-pale); display: grid; place-items: center; flex: 0 0 auto; color: var(--uqo); }
108 +.dd-menu a .dd-ico svg { width: 16px; height: 16px; }
109 +.dd-menu .dd-part { grid-column: 1 / -1; font-size: .7rem; text-transform: uppercase; letter-spacing: .1em; color: var(--gris); margin: 8px 10px 2px; font-weight: 700; display: flex; align-items: center; gap: 8px; }
110 +.dd-menu .dd-part i { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }
111 +.dd-menu .dd-part:first-child { margin-top: 0; }
112 +.pastille { flex: 0 0 auto; display: inline-grid; place-items: center; width: 26px; height: 26px; border-radius: 50%; background: var(--uqo); color: #fff; font-size: .72rem; font-weight: 700; }
113 +.pastille.done { background: var(--vert) !important; color: #fff !important; }
114 +.topbar-actions { display: flex; gap: 6px; align-items: center; }
115 +.icon-btn { appearance: none; background: var(--bg-clair); border: 1px solid var(--border); color: var(--ink); width: 38px; height: 38px; border-radius: 10px; cursor: pointer; display: inline-grid; place-items: center; transition: background .15s, color .15s; }
116 +.icon-btn:hover { background: var(--bleu-pale); color: var(--uqo); }
117 +.icon-btn svg { width: 18px; height: 18px; }
118 +.search-btn { width: auto; padding: 0 12px; gap: 8px; font-family: inherit; font-size: .85rem; display: inline-flex; align-items: center; white-space: nowrap; }
119 +.menu-btn { display: none; }
120 +.readbar { height: 3px; background: var(--gris-pale); }
121 +.readbar-fill { height: 100%; width: 0; background: linear-gradient(90deg, var(--uqo), var(--or)); transition: width .1s linear; }
122 +@media (max-width: 1080px) {
123 + .topnav { display: none; position: absolute; top: var(--topbar-h); left: 0; right: 0; background: var(--card); flex-direction: column; align-items: stretch; padding: 10px 14px 16px; border-bottom: 2px solid var(--or); gap: 4px; max-height: calc(100vh - var(--topbar-h)); overflow: auto; box-shadow: var(--shadow-lg); }
124 + .topnav.open { display: flex; }
125 + .topnav > a, .topnav > .dd > button { padding: 12px 14px; font-size: 1rem; width: 100%; justify-content: space-between; }
126 + .dd-menu, .dd-menu.wide { position: static; min-width: 0; grid-template-columns: 1fr; box-shadow: none; animation: none; border: 0; background: var(--bg-clair); }
127 + .menu-btn { display: inline-grid; }
128 + .brand-title { display: none; }
129 + .brand-logo { height: 26px; }
130 + .search-btn span, .search-btn kbd { display: none; }
131 + .search-btn { width: 38px; padding: 0; }
132 +}
133 +
134 +/* =============================================================================
135 + Pied de page
136 + ============================================================================= */
137 +.site-footer { margin-top: 90px; background: linear-gradient(160deg, #0b3d52, #0f6180); color: rgba(255, 255, 255, .78); border-top: 3px solid var(--or); font-size: .9rem; position: relative; overflow: hidden; }
138 +.site-footer::before { content: ""; position: absolute; right: -120px; top: -120px; width: 420px; height: 420px; border-radius: 50%; border: 1px solid rgba(41, 118, 187, .3); }
139 +.footer-inner { max-width: 1240px; margin: 0 auto; padding: 46px 22px 30px; display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 30px; position: relative; }
140 +.footer-inner h4 { color: #fff; margin: 0 0 10px; font-size: .78rem; text-transform: uppercase; letter-spacing: .1em; }
141 +.footer-inner a { color: rgba(255, 255, 255, .85); text-decoration: none; display: block; padding: 3px 0; }
142 +.footer-inner a:hover { color: var(--or); }
143 +.footer-brand .brand-code { font-size: 1.5rem; font-family: var(--display); font-weight: 700; color: var(--or); }
144 +.footer-legal { border-top: 1px solid rgba(255, 255, 255, .1); }
145 +.footer-legal div { max-width: 1240px; margin: 0 auto; padding: 14px 22px; font-size: .78rem; color: rgba(255, 255, 255, .6); display: flex; gap: 20px; flex-wrap: wrap; justify-content: space-between; }
146 +@media (max-width: 900px) { .footer-inner { grid-template-columns: 1fr 1fr; } }
147 +@media (max-width: 560px) { .footer-inner { grid-template-columns: 1fr; } }
148 +
149 +/* =============================================================================
150 + Mise en page générique
151 + ============================================================================= */
152 +.page { max-width: 1240px; margin: 0 auto; padding: 0 22px; }
153 +.page-head { padding: 52px 0 22px; position: relative; }
154 +.page-head h1 { font-family: var(--display); font-weight: 600; font-size: clamp(1.8rem, 3vw, 2.5rem); margin: 0 0 8px; color: var(--bleu); line-height: 1.1; letter-spacing: -.01em; font-variation-settings: "opsz" 144; }
155 +.page-head .lead { color: var(--ink-2); font-size: 1.08rem; max-width: 74ch; margin: 0; font-family: var(--serif); }
156 +.eyebrow { font-size: .72rem; text-transform: uppercase; letter-spacing: .16em; color: var(--or-fonce); font-weight: 700; display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
157 +[data-theme="dark"] .eyebrow { color: var(--or); }
158 +.eyebrow::before { content: ""; width: 26px; height: 3px; background: var(--or); border-radius: 2px; }
159 +.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; } .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; } .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
160 +@media (max-width: 900px) { .grid-3, .grid-4 { grid-template-columns: 1fr 1fr; } }
161 +@media (max-width: 600px) { .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; } }
162 +.card { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 18px 20px; box-shadow: none; transition: transform .15s, box-shadow .2s, border-color .2s; }
163 +a.card:hover { transform: translateY(-2px); box-shadow: var(--shadow); border-color: var(--bleu-clair); }
164 +.card h3 { margin: 0 0 8px; font-size: 1.05rem; color: var(--bleu); display: flex; align-items: center; gap: 8px; }
165 +.card h3 svg { width: 18px; height: 18px; color: var(--or-fonce); }
166 +.btn { display: inline-flex; align-items: center; gap: 8px; padding: 11px 18px; border-radius: 10px; font-weight: 600; font-size: .92rem; text-decoration: none; cursor: pointer; border: 1px solid transparent; font-family: var(--font); line-height: 1.2; background: var(--bleu); color: #fff; transition: transform .12s, box-shadow .2s, background .15s; }
167 +.btn:hover { transform: translateY(-1px); box-shadow: var(--shadow); text-decoration: none; }
168 +.btn:active { transform: translateY(0); }
169 +.btn svg { width: 17px; height: 17px; }
170 +.btn-or { background: linear-gradient(135deg, #e0bb47, var(--or)); color: var(--navy); }
171 +.btn-ghost { background: transparent; color: var(--bleu); border-color: var(--border); }
172 +[data-theme="dark"] .btn { background: var(--bleu-clair); color: var(--navy); } [data-theme="dark"] .btn-ghost { background: transparent; color: var(--bleu-clair); } [data-theme="dark"] .btn-or { color: var(--navy); }
173 +.btn-sm { padding: 7px 12px; font-size: .82rem; border-radius: 8px; }
174 +.btn:disabled { opacity: .5; cursor: not-allowed; transform: none; box-shadow: none; }
175 +.btn-ok { background: var(--vert) !important; color: #fff !important; } .btn-ko { background: var(--rouge) !important; color: #fff !important; }
176 +.chip { display: inline-flex; align-items: center; gap: 6px; padding: 4px 11px; border-radius: 999px; font-size: .77rem; font-weight: 600; background: var(--bg-clair); color: var(--ink-2); border: 1px solid var(--border); white-space: nowrap; line-height: 1.3; }
177 +.chip svg { width: 13px; height: 13px; }
178 +.chip-or { background: var(--or-pale); color: var(--or-fonce); border-color: rgba(204, 164, 36, .4); } [data-theme="dark"] .chip-or { color: var(--or); }
179 +.chip-vert { background: rgba(16, 124, 78, .12); color: var(--vert); border-color: rgba(16, 124, 78, .3); }
180 +.chip-rouge { background: rgba(178, 42, 32, .1); color: var(--rouge); border-color: rgba(178, 42, 32, .3); }
181 +.chip-bleu { background: var(--bleu-pale); color: var(--bleu); border-color: rgba(41, 118, 187, .3); }
182 +.chip-part { background: var(--part-soft); color: var(--part); border-color: transparent; }
183 +.select, .input { font: inherit; padding: 9px 12px; border: 1px solid var(--border); border-radius: 9px; background: var(--card); color: var(--ink); }
184 +.input:focus, .select:focus, textarea:focus { outline: 2px solid var(--bleu-clair); outline-offset: 1px; }
185 +
186 +/* toasts, confettis */
187 +.toasts { position: fixed; right: 18px; bottom: 90px; z-index: 900; display: grid; gap: 8px; }
188 +.toast { background: var(--navy); color: #fff; padding: 12px 16px; border-radius: 10px; box-shadow: var(--shadow-lg); font-size: .9rem; opacity: 0; transform: translateY(8px); transition: all .25s; border-left: 4px solid var(--or); max-width: 340px; }
189 +.toast.in { opacity: 1; transform: none; } .toast.ok { border-left-color: var(--vert); } .toast.ko { border-left-color: var(--rouge); }
190 +.confetti { position: fixed; inset: 0; pointer-events: none; z-index: 950; }
191 +
192 +/* =============================================================================
193 + Accueil
194 + ============================================================================= */
195 +.hero { position: relative; overflow: hidden; color: var(--ink); background: radial-gradient(900px 520px at 85% -20%, rgba(15, 97, 128, .16), transparent 60%), radial-gradient(700px 400px at 5% 110%, rgba(204, 164, 36, .14), transparent 60%), linear-gradient(180deg, #f5f9fb 0%, #ffffff 100%); border-bottom: 1px solid var(--border); }
196 +[data-theme="dark"] .hero { background: radial-gradient(900px 520px at 85% -20%, rgba(79, 176, 214, .18), transparent 60%), linear-gradient(180deg, #121a2a 0%, var(--bg) 100%); }
197 +.hero-inner { max-width: 1240px; margin: 0 auto; padding: 48px 22px 52px; position: relative; z-index: 1; display: grid; grid-template-columns: 1.25fr .9fr; gap: 48px; align-items: center; }
198 +.hero-brand { display: flex; align-items: center; gap: 14px; margin-bottom: 26px; }
199 +.hero-brand img { height: 48px; width: auto; }
200 +[data-theme="dark"] .hero-brand img { filter: brightness(0) invert(1); }
201 +.hero-brand span { font-size: .8rem; color: var(--ink-2); border-left: 1px solid var(--border); padding-left: 14px; line-height: 1.3; max-width: 220px; }
202 +.hero .eyebrow { color: var(--uqo); }
203 +.hero .eyebrow::before { background: var(--or); }
204 +.hero h1 { font-family: var(--display); font-weight: 600; font-size: clamp(2.1rem, 4vw, 3.4rem); line-height: 1.03; margin: 0 0 22px; letter-spacing: -.015em; color: var(--bleu); font-variation-settings: "opsz" 144, "SOFT" 30; }
205 +.hero h1 .code { display: block; font-family: var(--font); font-size: .36em; letter-spacing: .16em; color: var(--uqo); font-weight: 700; margin-bottom: 14px; }
206 +.hero .lead { font-family: var(--serif); font-size: 1.16rem; color: var(--ink-2); max-width: 60ch; margin: 0 0 28px; line-height: 1.6; }
207 +.hero-cta { display: flex; gap: 12px; flex-wrap: wrap; }
208 +.hero-deco { position: absolute; inset: 0; pointer-events: none; }
209 +.hero-deco circle { fill: none; stroke: rgba(15, 97, 128, .10); stroke-width: 1; }
210 +.hero-deco .gold { stroke: rgba(204, 164, 36, .55); }
211 +.hero-deco .dot { fill: var(--or); stroke: none; }
212 +.hero-card { background: linear-gradient(160deg, var(--navy), #0f3a55); color: #fff; border: 1px solid rgba(255, 255, 255, .1); border-radius: 18px; padding: 24px 26px; box-shadow: var(--shadow-lg); }
213 +.hero-card h3 { margin: 0 0 12px; font-size: .74rem; text-transform: uppercase; letter-spacing: .14em; color: var(--or); }
214 +.hero-card .resume-title { font-family: var(--display); font-size: 1.3rem; font-weight: 600; margin-bottom: 6px; }
215 +.hero-card .muted { color: rgba(255, 255, 255, .72); font-size: .9rem; }
216 +.hero-card .bar { height: 7px; background: rgba(255, 255, 255, .15); border-radius: 4px; margin: 14px 0; overflow: hidden; }
217 +.hero-card .bar i { display: block; height: 100%; background: linear-gradient(90deg, var(--or), #f1d67a); width: 0; border-radius: 4px; transition: width .6s ease; }
218 +.hero-card .btn { margin-top: 8px; }
219 +.hero-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-top: 30px; }
220 +.stat { background: var(--card); border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; transition: transform .15s, box-shadow .2s; box-shadow: var(--shadow-sm); }
221 +.stat:hover { transform: translateY(-2px); box-shadow: var(--shadow); }
222 +.stat b { display: block; font-family: var(--font); font-size: 1.45rem; font-weight: 700; color: var(--uqo); line-height: 1.05; letter-spacing: -.01em; font-variant-numeric: tabular-nums; }
223 +.stat span { font-size: .68rem; color: var(--gris); text-transform: uppercase; letter-spacing: .06em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block; }
224 +@media (max-width: 900px) { .hero-inner { grid-template-columns: 1fr; padding: 40px 22px 40px; gap: 28px; } .hero-stats { grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 26px; } .hero h1 { font-size: clamp(2rem, 9vw, 2.8rem); } .hero-brand img { height: 40px; } .stat b { font-size: 1.4rem; } }
225 +
226 +.section { padding: 44px 0 8px; }
227 +.section-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 20px; margin-bottom: 22px; flex-wrap: wrap; }
228 +.section-head h2 { margin: 0; font-family: var(--display); font-weight: 600; font-size: 1.6rem; color: var(--bleu); letter-spacing: -.01em; }
229 +.section-head p { margin: 6px 0 0; color: var(--ink-2); font-family: var(--serif); font-size: 1.02rem; }
230 +
231 +/* parcours (ligne du temps) */
232 +.timeline { display: grid; grid-template-columns: repeat(14, 1fr); gap: 6px; position: relative; padding: 10px 0 0; }
233 +.timeline::before { content: ""; position: absolute; left: 3%; right: 3%; top: 25px; height: 2px; background: var(--gris-pale); border-radius: 2px; }
234 +.timeline-item { position: relative; display: flex; flex-direction: column; align-items: center; text-decoration: none; color: var(--ink-2); font-size: .72rem; text-align: center; gap: 8px; }
235 +.timeline-item .dot { width: 30px; height: 30px; border-radius: 50%; background: var(--card); border: 2px solid var(--tl, var(--bleu-clair)); display: grid; place-items: center; font-weight: 700; color: var(--tl, var(--bleu)); font-size: .78rem; position: relative; z-index: 1; transition: transform .15s; }
236 +.timeline-item:hover .dot { transform: scale(1.12); }
237 +.timeline-item.started .dot { background: var(--tl, var(--bleu-clair)); color: #fff; }
238 +.timeline-item.done .dot { background: var(--vert); border-color: var(--vert); color: #fff; }
239 +.timeline-item .tl-ev { display: grid; gap: 3px; }
240 +.timeline-item .tl-ev span { display: block; padding: 2px 6px; border-radius: 6px; font-size: .66rem; font-weight: 600; line-height: 1.25; }
241 +.tl-tp { background: var(--or-pale); color: var(--or-fonce); } .tl-remise { background: var(--bleu-pale); color: var(--bleu); } .tl-exam { background: rgba(178, 42, 32, .1); color: var(--rouge); }
242 +[data-theme="dark"] .tl-tp { color: var(--or); }
243 +@media (max-width: 900px) { .timeline { grid-template-columns: repeat(7, 1fr); gap: 10px 6px; } .timeline::before { display: none; } }
244 +
245 +/* cartes de séance */
246 +.part-title { display: flex; align-items: center; gap: 12px; margin: 26px 0 12px; color: var(--ink-2); font-size: .74rem; text-transform: uppercase; letter-spacing: .12em; font-weight: 700; }
247 +.part-title::after { content: ""; flex: 1; height: 1px; background: var(--border); }
248 +.part-title .roman { color: var(--pc, var(--or-fonce)); display: inline-flex; align-items: center; gap: 8px; }
249 +.part-title .roman i { width: 12px; height: 12px; border-radius: 4px; background: var(--pc, var(--or)); display: inline-block; }
250 +.seances { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 12px; }
251 +.seance-card { position: relative; display: flex; flex-direction: column; gap: 8px; background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 14px 16px 14px; text-decoration: none; color: var(--ink); transition: transform .15s, box-shadow .2s, border-color .2s; overflow: hidden; }
252 +.seance-card::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: var(--pc, var(--uqo)); }
253 +.seance-card:hover { transform: translateY(-2px); box-shadow: var(--shadow); border-color: var(--pc, var(--uqo)); }
254 +.seance-card .sc-top { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
255 +.seance-card .sc-num { font-size: .66rem; text-transform: uppercase; letter-spacing: .14em; color: var(--pc, var(--uqo)); font-weight: 700; }
256 +.seance-card h3 { margin: 0; font-family: var(--font); font-weight: 700; font-size: 1rem; line-height: 1.3; color: var(--ink); letter-spacing: -.005em; }
257 +.seance-card .sc-meta { display: flex; gap: 4px 12px; flex-wrap: wrap; font-size: .74rem; color: var(--gris); margin-top: auto; padding-top: 6px; border-top: 1px dashed var(--border); }
258 +.seance-card .sc-meta span { display: inline-flex; gap: 5px; align-items: center; white-space: nowrap; }
259 +.seance-card .sc-meta svg { width: 13px; height: 13px; color: var(--pc, var(--uqo)); }
260 +.seance-card .sc-events { display: flex; gap: 6px; flex-wrap: wrap; }
261 +.seance-card .sc-events .chip { font-size: .68rem; padding: 2px 8px; }
262 +.ring { --p: 0; width: 28px; height: 28px; border-radius: 50%; background: conic-gradient(var(--vert) calc(var(--p) * 1%), var(--gris-pale) 0); display: grid; place-items: center; flex: 0 0 auto; }
263 +.ring::after { content: ""; width: 21px; height: 21px; border-radius: 50%; background: var(--card); }
264 +.ring[data-done="1"] { background: var(--vert); }
265 +.ring[data-done="1"]::after { content: "✓"; color: var(--vert); font-weight: 800; font-size: .7rem; display: grid; place-items: center; }
266 +
267 +.eval-table { width: 100%; border-collapse: collapse; font-size: .95rem; }
268 +.eval-table th, .eval-table td { padding: 11px 13px; border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; }
269 +.eval-table th { background: var(--navy); color: #fff; font-weight: 600; font-size: .82rem; text-transform: uppercase; letter-spacing: .06em; }
270 +.eval-table tr:nth-child(even) td { background: var(--bg-2); }
271 +.eval-table td.al-c { text-align: center; }
272 +.eval-table .total td { font-weight: 700; border-top: 2px solid var(--or); }
273 +
274 +.feature { display: flex; gap: 14px; align-items: flex-start; padding: 16px 18px; border-radius: 12px; background: var(--card); border: 1px solid var(--border); text-decoration: none; color: inherit; transition: transform .15s, box-shadow .2s; }
275 +.feature:hover { transform: translateY(-2px); box-shadow: var(--shadow); }
276 +.feature .f-icon { flex: 0 0 40px; width: 40px; height: 40px; border-radius: 10px; display: grid; place-items: center; background: var(--bleu-pale); color: var(--uqo); }
277 +.feature .f-icon svg { width: 19px; height: 19px; }
278 +.feature h3 { margin: 0 0 4px; font-size: 1rem; color: var(--bleu); }
279 +.feature p { margin: 0; color: var(--ink-2); font-size: .9rem; line-height: 1.5; }
280 +.feature .f-new { font-size: .62rem; text-transform: uppercase; letter-spacing: .1em; background: var(--or); color: var(--navy); padding: 2px 6px; border-radius: 4px; margin-left: 6px; vertical-align: middle; }
281 +
282 +/* carte du cours */
283 +.course-map { width: 100%; max-width: 760px; margin: 0 auto; display: block; }
284 +.course-map .ring-part { fill: none; stroke-width: 26; opacity: .16; }
285 +.course-map .node { cursor: pointer; }
286 +.course-map .node circle { fill: var(--card); stroke: var(--pc); stroke-width: 3; transition: r .15s, stroke-width .15s; }
287 +.course-map .node text { font-family: var(--font); font-size: 13px; font-weight: 700; fill: var(--ink); pointer-events: none; }
288 +.course-map .node .lbl { font-size: 10px; font-weight: 500; fill: var(--ink-2); }
289 +.course-map .node:hover circle, .course-map .node.active circle { stroke-width: 5; fill: var(--pc); }
290 +.course-map .node:hover text, .course-map .node.active text { fill: #fff; }
291 +.course-map .node:hover .lbl, .course-map .node.active .lbl { fill: var(--ink-2); }
292 +.course-map .node.done circle { fill: var(--vert); stroke: var(--vert); } .course-map .node.done text { fill: #fff; }
293 +.course-map .node.started circle { fill: var(--pc); fill-opacity: .35; }
294 +.course-map .center { fill: var(--navy); }
295 +.course-map .center-t { font-family: var(--display); font-weight: 700; fill: var(--or); font-size: 26px; }
296 +.course-map .center-s { font-family: var(--font); fill: #fff; font-size: 11px; }
297 +.course-map .part-lbl { font-family: var(--font); font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .08em; }
298 +.map-layout { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(280px, .9fr); gap: 30px; align-items: start; }
299 +#map-panel { position: sticky; top: calc(var(--topbar-h) + 20px); background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); padding: 22px; box-shadow: var(--shadow-sm); min-height: 200px; }
300 +#map-panel h3 { margin: 0; font-family: var(--display); font-size: 1.35rem; color: var(--bleu); }
301 +#map-panel h4 { margin: 14px 0 6px; font-size: .78rem; text-transform: uppercase; letter-spacing: .1em; color: var(--gris); }
302 +#map-panel ul { margin: 0 0 10px; padding-left: 1.2em; font-size: .9rem; }
303 +@media (max-width: 900px) { .map-layout { grid-template-columns: 1fr; } #map-panel { position: static; } }
304 +
305 +/* =============================================================================
306 + Page de séance
307 + ============================================================================= */
308 +.ch-hero { position: relative; overflow: hidden; color: var(--ink); background: radial-gradient(800px 420px at 90% -30%, var(--part-soft), transparent 60%), linear-gradient(180deg, #f5f9fb, var(--bg)); border-bottom: 3px solid var(--part); }
309 +[data-theme="dark"] .ch-hero { background: radial-gradient(800px 420px at 90% -30%, var(--part-soft), transparent 60%), linear-gradient(180deg, #121a2a, var(--bg)); }
310 +.ch-hero-inner { max-width: 1440px; margin: 0 auto; padding: 40px 22px 30px; position: relative; z-index: 1; }
311 +.ch-hero .eyebrow { color: var(--part); }
312 +.ch-hero .eyebrow::before { background: var(--part); }
313 +.ch-hero .eyebrow .part-chip { background: var(--part); color: #fff; padding: 2px 8px; border-radius: 4px; letter-spacing: .06em; }
314 +.ch-hero h1 { font-family: var(--display); font-weight: 600; font-size: clamp(1.7rem, 3vw, 2.6rem); line-height: 1.08; margin: 0 0 14px; max-width: 30ch; letter-spacing: -.012em; color: var(--bleu); font-variation-settings: "opsz" 144; }
315 +.ch-hero .ch-sub { color: var(--ink-2); font-size: .92rem; margin-bottom: 16px; font-family: var(--serif); }
316 +.ch-hero .ch-meta { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 18px; }
317 +.ch-hero .ch-tools { display: flex; gap: 10px; flex-wrap: wrap; }
318 +.ch-hero .ch-tools .btn-ghost[aria-pressed="true"] { background: var(--or); color: var(--navy); border-color: var(--or); }
319 +.ch-hero .watermark { position: absolute; right: 24px; bottom: -24px; font-family: var(--display); font-size: clamp(5rem, 11vw, 9rem); font-weight: 700; color: var(--part); opacity: .05; line-height: 1; pointer-events: none; letter-spacing: -.04em; }
320 +.ch-hero .deco { position: absolute; inset: 0; pointer-events: none; }
321 +.ch-hero .deco circle { fill: none; stroke: var(--part); stroke-opacity: .18; stroke-width: 1.2; }
322 +.ch-hero .deco .gold { stroke: var(--or); stroke-opacity: .6; }
323 +@media (max-width: 760px) { .ch-hero-inner { padding: 26px 18px 22px; } .ch-hero .ch-tools .btn { padding: 8px 12px; font-size: .84rem; } .ch-hero .ch-meta .chip { font-size: .7rem; padding: 3px 8px; } }
324 +
325 +/* stepper de sections */
326 +.stepper-wrap { position: sticky; top: calc(var(--topbar-h) + 3px); z-index: 40; background: color-mix(in srgb, var(--bg) 88%, transparent); backdrop-filter: blur(8px); border-bottom: 1px solid var(--border); }
327 +.stepper { max-width: 1440px; margin: 0 auto; padding: 8px 22px; display: flex; gap: 6px; overflow-x: auto; scrollbar-width: none; }
328 +.stepper::-webkit-scrollbar { display: none; }
329 +.stepper a { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 7px; padding: 6px 11px; border-radius: 999px; text-decoration: none; font-size: .78rem; color: var(--ink-2); border: 1px solid transparent; white-space: nowrap; max-width: 260px; overflow: hidden; text-overflow: ellipsis; transition: background .15s; }
330 +.stepper a .n { width: 20px; height: 20px; border-radius: 50%; background: var(--gris-pale); color: var(--ink-2); display: inline-grid; place-items: center; font-size: .68rem; font-weight: 700; flex: 0 0 auto; }
331 +.stepper a:hover { background: var(--bg-clair); }
332 +.stepper a.done .n { background: var(--vert); color: #fff; }
333 +.stepper a.active { background: var(--part-soft); color: var(--part); border-color: color-mix(in srgb, var(--part) 40%, transparent); font-weight: 600; }
334 +.stepper a.active .n { background: var(--part); color: #fff; }
335 +.stepper .rem { margin-left: auto; flex: 0 0 auto; font-size: .76rem; color: var(--gris); align-self: center; padding-left: 10px; }
336 +
337 +.ch-layout { max-width: 1440px; margin: 0 auto; padding: 34px 22px 0; display: grid; grid-template-columns: 250px minmax(0, 1fr); gap: 48px; align-items: start; }
338 +.ch-toc { position: sticky; top: calc(var(--topbar-h) + 62px); max-height: calc(100vh - var(--topbar-h) - 90px); overflow: auto; font-size: .85rem; padding-right: 6px; scrollbar-width: thin; }
339 +.ch-toc h4 { margin: 0 0 8px; font-size: .7rem; text-transform: uppercase; letter-spacing: .14em; color: var(--gris); }
340 +.ch-toc ol { list-style: none; margin: 0 0 14px; padding: 0; border-left: 2px solid var(--border); }
341 +.ch-toc li a { display: flex; gap: 6px; padding: 5px 0 5px 12px; color: var(--ink-2); text-decoration: none; margin-left: -2px; border-left: 2px solid transparent; line-height: 1.35; transition: color .15s; }
342 +.ch-toc li.lvl3 a { padding-left: 24px; font-size: .78rem; color: var(--gris); }
343 +.ch-toc li a:hover { color: var(--part); }
344 +.ch-toc li a.active { color: var(--part); border-left-color: var(--part); font-weight: 600; }
345 +.ch-toc li.lvl2 a.done::after { content: "✓"; color: var(--vert); font-size: .75em; margin-left: auto; }
346 +.ch-toc .toc-num { color: var(--or-fonce); font-weight: 600; font-size: .78em; flex: 0 0 auto; }
347 +[data-theme="dark"] .ch-toc .toc-num { color: var(--or); }
348 +.ch-toc .toc-extra a { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 8px; color: var(--ink-2); text-decoration: none; }
349 +.ch-toc .toc-extra a:hover { background: var(--bg-clair); color: var(--bleu); }
350 +.ch-toc .toc-extra svg { width: 15px; height: 15px; color: var(--or-fonce); }
351 +.ch-toc .toc-progress { display: flex; align-items: center; gap: 10px; font-size: .76rem; color: var(--gris); margin: 4px 0 16px; }
352 +.ch-toc .toc-progress .bar { flex: 1; height: 6px; background: var(--gris-pale); border-radius: 3px; overflow: hidden; }
353 +.ch-toc .toc-progress .bar i { display: block; height: 100%; width: 0; background: var(--vert); transition: width .3s; }
354 +
355 +.ch-body { min-width: 0; }
356 +.prose { width: 100%; max-width: calc(var(--text-w) + var(--margin-w) + var(--margin-gap)); font-family: var(--serif); font-size: calc(var(--fs) * 1.03); }
357 +.prose > *, .prose .box, .prose .table-wrap, .prose figure, .prose .center, .prose .eq, .prose ul, .prose ol, .prose details, .prose section, .prose .widget { max-width: var(--text-w); }
358 +.prose p { margin: 0 0 1.1em; hyphens: auto; -webkit-hyphens: auto; }
359 +.chapter-page.no-dropcap .prose > p:first-of-type::first-letter { font-family: var(--display); font-size: 3.3em; float: left; line-height: .82; margin: .06em .1em 0 0; color: var(--part); font-weight: 600; }
360 +body.revision .chapter-page.no-dropcap .prose > p:first-of-type::first-letter { font-size: inherit; float: none; margin: 0; color: inherit; }
361 +.prose ul, .prose ol { padding-left: 1.5em; margin: .4em 0 1em; }
362 +.prose li { margin: .35em 0; }
363 +.prose ul > li::marker { color: var(--part); }
364 +.prose ol.enum { list-style: none; counter-reset: enum; padding-left: 2em; }
365 +.prose ol.enum > li { counter-increment: enum; position: relative; }
366 +.prose ol.enum > li::before { content: counter(enum); position: absolute; left: -2em; top: .3em; width: 1.45em; height: 1.45em; border-radius: 50%; background: var(--part); color: #fff; font-family: var(--font); font-size: .7em; font-weight: 700; display: grid; place-items: center; }
367 +.prose li.labeled { list-style: none; display: grid; grid-template-columns: auto 1fr; gap: 8px; margin-left: -1em; }
368 +.prose li.labeled .li-label { font-weight: 700; color: var(--bleu-clair); font-family: var(--font); }
369 +.prose ul.desc { list-style: none; padding-left: 0; }
370 +.prose ul.desc li.labeled { margin-left: 0; grid-template-columns: minmax(120px, 200px) 1fr; padding: 6px 0; border-bottom: 1px dashed var(--border); }
371 +.prose strong { font-weight: 700; }
372 +.prose .motcle { color: var(--bleu); font-weight: 700; border-bottom: 1px dotted var(--bleu-clair); cursor: help; font-family: var(--font); font-size: .95em; }
373 +.prose .cite, .cite { font-size: .9em; color: var(--bleu); text-decoration: none; font-family: var(--font); }
374 +.prose .citation { color: var(--ink-2); }
375 +.prose .xref { font-weight: 600; text-decoration: none; border-bottom: 1px dotted var(--bleu-clair); }
376 +.prose .xref-missing { color: var(--rouge); }
377 +.prose sup { line-height: 0; }
378 +mark.hl { background: linear-gradient(transparent 40%, rgba(255, 214, 90, .75) 40%); color: inherit; padding: 0 1px; border-radius: 2px; cursor: pointer; }
379 +mark.hl.has-note { background: linear-gradient(transparent 40%, rgba(143, 224, 187, .75) 40%); }
380 +[data-theme="dark"] mark.hl { background: linear-gradient(transparent 40%, rgba(227, 192, 79, .4) 40%); } [data-theme="dark"] mark.hl.has-note { background: linear-gradient(transparent 40%, rgba(92, 196, 150, .4) 40%); }
381 +.hl-pop { position: absolute; z-index: 400; display: flex; gap: 4px; background: var(--navy); padding: 6px; border-radius: 10px; box-shadow: var(--shadow-lg); animation: pop .15s; }
382 +.hl-pop button { font: inherit; font-family: var(--font); font-size: .8rem; font-weight: 600; background: rgba(255, 255, 255, .1); color: #fff; border: 0; padding: 6px 10px; border-radius: 7px; cursor: pointer; }
383 +.hl-pop button:hover { background: var(--or); color: var(--navy); }
384 +.tts-current { outline: 2px solid var(--or); outline-offset: 6px; border-radius: 4px; background: var(--or-pale); }
385 +.flash-target { animation: flash 2.4s ease-out; }
386 +@keyframes flash { 0% { background: var(--or-pale); } 100% { background: transparent; } }
387 +
388 +/* titres de prose */
389 +.prose h2.h-section { font-family: var(--display); font-weight: 600; font-size: 1.85rem; color: var(--bleu); margin: 2.6em 0 .7em; line-height: 1.15; position: relative; padding-bottom: .4em; letter-spacing: -.01em; scroll-margin-top: calc(var(--topbar-h) + 70px); }
390 +.prose h2.h-section::after { content: ""; position: absolute; left: 0; bottom: 0; height: 2px; width: 100%; background: linear-gradient(90deg, var(--part) 0 44px, var(--gris-clair) 44px); }
391 +.prose h3.h-subsection { font-family: var(--font); font-size: 1.22rem; color: var(--bleu-clair); margin: 2em 0 .5em; line-height: 1.25; font-weight: 700; scroll-margin-top: calc(var(--topbar-h) + 70px); }
392 +.prose h4.h-subsubsection { font-family: var(--font); font-size: 1.02rem; color: var(--gris); margin: 1.6em 0 .4em; scroll-margin-top: calc(var(--topbar-h) + 70px); }
393 +.prose h5.para-title { font-family: var(--font); font-size: .98rem; margin: 1.2em 0 .3em; color: var(--ink); }
394 +.h-num { color: var(--part); font-weight: 700; margin-right: .5em; font-variant-numeric: tabular-nums; font-family: var(--font); font-size: .78em; vertical-align: .1em; }
395 +.h-anchor { opacity: 0; margin-left: .4em; font-weight: 400; text-decoration: none; color: var(--gris); font-size: .7em; }
396 +h2:hover .h-anchor, h3:hover .h-anchor, h4:hover .h-anchor { opacity: 1; }
397 +.prose h2 + p, .prose h3 + p { margin-top: 0; }
398 +
399 +/* boîtes pédagogiques */
400 +.box { position: relative; border-radius: 6px; margin: 1.5em 0; padding: 14px 18px 12px; border-left: 3px solid var(--gris); background: var(--bg-clair); break-inside: avoid; font-family: var(--serif); }
401 +.box-head { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 9px; margin-bottom: 8px; font-weight: 700; color: var(--gris); font-size: .92rem; font-family: var(--font); }
402 +.box-head .box-label { white-space: nowrap; }
403 +.box-head .box-title { font-weight: 500; color: var(--ink-2); }
404 +.box-icon { width: 22px; height: 22px; display: inline-grid; place-items: center; flex: 0 0 auto; border-radius: 6px; background: rgba(255, 255, 255, .7); }
405 +[data-theme="dark"] .box-icon { background: rgba(255, 255, 255, .06); }
406 +.box-icon svg { width: 13px; height: 13px; }
407 +.box-anchor { margin-left: auto; opacity: 0; color: var(--gris); text-decoration: none; font-weight: 400; }
408 +.box:hover .box-anchor { opacity: .7; }
409 +.box-body > :last-child, .box-body p:last-child { margin-bottom: 0; }
410 +.box-def { border-left-color: var(--bleu); background: linear-gradient(180deg, rgba(0, 62, 126, .07), rgba(0, 62, 126, .04)); } .box-def .box-head { color: var(--bleu); }
411 +.box-form { border-left-color: var(--or); background: linear-gradient(180deg, rgba(9, 26, 51, .06), rgba(9, 26, 51, .03)); border-top: 1px solid rgba(204, 164, 36, .5); } .box-form .box-head { color: var(--navy); } [data-theme="dark"] .box-form .box-head { color: var(--or); } .box-form .box-icon { color: var(--or-fonce); }
412 +.box-ex { border-left-color: var(--vert); background: rgba(16, 124, 78, .07); } .box-ex .box-head { color: var(--vert); }
413 +.box-exo { border-left-color: var(--bleu-clair); background: rgba(41, 118, 187, .08); } .box-exo .box-head { color: var(--bleu-clair); }
414 +.box-att { border-left-color: var(--rouge); background: rgba(178, 42, 32, .06); } .box-att .box-head { color: var(--rouge); }
415 +.box-terrain { border-left-color: var(--or); background: rgba(204, 164, 36, .1); } .box-terrain .box-head { color: var(--or-fonce); } [data-theme="dark"] .box-terrain .box-head { color: var(--or); }
416 +.box-rem { border-left-color: var(--gris); background: var(--bg-clair); }
417 +.box-qc { border-left-color: var(--bleu-clair); background: rgba(41, 118, 187, .08); } .box-qc .box-head { color: var(--bleu-clair); }
418 +.box-pts { border-left-color: var(--vert); background: rgba(16, 124, 78, .07); } .box-pts .box-head { color: var(--vert); }
419 +.box-ret { border-left: 0; background: linear-gradient(150deg, var(--navy), #0f2a52); color: #fff; padding: 20px 22px 18px; border-bottom: 3px solid var(--or); border-radius: var(--radius-sm); box-shadow: var(--shadow); }
420 +.box-ret .box-head { color: var(--or); } .box-ret .box-icon { background: rgba(255, 255, 255, .1); }
421 +.box-ret a, .box-ret .motcle, .box-ret .c-bleu, .box-ret .xref { color: #fff; } .box-ret .c-rouge { color: #ffb3ad; } .box-ret .c-vert { color: #8fe0bb; } .box-ret .c-or { color: var(--or); } .box-ret .katex { color: #fff; } .box-ret code { background: rgba(255, 255, 255, .1); }
422 +.box-obj { border: 1px solid var(--border); border-top: 3px solid var(--part); background: var(--card); border-left-width: 1px; border-radius: var(--radius); padding: 20px 22px; transition: border-color .3s; }
423 +.box-obj.complete { border-top-color: var(--vert); }
424 +.box-obj .box-head { color: var(--bleu); font-size: 1.05rem; } .box-obj .box-icon { color: var(--part); }
425 +.box-obj ul { list-style: none; padding: 0; margin: 0; }
426 +.box-obj li.obj { margin: 0; }
427 +.box-obj li.obj label { display: flex; gap: 12px; align-items: flex-start; padding: 8px 8px; border-radius: 8px; cursor: pointer; transition: background .15s; }
428 +.box-obj li.obj label:hover { background: var(--bg-clair); }
429 +.box-obj input.obj-cb { margin-top: .4em; width: 18px; height: 18px; accent-color: var(--vert); flex: 0 0 auto; }
430 +.box-obj input.obj-cb:checked + .obj-text { color: var(--gris); text-decoration: line-through; text-decoration-color: var(--gris-clair); }
431 +.obj-progress { margin-left: auto; font-size: .76rem; font-weight: 600; color: var(--gris); }
432 +.box-synth { border: 0; border-top: 3px solid var(--or); background: var(--bg-clair); border-radius: var(--radius); padding: 22px 24px; margin-top: 2.6em; }
433 +.box-synth .box-head { color: var(--bleu); font-size: 1.2rem; font-family: var(--display); } .box-synth .box-icon { color: var(--or-fonce); }
434 +.box-synth ul { padding-left: 1.3em; } .box-synth li { margin: .55em 0; }
435 +.box-sol { border-left: 4px solid var(--gris-clair); background: var(--bg-2); margin-top: -0.7em; padding: 0; box-shadow: none; }
436 +.box-sol summary { list-style: none; cursor: pointer; display: flex; align-items: center; gap: 9px; padding: 12px 18px; font-weight: 700; color: var(--gris); user-select: none; font-family: var(--font); font-size: .92rem; }
437 +.box-sol summary::-webkit-details-marker { display: none; }
438 +.box-sol summary .sol-hint { margin-left: auto; font-size: .74rem; font-weight: 500; color: var(--gris); background: var(--card); border: 1px solid var(--border); padding: 3px 9px; border-radius: 999px; }
439 +.box-sol[open] summary .sol-hint { display: none; }
440 +.box-sol[open] summary { border-bottom: 1px dashed var(--border); }
441 +.box-sol .box-body { padding: 12px 18px 14px; font-size: .95em; animation: pop .2s; }
442 +.box-sol .box-icon { color: var(--vert); }
443 +
444 +/* équations, tableaux, figures */
445 +.eq { margin: 1em 0 1.2em; overflow-x: auto; overflow-y: hidden; padding: 4px 2px; }
446 +.eq .katex-display { margin: 0; }
447 +.katex { font-size: 1.06em; }
448 +.katex-display > .katex { white-space: normal; }
449 +.math-error { color: var(--rouge); }
450 +.table-wrap { overflow-x: auto; margin: 1.3em 0; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--card); box-shadow: var(--shadow-sm); }
451 +table.tbl { width: 100%; border-collapse: collapse; font-size: .9em; line-height: 1.4; font-family: var(--font); }
452 +table.tbl th, table.tbl td { padding: 10px 13px; text-align: left; vertical-align: top; border-bottom: 1px solid var(--border); }
453 +table.tbl thead th { background: var(--navy); color: #fff; font-weight: 600; position: sticky; top: 0; font-size: .85em; }
454 +table.tbl tbody tr:nth-child(even) td { background: var(--bg-2); }
455 +table.tbl tbody tr:hover td { background: var(--bleu-pale); }
456 +table.tbl tbody tr:last-child td { border-bottom: 0; }
457 +table.tbl tr.rule-above td, table.tbl tr.rule-above th { border-top: 2px solid var(--or); }
458 +table.tbl tbody th { background: var(--bleu); color: #fff; }
459 +table.tbl .al-r { text-align: right; font-variant-numeric: tabular-nums; } table.tbl .al-c { text-align: center; }
460 +.center { text-align: center; } .center .table-wrap { text-align: left; }
461 +figure { margin: 1.7em 0; }
462 +figure.float-table figcaption { margin-bottom: .5em; } figure.float-figure figcaption { margin-top: .6em; }
463 +figcaption { font-size: .86em; color: var(--ink-2); line-height: 1.45; font-family: var(--font); }
464 +.fig-label { font-weight: 700; color: var(--bleu); margin-right: .4em; }
465 +.tikz, .figimg { text-align: center; margin: 1em 0; }
466 +.tikz img, .figimg img { max-width: 100%; height: auto; background: #fff; border-radius: 10px; padding: 10px; border: 1px solid var(--border); box-shadow: var(--shadow-sm); }
467 +[data-theme="dark"] .tikz img, [data-theme="dark"] .figimg img { background: #f4f6f9; }
468 +.figimg img { cursor: zoom-in; }
469 +.lightbox { position: fixed; inset: 0; z-index: 800; background: rgba(9, 26, 51, .92); display: grid; place-items: center; padding: 30px; cursor: zoom-out; }
470 +.lightbox img { max-width: 100%; max-height: 100%; background: #fff; border-radius: 8px; padding: 12px; }
471 +
472 +/* notes marginales */
473 +.sn-toggle { cursor: pointer; color: var(--or-fonce); font-size: .7em; vertical-align: super; margin-left: 2px; user-select: none; }
474 +[data-theme="dark"] .sn-toggle { color: var(--or); }
475 +.sn-toggle .sn-num { font-size: .95em; color: var(--bleu); font-weight: 700; }
476 +.sn-cb { display: none; }
477 +.sidenote { font-family: var(--font); font-size: .78rem; line-height: 1.45; color: var(--gris); position: relative; }
478 +.sidenote .sn-term { color: var(--bleu); display: block; } .sidenote .sn-date { color: var(--or-fonce); } .sidenote .sn-num { color: var(--bleu); font-weight: 700; }
479 +@media (min-width: 1280px) {
480 + .sidenote { float: right; clear: right; width: var(--margin-w); margin-right: calc(-1 * (var(--margin-w) + var(--margin-gap))); margin-top: .1em; margin-bottom: .9em; padding-top: 6px; border-top: 2px solid var(--or); }
481 + .sn-toggle { display: none; }
482 + .prose .box .sidenote, .prose figure .sidenote, .prose .table-wrap .sidenote, .prose li .sidenote { float: none; width: auto; margin: .5em 0; display: block; border-top: 0; padding: 6px 10px; background: rgba(204, 164, 36, .12); border-radius: 4px; }
483 +}
484 +@media (max-width: 1279px) {
485 + .sidenote { display: none; margin: .6em 0; padding: 8px 12px; background: rgba(204, 164, 36, .12); border-left: 3px solid var(--or); border-radius: 4px; }
486 + .sn-cb:checked ~ .sidenote { display: block; }
487 +}
488 +body.revision .prose > p, body.revision .prose .box-ex, body.revision .prose .box-exo, body.revision .prose .box-sol, body.revision .prose .box-rem, body.revision .prose .box-terrain, body.revision .prose figure, body.revision .prose .center, body.revision .prose > .eq, body.revision .prose > ul, body.revision .prose > ol, body.revision .prose .table-wrap, body.revision .prose .widget { display: none; }
489 +body.revision .prose .box-def, body.revision .prose .box-form, body.revision .prose .box-att, body.revision .prose .box-ret, body.revision .prose .box-qc, body.revision .prose .box-synth, body.revision .prose .box-obj, body.revision .prose .box-pts { display: block; }
490 +body.revision .prose h4, body.revision .prose h5 { display: none; }
491 +body.revision .sidenote { float: none; display: block; width: auto; margin: .6em 0; padding: 8px 12px; background: rgba(204, 164, 36, .12); border-left: 3px solid var(--or); border-top: 0; border-radius: 4px; }
492 +body.revision .prose p:has(.sidenote) { display: block; font-size: 0; margin: 0; }
493 +body.revision .prose p:has(.sidenote) .sidenote { font-size: .82rem; }
494 +body.revision .sn-toggle { display: none; }
495 +body.revision .revision-banner { display: flex; }
496 +.revision-banner { display: none; align-items: center; gap: 10px; background: var(--or-pale); border: 1px solid rgba(204, 164, 36, .5); color: var(--ink); padding: 10px 14px; border-radius: 10px; margin-bottom: 20px; font-size: .9rem; }
497 +.revision-banner svg { width: 18px; height: 18px; color: var(--or-fonce); }
498 +.revision-banner button { margin-left: auto; }
499 +
500 +/* barre d'outils de lecture flottante */
501 +.read-tools { position: fixed; right: 18px; bottom: 18px; z-index: 300; display: flex; flex-direction: column; gap: 6px; background: var(--card); border: 1px solid var(--border); border-radius: 14px; padding: 6px; box-shadow: var(--shadow-lg); }
502 +.read-tools button { width: 42px; height: 42px; border-radius: 10px; border: 0; background: transparent; color: var(--ink-2); cursor: pointer; display: grid; place-items: center; position: relative; transition: background .15s, color .15s; }
503 +.read-tools button:hover { background: var(--bg-clair); color: var(--bleu); }
504 +.read-tools button[aria-pressed="true"] { background: var(--or-pale); color: var(--or-fonce); }
505 +.read-tools button svg { width: 19px; height: 19px; }
506 +.read-tools button::after { content: attr(data-tip); position: absolute; right: calc(100% + 10px); top: 50%; transform: translateY(-50%); background: var(--navy); color: #fff; font-size: .74rem; padding: 4px 8px; border-radius: 6px; white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity .15s; }
507 +.read-tools button:hover::after { opacity: 1; }
508 +.read-tools hr { border: 0; border-top: 1px solid var(--border); margin: 2px 4px; }
509 +@media (max-width: 760px) { .read-tools { flex-direction: row; right: 12px; left: 12px; bottom: 12px; justify-content: space-around; } .read-tools hr { display: none; } .read-tools button::after { display: none; } .toasts { bottom: 76px; } }
510 +
511 +/* panneau de notes */
512 +.notes-panel { position: fixed; top: var(--topbar-h); right: 0; bottom: 0; width: min(420px, 100vw); background: var(--card); border-left: 1px solid var(--border); box-shadow: var(--shadow-lg); z-index: 350; transform: translateX(105%); transition: transform .3s cubic-bezier(.2, .7, .2, 1); display: flex; flex-direction: column; }
513 +.notes-panel.open { transform: none; }
514 +.notes-head { display: flex; align-items: center; gap: 10px; padding: 14px 18px; border-bottom: 1px solid var(--border); }
515 +.notes-head h3 { margin: 0; font-size: 1rem; font-family: var(--display); color: var(--bleu); }
516 +.notes-head .icon-btn { background: var(--bg-clair); color: var(--ink); border-color: var(--border); margin-left: auto; width: 34px; height: 34px; }
517 +.notes-body { padding: 16px 18px; overflow: auto; display: grid; gap: 14px; align-content: start; }
518 +.notes-body h4 { margin: 0 0 6px; font-size: .72rem; text-transform: uppercase; letter-spacing: .12em; color: var(--gris); display: flex; gap: 8px; align-items: center; }
519 +.notes-body h4 span { margin-left: auto; font-weight: 500; text-transform: none; letter-spacing: 0; color: var(--vert); }
520 +.notes-body textarea { width: 100%; min-height: 170px; font: inherit; font-family: var(--serif); font-size: .95rem; padding: 12px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg); color: var(--ink); resize: vertical; line-height: 1.5; }
521 +#hl-list { list-style: none; padding: 0; margin: 0; display: grid; gap: 8px; }
522 +#hl-list li { position: relative; padding: 10px 34px 10px 12px; border-radius: 8px; background: var(--bg-clair); font-size: .86rem; border-left: 3px solid var(--or); }
523 +#hl-list li a { color: var(--ink); text-decoration: none; font-family: var(--serif); } #hl-list li a:hover { color: var(--bleu); }
524 +#hl-list .hl-note { margin-top: 5px; color: var(--vert); font-size: .82rem; }
525 +#hl-list li.muted { border-left-color: var(--border); color: var(--gris); }
526 +.hl-del { position: absolute; right: 8px; top: 8px; border: 0; background: transparent; color: var(--gris); cursor: pointer; font-size: .8rem; padding: 2px 5px; border-radius: 4px; }
527 +.hl-del:hover { background: var(--rouge); color: #fff; }
528 +.notes-foot { padding: 12px 18px; border-top: 1px solid var(--border); display: flex; gap: 8px; }
529 +
530 +/* lecture audio */
531 +.tts-bar { position: fixed; left: 50%; bottom: 18px; transform: translateX(-50%); z-index: 320; background: var(--navy); color: #fff; border-radius: 999px; padding: 8px 12px; display: flex; gap: 6px; align-items: center; box-shadow: var(--shadow-lg); border: 1px solid rgba(255, 255, 255, .12); }
532 +.tts-bar[hidden] { display: none; }
533 +.tts-bar button { width: 36px; height: 36px; border-radius: 50%; border: 0; background: rgba(255, 255, 255, .1); color: #fff; font-size: 1rem; cursor: pointer; }
534 +.tts-bar button:hover { background: var(--or); color: var(--navy); }
535 +.tts-bar select { font: inherit; font-size: .8rem; background: rgba(255, 255, 255, .1); color: #fff; border: 0; border-radius: 8px; padding: 6px 8px; }
536 +.tts-bar span { font-size: .78rem; opacity: .8; padding: 0 6px; }
537 +@media (max-width: 760px) { .tts-bar { bottom: 74px; } }
538 +
539 +/* widgets visuels */
540 +.widget { margin: 2em 0; border: 1px solid var(--border); border-radius: var(--radius); background: var(--card); box-shadow: var(--shadow-sm); overflow: hidden; font-family: var(--font); }
541 +.w-head { padding: 16px 20px 12px; background: linear-gradient(180deg, var(--part-soft), transparent); border-bottom: 1px solid var(--border); }
542 +.w-badge { display: inline-block; font-size: .66rem; text-transform: uppercase; letter-spacing: .12em; font-weight: 700; color: var(--part); background: var(--card); border: 1px solid color-mix(in srgb, var(--part) 40%, transparent); padding: 2px 8px; border-radius: 999px; margin-bottom: 8px; }
543 +.w-head h4 { margin: 0 0 4px; font-family: var(--display); font-size: 1.25rem; color: var(--bleu); font-weight: 600; }
544 +.w-head p { margin: 0; font-size: .9rem; color: var(--ink-2); line-height: 1.5; }
545 +.w-body { display: grid; grid-template-columns: 240px minmax(0, 1fr); gap: 0; }
546 +.w-controls { padding: 14px 16px; display: grid; gap: 12px; border-right: 1px solid var(--border); background: var(--bg-2); align-content: start; }
547 +.wctl { display: grid; gap: 4px; font-size: .8rem; color: var(--ink-2); }
548 +.wctl span { display: flex; justify-content: space-between; gap: 8px; }
549 +.wctl output { font-weight: 700; color: var(--bleu); font-variant-numeric: tabular-nums; white-space: nowrap; }
550 +.wctl input[type=range] { width: 100%; accent-color: var(--part); }
551 +.wctl select { font: inherit; font-size: .85rem; padding: 6px 8px; border: 1px solid var(--border); border-radius: 8px; background: var(--card); color: var(--ink); }
552 +.w-view { padding: 14px 18px; min-width: 0; display: grid; gap: 12px; align-content: start; }
553 +.w-note { margin: 0; padding: 10px 20px; font-size: .78rem; color: var(--gris); border-top: 1px dashed var(--border); }
554 +.wchart { width: 100%; height: auto; display: block; }
555 +.wchart .grid { stroke: var(--border); stroke-dasharray: 3 3; } .wchart .axis { stroke: var(--gris); stroke-width: 1.2; }
556 +.wchart .tick, .wchart .alabel, .wchart .slabel, .wchart .vlabel, .wchart .mlabel { font-family: var(--font); font-size: 11px; fill: var(--ink-2); }
557 +.wchart .alabel { font-weight: 600; } .wchart .slabel { font-weight: 700; font-size: 12px; } .wchart .vlabel { font-weight: 700; fill: var(--ink); } .wchart .mlabel { font-weight: 700; fill: var(--or-fonce); font-size: 12px; }
558 +.wchart .mline { stroke: var(--or); stroke-dasharray: 4 3; stroke-width: 1.2; }
559 +.wkpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 8px; }
560 +.wkpi { background: var(--bg-clair); border-radius: 10px; padding: 10px 12px; display: grid; gap: 2px; }
561 +.wkpi span { font-size: .72rem; color: var(--gris); } .wkpi b { font-size: 1rem; color: var(--ink); font-variant-numeric: tabular-nums; }
562 +.wkpi.main { background: var(--navy); color: #fff; } .wkpi.main span { color: rgba(255, 255, 255, .7); } .wkpi.main b { color: var(--or); font-size: 1.2rem; }
563 +.wkpi.warn b { color: var(--rouge); } .wkpi.good b { color: var(--vert); }
564 +.wbars { display: grid; gap: 7px; }
565 +.wbar { display: grid; grid-template-columns: 130px 1fr 110px; gap: 10px; align-items: center; font-size: .82rem; }
566 +.wbar-track { height: 16px; background: var(--gris-pale); border-radius: 5px; overflow: hidden; } .wbar-track i { display: block; height: 100%; border-radius: 5px; transition: width .3s; }
567 +.wbar-v { text-align: right; font-variant-numeric: tabular-nums; }
568 +.wstack-bar { display: flex; height: 26px; border-radius: 8px; overflow: hidden; background: var(--gris-pale); } .wstack-bar i { display: block; height: 100%; transition: width .3s; }
569 +.wstack-legend { display: flex; flex-wrap: wrap; gap: 8px 16px; margin-top: 8px; font-size: .8rem; }
570 +.wstack-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 3px; margin-right: 6px; }
571 +.wgauges { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
572 +.wgauge .wg-head { display: flex; justify-content: space-between; font-size: .85rem; margin-bottom: 4px; } .wgauge b.warn { color: var(--rouge); } .wgauge b.good { color: var(--vert); }
573 +.wg-track { position: relative; height: 14px; background: var(--gris-pale); border-radius: 7px; overflow: visible; } .wg-track i { display: block; height: 100%; border-radius: 7px; transition: width .3s; }
574 +.wg-seuil { position: absolute; top: -4px; width: 2px; height: 22px; background: var(--ink); }
575 +.wgauge small { color: var(--gris); font-size: .72rem; }
576 +.wphase { background: var(--bg-clair); border-radius: 10px; padding: 12px 14px; font-size: .88rem; } .wphase h5 { margin: 0 0 4px; color: var(--bleu); font-size: 1rem; } .wphase p { margin: 0 0 6px; } .wphase ul { margin: 0; padding-left: 1.2em; columns: 2; }
577 +.wtable { width: 100%; border-collapse: collapse; font-size: .82rem; } .wtable th, .wtable td { padding: 6px 8px; border-bottom: 1px solid var(--border); text-align: left; } .wtable th { font-size: .7rem; text-transform: uppercase; letter-spacing: .06em; color: var(--gris); }
578 +.wtable tr.out td { color: var(--gris); text-decoration: line-through; text-decoration-color: var(--gris-clair); } .wtable tr.best td { font-weight: 700; background: rgba(16, 124, 78, .08); }
579 +@media (max-width: 760px) { .w-body { grid-template-columns: 1fr; } .w-controls { border-right: 0; border-bottom: 1px solid var(--border); } .wbar { grid-template-columns: 90px 1fr 90px; } .wgauges { grid-template-columns: 1fr; } .wphase ul { columns: 1; } }
580 +
581 +/* pagination et quiz de chapitre */
582 +.ch-pager { max-width: 1440px; margin: 44px auto 0; padding: 0 22px; display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
583 +.ch-pager a { display: flex; flex-direction: column; gap: 4px; padding: 18px 20px; border: 1px solid var(--border); border-radius: var(--radius); text-decoration: none; color: var(--ink); background: var(--card); transition: transform .15s, box-shadow .2s; }
584 +.ch-pager a:hover { border-color: var(--part); box-shadow: var(--shadow); transform: translateY(-2px); }
585 +.ch-pager a.next { text-align: right; align-items: flex-end; }
586 +.ch-pager small { color: var(--gris); text-transform: uppercase; letter-spacing: .12em; font-size: .68rem; font-weight: 700; }
587 +.ch-pager b { color: var(--bleu); font-family: var(--display); font-weight: 600; font-size: 1.1rem; }
588 +.ch-pager .spacer { visibility: hidden; }
589 +@media (max-width: 600px) { .ch-pager { grid-template-columns: 1fr; } .ch-pager a.next { text-align: left; align-items: flex-start; } }
590 +.ch-quiz { max-width: 1440px; margin: 54px auto 0; padding: 0 22px; }
591 +.ch-quiz-inner { border: 1px solid var(--border); border-radius: var(--radius); background: var(--card); padding: 26px 28px; border-top: 4px solid var(--or); box-shadow: var(--shadow-sm); }
592 +@media (max-width: 1100px) { .ch-layout { grid-template-columns: 1fr; gap: 20px; } .ch-toc { position: static; max-height: none; border: 1px solid var(--border); border-radius: var(--radius); padding: 14px 16px; background: var(--card); } .ch-toc ol { max-height: 220px; overflow: auto; } }
593 +
594 +/* =============================================================================
595 + Quiz, entraînement, jeux
596 + ============================================================================= */
597 +.quiz-head { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 14px; }
598 +.quiz-head h2, .quiz-head h3 { margin: 0; color: var(--bleu); font-size: 1.35rem; font-family: var(--display); font-weight: 600; }
599 +.quiz-head .quiz-score { margin-left: auto; font-size: .85rem; color: var(--gris); display: flex; gap: 12px; align-items: center; }
600 +.quiz-progress { height: 6px; background: var(--gris-pale); border-radius: 3px; overflow: hidden; margin-bottom: 18px; } .quiz-progress i { display: block; height: 100%; width: 0; background: linear-gradient(90deg, var(--or), #f1d67a); transition: width .3s; }
601 +.q-card, .tcard { border: 1px solid var(--border); border-radius: var(--radius); padding: 20px 22px; background: var(--bg-2); }
602 +.q-num { font-size: .7rem; text-transform: uppercase; letter-spacing: .14em; color: var(--or-fonce); font-weight: 700; } [data-theme="dark"] .q-num { color: var(--or); }
603 +.q-text, .tq { font-size: 1.1rem; font-weight: 600; margin: 8px 0 16px; line-height: 1.45; font-family: var(--serif); }
604 +.tq { font-weight: 400; }
605 +.q-choices { display: grid; gap: 8px; }
606 +.q-choice { display: flex; gap: 12px; align-items: flex-start; padding: 12px 14px; border: 1px solid var(--border); border-radius: 10px; background: var(--card); cursor: pointer; text-align: left; font: inherit; font-family: var(--serif); color: var(--ink); line-height: 1.4; transition: border-color .12s, background .12s, transform .12s; }
607 +.q-choice:hover:not(:disabled) { border-color: var(--bleu-clair); background: var(--bg-clair); transform: translateX(3px); }
608 +.q-choice .q-letter { flex: 0 0 26px; width: 26px; height: 26px; border-radius: 50%; display: grid; place-items: center; background: var(--gris-pale); font-weight: 700; font-size: .8rem; color: var(--ink-2); font-family: var(--font); }
609 +.q-choice.correct { border-color: var(--vert); background: rgba(16, 124, 78, .1); } .q-choice.correct .q-letter { background: var(--vert); color: #fff; }
610 +.q-choice.wrong { border-color: var(--rouge); background: rgba(178, 42, 32, .08); } .q-choice.wrong .q-letter { background: var(--rouge); color: #fff; }
611 +.q-choice:disabled { cursor: default; }
612 +.q-feedback { margin-top: 14px; padding: 12px 14px; border-radius: 10px; font-size: .95rem; display: none; border-left: 4px solid var(--gris); background: var(--card); font-family: var(--serif); animation: pop .2s; }
613 +.q-feedback.show { display: block; } .q-feedback.ok { border-left-color: var(--vert); } .q-feedback.ko { border-left-color: var(--rouge); }
614 +.q-feedback > b:first-child { display: block; margin-bottom: 4px; font-family: var(--font); }
615 +.q-actions { display: flex; gap: 10px; margin-top: 16px; flex-wrap: wrap; align-items: center; }
616 +.q-actions .q-link { margin-left: auto; font-size: .85rem; }
617 +.quiz-result { text-align: center; padding: 20px 10px; }
618 +.quiz-result .big { font-family: var(--display); font-size: 3.4rem; font-weight: 700; color: var(--bleu); line-height: 1; margin: 6px 0; }
619 +.quiz-result p { color: var(--ink-2); } .quiz-result .verdict { font-size: 1.15rem; font-weight: 700; margin: 8px 0 16px; }
620 +.quiz-review { margin-top: 24px; text-align: left; display: grid; gap: 8px; }
621 +.quiz-review .qr { padding: 10px 12px; border-radius: 8px; border: 1px solid var(--border); font-size: .9rem; display: grid; grid-template-columns: 22px 1fr; gap: 10px; }
622 +.quiz-review .qr.ok { border-left: 4px solid var(--vert); } .quiz-review .qr.ko { border-left: 4px solid var(--rouge); }
623 +.quiz-select { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 12px; margin: 20px 0; }
624 +.quiz-select button { text-align: left; padding: 16px 18px; border: 1px solid var(--border); border-radius: 12px; background: var(--card); font: inherit; color: var(--ink); cursor: pointer; display: grid; gap: 4px; transition: transform .15s, box-shadow .2s; }
625 +.quiz-select button:hover { border-color: var(--bleu-clair); box-shadow: var(--shadow); transform: translateY(-2px); }
626 +.quiz-select b { color: var(--bleu); font-family: var(--display); font-size: 1.05rem; } .quiz-select small { color: var(--gris); } .quiz-select .best { font-size: .78rem; color: var(--vert); font-weight: 600; }
627 +.quiz-select button.exam { background: linear-gradient(150deg, var(--navy), #0f2a52); color: #fff; border-color: var(--navy); } .quiz-select button.exam b { color: var(--or); } .quiz-select button.exam small { color: rgba(255, 255, 255, .7); }
628 +.timer { font-variant-numeric: tabular-nums; font-weight: 700; color: var(--rouge); }
629 +.tform { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
630 +.tform input { font: inherit; font-size: 1.1rem; padding: 10px 14px; border: 1px solid var(--border); border-radius: 10px; width: 220px; background: var(--card); color: var(--ink); }
631 +.tunit { color: var(--gris); font-weight: 600; }
632 +.tsteps { margin-top: 10px; padding-top: 10px; border-top: 1px dashed var(--border); font-size: .92rem; } .tsteps p { margin: .3em 0; }
633 +.tchips { display: flex; flex-wrap: wrap; gap: 8px; margin: 16px 0 22px; }
634 +.tchip { font: inherit; font-size: .82rem; font-weight: 600; padding: 7px 12px; border-radius: 999px; border: 1px solid var(--border); background: var(--card); color: var(--ink-2); cursor: pointer; }
635 +.tchip.on { background: var(--bleu); color: #fff; border-color: var(--bleu); } [data-theme="dark"] .tchip.on { background: var(--bleu-clair); color: var(--navy); }
636 +.tchip small { opacity: .8; margin-left: 4px; }
637 +.streak { color: var(--or-fonce); }
638 +.game-tabs { display: flex; gap: 8px; flex-wrap: wrap; margin: 18px 0; }
639 +.game-tabs button { font: inherit; font-weight: 600; padding: 10px 16px; border-radius: 10px; border: 1px solid var(--border); background: var(--card); color: var(--ink); cursor: pointer; display: inline-flex; gap: 8px; align-items: center; }
640 +.game-tabs button[aria-selected="true"] { background: var(--navy); color: #fff; border-color: var(--navy); }
641 +.game-tabs button svg { width: 16px; height: 16px; }
642 +.game { border: 1px solid var(--border); border-radius: var(--radius); background: var(--card); padding: 22px 24px; box-shadow: var(--shadow-sm); }
643 +.game-head { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; } .game-head h3 { margin: 0; font-family: var(--display); color: var(--bleu); font-size: 1.3rem; } .game-stat { margin-left: auto; color: var(--gris); font-size: .85rem; }
644 +.assoc { display: grid; grid-template-columns: 1fr 1.6fr; gap: 14px; } .assoc-col { display: grid; gap: 8px; align-content: start; }
645 +.assoc-item { font: inherit; text-align: left; padding: 12px 14px; border-radius: 10px; border: 1px solid var(--border); background: var(--bg-2); color: var(--ink); cursor: pointer; transition: all .15s; font-family: var(--serif); line-height: 1.4; }
646 +.assoc-item:not(.def) { font-family: var(--font); font-weight: 700; color: var(--bleu); }
647 +.assoc-item.def { font-size: .9rem; }
648 +.assoc-item:hover { border-color: var(--bleu-clair); } .assoc-item.sel { border-color: var(--or); background: var(--or-pale); } .assoc-item.ok { border-color: var(--vert); background: rgba(16, 124, 78, .12); opacity: .75; pointer-events: none; } .assoc-item.ko { border-color: var(--rouge); background: rgba(178, 42, 32, .1); animation: shake .4s; }
649 +@keyframes shake { 0%, 100% { transform: none; } 25% { transform: translateX(-5px); } 75% { transform: translateX(5px); } }
650 +.vf-term { font-family: var(--display); font-size: 1.4rem; color: var(--bleu); font-weight: 600; margin: 6px 0; } .vf-def { font-family: var(--serif); font-size: 1.02rem; margin-bottom: 8px; }
651 +.ordre { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; } .ordre-pool { display: grid; gap: 8px; align-content: start; }
652 +.ordre-item { font: inherit; text-align: left; padding: 11px 14px; border-radius: 10px; border: 1px dashed var(--bleu-clair); background: var(--bg-2); color: var(--ink); cursor: pointer; font-family: var(--serif); } .ordre-item:hover { background: var(--bleu-pale); }
653 +.ordre-list { margin: 0; padding-left: 1.6em; display: grid; gap: 8px; } .ordre-list li { position: relative; padding: 10px 36px 10px 12px; border-radius: 10px; background: var(--card); border: 1px solid var(--border); font-family: var(--serif); }
654 +.ordre-list li::marker { font-weight: 700; color: var(--bleu); } .ordre-list li.ok { border-color: var(--vert); background: rgba(16, 124, 78, .1); } .ordre-list li.ko { border-color: var(--rouge); background: rgba(178, 42, 32, .08); }
655 +@media (max-width: 760px) { .assoc, .ordre { grid-template-columns: 1fr; } }
656 +
657 +/* fiches */
658 +.fc-toolbar { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; margin: 18px 0; }
659 +.fc-stats { display: flex; gap: 10px; flex-wrap: wrap; margin: 6px 0 18px; }
660 +.fc-stage { perspective: 1400px; max-width: 780px; margin: 0 auto; }
661 +.fc-card { position: relative; min-height: 320px; transform-style: preserve-3d; transition: transform .55s cubic-bezier(.2, .7, .2, 1); cursor: pointer; }
662 +.fc-card.flipped { transform: rotateY(180deg); }
663 +.fc-face { position: absolute; inset: 0; border-radius: 18px; padding: 32px 36px; backface-visibility: hidden; -webkit-backface-visibility: hidden; display: flex; flex-direction: column; box-shadow: var(--shadow-lg); border: 1px solid var(--border); overflow: auto; }
664 +.fc-front { background: linear-gradient(160deg, var(--navy), #0f2f5c); color: #fff; } .fc-front .fc-kind { color: var(--or); }
665 +.fc-front .fc-q { font-family: var(--display); font-size: 1.75rem; font-weight: 600; margin: auto 0; line-height: 1.25; }
666 +.fc-back { background: var(--card); color: var(--ink); transform: rotateY(180deg); font-family: var(--serif); }
667 +.fc-kind { font-size: .7rem; text-transform: uppercase; letter-spacing: .14em; font-weight: 700; color: var(--or-fonce); margin-bottom: 8px; display: flex; gap: 10px; font-family: var(--font); } .fc-kind .fc-ch { margin-left: auto; opacity: .8; }
668 +.fc-a { font-size: 1rem; line-height: 1.55; } .fc-a p:first-child { margin-top: 0; }
669 +.fc-hint { margin-top: auto; font-size: .76rem; opacity: .7; padding-top: 12px; font-family: var(--font); }
670 +.fc-actions { display: flex; gap: 10px; justify-content: center; margin: 18px 0; flex-wrap: wrap; }
671 +.fc-nav { display: flex; justify-content: space-between; align-items: center; color: var(--gris); font-size: .9rem; max-width: 780px; margin: 0 auto; }
672 +.fc-empty { text-align: center; padding: 40px; color: var(--gris); }
673 +
674 +/* glossaire, infobulle */
675 +.gl-letters { display: flex; gap: 4px; flex-wrap: wrap; margin: 16px 0 24px; position: sticky; top: calc(var(--topbar-h) + 8px); background: var(--bg); padding: 8px 0; z-index: 5; }
676 +.gl-letters a { width: 32px; height: 32px; display: grid; place-items: center; border-radius: 8px; text-decoration: none; font-weight: 700; font-size: .85rem; color: var(--bleu); border: 1px solid var(--border); background: var(--card); }
677 +.gl-letters a:hover { background: var(--bleu); color: #fff; } .gl-letters a.off { opacity: .35; pointer-events: none; }
678 +.gl-search { width: 100%; max-width: 540px; font-size: 1.05rem; padding: 12px 16px; }
679 +.gl-letter { font-family: var(--display); font-size: 2.6rem; color: var(--or); font-weight: 700; margin: 36px 0 8px; border-bottom: 2px solid var(--gris-clair); line-height: 1.2; }
680 +.gl-entry { padding: 16px 0; border-bottom: 1px solid var(--border); display: grid; grid-template-columns: minmax(180px, 260px) 1fr; gap: 20px; }
681 +.gl-entry h3 { margin: 0; font-size: 1.05rem; color: var(--bleu); font-family: var(--font); } .gl-entry .gl-def { margin: 0; color: var(--ink); font-family: var(--serif); } .gl-entry .gl-def p { margin: 0 0 .5em; }
682 +.gl-entry.hidden, .gl-letter.hidden { display: none; } .gl-count { color: var(--gris); font-size: .9rem; }
683 +.gl-entry mark, .search-hit mark { background: rgba(204, 164, 36, .35); color: inherit; padding: 0 2px; border-radius: 2px; }
684 +@media (max-width: 640px) { .gl-entry { grid-template-columns: 1fr; gap: 6px; } }
685 +.tip { position: absolute; z-index: 300; max-width: 340px; background: var(--card); color: var(--ink); border: 1px solid var(--border); border-left: 4px solid var(--bleu); border-radius: 10px; padding: 12px 14px; box-shadow: var(--shadow-lg); font-size: .86rem; line-height: 1.45; font-family: var(--serif); animation: pop .15s; }
686 +.tip b { color: var(--bleu); display: block; margin-bottom: 4px; font-family: var(--font); } .tip a { display: inline-block; margin-top: 6px; font-size: .8rem; font-family: var(--font); } .tip p { margin: 0; }
687 +
688 +/* colonnes latérales */
689 +.two-col { display: grid; grid-template-columns: minmax(0, 1fr) 280px; gap: 40px; align-items: start; }
690 +.two-col .side { position: sticky; top: calc(var(--topbar-h) + 20px); font-size: .85rem; max-height: calc(100vh - var(--topbar-h) - 40px); overflow: auto; }
691 +.two-col .side h4 { margin: 0 0 8px; font-size: .7rem; text-transform: uppercase; letter-spacing: .14em; color: var(--gris); }
692 +.two-col .side ol { list-style: none; padding: 0; margin: 0 0 20px; border-left: 2px solid var(--border); }
693 +.two-col .side li a { display: block; padding: 5px 12px; color: var(--ink-2); text-decoration: none; } .two-col .side li a:hover, .two-col .side li a.active { color: var(--bleu); } .two-col .side li.lvl3 a { padding-left: 22px; font-size: .8rem; }
694 +.two-col .side .toc-extra a { display: block; padding: 5px 0; color: var(--ink-2); text-decoration: none; } .two-col .side .toc-extra a:hover { color: var(--bleu); }
695 +@media (max-width: 1000px) { .two-col { grid-template-columns: 1fr; } .two-col .side { position: static; max-height: none; } }
696 +.form-index { columns: 2; column-gap: 24px; font-size: .92rem; } .form-index li { break-inside: avoid; margin: 4px 0; } .form-index .fi-ch { font-weight: 700; color: var(--or-fonce); margin-right: 6px; }
697 +@media (max-width: 700px) { .form-index { columns: 1; } }
698 +
699 +/* calculateurs */
700 +.tools-nav { display: flex; gap: 8px; flex-wrap: wrap; margin: 16px 0 26px; } .tools-nav a { text-decoration: none; }
701 +.tool { border: 1px solid var(--border); border-radius: var(--radius); background: var(--card); margin: 0 0 26px; box-shadow: var(--shadow-sm); overflow: hidden; }
702 +.tool-head { padding: 16px 22px; background: linear-gradient(180deg, var(--bg-clair), var(--card)); border-bottom: 1px solid var(--border); display: flex; gap: 14px; align-items: center; flex-wrap: wrap; }
703 +.tool-head h2 { margin: 0; font-size: 1.25rem; color: var(--bleu); font-family: var(--display); font-weight: 600; } .tool-head .chip { margin-left: auto; }
704 +.tool-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
705 +.tool-inputs { padding: 18px 22px; display: grid; gap: 12px; border-right: 1px solid var(--border); align-content: start; }
706 +.tool-inputs label { display: grid; gap: 4px; font-size: .84rem; color: var(--ink-2); }
707 +.tool-inputs input, .tool-inputs select { font: inherit; font-size: 1rem; padding: 9px 11px; border: 1px solid var(--border); border-radius: 9px; background: var(--bg); color: var(--ink); width: 100%; }
708 +.tool-inputs .unit { display: grid; grid-template-columns: 1fr auto; gap: 8px; align-items: center; } .tool-inputs .unit span { font-size: .85rem; color: var(--gris); }
709 +.tool-inputs .group-title { font-size: .7rem; text-transform: uppercase; letter-spacing: .12em; color: var(--gris); font-weight: 700; margin-top: 6px; }
710 +.tool-out { padding: 18px 22px; background: var(--bg-2); display: grid; gap: 6px; align-content: start; }
711 +.tool-out .desc { color: var(--ink-2); font-size: .92rem; margin: 0 0 8px; font-family: var(--serif); } .tool-out .formula { font-size: .92rem; margin: 0 0 10px; overflow-x: auto; color: var(--bleu); }
712 +.tool-out .res { display: flex; justify-content: space-between; gap: 12px; padding: 8px 0; border-bottom: 1px dashed var(--border); font-size: .95rem; align-items: baseline; }
713 +.tool-out .res:last-child { border-bottom: 0; } .tool-out .res b { font-variant-numeric: tabular-nums; white-space: nowrap; }
714 +.tool-out .res.main { font-size: 1.15rem; padding: 12px 0; border-top: 2px solid var(--or); border-bottom: 0; margin-top: 8px; } .tool-out .res.main b { color: var(--bleu); font-size: 1.4rem; font-family: var(--display); }
715 +.tool-out .res.warn b { color: var(--rouge); } .tool-out .res.good b { color: var(--vert); } .tool-out .note { font-size: .82rem; color: var(--gris); margin-top: 8px; }
716 +.tool-table { width: 100%; border-collapse: collapse; font-size: .88rem; margin-top: 8px; } .tool-table th, .tool-table td { padding: 6px 8px; border-bottom: 1px solid var(--border); text-align: right; } .tool-table th:first-child, .tool-table td:first-child { text-align: left; } .tool-table th { color: var(--gris); font-weight: 600; font-size: .74rem; text-transform: uppercase; letter-spacing: .05em; }
717 +@media (max-width: 800px) { .tool-body { grid-template-columns: 1fr; } .tool-inputs { border-right: 0; border-bottom: 1px solid var(--border); } }
718 +
719 +/* recherche */
720 +.search-modal { position: fixed; inset: 0; z-index: 500; background: rgba(9, 26, 51, .6); backdrop-filter: blur(4px); display: none; align-items: flex-start; justify-content: center; padding: 8vh 16px; }
721 +.search-modal.open { display: flex; }
722 +.search-box { width: 100%; max-width: 780px; background: var(--card); border-radius: 18px; box-shadow: 0 40px 90px -20px rgba(0, 0, 0, .6); overflow: hidden; border: 1px solid var(--border); max-height: 80vh; display: flex; flex-direction: column; animation: pop .18s; }
723 +.search-box input { width: 100%; border: 0; border-bottom: 1px solid var(--border); padding: 20px 22px; font: inherit; font-size: 1.15rem; background: transparent; color: var(--ink); outline: none; }
724 +.search-results { overflow: auto; padding: 8px; }
725 +.search-hit { display: block; padding: 11px 13px; border-radius: 10px; text-decoration: none; color: var(--ink); }
726 +.search-hit:hover, .search-hit.active { background: var(--bg-clair); }
727 +.search-hit .sh-title { font-weight: 600; color: var(--bleu); font-size: .92rem; display: flex; gap: 8px; align-items: center; }
728 +.search-hit .sh-kind { font-size: .66rem; text-transform: uppercase; letter-spacing: .08em; padding: 2px 6px; border-radius: 4px; background: var(--gris-pale); color: var(--ink-2); }
729 +.search-hit .sh-snippet { font-size: .85rem; color: var(--ink-2); margin-top: 2px; line-height: 1.4; font-family: var(--serif); } .search-hit .sh-where { font-size: .74rem; color: var(--gris); margin-top: 2px; }
730 +.search-foot { display: flex; gap: 14px; padding: 8px 16px; border-top: 1px solid var(--border); font-size: .75rem; color: var(--gris); }
731 +.search-empty { padding: 30px; text-align: center; color: var(--gris); }
732 +.search-page .search-results { padding: 0; } .search-page .search-hit { border: 1px solid var(--border); margin-bottom: 8px; background: var(--card); }
733 +
734 +/* ressources, diapositives, bibliographie */
735 +.res-table { width: 100%; border-collapse: collapse; }
736 +.res-table th, .res-table td { padding: 11px 12px; border-bottom: 1px solid var(--border); text-align: left; vertical-align: middle; }
737 +.res-table th { font-size: .72rem; text-transform: uppercase; letter-spacing: .1em; color: var(--gris); } .res-table .size { color: var(--gris); font-size: .85rem; white-space: nowrap; }
738 +.file-icon { display: inline-grid; place-items: center; width: 36px; height: 36px; border-radius: 9px; font-size: .64rem; font-weight: 800; color: #fff; margin-right: 10px; vertical-align: middle; }
739 +.file-pdf { background: #b22a20; } .file-xlsx { background: #217346; } .file-py { background: #3776ab; } .file-json { background: #6b4fbb; }
740 +.slide-viewer { border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; background: var(--bg-clair); margin: 14px 0 30px; box-shadow: var(--shadow-sm); }
741 +.slide-viewer iframe { width: 100%; height: min(72vh, 720px); border: 0; display: block; background: #525659; }
742 +.slide-tabs { display: flex; gap: 6px; flex-wrap: wrap; margin: 14px 0; }
743 +.slide-tabs button { font: inherit; font-size: .85rem; padding: 7px 13px; border-radius: 999px; border: 1px solid var(--border); background: var(--card); color: var(--ink); cursor: pointer; } .slide-tabs button[aria-selected="true"] { background: var(--bleu); color: #fff; border-color: var(--bleu); }
744 +.bib-list { list-style: none; padding: 0; margin: 20px 0; } .bib-list li { padding: 12px 0; border-bottom: 1px solid var(--border); line-height: 1.5; font-family: var(--serif); }
745 +.bib-list li:target { background: var(--or-pale); padding-left: 10px; border-left: 3px solid var(--or); }
746 +.bib-auth { font-weight: 600; } .bib-cited { font-size: .8rem; color: var(--gris); display: block; margin-top: 2px; font-family: var(--font); } .bib-url { word-break: break-all; font-size: .9em; } .bib-urldate { color: var(--gris); font-size: .85em; }
747 +
748 +/* progression */
749 +.prog-tiles .stat-card { display: grid; gap: 4px; }
750 +.stat-card b { font-family: var(--font); font-size: 1.6rem; color: var(--uqo); line-height: 1.05; font-weight: 700; font-variant-numeric: tabular-nums; }
751 +.stat-card span { font-size: .8rem; color: var(--ink-2); }
752 +.stat-card .bar { height: 6px; background: var(--gris-pale); border-radius: 3px; overflow: hidden; margin-top: 8px; } .stat-card .bar i { display: block; height: 100%; background: var(--vert); transition: width .5s; }
753 +.mini-bar { height: 8px; background: var(--gris-pale); border-radius: 4px; overflow: hidden; min-width: 90px; } .mini-bar i { display: block; height: 100%; background: var(--bleu-clair); }
754 +.prog-table tr.done td { background: rgba(16, 124, 78, .06) !important; }
755 +.prog-table small { color: var(--gris); }
756 +
757 +/* rapport marché */
758 +.kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 12px; margin: 20px 0 8px; }
759 +.kpi { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 14px 16px; display: grid; gap: 2px; position: relative; overflow: hidden; }
760 +.kpi::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: var(--kc, var(--bleu-clair)); }
761 +.kpi span { font-size: .74rem; color: var(--gris); } .kpi b { font-family: var(--font); font-size: 1.35rem; color: var(--ink); font-weight: 700; line-height: 1.1; font-variant-numeric: tabular-nums; letter-spacing: -.01em; } .kpi small { font-size: .74rem; color: var(--ink-2); }
762 +.kpi.up b { color: var(--vert); } .kpi.down b { color: var(--rouge); }
763 +.report-toc { columns: 2; column-gap: 30px; margin: 10px 0; padding: 0; list-style: none; } .report-toc li { break-inside: avoid; margin: 0 0 6px; }
764 +.report-toc a { display: flex; gap: 10px; padding: 8px 10px; border-radius: 8px; text-decoration: none; color: var(--ink); } .report-toc a:hover { background: var(--bg-clair); color: var(--bleu); }
765 +.report-toc .n { font-weight: 700; color: var(--teal); min-width: 26px; font-variant-numeric: tabular-nums; }
766 +.report-toc .part { font-size: .72rem; text-transform: uppercase; letter-spacing: .1em; color: var(--gris); font-weight: 700; margin: 12px 10px 4px; break-after: avoid; }
767 +@media (max-width: 700px) { .report-toc { columns: 1; } }
768 +body.report-page { --part: var(--teal); --part-soft: rgba(15, 139, 141, .13); }
769 +.hpi-legend { display: flex; flex-wrap: wrap; gap: 6px 14px; font-size: .8rem; } .hpi-legend label { display: inline-flex; gap: 6px; align-items: center; cursor: pointer; } .hpi-legend i { width: 12px; height: 12px; border-radius: 3px; display: inline-block; }
770 +.hpi-tip { position: absolute; pointer-events: none; background: var(--navy); color: #fff; font-size: .74rem; padding: 6px 9px; border-radius: 7px; white-space: nowrap; transform: translate(-50%, -110%); box-shadow: var(--shadow); z-index: 5; }
771 +.hpi-wrap { position: relative; }
772 +
773 +/* impression */
774 +@media print {
775 + .topbar, .site-footer, .ch-toc, .ch-pager, .ch-quiz, .ch-tools, .search-modal, .h-anchor, .box-anchor, .sn-toggle, .readbar, .read-tools, .notes-panel, .tts-bar, .stepper-wrap, .widget .w-controls, .toasts { display: none !important; }
776 + .ch-layout { display: block; padding: 0; } .prose, .prose > * { max-width: none; }
777 + .sidenote { display: block !important; float: none; width: auto; margin: .4em 0; padding: 4px 8px; background: #f3f3f3; border-left: 2px solid #999; }
778 + details:not([open]) > .box-body { display: block; } details > summary { list-style: none; }
779 + .ch-hero { background: #fff !important; color: #000; border-bottom: 2px solid #000; } .ch-hero .eyebrow, .ch-hero h1 { color: #000; }
780 + .box-ret { background: #eee; color: #000; } .box-ret .box-head { color: #000; }
781 + a { color: inherit; text-decoration: none; } body { font-size: 11pt; }
782 +}
783 +
784 +/* =============================================================================
785 + Mobile
786 + ============================================================================= */
787 +@media (max-width: 760px) {
788 + :root { --fs: 16.5px; --topbar-h: 56px; }
789 + .page { padding: 0 16px; }
790 + .page-head { padding: 30px 0 16px; } .page-head h1 { font-size: 1.9rem; }
791 + .section { padding: 36px 0 6px; } .section-head h2 { font-size: 1.5rem; }
792 + .prose { font-size: var(--fs); } .prose h2.h-section { font-size: 1.5rem; } .chapter-page.no-dropcap .prose > p:first-of-type::first-letter { font-size: 2.6em; }
793 + .box { padding: 12px 14px 12px; border-radius: 8px; } .box-ret { padding: 16px; }
794 + .ch-layout { padding: 20px 16px 0; } .ch-pager { padding: 0 16px; } .ch-quiz { padding: 0 16px; } .ch-quiz-inner { padding: 18px 16px; }
795 + .stepper { padding: 8px 16px; }
796 + .table-wrap { margin-left: -16px; margin-right: -16px; border-radius: 0; border-left: 0; border-right: 0; }
797 + table.tbl th, table.tbl td { padding: 8px 10px; font-size: .85em; }
798 + .wbar { grid-template-columns: 80px 1fr 84px; font-size: .74rem; }
799 + .w-head h4 { font-size: 1.05rem; } .w-view { padding: 12px; }
800 + .q-card, .tcard, .game { padding: 14px; } .q-text, .tq { font-size: 1rem; }
801 + .tform input { width: 100%; } .tform .btn { width: 100%; justify-content: center; }
802 + .fc-face { padding: 22px 20px; } .fc-front .fc-q { font-size: 1.35rem; } .fc-card { min-height: 280px; }
803 + .kpi-grid { grid-template-columns: 1fr 1fr; gap: 8px; } .kpi b { font-size: 1.2rem; }
804 + .prog-tiles { grid-template-columns: 1fr 1fr; }
805 + .eval-table { font-size: .85rem; } .eval-table th, .eval-table td { padding: 8px 9px; }
806 + .notes-panel { top: 0; width: 100vw; }
807 + .hero-cta .btn { flex: 1 1 auto; justify-content: center; }
808 + .seance-card::after { font-size: 4rem; }
809 + .footer-inner { padding: 34px 16px 24px; }
810 + .gl-letters { position: static; }
811 + .two-col .side { order: -1; }
812 + .map-layout { gap: 16px; }
813 +}
814 +@media (max-width: 420px) { .hero-stats { grid-template-columns: 1fr 1fr; } .stat { padding: 10px 12px; } .kpi-grid { grid-template-columns: 1fr; } }
815 +
816 +/* rapport : pleine largeur des tableaux et figures */
817 +.report-page .prose { max-width: none; }
818 +.report-page .prose > *, .report-page .prose .box, .report-page .prose ul, .report-page .prose ol { max-width: 80ch; }
819 +.report-page .prose .table-wrap, .report-page .prose figure, .report-page .prose .figimg { max-width: none; }
820 +.report-page .prose figure.float-table figcaption { max-width: 80ch; }
added content/imm1003/assets/fig/001c690eab0b1a0f.svg +460 −0
Large diff (460 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/05a4c459a287bfe6.svg +405 −0
Large diff (405 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/0fd57b315ecf3382.svg +618 −0
Large diff (618 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/168a4d00f87e6752.svg +432 −0
Large diff (432 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/211d88aa82a099fd.svg +478 −0
Large diff (478 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/3a6143e325040efc.svg +680 −0
Large diff (680 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/42192366d230b6bb.svg +285 −0
Large diff (285 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/54d1908d6bf32038.svg +434 −0
Large diff (434 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/56e90b7290c04a55.svg +645 −0
Large diff (645 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/5a4237b600ba2c13.svg +684 −0
Large diff (684 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/5ec47c739c936297.svg +283 −0
Large diff (283 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/6230b752d3c99503.svg +437 −0
Large diff (437 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/6822420a430ca8a4.svg +398 −0
Large diff (398 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/6bdd004543fa18f6.svg +687 −0
Large diff (687 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/6bff32d37d43411e.svg +826 −0
Large diff (826 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/6d1dc0137257549a.svg +227 −0
Large diff (227 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/7d9680996ac7a82e.svg +473 −0
Large diff (473 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/868f917ffd7053a2.svg +587 −0
Large diff (587 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/868fa1ab2b7cb9cd.svg +215 −0
Large diff (215 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/86c1c980b1618f3a.svg +497 −0
Large diff (497 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/8a3cf2c324617f58.svg +774 −0
Large diff (774 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/8e7d5f4b801a7141.svg +694 −0
Large diff (694 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/9042734ce17f6b75.svg +267 −0
Large diff (267 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/90bc38ba889691b4.svg +546 −0
Large diff (546 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/a01c46f6bb90b294.svg +628 −0
Large diff (628 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/a66445bc73b67ae3.svg +471 −0
Large diff (471 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/ae19d240a5287ebd.svg +275 −0
Large diff (275 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/b92aa7fcb131b386.svg +657 −0
Large diff (657 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/ba4345b7767575bb.svg +396 −0
Large diff (396 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/d015489bf41185b5.svg +205 −0
Large diff (205 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/d3ce84425d311d24.svg +359 −0
Large diff (359 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/d4bce0787cd872dd.svg +831 −0
Large diff (831 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/d939dd935cc84036.svg +465 −0
Large diff (465 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/d9ad6a1a507c6ab1.svg +367 −0
Large diff (367 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/d9fd9916b0fdc514.svg +436 −0
Large diff (436 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/da129bede2dcbff0.svg +348 −0
Large diff (348 lines) is not loaded by default to keep the page fast.Load diff
added content/imm1003/assets/fig/ddd6330ec205be6c.svg +835 −0
Large diff (835 lines) is not loaded by default to keep the page fast.Load diff

Diff truncated — file too large.

Menu

Theme