Images et réserves
La photo dans sa cellule, et la réserve qui la remplace tant qu’elle manque.
La réserve
Une photo attendue a sa place avant d’exister. Le composant EmplacementPhoto vérifie à la construction si le fichier est dans public/assets/<dossier>/ : s’il y est, la photo s’affiche ; sinon, la réserve prend sa place et dit ce qu’elle attend.
- Emploi
- Toute photo d’équipe, de lieu, de réalisation ou éditoriale : le même composant pose la photo ou sa réserve.
- Moment
- Dès qu’une photo est prévue, même si personne ne l’a encore prise : la réserve sert de brief au photographe.
- Jamais
- Pour un dessin, une scène ou un logo : ils ont leurs composants. Jamais une image d’emprunt à la place.
<EmplacementPhoto dossier="realisations" fichier="exemple" ratio="16/10" variante="courte" brief="Le produit en service, chez le client." /> <EmplacementPhoto dossier="photos" fichier="interlocuteur" ratio="1/1" taille="1600 × 1600" brief="La personne qui suit un projet, en rendez-vous avec un client. Cadrage serré." /> Les props
| Prop | Rôle | Valeur |
|---|---|---|
| dossier | le sous-dossier de public/assets | equipe, lieux, photos (par défaut) ou realisations |
| fichier | le nom du fichier attendu, sans extension | celui de la notice DEPOSER-ICI.md du dossier |
| ratio | le ratio d’affichage | notation CSS : 16/10, 1/1, 4/5 ; posé en --r, affiché « 16:10 » dans la réserve |
| ratioMobile | le ratio sous 860 px | posé en --rm |
| brief | ce qu’il faut photographier | affiché dans la réserve seulement, jamais avec la photo |
| statut | l’état de la photo | « à produire » par défaut ; « à fournir » quand elle existe déjà ; « à obtenir » ou « après accord du client » sur les réalisations |
| taille | la taille attendue du fichier | texte libre, affiché après le format, variante normale seulement |
| cadrage | le point de cadrage | object-position ; center par défaut |
| alt | le texte de remplacement de la photo | vide par défaut : à renseigner dès que la photo a un sens |
| variante | la densité de la réserve | normale, courte (étiquette réduite), mini (l’icône seule) |
| priorite | la photo du premier écran | loading eager et fetchpriority high ; lazy sinon |
Ce que la réserve affiche
D’après le composant : une icône d’appareil photo, « Photo » suivi du statut, le format (et la taille en variante normale), puis le brief. Son commentaire décrit un gris chaud sous le papier millimétré et des traits de coupe aux quatre coins. Les variables existent (--photo et --papier à la racine, redéfinies sur la trame) et le bloc .ph de grinn.css les pose : fond papier sur --photo, gris chaud hors de la trame, vert pâle sur la trame depuis le 12 octobre, traits de coupe de 16 px aux quatre coins (10 px du bord), icône de 18 px, étiquette en capitales, format à droite, brief en bas ; la variante courte réduit tout (padding 12 px, icône 15 px, traits de 10 px), la variante mini ne garde que l’icône, centrée.
| Classe | Zone | Valeur |
|---|---|---|
| --photo | le fond des réserves | #ECEAE6, gris chaud, à la racine ; sur la trame (.tr), var(--color-grinn-pale), #F5FAF5, depuis le 12 octobre (les verts en relief ; #F2F0EC avant) |
| --papier | le papier millimétré | quatre dégradés : un pas de 24 px (--millim), un trait fort tous les quatre ; à l’encre à 6 % et 3 % à la racine, en vert profond à 9 % et 4,5 % sur la trame |
| .ph | la réserve | flex en colonne, espace entre haut et bas, aspect-ratio var(--r), padding clamp(16px,2vw,26px), fond var(--papier) sur var(--photo) ; sous 860 px, aspect-ratio var(--rm, var(--r)) |
| .ph::before | les traits de coupe | huit dégradés de 16 × 1 px et 1 × 16 px aux coins, à 10 px du bord, encre à 45 % |
| .ph--courte | la variante courte | padding 12 px, traits de 10 px à 6 px du bord, étiquette 10 px, icône 15 px, brief 13 px |
| .ph--mini | la variante mini | grille centrée sans padding, traits de 8 px, l’icône seule en ink-3 |
| .tr-cas__it .ph | dans une carte de réalisation | margin-top auto, padding-top 0 ; .tr-cas__photo : 8 px au-dessus |
| .tr-equipe__photo .ph | dans la grille équipe | hauteur 100 %, au ratio de la prop (16/10, 4/3 jusqu’à 860 px) ; dès 1000 px, aspect-ratio 2/1, toute la largeur, hauteur auto |
La photo quand elle existe
Déposer le fichier suffit : le composant le trouve au prochain build et remplace la réserve par une image. Rien d’autre à changer dans la page.
| Attribut | Zone | Valeur |
|---|---|---|
| class | l’image | ph ph--photo, plus la classe passée |
| src | le fichier | /assets/<dossier>/<fichier>.<ext> ; le premier trouvé dans l’ordre .avif, .webp, .jpg, .jpeg, .png (FORMATS, src/data/equipe.ts) |
| alt | le texte de remplacement | la prop alt |
| loading | le chargement | lazy ; eager avec priorite, et fetchpriority high |
| decoding | le décodage | async |
| style | le cadrage | --r (ratio), --rm (ratio mobile), object-position (cadrage) |
La photo réelle prend la classe .ph--photo : bloc sans padding, object-fit cover au ratio --r (--rm jusqu’à 860 px), object-position posé par le cadrage, fond var(--line) le temps du chargement, et var(--photo), le vert pâle, sur la trame. Dans la grille équipe, elle garde son ratio, et passe en 2/1 dès 1000 px. Dans une cellule photo (.tr-cel--photo), la règle lui donne la hauteur de sa cellule, 260 px au moins, et libère le ratio.
Où vont les photos
Deux places sur l’accueil, la photo d’équipe et une réserve de portrait dans le mur de citations, puis les preuves des pages d’offre, les lieux et les portraits des pages intérieures. Les cas, eux, se montrent par leurs captures, sur l’accueil aussi depuis le 13 octobre.
| Où | Appel | Format |
|---|---|---|
| La photo d’équipe | index.astro et a-propos.astro, dans la cellule .tr-equipe__photo de la grille équipe (fondu seul à l’apparition) ; carrieres.astro en 4/5 | déposée le 12 octobre (groupe.webp) ; 16/10, 4/3 jusqu’à 860 px ; original 3:2 en 3000 × 2000, cadré center 18 % sur l’accueil, center 28 % sur la page de l’équipe ; dès 1000 px, la cellule prend toute la largeur et la photo passe en 2/1 |
| Les réalisations | Cas.astro, une par carte des preuves d’une page d’offre, sous le titre et la phrase ; plus sur l’accueil depuis le 13 octobre, où la carte montre la vitrine du cas | 16/10, variante courte, statut « à obtenir », ou « après accord du client » pour le cas anonyme ; sans brief (la liste BRIEFS de l’accueil est retirée le 13 octobre) |
| Les captures des cas | Vitrine.astro : les cartes de cas de l’accueil (depuis le 13 octobre) et de la page Réalisations ; la tête, le point fort et le cas suivant d’une page de cas | pas des photos : des captures d’écran du produit, dans le cadre de leur support, sur la matière du client ; sans capture, la réserve de la vitrine, « Capture à fournir » (P.realisations.reserve), et non EmplacementPhoto. Voir Vitrine des cas |
| Le portrait du mur | Mur.astro, .tr-dire__photo, sans composant | rond de 32 px, bord tireté, fond --photo : une réserve, pas une photo |
| Les lieux et les portraits | a-propos.astro (les bureaux, dans une cellule photo ; six portraits en variante mini), contact.astro et carrieres.astro (un bureau par ville, en variante courte) | en réserve tant que les fichiers manquent : bureaux 4/5 (4/3 jusqu’à 860 px), un bureau 4/3 sur la page contact et 16/10 sur la page carrières, portraits 1/1 ; les notices DEPOSER-ICI.md des dossiers lieux et equipe donnent les noms de fichier |
<EmplacementPhoto dossier="equipe" fichier={PHOTO_GROUPE} ratio="16/10" ratioMobile="4/3" statut="à fournir"
taille="original 3:2, 3000 × 2000" cadrage="center 18%" alt="L’équipe Grinn, à Nantes"
brief="L’équipe entière, dans le passage vitré, en sweat marine : la photo de groupe de la série." /> Sur la trame, aucune règle ne pose de filtre, de voile ni de coin arrondi sur une photo : le voile du héros précédent n’y revient pas. Le seul rond est le portrait du mur, et c’est une réserve de 32 px. La vitrine des cas est à part : elle ne montre pas de photo, mais une matière sous un voile commun et des captures d’écran dans des cadres arrondis, avec leur ombre, des objets posés dans l’image.
Les illustrations ne sont pas des photos non plus, et ne passent pas par EmplacementPhoto : depuis le 13 octobre, des schémas vectoriels en SVG (public/assets/illustrations), posés par Scene en balise img, sans filtre ni multiply ; la section IA de l’accueil, la dernière à garder une scène peinte en vidéo, a reçu le sien le même jour. Quand un nom n’a ni SVG ni ancienne scène, ou que la section IA (appelée avec v2Seulement) n’a pas son SVG, Scene pose sa propre réserve, « Scène à produire » et le nom du fichier : voir Scènes.
Rien d’emprunté
Pas de banque d’images, pas de visage d’emprunt, pas de capture d’écran factice. Quand une photo manque, c’est la réserve qui le dit, avec son format et son brief.
Les notices le disent aussi : une photo chez un client ne se publie qu’avec son accord, et le portrait d’une personne citée qu’avec le sien. Les faux écrans du site précédent (le balisage .mk) ont été retirés le 16 septembre 2026 et le vérificateur refuse qu’ils reviennent.
RègleUne photo qui manque se marque en réserve, avec son format et son brief ; jamais une image d’emprunt à sa place.