diff --git a/CLAUDE.md b/CLAUDE.md
index e0d0d93..e23929c 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -95,6 +95,12 @@ une migration SQL** (les pages autorisées sont lues en base, pas écrites en PH
Une page absente des groupes reste affichée dans un groupe « Autres » : le filet évite qu'un oubli
la rende inatteignable. Chaque page passe aussi un `pageSubtitle` décrivant l'action de l'écran.
+Seule exception assumée : `faq` (guide d'utilisation) est **volontairement absente de `$navigation`**
+et rendue par le bloc `.view-tab-help` ancré à droite de la barre, sous condition `$showHelpTab`.
+L'omettre de `$navigation` est ce qui l'empêche d'être aussi repêchée par le filet « Autres » et
+d'apparaître deux fois. Elle reste soumise à `acces_role_page`
+(`database/migration_v7_9d_faq.sql`, les trois rôles) : sans migration, ni bouton ni page.
+
### Chaîne d'un appel
```
diff --git a/app/Controllers/PageController.php b/app/Controllers/PageController.php
index 8537d89..ef32ab9 100644
--- a/app/Controllers/PageController.php
+++ b/app/Controllers/PageController.php
@@ -202,6 +202,20 @@ final class PageController extends Controller
]);
}
+ /**
+ * Guide d'utilisation. Page purement statique : aucun script, aucun appel
+ * API, aucune donnée métier. Elle suit malgré tout la règle des droits en
+ * base — tant que la migration n'est pas jouée, la page est refusée et le
+ * bouton d'accès n'apparaît pas dans la barre de navigation.
+ */
+ public function faq(): void
+ {
+ $this->access->requirePage('faq');
+ $this->renderPage('faq', 'Guide d’utilisation', 'faq', [
+ 'pageSubtitle' => 'Le parcours complet, du paramétrage des lieux à la validation des plannings, et les réponses aux questions les plus fréquentes.',
+ ]);
+ }
+
private function renderPage(string $view, string $title, string $activePage, array $data = []): void
{
Security::sendHtmlHeaders();
diff --git a/app/Views/layouts/footer.php b/app/Views/layouts/footer.php
index d5fdc2f..8c149f9 100644
--- a/app/Views/layouts/footer.php
+++ b/app/Views/layouts/footer.php
@@ -28,10 +28,10 @@ window.PTA_PAGE_CONFIG = = json_encode([
'params' => $pageConfig,
], JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE) ?>;
-
+
-
+
-
+