card-01-ghost-icon
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
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
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.
| assertion | mesure | attendu |
|---|---|---|
| vignette nettement paysage : W / H ≈ 1,54 | W / H | 1.543 ± 0.12 |
| rayon ≈ 5 % de la largeur | num('.vl-tile','borderTopLeftRadius') / W | 0.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érieure | W - num('.vl-tile','paddingRight') - box('.vl-tile__arrow').right | 0 ± 1.5 |
| … et son bord haut aussi | Math.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 largeur | box('.vl-tile__arrow').w / W | ≤ 0.09 |
| le titre ne court JAMAIS sous la flèche : au moins 8 px les séparent | box('.vl-tile__arrow').left - box('.vl-tile__title').right | ≥ 8 |
| le titre colle le coin haut-gauche | Math.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 vignette | box('.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 respiration | box('.vl-tile__art').h / H | ≥ 0.4 |
| la ligne d'explication est bien en bas | box('.vl-tile__sub').bottom / H | ≥ 0.86 |
| saut typographique titre / explication ≥ 1,35 | num('.vl-tile__title','fontSize') / num('.vl-tile__sub','fontSize') | ≥ 1.35 |
| aucun liseré | num('.vl-tile','borderTopWidth') | 0 ± 0 |
| aucune ombre portée | cs('.vl-tile','boxShadow') === 'none' ? 1 : 0 | 1 |
| contraste du titre ≥ 4,5 | contrast('.vl-tile__title') | ≥ 4.5 |
| contraste de l'explication ≥ 4,5 | contrast('.vl-tile__sub') | ≥ 4.5 |
| aucun débordement | overflow('.vl-tile') | ≤ 0 |
Le code
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>
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é
card-02-notched-brief
Carte chanfreinée de second rang
card-03-stat-accent
Vignette statistique sur accent
card-04-stat-barchart
Carte statistique à barres empilées
card-05-balance-gauge
Carte solde à jauge compteur
card-06-forecast-timeline