layout-01-nested-bento
layout-18-barre-deux-volumes
Barre de fin à deux volumes
Fermer une section par un objet qu'on voit encore après un long bloc : une barre pleine à bords ronds dont le bouton occupe la moitié droite, avec son propre arrondi et son propre aplat. Les deux se lisent comme deux volumes superposés — là où un filet horizontal surmonté d'une phrase grise et d'un lien souligné ne fait que séparer, sans rien porter.
layoutwebslide1320×80px8 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
En fin de section longue, quand il reste UNE chose à dire et UNE seule route à proposer : la phrase de conclusion, et le bouton qui l'emmène. Se cale sur la largeur du bloc qu'elle referme — c'est cet alignement qui la fait lire comme sa fermeture plutôt que comme un objet posé après.
Éviter quand
Dès qu'il y a deux destinations : la barre conclut, elle n'arbitre pas — deux boutons en font une barre de navigation, et la conclusion se perd. À éviter aussi quand la phrase dépasse trois lignes (la gélule devient un pavé arrondi, ses deux caps mangent le texte), et à une largeur inférieure à celle du bloc qu'elle suit : centrée plus étroite, elle flotte au lieu de fermer.
Notes
**Le geste tient dans un rapport, pas dans un dessin.** Le bouton est inséré du MÊME jeu sur ses quatre côtés (10 px sur une barre de 86) : c'est cette égalité qui le fait lire comme un volume POSÉ sur la barre. Un jeu inégal — collé en haut, ou à fleur du bord droit — et il redevient un élément aligné dans une boîte, ce qui est exactement la lecture qu'on fuit. **Les deux rayons doivent être pleins.** Une gélule dans une gélule se lit d'un coup d'œil ; deux rayons finis (12, 24 px) donnent deux rectangles adoucis dont l'un contient l'autre, et la superposition disparaît. Le benchmark mesure le rapport rayon / demi-hauteur, donc il survit à tout changement d'échelle. **La largeur n'est pas cosmétique.** La barre se cale sur le bloc qu'elle referme — ici les 1320 px du quadrant `layout-17-quadrant-epicentre`, qui sortent de la colonne de texte du site. Ramenée à la colonne (1120), elle est plus étroite que ce qu'elle conclut et se lit comme un objet posé APRÈS, pas comme une fermeture. **Origine.** Reversée le 21/08/2026 depuis la section « Nos propositions de valeur » du site Finengy Advisory, en même temps que le quadrant qu'elle referme. Elle remplace un filet horizontal surmonté d'une phrase en gris et d'un lien souligné — trois objets qui, après 1500 px de vignettes, ne se voyaient plus.
Mots-clés
Benchmarks — la géométrie, en assertions vérifiables
Rejouables par node bin/check.mjs layout-18-barre-deux-volumes : le pattern se prouve, il ne se croit pas.
| assertion | mesure | attendu |
|---|---|---|
| DEUX VOLUMES — le jeu autour du bouton est le même sur ses quatre côtés : inégal, le bouton se lit comme collé à un bord au lieu d'être posé SUR la barre | (() => { const b = box('.vl-barre'), c = box('.vl-barre__cta'); const j = [c.top - b.top, b.bottom - c.bottom, b.right - c.right]; return (Math.max(...j) - Math.min(...j)) / H; })() | ≤ 0.02 |
| les DEUX rayons sont pleins (≥ la demi-hauteur de leur boîte) : deux gélules, pas deux rectangles adoucis | (() => { const rb = num('.vl-barre', 'borderTopLeftRadius') / (box('.vl-barre').h / 2); const rc = num('.vl-barre__cta', 'borderTopLeftRadius') / (box('.vl-barre__cta').h / 2); return Math.min(rb, rc); })() | ≥ 1 |
| UN SEUL bouton — la barre conclut, elle ne propose pas deux routes | document.querySelectorAll('.vl-barre__cta').length | 1 ± 0 |
| LE BOUTON EST UN APLAT, pas un lien souligné : son fond diffère de celui de la barre, et il ne porte aucun soulignement | (() => { const meme = cs('.vl-barre__cta', 'backgroundColor') === cs('.vl-barre', 'backgroundColor'); const souligne = cs('.vl-barre__cta', 'textDecorationLine') !== 'none'; return (!meme && !souligne) ? 1 : 0; })() | 1 ± 0 |
| LE TEXTE RESPIRE DU CÔTÉ ROND — son renfoncement vaut au moins le tiers de la hauteur de barre, sinon la première lettre entre dans le cap arrondi | num('.vl-barre', 'paddingLeft') / H | ≥ 0.33 |
| BARRE BASSE — elle ferme, elle ne pèse pas : sa hauteur reste sous 0,09 de sa largeur | H / W | ≤ 0.09 |
| PLANCHER DE CORPS — la phrase fait au moins 0,0145 de la largeur (19 px sur 1320) : c'est une conclusion qu'on lit, pas une mention légale | num('.vl-barre__txt', 'fontSize') / W | ≥ 0.0145 |
| LE BOUTON N'EST PAS UN PAVÉ — il occupe entre un cinquième et un tiers de la barre : au-delà, ce n'est plus une conclusion mais une bannière d'appel | box('.vl-barre__cta').w / W | 0.18 → 0.34 |
Le code
patterns/layout-18-barre-deux-volumes.html
Télécharger<!-- layout-18-barre-deux-volumes — fragment autonome. Couleurs via --vl-* uniquement.
La fin d'une section n'est pas un filet. Un trait horizontal SÉPARE, il ne porte rien :
après un long bloc, la phrase de conclusion posée sous lui et le lien souligné au bout de
la ligne sont deux objets qu'on ne voit plus.
Ici c'est UNE barre pleine à bords ronds, et le bouton en occupe la moitié droite — avec
son propre arrondi et son propre aplat, inséré du même jeu sur ses quatre côtés. Les deux
se lisent donc comme deux VOLUMES superposés, et non comme une ligne suivie d'un lien.
Trois règles, et elles se mesurent :
• le jeu du bouton est le MÊME sur ses quatre côtés — c'est lui qui fait la
superposition ; inégal, le bouton se lit comme collé à un bord ;
• les deux rayons sont PLEINS (≥ la demi-hauteur de leur boîte) : deux gélules, pas deux
rectangles adoucis ;
• un SEUL bouton. La barre conclut, elle ne propose pas deux routes.
Au repli, la gélule redevient une carte à rayon fini : un rayon plein sur deux lignes
rognerait le texte à ses deux bouts. -->
<div class="vl-barre">
<p class="vl-barre__txt">Pour chacune de ces disciplines, Finengy propose des prestations de <strong>management de transition</strong>.</p>
<a class="vl-barre__cta" href="#">Le détail de chaque practice <span aria-hidden="true">→</span></a>
</div>
<style>
/* Les paramètres de la barre, et il n'y en a pas d'autres :
--vl-barre-w sa largeur — elle se cale sur le bloc qu'elle referme, pas sur la colonne
de texte : à une largeur moindre, elle flotterait au milieu ;
--vl-barre-jeu le jeu autour du bouton, égal sur les quatre côtés ;
--vl-barre-pad le renfoncement du texte, côté rond de la barre. */
.vl-barre {
--vl-barre-w: 1320px;
--vl-barre-jeu: 10px;
--vl-barre-pad: 48px;
width: var(--vl-barre-w);
display: flex; align-items: center; justify-content: space-between;
gap: 40px;
padding: var(--vl-barre-jeu) var(--vl-barre-jeu) var(--vl-barre-jeu) var(--vl-barre-pad);
border-radius: 999px;
background: var(--vl-card); border: 1px solid var(--vl-edge);
font-family: var(--vl-font, Inter, system-ui, sans-serif);
}
.vl-barre__txt {
margin: 0;
font-size: 21px; line-height: 1.35; color: var(--vl-ink); text-wrap: pretty;
}
.vl-barre__txt strong { font-weight: 700; }
/* Le lien n'est plus un lien : c'est un BOUTON, avec l'aplat de l'accent d'action. */
.vl-barre__cta {
flex: 0 0 auto; display: inline-flex; align-items: center; gap: 0.55em;
padding: 18px 38px;
border-radius: 999px; text-decoration: none;
background: var(--vl-invert); color: var(--vl-on-invert);
font-size: 19px; font-weight: 600; letter-spacing: -0.008em;
transition: background 0.2s cubic-bezier(.22,.61,.36,1), color 0.2s cubic-bezier(.22,.61,.36,1);
}
.vl-barre__cta:hover { background: var(--vl-accent); color: var(--vl-on-accent); }
.vl-barre__cta span { transition: transform 0.2s cubic-bezier(.22,.61,.36,1); }
.vl-barre__cta:hover span { transform: translateX(3px); }
</style>
systems/ref-21-finengy-quadrant-clair.json
Télécharger:root {
--vl-bg: #FFFFFF;
--vl-card: #F2F7FB;
--vl-edge: #DFE9F1;
--vl-hairline: rgba(13,42,61,0.28);
--vl-hairline-invert: rgba(255,255,255,0.32);
--vl-ink: #0D2A3D;
--vl-invert: #0D2A3D;
--vl-on-invert: #FFFFFF;
--vl-accent: #F5C518;
--vl-on-accent: #0D2A3D;
--vl-seam: 14px;
--vl-radius: 92px;
--vl-badge: 60px;
--vl-pad: 44px;
--vl-block: 1320px;
}
les métadonnées — patterns/layout-18-barre-deux-volumes.json (télécharger)
{
"name": "Barre de fin à deux volumes",
"family": "layout",
"ref": "ref-21-finengy-quadrant-clair",
"intent": "Fermer une section par un objet qu'on voit encore après un long bloc : une barre pleine à bords ronds dont le bouton occupe la moitié droite, avec son propre arrondi et son propre aplat. Les deux se lisent comme deux volumes superposés — là où un filet horizontal surmonté d'une phrase grise et d'un lien souligné ne fait que séparer, sans rien porter.",
"when_to_use": "En fin de section longue, quand il reste UNE chose à dire et UNE seule route à proposer : la phrase de conclusion, et le bouton qui l'emmène. Se cale sur la largeur du bloc qu'elle referme — c'est cet alignement qui la fait lire comme sa fermeture plutôt que comme un objet posé après.",
"avoid_when": "Dès qu'il y a deux destinations : la barre conclut, elle n'arbitre pas — deux boutons en font une barre de navigation, et la conclusion se perd. À éviter aussi quand la phrase dépasse trois lignes (la gélule devient un pavé arrondi, ses deux caps mangent le texte), et à une largeur inférieure à celle du bloc qu'elle suit : centrée plus étroite, elle flotte au lieu de fermer.",
"media": [
"web",
"slide"
],
"tags": [
"barre",
"bande",
"conclusion",
"cta",
"bouton",
"gelule",
"pilule",
"fin-de-section",
"rayon"
],
"vars": [
{
"name": "--vl-barre-w",
"role": "la largeur de la barre — celle du bloc qu'elle referme, jamais celle de la colonne de texte",
"default": "1320px"
},
{
"name": "--vl-barre-jeu",
"role": "le jeu autour du bouton, ÉGAL sur les quatre côtés : c'est lui qui fait la superposition",
"default": "10px"
},
{
"name": "--vl-barre-pad",
"role": "le renfoncement du texte du côté rond de la barre",
"default": "48px"
}
],
"slots": [
{
"name": "phrase",
"selector": ".vl-barre__txt",
"role": "la conclusion, une à trois lignes"
},
{
"name": "bouton",
"selector": ".vl-barre__cta",
"role": "la seule route proposée"
}
],
"geometry": {
"root": ".vl-barre",
"frame": [
1320,
80
],
"ratios": {
"jeu_over_hauteur": 0.116,
"pad_over_hauteur": 0.558,
"bouton_over_largeur": 0.262,
"hauteur_over_largeur": 0.065,
"boutons": 1
},
"type_px": {
"phrase": 21,
"bouton": 19
},
"pad_ratio": {
"top": 0.0076,
"x": 0.0364,
"bottom": 0.0076
}
},
"benchmarks": [
{
"name": "DEUX VOLUMES — le jeu autour du bouton est le même sur ses quatre côtés : inégal, le bouton se lit comme collé à un bord au lieu d'être posé SUR la barre",
"measure": "(() => { const b = box('.vl-barre'), c = box('.vl-barre__cta'); const j = [c.top - b.top, b.bottom - c.bottom, b.right - c.right]; return (Math.max(...j) - Math.min(...j)) / H; })()",
"max": 0.02
},
{
"name": "les DEUX rayons sont pleins (≥ la demi-hauteur de leur boîte) : deux gélules, pas deux rectangles adoucis",
"measure": "(() => { const rb = num('.vl-barre', 'borderTopLeftRadius') / (box('.vl-barre').h / 2); const rc = num('.vl-barre__cta', 'borderTopLeftRadius') / (box('.vl-barre__cta').h / 2); return Math.min(rb, rc); })()",
"min": 1
},
{
"name": "UN SEUL bouton — la barre conclut, elle ne propose pas deux routes",
"measure": "document.querySelectorAll('.vl-barre__cta').length",
"expect": 1,
"tol": 0
},
{
"name": "LE BOUTON EST UN APLAT, pas un lien souligné : son fond diffère de celui de la barre, et il ne porte aucun soulignement",
"measure": "(() => { const meme = cs('.vl-barre__cta', 'backgroundColor') === cs('.vl-barre', 'backgroundColor'); const souligne = cs('.vl-barre__cta', 'textDecorationLine') !== 'none'; return (!meme && !souligne) ? 1 : 0; })()",
"expect": 1,
"tol": 0
},
{
"name": "LE TEXTE RESPIRE DU CÔTÉ ROND — son renfoncement vaut au moins le tiers de la hauteur de barre, sinon la première lettre entre dans le cap arrondi",
"measure": "num('.vl-barre', 'paddingLeft') / H",
"min": 0.33
},
{
"name": "BARRE BASSE — elle ferme, elle ne pèse pas : sa hauteur reste sous 0,09 de sa largeur",
"measure": "H / W",
"max": 0.09
},
{
"name": "PLANCHER DE CORPS — la phrase fait au moins 0,0145 de la largeur (19 px sur 1320) : c'est une conclusion qu'on lit, pas une mention légale",
"measure": "num('.vl-barre__txt', 'fontSize') / W",
"min": 0.0145
},
{
"name": "LE BOUTON N'EST PAS UN PAVÉ — il occupe entre un cinquième et un tiers de la barre : au-delà, ce n'est plus une conclusion mais une bannière d'appel",
"measure": "box('.vl-barre__cta').w / W",
"min": 0.18,
"max": 0.34
}
],
"notes": "**Le geste tient dans un rapport, pas dans un dessin.** Le bouton est inséré du MÊME jeu sur ses quatre côtés (10 px sur une barre de 86) : c'est cette égalité qui le fait lire comme un volume POSÉ sur la barre. Un jeu inégal — collé en haut, ou à fleur du bord droit — et il redevient un élément aligné dans une boîte, ce qui est exactement la lecture qu'on fuit.\n\n**Les deux rayons doivent être pleins.** Une gélule dans une gélule se lit d'un coup d'œil ; deux rayons finis (12, 24 px) donnent deux rectangles adoucis dont l'un contient l'autre, et la superposition disparaît. Le benchmark mesure le rapport rayon / demi-hauteur, donc il survit à tout changement d'échelle.\n\n**La largeur n'est pas cosmétique.** La barre se cale sur le bloc qu'elle referme — ici les 1320 px du quadrant `layout-17-quadrant-epicentre`, qui sortent de la colonne de texte du site. Ramenée à la colonne (1120), elle est plus étroite que ce qu'elle conclut et se lit comme un objet posé APRÈS, pas comme une fermeture.\n\n**Origine.** Reversée le 21/08/2026 depuis la section « Nos propositions de valeur » du site Finengy Advisory, en même temps que le quadrant qu'elle referme. Elle remplace un filet horizontal surmonté d'une phrase en gris et d'un lien souligné — trois objets qui, après 1500 px de vignettes, ne se voyaient plus.",
"id": "layout-18-barre-deux-volumes"
}
À côté
layout-02-swiss-frame
Cadre suisse header / footer
layout-03-glass-board
Écran en verre dépoli — fond dégradé + modules
layout-04-graph-paper-cells
Papier millimétré et ses cases
layout-05-nav-pill-bar
Barre de menu en pilule flottante
layout-06-bento-l-span