FR EN

Chapitre 09Construire

Charte et styles

Un seul fichier à reprendre pour habiller un site. Comment les tokens du schéma deviennent des classes, et pourquoi le client ne choisit jamais une couleur libre.

5 min de lecture9 sectionsChapitre 9 / 22

Deux fichiers, deux responsabilités

FichierContientSe modifie
src/styles/theme.css le site Les valeurs : palette, échelle typographique, graisses, rythme. à chaque site
inline-core/styles/tokens.css le paquet La correspondance : une classe par valeur du schéma, pointant vers une variable. jamais

Cette séparation n'est pas cosmétique. Une classe manquante dans tokens.css et un token accepté par le schéma donneraient un contenu valide qui ne s'affiche pas — un bug invisible en revue. Les deux fichiers vivent donc ensemble, versionnés ensemble.

La charte du site

C'est le seul fichier à reprendre pour habiller un nouveau site. Il ne définit que des variables :

src/styles/theme.css css
:root {
  /* Palette — un nom de token du schéma, une variable */
  --color-primary: #101828;
  --color-secondary: #344054;
  --color-muted: #667085;
  --color-accent: #0b5cff;
  --color-inverse: #ffffff;

  --color-surface: #ffffff;
  --color-surface-alt: #f7f8fa;
  --color-border: #e4e7ec;

  /* Échelle typographique — un cran par valeur de l'enum « size » */
  --size-xs: 0.75rem;
  --size-sm: 0.875rem;
  --size-base: 1rem;
  --size-lg: 1.25rem;
  --size-xl: 1.5rem;
  --size-2xl: 2rem;
  --size-3xl: 2.75rem;

  /* Graisses — un cran par valeur de l'enum « weight » */
  --weight-thin: 100;
  --weight-light: 300;
  --weight-regular: 400;
  --weight-medium: 500;
  --weight-semibold: 600;
  --weight-bold: 700;

  --font-body: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
  --line-height: 1.5;

  --space-1: 0.5rem;
  --space-2: 1rem;
  --space-3: 1.5rem;
  --space-4: 2rem;
  --space-6: 3rem;
  --space-8: 4rem;

  --measure: 48rem;
}
Aucune variable ne doit disparaître

Chaque variable de couleur, de taille et de graisse correspond à une valeur du schéma. En retirer une revient à laisser un token du schéma sans effet : le client choisirait « très grand » et rien ne changerait. Vous pouvez changer les valeurs, jamais les noms.

La correspondance

tokens.css traduit chaque valeur d'enum en une classe. Aucune valeur en dur : que des variables, définies par le site.

inline-core/styles/tokens.css (extrait) css
/* size */
.cms-size-xs   { font-size: var(--size-xs); }
.cms-size-base { font-size: var(--size-base); }
.cms-size-3xl  { font-size: var(--size-3xl); }

/* weight */
.cms-weight-regular  { font-weight: var(--weight-regular); }
.cms-weight-bold     { font-weight: var(--weight-bold); }

/* italic, align, color */
.cms-italic          { font-style: italic; }
.cms-align-center    { text-align: center; }
.cms-color-accent    { color: var(--color-accent); }

Le chemin complet, du fichier de contenu à l'écran :

"color": "accent" enum Zod classe .cms-color-accent var(--color-accent) #0b5cff

Et dans l'autre sens : le bouton « accent » de la barre d'outils est construit à partir de la même liste que celle dont Zod tire son enum. Il ne peut donc pas exister de bouton proposant une valeur que le build refuserait — il n'y a pas deux listes à tenir d'accord.

