title-02-condensed-overlay-stack

Cadre typographique condensé en overlay

Tenir une slide entière avec du TEXTE SEUL — aucun aplat, aucun trait, aucune boîte — en posant trois blocs sur la scène : un titre condensé noir à l'interligne écrasé, le numéro de section entre parenthèses au MÊME fer que lui mais à l'autre bout de la colonne, et un contrepoids en micro-capitales au coin diagonalement opposé. Le cadre est transparent : il se pose par-dessus des images sans rien leur enlever.

titleslideweb1600×900px21 benchmarks

Télécharger le .zip

Le fragment RÉEL, dans son propre document, sur le sol de sa charte — pas une image. Ce que vous voyez est exactement ce que vous collerez.

Employer quand

Ouverture de chapitre, slide de campagne ou hero plein écran dont le fond est une image (ou un aplat) : ce cadre est la couche de texte, il se superpose à layout-10-bleed-column-inset. Il vaut aussi seul, sur une slide de couleur, quand un chapitre doit s'annoncer sans décor.

Éviter quand

Le titre dépasse trois ou quatre mots, ou la slide porte déjà du corps de texte à lire : ce cadre suppose que le titre EST le contenu et que tout le reste est une marque de coin. Écarter aussi quand la charte n'a pas de grotesque condensée — à largeur normale, l'interligne écrasé fait se toucher les lettres au lieu des lignes, et le bloc devient illisible.

Notes

Ce pattern absorbe trois « patterns » que la spec de ref-10 listait séparément — le titre condensé écrasé, le numéro entre parenthèses, le bloc de micro-capitales — parce qu'aucun des trois ne porte de composition tout seul : un titre condensé tient dans sa propre phrase de description, et c'est leur DISPOSITION mutuelle qui fait la charte. Trois choses la portent, et deux ne se voient pas. (1) Le FER est unique : le numéro se cale au pixel sur le bord gauche du titre, à 40 % de hauteur en dessous. Décalé de quelques pixels — ce qui arrive dès qu'on lui donne son propre `left` — il ne se lit plus comme le pied de la même colonne mais comme un troisième bloc flottant, et rien ne casse pour le signaler. (2) Le numéro est en largeur NORMALE et en graisse moyenne alors que le titre est condensé noir : même condensé, il ferait un second titre, et la slide en aurait deux. C'est mesuré des deux côtés (`wdth 100` d'un côté, `wdth < 90` de l'autre), parce que c'est exactement le réglage qu'on perd en recopiant le bloc. (3) L'interligne du titre est sous 0,9 : c'est le serrage, pas le corps, qui fait tenir les deux lignes comme un pavé. Le contrepoids en micro-capitales occupe le coin diagonalement opposé — il n'est pas là pour être lu, il est là pour que le coin bas-droit ne soit pas vide ; sa largeur est bornée haut ET bas, car élargi il redevient un paragraphe. La racine est transparente, et c'est vérifié : ce cadre est la couche de TEXTE de la slide, il se superpose à layout-10-bleed-column-inset sans lui prendre une image. Le rouge n'est pas celui relevé sur la source (#E33A22, 3,57:1 sur la crème) : à ce niveau il aurait passé pour le titre de 104 px et échoué pour les micro-capitales de 13 px, qui sont écrites du MÊME rouge. Descendu à #C82C15, 4,57:1, et les deux benchmarks de contraste sont là pour que la correction ne se reperde pas.

Mots-clés

titrecondensécapitalesoverlaynumérosectionparenthèsesmicro-capscampagnechapitretypo

Benchmarks — la géométrie, en assertions vérifiables

Rejouables par node bin/check.mjs title-02-condensed-overlay-stack : le pattern se prouve, il ne se croit pas.

