diff --git a/src/PolyTrader.Web/wwwroot/css/app.css b/src/PolyTrader.Web/wwwroot/css/app.css
index ec91599..9b782ee 100644
--- a/src/PolyTrader.Web/wwwroot/css/app.css
+++ b/src/PolyTrader.Web/wwwroot/css/app.css
@@ -94,6 +94,147 @@ body {
background: var(--accent-soft);
}
+/* Aufklappmenues der Kopfleiste (#541) */
+.nav-dropdown {
+ position: relative;
+}
+
+.nav-dropdown-toggle {
+ display: inline-flex;
+ align-items: center;
+ gap: 7px;
+}
+
+/* Winkel statt Zeichen: "▾" sitzt je nach Schrift unterschiedlich hoch. */
+.nav-dropdown-toggle::after {
+ content: "";
+ width: 6px;
+ height: 6px;
+ border-right: 1.5px solid currentColor;
+ border-bottom: 1.5px solid currentColor;
+ transform: translateY(-2px) rotate(45deg);
+ transition: transform 0.15s;
+}
+
+.nav-dropdown-toggle[aria-expanded="true"]::after {
+ transform: translateY(1px) rotate(225deg);
+}
+
+.nav-dropdown-toggle[aria-expanded="true"]:not(.active) {
+ color: var(--text);
+ background: var(--surface-alt);
+}
+
+.nav-menu {
+ position: absolute;
+ top: calc(100% + 6px);
+ left: 0;
+ min-width: 220px;
+ max-width: calc(100vw - 16px);
+ display: flex;
+ flex-direction: column;
+ gap: 1px;
+ padding: 6px;
+ background: var(--card);
+ border: 1px solid var(--divider);
+ border-radius: 8px;
+ box-shadow: 0 12px 28px rgba(0, 0, 0, 0.45);
+ z-index: 200;
+}
+
+/* Ohne diese Regel gewinnt display:flex gegen das hidden-Attribut. */
+.nav-menu[hidden] {
+ display: none;
+}
+
+.nav-menu-group {
+ display: flex;
+ flex-direction: column;
+ gap: 1px;
+}
+
+.nav-menu-item {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 16px;
+ width: 100%;
+ padding: 8px 10px;
+ background: transparent;
+ border: none;
+ border-radius: 6px;
+ color: var(--text);
+ font: inherit;
+ font-size: 14px;
+ text-align: left;
+ white-space: nowrap;
+ cursor: pointer;
+}
+
+.nav-menu-item:hover:not(:disabled) {
+ background: var(--surface-alt);
+}
+
+.nav-menu-item:focus-visible {
+ outline: 2px solid var(--accent);
+ outline-offset: -2px;
+}
+
+.nav-menu-item.active {
+ color: var(--accent);
+ background: var(--accent-soft);
+}
+
+.nav-menu-item:disabled {
+ color: var(--muted);
+ cursor: not-allowed;
+ opacity: 0.7;
+}
+
+.nav-menu-hint {
+ font-size: 11px;
+ color: var(--muted);
+}
+
+.nav-menu-sep {
+ height: 1px;
+ margin: 5px 4px;
+ background: var(--border);
+}
+
+.nav-menu-label {
+ padding: 4px 10px 2px;
+ font-size: 11px;
+ font-weight: 600;
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+ color: var(--muted);
+}
+
+/* Schmale Fenster: Ein Menue, das am Oberelement klebt, ragt dort ueber den rechten Rand -
+ bei 400 px stand "Module" 35 px heraus. Nachmessen per Skript taugt als Abhilfe nicht:
+ Auf Mobilgeraeten waechst der Layout-Viewport mit dem Ueberstand mit, und die Messung meldet
+ genau dann "passt". Deshalb haengen die Menues hier an der ganzen Leiste statt am einzelnen
+ Eintrag. Ab 760 px passt die angeheftete Form: gemessen bei 768 px endet das aeusserste
+ Menue bei 701 px. */
+@media (max-width: 760px) {
+ .header-nav {
+ position: relative;
+ }
+
+ .nav-dropdown {
+ position: static;
+ }
+
+ .nav-menu {
+ left: 0;
+ right: 0;
+ top: calc(100% + 2px);
+ min-width: 0;
+ max-width: none;
+ }
+}
+
.header-actions {
display: flex;
align-items: center;
diff --git a/src/PolyTrader.Web/wwwroot/index.html b/src/PolyTrader.Web/wwwroot/index.html
index 1d1e936..a35cad7 100644
--- a/src/PolyTrader.Web/wwwroot/index.html
+++ b/src/PolyTrader.Web/wwwroot/index.html
@@ -14,18 +14,53 @@
WebGUI
-