* apply: Recorder.step_snap(page, name) captures both a JPEG screenshot and the page HTML for every major moment; every provider now calls step_snap at each logical step so failure reports contain the exact DOM and rendered state at every stage of the flow * ZIP report: each snapshot becomes snapshots/NN_<label>.jpg + snapshots/NN_<label>.html for AI-assisted debugging * web: Wohnungsliste zeigt nur noch Flats, die die eigenen Filter treffen; Match-Chip entfernt (Liste ist jetzt implizit matchend) * UI komplett auf Deutsch: Protokoll statt Logs, Administrator statt admin, Trockenmodus statt dry-run, Automatik pausiert statt circuit open, Alarm statt Alert, Abmelden statt Logout * Wohnungen-Header: Zeile 1 Info (Alarm + Filter), Zeile 2 Schalter mit echten Radio-Paaren (An/Aus) für Automatisch bewerben und Trockenmodus; hx-confirm auf den kritischen Radios; per-form CSS für sichtbaren Check-State * Protokoll: von/bis-Datumsfilter (Berliner Zeit) + CSV-Download (/logs/export.csv) mit UTC + lokaler Zeit Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
32 lines
1.5 KiB
HTML
32 lines
1.5 KiB
HTML
{#
|
|
Shared layout: top bar with brand + user + logout, tab nav, body container.
|
|
Used by every authenticated view via `{% extends "_layout.html" %}`.
|
|
#}
|
|
{% extends "base.html" %}
|
|
{% block body %}
|
|
<header class="border-b border-soft bg-white/70 backdrop-blur sticky top-0 z-10">
|
|
<div class="max-w-6xl mx-auto px-6 py-3 flex items-center justify-between">
|
|
<div class="flex items-center gap-3">
|
|
<div class="brand-dot"></div>
|
|
<h1 class="text-xl font-semibold">lazyflat</h1>
|
|
</div>
|
|
<div class="flex items-center gap-4 text-sm">
|
|
<span class="text-slate-500">{{ user.username }}{% if is_admin %} · <span class="chip chip-info">Administrator</span>{% endif %}</span>
|
|
<form method="post" action="/logout">
|
|
<button class="btn btn-ghost text-sm" type="submit">Abmelden</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<nav class="max-w-6xl mx-auto px-6 flex border-b border-soft -mb-px">
|
|
<a class="tab {% if active_tab=='wohnungen' %}active{% endif %}" href="/">Wohnungen</a>
|
|
<a class="tab {% if active_tab=='bewerbungen' %}active{% endif %}" href="/bewerbungen">Bewerbungen</a>
|
|
{% if is_admin %}
|
|
<a class="tab {% if active_tab=='logs' %}active{% endif %}" href="/logs">Protokoll</a>
|
|
{% endif %}
|
|
<a class="tab {% if active_tab=='einstellungen' %}active{% endif %}" href="/einstellungen">Einstellungen</a>
|
|
</nav>
|
|
</header>
|
|
<main class="max-w-6xl mx-auto px-6 py-6 space-y-6">
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
{% endblock %}
|