assertionmesureattendu
FER UNIQUE : le numéro tombe exactement sur le bord gauche du titreMath.abs(box('.vl-cos__num').left - box('.vl-cos__title').left) / W≤ 0.002
le fer vaut ≈ 8,6 % de la largeur de scènebox('.vl-cos__title').left / W0.0856 ± 0.006
interligne ÉCRASÉ : le titre passe sous 0,9 fois son corpsnum('.vl-cos__title','lineHeight') / num('.vl-cos__title','fontSize')≤ 0.9
le titre est bien MULTILIGNE : sa hauteur vaut au moins 1,6 corpsbox('.vl-cos__title').h / num('.vl-cos__title','fontSize')≥ 1.6
le titre ouvre la scène : il commence dans le premier cinquième de la hauteurbox('.vl-cos__title').top / H≤ 0.2
la colonne est TENDUE : le numéro est à plus d'un tiers de hauteur du titre(box('.vl-cos__num').top - box('.vl-cos__title').bottom) / H≥ 0.33
le numéro reste dans la scène, sans coller le bord bas(H - box('.vl-cos__num').bottom) / H≥ 0.04
le numéro est PLUS PETIT que le titre — un repère, pas un second titrenum('.vl-cos__num','fontSize') / num('.vl-cos__title','fontSize')0.55 → 0.85
le numéro n'est PAS condensé, contrairement au titrecs('.vl-cos__num','fontVariationSettings').includes('"wdth" 100') ? 1 : 01 ± 0
le titre EST condensé : largeur d'axe sous 90parseFloat((cs('.vl-cos__title','fontVariationSettings').match(/"wdth" ([\d.]+)/) || [0, 999])[1])≤ 90
le contrepoids est au coin OPPOSÉ en horizontale : au-delà des trois quartsbox('.vl-cos__note').left / W≥ 0.75
le contrepoids est au coin OPPOSÉ en verticale : sous le pied du titre(box('.vl-cos__note').top - box('.vl-cos__title').bottom) / H≥ 0.25
colonne ÉTROITE : le contrepoids tient dans ~10 % de la largeur de scènebox('.vl-cos__note').w / W0.06 → 0.14
le contrepoids court sur plusieurs lignes — c'est un bloc, pas une légendebox('.vl-cos__note').h / num('.vl-cos__note','fontSize')≥ 2.5
écart d'échelle d'au moins 7 entre le titre et le plus petit corpsnum('.vl-cos__title','fontSize') / num('.vl-cos__note','fontSize')≥ 7
aucun croisement : le titre s'arrête avant la colonne du contrepoids(box('.vl-cos__note').left - box('.vl-cos__title').right) / W≥ 0.02
le contrepoids ne déborde pas la scène par la droite(W - box('.vl-cos__note').right) / W≥ 0.02
le plus petit corps tient le plancher de contraste du texte courantcontrast('.vl-cos__note')≥ 4.5
le titre aussi — il n'est pas dispensé parce qu'il est groscontrast('.vl-cos__title')≥ 4.5
racine TRANSPARENTE : ce cadre se pose SUR une image, il n'en masque aucunecs('.vl-cos','backgroundColor') === 'rgba(0, 0, 0, 0)' ? 1 : 01 ± 0
scène au format 16:9 — c'est une slide, pas une vignetteW / H1.7778 ± 0.01

Le code

fragment — patterns/title-02-condensed-overlay-stack.html Télécharger
<!-- title-02-condensed-overlay-stack — le CADRE TYPOGRAPHIQUE d'une slide de campagne : trois
     blocs de texte, aucun aplat, aucun trait. La racine est TRANSPARENTE : ce cadre est fait
     pour se poser par-dessus un lit d'images (layout-10-bleed-column-inset) — lui donner un
     fond masquerait exactement ce qu'il est censé légender. Couleurs via --vl-* uniquement. -->
<div class="vl-cos">

  <!-- Le titre : condensé, noir, capitales, interligne ÉCRASÉ sous 1. Les deux lignes se
       touchent presque — c'est ce serrage, et non le corps, qui fait le bloc. -->
  <h2 class="vl-cos__title">Social<br>media</h2>

  <!-- Le numéro de section, au MÊME fer que le titre, à l'autre bout de la colonne. Largeur
       normale et graisse moyenne : condensé et noir comme le titre, il ferait un second titre
       au lieu d'un repère. Les parenthèses font partie du signe, elles ne l'entourent pas. -->
  <p class="vl-cos__num">(3)</p>

  <!-- Le contrepoids, au coin OPPOSÉ en diagonale : micro-capitales, colonne étroite, plusieurs
       lignes. Il n'a pas à être lu de loin — il a à occuper le coin que le titre laisse vide. -->
  <p class="vl-cos__note">Engaging content across platforms to drive sales</p>

</div>

<style>
/* Le cadre occupe la SCÈNE entière : ses trois blocs ne se mesurent que les uns par rapport
   aux autres et par rapport aux bords, jamais par rapport à une boîte intermédiaire. */
