#!/usr/bin/env python3 """KA Nav v2 (2026-08-25) — convertit le .mobile-menu dropdown absolute 480px en panneau plein écran position:fixed inset:0 dans un styles.css d'app KA. Usage : convert-mobile-menu.py has → le header est remonté via .header:has(.mobile-menu.open) menu-open → le header est remonté via .header.menu-open Affiche n1/n2/n3 (chaque compteur doit être ≥1, sauf n3 qui peut être 0).""" import re import sys path, variant = sys.argv[1], sys.argv[2] css = open(path).read() # 1) bloc principal : absolute top:100% + max-height:0 → fixed inset:0 pat = re.compile( r"\.mobile-menu \{\s*\n" r"(?:[^}]*?\n)*?" r"\s*transition: max-height[^\n]*\n" r"\}" ) new_block = ( "/* KA Nav v2 (2026-08-25) : panneau PLEIN ECRAN fixed inset:0 - visible peu\n" " importe le scroll (l'ancien dropdown absolute 480px clippait/se coupait). */\n" ".mobile-menu {\n" " display: none; position: fixed; inset: 0;\n" " background: var(--paper);\n" " padding: 76px 16px calc(24px + env(safe-area-inset-bottom));\n" " overflow-y: auto; overscroll-behavior: contain;\n" "}" ) css, n1 = pat.subn(new_block, css, count=1) if n1 == 0: # variante mono-ligne (immo-ka) pat1b = re.compile(r"\.mobile-menu \{ display: none; position: absolute;[^}]*\}") css, n1 = pat1b.subn(new_block, css, count=1) # 2) l'ancienne ligne z-index dediee (lou-ka / resto-ka) devient inutile : # le panneau doit peindre SOUS le rang du header (header-inner z:60) css = css.replace(".mobile-menu { z-index: var(--z-modal, 900); }\n", "") # 3) regle d'ouverture + rang du header au-dessus + verrou de scroll CSS pur raise_rule = ( ".header:has(.mobile-menu.open) .header-inner { position: relative; z-index: 60; }" if variant == "has" else ".header.menu-open .header-inner { position: relative; z-index: 60; }" ) open_block = ( ".mobile-menu.open { display: block; animation: mm-in 0.16s ease; }\n" "@keyframes mm-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }\n" "/* le rang du header (marque + burger devenu X) reste au-dessus du panneau */\n" + raise_rule + "\n" "/* verrou du scroll d'arriere-plan quand le menu est ouvert (CSS pur) */\n" "html:has(.mobile-menu.open) { overflow: hidden; }" ) pat2 = re.compile(r"\.mobile-menu\.open \{ max-height: 480px; opacity: 1;(?: overflow-y: auto;)? \}") css, n2 = pat2.subn(open_block, css, count=1) # 4) dans la media query mobile, le display:block permanent disparait # (le display est desormais porte par .open) css, n3 = re.subn(r"\s*\.mobile-menu \{ display: block; \}", "", css) open(path, "w").write(css) print(f"n1={n1} n2={n2} n3={n3}")