diff --git a/Changes.md b/Changes.md index c08d702..79a0849 100644 --- a/Changes.md +++ b/Changes.md @@ -1,5 +1,28 @@ # Änderungen +## Seitenleiste: Marke mit Münzstapel, ein Klick schiebt sie auf Symbolbreite (18.08.2026) + +Oben in der Seitenleiste steht jetzt eine richtige **Marke**: das Bild `Coinstack.png` aus den +Altdaten als Symbol (`public/static/coinstack.png`, auf 128 px gerechnet) und daneben der +zweifarbige Schriftzug **Finanz**manager – dieselbe Machart wie die `sidebar-brand` im +Schwesterprojekt Steuerkram. + +Die Marke ist zugleich der **Schalter**: Ein Klick schiebt die Seitenleiste von 232 px auf +64 px zusammen, dann stehen dort nur noch das Markensymbol und die Symbole der Menüpunkte – +mit unveränderten Zielen; der gewonnene Platz geht an den Hauptbereich. Ein Klick auf das +Symbol ganz oben klappt sie wieder auf ihre alte Breite auf. + +Zwei Feinheiten: Der Zustand steht in einem **Cookie**, nicht im `localStorage` – so rendert +der Server die Leiste schon in der richtigen Breite, statt sie bei jedem Seitenwechsel kurz +breit aufblitzen zu lassen. Und die Beschriftungen werden eingeklappt nur **aus dem Bild +geschoben** (`clip-path`), nicht mit `display:none` entfernt: Sonst verlören die Verweise +ihren Namen für Vorleseprogramme. In schmalen Fenstern, wo die Navigation ohnehin waagerecht +liegt, bleibt alles wie gehabt. + +Nebenbei behoben: Die Marke der Seitenleiste hieß bisher schlicht `.marke` – dieselbe Klasse +wie die kleine Statusmarke weiter unten im Stilblatt, deren Regeln sie überschrieben. Sie +heißt jetzt `.seitenleisten-marke`. + ## Bankleitzahlen-Verzeichnis: die FinTS-Adresse nachschlagen statt suchen (18.08.2026) Beim Anlegen einer FinTS-Verbindung fehlt in aller Regel genau eine Angabe: der diff --git a/public/static/app.css b/public/static/app.css index 6b27610..63ad251 100644 --- a/public/static/app.css +++ b/public/static/app.css @@ -24,6 +24,7 @@ --navi-text: #cdd7e2; --navi-text-aktiv: #ffffff; --navi-aktiv: #1f6feb; + --navi-marke: #6ea8fe; --positiv: #1a7f4b; --negativ: #c0392b; --warnung: #9a6700; @@ -117,14 +118,41 @@ code { overflow-y: auto; } -.marke { +/* Die Marke der Seitenleiste hat eine eigene Klasse: ".marke" allein ist + weiter unten die kleine Statusmarke, deren Regeln hier sonst gewönnen. */ +.seitenleisten-marke { + display: flex; + align-items: center; + gap: .6rem; + width: 100%; + background: none; + border: 0; + border-bottom: 1px solid rgba(255, 255, 255, .08); + font-family: inherit; font-size: 1.05rem; - font-weight: 600; + font-weight: 700; color: #fff; - padding: 1.25rem 1.25rem 1rem; + padding: 1.1rem 1.25rem; letter-spacing: .01em; + text-align: left; + cursor: pointer; } +.seitenleisten-marke:hover { background: rgba(255, 255, 255, .05); } + + +.marken-symbol { + width: 1.6em; + height: 1.6em; + flex-shrink: 0; + object-fit: contain; +} + +.marken-text { color: #fff; white-space: nowrap; } + +/* Wie im Steuerkram: die zweite Worthälfte trägt die Akzentfarbe. */ +.marken-text span { color: var(--navi-marke); } + .seitenleiste ul { list-style: none; margin: 0; @@ -166,6 +194,32 @@ code { min-width: 0; } +/* ── Eingeklappte Seitenleiste ───────────────────────────────────────────── */ + +/* Ein Klick auf die Marke schiebt die Leiste auf Symbolbreite zusammen. Die + Beschriftungen verschwinden nur aus dem Bild, nicht aus dem Baum – sonst + verlören die Verweise ihren Namen für Vorleseprogramme. */ +.rahmen.eingeklappt { grid-template-columns: 64px 1fr; } + +.rahmen.eingeklappt .seitenleisten-marke, +.rahmen.eingeklappt .seitenleiste a { + justify-content: center; + gap: 0; + padding-left: 0; + padding-right: 0; +} + + +.rahmen.eingeklappt .marken-text, +.rahmen.eingeklappt .beschriftung { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; +} + /* ── Werkzeugleiste ──────────────────────────────────────────────────────── */ .werkzeugleiste { @@ -2070,7 +2124,25 @@ table.liste tr.luecke td { /* ── Schmale Fenster ─────────────────────────────────────────────────────── */ @media (max-width: 820px) { - .rahmen { grid-template-columns: 1fr; } + .rahmen, + .rahmen.eingeklappt { grid-template-columns: 1fr; } + + /* Waagerecht gibt es nichts zu sparen: Beschriftungen bleiben sichtbar. */ + .rahmen.eingeklappt .marken-text, + .rahmen.eingeklappt .beschriftung { + position: static; + width: auto; + height: auto; + clip-path: none; + } + + .rahmen.eingeklappt .seitenleisten-marke, + .rahmen.eingeklappt .seitenleiste a { + justify-content: flex-start; + gap: .6rem; + padding-left: 1.25rem; + padding-right: 1.25rem; + } .seitenleiste { position: static; diff --git a/public/static/app.js b/public/static/app.js index 97c97a8..b0935d6 100644 --- a/public/static/app.js +++ b/public/static/app.js @@ -11,6 +11,24 @@ (function () { 'use strict'; + // Die Marke klappt die Seitenleiste auf Symbolbreite zusammen und wieder + // auf. Der Zustand steht in einem Cookie und nicht im localStorage: So + // rendert der Server die Leiste schon in der richtigen Breite, statt sie + // bei jedem Seitenwechsel kurz breit aufblitzen zu lassen. + const schalter = document.querySelector('[data-seitenleiste-schalter]'); + const rahmen = document.querySelector('.rahmen'); + if (schalter && rahmen) { + schalter.addEventListener('click', function () { + const eingeklappt = rahmen.classList.toggle('eingeklappt'); + + schalter.setAttribute('aria-expanded', eingeklappt ? 'false' : 'true'); + schalter.title = eingeklappt ? 'Seitenleiste ausklappen' : 'Seitenleiste einklappen'; + + document.cookie = 'seitenleiste=' + (eingeklappt ? 'eingeklappt' : 'offen') + + '; path=/; max-age=31536000; samesite=lax'; + }); + } + // Formulare mit data-bestaetigen fragen vor dem Absenden nach. // In der Capture-Phase, damit die Rückfrage auch dann greift, wenn ein // anderer Handler das Ereignis unterwegs stoppt. diff --git a/public/static/coinstack.png b/public/static/coinstack.png new file mode 100644 index 0000000..40b952c Binary files /dev/null and b/public/static/coinstack.png differ diff --git a/src/Views/layout/kopf.php b/src/Views/layout/kopf.php index 992b439..64480bd 100644 --- a/src/Views/layout/kopf.php +++ b/src/Views/layout/kopf.php @@ -20,6 +20,11 @@ $navigation = [ ['pfad' => '/verwaltung', 'name' => 'Verwaltung', 'icon' => '⚙', 'auch' => ['/termine', '/vertraege']], ]; +// Ob die Seitenleiste eingeklappt ist, merkt sich ein Cookie. Das Skript +// setzt es beim Umschalten; hier entscheidet es schon beim Rendern, damit die +// breite Leiste nicht bei jedem Seitenwechsel kurz aufblitzt. +$eingeklappt = ($_COOKIE['seitenleiste'] ?? '') === 'eingeklappt'; + /** @param list $auch */ $istAktiv = static function (string $pfad, array $auch = []) use ($aktuellerPfad): bool { if (!is_string($aktuellerPfad)) { @@ -50,16 +55,26 @@ $istAktiv = static function (string $pfad, array $auch = []) use ($aktuellerPfad -
-