.vl-cos {
  position: relative;
  width: 1600px; height: 900px;
  color: var(--vl-red);
  font-family: Archivo, Inter, "Helvetica Neue", Arial, sans-serif;
  --vl-cos-fer: 8.56%;   /* le fer unique — titre ET numéro, jamais deux valeurs */
}
.vl-cos > * { position: absolute; margin: 0; }

.vl-cos__title {
  left: var(--vl-cos-fer); top: 11%;
  font-size: 104px; line-height: 0.84;
  font-weight: 900; font-variation-settings: 'wght' 900, 'wdth' 85;
  letter-spacing: -0.01em; text-transform: uppercase;
}

.vl-cos__num {
  left: var(--vl-cos-fer); top: 71%;
  font-size: 78px; line-height: 1;
  font-weight: 600; font-variation-settings: 'wght' 600, 'wdth' 100;
  letter-spacing: -0.01em;
}

/* Colonne étroite — ≈ 10 % de la scène, soit une trentaine de caractères. Élargie, elle
   redevient un paragraphe et cesse d'être une marque de coin. */
.vl-cos__note {
  left: 83%; top: 77%; width: 10.5%;
  font-size: 13px; line-height: 1.45;
  font-weight: 700; font-variation-settings: 'wght' 700, 'wdth' 100;
  letter-spacing: 0.02em; text-transform: uppercase;
}
/* Quand le coin tombe sur une image sombre, le contrepoids passe en blanc — c'est le SEUL
   écart de couleur du cadre, et il se décide sur l'image, pas sur la charte. */
