tokens.css
Tokens
Couleurs des thèmes clair et sombre, grille de 4px, rayons, ombres et polices, en variables CSS.
Documentation · version 1.0.0
LSSD UI réunit les couleurs, la typographie, les espacements et les composants de LSSD dans une librairie Tailwind CSS v4. Chaque outil l’importe à la construction de son image Docker : un utilisateur qui passe de LSSD Budget à LSSD Calendar reste dans la même maison.
tokens.css
Couleurs des thèmes clair et sombre, grille de 4px, rayons, ombres et polices, en variables CSS.
theme.css
Seules les couleurs LSSD existent : bg-surface, text-ink, bg-accent… La variante dark: suit data-theme.
typography.css
Des utilitaires prêts à l’emploi : title-1, title-2, body, label, small, text-overline…
components/
Bouton, champ, case à cocher, carte, badge et barre du haut, en classes lssd-.
La librairie ne contient que du CSS. Elle ne fournit ni JavaScript, ni gabarit de page : chaque outil écrit son HTML (templates Django, composants React…) avec ces classes.
ui.lssd.fr publie chaque version de la librairie dans une archive qui ne change plus jamais.
Un outil choisit une version, la télécharge pendant la construction de son image Docker,
vérifie son empreinte SHA-256, puis la compile avec Tailwind avec le reste de son CSS. Le navigateur ne
charge que le CSS compilé, servi par l’outil lui-même.
ui.lssd.fr dans une page :
Tailwind ne compile pas un CSS distant, et une panne du site casserait l’affichage de tous les outils.ui.lssd.fr est indisponible, seule la construction d’une image échoue ;
les outils en production continuent de fonctionner.Vous débutez ?
Les guides Django et Next.js détaillent chaque étape, du dossier vide à la mise en production, avec tous les fichiers à copier.
Version actuelle : 1.0.0, empreinte SHA-256 :
b34c40a92021933668b2da0fa9d52ab2b738d0a257890a8bc893260c3110c388Les autres versions et leurs empreintes sont sur la page Versions.
Ajoutez une étape au Dockerfile de l’outil. ADD --checksum refuse l’archive si
son empreinte ne correspond pas : personne ne peut la remplacer en cours de route.
# syntax=docker/dockerfile:1
# --- lssd-ui: the pinned LSSD UI library, checksum verified ---
FROM python:3.13-slim AS lssd-ui
ARG LSSD_UI_VERSION=1.0.0
ARG LSSD_UI_SHA256=b34c40a92021933668b2da0fa9d52ab2b738d0a257890a8bc893260c3110c388
ADD --checksum=sha256:${LSSD_UI_SHA256} \
https://ui.lssd.fr/releases/v${LSSD_UI_VERSION}/lssd-ui-${LSSD_UI_VERSION}.tar.gz /tmp/lssd-ui.tar.gz
RUN mkdir /out && tar -xzf /tmp/lssd-ui.tar.gz -C /out
Puis copiez-la à côté de l’entrée Tailwind, dans l’étape qui compile le CSS et dans l’étape de
développement, par exemple dans static/css/vendor/lssd-ui/ :
COPY --from=lssd-ui /out/lssd-ui/ static/css/vendor/lssd-ui/
Ajoutez static/css/vendor/ au .gitignore : la librairie n’est jamais commitée dans
l’outil, l’image la récupère à chaque construction.
/* static/css/input.css */
@import "tailwindcss";
@import "./vendor/lssd-ui/index.css";
/* Tell Tailwind where the classes are used. */
@source "../../templates";L’ordre compte : Tailwind d’abord, LSSD UI ensuite. Le CSS propre à l’outil, s’il en a, vient après et n’utilise que les variables de la librairie.
Projet sans Node (Django, site statique) : le CLI autonome de Tailwind, dans l’image.
RUN tailwindcss --input static/css/input.css --output static/css/app.css --minify
Projet Node : @tailwindcss/vite ou @tailwindcss/postcss, avec la même étape
lssd-ui et le même @import. Jamais de Tailwind chargé par CDN.
<!DOCTYPE html>
<html lang="fr" data-theme="light">
<head>
<link rel="preconnect" href="https://api.fontshare.com">
<link rel="preconnect" href="https://cdn.fontshare.com" crossorigin>
<link rel="stylesheet" href="https://api.fontshare.com/v2/css?f[]=general-sans@400,500,600,700&f[]=cabinet-grotesk@500,700,800&display=swap">
<link rel="stylesheet" href="/static/css/app.css">
</head>
<body class="bg-bg text-ink font-sans antialiased">
<header class="lssd-header">…</header>
</body>
</html>
Pensez à autoriser Fontshare dans la politique de sécurité du contenu (CSP) :
style-src 'self' https://api.fontshare.com et
font-src 'self' https://api.fontshare.com https://cdn.fontshare.com.
compose.override.yaml monte le code de l’outil dans le conteneur, ce qui masque le dossier
copié par l’image. Déclarez ce dossier comme volume anonyme : Docker le remplit avec le contenu de
l’image.
services:
web:
volumes:
- ./:/app
- /app/static/css/vendor
Après un changement de version, recréez ces volumes :
docker compose up -d --build --renew-anon-volumes.
Le thème clair s’applique par défaut. L’outil pose data-theme="light" ou
data-theme="dark" sur <html>, d’après le réglage de l’utilisateur ou, à
défaut, prefers-color-scheme. Posez l’attribut avant le premier affichage
(script chargé dans le <head>) pour éviter un flash de la mauvaise couleur.
// Before the first paint: stored choice, otherwise the system setting.
var stored = null;
try { stored = localStorage.getItem("lssd-theme"); } catch (error) {}
var dark = window.matchMedia("(prefers-color-scheme: dark)").matches;
document.documentElement.setAttribute("data-theme", stored || (dark ? "dark" : "light"));
Les variables changent de valeur avec l’attribut ; les classes ne changent pas. Pour un détail propre au
thème sombre, utilisez la variante dark: (par exemple dark:hidden sur une
icône).
LSSD_UI_VERSION et LSSD_UI_SHA256 dans le Dockerfile.docker compose up -d --build --renew-anon-volumes.Les numéros de version suivent la gestion sémantique :
| Changement | Exemple | Ce que vous faites |
|---|---|---|
Correctif 1.0.x | Contraste, focus, bug de navigateur | Mettez à jour sans risque. |
Mineure 1.x.0 | Nouveau composant, variante ou token | Mettez à jour sans risque. |
Majeure x.0.0 | Classe ou token renommé ou supprimé | Suivez les notes de version et vérifiez chaque écran. |
À faire
lssd- pour un bouton, un champ, une carte, un badge ou la barre du haut.class="lssd-btn lssd-btn--primary w-full".p-4, gap-6).var(--surface), var(--space-4).À ne pas faire
lssd-.bg-[#…]).Il manque un composant ? Il s’ajoute dans la librairie, pas dans l’outil : voyez la section suivante.
Toute évolution passe par le dépôt de LSSD UI, puis par une nouvelle version que chaque outil adopte à son rythme.
lib/ et vérifiez le rendu dans cette documentation
(docker compose up, puis http://localhost:8001).site/ : composant, règle ou token.VERSION et ajoutez sa section en tête de CHANGELOG.md.docker compose run --rm web python scripts/release.py.ui.lssd.fr. La construction de l’image refuse un changement de lib/ qui n’a pas été publié dans une nouvelle version.