# Rapport de direction artistique — Te Litho Tenge Didier

Rédigé le 22 juillet 2026. Cette phase est exclusivement artistique : aucune migration, aucun
contrôleur métier, aucun formulaire, aucun module d'administration n'a été modifié. Seuls les
gabarits publics (Blade), les feuilles de style, le JavaScript de présentation et un service
provider (pour partager une citation avec le footer) ont été touchés. La suite de tests complète
(96 tests) passe avant et après cette phase, sans aucune régression fonctionnelle.

---

## 1. Intention

L'objectif énoncé était de transformer un site institutionnel fonctionnel en une **expérience
narrative** : qu'un visiteur ressente, dès l'arrivée, qu'il découvre le parcours d'un homme — pas
qu'il consulte des pages. Le parti pris retenu a été la **sobriété signée** : peu d'éléments
décoratifs, mais chacun porteur de sens (le logo, la devise, la lumière, le rythme), plutôt qu'une
accumulation d'effets. C'est délibérément l'inverse d'un habillage « template » : moins d'options,
plus d'intention.

## 2. Inspirations (analysées, jamais copiées)

Le travail s'est nourri de l'observation du **rythme** et de la **hiérarchie** propres aux sites de
musées, mémoriaux et fondations institutionnelles :

- **Respiration généreuse** : sections pleine largeur avec beaucoup d'espace vertical (`py-20` à
  `py-32`), pour laisser respirer chaque idée plutôt que d'empiler des blocs denses — inspiré du
  rythme des pages d'exposition (une idée, un temps de lecture, une transition).
- **Photographie mise en scène plutôt qu'affichée** : une grande image éditoriale avec légende
  contextuelle (date, lieu, évènement) plutôt qu'une grille dense — inspiré des salles d'exposition
  qui isolent une œuvre plutôt que de la noyer dans un mur d'images.
- **Couleur comme signal narratif** : alternance de teintes sombres/claires dans la chronologie pour
  faire ressentir le temps qui passe (technique utilisée par les mémoriaux pour marquer des
  chapitres), sans jamais sortir de la palette de la maison.
- **Typographie comme voix** : de très grands titres serif (Fraunces) pour les moments solennels
  (nom, devise), une sans-serif sobre (Instrument Sans) pour le texte courant — la même logique que
  les cabinets d'architecture institutionnels, qui réservent la typographie d'empan aux moments qui
  comptent.
- **Discrétion du mouvement** : apparitions douces, jamais de rebond ni d'effet « gadget » —
  inspiré du storytelling interactif contemporain, où l'animation sert la lecture et ne se fait
  jamais remarquer pour elle-même.

Aucun design existant n'a été reproduit : ces observations ont été traduites en décisions concrètes
propres à ce site (voir sections suivantes).

## 3. Identité graphique : le logo devient signature

Le fichier source du logo (`images/onnelacherien.jpeg`, jamais modifié) est un emblème circulaire
plein (fond vert, cercle or, étoile, silhouette de la RDC, bandeau « ON NE LÂCHE RIEN »). Utilisé
tel quel en grand format à faible opacité, ce médaillon coloré aurait été illisible et aurait
introduit deux teintes supplémentaires (vert, rouge) dans une palette que la direction artistique
demandait justement de simplifier — un vrai risque de rendu « kitsch ».

**Décision** : une nouvelle variante *filigrane* a été fabriquée à partir de l'original (jamais
modifié, jamais déplacé), par extraction chromatique du trait or/rouge hors du fond vert (le canal
rouge moins le canal vert sépare nettement les deux, vérifié empiriquement pixel par pixel), puis
recoloration en une teinte plate unique — or pour les fonds sombres, encre pour les fonds clairs.
Le résultat (`public/images/brand/logo-mark-gold.png` / `logo-mark-ink.png`, générés par
`GenerateBrandAssets::generateWatermark()`, commande `php artisan brand:generate`) est un filigrane
sobre, jamais coloré au-delà de la palette de la maison.

