#!/usr/bin/env python3 """KA Nav v2 — correctif ✕ (2026-08-25) : le bouton de fermeture vivait dans le header (burger→✕) ; si le header n'est pas épinglé (bas de page), il est hors écran alors que le panneau fixed est visible. On met un ✕ FIXE dans le panneau et on masque le burger à l'ouverture (une seule commande de fermeture). Usage : fix-mm-close.py """ import sys root, variant = sys.argv[1], sys.argv[2] tsx_path = f"{root}/frontend/src/App.tsx" css_path = f"{root}/frontend/src/styles.css" # --- App.tsx : ✕ premier enfant du panneau ------------------------------- tsx = open(tsx_path).read() if "mm-close" in tsx: print("App.tsx: deja fait") else: anchor = '
' assert anchor in tsx, "ancre mobile-menu introuvable" btn = anchor + ( "\n {/* ✕ fixe du panneau : visible peu importe le scroll," " le burger du header est masqué à l'ouverture */}" '\n " ) tsx = tsx.replace(anchor, btn, 1) open(tsx_path, "w").write(tsx) print("App.tsx: OK") # --- styles.css : burger masqué à l'ouverture + style du ✕ ---------------- css = open(css_path).read() old_comment = "/* le rang du header (marque + burger devenu X) reste au-dessus du panneau */\n" old_has = old_comment + ".header:has(.mobile-menu.open) .header-inner { position: relative; z-index: 60; }" old_mo = old_comment + ".header.menu-open .header-inner { position: relative; z-index: 60; }" hide = ("/* burger masque a l'ouverture : la fermeture passe par le X fixe du panneau */\n" + (".header:has(.mobile-menu.open) .menu-btn { visibility: hidden; }" if variant == "has" else ".header.menu-open .menu-btn { visibility: hidden; }")) mm_close = hide + """ /* bouton de fermeture du panneau : fixe en haut a droite du viewport */ .mm-close { position: fixed; top: 10px; right: 14px; z-index: 2; width: 44px; height: 44px; display: flex; align-items: center; justify-content: center; border: 1.5px solid var(--ink); border-radius: 999px; background: var(--ink); color: var(--paper); font-size: 17px; font-weight: 700; line-height: 1; cursor: pointer; padding: 0; }""" done = False for old in (old_has, old_mo): if old in css: css = css.replace(old, mm_close, 1) done = True break if not done and ".mm-close" in css: print("styles.css: deja fait") elif not done: raise SystemExit("regle header-inner z-60 introuvable") else: open(css_path, "w").write(css) print("styles.css: OK")