card-01-ghost-icon
card-03-stat-accent
Vignette statistique sur accent
Faire porter UN chiffre par un aplat d'accent chanfreiné, avec son cadrage (micro-libellé au-dessus) et son commentaire (corps collé en bas), de façon à ce que le chiffre se lise avant le texte.
cardslidesocialweb430×340px12 benchmarks
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
Preuve chiffrée d'une slide : croissance, volume livré, part de marché. Une seule par slide, posée en tête de rangée ou en recouvrement du bas d'une photo pour ancrer l'accent.
Éviter quand
Le chiffre a besoin d'être comparé à d'autres (il faut un graphique), il n'y a pas de commentaire à mettre (la vignette se vide et le chanfrein devient un ornement seul), ou le texte descend sous 16 px — sur cet orange le contraste ne tient plus (3,4:1, valable seulement en grand corps).
Notes
Le vide entre le chiffre et le corps est une DÉCISION, pas un manque : il sépare la donnée de son commentaire. C'est la seule vignette du système où la règle « remplis l'espace » ne s'applique pas telle quelle — mais elle est bornée par benchmark (le corps démarre entre 50 % et 85 % de la hauteur), sinon on retombe sur un bloc qui flotte au milieu. Le corps n'est jamais en blanc pur : un blanc pur à 17 px rivalise avec le chiffre à 64 px et la hiérarchie tombe. Sur l'orange #F2551E, le blanc plafonne à 3,4:1 — donc grand corps seulement, jamais de 11 px. Le benchmark de contraste du CORPS a été ajouté après coup : le harnais HTML ne testait que le chiffre, et c'est l'audit .pptx du kit qui a attrapé le corps à 2,77:1. Quand un contrôle attrape ce que l'autre laisse passer, l'assertion manquante se pose des DEUX côtés.
Mots-clés
Benchmarks — la géométrie, en assertions vérifiables
Rejouables par node bin/check.mjs card-03-stat-accent : le pattern se prouve, il ne se croit pas.
| assertion | mesure | attendu |
|---|---|---|
| chanfrein ≈ 7,5 % de la largeur | notch('.vl-stat') / W | 0.075 ± 0.015 |
| chanfrein sur le coin BAS-droit (l'orientation marque le premier rang) | notchCorner('.vl-stat') === 'br' ? 1 : 0 | 1 |
| marge intérieure gauche ≈ 8 % de la largeur | num('.vl-stat','paddingLeft') / W | 0.08 ± 0.02 |
| saut typographique chiffre / micro-libellé ≥ 4,5 | num('.vl-stat__figure','fontSize') / num('.vl-stat__kicker','fontSize') | ≥ 4.5 |
| le corps est bien en bas (haut du bloc entre 50 % et 85 % de la hauteur) | box('.vl-stat__body').top / H | 0.5 → 0.85 |
| aucun débordement du corps sous la marge basse | H - num('.vl-stat','paddingBottom') - box('.vl-stat__body').bottom | ≥ -1 |
| le corps s'arrête AVANT le chanfrein (il ne rentre pas dans la coupe) | W - num('.vl-stat','paddingRight') - box('.vl-stat__body').right | ≥ -1 |
| glyphe calé dans le coin haut-droit (≤ 12 % du bord) | (W - box('.vl-stat__arrow').right) / W | ≤ 0.12 |
| contraste du chiffre ≥ 3 (grand corps, seuil WCAG large text) | contrast('.vl-stat__figure') | ≥ 3 |
| corps ≥ 16 px — en dessous, 3,4:1 sur cet orange n'est plus lisible | num('.vl-stat__body','fontSize') | ≥ 16 |
| mesure de garde : le corps ne dépasse pas 34 caractères de large | box('.vl-stat__body').w / num('.vl-stat__body','fontSize') | ≤ 19 |
| contraste du corps ≥ 3 (l'aplat d'accent ne pardonne rien en dessous) | contrast('.vl-stat__body') | ≥ 3 |
Le code
patterns/card-03-stat-accent.html
Télécharger<!-- card-03-stat-accent — vignette statistique sur aplat d'accent, coin chanfreiné.
Couleurs via --vl-* uniquement. Quatre zones dans un ordre FIXE : micro-libellé, chiffre,
glyphe de coin, puis le corps collé en bas. -->
<div class="vl-stat">
<div class="vl-stat__head">
<div>
<p class="vl-stat__kicker">Potential</p>
<span class="vl-stat__figure">156%</span>
</div>
<span class="vl-stat__arrow">↗</span>
</div>
<p class="vl-stat__body">Compound growth of the addressable segment over the last four
reported years.</p>
</div>
<style>
.vl-stat {
--vl-nc-size: var(--vl-notch, 32px);
width: 430px; height: 340px;
padding: 32px 34px 36px;
background: var(--vl-orange); color: var(--vl-white);
display: flex; flex-direction: column;
clip-path: polygon(0 0, 100% 0, 100% calc(100% - var(--vl-nc-size)), calc(100% - var(--vl-nc-size)) 100%, 0 100%);
}
.vl-stat__head { display: flex; align-items: flex-start; }
.vl-stat__kicker {
margin: 0 0 16px; font-size: 12px; line-height: 1.4; font-weight: 700;
letter-spacing: 0.14em; text-transform: uppercase; opacity: .85;
}
/* Le chiffre est ~5× le micro-libellé : c'est ce SAUT, et l'absence de taille intermédiaire,
qui fait lire la vignette d'un coup d'œil. Rapprocher les deux corps la rend bavarde. */
.vl-stat__figure { font-size: 64px; line-height: 1; font-weight: 800; letter-spacing: -0.02em; }
.vl-stat__arrow { margin-left: auto; font-size: 34px; line-height: 1; }
/* Collé en bas (`margin-top:auto`) : le vide entre le chiffre et le corps est ASSUMÉ, il
sépare la donnée de son commentaire. Centrer le bloc à la place ne remplirait rien — ça
couperait le vide en deux et le ferait lire comme un oubli. */
.vl-stat__body {
margin: auto 0 0; max-width: 32ch;
font-size: 17px; line-height: 1.55; color: var(--vl-ink-muted-invert);
}
</style>
systems/ref-06-orange-notched.json
Télécharger:root {
--vl-bg: #F0EFEC;
--vl-board: #DEDDD9;
--vl-white: #FFFFFF;
--vl-black: #141414;
--vl-orange: #F2551E;
--vl-steel: #C6D0CF;
--vl-ink-muted: #6A6A67;
--vl-ink-muted-invert: #FFF1E9;
--vl-ink-on-steel: #3E4746;
--vl-hairline: #00000015;
--vl-ph-a: #C9C9C9;
--vl-ph-b: #4C4C4C;
--vl-ph-dark-a: #6A6A6A;
--vl-ph-dark-b: #141414;
--vl-notch: 34px;
--vl-margin: 60px;
}
les métadonnées — patterns/card-03-stat-accent.json (télécharger)
{
"name": "Vignette statistique sur accent",
"family": "card",
"ref": "ref-06-orange-notched",
"intent": "Faire porter UN chiffre par un aplat d'accent chanfreiné, avec son cadrage (micro-libellé au-dessus) et son commentaire (corps collé en bas), de façon à ce que le chiffre se lise avant le texte.",
"when_to_use": "Preuve chiffrée d'une slide : croissance, volume livré, part de marché. Une seule par slide, posée en tête de rangée ou en recouvrement du bas d'une photo pour ancrer l'accent.",
"avoid_when": "Le chiffre a besoin d'être comparé à d'autres (il faut un graphique), il n'y a pas de commentaire à mettre (la vignette se vide et le chanfrein devient un ornement seul), ou le texte descend sous 16 px — sur cet orange le contraste ne tient plus (3,4:1, valable seulement en grand corps).",
"tags": [
"stat",
"chiffre",
"kpi",
"vignette",
"carte",
"accent",
"chanfrein",
"notch",
"flèche",
"deck",
"preuve"
],
"vars": [
{
"name": "--vl-orange",
"role": "aplat d'accent porteur",
"default": "#F2551E"
},
{
"name": "--vl-white",
"role": "chiffre et glyphe",
"default": "#FFFFFF"
},
{
"name": "--vl-ink-muted-invert",
"role": "corps sur l'aplat (jamais du blanc pur, mais pas plus sombre que 3:1 non plus)",
"default": "#FFF1E9"
},
{
"name": "--vl-notch",
"role": "longueur du chanfrein",
"default": "32px"
}
],
"slots": [
"kicker",
"figure",
"arrow",
"body"
],
"geometry": {
"root": ".vl-stat",
"frame": [
430,
340
],
"ratios": {
"pad_x_over_width": 0.079,
"notch_over_width": 0.074,
"figure_over_kicker": 5.33,
"body_top_over_height": 0.66
},
"type_px": {
"kicker": 12,
"figure": 64,
"body": 17,
"arrow": 34
},
"pad_ratio": {
"top": 0.074,
"x": 0.079,
"bottom": 0.084
}
},
"benchmarks": [
{
"name": "chanfrein ≈ 7,5 % de la largeur",
"measure": "notch('.vl-stat') / W",
"expect": 0.075,
"tol": 0.015
},
{
"name": "chanfrein sur le coin BAS-droit (l'orientation marque le premier rang)",
"measure": "notchCorner('.vl-stat') === 'br' ? 1 : 0",
"expect": 1
},
{
"name": "marge intérieure gauche ≈ 8 % de la largeur",
"measure": "num('.vl-stat','paddingLeft') / W",
"expect": 0.08,
"tol": 0.02
},
{
"name": "saut typographique chiffre / micro-libellé ≥ 4,5",
"measure": "num('.vl-stat__figure','fontSize') / num('.vl-stat__kicker','fontSize')",
"min": 4.5
},
{
"name": "le corps est bien en bas (haut du bloc entre 50 % et 85 % de la hauteur)",
"measure": "box('.vl-stat__body').top / H",
"min": 0.5,
"max": 0.85
},
{
"name": "aucun débordement du corps sous la marge basse",
"measure": "H - num('.vl-stat','paddingBottom') - box('.vl-stat__body').bottom",
"min": -1
},
{
"name": "le corps s'arrête AVANT le chanfrein (il ne rentre pas dans la coupe)",
"measure": "W - num('.vl-stat','paddingRight') - box('.vl-stat__body').right",
"min": -1
},
{
"name": "glyphe calé dans le coin haut-droit (≤ 12 % du bord)",
"measure": "(W - box('.vl-stat__arrow').right) / W",
"max": 0.12
},
{
"name": "contraste du chiffre ≥ 3 (grand corps, seuil WCAG large text)",
"measure": "contrast('.vl-stat__figure')",
"min": 3
},
{
"name": "corps ≥ 16 px — en dessous, 3,4:1 sur cet orange n'est plus lisible",
"measure": "num('.vl-stat__body','fontSize')",
"min": 16
},
{
"name": "mesure de garde : le corps ne dépasse pas 34 caractères de large",
"measure": "box('.vl-stat__body').w / num('.vl-stat__body','fontSize')",
"max": 19
},
{
"name": "contraste du corps ≥ 3 (l'aplat d'accent ne pardonne rien en dessous)",
"measure": "contrast('.vl-stat__body')",
"min": 3
}
],
"pptx": {
"primitive": "notched_rect",
"emitter": "kit/vl_pptx.py:stat_block",
"pattern": "card-03-stat-accent"
},
"notes": "Le vide entre le chiffre et le corps est une DÉCISION, pas un manque : il sépare la donnée de son commentaire. C'est la seule vignette du système où la règle « remplis l'espace » ne s'applique pas telle quelle — mais elle est bornée par benchmark (le corps démarre entre 50 % et 85 % de la hauteur), sinon on retombe sur un bloc qui flotte au milieu. Le corps n'est jamais en blanc pur : un blanc pur à 17 px rivalise avec le chiffre à 64 px et la hiérarchie tombe. Sur l'orange #F2551E, le blanc plafonne à 3,4:1 — donc grand corps seulement, jamais de 11 px. Le benchmark de contraste du CORPS a été ajouté après coup : le harnais HTML ne testait que le chiffre, et c'est l'audit .pptx du kit qui a attrapé le corps à 2,77:1. Quand un contrôle attrape ce que l'autre laisse passer, l'assertion manquante se pose des DEUX côtés.",
"media": [
"slide",
"social",
"web"
],
"id": "card-03-stat-accent"
}
À côté
card-02-notched-brief
Carte chanfreinée de second rang
card-04-stat-barchart
Carte statistique à barres empilées
card-05-balance-gauge
Carte solde à jauge compteur
card-06-forecast-timeline
Carte prévision — timeline + sous-cartes
card-07-transactions