Présence du logo, comme demandé :
- **Très grand dans le Hero** : médaillon visible à côté de l'accroche, plus le filigrane en
  arrière-plan (`home.blade.php`).
- **Filigrane discret** : section « devise » de l'accueil, page Mouvement (hero + appel final),
  page ATL (citation + appel à rejoindre), footer.
- **Page Mouvement et ATL** : logo net en médaillon dans le hero de chacune.
- **Footer** : bandeau de conclusion dédié (logo net + devise), voir §7.
- **Transitions** : l'écran d'introduction (§4).

Chaque usage reste unique par section — jamais deux filigranes dans la même vue, jamais une
répétition qui banaliserait le motif.

## 4. Introduction cinématographique

Un écran de signature (`#intro-splash` dans `resources/views/components/layout.blade.php`) joue à
la toute première visite d'une session :

1. Écran sobre, fond `congo-950`.
2. Apparition douce du médaillon (fondu + léger zoom, 0,55 s).
3. « On ne lâche rien&nbsp;! » apparaît sous le logo (0,5 s, décalé).
4. Lueur or radiale, brève (0,7 s).
5. Fondu vers le Hero déjà rendu en dessous (0,4 s).

Durée totale ≈ 1,7 s — dans la fourchette demandée (1 à 2 s). Deux garde-fous :

- **Une seule fois par session** : un script inline dans le `<head>` (avant toute peinture) pose
  `sessionStorage.tlt-intro-seen` et ajoute la classe `intro-skip` sur `<html>` si l'écran a déjà
  été vu — l'écran est alors retiré instantanément par `app.js`, sans flash.
- **`prefers-reduced-motion`** : détecté à la fois côté CSS (`@media (prefers-reduced-motion:
  reduce) { #intro-splash { display: none !important; } }`) et côté script — l'écran ne s'affiche
  jamais pour ces visiteurs, le site apparaît directement.

## 5. Hero : composition et carrousel narratif

Le Hero conserve l'architecture demandée (texte à gauche, carrousel à droite) mais gagne en
profondeur : lueur or diffuse en haut à droite (`blur-3xl`), filigrane du logo en arrière-plan,
médaillon du logo bien visible à côté de l'accroche, titre en `.h-signature` (échelle fluide via
`clamp()`, de 2,75 rem sur mobile à 6 rem sur grand écran — jamais de débordement, jamais de
redimensionnement brutal entre les points de rupture).

