---
suivi: 1351
date: 2026-08-14
sujet: chantier_sous_navigation
chantier: suivi_chantier
type: feat
statut: poussé
hash: 222e7b72
fichiers:
  - resources/js/Pages/SuiviChantier/Index.vue
  - resources/js/Layouts/AppShell.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1351_chantier_sous_navigation.md
---

## PROMPT ENVOYÉ

SUIVI #1351 — barre d’onglets Chantier (`/programmes/{id}/marches`)
sur `ObjectSubNavBar.vue`, même présentation collante que la fiche
marché (#1318/#1319). 7 onglets, ordre et cibles inchangés.
Ne pas modifier le composant sauf indispensable. Reprendre Teleport
+ `defer` + init hash. Rebaser sur origin/main (#1350).

## FICHES LUES

- `#1316` LEÇON : sticky local + ObjectSubNavBar ; trailing hors overflow.
  Conservé : bouton « + Nouveau marché » dans `#trailing`.
- `#1317` LEÇON : ne plus compenser un padding par `-mt-8` / `pt-10`.
  `tone="surface"` explicite (défaut `gold` = barre programme).
- `#1318` LEÇON : Teleport hors `main.p-8` ; ne pas toucher
  `useFormatters`. Rebuild #1318 = 44 chunks — à surveiller.
- `#1319` LEÇON : pas de `:disabled` jusqu’à `onMounted` (1er paint
  dans le main = bande). `defer` + hôte `class="contents"` +
  `ref(tabIdFromHash())`. **Repris tel quel.**
- `#1350` : onglet Synthèse déjà dans les 7 ; contenu non touché.
- `#1342` / `#1347` / `#1349` : tableau marchés non touché.
- `#1340` / `#1341` : non touchés.

## SYNTHÈSE

### Mapping onglets (inchangé)

| Libellé affiché | Identifiant / hash | Cible | Actif après rechargement direct |
|---|---|---|---|
| APPELS D'OFFRES | `appels-offres` / `#appels-offres` | `AppelsOffresIndex` | O |
| MARCHÉS | `marches` / `#marches` | `MarchesIndex` (4 KPI + tableau) | O |
| FACTURES | `factures` / `#factures` | `ProgrammeFacturesPanel` (si permission) | O |
| COMPTE PRORATA | `compte-prorata` / `#compte-prorata` | `CompteProrataIndex` (si permission) | O |
| CIE | `cie` / `#cie` | `CieIndex` (si permission) | O |
| NF HABITAT | `nf-habitat` / `#nf-habitat` | `NfHabitatIndex` (si permission) | O |
| SYNTHÈSE | `synthese` / `#synthese` | `ProgrammeSyntheseFinanciere` | O |

Clic = `replaceState` hash (pas Inertia Link). Init
`ref(normalizeTab(currentHashTab() ?? props.active_tab))`.

### Pattern barre (reprise #1318/#1319)

- Hôte AppShell `#chantier-subnav-host` `class="contents"`,
  `v-if` `SuiviChantier/Index` seulement.
- `Teleport to="#chantier-subnav-host" defer` — jamais de 1er paint
  dans `main.p-8`.
- Header fil d’Ariane masqué sur Chantier (même raison que
  `Marches/Show` : bande blanche `py-3` entre filet doré et sous-nav).
- `tone="surface"` + `nowrap`. `ObjectSubNavBar.vue` **non modifié**.

### Consommateurs ObjectSubNavBar (composant inchangé)

| Consommateur | tone | Impact |
|---|---|---|
| AppShell barre programme | gold (défaut) | Hôte Chantier absent ailleurs |
| AppShell dossier foncier | gold | Inchangé |
| AppShell identité foncier | gold | Inchangé |
| DepotFactureSaisieForm | (son hôte sticky #1270) | Inchangé |
| Marches/Show | surface | Hôte `#marche-subnav-host` inchangé |

AppShell touché : hôte + `v-if` header. `main.p-8` inchangé.
`useFormatters.js` non touché.

### Hors périmètre respecté

Contenu des 7 onglets, tableau marchés, synthèse programme (#1350),
synthèse marché, `documentPdf`, `siwi_import`, recherche commune :
non touchés. Aucune migration.

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan optimize:clear && php artisan view:clear
php artisan journal:sync
```

Pas de migrate. Pas de `route:clear`.

`/programmes/{id}/marches` :

1. Barre blanche collée sous HERMIONE · … · CHANTIER, sans bande
   grise au premier rendu.
2. Défilement : barre programme + sous-nav restent au-dessus du
   `main` ; pas de chevauchement.
3. « + Nouveau marché » dans la sous-nav, à droite, ouvre la création.
4. 4 KPI ENGAGÉ / FACTURÉ / PAYÉ / RESTE À RÉGLER intacts.
5. Rechargement direct `#synthese`, `#marches`, `#appels-offres` :
   onglet + contenu alignés dès le 1er paint.
6. Programme sans marché : barre affichée, onglet Marchés vide OK.

## LEÇON

Ne pas réinventer un sticky dans `main.p-8` (#1317). Teleport +
`defer` + hôte `contents` + hash dès le `ref()` (#1319). Masquer le
header AppShell vide sinon une bande `py-3` s’intercale. Ne pas
modifier `ObjectSubNavBar.vue` : `tone="surface"` explicite, défaut
`gold` pour les cinq autres écrans.
