| 7 |
7 |
Rôle : CSS local Job·Ka — s'appuie sur le design system commun Groupe KA |
| 8 |
8 |
(ka/tokens.css, importé AVANT ce fichier dans main.tsx). Ici : |
| 9 |
9 |
seulement l'accent de la marque + les classes métier (offres, |
| 10 |
|
− filtres, carte). Le socle (body, grain, sélection, .container, |
| 11 |
|
− .btn, .card, .chip, ka-footer…) vit dans tokens.css. |
| 12 |
|
−Créé : 2026-08-17 Modifié : 2026-08-17 |
|
10 |
+ filtres, carte) au style « éditorial sharp » du groupe (bordures |
|
11 |
+ encre 1,5 px + ombres décalées dures, étiquettes mono). Le socle |
|
12 |
+ (body, grain, sélection, .container, .btn, .card, .chip, |
|
13 |
+ ka-footer…) vit dans tokens.css. |
|
14 |
+Créé : 2026-08-17 Modifié : 2026-08-22 |
| 13 |
15 |
============================================================================= |
| 14 |
16 |
*/ |
| 15 |
17 |
|
| 147 |
149 |
.mobile-menu { display: block; } |
| 148 |
150 |
} |
| 149 |
151 |
|
| 150 |
|
−/* --- héros ------------------------------------------------------------------ */ |
| 151 |
|
−.hero { background: var(--brand); color: #fff; padding: 40px 0 34px; } |
| 152 |
|
−.hero h1 { margin: 0 0 6px; font-size: 30px; font-weight: 700; letter-spacing: -0.5px; color: #fff; } |
| 153 |
|
−.hero h1 em { color: var(--accent-soft); font-style: normal; } |
| 154 |
|
−.hero p { margin: 0 0 20px; color: #b9c2be; max-width: 640px; } |
|
152 |
+/* --- héros (encre — identité Job·Ka) ---------------------------------------- */ |
|
153 |
+.hero { background: var(--brand); color: #fff; padding: 42px 0 36px; } |
|
154 |
+.hero .kicker { color: var(--accent-soft); } |
|
155 |
+.hero .kicker::before { background: var(--accent); } |
|
156 |
+.hero h1 { margin: 6px 0 8px; font-size: clamp(28px, 2.6vw + 16px, 42px); font-weight: 700; letter-spacing: -0.03em; color: #fff; line-height: 1.08; } |
|
157 |
+.hero h1 em { |
|
158 |
+ /* surligné d'accent incliné — signature du groupe (.hl), déclinaison encre */ |
|
159 |
+ display: inline-block; font-style: normal; background: var(--accent); |
|
160 |
+ color: var(--on-accent); border-radius: 8px; padding: 0 10px 2px; |
|
161 |
+ transform: rotate(-1deg); |
|
162 |
+} |
|
163 |
+.hero p { margin: 0 0 22px; color: #b9c2be; max-width: 640px; } |
| 155 |
164 |
|
| 156 |
|
−/* --- filtres ------------------------------------------------------------------ */ |
|
165 |
+/* --- filtres (champs sharp : bordure encre + focus accent décalé) ------------ */ |
| 157 |
166 |
.filters { display: flex; flex-wrap: wrap; gap: 10px; } |
| 158 |
167 |
.filters input[type="search"], .filters select { |
| 159 |
|
− height: 42px; padding: 0 12px; border-radius: 10px; border: 1px solid var(--border); |
| 160 |
|
− background: #fff; color: var(--ink); font: inherit; min-width: 130px; |
|
168 |
+ height: 44px; padding: 0 12px; border-radius: var(--r-ctl); |
|
169 |
+ border: 1.5px solid var(--ink); |
|
170 |
+ background: var(--surface); color: var(--ink); font: inherit; min-width: 130px; |
|
171 |
+} |
|
172 |
+.filters input[type="search"]:focus, .filters select:focus { |
|
173 |
+ outline: none; box-shadow: 3px 3px 0 var(--accent); |
| 161 |
174 |
} |
| 162 |
175 |
.filters input[type="search"] { flex: 1 1 220px; } |
|
176 |
+.filters input[type="search"]::placeholder { color: var(--ink-3); } |
| 163 |
177 |
.filters label.check { |
| 164 |
|
− display: inline-flex; align-items: center; gap: 7px; background: #fff; |
|
178 |
+ display: inline-flex; align-items: center; gap: 7px; background: var(--surface); |
| 165 |
179 |
color: var(--ink); /* le héros est blanc sur encre — ne pas hériter */ |
| 166 |
|
− border: 1px solid var(--border); border-radius: 10px; padding: 0 14px; |
| 167 |
|
− height: 42px; cursor: pointer; user-select: none; white-space: nowrap; |
|
180 |
+ border: 1.5px solid var(--ink); border-radius: var(--r-ctl); padding: 0 14px; |
|
181 |
+ height: 44px; cursor: pointer; user-select: none; white-space: nowrap; |
|
182 |
+} |
|
183 |
+.filters label.check:has(input:checked) { |
|
184 |
+ background: var(--accent-soft); box-shadow: 3px 3px 0 var(--accent); |
| 168 |
185 |
} |
| 169 |
186 |
/* champs >=16px sur mobile : évite le zoom automatique d'iOS au focus */ |
| 170 |
187 |
@media (max-width: 700px) { |
| 171 |
188 |
.filters input[type="search"], .filters select, .filters label.check { font-size: 16px; } |
| 172 |
189 |
} |
| 173 |
190 |
|
| 174 |
|
−/* --- cartes d'offres ------------------------------------------------------------ */ |
| 175 |
|
−.job-list { display: grid; gap: 12px; margin: 22px 0; } |
|
191 |
+/* --- cartes d'offres (sharp : bordure encre + ombre décalée) --------------------- */ |
|
192 |
+.job-list { display: grid; gap: 14px; margin: 22px 0; } |
| 176 |
193 |
.job-card { |
| 177 |
|
− display: block; background: var(--surface); border: 1px solid var(--border); |
| 178 |
|
− border-radius: var(--radius); padding: 18px 20px; color: inherit; |
| 179 |
|
− transition: border-color 0.12s, box-shadow 0.12s; |
| 180 |
|
−} |
| 181 |
|
−.job-card:hover { border-color: var(--accent); box-shadow: var(--shadow); text-decoration: none; } |
| 182 |
|
−.job-card h3 { margin: 0 0 2px; font-size: 17px; font-weight: 700; color: var(--ink); } |
|
194 |
+ display: block; background: var(--surface); border: 1.5px solid var(--ink); |
|
195 |
+ border-radius: var(--r-card); box-shadow: var(--shadow-off-soft); |
|
196 |
+ padding: 18px 20px; color: inherit; |
|
197 |
+ transition: transform 0.15s, box-shadow 0.15s; |
|
198 |
+} |
|
199 |
+.job-card:hover { transform: translate(-2px, -2px); box-shadow: var(--shadow-off-mid); text-decoration: none; } |
|
200 |
+.job-card h3 { margin: 0 0 2px; font-family: var(--font-display); font-size: 17.5px; font-weight: 700; color: var(--ink); letter-spacing: -0.02em; } |
|
201 |
+.job-card:hover h3 { text-decoration: underline; text-decoration-color: var(--accent); text-decoration-thickness: 2px; text-underline-offset: 3px; } |
| 183 |
202 |
.job-card .employer { color: var(--accent-deep); font-weight: 600; } |
| 184 |
|
−.job-card .meta { color: var(--ink-3); font-size: 13.5px; margin-top: 6px; display: flex; flex-wrap: wrap; gap: 6px 14px; } |
|
203 |
+.job-card .meta { color: var(--ink-3); font-size: 13px; margin-top: 8px; display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; } |
| 185 |
204 |
|
|
205 |
+/* étiquettes façon .chip du groupe : mono, uppercase, pilule bordée */ |
| 186 |
206 |
.badge { |
| 187 |
|
− display: inline-block; padding: 2px 9px; border-radius: 999px; |
| 188 |
|
− font-size: 12.5px; font-weight: 600; background: var(--surface-2); color: var(--ink-2); |
| 189 |
|
−} |
| 190 |
|
−.badge.salary { background: var(--green-soft); color: var(--green); } |
| 191 |
|
−.badge.mode { background: var(--accent-soft); color: var(--accent-deep); } |
| 192 |
|
−.badge.direct { |
| 193 |
|
− background: transparent; |
| 194 |
|
− border: 1px solid var(--accent, #0c8599); |
| 195 |
|
− color: var(--accent-deep, #0b7285); |
|
207 |
+ display: inline-flex; align-items: center; gap: 5px; |
|
208 |
+ padding: 3px 10px; border-radius: var(--r-pill); |
|
209 |
+ font-family: var(--font-mono); font-size: 10.5px; font-weight: 700; |
|
210 |
+ text-transform: uppercase; letter-spacing: 0.05em; |
|
211 |
+ background: var(--surface-2); color: var(--ink-2); |
|
212 |
+ border: 1.5px solid var(--line); |
| 196 |
213 |
} |
|
214 |
+.badge.salary { background: var(--green-soft); color: var(--green); border-color: var(--green); } |
|
215 |
+.badge.mode { background: var(--accent-soft); color: var(--accent-deep); border-color: var(--line); } |
|
216 |
+.badge.direct { background: transparent; border-color: var(--accent); color: var(--accent-deep); } |
| 197 |
217 |
|
| 198 |
218 |
/* --- fiche ------------------------------------------------------------------------- */ |
| 199 |
219 |
.sheet { |
| 200 |
|
− background: var(--surface); border: 1px solid var(--border); |
| 201 |
|
− border-radius: var(--radius); padding: 28px 32px; margin: 24px 0; |
|
220 |
+ background: var(--surface); border: 1.5px solid var(--ink); |
|
221 |
+ border-radius: var(--r-card); box-shadow: var(--shadow-off-soft); |
|
222 |
+ padding: 28px 32px; margin: 24px 0; |
| 202 |
223 |
} |
| 203 |
224 |
.sheet h1 { margin: 0 0 4px; font-size: 24px; letter-spacing: -0.3px; } |
| 204 |
225 |
.sheet .facts { display: flex; flex-wrap: wrap; gap: 8px; margin: 14px 0 20px; } |
| 205 |
226 |
.sheet .description { white-space: pre-line; color: var(--ink-2); } |
| 206 |
227 |
|
| 207 |
228 |
/* --- tuiles de statistiques (hero numbers) --------------------------------------- */ |
| 208 |
|
−.tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 12px; margin: 22px 0; } |
|
229 |
+.tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 14px; margin: 22px 0; } |
| 209 |
230 |
.tile { |
| 210 |
|
− background: var(--surface); border: 1px solid var(--border); |
| 211 |
|
− border-radius: var(--radius); padding: 18px 20px; |
|
231 |
+ background: var(--surface); border: 1.5px solid var(--ink); |
|
232 |
+ border-radius: var(--r-card); box-shadow: var(--shadow-off-soft); |
|
233 |
+ padding: 18px 20px; position: relative; overflow: hidden; |
| 212 |
234 |
} |
| 213 |
|
−.tile .value { font-family: var(--font-display); font-size: 26px; font-weight: 700; letter-spacing: -0.5px; } |
| 214 |
|
−.tile .label { color: var(--ink-3); font-size: 13px; margin-top: 2px; } |
|
235 |
+.tile::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: var(--accent); } |
|
236 |
+.tile .value { font-family: var(--font-display); font-size: 27px; font-weight: 700; letter-spacing: -0.5px; } |
|
237 |
+.tile .label { color: var(--ink-3); font-family: var(--font-mono); font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; margin-top: 4px; } |
| 215 |
238 |
|
| 216 |
239 |
/* --- barres horizontales (magnitude, teinte unique) --------------------------------- */ |
| 217 |
240 |
.bars { display: grid; gap: 8px; margin: 10px 0 26px; } |
| 222 |
245 |
.bar-row .n { font-size: 13px; color: var(--ink-2); text-align: right; font-variant-numeric: tabular-nums; } |
| 223 |
246 |
|
| 224 |
247 |
/* --- tableaux ----------------------------------------------------------------------- */ |
| 225 |
|
−table.data { width: 100%; border-collapse: collapse; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; } |
|
248 |
+table.data { width: 100%; border-collapse: separate; border-spacing: 0; background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-card); overflow: hidden; box-shadow: var(--shadow-off-soft); } |
| 226 |
249 |
table.data th, table.data td { text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--border); font-size: 14px; } |
| 227 |
|
−table.data th { background: var(--surface-2); color: var(--ink-2); font-weight: 600; } |
|
250 |
+table.data th { background: var(--surface-2); color: var(--ink-2); font-family: var(--font-mono); font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; border-bottom: 1.5px solid var(--ink); } |
| 228 |
251 |
table.data tr:last-child td { border-bottom: none; } |
| 229 |
252 |
|
| 230 |
253 |
/* --- carte -------------------------------------------------------------------------- */ |
| 238 |
261 |
.map-wrap .maplibregl-map { height: 100%; } |
| 239 |
262 |
.map-count { |
| 240 |
263 |
position: absolute; top: 14px; left: 14px; z-index: 5; |
| 241 |
|
− background: var(--brand); color: #fff; border-radius: 10px; |
| 242 |
|
− padding: 8px 14px; font-size: 13.5px; box-shadow: var(--shadow); |
|
264 |
+ background: var(--brand); color: #fff; border-radius: var(--r-card); |
|
265 |
+ border: 1.5px solid var(--ink); box-shadow: var(--shadow-off-mid); |
|
266 |
+ padding: 8px 14px; font-size: 13px; font-family: var(--font-display); font-weight: 700; |
| 243 |
267 |
} |
| 244 |
268 |
.map-popup h4 { margin: 0 0 2px; font-size: 14px; } |
| 245 |
269 |
.map-popup { font: 13px "Inter", sans-serif; } |
| 246 |
270 |
|
| 247 |
271 |
/* --- pagination / divers ------------------------------------------------------------- */ |
| 248 |
|
−.pager { display: flex; gap: 8px; justify-content: center; margin: 26px 0; } |
|
272 |
+.pager { display: flex; gap: 10px; justify-content: center; margin: 26px 0; } |
| 249 |
273 |
.pager button { |
| 250 |
|
− background: var(--surface); border: 1px solid var(--border); border-radius: 8px; |
| 251 |
|
− padding: 8px 16px; cursor: pointer; font: inherit; min-height: var(--touch); |
| 252 |
|
−} |
|
274 |
+ background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-ctl); |
|
275 |
+ padding: 8px 16px; cursor: pointer; font: inherit; |
|
276 |
+ font-family: var(--font-display); font-weight: 700; font-size: 14px; |
|
277 |
+ min-height: var(--touch); |
|
278 |
+ transition: transform 0.15s, box-shadow 0.15s; |
|
279 |
+} |
|
280 |
+.pager button:hover:not(:disabled) { transform: translate(-2px, -2px); box-shadow: var(--shadow-off-mid); } |
|
281 |
+.pager button:active { transform: none; box-shadow: none; } |
| 253 |
282 |
.pager button:disabled { opacity: 0.4; cursor: default; } |
| 254 |
283 |
.empty { text-align: center; color: var(--ink-3); padding: 60px 0; } |
| 255 |
|
−.section-title { font-size: 19px; font-weight: 700; margin: 30px 0 4px; } |
|
284 |
+.section-title { font-family: var(--font-display); font-size: 19px; font-weight: 700; letter-spacing: -0.02em; margin: 30px 0 4px; } |
| 256 |
285 |
.muted { color: var(--ink-3); font-size: 13px; } |
| 257 |
286 |
|
| 258 |
287 |
/* --- page Contact (commune Groupe KA) -------------------------------------------------- */ |
| 259 |
288 |
|