Files
design-system/tokens.css

193 lines
5.9 KiB
CSS

/* ==========================================================================
@transformer/ui — tokens.css
Schéma canonique de tokens. Nommage par RÔLE, jamais par couleur brute.
Les valeurs ci-dessous sont le thème NEUTRE par défaut ; chaque site les
surcharge via un fichier theme/*.css (palette + polices UNIQUEMENT).
Échelle fluide calibrée entre 360px (22.5rem) et 1280px (80rem).
Breakpoints (constantes, voir PROTOCOLE.md) :
base 360 · sm 480 · md 768 · lg 1024 · xl 1280
Tout le fichier vit dans @layer tf-tokens : un theme/*.css (non-layeré)
gagne TOUJOURS sur ces valeurs, quel que soit l'ordre de chargement.
========================================================================== */
@layer tf-tokens, tf-reset;
@layer tf-tokens {
:root {
color-scheme: light dark;
/* --- Couleur : rôles (mode clair par défaut) --------------------------- */
--bg: #ffffff;
--bg-alt: #f5f5f3;
--surface: #ffffff;
--surface-2: #eeeeeb;
--text: #1b1b1f;
--text-muted: #4b4b52;
--text-subtle: #6e6e76;
--border: #e0e0dd;
--border-strong: #a8a8a2;
--primary: #1b1b1f;
--primary-hover: #333338;
--on-primary: #ffffff;
--accent: #1b1b1f;
--on-accent: #ffffff;
--link: #1d4ed8;
--link-hover: #1e40af;
--focus-ring: #2563eb;
--success: #15803d;
--warning: #a16207;
--danger: #b91c1c;
/* --- Ombres (discrètes ; surchargées en sombre) ------------------------ */
--shadow-sm: 0 1px 2px rgb(0 0 0 / 0.06);
--shadow-md: 0 4px 12px rgb(0 0 0 / 0.08);
--shadow-lg: 0 12px 32px rgb(0 0 0 / 0.12);
/* --- Typographie ------------------------------------------------------- */
--font-heading: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
--font-body: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
--font-mono: ui-monospace, "Cascadia Code", "JetBrains Mono", Menlo, monospace;
/* Échelle fluide 360→1280 (min → max) */
--fs-xs: clamp(0.75rem, 0.728rem + 0.098vw, 0.8125rem); /* 12 → 13 */
--fs-sm: clamp(0.875rem, 0.851rem + 0.109vw, 0.9375rem); /* 14 → 15 */
--fs-base: clamp(1rem, 0.951rem + 0.217vw, 1.125rem); /* 16 → 18 */
--fs-lg: clamp(1.125rem, 1.076rem + 0.217vw, 1.25rem); /* 18 → 20 */
--fs-xl: clamp(1.25rem, 1.152rem + 0.435vw, 1.5rem); /* 20 → 24 */
--fs-2xl: clamp(1.5rem, 1.304rem + 0.87vw, 2rem); /* 24 → 32 */
--fs-3xl: clamp(1.875rem, 1.533rem + 1.522vw, 2.75rem); /* 30 → 44 */
--fs-4xl: clamp(2.25rem, 1.761rem + 2.174vw, 3.5rem); /* 36 → 56 */
--lh-tight: 1.15;
--lh-base: 1.6;
--lh-loose: 1.75;
--fw-regular: 400;
--fw-medium: 500;
--fw-semibold: 600;
--fw-bold: 700;
/* --- Spacing (base 4/8px, fluide sur les grands paliers) --------------- */
--space-2xs: 0.25rem; /* 4 */
--space-xs: 0.5rem; /* 8 */
--space-sm: 0.75rem; /* 12 */
--space-md: 1rem; /* 16 */
--space-lg: 1.5rem; /* 24 */
--space-xl: 2rem; /* 32 */
--space-2xl: clamp(2.5rem, 1.913rem + 2.609vw, 4rem); /* 40 → 64 */
--space-3xl: clamp(4rem, 3.217rem + 3.478vw, 6rem); /* 64 → 96 */
/* --- Rayons ------------------------------------------------------------ */
--radius-sm: 0.25rem;
--radius-md: 0.5rem;
--radius-lg: 1rem;
--radius-full: 999px;
/* --- Layout ------------------------------------------------------------ */
--container-max: 75rem; /* ~1200px */
--container-pad: clamp(1rem, 0.609rem + 1.739vw, 2rem); /* 16 → 32 */
/* --- Z-index ------------------------------------------------------------ */
--z-nav: 100;
--z-overlay: 200;
--z-modal: 300;
--z-toast: 400;
/* --- Motion ------------------------------------------------------------ */
--dur-fast: 150ms;
--dur-base: 250ms;
--dur-slow: 400ms;
--ease-out: cubic-bezier(0.22, 1, 0.36, 1);
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
--ease-spring: cubic-bezier(0.34, 1.4, 0.64, 1);
}
/* ==========================================================================
Mode sombre — deux portes d'entrée, le toggle explicite gagne toujours :
1. préférence système (tant que data-theme n'est pas forcé à "light")
2. attribut data-theme="dark" posé par le toggle du site
Un theme/*.css surcharge ces mêmes blocs avec sa palette.
========================================================================== */
:root[data-theme="dark"] {
--bg: #121214;
--bg-alt: #18181b;
--surface: #1e1e21;
--surface-2: #26262a;
--text: #ededf0;
--text-muted: #b4b4bb;
--text-subtle: #8b8b93;
--border: #2f2f34;
--border-strong: #4d4d55;
--primary: #ededf0;
--primary-hover: #ffffff;
--on-primary: #121214;
--accent: #ededf0;
--on-accent: #121214;
--link: #8ab4f8;
--link-hover: #aecbfa;
--focus-ring: #8ab4f8;
--success: #34d399;
--warning: #fbbf24;
--danger: #f87171;
--shadow-sm: 0 1px 2px rgb(0 0 0 / 0.4);
--shadow-md: 0 4px 12px rgb(0 0 0 / 0.45);
--shadow-lg: 0 12px 32px rgb(0 0 0 / 0.55);
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--bg: #121214;
--bg-alt: #18181b;
--surface: #1e1e21;
--surface-2: #26262a;
--text: #ededf0;
--text-muted: #b4b4bb;
--text-subtle: #8b8b93;
--border: #2f2f34;
--border-strong: #4d4d55;
--primary: #ededf0;
--primary-hover: #ffffff;
--on-primary: #121214;
--accent: #ededf0;
--on-accent: #121214;
--link: #8ab4f8;
--link-hover: #aecbfa;
--focus-ring: #8ab4f8;
--success: #34d399;
--warning: #fbbf24;
--danger: #f87171;
--shadow-sm: 0 1px 2px rgb(0 0 0 / 0.4);
--shadow-md: 0 4px 12px rgb(0 0 0 / 0.45);
--shadow-lg: 0 12px 32px rgb(0 0 0 / 0.55);
}
}
} /* @layer tf-tokens */