card-11-corner-arrow-tile

Vignette d'entrée à flèche de coin

Faire d'un module une ENTRÉE cliquable sans bouton ni liseré : le titre en haut à gauche, une flèche oblique ancrée au coin opposé — jamais alignée sur le titre — et l'illustration qui occupe tout le bas de la vignette au lieu d'être centrée dedans.

cardwebslide466×302px17 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

Grille de services, sommaire de rubriques, tuiles d'entrée d'un accueil : trois à cinq vignettes de même rang dont chacune mène ailleurs. Le titre tient sur deux lignes courtes, l'illustration porte la respiration, et la flèche est le seul signe d'interaction de l'écran.

Éviter quand

La vignette porte un chiffre (elle devient une carte de KPI, cf. card-10-kpi-notch-tile : le chiffre veut l'aplomb du bas, l'illustration aussi, et les deux ne cohabitent pas), le titre dépasse trois lignes (il rejoint la flèche et le coin cesse d'être libre), ou la vignette n'est pas cliquable — une flèche qui ne mène nulle part est un mensonge d'interface.

Notes

Deux assertions font tout le pattern, et elles disent la même chose de deux façons : la flèche est ancrée au COIN (bord droit et bord haut collés à la marge), et le titre s'arrête au moins 8 px avant elle. Sans la seconde, un titre de trois mots de plus passe sous la flèche : la mesure de position reste verte et la vignette est cassée. C'est le cas typique où un contrôle ne voit qu'une moitié du geste. L'illustration est mesurée en LARGEUR UTILE (≥ 95 % de l'entre-marges) et pas en aire : une illustration centrée avec des marges propres à elle est exactement ce que ce pattern refuse — elle ferait une vignette dans la vignette, c'est-à-dire une couche de plus. Ce n'est pas une variante de card-10-kpi-notch-tile : celui-ci porte un chiffre héros et une silhouette chanfreinée, celui-là ni l'un ni l'autre. Le seul point commun est le mot « tuile », et un mot n'est pas une composition.

Mots-clés

vignettecartetuileentreeservicerubriqueflechearrowcoinillustrationbentoaccueillandingmonochrome

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

Rejouables par node bin/check.mjs card-11-corner-arrow-tile : le pattern se prouve, il ne se croit pas.

assertionmesureattendu
vignette nettement paysage : W / H ≈ 1,54W / H1.543 ± 0.12
rayon ≈ 5 % de la largeurnum('.vl-tile','borderTopLeftRadius') / W0.0515 ± 0.015
marge intérieure identique à gauche et en haut : la vignette n'a pas de sens de lecture privilégiéMath.abs(num('.vl-tile','paddingLeft') - num('.vl-tile','paddingTop'))≤ 1
la flèche est ANCRÉE au coin : son bord droit colle la marge intérieureW - num('.vl-tile','paddingRight') - box('.vl-tile__arrow').right0 ± 1.5
… et son bord haut aussiMath.abs(box('.vl-tile__arrow').top - num('.vl-tile','paddingTop'))≤ 1.5
la flèche reste un repère, jamais un sujet : ≤ 9 % de la largeurbox('.vl-tile__arrow').w / W≤ 0.09
le titre ne court JAMAIS sous la flèche : au moins 8 px les séparentbox('.vl-tile__arrow').left - box('.vl-tile__title').right≥ 8
le titre colle le coin haut-gaucheMath.abs(box('.vl-tile__title').left - num('.vl-tile','paddingLeft')) + Math.abs(box('.vl-tile__title').top - num('.vl-tile','paddingTop'))≤ 3
l'illustration occupe toute la largeur utile — elle n'est pas une vignette dans la vignettebox('.vl-tile__art').w / (W - num('.vl-tile','paddingLeft') - num('.vl-tile','paddingRight'))≥ 0.95
l'illustration prend au moins 40 % de la hauteur : c'est elle qui porte la respirationbox('.vl-tile__art').h / H≥ 0.4
la ligne d'explication est bien en basbox('.vl-tile__sub').bottom / H≥ 0.86
saut typographique titre / explication ≥ 1,35num('.vl-tile__title','fontSize') / num('.vl-tile__sub','fontSize')≥ 1.35
aucun liserénum('.vl-tile','borderTopWidth')0 ± 0
aucune ombre portéecs('.vl-tile','boxShadow') === 'none' ? 1 : 01
contraste du titre ≥ 4,5contrast('.vl-tile__title')≥ 4.5
contraste de l'explication ≥ 4,5contrast('.vl-tile__sub')≥ 4.5
aucun débordementoverflow('.vl-tile')≤ 0

Le code

fragment — patterns/card-11-corner-arrow-tile.html Télécharger
<!-- card-11-corner-arrow-tile — la vignette d'entrée d'un bento. Couleurs via --vl-* seulement.
     Trois zones dans un ordre FIXE : titre au coin haut-gauche, flèche ancrée au coin
     haut-DROIT (jamais alignée sur le titre, jamais dans le flux), illustration en pleine
     largeur utile qui pousse l'explication au bas de la vignette.
     L'illustration est une composition SVG générative : rien de distant, rien qui périme. -->
<article class="vl-tile">
  <h3 class="vl-tile__title">Video<br>consultations</h3>
  <svg class="vl-tile__arrow" viewBox="0 0 24 24" fill="none" stroke="currentColor"
       stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
    <path d="M7 17 17 7M8.5 7H17v8.5"/>
  </svg>
  <div class="vl-tile__art" aria-hidden="true">
    <svg viewBox="0 0 300 130" fill="none" stroke="var(--vl-line)" stroke-width="0.9"
         preserveAspectRatio="xMidYMid meet">
      <ellipse cx="196" cy="76" rx="86" ry="28"/>
      <path d="M110 76a86 28 0 0 0 172 0"/>
      <ellipse cx="196" cy="56" rx="52" ry="17"/>
      <path d="M144 56v20M248 56v20"/>
      <ellipse cx="196" cy="76" rx="52" ry="17"/>
      <circle cx="196" cy="42" r="17"/>
    </svg>
  </div>
  <p class="vl-tile__sub">We run consultations<br>over Zoom or Meet</p>
</article>

<style>
.vl-tile {
  width: 466px; height: 302px;
  box-sizing: border-box;
  /* Marge identique sur les quatre bords : la vignette n'a pas de sens de lecture
     privilégié, et c'est cette égalité qui fait tenir l'ancrage de la flèche. */
  padding: 28px;
  position: relative;
  display: flex; flex-direction: column;
  background: var(--vl-module);
  color: var(--vl-ink);
  border-radius: var(--vl-radius-module, 24px);
  overflow: hidden;
  font-family: Inter, "Helvetica Neue", Arial, sans-serif;
}
/* Le titre est bridé en largeur pour ne JAMAIS courir sous la flèche. Sans cette bride, un
   titre de trois mots de plus passe dessous : la position de la flèche reste juste, et la
   vignette est cassée. C'est pour ça que le benchmark mesure l'ÉCART entre les deux, et pas
   seulement la position de chacun. */
.vl-tile__title {
  margin: 0; max-width: 74%;
  font-size: 23px; line-height: 1.24; font-weight: 500; letter-spacing: -0.01em;
}
/* Hors du flux : la flèche appartient au CADRE de la vignette, pas à sa phrase. */
.vl-tile__arrow {
  position: absolute; top: 28px; right: 28px;
  width: 30px; height: 30px;
}
/* Pleine largeur utile, jamais recentrée dans une boîte à elle : une illustration avec ses
   propres marges ferait une vignette dans la vignette, c'est-à-dire une couche de plus. */
.vl-tile__art {
  flex: 1 1 auto; min-height: 0;
  display: flex; align-items: center; justify-content: center;
  margin-top: 14px;
}
.vl-tile__art svg { width: 100%; height: 100%; }
.vl-tile__sub {
  margin: 0;
  font-size: 16px; line-height: 1.45; font-weight: 500;
  color: var(--vl-ink-soft);
}
</style>
tokens de la charte — systems/ref-17-mono-bento-legal.json Télécharger
:root {
  --vl-page: #FEFEFE;
  --vl-module: #EDEDED;
  --vl-object: #FFFFFF;
  --vl-invert: #000000;
  --vl-ink: #111111;
  --vl-ink-soft: #5F5F5F;
  --vl-on-invert: #FFFFFF;
  --vl-on-invert-soft: rgba(255,255,255,0.62);
  --vl-line: rgba(17,17,17,0.55);
  --vl-radius-page: 38px;
  --vl-radius-module: 24px;
  --vl-radius-bar: 20px;
  --vl-radius-pill: 999px;
  --vl-gutter: 26px;
  --vl-margin: 57px;
  --vl-bar-h: 69px;
  --vl-col-1: 343fr;
  --vl-col-2: 466fr;
  --vl-col-3: 464fr;
  --vl-row-1: 302fr;
  --vl-row-2: 232fr;
  --vl-row-3: 243fr;
}
les métadonnées — patterns/card-11-corner-arrow-tile.json (télécharger)
{
  "name": "Vignette d'entrée à flèche de coin",
  "family": "card",
  "ref": "ref-17-mono-bento-legal",
  "intent": "Faire d'un module une ENTRÉE cliquable sans bouton ni liseré : le titre en haut à gauche, une flèche oblique ancrée au coin opposé — jamais alignée sur le titre — et l'illustration qui occupe tout le bas de la vignette au lieu d'être centrée dedans.",
  "when_to_use": "Grille de services, sommaire de rubriques, tuiles d'entrée d'un accueil : trois à cinq vignettes de même rang dont chacune mène ailleurs. Le titre tient sur deux lignes courtes, l'illustration porte la respiration, et la flèche est le seul signe d'interaction de l'écran.",
  "avoid_when": "La vignette porte un chiffre (elle devient une carte de KPI, cf. card-10-kpi-notch-tile : le chiffre veut l'aplomb du bas, l'illustration aussi, et les deux ne cohabitent pas), le titre dépasse trois lignes (il rejoint la flèche et le coin cesse d'être libre), ou la vignette n'est pas cliquable — une flèche qui ne mène nulle part est un mensonge d'interface.",
  "media": [
    "web",
    "slide"
  ],
  "tags": [
    "vignette",
    "carte",
    "tuile",
    "entree",
    "service",
    "rubrique",
    "fleche",
    "arrow",
    "coin",
    "illustration",
    "bento",
    "accueil",
    "landing",
    "monochrome"
  ],
  "vars": [
    {
      "name": "--vl-module",
      "role": "aplat de la vignette",
      "default": "#EDEDED"
    },
    {
      "name": "--vl-ink",
      "role": "titre et flèche",
      "default": "#111111"
    },
    {
      "name": "--vl-ink-soft",
      "role": "ligne d'explication sous l'illustration",
      "default": "#5F5F5F"
    },
    {
      "name": "--vl-line",
      "role": "trait de l'illustration — une valeur d'encre, pas un gris de fond",
      "default": "rgba(17,17,17,0.55)"
    },
    {
      "name": "--vl-radius-module",
      "role": "rayon de la vignette",
      "default": "24px"
    }
  ],
  "slots": [
    "title",
    "art",
    "sub"
  ],
  "geometry": {
    "root": ".vl-tile",
    "frame": [
      466,
      302
    ],
    "ratios": {
      "width_over_height": 1.543,
      "radius_over_width": 0.0515,
      "pad_over_width": 0.06,
      "arrow_over_width": 0.064,
      "title_block_over_width": 0.74,
      "art_over_height": 0.45
    },
    "type_px": {
      "title": 23,
      "sub": 16
    },
    "pad_ratio": {
      "top": 0.06,
      "x": 0.06,
      "bottom": 0.06
    }
  },
  "benchmarks": [
    {
      "name": "vignette nettement paysage : W / H ≈ 1,54",
      "measure": "W / H",
      "expect": 1.543,
      "tol": 0.12
    },
    {
      "name": "rayon ≈ 5 % de la largeur",
      "measure": "num('.vl-tile','borderTopLeftRadius') / W",
      "expect": 0.0515,
      "tol": 0.015
    },
    {
      "name": "marge intérieure identique à gauche et en haut : la vignette n'a pas de sens de lecture privilégié",
      "measure": "Math.abs(num('.vl-tile','paddingLeft') - num('.vl-tile','paddingTop'))",
      "max": 1
    },
    {
      "name": "la flèche est ANCRÉE au coin : son bord droit colle la marge intérieure",
      "measure": "W - num('.vl-tile','paddingRight') - box('.vl-tile__arrow').right",
      "expect": 0,
      "tol": 1.5
    },
    {
      "name": "… et son bord haut aussi",
      "measure": "Math.abs(box('.vl-tile__arrow').top - num('.vl-tile','paddingTop'))",
      "max": 1.5
    },
    {
      "name": "la flèche reste un repère, jamais un sujet : ≤ 9 % de la largeur",
      "measure": "box('.vl-tile__arrow').w / W",
      "max": 0.09
    },
    {
      "name": "le titre ne court JAMAIS sous la flèche : au moins 8 px les séparent",
      "measure": "box('.vl-tile__arrow').left - box('.vl-tile__title').right",
      "min": 8
    },
    {
      "name": "le titre colle le coin haut-gauche",
      "measure": "Math.abs(box('.vl-tile__title').left - num('.vl-tile','paddingLeft')) + Math.abs(box('.vl-tile__title').top - num('.vl-tile','paddingTop'))",
      "max": 3
    },
    {
      "name": "l'illustration occupe toute la largeur utile — elle n'est pas une vignette dans la vignette",
      "measure": "box('.vl-tile__art').w / (W - num('.vl-tile','paddingLeft') - num('.vl-tile','paddingRight'))",
      "min": 0.95
    },
    {
      "name": "l'illustration prend au moins 40 % de la hauteur : c'est elle qui porte la respiration",
      "measure": "box('.vl-tile__art').h / H",
      "min": 0.4
    },
    {
      "name": "la ligne d'explication est bien en bas",
      "measure": "box('.vl-tile__sub').bottom / H",
      "min": 0.86
    },
    {
      "name": "saut typographique titre / explication ≥ 1,35",
      "measure": "num('.vl-tile__title','fontSize') / num('.vl-tile__sub','fontSize')",
      "min": 1.35
    },
    {
      "name": "aucun liseré",
      "measure": "num('.vl-tile','borderTopWidth')",
      "expect": 0,
      "tol": 0
    },
    {
      "name": "aucune ombre portée",
      "measure": "cs('.vl-tile','boxShadow') === 'none' ? 1 : 0",
      "expect": 1
    },
    {
      "name": "contraste du titre ≥ 4,5",
      "measure": "contrast('.vl-tile__title')",
      "min": 4.5
    },
    {
      "name": "contraste de l'explication ≥ 4,5",
      "measure": "contrast('.vl-tile__sub')",
      "min": 4.5
    },
    {
      "name": "aucun débordement",
      "measure": "overflow('.vl-tile')",
      "max": 0
    }
  ],
  "notes": "Deux assertions font tout le pattern, et elles disent la même chose de deux façons : la flèche est ancrée au COIN (bord droit et bord haut collés à la marge), et le titre s'arrête au moins 8 px avant elle. Sans la seconde, un titre de trois mots de plus passe sous la flèche : la mesure de position reste verte et la vignette est cassée. C'est le cas typique où un contrôle ne voit qu'une moitié du geste.\n\nL'illustration est mesurée en LARGEUR UTILE (≥ 95 % de l'entre-marges) et pas en aire : une illustration centrée avec des marges propres à elle est exactement ce que ce pattern refuse — elle ferait une vignette dans la vignette, c'est-à-dire une couche de plus.\n\nCe n'est pas une variante de card-10-kpi-notch-tile : celui-ci porte un chiffre héros et une silhouette chanfreinée, celui-là ni l'un ni l'autre. Le seul point commun est le mot « tuile », et un mot n'est pas une composition.",
  "id": "card-11-corner-arrow-tile"
}

À côté