card-04-stat-barchart

Carte statistique à barres empilées

Porter UN KPI de premier rang (un total et sa tendance) sur un aplat noir, en-tête calé en haut et chiffre + mini-histogramme collés en bas, de façon à ce que le nombre se lise avant tout.

cardslideweb776×330px10 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

Carte d'accroche d'un dashboard ou d'une slide produit : le chiffre du mois et sa décomposition sur deux à quatre périodes. L'aplat noir la pose en premier rang face aux cartes blanches autour.

Éviter quand

Il faut comparer des valeurs précises entre séries (le sommet arrondi et l'absence d'axe faussent la lecture fine — passer à un vrai graphique gradué), ou il n'y a pas de tendance à montrer : sans les barres, la carte n'est plus qu'un chiffre isolé.

Notes

Deux zones tenues aux deux bords par margin-top:auto : l'en-tête en haut, le couple chiffre+barres en bas. C'est ce collage qui fait lire le total avant le reste et qui aligne le pied des barres sur le pied du nombre (benchmark dédié). Règle de couleur de la référence : la menthe code la part principale, le lilas la part de second temps — jamais l'inverse, sinon l'accent ne désigne plus rien. Le sommet arrondi des barres est un parti pris de lecture rapide, pas de mesure : il interdit la comparaison fine, d'où l'avertissement avoid_when.

Mots-clés

cartestatkpihistogrammebarresempiledashboardnoirpremier-rangmenthelilas

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

Rejouables par node bin/check.mjs card-04-stat-barchart : le pattern se prouve, il ne se croit pas.

assertionmesureattendu
marges intérieures ≈ 5,4 % de la largeurnum('.vl-sales','paddingLeft') / W0.054 ± 0.02
en-tête calé en haut (< 12 % de la hauteur)box('.vl-sales__head').top / H≤ 0.12
chiffre héros collé en bas (haut du nombre au-delà de 60 % de la hauteur)box('.vl-sales__num').top / H≥ 0.6
le chiffre héros appartient à l'échelle display : ≥ 40 pxnum('.vl-sales__num','fontSize')≥ 40
hiérarchie : le chiffre est au moins 2× le titrenum('.vl-sales__num','fontSize') / num('.vl-sales__title','fontSize')≥ 2
la barre Novembre domine Septembre (la tendance se voit sans lire)box('.vl-bars__grp:last-child .vl-bars__stack').h - box('.vl-bars__grp:first-child .vl-bars__stack').h≥ 20
dans chaque barre la MENTHE (rang 1) l'emporte sur le LILAS (rang 2)box('.vl-bars__grp:last-child .vl-bars__mint').h - box('.vl-bars__grp:last-child .vl-bars__lilac').h≥ 1
bas des barres alignés sur le bas du chiffre (± 4 px)Math.abs(box('.vl-bars').bottom - box('.vl-sales__num').bottom)≤ 4
contraste du titre blanc sur noir ≥ 7 (il porte le nom de la carte)contrast('.vl-sales__title')≥ 7
aucun débordement du contenu hors de la carteoverflow('.vl-sales')≤ 0

Le code

fragment — patterns/card-04-stat-barchart.html Télécharger
<!-- card-04-stat-barchart — fragment autonome. Couleurs via --vl-* uniquement, aucune valeur en dur. -->
<div class="vl-sales">
  <div class="vl-sales__head">
    <div>
      <h2 class="vl-sales__title">Sales statistics</h2>
      <p class="vl-sales__sub">Updated 1 days ago</p>
    </div>
    <span class="vl-sales__pill">Monthly
      <svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"/></svg>
    </span>
  </div>
  <div class="vl-sales__foot">
    <div>
      <span class="vl-sales__kicker">Visitors
        <svg viewBox="0 0 24 24" width="11" height="11" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:-1px"><path d="M7 17L17 7M8 7h9v9"/></svg>
      </span>
      <div class="vl-sales__num">2,025</div>
    </div>
    <div class="vl-bars">
      <div class="vl-bars__grp">
        <div class="vl-bars__stack">
          <div class="vl-bars__mint"  style="height:52px"></div>
          <div class="vl-bars__lilac" style="height:38px"></div>
        </div>
        <span class="vl-bars__lab">September</span>
      </div>
      <div class="vl-bars__grp">
        <div class="vl-bars__stack">
          <div class="vl-bars__mint"  style="height:96px"></div>
          <div class="vl-bars__lilac" style="height:34px"></div>
        </div>
        <span class="vl-bars__lab">November</span>
      </div>
    </div>
  </div>
