Un système de mise en page flexbox à axes X / Y : des groupes horizontaux ou verticaux (
flex-x/flex-y) remplis de cellules (cell), sur un moteurgapmoderne, sans marges ni paddings négatifs.
Le préfixe est flex- (pas grid-) car c'est bien du flexbox, à distinguer de CSS Grid Layout.
D'où ça vient. Gridaflex reprend l'API et les noms de classes d'une grille historique très répandue (la grille XY de Foundation), pour que les équipes n'aient rien à réapprendre — mais son moteur est entièrement modernisé. Là où l'ancienne grille simulait les gouttières avec des marges/paddings négatifs (sources de conflits avec
gap/flex/CSS Grid), Gridaflex utilise directementcolumn-gap/row-gap.
| Concept | Approche héritée | Gridaflex |
|---|---|---|
| Gouttières (gap) | marges négatives + marges sur cellules | column-gap / row-gap par axe |
| Gouttières padding | padding + marge négative de compensation | padding interne (border-box) |
| Valeur de gouttière | recopiée dans chaque media-query | variables CSS d'axe --flex-gap-x / --flex-gap-y |
| Largeur d'une cellule | calc(% - gutter) (approximatif) |
calc(f·100% − (1−f)·gap) — exact, gap-aware, sans override |
La formule clé : pour une cellule de fraction f, dans une grille à gouttière g,
la largeur exacte est f·100% − (1−f)·g. Vérifiable : 3 cellules desktop-4 (f = 1/3)
donnent chacune 33.33% − 0.667g, soit (100% − 2g) / 3. ✔
npm install gridaflex| Votre besoin | Mode | Comment |
|---|---|---|
| Juste les classes, sans build Sass | CSS compilé | un <link> vers le .min.css |
| Les classes, mais avec vos réglages (colonnes, breakpoints, gouttières) | Sass + config | un fichier de config (voir plus bas) |
| Une grille sémantique (vos propres sélecteurs, pas de classes utilitaires) | API Sass | les mixins xy-flex* |
=== "CSS compilé"
```html
<link rel="stylesheet" href="node_modules/gridaflex/dist/gridaflex.min.css">
```
=== "Sass + config (recommandé)"
```scss
// Surcharger les réglages AVANT d'émettre les classes
@use 'gridaflex/src/settings' with ($flex-columns: 12);
@use 'gridaflex/src/classes';
```
=== "API Sass sémantique"
```scss
@use 'gridaflex' as flex;
.galerie {
@include flex.xy-flex;
@include flex.xy-flex-margin(xy);
@include flex.xy-flex-layout(3, '.item');
}
```
🤖 Vous codez avec un assistant IA ? Le package fournit
llms.txtetgridaflex.skill.mdà embarquer dans votre projet pour qu'il maîtrise la grille — voir Assistant IA.
- Groupes :
flex-x,flex-y,cell - Gouttières (gap, par axe) :
flex-gap-x(=column-gap),flex-gap-y(=row-gap),flex-gap/flex-gap-xy(les deux). Padding :flex-padding-x/y/xy. Alias de compat :flex-margin-*. - Conteneur :
flex-container,.fluid,.full - Tailles :
phone-1…phone-12(ettablet-portrait-,desktop-, … selon vos breakpoints) - Auto :
auto,shrink,[bp]-auto,[bp]-shrink - Offsets :
[bp]-offset-[n] - Block grid :
[bp]-up-[n] - Collapse :
[bp]-gap-collapse(alias[bp]-margin-collapse),[bp]-padding-collapse - Frame :
flex-frame,[bp]-flex-frame,cell-block,cell-block-y,cell-block-container - Alignement :
align-left/right/center/justify/spaced,align-top/middle/bottom/stretch,align-self-*,align-center-middle - Ordre :
[bp]-order-[n] - Helpers flex :
flex-box,flex-dir-*,flex-child-*(+ variantes responsive) - Visibilité :
show-for-[bp],hide-for-[bp],show-for-[bp]-only,hide-for-[bp]-only,hide,invisible,visible
<div class="flex-container">
<div class="flex-x flex-gap-x">
<div class="cell tablet-portrait-6 desktop-4">12 / 6 / 4</div>
<div class="cell tablet-portrait-6 desktop-8">12 / 6 / 8</div>
</div>
</div>Les breakpoints sont renommables et extensibles. Les classes de grille et le mixin breakpoint() se génèrent à partir de vos noms.
@use 'gridaflex/src/settings' with (
$breakpoints: (
'phone': 0, // le premier DOIT valoir 0
'tablet-portrait': 600px,
'tablet-landscape': 900px,
'desktop': 1200px,
'big-desktop': 1800px,
),
$breakpoint-classes: (phone tablet-portrait tablet-landscape desktop big-desktop)
);
@use 'gridaflex/src/classes';Vous obtenez alors phone-12, desktop-6, tablet-portrait-up-3, desktop-offset-2, big-desktop-auto… Ajouter un breakpoint = ajouter une clé.
Reprend la logique Foundation (limites en em, compatibles zoom) :
@use 'gridaflex' as flex;
.menu {
@include flex.breakpoint(tablet-portrait only) { flex-direction: column; }
@include flex.breakpoint(desktop) { gap: 24px; } // et au-dessus
@include flex.breakpoint(desktop down) { padding: 8px; }
@include flex.breakpoint(768px) { font-size: 14px; } // valeur brute → em
@include flex.breakpoint(landscape) { height: 100vh; }
@include flex.breakpoint(retina) { /* @2x */ }
}| Forme | Génère |
|---|---|
breakpoint(X) |
X et au-dessus (min-width) |
breakpoint(X down) |
X et en-dessous (max-width) |
breakpoint(X only) |
la plage exacte |
breakpoint(768px) |
valeur px/rem/em → em |
breakpoint(landscape|portrait) |
orientation |
breakpoint(retina) |
résolution HiDPI |
Mêmes classes que Foundation : show-for-[bp], hide-for-[bp], show-for-[bp]-only, hide-for-[bp]-only, plus .hide / .invisible / .visible et les variantes landscape/portrait. Mixins équivalents : show-for($bp), hide-for($bp), show-for-only($bp), hide-for-only($bp).
Le principe : un seul fichier d'entrée qui (1) règle les variables puis (2) émet les classes. C'est le seul endroit où configurer Gridaflex.
1. Copiez le template gridaflex.config.example.scss
dans votre projet, par ex. _gridaflex-settings.scss :
cp node_modules/gridaflex/gridaflex.config.example.scss src/styles/_gridaflex-settings.scss2. Ajustez vos réglages dans le with (…) (colonnes, breakpoints, gouttières).
3. Importez ce fichier depuis votre bundle principal — et lui seul (il émet déjà les classes) :
// main.scss
@use 'gridaflex-settings';Le contenu type du fichier de config :
// _gridaflex-settings.scss
@use 'gridaflex/src/settings' with (
$flex-columns: 12,
$breakpoints: ('phone': 0, 'tablet': 768px, 'desktop': 1200px),
$breakpoint-classes: (phone tablet desktop),
$flex-margin-gutters: ('phone': 16px, 'desktop': 24px),
);
@use 'gridaflex/src/classes'; // ← émet toutes les classes avec VOS réglages
⚠️ Ordre des@use(piège Sass classique).@use … with (…)doit être dans le premier fichier qui chargesettings. Mettez donc lewith (…)et l'@use 'src/classes'dans ce même fichier. Unwith (…)placé après coup, ou dans un autre fichier, sera ignoré (erreur Sass « module already loaded »).
flex-gap-x ne gère que l'axe horizontal (column-gap), flex-gap-y que le vertical (row-gap). Combinez-les, ou prenez le raccourci. Gap et padding sont indépendants et cumulables :
<div class="flex-x flex-gap-x">…</div> <!-- horizontal seul -->
<div class="flex-x flex-gap-x flex-gap-y">…</div> <!-- les deux, indépendamment -->
<div class="flex-x flex-gap-xy">…</div> <!-- les deux d'un coup -->
<div class="flex-x flex-gap-xy flex-padding-y">…</div> <!-- gap horizontal + padding vertical -->Les classes
flex-margin-*existent en alias de compatibilité (comportement identique) ; privilégiezflex-gap-*dans le code neuf.
Les gouttières vivent dans des variables CSS d'axe, surchargeables par instance :
<div class="flex-x flex-gap-x" style="--flex-gap-x: 8px">…</div>
<div class="flex-x flex-gap-xy" style="--flex-gap-x: 8px; --flex-gap-y: 16px">…</div>| Variable | Défaut |
|---|---|
$flex-container |
1200px |
$flex-columns |
12 |
$breakpoints |
phone 0, tablet-portrait 600px, tablet-landscape 900px, desktop 1200px, medium-desktop 1440px, big-desktop 1800px |
$breakpoints-hidpi |
hidpi-1 1, hidpi-1-5 1.5, hidpi-2 2, retina 2, hidpi-3 3 |
$breakpoint-classes |
phone tablet-portrait tablet-landscape desktop medium-desktop big-desktop |
$print-breakpoint |
null (désactivé) |
$flex-margin-gutters |
phone 16px, tablet-portrait 24px |
$flex-padding-gutters |
$flex-margin-gutters |
$gutters |
default → $flex-margin-gutters (tailles de gap nommées) |
$padding-gutters |
default → $flex-padding-gutters (tailles de padding nommées) |
$xy-block-flex-max |
8 |
Compatibilité : les anciens noms
$grid-container,$grid-columns,$grid-margin-gutters,$grid-padding-gutters,$grid-container-padding,$xy-block-grid-maxrestent acceptés en alias dépréciés (unwith ($grid-columns: …)existant compile toujours). Préférez le préfixe$flex-.
Dans la quasi-totalité des cas : on remplace la feuille de styles, rien d'autre.
flex-margin-xcollé aux bords ne nécessite plusbody { overflow-x: hidden }.- Push/Pull non repris (déprécié côté Foundation) → utilisez
[bp]-order-[n]. - Plus aucun conflit avec vos
gapmaison — c'est tout l'objectif.
npm run build # dist/gridaflex.css + dist/gridaflex.min.css
npm run watch # recompilation à la voléeLe site de documentation est construit avec Zensical (équipe Material for MkDocs). Sources Markdown dans docs/, configuration dans zensical.toml. Il inclut un constructeur de grille interactif (docs/builder.md).
# Outils (une fois) : Python + Zensical
python3 -m venv .venv && .venv/bin/pip install zensical
# Aperçu local (recompile le CSS puis sert avec live-reload)
npm run docs:css && .venv/bin/zensical serve
# Build statique → site/
npm run docs:css && .venv/bin/zensical buildLa documentation est versionnée et publiée sur GitHub Pages via mike. Le détail du process (build, déploiement d'une version, version par défaut) est décrit dans docs/demarrage.md et VERSIONING.md. Pensez à ajuster site_url dans zensical.toml.
MIT