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

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

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

ecranverreglassmorphismdepolifloubackdropdegradedeux-couchesdashboardtranslucideprofondeur

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.

assertionmesureattendu
le module est translucide : le dégradé passe au traversNumber((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-blocnum('.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 : 01 ± 0
aucune bordure dessinée : c'est le liseré de lumière qui découpenum('.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').length0 ± 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 largeurbox('.vl-glass-board__card--wide').w / W≤ 0.95
format PPT : la scène est en 16:9W / H1.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 moduleoverflow('.vl-glass-board__card--wide')≤ 0

Le code

fragment — 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>
tokens de la charte — 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é