diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 4870547..c6d8423 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -9,6 +9,7 @@
"version": "0.1.0",
"dependencies": {
"@heroui/react": "^3.2.1",
+ "@heroui/styles": "^3.2.1",
"framer-motion": "^12.23.24",
"lucide-react": "^0.542.0",
"react": "^19.2.0",
diff --git a/frontend/src/app.css b/frontend/src/app.css
index 079ba0b..7bdc9d9 100644
--- a/frontend/src/app.css
+++ b/frontend/src/app.css
@@ -3,22 +3,6 @@
@custom-variant dark (&:is(.dark *));
-:root {
- --app-bg: #110f0d;
- --app-bg-soft: #181513;
- --app-panel: #1d1a1f;
- --app-panel-strong: #221e24;
- --app-panel-muted: #171419;
- --app-border: rgba(255, 255, 255, 0.08);
- --app-border-strong: rgba(255, 166, 77, 0.22);
- --app-text: #f6f2ee;
- --app-text-muted: #b8aca1;
- --app-accent: #ff8a3d;
- --app-accent-strong: #ff6a00;
- --app-accent-soft: rgba(255, 138, 61, 0.14);
- --app-accent-glow: rgba(255, 138, 61, 0.28);
-}
-
html, body, #root {
min-height: 100%;
}
@@ -26,11 +10,8 @@ html, body, #root {
body {
margin: 0;
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
- background:
- radial-gradient(circle at top left, rgba(255, 106, 0, 0.12), transparent 22%),
- radial-gradient(circle at top right, rgba(255, 138, 61, 0.08), transparent 18%),
- linear-gradient(180deg, #0f0d0c 0%, #141110 100%);
- color: var(--app-text);
+ background: var(--background);
+ color: var(--foreground);
}
* {
@@ -41,137 +22,37 @@ button {
cursor: pointer;
}
-input,
-textarea,
select {
width: 100%;
- border: 1px solid rgba(255, 255, 255, 0.14);
- border-radius: 14px;
- background: rgba(255, 255, 255, 0.05);
- color: inherit;
+ border: var(--border-width-field) solid var(--field-border, var(--border));
+ border-radius: var(--radius-field);
+ background: var(--field-background, var(--default));
+ color: var(--field-foreground, var(--foreground));
font: inherit;
- padding: 0.85rem 1rem;
- transition: border-color 160ms ease, background-color 160ms ease, box-shadow 160ms ease;
+ padding: 0.6rem 0.85rem;
+ transition: border-color 150ms ease, background-color 150ms ease;
}
-textarea {
- min-height: 120px;
- resize: vertical;
-}
-
-input::placeholder,
-textarea::placeholder {
- color: rgba(255, 255, 255, 0.42);
-}
-
-input:hover,
-textarea:hover,
select:hover {
- border-color: rgba(255, 255, 255, 0.22);
- background: rgba(255, 255, 255, 0.07);
+ background: var(--field-hover);
}
-input:focus,
-textarea:focus,
select:focus {
outline: none;
- border-color: var(--app-accent);
- box-shadow: 0 0 0 3px rgba(255, 138, 61, 0.16);
- background: rgba(255, 255, 255, 0.08);
+ border-color: var(--field-border-focus);
+ background: var(--field-focus);
}
label {
display: inline-block;
- margin-bottom: 0.45rem;
- font-size: 0.95rem;
- font-weight: 600;
-}
-
-.surface-card {
- background: linear-gradient(180deg, rgba(31, 27, 33, 0.96), rgba(23, 20, 25, 0.96));
- border: 1px solid var(--app-border);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.03);
-}
-
-.surface-card-strong {
- background: linear-gradient(180deg, rgba(36, 30, 24, 0.98), rgba(25, 21, 18, 0.98));
- border: 1px solid var(--app-border-strong);
- box-shadow:
- inset 0 1px 0 rgba(255, 255, 255, 0.03),
- 0 18px 50px rgba(0, 0, 0, 0.28);
-}
-
-.surface-card-muted {
- background: rgba(255, 255, 255, 0.025);
- border: 1px solid rgba(255, 255, 255, 0.06);
-}
-
-.accent-text {
- color: var(--app-accent);
-}
-
-.accent-chip {
- background: var(--app-accent-soft);
- color: #ffb37f;
- border: 1px solid rgba(255, 138, 61, 0.18);
-}
-
-.accent-button {
- background: linear-gradient(135deg, var(--app-accent) 0%, var(--app-accent-strong) 100%);
- color: white;
- border: 1px solid rgba(255, 166, 77, 0.45);
- box-shadow: 0 10px 24px rgba(255, 106, 0, 0.18);
-}
-
-.accent-button:hover {
- filter: brightness(1.06);
-}
-
-.accent-button-soft {
- background: var(--app-accent-soft);
- color: #ffbc8e;
- border: 1px solid rgba(255, 138, 61, 0.18);
-}
-
-.ghost-button {
- background: rgba(255, 255, 255, 0.03);
- border: 1px solid rgba(255, 255, 255, 0.09);
- color: var(--app-text);
-}
-
-.nav-button {
- color: var(--app-text-muted);
-}
-
-.nav-button:hover {
- background: rgba(255, 138, 61, 0.08);
- color: var(--app-text);
-}
-
-.nav-button-active {
- background: linear-gradient(135deg, rgba(255, 138, 61, 0.22), rgba(255, 106, 0, 0.24));
- color: white;
- border: 1px solid rgba(255, 138, 61, 0.28);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
-}
-
-.sidebar-shell {
- background: linear-gradient(180deg, rgba(16, 14, 13, 0.98), rgba(18, 15, 14, 0.98));
- border-right: 1px solid rgba(255, 255, 255, 0.05);
-}
-
-.brand-mark {
- background: linear-gradient(135deg, var(--app-accent) 0%, var(--app-accent-strong) 100%);
- box-shadow: 0 12px 30px rgba(255, 106, 0, 0.22);
-}
-
-.section-subtle {
- color: var(--app-text-muted);
+ margin-bottom: 0.35rem;
+ font-size: 0.875rem;
+ font-weight: 500;
+ color: var(--foreground);
}
.scrollbar-thin {
scrollbar-width: thin;
- scrollbar-color: rgba(255, 255, 255, 0.15) transparent;
}
.scrollbar-thin::-webkit-scrollbar {
@@ -180,6 +61,6 @@ label {
}
.scrollbar-thin::-webkit-scrollbar-thumb {
- background: rgba(255, 255, 255, 0.15);
+ background: var(--border);
border-radius: 999px;
}
diff --git a/frontend/src/components/layout/AppLayout.tsx b/frontend/src/components/layout/AppLayout.tsx
index 98d025f..050d002 100644
--- a/frontend/src/components/layout/AppLayout.tsx
+++ b/frontend/src/components/layout/AppLayout.tsx
@@ -8,8 +8,9 @@ export function AppLayout({ children }: { children: React.ReactNode }) {
if (loading) {
return (
-
-
+
+
+
Dashboard wird geladen...
);
}
@@ -17,7 +18,7 @@ export function AppLayout({ children }: { children: React.ReactNode }) {
if (!guilds.length) {
return (
-
Keine Server verfügbar
+
Keine Server verfügbar
);
}
diff --git a/frontend/src/components/layout/Header.tsx b/frontend/src/components/layout/Header.tsx
index c777222..87b5f8b 100644
--- a/frontend/src/components/layout/Header.tsx
+++ b/frontend/src/components/layout/Header.tsx
@@ -1,7 +1,8 @@
-import { Button, Chip, Tooltip, Dropdown, DropdownTrigger, DropdownMenu, DropdownItem, Avatar } from '@heroui/react';
+import { Button, Chip, Tooltip, Dropdown, DropdownTrigger, DropdownPopover, DropdownMenu, DropdownItem } from '@heroui/react';
import { Moon, Sun, ChevronDown, LogOut, Settings } from 'lucide-react';
import { useTheme } from '../../hooks/useTheme';
import { useApp } from '../../context/AppContext';
+import { AppAvatar } from '../shared/AppAvatar';
const navLabels: Record
= {
overview: 'Übersicht',
@@ -30,14 +31,14 @@ export function Header() {
return (
-
-
diff --git a/frontend/src/components/layout/Sidebar.tsx b/frontend/src/components/layout/Sidebar.tsx
index ff817ce..35ecc9b 100644
--- a/frontend/src/components/layout/Sidebar.tsx
+++ b/frontend/src/components/layout/Sidebar.tsx
@@ -1,6 +1,6 @@
import { useState } from 'react';
import {
- Avatar, Button, Card, CardContent, ScrollShadow, Tooltip,
+ Button, Card, CardContent, ScrollShadow, Tooltip,
Select, SelectTrigger, SelectValue, SelectPopover, ListBox, ListBoxItem
} from '@heroui/react';
import {
@@ -9,6 +9,7 @@ import {
Shield, Sparkles, Tag, Ticket, Wrench
} from 'lucide-react';
import { useApp } from '../../context/AppContext';
+import { AppAvatar } from '../shared/AppAvatar';
const navGroups = [
{
@@ -63,13 +64,13 @@ export function Sidebar() {
const [collapsed, setCollapsed] = useState(false);
return (
-