Python 33.5%
JavaScript 30.1%
TypeScript 25%
CSS 10%
Shell 1.4%
1#!/usr/bin/env python32"""KA Nav v2 (2026-08-25) — convertit le .mobile-menu dropdown absolute 480px3en panneau plein écran position:fixed inset:0 dans un styles.css d'app KA.4Usage : convert-mobile-menu.py <styles.css> <has|menu-open>5 has → le header est remonté via .header:has(.mobile-menu.open)6 menu-open → le header est remonté via .header.menu-open7Affiche n1/n2/n3 (chaque compteur doit être ≥1, sauf n3 qui peut être 0)."""8import re9import sys1011path, variant = sys.argv[1], sys.argv[2]12css = open(path).read()1314# 1) bloc principal : absolute top:100% + max-height:0 → fixed inset:015pat = re.compile(16 r"\.mobile-menu \{\s*\n"17 r"(?:[^}]*?\n)*?"18 r"\s*transition: max-height[^\n]*\n"19 r"\}"20)21new_block = (22 "/* KA Nav v2 (2026-08-25) : panneau PLEIN ECRAN fixed inset:0 - visible peu\n"23 " importe le scroll (l'ancien dropdown absolute 480px clippait/se coupait). */\n"24 ".mobile-menu {\n"25 " display: none; position: fixed; inset: 0;\n"26 " background: var(--paper);\n"27 " padding: 76px 16px calc(24px + env(safe-area-inset-bottom));\n"28 " overflow-y: auto; overscroll-behavior: contain;\n"29 "}"30)31css, n1 = pat.subn(new_block, css, count=1)32if n1 == 0: # variante mono-ligne (immo-ka)33 pat1b = re.compile(r"\.mobile-menu \{ display: none; position: absolute;[^}]*\}")34 css, n1 = pat1b.subn(new_block, css, count=1)3536# 2) l'ancienne ligne z-index dediee (lou-ka / resto-ka) devient inutile :37# le panneau doit peindre SOUS le rang du header (header-inner z:60)38css = css.replace(".mobile-menu { z-index: var(--z-modal, 900); }\n", "")3940# 3) regle d'ouverture + rang du header au-dessus + verrou de scroll CSS pur41raise_rule = (42 ".header:has(.mobile-menu.open) .header-inner { position: relative; z-index: 60; }"43 if variant == "has"44 else ".header.menu-open .header-inner { position: relative; z-index: 60; }"45)46open_block = (47 ".mobile-menu.open { display: block; animation: mm-in 0.16s ease; }\n"48 "@keyframes mm-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }\n"49 "/* le rang du header (marque + burger devenu X) reste au-dessus du panneau */\n"50 + raise_rule + "\n"51 "/* verrou du scroll d'arriere-plan quand le menu est ouvert (CSS pur) */\n"52 "html:has(.mobile-menu.open) { overflow: hidden; }"53)54pat2 = re.compile(r"\.mobile-menu\.open \{ max-height: 480px; opacity: 1;(?: overflow-y: auto;)? \}")55css, n2 = pat2.subn(open_block, css, count=1)5657# 4) dans la media query mobile, le display:block permanent disparait58# (le display est desormais porte par .open)59css, n3 = re.subn(r"\s*\.mobile-menu \{ display: block; \}", "", css)6061open(path, "w").write(css)62print(f"n1={n1} n2={n2} n3={n3}")63