Le carrousel devient narratif : chaque photo affiche désormais un petit chapitre — **L'homme → Le
terrain → La population → La responsabilité → La vision** — calculé par position (`$i % 5`), en
plus de la légende réelle existante (`hero_caption`, gérée depuis l'administration, inchangée). La
narration est donc automatique quel que soit le nombre d'images actives dans le carrousel hero
(géré par l'administration existante, non modifiée).

## 6. Un parcours en quelques chiffres

Nouvelle section dédiée, entre les domaines d'action et la devise. Les chiffres sont **calculés
depuis la base de données réelle** (`HomeController@index`), jamais approximés :

| Chiffre affiché | Calcul |
|---|---|
| Années de service | Année courante − année du premier mandat (`ChronologyPeriod`, hors période « formation ») |
| Albums thématiques | `Album::count()` |
| Archives photographiques | `MediaItem::where('published', true)->count()` |
| Documents et vidéos d'archives | `Document::published` + `Video::published` |
| Domaines d'action documentés | `ActionDomain::where('published', true)->count()` |

Chaque chiffre est animé (comptage progressif à l'entrée dans le viewport, `resources/js/app.js`),
mais **la valeur exacte est toujours présente dans le HTML** dès le rendu serveur — sans JavaScript
ou avec `prefers-reduced-motion`, le chiffre correct s'affiche simplement, sans décompte. Aucune
information n'est jamais masquée en attendant un script.

## 7. Mise en scène des photographies

Les grilles denses (« murs de photos ») ont été remplacées, sur l'accueil et sur ATL, par une
composition éditoriale : une grande image en premier plan (ratio cinématographique 16:9 / 21:9) avec
légende réelle (évènement, lieu, date — champs déjà présents sur `MediaItem`, aucune donnée
inventée), suivie d'une petite sélection plus aérée en dessous. Le nombre d'images tirées
aléatoirement pour l'accueil a été réduit (8 → 5) pour privilégier la respiration à la densité.

## 8. Chronologie : une frise immersive

Chaque période de la chronologie (`chronologie/index.blade.php`) reçoit désormais sa propre
ambiance — bande pleine largeur, teinte alternée parmi cinq déclinaisons de la **même** palette
(`congo-950`, `paper`, `congo-900`, `gold-100`, `ink-900`), pour faire ressentir visuellement le
passage du temps sans introduire une seule couleur nouvelle. Quand un évènement de la période
dispose d'une image de couverture (`cover_manifest_id`, champ déjà existant, géré depuis
l'administration de la chronologie — non modifiée), cette photo devient une bannière cinématographique
en tête de section. **Constat honnête** : au moment de cette phase, aucun évènement n'a encore de
couverture assignée en base — la bannière ne s'affiche donc pas encore en pratique, mais s'activera
automatiquement dès qu'un administrateur renseignera `cover_manifest_id` sur un évènement, sans
aucun changement de code nécessaire.

## 9. Footer : une conclusion, pas une fin de page

Le footer s'ouvre désormais par un bandeau de conclusion : citation réelle (partagée à toutes les
pages via un `View::composer('partials.footer', ...)` dans `AppServiceProvider`, qui sélectionne la
citation publiée prioritaire — aucune donnée inventée), puis médaillon du logo, puis la devise. Les
colonnes de navigation et les coordonnées, inchangées dans leur contenu, suivent en dessous. Rien
n'a été supprimé : uniquement réordonné et encadré.

## 10. ATL et Mouvement : de l'administratif à l'incarné

**ATL** : hero agrandi (logo ATL plus présent, ombre portée), citation encadrée par un filigrane
discret, cartes « pourquoi rejoindre » numérotées avec un accent or, section finale fusionnant
l'appel à l'engagement et les réseaux sociaux dans un même bandeau sombre habillé du filigrane.

**Mouvement** : la page ne s'ouvre plus sur un simple bloc de texte suivi d'un lien vers le
formulaire, mais sur une **narration en quatre temps** : pourquoi ce mouvement existe (texte
existant, reformaté), ses valeurs (quatre cartes : Constance, Proximité, Service, Détermination —
qualités déjà revendiquées ailleurs sur le site, ici explicitées, aucune n'inventée), les citations,
les images, puis un appel final qui rappelle explicitement la distinction entre suivre le mouvement
et demander l'adhésion à ATL.

## 11. Couleurs

Palette strictement inchangée dans ses valeurs (`resources/css/app.css`, `@theme`) : bleu Congo
(`congo-950` → `congo-500`), or (`gold-100` → `gold-600`), encre quasi noire (`ink-900` → `ink-500`),
papier (`paper`, `paper-dim`). Le rouge d'accent existant reste réservé aux états fonctionnels
(erreurs), jamais utilisé comme couleur décorative. Aucune teinte n'a été ajoutée ; le travail de
cette phase a consisté à **mieux exploiter** cette palette (bandes alternées de la chronologie,
filigranes monochromes) plutôt qu'à l'élargir.

## 12. Typographie

Fraunces (serif d'affichage) et Instrument Sans (texte courant) sont conservées, avec une échelle
renforcée :

- `.h-signature` — très grands titres (Hero, devises), `clamp(2.75rem, 4.5vw + 1.25rem, 6rem)`.
- `.h-section` — titres de section, `clamp(1.75rem, 1.6vw + 1.25rem, 2.75rem)`.
- `.devise-mark` — italique d'affichage pour les citations et la devise.

Ces classes fluides évitent les sauts brusques entre points de rupture et remplacent les
combinaisons `text-3xl/4xl/5xl` répétées à la main sur les nouvelles sections.

## 13. Animations et transitions

Toutes discrètes, jamais gadget :

- **`reveal`** : apparition douce (fondu + léger déplacement vertical, 0,7 s) au passage dans le
  viewport, via `IntersectionObserver`. Par défaut (sans JS, ou navigateur trop ancien), tout est
  visible — rien n'est jamais caché sans qu'un script ne soit confirmé capable de le révéler
  ensuite (voir le choix d'implémentation détaillé en §14).
- **Compteurs animés** : décompte progressif avec easing, uniquement si `IntersectionObserver`
  existe et si `prefers-reduced-motion` n'est pas actif.
- **Écran d'introduction** : voir §4.
- **Micro-interactions existantes conservées** : zoom léger au survol des photos, transition du
  carrousel hero — inchangées dans leur mécanique, seulement enrichies visuellement.

Toutes respectent `prefers-reduced-motion` : la règle globale déjà présente
(`* { animation-duration: 0.01ms !important; ... }`) neutralise toute animation CSS, et chaque script
JS vérifie explicitement `window.matchMedia('(prefers-reduced-motion: reduce)')` avant de animer quoi
que ce soit.

## 14. Choix technique notable : robustesse du système « reveal »

Un premier jet posait la classe `reveal-ready` de façon synchrone dans le `<head>` (pour éviter un
flash), séparément du script qui révèle ensuite les éléments. En le revérifiant, ce découplage
faisait courir un risque réel : si le script principal (`app.js`) ne se chargeait pas (coupure
réseau, bloqueur de script), les éléments `.reveal` resteraient **invisibles indéfiniment**, sans
jamais recevoir la classe `is-visible`. Corrigé en déplaçant la pose de `reveal-ready` dans
`app.js` lui-même, juste avant la mise en place de l'observateur — masquage et révélation dépendent
désormais du même script, donc de la même condition de succès. Un léger flash de contenu déjà
visible avant masquage est un compromis largement préférable à un contenu qui ne s'affiche jamais.

## 15. Améliorations mobile et responsive

Aucune nouvelle grille à largeur fixe n'a été introduite. Tous les `grid-cols-12` ajoutés ou
modifiés conservent le préfixe `lg:` déjà en usage sur le reste du site (empilement vertical complet
en dessous du point de rupture `lg`, vérifié par relecture systématique de chaque fichier modifié).
Les filigranes, potentiellement plus larges que l'écran (jusqu'à 46rem), sont systématiquement
placés dans un conteneur `overflow-hidden` — vérifié un par un pour chaque section qui en utilise un
— ce qui exclut tout débordement horizontal par construction, quelle que soit la largeur de
viewport.

**Limite assumée** : l'outil de navigateur intégré à cet environnement de développement bloque les
captures d'écran et la lecture de console sur le domaine personnalisé `tlt.test`, derrière une carte
d'approbation manuelle que je ne peux pas m'accorder moi-même (limitation déjà rencontrée et
documentée lors des phases précédentes). **Aucune capture d'écran n'a donc pu être produite pour ce
rapport.** La vérification du rendu mobile/desktop repose sur une relecture rigoureuse du code
(classes responsives, conteneurs `overflow-hidden`, échelles `clamp()`) et sur des vérifications
HTTP réelles (curl, absence d'erreur serveur, présence des bonnes classes dans le HTML rendu sur
toutes les pages), pas sur une inspection visuelle directe. Ce point doit être considéré comme une
vérification partielle et être confirmé visuellement par un humain avant mise en production.

## 16. Performances

- Build de production (`npm run build`) exécuté après chaque étape : CSS ≈ 84 Ko (gzip ≈ 13,8 Ko),
  JS ≈ 4,3 Ko (gzip ≈ 1,5 Ko) — croissance marginale par rapport à l'état précédent (76 Ko / 3 Ko),
  malgré l'ajout de l'échelle typographique, des animations et de l'écran d'introduction.
- Les filigranes (`logo-mark-gold/ink`) sont servis en **WebP en priorité** (`<picture>` avec repli
  PNG), chargés en `loading="lazy"`, et réutilisés (même URL) sur toutes les pages qui les affichent
  — un seul téléchargement pour tout le site grâce au cache navigateur.
- Aucun script bloquant le rendu n'a été ajouté (le seul script inline dans le `<head>` ne fait que
  lire `sessionStorage`/`matchMedia`, quasi instantané).
- Le reveal au scroll et les compteurs animés reposent sur des transformations CSS (`opacity`,
  `transform`) plutôt que sur des propriétés qui déclenchent un recalcul de mise en page — aucun
  impact CLS (Cumulative Layout Shift) attendu, les éléments occupent leur espace normal dès le
  rendu, seule leur apparence visuelle change.
- **Compromis assumé** : l'écran d'introduction couvre le Hero pendant ~1,7 s à la première visite
  d'une session. Ce délai, choisi volontairement court (dans la fourchette demandée), peut légèrement
  retarder le moment où le plus grand élément visuellement peint (LCP) est perçu comme affiché — un
  compromis usuel pour ce type de signature de marque, qui reste largement dans les seuils
  considérés « bons » pour cette métrique.

## 17. Accessibilité et SEO — préservés

- JSON-LD (`Person` schema.org) toujours généré et valide sur l'accueil, vérifié dans le HTML rendu.
- Lien d'évitement (« Aller au contenu »), rôles ARIA de la navigation et du carrousel hero
  (`role="region"`, `aria-roledescription`, `role="tablist"`) inchangés.
- L'écran d'introduction est `aria-hidden="true"` avec `role="presentation"` : jamais annoncé par un
  lecteur d'écran, ne contient aucun élément focusable, ne perturbe donc jamais la navigation
  clavier ni l'ordre de tabulation (qui va directement du lien d'évitement à la navigation).
  Idem pour les filigranes (`alt=""`, `aria-hidden="true"`) et les halos décoratifs
  (`aria-hidden="true"`).
- Contrastes : aucune nouvelle combinaison de couleur/fond n'a été introduite — toutes les classes
  de texte sur fond sombre ou clair reprennent des combinaisons déjà utilisées ailleurs sur le site
  avant cette phase.
- `:focus-visible` (contour or) inchangé.

## 18. Fichiers modifiés

- **CSS** : `resources/css/app.css` (tokens typographiques, filigrane, reveal, écran d'introduction).
- **JS** : `resources/js/app.js` (introduction, reveal au scroll, compteurs animés).
- **Composants** : `resources/views/components/brand-watermark.blade.php` (nouveau),
  `resources/views/components/layout.blade.php` (écran d'introduction, script de détection).
- **Commande** : `app/Console/Commands/GenerateBrandAssets.php` (génération du filigrane gold/ink,
  PNG + WebP).
- **Provider** : `app/Providers/AppServiceProvider.php` (citation partagée avec le footer).
- **Contrôleur** : `app/Http/Controllers/HomeController.php` (chiffres réels, galerie réduite à 5).
- **Vues** : `home.blade.php`, `mouvement.blade.php` (réécrite), `atl/index.blade.php`,
  `chronologie/index.blade.php`, `partials/footer.blade.php`.
- **Assets générés** : `public/images/brand/logo-mark-gold.{png,webp}`,
  `public/images/brand/logo-mark-ink.{png,webp}` — dérivés non destructifs de
  `images/onnelacherien.jpeg`, original strictement inchangé (vérifié par horodatage de fichier).

## 19. Ce qui n'a pas été touché

Conformément à la consigne, aucune migration, aucun modèle, aucun contrôleur métier (hors calcul de
chiffres réels dans `HomeController`, strictement présentationnel), aucun formulaire, aucune route
d'administration, aucun gabarit admin (`resources/views/admin/*`, `components/admin-layout.blade.php`)
n'a été modifié. La suite de tests (96 tests, 271 assertions) a été exécutée après chaque étape
majeure et reste intégralement verte.
