card-08-orb-chain-total
layout-03-glass-board
Écran en verre dépoli — fond dégradé + modules
Emboîter les surfaces d'un écran dense en DEUX couches seulement, sans un trait ni une couleur de séparation : un fond en dégradé qui accueille, et des modules de blanc translucide posés dessus, flou d'arrière-plan compris.
layoutslideweb1600×900px11 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
Dashboard, écran produit ou slide de démo où l'on veut de la profondeur sans ajouter de matière graphique — et où le fond doit rester visible à travers les modules (c'est lui qui donne la couleur de l'ensemble).
Éviter quand
Le support ne rend pas le flou d'arrière-plan (export .pptx, mailing, impression) : le verre s'aplatit en deux gris presque identiques et toute la hiérarchie disparaît. Éviter aussi sur un fond uni — sans dégradé derrière, le dépoli ne se voit pas.
Notes
Le contrôle d'alpha est le cœur du pattern : c'est la seule chose qui porte la hiérarchie, et c'est la première à disparaître quand quelqu'un « nettoie » les rgba en couleurs pleines. Le benchmark « deux couches et pas trois » est là parce que la faute est tentante et invisible à la mesure classique : glisser un panneau translucide de plus entre le fond et les modules ne casse aucun alignement, il écrase juste la profondeur — le fond n'est alors plus jamais vu à nu, et les modules cessent de flotter. Deux pièges payés en plus : (1) `bgOf()` du harnais COMPOSITE les couches translucides pour établir le fond effectif d'une mesure de contraste — un verre à 0,45 n'est ni ignoré ni traité comme opaque ; (2) un dégradé posé en `background` seul laisse `backgroundColor` transparent, les fonds colorés déclarent donc `background-color` ET `background-image`, sinon aucune mesure de contraste n'est possible.
Mots-clés
Benchmarks — la géométrie, en assertions vérifiables
Rejouables par node bin/check.mjs layout-03-glass-board : le pattern se prouve, il ne se croit pas.
| assertion | mesure | attendu |
|---|---|---|
| le module est translucide : le dégradé passe au travers | Number((cs('.vl-glass-board__card','backgroundColor').match(/[\d.]+/g)||[0,0,0,1])[3]) || 1 | ≤ 0.55 |
| le sous-bloc est plus blanc que le module (≥ 12 points d'alpha) | (Number((cs('.vl-glass-board__sub','backgroundColor').match(/[\d.]+/g)||[0,0,0,1])[3]) || 1) - (Number((cs('.vl-glass-board__card','backgroundColor').match(/[\d.]+/g)||[0,0,0,1])[3]) || 1) | ≥ 0.12 |
| le rayon décroît avec l'imbrication : module > sous-bloc | num('.vl-glass-board__card','borderTopLeftRadius') - num('.vl-glass-board__sub','borderTopLeftRadius') | ≥ 6 |
| le flou d'arrière-plan est bien posé sur le module (sinon ce n'est pas du verre) | /blur/.test(cs('.vl-glass-board__card','backdropFilter') + cs('.vl-glass-board__card','webkitBackdropFilter')) ? 1 : 0 | 1 ± 0 |
| aucune bordure dessinée : c'est le liseré de lumière qui découpe | num('.vl-glass-board__card','borderTopWidth') + num('.vl-glass-board__sub','borderTopWidth') | ≤ 0 |
| DEUX couches et pas trois : aucun panneau intermédiaire entre le fond et un module | [...document.querySelectorAll('.vl-glass-board__card')].filter((e) => e.parentElement.classList.contains('vl-glass-board') || e.parentElement.classList.contains('vl-glass-board__row')).length - document.querySelectorAll('.vl-glass-board__card').length | 0 ± 0 |
| marge de fond ≥ gouttière (le liseré de dégradé qui fait flotter les modules) | num('.vl-glass-board','paddingLeft') - num('.vl-glass-board','rowGap') | ≥ 0 |
| les modules laissent respirer le fond : ils tiennent sous 95 % de la largeur | box('.vl-glass-board__card--wide').w / W | ≤ 0.95 |
| format PPT : la scène est en 16:9 | W / H | 1.7778 ± 0.01 |
| contraste du libellé sur le verre ≥ 7 (fond effectif = le dégradé composité) | contrast('.vl-glass-board__label') | ≥ 7 |
| aucun débordement du contenu hors d'un module | overflow('.vl-glass-board__card--wide') | ≤ 0 |
Le code
patterns/layout-03-glass-board.html
Télécharger<!-- layout-03-glass-board — fragment autonome. Couleurs via --vl-* uniquement, aucune valeur en dur. -->
<div class="vl-glass-board">
<div class="vl-glass-board__card vl-glass-board__card--wide">
<span class="vl-glass-board__stack">
<span class="vl-glass-board__label">Total balance</span>
<span class="vl-glass-board__fig">$73,558.00</span>
</span>
<span class="vl-glass-board__sub">USD</span>
</div>
<div class="vl-glass-board__row">
<div class="vl-glass-board__card"><span class="vl-glass-board__label">Expense statistic</span></div>
<div class="vl-glass-board__card"><span class="vl-glass-board__label">Financial health</span></div>
</div>
<div class="vl-glass-board__card"><span class="vl-glass-board__label">Upcoming payments</span></div>
</div>
<style>
/* DEUX COUCHES, et pas une de plus. Couche 1 : un fond en DÉGRADÉ, qui accueille — c'est lui
qui donne sa couleur à l'écran entier, et rien ne s'interpose entre lui et les modules.
Couche 2 : les modules, rectangles de blanc translucide posés dessus, dont le flou
d'arrière-plan reprend le dégradé en le brouillant. Un troisième panneau intermédiaire
(une « planche » qui porterait les modules) est exactement ce qu'il ne faut pas : il divise
par deux l'écart de blanc entre le fond et les modules, et toute la profondeur s'écrase.
La hiérarchie ne tient ni à un trait ni à une couleur : elle tient au TAUX DE BLANC. À
l'intérieur d'un module, un sous-bloc reprend la même règle un cran plus blanc, avec un
rayon plus petit. Aucune bordure n'est dessinée : ce qui découpe une surface est un liseré
de lumière, en haut seulement. La marge de fond est plus large que la gouttière — c'est ce
liseré de dégradé qui fait lire les modules comme des objets posés, pas comme une grille. */
.vl-glass-board {
position: relative; width: 1600px; height: 900px; padding: var(--vl-margin);
display: flex; flex-direction: column; gap: var(--vl-gap);
overflow: hidden;
background-color: var(--vl-bg);
background-image:
radial-gradient(120% 90% at 12% 4%, var(--vl-grad-2) 0%, transparent 58%),
radial-gradient(100% 80% at 88% 96%, var(--vl-grad-3) 0%, transparent 62%),
linear-gradient(148deg, var(--vl-grad-1) 0%, var(--vl-bg) 46%, var(--vl-grad-3) 100%);
font-family: Inter, -apple-system, "Helvetica Neue", Arial, sans-serif;
color: var(--vl-ink);
}
.vl-glass-board__card {
flex: 1; padding: 24px 28px;
display: flex; flex-direction: column; align-items: flex-start; gap: 4px;
border-radius: var(--vl-radius-card);
background-color: var(--vl-surface-glass);
backdrop-filter: blur(var(--vl-blur));
box-shadow: inset 0 1px 0 var(--vl-sheen);
}
.vl-glass-board__card--wide { flex: 0 0 276px; flex-direction: row; justify-content: space-between; }
.vl-glass-board__stack { display: flex; flex-direction: column; gap: 4px; }
.vl-glass-board__row { flex: 0 0 238px; display: flex; gap: var(--vl-gap); }
.vl-glass-board__label { font-size: 15px; font-weight: 500; letter-spacing: -0.01em; }
.vl-glass-board__fig { font-size: 44px; font-weight: 600; letter-spacing: -0.025em; line-height: 1.05; }
.vl-glass-board__sub {
padding: 8px 16px;
border-radius: var(--vl-radius-sub);
font-size: 12px; font-weight: 500;
background-color: var(--vl-surface-glass-strong);
box-shadow: inset 0 1px 0 var(--vl-sheen);
}
</style>
systems/ref-13-glass-fintech-dashboard.json
Télécharger:root {
--vl-bg: #B4BEDD;
--vl-grad-1: #A3B0DA;
--vl-grad-2: #98A9D6;
--vl-grad-3: #C8CEDA;
--vl-surface-glass: rgba(255, 255, 255, 0.45);
--vl-surface-glass-strong: rgba(255, 255, 255, 0.68);
--vl-surface-glass-soft: rgba(255, 255, 255, 0.24);
--vl-surface-dark: #101625;
--vl-sheen: rgba(255, 255, 255, 0.45);
--vl-blue: #4F7CF7;
--vl-blue-light: #8FB6FA;
--vl-violet: #8B5CF6;
--vl-violet-deep: #5B7CF0;
--vl-violet-halo: rgba(123, 106, 240, 0.42);
--vl-ink: #1A1F2E;
--vl-ink-muted: #565C72;
--vl-ink-invert: #FFFFFF;
--vl-ink-invert-muted: rgba(255, 255, 255, 0.72);
--vl-radius-card: 28px;
--vl-radius-sub: 18px;
--vl-gap: 22px;
--vl-margin: 44px;
--vl-blur: 18px;
}
les métadonnées — patterns/layout-03-glass-board.json (télécharger)
{
"name": "Écran en verre dépoli — fond dégradé + modules",
"family": "layout",
"ref": "ref-13-glass-fintech-dashboard",
"intent": "Emboîter les surfaces d'un écran dense en DEUX couches seulement, sans un trait ni une couleur de séparation : un fond en dégradé qui accueille, et des modules de blanc translucide posés dessus, flou d'arrière-plan compris.",
"when_to_use": "Dashboard, écran produit ou slide de démo où l'on veut de la profondeur sans ajouter de matière graphique — et où le fond doit rester visible à travers les modules (c'est lui qui donne la couleur de l'ensemble).",
"avoid_when": "Le support ne rend pas le flou d'arrière-plan (export .pptx, mailing, impression) : le verre s'aplatit en deux gris presque identiques et toute la hiérarchie disparaît. Éviter aussi sur un fond uni — sans dégradé derrière, le dépoli ne se voit pas.",
"media": [
"slide",
"web"
],
"tags": [
"ecran",
"verre",
"glassmorphism",
"depoli",
"flou",
"backdrop",
"degrade",
"deux-couches",
"dashboard",
"translucide",
"profondeur"
],
"vars": [
{
"name": "--vl-grad-1",
"role": "extrémité lavande du dégradé de fond",
"default": "#A3B0DA"
},
{
"name": "--vl-grad-3",
"role": "extrémité claire du dégradé de fond",
"default": "#C8CEDA"
},
{
"name": "--vl-surface-glass",
"role": "verre d'un module (blanc à 45 %)",
"default": "rgba(255, 255, 255, 0.45)"
},
{
"name": "--vl-surface-glass-strong",
"role": "verre d'un sous-bloc (blanc à 68 %)",
"default": "rgba(255, 255, 255, 0.68)"
},
{
"name": "--vl-sheen",
"role": "liseré de lumière qui remplace la bordure",
"default": "rgba(255, 255, 255, 0.45)"
},
{
"name": "--vl-blur",
"role": "rayon du flou d'arrière-plan",
"default": "18px"
},
{
"name": "--vl-margin",
"role": "marge de fond autour des modules",
"default": "44px"
}
],
"slots": [
"modules",
"sub"
],
"geometry": {
"root": ".vl-glass-board",
"frame": [
1600,
900
],
"ratios": {
"margin_over_width": 0.0275,
"gap_over_width": 0.01375,
"modules_over_width": 0.945
},
"type_px": {
"label": 15,
"figure": 44,
"sub": 12
},
"pad_ratio": {
"top": 0.0275,
"x": 0.0275,
"bottom": 0.0275
}
},
"benchmarks": [
{
"name": "le module est translucide : le dégradé passe au travers",
"measure": "Number((cs('.vl-glass-board__card','backgroundColor').match(/[\\d.]+/g)||[0,0,0,1])[3]) || 1",
"max": 0.55
},
{
"name": "le sous-bloc est plus blanc que le module (≥ 12 points d'alpha)",
"measure": "(Number((cs('.vl-glass-board__sub','backgroundColor').match(/[\\d.]+/g)||[0,0,0,1])[3]) || 1) - (Number((cs('.vl-glass-board__card','backgroundColor').match(/[\\d.]+/g)||[0,0,0,1])[3]) || 1)",
"min": 0.12
},
{
"name": "le rayon décroît avec l'imbrication : module > sous-bloc",
"measure": "num('.vl-glass-board__card','borderTopLeftRadius') - num('.vl-glass-board__sub','borderTopLeftRadius')",
"min": 6
},
{
"name": "le flou d'arrière-plan est bien posé sur le module (sinon ce n'est pas du verre)",
"measure": "/blur/.test(cs('.vl-glass-board__card','backdropFilter') + cs('.vl-glass-board__card','webkitBackdropFilter')) ? 1 : 0",
"expect": 1,
"tol": 0
},
{
"name": "aucune bordure dessinée : c'est le liseré de lumière qui découpe",
"measure": "num('.vl-glass-board__card','borderTopWidth') + num('.vl-glass-board__sub','borderTopWidth')",
"max": 0
},
{
"name": "DEUX couches et pas trois : aucun panneau intermédiaire entre le fond et un module",
"measure": "[...document.querySelectorAll('.vl-glass-board__card')].filter((e) => e.parentElement.classList.contains('vl-glass-board') || e.parentElement.classList.contains('vl-glass-board__row')).length - document.querySelectorAll('.vl-glass-board__card').length",
"expect": 0,
"tol": 0
},
{
"name": "marge de fond ≥ gouttière (le liseré de dégradé qui fait flotter les modules)",
"measure": "num('.vl-glass-board','paddingLeft') - num('.vl-glass-board','rowGap')",
"min": 0
},
{
"name": "les modules laissent respirer le fond : ils tiennent sous 95 % de la largeur",
"measure": "box('.vl-glass-board__card--wide').w / W",
"max": 0.95
},
{
"name": "format PPT : la scène est en 16:9",
"measure": "W / H",
"expect": 1.7778,
"tol": 0.01
},
{
"name": "contraste du libellé sur le verre ≥ 7 (fond effectif = le dégradé composité)",
"measure": "contrast('.vl-glass-board__label')",
"min": 7
},
{
"name": "aucun débordement du contenu hors d'un module",
"measure": "overflow('.vl-glass-board__card--wide')",
"max": 0
}
],
"notes": "Le contrôle d'alpha est le cœur du pattern : c'est la seule chose qui porte la hiérarchie, et c'est la première à disparaître quand quelqu'un « nettoie » les rgba en couleurs pleines. Le benchmark « deux couches et pas trois » est là parce que la faute est tentante et invisible à la mesure classique : glisser un panneau translucide de plus entre le fond et les modules ne casse aucun alignement, il écrase juste la profondeur — le fond n'est alors plus jamais vu à nu, et les modules cessent de flotter. Deux pièges payés en plus : (1) `bgOf()` du harnais COMPOSITE les couches translucides pour établir le fond effectif d'une mesure de contraste — un verre à 0,45 n'est ni ignoré ni traité comme opaque ; (2) un dégradé posé en `background` seul laisse `backgroundColor` transparent, les fonds colorés déclarent donc `background-color` ET `background-image`, sinon aucune mesure de contraste n'est possible.",
"id": "layout-03-glass-board"
}
À côté
card-09-gradient-metric-curve
KPI sur aplat coloré à courbe annotée
chart-03-accent-column-callout
Histogramme à colonne accentuée et info-bulle
layout-01-nested-bento
Bento à cartes imbriquées
layout-02-swiss-frame
Cadre suisse header / footer
layout-04-graph-paper-cells