|
1 |
+/* ----------------------------------------------------------------------------- |
|
2 |
+ Auteur : Simon-Pierre Boucher — contact@spboucher.ai |
|
3 |
+ Fichier : ka-ui/tokens.css — SOURCE CANONIQUE (repo ka-ui sur spbgit) |
|
4 |
+ Desc. : Design system commun GROUPE KA « éditorial sharp » — tokens + socle |
|
5 |
+ de composants partagés par les 12 plateformes. Chaque site importe ce |
|
6 |
+ fichier PUIS surcharge uniquement son accent (voir accents.css). |
|
7 |
+ |
|
8 |
+ · Typo : display Space Grotesk / texte Inter / micro-étiquettes JetBrains Mono |
|
9 |
+ · Palette: papier #f5f3ee · encre #141814 · vert profond #1c5c41 + ACCENT du site |
|
10 |
+ · Signature : bordures encre 1,5–2 px + ombres décalées dures, grain de film, |
|
11 |
+ surlignés d'accent inclinés (néo-brutalisme raffiné) |
|
12 |
+ · Breakpoints communs : 360 / 768 / 1024 / 1440 px (mobile-first) |
|
13 |
+ · Zones tactiles ≥ 44×44 px, safe-areas iOS, typographie fluide (clamp) |
|
14 |
+----------------------------------------------------------------------------- */ |
|
15 |
+ |
|
16 |
+:root { |
|
17 |
+ /* ---- Palette fixe Groupe KA (identique sur les 12 sites) ---- */ |
|
18 |
+ --paper: #f5f3ee; |
|
19 |
+ --surface: #ffffff; |
|
20 |
+ --surface-2: #faf9f5; |
|
21 |
+ --ink: #141814; |
|
22 |
+ --ink-2: #4d5551; |
|
23 |
+ --ink-3: #8b928c; |
|
24 |
+ --line: rgba(20, 24, 20, 0.14); |
|
25 |
+ --line-strong: rgba(20, 24, 20, 0.85); |
|
26 |
+ --green: #1c5c41; |
|
27 |
+ --green-deep: #123f2e; |
|
28 |
+ --amber: #e8a33d; |
|
29 |
+ --amber-soft: #fdf3e2; |
|
30 |
+ --danger: #b3423a; |
|
31 |
+ --danger-soft: #fbe9e7; |
|
32 |
+ |
|
33 |
+ /* ---- ACCENT du site — SEULES variables surchargées par marque ---- */ |
|
34 |
+ --accent: #d9f26b; /* défaut : lime Groupe KA */ |
|
35 |
+ --accent-soft: #f0f9d2; |
|
36 |
+ --accent-deep: #123f2e; |
|
37 |
+ --on-accent: var(--ink); /* couleur du texte posé SUR l'accent */ |
|
38 |
+ |
|
39 |
+ /* alias rétro-compatibles (les satellites historiques utilisent --lime) */ |
|
40 |
+ --lime: var(--accent); |
|
41 |
+ --lime-soft: var(--accent-soft); |
|
42 |
+ |
|
43 |
+ /* ---- Géométrie sharp ---- */ |
|
44 |
+ --r-card: 10px; |
|
45 |
+ --r-ctl: 6px; |
|
46 |
+ --r-pill: 999px; |
|
47 |
+ |
|
48 |
+ /* ---- Ombres décalées — la signature du groupe ---- */ |
|
49 |
+ --shadow-flat: 0 1px 2px rgba(20, 24, 20, 0.05); |
|
50 |
+ --shadow-off: 6px 6px 0 var(--ink); |
|
51 |
+ --shadow-off-soft: 8px 8px 0 rgba(20, 24, 20, 0.08); |
|
52 |
+ --shadow-off-mid: 4px 4px 0 rgba(20, 24, 20, 0.18); |
|
53 |
+ |
|
54 |
+ /* ---- Typographie ---- */ |
|
55 |
+ --font-display: "Space Grotesk", system-ui, sans-serif; |
|
56 |
+ --font-body: "Inter", system-ui, sans-serif; |
|
57 |
+ --font-mono: "JetBrains Mono", ui-monospace, monospace; |
|
58 |
+ |
|
59 |
+ /* Échelle fluide (mobile-first, clamp) */ |
|
60 |
+ --fs-h1: clamp(30px, 3.2vw + 18px, 54px); |
|
61 |
+ --fs-h2: clamp(23px, 1.8vw + 14px, 34px); |
|
62 |
+ --fs-h3: clamp(17px, 0.9vw + 12px, 22px); |
|
63 |
+ --fs-body: 15px; |
|
64 |
+ --fs-small: 13px; |
|
65 |
+ |
|
66 |
+ /* Espacements */ |
|
67 |
+ --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px; |
|
68 |
+ --sp-5: 24px; --sp-6: 32px; --sp-7: 48px; --sp-8: 64px; |
|
69 |
+ |
|
70 |
+ /* Cible tactile minimale */ |
|
71 |
+ --touch: 44px; |
|
72 |
+} |
|
73 |
+ |
|
74 |
+/* ---- Socle ---- */ |
|
75 |
+* { box-sizing: border-box; } |
|
76 |
+html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; } |
|
77 |
+body { |
|
78 |
+ margin: 0; |
|
79 |
+ background: var(--paper); |
|
80 |
+ color: var(--ink); |
|
81 |
+ font-family: var(--font-body); |
|
82 |
+ font-size: var(--fs-body); |
|
83 |
+ line-height: 1.55; |
|
84 |
+ -webkit-font-smoothing: antialiased; |
|
85 |
+ padding-bottom: env(safe-area-inset-bottom); |
|
86 |
+ overflow-x: clip; /* jamais de débordement horizontal */ |
|
87 |
+} |
|
88 |
+img, svg, video { max-width: 100%; height: auto; display: block; } |
|
89 |
+h1, h2, h3, h4 { font-family: var(--font-display); letter-spacing: -0.03em; margin: 0 0 0.5em; } |
|
90 |
+h1 { font-size: var(--fs-h1); line-height: 1.06; } |
|
91 |
+h2 { font-size: var(--fs-h2); line-height: 1.15; } |
|
92 |
+h3 { font-size: var(--fs-h3); line-height: 1.25; } |
|
93 |
+a { color: inherit; } |
|
94 |
+::selection { background: var(--accent); color: var(--on-accent); } |
|
95 |
+:focus-visible { outline: 2px solid var(--green); outline-offset: 2px; } |
|
96 |
+ |
|
97 |
+/* Grain de film pleine page — ⚠️ jamais de z-index sur body > * (position: |
|
98 |
+ relative seulement), sinon les utilitaires z-* sont écrasés. */ |
|
99 |
+body::before { |
|
100 |
+ content: ""; |
|
101 |
+ position: fixed; inset: 0; pointer-events: none; opacity: 0.35; z-index: 9999; |
|
102 |
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3CfeComponentTransfer%3E%3CfeFuncA type='linear' slope='0.06'/%3E%3C/feComponentTransfer%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23n)'/%3E%3C/svg%3E"); |
|
103 |
+} |
|
104 |
+body > * { position: relative; } |
|
105 |
+ |
|
106 |
+/* ---- Conteneur commun ---- */ |
|
107 |
+.container { max-width: 1152px; margin: 0 auto; padding: 0 var(--sp-4); } |
|
108 |
+@media (min-width: 768px) { .container { padding: 0 var(--sp-5); } } |
|
109 |
+ |
|
110 |
+/* ---- Micro-typographie signature ---- */ |
|
111 |
+.kicker { |
|
112 |
+ display: inline-flex; align-items: center; gap: 10px; |
|
113 |
+ font-family: var(--font-mono); font-size: 11.5px; font-weight: 500; |
|
114 |
+ text-transform: uppercase; letter-spacing: 0.12em; color: var(--green); |
|
115 |
+} |
|
116 |
+.kicker::before { content: ""; width: 22px; height: 2px; background: var(--green); } |
|
117 |
+.klabel { |
|
118 |
+ font-family: var(--font-mono); font-size: 10px; font-weight: 700; |
|
119 |
+ text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-3); |
|
120 |
+} |
|
121 |
+.hl { |
|
122 |
+ display: inline-block; background: var(--accent); color: var(--on-accent); |
|
123 |
+ border-radius: 8px; padding: 0 10px 2px; transform: rotate(-1deg); |
|
124 |
+} |
|
125 |
+.outline-txt { color: transparent; -webkit-text-stroke: 2px var(--ink); } |
|
126 |
+ |
|
127 |
+/* ---- Boutons (cible ≥ 44 px) ---- */ |
|
128 |
+.btn { |
|
129 |
+ display: inline-flex; align-items: center; justify-content: center; gap: 8px; |
|
130 |
+ min-height: var(--touch); padding: 10px 18px; |
|
131 |
+ font-family: var(--font-display); font-weight: 700; font-size: 14px; |
|
132 |
+ border: 1.5px solid var(--ink); border-radius: var(--r-ctl); |
|
133 |
+ background: var(--surface); color: var(--ink); |
|
134 |
+ cursor: pointer; text-decoration: none; |
|
135 |
+ transition: transform 0.15s, box-shadow 0.15s, background 0.15s, color 0.15s; |
|
136 |
+} |
|
137 |
+.btn:hover { transform: translate(-2px, -2px); box-shadow: var(--shadow-off-mid); } |
|
138 |
+.btn:active { transform: translate(0, 0); box-shadow: none; } |
|
139 |
+.btn:disabled { opacity: 0.45; pointer-events: none; } |
|
140 |
+.btn-primary { background: var(--ink); color: var(--accent); } |
|
141 |
+.btn-primary:hover { background: var(--accent-deep); } |
|
142 |
+.btn-accent { background: var(--accent); color: var(--on-accent); } |
|
143 |
+.btn-ghost { background: transparent; border-color: var(--line); } |
|
144 |
+.btn-ghost:hover { border-color: var(--ink); } |
|
145 |
+ |
|
146 |
+/* ---- Cartes ---- */ |
|
147 |
+.card { |
|
148 |
+ background: var(--surface); border: 1.5px solid var(--ink); |
|
149 |
+ border-radius: var(--r-card); box-shadow: var(--shadow-off-soft); |
|
150 |
+ overflow: hidden; |
|
151 |
+} |
|
152 |
+.card-hover { transition: transform 0.15s, box-shadow 0.15s; } |
|
153 |
+.card-hover:hover { transform: translate(-2px, -2px); box-shadow: var(--shadow-off); } |
|
154 |
+ |
|
155 |
+/* ---- Chips / badges ---- */ |
|
156 |
+.chip { |
|
157 |
+ display: inline-flex; align-items: center; gap: 6px; |
|
158 |
+ padding: 4px 11px; font-family: var(--font-mono); font-size: 11px; font-weight: 700; |
|
159 |
+ text-transform: uppercase; letter-spacing: 0.06em; |
|
160 |
+ border: 1.5px solid var(--ink); border-radius: var(--r-pill); |
|
161 |
+ background: var(--surface); color: var(--ink); |
|
162 |
+} |
|
163 |
+.chip-accent { background: var(--accent); color: var(--on-accent); } |
|
164 |
+.chip-soft { background: var(--accent-soft); border-color: var(--line); } |
|
165 |
+ |
|
166 |
+/* ---- Champs ---- */ |
|
167 |
+.input, .select, .textarea { |
|
168 |
+ width: 100%; min-height: var(--touch); padding: 10px 14px; |
|
169 |
+ font: inherit; color: var(--ink); background: var(--surface); |
|
170 |
+ border: 1.5px solid var(--ink); border-radius: var(--r-ctl); |
|
171 |
+} |
|
172 |
+.input:focus, .select:focus, .textarea:focus { |
|
173 |
+ outline: none; box-shadow: 3px 3px 0 var(--accent); border-color: var(--ink); |
|
174 |
+} |
|
175 |
+.input::placeholder { color: var(--ink-3); } |
|
176 |
+ |
|
177 |
+/* ---- Badge « Un service Groupe KA » (header, cliquable → hub) ---- */ |
|
178 |
+.gk-badge { |
|
179 |
+ display: inline-flex; align-items: center; gap: 7px; |
|
180 |
+ min-height: 30px; padding: 3px 10px 4px; |
|
181 |
+ font-family: var(--font-mono); font-size: 10px; font-weight: 700; |
|
182 |
+ letter-spacing: 0.08em; text-transform: uppercase; text-decoration: none; |
|
183 |
+ border: 1.5px solid var(--ink); border-radius: var(--r-pill); |
|
184 |
+ background: var(--surface); color: var(--ink-2); white-space: nowrap; |
|
185 |
+} |
|
186 |
+.gk-badge b { |
|
187 |
+ font-family: var(--font-display); font-size: 12px; letter-spacing: -0.02em; |
|
188 |
+ text-transform: none; color: var(--ink); |
|
189 |
+} |
|
190 |
+.gk-badge b .ka { |
|
191 |
+ display: inline-block; background: var(--ink); color: var(--accent); |
|
192 |
+ border-radius: 5px; padding: 0 5px 1px; margin-left: 3px; transform: rotate(-2deg); |
|
193 |
+} |
|
194 |
+.gk-badge:hover .ka { transform: rotate(0); } |
|
195 |
+.gk-badge--dark { background: transparent; border-color: rgba(245,243,238,0.4); color: rgba(245,243,238,0.75); } |
|
196 |
+.gk-badge--dark b { color: var(--paper); } |
|
197 |
+ |
|
198 |
+/* ---- Footer commun (fond encre — voir react/KaFooter.tsx) ---- */ |
|
199 |
+.ka-footer { margin-top: var(--sp-8); background: var(--ink); padding: 44px 0; font-size: 13px; color: rgba(245,243,238,0.75); } |
|
200 |
+.ka-footer a { text-decoration: none; } |
|
201 |
+.ka-footer .wordmark { font-family: var(--font-display); font-weight: 700; font-size: 30px; letter-spacing: -0.04em; color: var(--paper); text-decoration: none; } |
|
202 |
+.ka-footer .wordmark .ka { color: var(--accent); } |
|
203 |
+.ka-footer .desc { max-width: 640px; margin-top: var(--sp-4); } |
|
204 |
+.ka-footer .notice { max-width: 640px; margin-top: var(--sp-4); border-left: 2px solid var(--accent); padding-left: var(--sp-4); } |
|
205 |
+.ka-footer .notice b { color: var(--paper); } |
|
206 |
+.ka-footer .sites { list-style: none; display: flex; flex-wrap: wrap; gap: 10px 26px; margin: 26px 0 0; padding: 0; font-family: var(--font-mono); font-size: 11px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; } |
|
207 |
+.ka-footer .sites a { color: rgba(245,243,238,0.65); } |
|
208 |
+.ka-footer .sites a:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 4px; } |
|
209 |
+.ka-footer .contacts { display: grid; gap: 14px 32px; border-top: 1px solid rgba(245,243,238,0.15); margin-top: 30px; padding-top: 26px; } |
|
210 |
+@media (min-width: 768px) { .ka-footer .contacts { grid-template-columns: repeat(3, 1fr); } } |
|
211 |
+.ka-footer .contacts a { font-family: var(--font-mono); font-weight: 700; font-size: 12px; color: rgba(245,243,238,0.85); } |
|
212 |
+.ka-footer .contacts a:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 4px; } |
|
213 |
+.ka-footer .contacts span { display: block; margin-top: 3px; font-size: 11px; color: rgba(245,243,238,0.5); } |
|
214 |
+.ka-footer .legal { margin-top: 30px; font-family: var(--font-mono); font-size: 11px; color: rgba(245,243,238,0.45); } |
|
215 |
+.ka-footer .legal a { color: inherit; } |
|
216 |
+.ka-footer .legal a:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 4px; } |
|
217 |
+ |
|
218 |
+/* ---- Tableaux → cartes empilées sous 768 px ---- */ |
|
219 |
+.tbl-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; } |
|
220 |
+@media (max-width: 767px) { |
|
221 |
+ .tbl-stack thead { display: none; } |
|
222 |
+ .tbl-stack tr { display: block; border: 1.5px solid var(--ink); border-radius: var(--r-card); margin-bottom: var(--sp-3); background: var(--surface); } |
|
223 |
+ .tbl-stack td { display: flex; justify-content: space-between; gap: var(--sp-3); padding: 8px 12px; border: 0; } |
|
224 |
+ .tbl-stack td::before { content: attr(data-label); font-family: var(--font-mono); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-3); } |
|
225 |
+} |
|
226 |
+ |
|
227 |
+/* ---- Utilitaires responsive ---- */ |
|
228 |
+.only-mobile { display: initial; } .only-desktop { display: none; } |
|
229 |
+@media (min-width: 768px) { .only-mobile { display: none; } .only-desktop { display: initial; } } |
|
230 |
|