Grilles

Kuik propose une grille modulable. Par défaut, elle est constituée de 12 colonnes, ainsi que de 2 colonnes supplémentaires sur chaque côté en guise de marge.

Les grilles utilisent le module CSS grid.

Utilisation

Déclaration d'une grille

Pour utiliser une disposition faisant appel à une grille, la première chose à faire est d'utiliser la classe .l-grid sur l'élément parent qui contiendra tous les contenus à positionner dans la grille.

Kuik embarque 2 modes de positionnement de grilles :

Grille centrée avec marges

C'est l'affichage par défaut de la grille :

<div class="l-grid">
    <!-- 1 colonne de marge + 12 colonnes + 1 colonne de marge -->
</div>

La mise en page de cette grille se découpe de cette façon :

1        2  3  4  5  6      ...        12  13       14
|        |                                  |        |
|        |        ... 12 colonnes ...       |        |
|        |                                  |        |
\ full-width             ...              full-width /
         \ content       ...        content /
\  [1]   /                                  \   [2]  /

[1] margin-start
[2] margin-end

Grille élargie

La grille élargie ne compte que 12 colonnes réparties sur toute la largeur de l'élément englobant. Pour utiliser cette grille élargie, l'attribut data-layout="columns" doit être ajouté à l'élément englobant.

<div class="l-grid" data-layout="columns">
    <!-- 12 colonnes -->
</div>

La mise en page de cette grille se découpe de cette façon :

1  2  3  4  5      ...        11  12
|                                  |
|        ... 12 colonnes ...       |
|                                  |
\ content       ...        content /

Grilles personnalisées

Il est possible de créer de nouvelles dispositions de grilles. L'utilisation de ces grilles personnalisées se fait via l'appel à l'identifiant de la grille dans l'attribut data-layout.

Par exemple :

<div class="l-grid" data-layout="custom">
    ...
</div>

Par défaut, une grille personnalisée adopte la même disposition que la grille centrée avec marges.

Les détails d'implémentations sont décrits ci-après.

Positionnement des cellules

Positionnement sur les colonnes

Pour positionner une cellule (ou "case") de la grille sur les colonnes, il est possible :

Si, par exemple, une cellule est placée à la 4e colonne (.l-pos-4) et doit occuper 3 colonnes (.l-col-3), alors la cellule occupera les colonnes 4, 5 et 6.

Attention, la numérotation des colonnes démarre à 1.

<div class="l-grid">
    <div class="l-col-1">
        ...
    </div>
    <div class="l-pos-4 l-col-3">
        ...
    </div>
    ...
</div>
Responsive

Il est possible d'indiquer qu'une cellule n'occupe pas le même nombre de colonnes selon la taille de l'écran. Voici comment procéder :

  1. Indiquer le nombre de colonnes occupées par la cellule sur l'écran le plus petit (par exemple .l-col-12)
  2. Puis ajouter des classes suffixées pour préciser le nombre de colonnes occupées sur les écrans plus grands (par exemple .l-col-6°md)

Selon les exemples décrits ci-dessus, la cellule occupera toute la largeur sur les petits écrans, puis la moitié de la grille à partir des écrans de taille intermédiaire (md).

Les suffixes correspondent aux valeurs suivantes :

Suffixe Dimensions
°xs >= 20rem (320px)
°sm >= 36rem (576px)
°md >= 48rem (768px)
°lg >= 62rem (992px)
°xl >= 75rem (1200px)
°xxl >= 87.5rem (1400px)

Note : le caractère ° a été choisi pour séparer la classe de son suffixe, car il est facilement accessible sur le clavier et n'a pas besoin d'être échappé en CSS.

Positionnement personnalisé

Dans les grilles personnalisées, il est possible d'utiliser la classe .l-cell sur la cellule. Cela lui permet d'adopter tous les styles nécessaires, dont 2 variables :

