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 · 63 lines python
Raw Blame History
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