Habiller un nouveau site

  1. Reprendre la palette

    Cinq couleurs de contenu (primary, secondary, muted, accent, inverse) et trois couleurs d'interface (surface, surface-alt, border). C'est peu, et c'est volontaire : cinq couleurs se choisissent bien, quinze se choisissent mal.

  2. Poser l'échelle typographique

    Sept crans, de xs à 3xl. Gardez un rapport constant entre les crans plutôt que des valeurs choisies une par une : c'est ce qui empêche une page de dépareiller quand le client change une taille.

  3. Choisir la police

    --font-body. Une police auto-hébergée se déclare ici, avec sa règle @font-face :

    css css
    @font-face {
      font-family: 'Inter';
      src: url('/fonts/inter.woff2') format('woff2');
      font-weight: 100 900;
      font-display: swap;
    }
    
    :root {
      --font-body: 'Inter', system-ui, sans-serif;
    }

    Les fichiers de police vont dans public/fonts/ — contrairement aux images de contenu, ils ne passent pas par <Image /> et n'ont rien à faire dans src/media.

  4. Vérifier avec du vrai contenu

    npm run dev suffit : la mise en page se travaille sans les fonctions. Testez chaque cran de taille et chaque couleur au moins une fois — un token jamais utilisé est un token jamais vérifié.

La mise en page

tokens.css embarque aussi un squelette de mise en page minimal (.page, .site-nav, .site-footer, .hero, .showcase, .testimonials, .site-langs). Il sert au gabarit livré et aux pages /admin et /aide, pour qu'un site neuf ne soit pas nu.

Comment s'en écarter

Ces classes ne sont pas un cadre imposé. Pour une mise en page propre au site, écrivez la vôtre : dans theme.css après l'import (la spécificité est identique, l'ordre décide), ou en styles scopés dans vos composants Astro — ce qui est préférable, parce que le style reste avec la structure qu'il habille.

Ce que le client peut changer

Au clic sur un texte, une barre propose exactement cinq réglages :

RéglageCe qu'il voitCe qui est écrit
Taillesept crans, du plus petit au plus grand"size": "2xl"
Épaisseursix graisses"weight": "semibold"
Italiqueun interrupteur"italic": true
Alignementgauche, centre, droite"align": "center"
Couleurcinq pastilles de sa charte"color": "accent"

Sur un champ richtext, la barre propose gras, italique, lien et listes — et rien d'autre : ce sont exactement les balises que l'assainissement laisse passer.

Ce qui ne peut pas arriver

Un hexadécimal dans le contenu. Une taille en pixels. Une police collée depuis un traitement de texte. Un style="" en ligne. Toutes ces formes sont soit impossibles à produire depuis l'interface, soit retirées à l'assainissement, soit refusées par le schéma. Le client ne peut pas dépareiller la page, même en essayant.

Le collage depuis un traitement de texte

C'est le cas qui arrive dès la première semaine. Un paragraphe collé depuis Word apporte ses polices, ses tailles en points, ses couleurs et une pile de balises invisibles. Le nettoyage à la saisie écrase tout, sans exception : il ne reste que le texte, le gras et l'italique.

Sans cela, la page se retrouve avec du Calibri 11 pt en plein milieu de la charte — et personne ne s'en aperçoit avant que le client ne s'en plaigne.

Ajouter un token de style

Ajouter une valeur (une sixième couleur, un huitième cran de taille) se fait dans le paquet, en trois endroits qui doivent bouger ensemble :

  1. src/style-tokens.ts — la liste, source unique ;
  2. styles/tokens.css — la classe correspondante ;
  3. la charte de chaque site — la variable, sinon la classe pointe vers rien.
Le coût réel

Le schéma tire ses enums du premier fichier : la modification est donc une évolution du modèle de contenu, à propager à tous les sites. Retirer une valeur invaliderait le contenu publié qui l'utilise : c'est une version majeure, même si le code compile.

Vérifications

  • Chaque variable attendue par tokens.css existe dans theme.css.
  • Les cinq couleurs de contenu sont lisibles sur les surfaces où elles apparaissent.
  • inverse est lisible sur les fonds sombres — c'est sa seule raison d'être.
  • Les sept crans de taille restent hiérarchisés à l'écran.
  • Le contraste des textes courants atteint 4,5:1 (AA).
  • La page tient sur un écran de 360 px de large.