.vl-cos__note--on-image { color: var(--vl-white); }
</style>
tokens de la charte — systems/ref-10-campaign-board-red.json Télécharger
:root {
  --vl-bg: #EDEAE3;
  --vl-board: #EDEAE3;
  --vl-slide: #EDEAE3;
  --vl-red: #C82C15;
  --vl-white: #FFFFFF;
  --vl-inset: 137px;
  --vl-gutter: 8px;
  --vl-rule: 2.5px;
  --vl-cow-white: #F2EFE7;
  --vl-cow-shade: #D8D1C1;
  --vl-cow-brown: #5A3520;
  --vl-cow-brown-hi: #8A5732;
  --vl-jkt-red: #C6281B;
  --vl-jkt-red-hi: #EC5233;
  --vl-jkt-red-lo: #8A150F;
  --vl-jkt-sky: #74A9D6;
  --vl-jkt-sky-lo: #A8C6DE;
  --vl-jkt-btn: #26100D;
  --vl-road-sky: #D2DEE6;
  --vl-road-tree: #2A4622;
  --vl-road-green: #5F8C46;
  --vl-road-green-lo: #3B5C2C;
  --vl-road-dirt: #C3A57E;
  --vl-road-dirt-hi: #DDC59F;
  --vl-road-rut: #A88964;
  --vl-road-figure: #201E1A;
  --vl-hand-bg: #D9DBD3;
  --vl-hand-bg-lo: #B4B8AE;
  --vl-glove: #F3F0E8;
  --vl-glove-hi: #FFFFFF;
  --vl-glove-sh: #CBC5B7;
  --vl-vial-glass: #DEE3E1;
  --vl-vial-cap: #131110;
  --vl-vial-drop: #6A6660;
  --vl-room-red: #CE2A1C;
  --vl-room-red-lo: #8E120C;
  --vl-room-fig: #6B0F0A;
  --vl-cact-bg: #B5AFA0;
  --vl-cact-bg-lo: #8E8A7C;
  --vl-cact-green: #6C8860;
  --vl-cact-green-hi: #95AC86;
  --vl-cact-green-lo: #3D5436;
  --vl-cact-spine: #D6402A;
  --vl-cact-spine-hi: #F2A794;
}
les métadonnées — patterns/title-02-condensed-overlay-stack.json (télécharger)
{
  "name": "Cadre typographique condensé en overlay",
  "family": "title",
  "ref": "ref-10-campaign-board-red",
  "intent": "Tenir une slide entière avec du TEXTE SEUL — aucun aplat, aucun trait, aucune boîte — en posant trois blocs sur la scène : un titre condensé noir à l'interligne écrasé, le numéro de section entre parenthèses au MÊME fer que lui mais à l'autre bout de la colonne, et un contrepoids en micro-capitales au coin diagonalement opposé. Le cadre est transparent : il se pose par-dessus des images sans rien leur enlever.",
  "when_to_use": "Ouverture de chapitre, slide de campagne ou hero plein écran dont le fond est une image (ou un aplat) : ce cadre est la couche de texte, il se superpose à layout-10-bleed-column-inset. Il vaut aussi seul, sur une slide de couleur, quand un chapitre doit s'annoncer sans décor.",
  "avoid_when": "Le titre dépasse trois ou quatre mots, ou la slide porte déjà du corps de texte à lire : ce cadre suppose que le titre EST le contenu et que tout le reste est une marque de coin. Écarter aussi quand la charte n'a pas de grotesque condensée — à largeur normale, l'interligne écrasé fait se toucher les lettres au lieu des lignes, et le bloc devient illisible.",
  "media": [
    "slide",
    "web"
  ],
  "tags": [
    "titre",
    "condensé",
    "capitales",
    "overlay",
    "numéro",
    "section",
    "parenthèses",
    "micro-caps",
    "campagne",
    "chapitre",
    "typo"
  ],
  "vars": [
    {
      "name": "--vl-red",
      "role": "couleur de l'ensemble du cadre — titre, numéro et contrepoids partagent la même",
      "default": "#C82C15"
    },
    {
      "name": "--vl-white",
      "role": "couleur de repli du contrepoids quand son coin tombe sur une image sombre (modificateur --on-image)",
      "default": "#FFFFFF"
    },
    {
      "name": "--vl-cos-fer",
      "role": "le fer unique de la colonne de gauche — titre ET numéro, jamais deux valeurs",
      "default": "8.56%"
    }
  ],
  "slots": [
    "title",
    "num",
    "note"
  ],
  "geometry": {
    "root": ".vl-cos",
    "frame": [
      1600,
      900
    ],
    "ratios": {
      "fer_over_frame": 0.0856,
      "title_size_over_frame": 0.065,
      "num_size_over_frame": 0.04875,
      "note_size_over_frame": 0.008125,
      "note_width_over_frame": 0.105,
      "title_over_note_size": 8
    },
    "type_px": {
      "title": 104,
      "num": 78,
      "note": 13
    },
    "pad_ratio": {
      "top": 0,
      "x": 0,
      "bottom": 0
    }
  },
  "benchmarks": [
    {
      "name": "FER UNIQUE : le numéro tombe exactement sur le bord gauche du titre",
      "measure": "Math.abs(box('.vl-cos__num').left - box('.vl-cos__title').left) / W",
      "max": 0.002
    },
    {
      "name": "le fer vaut ≈ 8,6 % de la largeur de scène",
      "measure": "box('.vl-cos__title').left / W",
      "expect": 0.0856,
      "tol": 0.006
    },
    {
      "name": "interligne ÉCRASÉ : le titre passe sous 0,9 fois son corps",
      "measure": "num('.vl-cos__title','lineHeight') / num('.vl-cos__title','fontSize')",
      "max": 0.9
    },
    {
      "name": "le titre est bien MULTILIGNE : sa hauteur vaut au moins 1,6 corps",
      "measure": "box('.vl-cos__title').h / num('.vl-cos__title','fontSize')",
      "min": 1.6
    },
    {
      "name": "le titre ouvre la scène : il commence dans le premier cinquième de la hauteur",
      "measure": "box('.vl-cos__title').top / H",
      "max": 0.2
    },
    {
      "name": "la colonne est TENDUE : le numéro est à plus d'un tiers de hauteur du titre",
      "measure": "(box('.vl-cos__num').top - box('.vl-cos__title').bottom) / H",
      "min": 0.33
    },
    {
      "name": "le numéro reste dans la scène, sans coller le bord bas",
      "measure": "(H - box('.vl-cos__num').bottom) / H",
      "min": 0.04
    },
    {
      "name": "le numéro est PLUS PETIT que le titre — un repère, pas un second titre",
      "measure": "num('.vl-cos__num','fontSize') / num('.vl-cos__title','fontSize')",
      "min": 0.55,
      "max": 0.85
    },
    {
      "name": "le numéro n'est PAS condensé, contrairement au titre",
      "measure": "cs('.vl-cos__num','fontVariationSettings').includes('\"wdth\" 100') ? 1 : 0",
      "expect": 1,
      "tol": 0
    },
    {
      "name": "le titre EST condensé : largeur d'axe sous 90",
      "measure": "parseFloat((cs('.vl-cos__title','fontVariationSettings').match(/\"wdth\" ([\\d.]+)/) || [0, 999])[1])",
      "max": 90
    },
    {
      "name": "le contrepoids est au coin OPPOSÉ en horizontale : au-delà des trois quarts",
      "measure": "box('.vl-cos__note').left / W",
      "min": 0.75
    },
    {
      "name": "le contrepoids est au coin OPPOSÉ en verticale : sous le pied du titre",
      "measure": "(box('.vl-cos__note').top - box('.vl-cos__title').bottom) / H",
      "min": 0.25
    },
    {
      "name": "colonne ÉTROITE : le contrepoids tient dans ~10 % de la largeur de scène",
      "measure": "box('.vl-cos__note').w / W",
      "min": 0.06,
      "max": 0.14
    },
    {
      "name": "le contrepoids court sur plusieurs lignes — c'est un bloc, pas une légende",
      "measure": "box('.vl-cos__note').h / num('.vl-cos__note','fontSize')",
      "min": 2.5
    },
    {
      "name": "écart d'échelle d'au moins 7 entre le titre et le plus petit corps",
      "measure": "num('.vl-cos__title','fontSize') / num('.vl-cos__note','fontSize')",
      "min": 7
    },
    {
      "name": "aucun croisement : le titre s'arrête avant la colonne du contrepoids",
      "measure": "(box('.vl-cos__note').left - box('.vl-cos__title').right) / W",
      "min": 0.02
    },
    {
      "name": "le contrepoids ne déborde pas la scène par la droite",
      "measure": "(W - box('.vl-cos__note').right) / W",
      "min": 0.02
    },
    {
      "name": "le plus petit corps tient le plancher de contraste du texte courant",
      "measure": "contrast('.vl-cos__note')",
      "min": 4.5
    },
    {
      "name": "le titre aussi — il n'est pas dispensé parce qu'il est gros",
      "measure": "contrast('.vl-cos__title')",
      "min": 4.5
    },
    {
      "name": "racine TRANSPARENTE : ce cadre se pose SUR une image, il n'en masque aucune",
      "measure": "cs('.vl-cos','backgroundColor') === 'rgba(0, 0, 0, 0)' ? 1 : 0",
      "expect": 1,
      "tol": 0
    },
    {
      "name": "scène au format 16:9 — c'est une slide, pas une vignette",
      "measure": "W / H",
      "expect": 1.7778,
      "tol": 0.01
    }
  ],
  "notes": "Ce pattern absorbe trois « patterns » que la spec de ref-10 listait séparément — le titre condensé écrasé, le numéro entre parenthèses, le bloc de micro-capitales — parce qu'aucun des trois ne porte de composition tout seul : un titre condensé tient dans sa propre phrase de description, et c'est leur DISPOSITION mutuelle qui fait la charte. Trois choses la portent, et deux ne se voient pas. (1) Le FER est unique : le numéro se cale au pixel sur le bord gauche du titre, à 40 % de hauteur en dessous. Décalé de quelques pixels — ce qui arrive dès qu'on lui donne son propre `left` — il ne se lit plus comme le pied de la même colonne mais comme un troisième bloc flottant, et rien ne casse pour le signaler. (2) Le numéro est en largeur NORMALE et en graisse moyenne alors que le titre est condensé noir : même condensé, il ferait un second titre, et la slide en aurait deux. C'est mesuré des deux côtés (`wdth 100` d'un côté, `wdth < 90` de l'autre), parce que c'est exactement le réglage qu'on perd en recopiant le bloc. (3) L'interligne du titre est sous 0,9 : c'est le serrage, pas le corps, qui fait tenir les deux lignes comme un pavé. Le contrepoids en micro-capitales occupe le coin diagonalement opposé — il n'est pas là pour être lu, il est là pour que le coin bas-droit ne soit pas vide ; sa largeur est bornée haut ET bas, car élargi il redevient un paragraphe. La racine est transparente, et c'est vérifié : ce cadre est la couche de TEXTE de la slide, il se superpose à layout-10-bleed-column-inset sans lui prendre une image. Le rouge n'est pas celui relevé sur la source (#E33A22, 3,57:1 sur la crème) : à ce niveau il aurait passé pour le titre de 104 px et échoué pour les micro-capitales de 13 px, qui sont écrites du MÊME rouge. Descendu à #C82C15, 4,57:1, et les deux benchmarks de contraste sont là pour que la correction ne se reperde pas.",
  "id": "title-02-condensed-overlay-stack"
}

À côté