From 03914083df73822c41d2b6a5e693d7f22148388d Mon Sep 17 00:00:00 2001 From: Pepe Ziberi Date: Sun, 19 Jul 2026 20:10:36 +0200 Subject: [PATCH] refactor(topbar): professionelle einzeilige Kopfzeile (v1.5.3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Kopfzeile war überladen (~11 konkurrierende Buttons in rot/blau/amber) und die Versionsnummer kaum lesbar. Neu wie ein Einsatz-Cockpit — ruhig, dreizonig: - Zone 1 Identität: Logo + "LAGEPLAN" + gut lesbare Version (mono) - Zone 2 Blickfang: aktiver Einsatz als Pille (Status-Punkt rot=Einsatz / blau=Übung, Einsatz-Nr mono, Titel, Ort) — mittig, flex-1, statt xl-only-Box - Zone 3: grosse Uhr + Speichern + "+ Neu ▾" (Split-Button Einsatz/Übung) + Werkzeug-Menü (Export, Präsentation, Vollbild, Tag/Nacht, Einsätze verwalten, Schlaucheinstellungen) + Beenden + Benutzer - Nur noch EIN Farbakzent (Status-Punkt) statt rot+blau+amber-Buttons - 4 einzelne Icon-Buttons (Theme/Vollbild/Präsentation) → ein Zahnrad-Menü - Zwei farbige "Neuer Einsatz/Neue Übung"-Buttons → ein "Neu"-Split-Button - Mobile-Menü entschlackt (Erstellen liegt jetzt im Neu-Button) Co-Authored-By: Claude Opus 4.8 (1M context) --- package.json | 2 +- src/components/layout/topbar.tsx | 248 +++++++++++++++---------------- 2 files changed, 121 insertions(+), 129 deletions(-) diff --git a/package.json b/package.json index a79a959..afdc0ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lageplan", - "version": "1.5.2", + "version": "1.5.3", "description": "Feuerwehr Lageplan - Krokier-App für Einsatzdokumentation", "private": true, "scripts": { diff --git a/src/components/layout/topbar.tsx b/src/components/layout/topbar.tsx index 1941cd8..9fdf3ca 100644 --- a/src/components/layout/topbar.tsx +++ b/src/components/layout/topbar.tsx @@ -23,7 +23,6 @@ import { Save, FolderOpen, Download, - Clock, Sun, Moon, Maximize, @@ -45,6 +44,9 @@ import { Lock, Unlock, CheckCircle2, + Plus, + ChevronDown, + Loader2, } from 'lucide-react' import { HoseSettingsDialog } from '@/components/dialogs/hose-settings-dialog' import type { Project, DrawFeature, ProjectMode } from '@/types' @@ -161,155 +163,149 @@ export function Topbar({ } return ( -
-
-
- - Lageplan - v{process.env.APP_VERSION} -
- -
- -
- - - - - {/* Direkte Einstiegspunkte: Einsatz (rot) und Übung (blau) */} - - - - - - - - - - - Einsätze verwalten - - handleExport('png')} className="py-2.5 px-3"> - - Als PNG exportieren - - handleExport('pdf')} className="py-2.5 px-3"> - - Als PDF exportieren - - {onClearAll && ( - - - Zeichnung leeren - - )} - {(userRole === 'SERVER_ADMIN' || userRole === 'TENANT_ADMIN') && ( - window.location.href = '/admin'} className="py-2.5 px-3"> - - Einstellungen - - )} - - +
+ {/* Zone 1 — Identität */} +
+ +
+ LAGEPLAN + v{process.env.APP_VERSION}
-
- {/* Project info - desktop only */} - {project && ( -
+
+ + {/* Zone 2 — Aktiver Einsatz (Blickfang) */} +
+ {project ? ( +
+ {(project as any).einsatzNr && ( - {(project as any).einsatzNr} + {(project as any).einsatzNr} )} - {project.title} + {project.title} {project.location && ( - <>|{project.location} + · {project.location} )}
+ ) : ( + Kein Einsatz aktiv )} +
- {/* Clock - desktop only */} -
- - {now.toLocaleTimeString('de-CH', { hour: '2-digit', minute: '2-digit' })} -
- - {/* Desktop: individual buttons */} - + {/* Zone 3 — Uhr + Aktionen */} +
+ {/* Uhr — Ops-Rooms leben nach der Uhr */} + + {now.toLocaleTimeString('de-CH', { hour: '2-digit', minute: '2-digit' })} + + {/* Speichern */} + {/* Neu — Split-Button für Einsatz/Übung (ein Akzent statt zwei farbiger Buttons) */} + + + + + + onNewProject('EINSATZ')} className="py-2.5"> + + Neuer Einsatz + + onNewProject('UEBUNG')} className="py-2.5"> + + Neue Übung + + + + + {/* Werkzeuge (Desktop) — sammelt alle Neben-Aktionen in einem Menü */} + + + + + + + + Einsätze verwalten + + + handleExport('png')}> + + Als PNG exportieren + + handleExport('pdf')}> + + Als PDF exportieren + + {onClearAll && ( + + + Zeichnung leeren + + )} + + {onTogglePresentationLock && ( + + {presentationLocked ? : } + {presentationLocked ? 'Präsentation: gesperrt' : 'Präsentationsmodus'} + + )} + + {isFullscreen ? : } + {isFullscreen ? 'Vollbild verlassen' : 'Vollbild'} + + + {isDarkMode ? : } + {isDarkMode ? 'Tagmodus' : 'Nachtmodus'} + + setIsHoseSettingsOpen(true)}> + + Schlaucheinstellungen + + + + + {/* Einsatz beenden (Desktop) */} {project && onEndProject && ( )} - {/* Desktop: User menu dropdown */} + {/* Benutzer (Desktop) */} {userName && onLogout && ( -
+
- @@ -366,17 +362,13 @@ export function Topbar({ )} - {/* Einsatz / Übung */} + {/* Einsatz / Übung (Erstellen liegt im „Neu"-Button) */} {project && onEndProject && ( {project.mode === 'UEBUNG' ? 'Übung beenden' : 'Einsatz beenden'} )} - onNewProject('UEBUNG')}> - - Neue Übung - Einsätze verwalten