CSS, JS

Si la structure HTML est déterminée dans les templates, la mise en page et le comportement interactif restent guidés par CSS et Javascript.

Pour intégrer des ressources CSS et JS, Kirby met en place un mécanisme spécifique :

<?php // dans /site/snippets/header.php :
<?php css("dossier/fichier.css") ?>
// et dans /site/snippets/footer.php :
<?php js("dossier/fichier.js") ?>

Ces instructions produiront :

<link href="http://localhost/portfolio/dossier/fichier.css" rel="stylesheet">
<!-- et -->
<script src="http://localhost/portfolio/dossier/fichier.js" type="text/javascript"></script>

Assets

Il est fréquent de regrouper l’ensemble des fichiers “statiques” (css, js, icônes…) dans un dossier /assets, à la racine du site. (assets ≈ ressources, actifs…)

<?php css("assets/css/styles.css") ?>

CSS

Kirby permet d’importer plusieurs feuilles de style en même temps:

<?php css(["assets/css/reset.css", "assets/css/styles.css"]) ?>

On peut également utiliser le mot clé @auto pour charger des fichiers spécifiques pour chaque template :

<?php css(["assets/css/common.css", "@auto"]) ?>

Les fichiers spécifiques à chaque template doivent être stockés dans le dossier /assets/css/templates et nommés de la même manière que le template :

/site/templates/project.php/assets/css/templates/project.css

Art directed pages

On peut parfois vouloir ajouter un style spécifique à un projet / une page du site sans vouloir modifier la CSS générale. Kirby décrit ce scénario ici.

En uploadant un ou plusieurs fichiers css (et js) depuis le panel, on peut simplement les appeler depuis le snippet header.php (et footer.php pour le javascript) :

/site/snippets/header.php
<?php 
$css_files = $page->files()->filterBy('extension', 'css');
foreach($css_files as $custom_css):
  echo css($custom_css->url());
endforeach;
?>

Une solution alternative pour pouvoir cibler des éléments dans des pages spécifiques est d’ajouter des class, un id ou des attributs data au body.

/site/snippets/header.php
<body
    data-page-id="<?= $page->slug() ?>"
    data-template="<?= $page->template() ?>"
    data-intended-template="<?= $page->intendedTemplate() ?>">
    <!-- 
      intendedTemplate() renvoit le nom du fichier txt du dossier `content`,
      même si aucun fichier correspondant n’existe dans le dossier `site/templates`
    -->

On peut alors cibler des éléments depuis la feuille de style grâce aux sélecteurs d’attributs :

[data-template="project"] h1 { font-size:4em; }
[data-id="mon-super-projet"] { background: tomato; }

Panel et mise en page

Les blueprints et le panel permettent de stocker dans les fichiers de contenu des informations qui vont aider à leur mise en page.

Par exemple, si l’on veut pouvoir “rythmer” l’affichage en grille de projets (beaucoup de projets sur une colonne, quelques projets sur deux colonnes), on peut autoriser la saisie de cette information depuis le blueprint :

/site/blueprints/pages/project.yml
fields:
  (…)
  is_important:
    label: Projet important
    type: toggle
    width: 1/4

Et utiliser cette information pour modifier la largeur d’une colonne :

/site/snippets/project.php
<article class="<?php if($project->is_important()->toBool()) { echo 'important'; }?> ">
/assets/css/style.css
.important { grid-column-end: span 2}