adopt: état déployé sur M4M64a adopté comme source de vérité (remote-first, 2026-10-02)
50 changed files +19,493 −482
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'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}} = {} & D_{\text{phys.\ curable}} + D_{\text{phys.\ incurable}} \\ | ||||
| 113 | +& + 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} &= \text{Somme des loyers du marché à 100~\% d'occupation} \\ | ||||
| 119 | +\text{RBE} &= \text{RBP} - \text{Inoccupation} - \text{Mauvaises créances} | ||||
| 120 | ++ \text{Autres revenus} \\ | ||||
| 121 | +\text{RNE} &= \text{RBE} - \text{Dépenses d'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} ={} & \text{Taux sans risque} + \text{Prime de risque immobilier} \\ | ||||
| 134 | +& + \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>></mo></mrow><annotation encoding="application/x-tex">></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">></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'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.