Variable Valeur par défaut Description
--cell-column-start content Nom de la colonne où la cellule commence
--cell-column-end content Nom de la colonne où la cellule s'arrête
<div class="l-grid" data-layout="custom">
    <div class="l-cell" data-slot="0">
        ...
    </div>
    <div class="l-cell" data-slot="1">
        ...
    </div>
    ...
</div>
[data-slot="0"] {
    --cell-column-start: full-width;
    --cell-column-end: full-width;
}

/* ... */

Note : la numérotation automatique des slots dans KSup commence à 0.

Personnalisation d'une grille

Pour les grilles personnalisées (reconnaissable à l'attribut data-layout="..."), certaines variables sont accessibles en CSS :

Variable CSS Valeur par défaut Utilisation
--grid-columns 12 Nombre de colonnes de la grille
--grid-min-margin-size var(--space-4) Marge minimale sur les côtés de la grille centrale
--grid-max-container-size var(--maxwidth-lg) Largeur maximale du contenu central
--grid-layout (voir code CSS) Définition de l'agencement de la grille
--grid-column-gap var(--space-0) Espacement entre les colonnes (gouttières)
--grid-row-gap var(--space-0) Espacement entre les lignes
--grid-offset 1 Nombre de colonnes à rajouter automatiquement quand on utilise .l-pos-…

Note : par défaut, le paramètre --grid-offset est positionné à 1, car la première colonne de la zone centrale de la grille par défaut démarre en réalité à la 2e position. La première colonne étant occupée par la marge.

Personnalisation des cellules

Enfin, dans chaque cellule définie, il est possible de positionner les éléments enfants sur la grille à l'aide de l'affichage en subgrid. Dans l'exemple précédent, voici comment l'implémentation a été réalisée :

<div class="l-grid" data-layout="example">
    <div class="l-cell" data-slot="1"><!-- subgrid -->
        <div class="card">
            <div class="card__content">...</div>
        </div>
    </div>
    <div class="l-cell" data-slot="2"><!-- subgrid -->
        <div class="card">
            <img class="card__background" src="/images/logo_anim_480p.gif" alt="">
            <div class="card__content">...</div>
        </div>
    </div>
    
    ...
    
</div>
[data-layout="example"] .card {
    display: contents; /* Astuce ici pour hériter de l'affichage subgrid de .l-cell */
}

[data-layout="example"] [data-slot="1"] {
    --cell-column-start: full-width;
    --cell-column-end: full-width;
}

[data-layout="example"] [data-slot="1"] .card__content {
    grid-column: content;
    padding: var(--space-4);
}

[data-layout="example"] [data-slot="2"] {
    --cell-column-start: full-width;

    position: relative;
}

[data-layout="example"] [data-slot="2"] .card__background {
    block-size: 100%;
    inline-size: 100%;
    object-fit: cover;
    object-position: center;
    position: absolute;
    z-index: -1;
}

[data-layout="example"] [data-slot="2"] .card__content {
    grid-column: content;
    padding: var(--space-4);
}

/* ... */

Exemples de grilles

Positionnement basique

.l-full-width
.l-content
.l-content.l-span-start
.l-content.l-span-end
.l-margin-start
.l-margin-end
.l-col-3.l-pos-1
.l-col-4.l-pos-8

Grille à colonnes

.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-2
.l-col-2
.l-col-2
.l-col-2
.l-col-2
.l-col-2
.l-col-3
.l-col-3
.l-col-3
.l-col-3
.l-col-4
.l-col-4
.l-col-4
.l-col-6
.l-col-6
.l-col-12
.l-col-1
.l-col-2
.l-col-3
.l-col-4
.l-col-2
.l-col-5
.l-col-6
.l-col-1
.l-col-7
.l-col-5
.l-col-8
.l-col-4
.l-col-9
.l-col-3
.l-col-10
.l-col-2
.l-col-11
.l-col-1
.l-col-12

Grille responsive

Largeur du container :
.l-col-12.l-col-4°sm.l-col-2°lg
.l-col-12.l-col-8°sm.l-col-3°lg
.l-col-12.l-col-5°sm.l-col-3°lg
.l-col-12.l-col-7°sm.l-col-4°lg

Grilles imbriquées

.l-col-8
.l-col-2
.l-col-2
.l-col-4
.l-col-4
.l-col-2
.l-col-1
.l-col-1
.l-col-5
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-7
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1
.l-col-1

Positionnement manuel des cellules

.l-col-3.l-pos-2
.l-col-4.l-pos-6

Grille avec colonnes automatiques

3 colonnes, 3 cellules
Col
Col
Col
3 colonnes, 4 cellules
Col
Col
Col
Col
12 colonnes, 3 cellules
Col
Col
Col
12 colonnes, 12 cellules
Col
Col
Col
Col
Col
Col
Col
Col
Col
Col
Col
Col

Exemple de grille personnalisée

Largeur du container :
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam cumque deleniti ducimus ipsum mollitia necessitatibus nemo omnis perspiciatis, porro quam rem repellendus, suscipit. Aut, deleniti doloremque dolorum ex fuga nam nihil, nobis possimus praesentium repudiandae tempore ullam. Accusamus at autem debitis doloribus error exercitationem facere ipsum magnam maiores, molestiae nihil pariatur quas quasi quod sint ullam voluptas. Adipisci aliquid commodi consequatur, consequuntur deleniti, eos in, ipsam itaque laboriosam molestias nobis odio officiis perferendis quo ratione. Ducimus earum fugit iure maiores, nesciunt quas vel veritatis. Accusamus ad architecto asperiores aspernatur at atque consectetur debitis dolor dolorem dolorum error est et expedita iure laboriosam, magnam molestiae mollitia nam natus neque nobis odio optio perspiciatis possimus qui quibusdam quis repellat reprehenderit sapiente sunt tempore temporibus ullam unde vel vitae voluptate voluptatibus. Dolore dolores et hic magnam qui? Facere fugiat iure magni obcaecati recusandae reprehenderit suscipit temporibus voluptates! Accusamus aut dolor doloremque eaque eius est explicabo id magni molestiae nostrum, odit officia pariatur qui quidem quo quod repellat, veritatis, voluptatibus. Ad asperiores at distinctio dolor doloremque, eius, est fuga ipsam odit perferendis quod sapiente sequi similique ullam voluptates! Ex illum magnam rem saepe. Assumenda autem consectetur dicta eum expedita, impedit in labore omnis unde!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequatur cum cumque, eaque eligendi eum facere nostrum officiis quia temporibus ullam! Architecto inventore maiores non omnis placeat quia repellat tempora vel! Ab ad, aliquid asperiores aspernatur aut commodi consequuntur corporis delectus dicta dolore enim eos explicabo facilis inventore iste iusto labore laboriosam laudantium maxime nobis nostrum nulla odio officia officiis pariatur provident quam quas quia ratione reiciendis sed, sequi sint sunt tempore tenetur velit veniam. Dignissimos eaque eveniet explicabo ipsa magnam quasi quia, ratione sit unde? Et iusto omnis repellat voluptas voluptatem? Alias atque aut dolor impedit nemo, non quod? Ab cum cumque hic magni placeat possimus tempore veritatis. Alias amet consectetur dicta dignissimos doloribus iure nemo nobis officia officiis omnis perspiciatis repudiandae temporibus, voluptas. Accusantium aliquam facere nam officiis provident quis suscipit vitae voluptatem. Dolorum et, ex fugit nostrum odio qui recusandae repellat sunt? Ab consectetur consequatur cupiditate delectus dignissimos eligendi error explicabo in iste, iure maxime odio omnis optio soluta tempora unde veniam voluptates. Architecto at autem commodi consectetur cumque debitis delectus deleniti doloremque facere facilis ipsam iste itaque labore minus natus, necessitatibus, nemo nisi, nobis optio perferendis possimus quas qui quibusdam quod reiciendis temporibus veritatis voluptas voluptate voluptatibus.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Autem cum dolorem error itaque iure laboriosam perferendis unde voluptate. Cupiditate, dolore eaque est harum in ipsam itaque, iure iusto libero magnam maiores, modi nesciunt officia perferendis praesentium quia quo rerum sint tempora veniam veritatis vero voluptate! Eligendi est expedita explicabo libero optio, quasi sunt suscipit voluptatum. Adipisci animi distinctio optio veniam? A at beatae dolorum enim fugiat inventore magni, nesciunt praesentium quasi vitae! A deserunt esse facilis hic incidunt placeat sit.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. A culpa possimus recusandae voluptatum? Accusantium adipisci, beatae esse exercitationem impedit natus nihil nisi rem rerum soluta vel vitae, voluptatem. Architecto atque dolore dolores eum explicabo facilis fugiat, inventore iure labore nam, neque nihil, odio placeat possimus quas quibusdam ratione sapiente tempora ullam voluptatum! Animi at consequatur doloremque ea enim laboriosam recusandae sequi. Ab, ad atque deleniti incidunt inventore provident similique vitae voluptatem. Aliquam asperiores beatae iste nemo? Ab alias aperiam cupiditate, eius eligendi esse, explicabo fuga ipsum libero molestiae nam neque nulla officia omnis, pariatur quae quis saepe sint soluta tenetur vel velit veritatis voluptas. Accusamus architecto facilis, maxime sed tempore vitae voluptas. Consectetur consequuntur culpa dolore, dolores dolorum eius expedita facilis id itaque maxime minima necessitatibus neque officiis omnis soluta! Adipisci aspernatur at atque autem commodi dignissimos distinctio dolorem doloremque ducimus earum eos facilis, fugiat id in libero odio perspiciatis reiciendis rem reprehenderit rerum soluta tempora tenetur voluptas voluptate voluptatem. Accusantium animi at debitis dolor esse eveniet excepturi exercitationem facere harum hic illum, impedit in inventore itaque magnam minus molestiae nam nesciunt nihil, placeat quasi recusandae rem, repellat sapiente sunt totam vero voluptate. Esse necessitatibus obcaecati, rem sint veritatis voluptates.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci animi atque corporis debitis doloribus enim ex fugiat harum id impedit ipsa ipsam molestias neque nesciunt nobis officia, perferendis quisquam quod quos reiciendis saepe, sed ut veritatis voluptatem voluptatibus! Accusamus adipisci assumenda debitis distinctio eius eos nam nemo omnis quas unde!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus ad amet aut autem debitis eligendi enim est excepturi exercitationem facilis molestiae molestias nesciunt nisi odio officiis provident quam, sint sit, totam vel. Aperiam consectetur deserunt distinctio ducimus fugit ipsum, iste itaque, magnam, magni odit possimus quas qui rem reprehenderit sed.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias aliquam at, commodi culpa doloremque enim eum, inventore ipsa laboriosam natus obcaecati perferendis repellat voluptate. Dolores enim eos itaque! Error incidunt maiores unde? Accusantium ducimus, et ex excepturi omnis quaerat quis sed sunt veniam! Accusamus aliquid beatae commodi eum impedit ipsum, laborum reprehenderit sint suscipit? Ad aliquid animi commodi consectetur consequatur delectus dolor dolore ea exercitationem, explicabo facere fugiat officiis omnis quae saepe sit voluptates? A alias assumenda at autem consequuntur cumque cupiditate debitis, dignissimos dolorem eaque ex excepturi exercitationem expedita fugiat laudantium molestiae optio praesentium quos repellat soluta suscipit veniam veritatis vero voluptatibus voluptatum! Amet commodi debitis deserunt dolores eaque, eius est facere illo minima perferendis, rem reprehenderit voluptas voluptates! Ab aliquid amet aut consequatur debitis, dolore error eum eveniet ex facere hic ipsa iure minus natus necessitatibus nulla officia placeat praesentium quaerat quibusdam quidem rem sed sit velit voluptatibus? Aliquam amet aperiam aspernatur cum dicta dolore dolorum exercitationem fugiat incidunt iste labore libero minima, nulla, perferendis placeat possimus, quibusdam quod quos reprehenderit repudiandae sint sunt ullam velit vero voluptas! Dolorum expedita maxime provident quaerat quis? Aperiam, autem, delectus eos harum hic ipsam, maiores nobis numquam perspiciatis placeat qui voluptate?

Utilitaire affichage "flexbox"

Un ensemble de classes utilitaires dédiées à l'affichage "flexbox"

Pour utiliser l'affichage "flexbox" sur un élément, utiliser la classe .l-flex.

Direction de l'affichage

Classe Description
.l-flex-row Agencement horizontal, dans le sens de lecture
.l-flex-row-reverse Agencement horizontal, dans le sens inverse de la lecture
.l-flex-column Agencement vertical, dans le sens de lecture
.l-flex-column-reverse Agencement vertical, dans le sens inverse de la lecture
.l-flex-wrap Utiliser autant de lignes (ou de colonnes) que nécessaire
.l-flex-nowrap Tout consenser sur une seule ligne (ou colonne)

Justification des éléments

La justification des éléments permet de les agencer au sein d'une même ligne (ou colonne selon la direction d'affichage choisie).

