# Module Sommaire Automatique

Module du plugin **Nexxis Toolkit** qui génère automatiquement un sommaire à partir des titres `<h2>` du contenu éditorial.

---

## Fonctionnalités

- **Sommaire inline** (`nav.nxt-toc-inline`) visible en mobile, masqué en desktop
- **Panel latéral gauche** (`#nxt-toc-panel`) ouvert à la demande par la Floating Toolbar (clic sur l'icône "Sommaire")
- **Ajout automatique des ancres** aux H2 sans ID
- **Cache transient** par post pour éviter la régénération à chaque requête
- **Exclusion page par page** (via ACF ou tableau admin)
- **Neutralisation du code legacy** — le module prédomine sur l'ancien sommaire `functions.php` des thèmes enfants existants

> **Dépendance** : l'accès desktop au sommaire passe par la **Floating Toolbar**. Sans ce module actif, seul le sommaire inline mobile reste visible.

---

## Trois modes d'injection

Configurables dans **Apparence > ⚡ Nexxis Toolkit > Sommaire Automatique** :

| Mode | Description | Cas d'usage |
|---|---|---|
| **🔀 Hybride** (défaut) | Neutralise l'ancien code legacy et injecte le sommaire Toolkit partout. Respecte uniquement le marqueur ALB manuel `nexxis-sommaire-h2-placeholder`. | Migration sites legacy + nouveaux sites |
| **⚡ Automatique** | Injection sur toutes les pages éligibles, sans condition. | Nouveaux sites propres |
| **📝 Shortcode uniquement** | Aucune injection auto. Uniquement via shortcode `[sommaire_final]` placé manuellement. | Cas très spécifiques |

---

## Neutralisation du legacy

Sur `init` priorité 20 (après chargement du thème enfant), le module :

1. Retire `ajouter_ids_aux_titres_enfold` du filtre `the_content`
2. Désenregistre le shortcode legacy `[sommaire_final]` et le remplace par un handler no-op
3. Fait de même pour `[nexxis_sommaire_h2]` si présent

**Conséquence** : sur un site legacy, l'ancien `nav.sommaire-auto` n'est plus généré — le sommaire Toolkit prend le relais sans qu'il soit nécessaire de toucher au `functions.php` du thème enfant.

---

## Options

| Option WordPress | Défaut | Description |
|---|---|---|
| `nxt_sommaire_mode` | `hybride` | Mode d'injection (`auto` / `hybride` / `shortcode`) |
| `nxt_sommaire_min_h2` | `3` | Nombre minimum de H2 pour afficher le sommaire |
| `nxt_sommaire_titre` | `Sommaire` | Titre affiché en haut du panel |
| `nxt_sommaire_exclusions` | `[]` | IDs de pages à exclure |

---

## Champ ACF par page

Un champ `sommaire_masquer` (type `true_false`) est ajouté automatiquement à l'éditeur des pages. Activé → le sommaire ne s'affiche pas sur cette page spécifique.

---

## Cache

Clé : `nxt_sommaire_{post_id}_{post_modified}_{mode}`
Durée : `DAY_IN_SECONDS` (24h)
Invalidation automatique : au `save_post`.

**Purge manuelle SQL** :
```sql
DELETE FROM wp_options
WHERE option_name LIKE '_transient_nxt_sommaire_%'
   OR option_name LIKE '_transient_timeout_nxt_sommaire_%';
```

---

## Identifiants CSS

Tous préfixés `nxt-toc-*` pour éviter les conflits avec l'ancien code legacy :

| Rôle | Identifiant |
|---|---|
| Panneau latéral gauche | `#nxt-toc-panel` |
| Sommaire inline (mobile) | `.nxt-toc-inline` |
| Point d'ouverture desktop | Bouton `.nxt-toolbar__action--toc` (Floating Toolbar) |

**Jamais utiliser** : `#sommaire-fixed`, `.sommaire-auto`, `.sf-icon`, `.sf-label`, `.sf-titre`, `.sf-close` (noms réservés au legacy).

---

## Assets

- CSS : `assets/css/sommaire.css` (chargé **inline** via `file_get_contents` — jamais par URL)
- Fallback inline dans `get_fallback_css()` si le fichier est absent

---

## Divers

- **Limites d'upload** : JPG/PNG/WEBP 5Mo, GIF 2Mo, PDF 10Mo
- **Admin bar** : masquée pour les non-administrateurs sur le front
- **Correction H3 consent** : patch jQuery pour Enfold dans `wp_footer`

---

Voir [CHANGELOG.md](CHANGELOG.md) pour l'historique des versions.
