SPB Git forge

spb/ka-ui

Public
30commits 1branches 0releases
145.7 MBsize
maindefault branch
27 days agolast push
Python 33.5% JavaScript 30.1% TypeScript 25% CSS 10% Shell 1.4%
2.7 KB · 61 lines python
Raw Blame History
1#!/usr/bin/env python32"""KA Nav v2 — correctif ✕ (2026-08-25) : le bouton de fermeture vivait dans le3header (burger→✕) ; si le header n'est pas épinglé (bas de page), il est hors4écran alors que le panneau fixed est visible. On met un ✕ FIXE dans le panneau5et on masque le burger à l'ouverture (une seule commande de fermeture).6Usage : fix-mm-close.py <racine app> <has|menu-open>"""7import sys89root, variant = sys.argv[1], sys.argv[2]10tsx_path = f"{root}/frontend/src/App.tsx"11css_path = f"{root}/frontend/src/styles.css"1213# --- App.tsx : ✕ premier enfant du panneau -------------------------------14tsx = open(tsx_path).read()15if "mm-close" in tsx:16    print("App.tsx: deja fait")17else:18    anchor = '<div className={`mobile-menu ${open ? "open" : ""}`} role="navigation" aria-label="Menu mobile">'19    assert anchor in tsx, "ancre mobile-menu introuvable"20    btn = anchor + (21        "\n          {/* ✕ fixe du panneau : visible peu importe le scroll,"22        " le burger du header est masqué à l'ouverture */}"23        '\n          <button type="button" className="mm-close" aria-label="Fermer le menu"'24        "\n                  onClick={() => setOpen(false)}>✕</button>"25    )26    tsx = tsx.replace(anchor, btn, 1)27    open(tsx_path, "w").write(tsx)28    print("App.tsx: OK")2930# --- styles.css : burger masqué à l'ouverture + style du ✕ ----------------31css = open(css_path).read()32old_comment = "/* le rang du header (marque + burger devenu X) reste au-dessus du panneau */\n"33old_has = old_comment + ".header:has(.mobile-menu.open) .header-inner { position: relative; z-index: 60; }"34old_mo = old_comment + ".header.menu-open .header-inner { position: relative; z-index: 60; }"35hide = ("/* burger masque a l'ouverture : la fermeture passe par le X fixe du panneau */\n"36        + (".header:has(.mobile-menu.open) .menu-btn { visibility: hidden; }"37           if variant == "has" else38           ".header.menu-open .menu-btn { visibility: hidden; }"))39mm_close = hide + """40/* bouton de fermeture du panneau : fixe en haut a droite du viewport */41.mm-close {42  position: fixed; top: 10px; right: 14px; z-index: 2;43  width: 44px; height: 44px; display: flex; align-items: center; justify-content: center;44  border: 1.5px solid var(--ink); border-radius: 999px;45  background: var(--ink); color: var(--paper);46  font-size: 17px; font-weight: 700; line-height: 1; cursor: pointer; padding: 0;47}"""48done = False49for old in (old_has, old_mo):50    if old in css:51        css = css.replace(old, mm_close, 1)52        done = True53        break54if not done and ".mm-close" in css:55    print("styles.css: deja fait")56elif not done:57    raise SystemExit("regle header-inner z-60 introuvable")58else:59    open(css_path, "w").write(css)60    print("styles.css: OK")61