Classe Description
.l-flex-start Aligner les éléments au début
.l-flex-end Aligner les éléments à la fin
.l-flex-center Aligner les éléments au centre
.l-flex-space-between Maximiser l'espace entre les éléments
.l-flex-space-around Chaque élément possède une marge maximale
.l-flex-space-evenly Chaque espace autour des éléments est le même

Alignement du contenu

L'alignement du contenu permet d'aligner verticalement (ou horizontalement selon la direction d'affichage choisie) l'ensemble des éléments au sein du conteneur.

Classe Description
.l-flex-content-start Le contenu est aligné au début du bloc
.l-flex-content-end Le contenu est aligné à la fin du bloc
.l-flex-content-center Le contenu est aligné au centre du bloc
.l-flex-content-stretch Le contenu s'étire sur tout le bloc
.l-flex-content-space-between Maximiser l'espace entre les lignes (ou colonnes)
.l-flex-content-space-around Chaque ligne possède une marge verticale (ou horizontale) maximale
.l-flex-content-space-evenly Chaque espace autour des lignes est le même

Alignement des éléments

L'alignement des éléments permet d'aligner verticalement (ou horizontalement selon la direction d'affichage choisie) les éléments au sein d'une même ligne (ou colonne).

Classe Description
.l-flex-items-start Les éléments sont alignés au début
.l-flex-items-end Les éléments sont alignés à la fin
.l-flex-items-center Les éléments sont alignés au centre
.l-flex-items-stretch Les élément sont étirés sur la ligne (ou la colonne)

Dimension des éléments

Les classes de dimensionnement des éléments permettent de leur attribuer des comportements spécifiques liés à leur taille quand ils se trouvent sur une même ligne (ou colonne).

Classe Description
.l-flex-shrink-1 Permettre la réduction de l'élément
.l-flex-shrink-0 Ne pas permettre la réduction de l'élément
.l-flex-grow-1 Agrandir l'élément autant que possible
.l-flex-grow-0 Ne pas agrandir l'élément autant que possible

Utilitaires divers

Il est possible de faire en sorte qu'un élément de la page s'étire en hauteur pour que la page occupe constamment 100% de la hauteur de l'écran, au minimum, même s'il n'y a pas assez de contenu.

Pour cela, 2 classes sont à utiliser :

<body class="l-expanded-body">
    <header> ... </header>
    <main class="l-expanded-body__expander">
        ...
    </main>
    <footer> ... </footer>
</body>