feat(nav): header unifié desktop/mobile (issue #16)

Partiel _header.html unique pour les 19 pages (fin des copies qui
dérivaient): desktop une ligne — primaires + menu Plus + Ctrl K,
page active déduite du gabarit dans render(); mobile ≤900px
burger + panneau ≥44px, Échap/clic extérieur; wallboard sans
header et triage sur le même partiel. nav.js partagé.
This commit is contained in:
Spark
2026-10-11 20:15:23 -04:00
parent 24a1ebb9a6
commit 2fde103e93
23 changed files with 204 additions and 326 deletions
+22
View File
@@ -292,6 +292,27 @@ _tpl_env = Environment(
)
# Which main-nav entry a template represents (issue #16): the
# shared _header.html partial highlights it from this one place
# instead of 19 hand-maintained copies.
_NAV_BY_TEMPLATE = {
"dashboard.html": "home",
"focus.html": "focus",
"today.html": "today",
"my.html": "my",
"activity.html": "activity",
"briefing.html": "briefing",
"standup.html": "standup",
"search.html": "search",
"capture.html": "capture",
"digest.html": "digest",
"forecast.html": "forecast",
"rules.html": "rules",
"health.html": "health",
"health_project.html": "health",
}
def render(
request: Request, name: str, status_code: int = 200, **context
) -> HTMLResponse:
@@ -307,6 +328,7 @@ def render(
token = secrets.token_urlsafe(32)
context.setdefault("csrf_token", token)
context.setdefault("version", APP_VERSION)
context.setdefault("active_nav", _NAV_BY_TEMPLATE.get(name, ""))
html = _tpl_env.get_template(name).render(**context)
response = HTMLResponse(html, status_code=status_code)
if generated: