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 3+**Tuteur IA pour les cours IMM1003 — Éléments d'évaluation immobilière et IMM1033 — Méthodes du coût (UQO).**
4−> immobilière (Université du Québec en Outaouais).** Il explique la matière en citant les notes de cours officielles, 4+Production : https://www.uqo-chat.app · Spécification complète : [`CLAUDE.md`](CLAUDE.md).
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.
8 5
9−| | | 6+Le tuteur explique la matière en citant les notes de cours officielles (RAG), exécute du Python
10−|---|---| 7+dans un bac à sable isolé, produit des classeurs Excel à formules vivantes, cherche des données
11−| **Production** | https://www.uqo-chat.app | 8+de marché actuelles (Firecrawl), analyse les fichiers déposés et génère des quiz interactifs.
12−| **Version** | v0.5 (auth par invitation) — `backend/pyproject.toml` et `frontend/package.json` portent encore `0.1.0` | 9+Tous les modèles (Claude, GPT) passent par OpenRouter avec repli automatique.
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 |
19 10
20−--- 11+## Architecture (déploiement MacLustr)
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
166 12
167 ``` 13 ```
168−uqo-chat/ 14+Internet ── ngrok (www.uqo-chat.app) ──► uqo-chat-api :8190 FastAPI + SSE + SPA React (PM2)
169−├── README.md · CLAUDE.md · Makefile · .env.example · docker-compose.yml 15+ │
170−├── .github/workflows/ ci.yml (ruff + pytest + tsc + build + trivy) · deploy.yml (images ghcr + kubectl, non utilisé en prod) 16+ ├──► uqo-chat-sandbox :8191 (PM2, sandbox-exec : sans réseau)
171−├── deploy/uqo-chat.manifest.json gabarit du manifeste mld (les secrets sont dans M1M32:~/dispatch/apps/uqo-chat.json) 17+ ├──► SQLite data/uqochat.db (index BM25 en mémoire)
172−├── backend/ Python 3.12 · FastAPI · SQLAlchemy async 18+ ├──► fichiers data/files/ (TTL 7 j / 30 j épinglés)
173−│ ├── pyproject.toml dépendances (fastapi, uvicorn, pydantic, sqlalchemy, aiosqlite, asyncpg, httpx[http2], 19+ └──► OpenRouter · Firecrawl (HTTPS sortant)
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/
208 ``` 20 ```
209 21
210−## 6. Backend (FastAPI) 22+Les manifestes Kubernetes (`k8s/`) et `docker-compose.yml` reproduisent la cible décrite dans la
211− 23+spécification (Postgres + pgvector, Redis, MinIO, sandbox durci) pour un futur cluster ; la
212−Préfixe commun **`/api/v1`**. Authentification par **JWT** (`Authorization: Bearer`, 24 h) + jeton de 24+production actuelle tourne sur un nœud Mac du cluster via `mld` (voir `deploy/`).
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`)
289 25
290−Service FastAPI minimal (`server.py`) : `GET /healthz`, `POST /run {code ≤ 200 000 car., files_in[], timeout_s 1–60}`, 26+## Démarrage local
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
343 27
344 ```bash 28 ```bash
345−git clone gitsrv:~/srv/git/uqo-chat.git && cd uqo-chat 29+cp .env.example .env # OPENROUTER_API_KEY, FIRECRAWL_API_KEY, RESEND_API_KEY…
346−cp .env.example .env # OPENROUTER_API_KEY, FIRECRAWL_API_KEY, RESEND_API_KEY, JWT_SECRET, PROFESSOR_EMAILS… 30+make setup # venvs uv (backend, sandbox) + npm install
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
350 make sandbox & # :8191 31 make sandbox & # :8191
351−make api & # :8190 (sert frontend/dist s'il existe ; /api/docs en dev) 32+make api & # :8190 (sert frontend/dist s'il existe)
352−make web # :5173, proxy /api → 8190 33+make web # :5173 avec proxy /api
353 make ingest COURSE=imm1033 SITE=~/Desktop/Academique/UQO/UQO_COURS/_Site_web/dist/imm1033 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` 38+Connexion : le professeur inscrit les courriels des étudiant·es (onglet **Étudiants**) ; chacun·e reçoit
358−qui isole le sandbox avec `network_mode: none`). En dev, `POST /auth/forgot` renvoie `dev_link` pour se connecter 39+un courriel Resend « Bienvenue sur UQO-Chat » avec un lien `/mot-de-passe?token=…` (valide
359−sans courriel. 40+`INVITE_TTL_DAYS`) pour choisir son mot de passe, puis se connecte avec courriel + mot de passe.
360− 41+« Première connexion ou mot de passe oublié » renvoie un lien (`RESET_TTL_MINUTES`). Seules les adresses
361−## 13. Tests, lint, CI 42+inscrites (ou listées dans `PROFESSOR_EMAILS` / `ADMIN_EMAILS` / `INVITED_EMAILS`) peuvent demander un lien.
362− 43+Sans `RESEND_API_KEY` (ni SMTP), les liens sont affichés dans le tableau de bord pour être copiés ; en dev,
363−```bash 44+`/auth/forgot` renvoie `dev_link`.
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`) :
383 45
384−| Clé | Valeur | 46+## Déploiement
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**) :
395 47
396 ```bash 48 ```bash
397−make test lint build # vérifie puis produit frontend/dist 49+make build # frontend/dist
398−git add -A && git commit -m "…" && git push origin main 50+~/Desktop/cluster-skill/mld stage $PWD uqo-chat # laptop → passerelle
399−~/Desktop/cluster-skill/mld stage $PWD uqo-chat # laptop → M1M32:~/dispatch/stage/uqo-chat/dir 51+~/Desktop/cluster-skill/mld deploy uqo-chat # nœud choisi par score (--node X pour forcer)
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]
402 ``` 52 ```
403 53
404−`data/` (SQLite + fichiers) et `content/` (sites ingérés) sont **exclus de la synchronisation** : ils persistent sur 54+Le manifeste de production (`M1M32:~/dispatch/apps/uqo-chat.json`) contient les secrets ; la copie
405−le nœud. Un `mld move uqo-chat --to <nœud>` déplace l'app mais il faut alors recopier `data/` et `content/` 55+du dépôt (`deploy/uqo-chat.manifest.json`) n'a que des gabarits. Après un premier déploiement,
406−manuellement (ou ré-ingérer). 56+ingérer le matériel de cours sur le nœud :
407−
408−## 15. Exploitation
409 57
410 ```bash 58 ```bash
411−NODE=M4M64a # vérifier avec : ~/Desktop/cluster-skill/mld status | grep uqo-chat 59+scp -r ~/Desktop/Academique/UQO/UQO_COURS/_Site_web/dist/imm10{03,33} <nœud>:~/apps/uqo-chat/content/
412−ssh $NODE 'pm2 ls | grep uqo-chat; pm2 logs uqo-chat-api --lines 100 --nostream' 60+ssh <nœud> 'cd ~/apps/uqo-chat/backend && for c in imm1003 imm1033; do \
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 \
419 DATA_DIR=~/apps/uqo-chat/data .venv/bin/python -m scripts.ingest --course $c --site ../content/$c; done' 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' 62+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"'
424 ``` 63 ```
425 64
426−- Registre `mld` (`M1M32:~/dispatch/registry.json`) : nœud, IP LAN, port, santé, processus ; consommé par les apps 65+## Écarts assumés par rapport à la spécification
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
433 66
434−- Chaque appel est enregistré dans `llm_usage` (modèle, jetons, coût USD) ; `/admin` agrège par jour, modèle et 67+| Spécification | Réalisation actuelle | Pourquoi |
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 |
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 | 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 |
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) | 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) |
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 | 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 |
458−| Pods sandbox gVisor / Job k8s | Service `sandbox-runner` + `sandbox-exec` macOS + rlimits + timeout | Équivalent local ; Dockerfile + NetworkPolicy prêts pour k8s | 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 |
459−| Alembic | `create_all` + `_add_missing_columns` | Migration initiale à écrire au premier changement de schéma incompatible | 73+| Alembic | `create_all` au démarrage | Une migration initiale sera ajoutée au premier changement de schéma |
460−| Kubernetes + ngrok operator | `mld` + PM2 + agent ngrok sur un nœud Mac | Infrastructure réelle = cluster MacLustr | 74+| Export PDF de conversation, mode hors-ligne complet | Non faits (PWA : app shell + cache lecture) | Phase 2/3 |
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
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