</div>

<style>
/* Carte statistique de premier rang : aplat noir, en-tête haut / KPI + histogramme bas,
   collés par margin-top:auto. Les barres empilent MENTHE (part principale) sur LILAS
   (part de second temps) — la couleur y encode le rang, pas la décoration. */
.vl-sales {
  width: 776px; height: 330px;
  background: var(--vl-surface-dark); color: var(--vl-ink-invert);
  border-radius: var(--vl-radius-card); padding: 30px;
  display: flex; flex-direction: column;
  font-family: Inter, -apple-system, "Helvetica Neue", Arial, sans-serif;
}
.vl-sales__head { display: flex; justify-content: space-between; align-items: flex-start; }
.vl-sales__title { margin: 0; font-size: 18px; font-weight: 600; letter-spacing: -0.01em; }
.vl-sales__sub { margin: 2px 0 0; font-size: 11px; font-weight: 500; color: var(--vl-ink-invert-muted); }
.vl-sales__pill {
  display: inline-flex; align-items: center; gap: 8px; padding: 9px 16px; border-radius: 999px;
  border: 1px solid var(--vl-hairline-invert); font-size: 12px; font-weight: 500; color: inherit;
}
.vl-sales__foot { margin-top: auto; display: flex; justify-content: space-between; align-items: flex-end; }
.vl-sales__kicker { font-size: 11px; font-weight: 500; color: var(--vl-ink-invert-muted); }
.vl-sales__num { margin-top: 8px; font-size: 46px; font-weight: 700; line-height: 1; letter-spacing: -0.02em; color: var(--vl-ink-invert); }
.vl-bars { display: flex; align-items: flex-end; gap: 22px; }
.vl-bars__grp { display: flex; flex-direction: column; align-items: center; gap: 12px; }
.vl-bars__stack { width: 58px; display: flex; flex-direction: column; gap: 5px; }
.vl-bars__mint  { background: var(--vl-mint);  border-radius: 12px; }
.vl-bars__lilac { background: var(--vl-lilac); border-radius: 12px; }
.vl-bars__lab { font-size: 11px; font-weight: 500; color: var(--vl-ink-invert-muted); }
</style>
tokens de la charte — systems/ref-11-finance-dashboard-mint.json Télécharger
:root {
  --vl-bg: #E6EAE4;
  --vl-board: #E6EAE4;
  --vl-surface-light: #FFFFFF;
  --vl-surface-soft: #F1F2EF;
  --vl-surface-dark: #141414;
  --vl-mint: #B4E3A0;
  --vl-mint-deep: #8FCE72;
  --vl-lilac: #B6ABE6;
  --vl-lilac-deep: #9A8ADE;
  --vl-ink: #181A17;
  --vl-ink-muted: #7C817A;
  --vl-ink-on-mint: #3D5A30;
  --vl-ink-on-lilac: #3E3270;
  --vl-ink-invert: #FFFFFF;
  --vl-ink-invert-muted: #9CA09A;
  --vl-hairline: #E3E5E1;
  --vl-hairline-invert: #333333;
  --vl-radius-card: 26px;
  --vl-radius-sub: 20px;
  --vl-radius-chip: 14px;
  --vl-gap: 20px;
}
les métadonnées — patterns/card-04-stat-barchart.json (télécharger)
{
  "name": "Carte statistique à barres empilées",
  "family": "card",
  "ref": "ref-11-finance-dashboard-mint",
  "intent": "Porter UN KPI de premier rang (un total et sa tendance) sur un aplat noir, en-tête calé en haut et chiffre + mini-histogramme collés en bas, de façon à ce que le nombre se lise avant tout.",
  "when_to_use": "Carte d'accroche d'un dashboard ou d'une slide produit : le chiffre du mois et sa décomposition sur deux à quatre périodes. L'aplat noir la pose en premier rang face aux cartes blanches autour.",
  "avoid_when": "Il faut comparer des valeurs précises entre séries (le sommet arrondi et l'absence d'axe faussent la lecture fine — passer à un vrai graphique gradué), ou il n'y a pas de tendance à montrer : sans les barres, la carte n'est plus qu'un chiffre isolé.",
  "tags": [
    "carte",
    "stat",
    "kpi",
    "histogramme",
    "barres",
    "empile",
    "dashboard",
    "noir",
    "premier-rang",
    "menthe",
    "lilas"
  ],
  "vars": [
    {
      "name": "--vl-surface-dark",
      "role": "aplat de la carte de premier rang",
      "default": "#141414"
    },
    {
      "name": "--vl-mint",
      "role": "part principale de la barre (rang 1)",
      "default": "#B4E3A0"
    },
    {
      "name": "--vl-lilac",
      "role": "part de second temps de la barre (rang 2)",
      "default": "#B6ABE6"
    },
    {
      "name": "--vl-radius-card",
      "role": "rayon de la carte",
      "default": "26px"
    }
  ],
  "slots": [
    "title",
    "kicker",
    "figure",
    "bars"
  ],
  "geometry": {
    "root": ".vl-sales",
    "frame": [
      776,
      330
    ],
    "ratios": {
      "pad_over_width": 0.054,
      "figure_top_over_height": 0.72
    },
    "type_px": {
      "title": 18,
      "figure": 46,
      "label": 11
    },
    "pad_ratio": {
      "top": 0.091,
      "x": 0.054,
      "bottom": 0.091
    }
  },
  "benchmarks": [
    {
      "name": "marges intérieures ≈ 5,4 % de la largeur",
      "measure": "num('.vl-sales','paddingLeft') / W",
      "expect": 0.054,
      "tol": 0.02
    },
    {
      "name": "en-tête calé en haut (< 12 % de la hauteur)",
      "measure": "box('.vl-sales__head').top / H",
      "max": 0.12
    },
    {
      "name": "chiffre héros collé en bas (haut du nombre au-delà de 60 % de la hauteur)",
      "measure": "box('.vl-sales__num').top / H",
      "min": 0.6
    },
    {
      "name": "le chiffre héros appartient à l'échelle display : ≥ 40 px",
      "measure": "num('.vl-sales__num','fontSize')",
      "min": 40
    },
    {
      "name": "hiérarchie : le chiffre est au moins 2× le titre",
      "measure": "num('.vl-sales__num','fontSize') / num('.vl-sales__title','fontSize')",
      "min": 2
    },
    {
      "name": "la barre Novembre domine Septembre (la tendance se voit sans lire)",
      "measure": "box('.vl-bars__grp:last-child .vl-bars__stack').h - box('.vl-bars__grp:first-child .vl-bars__stack').h",
      "min": 20
    },
    {
      "name": "dans chaque barre la MENTHE (rang 1) l'emporte sur le LILAS (rang 2)",
      "measure": "box('.vl-bars__grp:last-child .vl-bars__mint').h - box('.vl-bars__grp:last-child .vl-bars__lilac').h",
      "min": 1
    },
    {
      "name": "bas des barres alignés sur le bas du chiffre (± 4 px)",
      "measure": "Math.abs(box('.vl-bars').bottom - box('.vl-sales__num').bottom)",
      "max": 4
    },
    {
      "name": "contraste du titre blanc sur noir ≥ 7 (il porte le nom de la carte)",
      "measure": "contrast('.vl-sales__title')",
      "min": 7
    },
    {
      "name": "aucun débordement du contenu hors de la carte",
      "measure": "overflow('.vl-sales')",
      "max": 0
    }
  ],
  "notes": "Deux zones tenues aux deux bords par margin-top:auto : l'en-tête en haut, le couple chiffre+barres en bas. C'est ce collage qui fait lire le total avant le reste et qui aligne le pied des barres sur le pied du nombre (benchmark dédié). Règle de couleur de la référence : la menthe code la part principale, le lilas la part de second temps — jamais l'inverse, sinon l'accent ne désigne plus rien. Le sommet arrondi des barres est un parti pris de lecture rapide, pas de mesure : il interdit la comparaison fine, d'où l'avertissement avoid_when.",
  "id": "card-04-stat-barchart"
}

À côté