# Rapport de validation — Correction front-end mobile des 13 plateformes Groupe KA **Date : 2026-08-19.** Campagne complète : diagnostic → correction à la racine dans le design system **ka-ui** → propagation aux 13 sites → re-validation. Inventaire initial : `INVENTAIRE.md`. Journal des passes : `audit-run.log` (avant), `audit-run2.log` / `audit-run3.log` (intermédiaires), `audit-final.log` (final). Captures : `audit/*.png` (Playwright Pixel 7 + iPhone 13), `audit/simulator/*.png` (Safari réel, simulateur iPhone 17 Pro, iOS 26.5), `regression/*.png` (matrice de largeurs). ## Résultat final **26 / 26 passes d'audit PROPRES** (13 sites × Android chromium + iOS WebKit, accueil + 2 pages internes chacun) : zéro débordement horizontal réel, zéro champ < 16 px, zéro barre basse instable ou masquante, zéro menu sans verrou de scroll, zéro `position:fixed` cassé par un ancêtre, meta viewport conforme partout, cibles tactiles ≥ 44 px effectifs (extensions `::after` comprises). Les 13 sites répondent 200 (www) après rebuild + restart. ## Corrections à la racine (ka-ui, commits `f825ea3` → `e6df8e5`) | Correctif | Fichier | Propagation | |---|---|---| | Socle mobile obligatoire : échelle z-index `--z-*`, `--vh100`/dvh, `.ka-bottombar`+`has-bottombar`, `html.ka-scroll-lock`, `.ka-menu`, `.ka-overlay` | tokens.css | resync + rebuild 13 apps | | Filet anti-zoom iOS : champs `≥16px !important` sous `(hover:none) and (pointer:coarse)` | tokens.css | 13 apps | | Zone tactile `.gk-badge` étendue (`::after inset:-8px`) | tokens.css | 13 apps | | `overflow-x: clip` sur `html` ET `body` (quirk WebKit : clip sur body seul laisse défiler le viewport — bug réel constaté sur groupe-ka iOS, +223 px) | tokens.css | 13 apps | | Widget KA Agent : safe-area bulle/panneau, textarea 16 px, plein écran mobile + verrou de scroll (fusionné dans la **v2** de la session parallèle, sur-ensemble vérifié — canonique aligné) | agent/ka-agent.js | 13 sites | | Règles mobiles obligatoires documentées (11 règles) | README.md | — | ## Avant → après, site par site (chaque commit poussé sur le nœud de l'app) | Site | Bugs initiaux (priorité) | Correctifs | Commit | Final | |---|---|---|---|---| | groupe-ka | **P0** overlay menu piégé dans le header `backdrop-blur` (inutilisable 768-1280 px) ; menu sans verrou ; débordement iOS +141→223 px (ticker) ; tokens.css jamais importé ; pas de viewport-fit ; stat-chips 33 px | overlay sorti du header (`body:has(#gk-menu:checked)`), verrou `html:has(…){overflow:hidden}`, import tokens `layer(base)` + grain dédupliqué, `viewportFit:"cover"`, chips étendues, clip html+body | `ea1292c` + tokens | ✅ 0 | | trouve-ka | **P0** aucune navigation mobile (liens `hidden md:` sans hamburger) ; viewport-fit absent ; `min-h-screen` (100vh) ; ka/ hors Tailwind content | `components/mobile-nav.tsx` (hamburger 44 px, verrou, Escape, safe-area), `viewportFit:"cover"`, `min-h-dvh`, content Tailwind | `37a4bf7` + tokens | ✅ 0 | | lou-ka | backdrop du menu compte confiné au header blurré ; sheet filtres sans verrou ; 6 champs < 16 px ; brand 30 px | backdrop portalisé vers body, verrou sheet, champs 16 px, `::after` brand | `2f7a2cd` + tokens | ✅ 0 | | immo-ka | sheet filtres sans verrou ; `ka-signup` 17 px de haut ; brand 27 px ; styles.css orphelin (46 Ko) | verrou + Escape, extensions `::after` (ka-signup portée à 45 px eff.), orphelin supprimé, z-index `--z-*` (le « menu sans verrou » de l'audit v1 = faux positif, bouton ka-login) | `b543611` + suite | ✅ 0 | | vrai-prix | bandeau cookies sans safe-area (et inerte : pas de viewport-fit) ; modale prefs sans verrou ; vp-display 28 px | `viewportFit:"cover"`, `pb-[calc(…+env(safe-area-inset-bottom))]`, verrou modale + Escape, `::after` | `52e6cbc` + tokens | ✅ 0 | | auto-ka | aucun scroll-lock dans l'app ; pas de nav mobile (bande scroll-x compressée) ; selects < 16 px ; brand 32 px | hamburger standard KA (backdrop hors header blurré), verrou menu compte + Escape + `aria-haspopup`, anti-zoom, `::after` | `841eef4` + tokens | ✅ 0 | | fabri-ka | `100vh` sur colonne filtres ; search < 16 px ; logo 29 px ; grain divergent (z-0 local vs 9999 tokens) | doublet dvh, anti-zoom coarse, `::after`, grain réconcilié (compensation tab bar déjà conforme via padding du footer — l'audit a été affiné pour la reconnaître) | `c6f995a` + tokens | ✅ 0 | | food-ka | collision z-index 80/80 fab↔bandeau cookies ; lightbox + sheet sans verrou ; champs < 16 px ; brand 27 px | `--consent-h` (ResizeObserver → fab décalé au-dessus du bandeau), bandeau `--z-toast`/fab `--z-bottombar`, 2 verrous + Escape, anti-zoom, `::after` | `201d196` + tokens | ✅ 0 | | api-ka | selects/inputs du playground et dates stats < 16 px | 16 px ≤767 px (index/stats ; contact sans champ) | `25c5f75` + tokens | ✅ 0 | | crea-ka | champs < 16 px au-delà de 760 px ; brand 26-30 px ; joignabilité mobile à vérifier | 16 px jusqu'au breakpoint tabbar (940 px), joignabilité confirmée (tabbar+footer), `::after` brand (repêché en fin de campagne : la 1re passe n'avait pas atteint le template) | `9ae8959` + fix brand | ✅ 0 | | resto-ka | backdrop compte confiné au header blurré ET menu compte (z 55/60) SOUS la tabbar (85)/fab (80) ; sheet sans verrou ; brand 30 px | menu + backdrop portalisés (`--z-modal`/`--z-overlay`, ancrage `--header-h`), verrou sheet, `::after` | `65e369c` + tokens | ✅ 0 | | sorti-ka | champs < 16 px ; viewport-fit absent ; header sticky `backdrop-filter` sans garde ; brand 26 px | 16 px mobile, `viewport-fit=cover`, blur réservé ≥768 px (fond opaque mobile), `::after` | `a88b4a0` + tokens | ✅ 0 | | job-ka | carte `calc(100vh - 58px)` (bouge au repli de la barre navigateur, faux si header 2 lignes) ; pas de menu mobile (6 liens en wrap) ; 8 champs < 16 px ; viewport-fit absent ; logo 31 px | `--header-h` mesuré (ResizeObserver) + dvh, hamburger standard KA, 16 px, `viewport-fit=cover`, `::after` | `da4b6be` + tokens | ✅ 0 | ## Scénarios des deux bugs signalés — validés - **Menus déroulants** : ouverture/fermeture AU TAP vérifiée sur chaque site (le vrai bouton menu est tapé par l'audit, l'ouverture est confirmée par aria-expanded/classe/dialog, le verrou d'arrière-plan est exigé) ; aucun menu ne dépend de `:hover` (vérifié par scan CSS sur les 13 sites) ; sélecteurs de filtres = `