@@ -625,7 +623,7 @@ function App() {
>
Bot aktiv
-
+
@@ -644,24 +642,24 @@ function App() {
/>
-
+
Activity
Live-Statistiken aus deinem Bot
-
-
+
+
} kind="messages" label="Messages (24h)" value={activity?.messages24h ?? 0} />
} kind="commands" label="Commands (24h)" value={activity?.commands24h ?? 0} />
} kind="automod" label="Automod (24h)" value={activity?.automod24h ?? 0} />
} variant="bordered" onPress={() => setSection('settings')}>
Alle Logs anzeigen
-
+
-
+
Guild Logs
Neueste Ereignisse
@@ -669,13 +667,13 @@ function App() {
} size="sm" variant="light" onPress={() => setSection('settings')}>
Alle anzeigen
-
-
+
+
{logs.length ? (
logs.map((log, index) => (
-
+
{(log.level || 'info').toUpperCase()}
@@ -683,38 +681,38 @@ function App() {
{formatDate(log.timestamp)}
{log.category ? `[${log.category}] ` : ''}{log.message || '-'}
-
+
))
) : (
Keine Logs
)}
-
+
-
+
Schnellzugriff
Die wichtigsten Bereiche deines Dashboards
-
-
+
+
{navItems
.filter((item) => !['overview', 'admin'].includes(item.key))
.slice(0, 6)
.map((item) => (
setSection(item.key)}>
-
+
{item.icon}
{item.label}
HeroUI-Komponenten fuer den Bereich {item.label}
-
+
))}
-
+
)}
@@ -914,13 +912,13 @@ function App() {
{modules.map((module) => (
-
+
{module.name}
{module.description || ''}
void toggleModule(module.key, value)} />
-
+
))}
@@ -933,14 +931,14 @@ function App() {
{(events || []).map((event) => (
-
+
{event.title}
deleteEvent(event.id)}>Löschen
{event.description || 'Keine Beschreibung'}
{formatDate(event.startsAt)}
-
+
))}
@@ -973,13 +971,13 @@ function App() {
function SectionCard(props: { title: string; subtitle: string; children: React.ReactNode }) {
return (
-
+
{props.title}
{props.subtitle}
-
- {props.children}
+
+ {props.children}
);
}
@@ -987,10 +985,10 @@ function SectionCard(props: { title: string; subtitle: string; children: React.R
function FormCard(props: { title: string; children: React.ReactNode }) {
return (
-
+
{props.title}
-
- {props.children}
+
+ {props.children}
);
}
@@ -998,14 +996,14 @@ function FormCard(props: { title: string; children: React.ReactNode }) {
function ListCard(props: { title: string; items: string[] }) {
return (
-
+
{props.title}
-
-
+
+
{props.items.length ? props.items.map((item, index) =>
{item}
) :
Keine Daten
}
-
+
);
}
@@ -1013,30 +1011,30 @@ function ListCard(props: { title: string; items: string[] }) {
function InfoPanel(props: { title: string; items: Array<{ icon: React.ReactNode; label: string; value: string }>; actionLabel: string; onAction: () => void }) {
return (
-
+
{props.title}
Wichtige Guild-Daten auf einen Blick
-
-
+
+
{props.items.map((item) => (
-
+
{item.icon}
{item.label}
{item.value}
-
+
))}
} variant="bordered" onPress={props.onAction}>
{props.actionLabel}
-
+
);
}
@@ -1044,7 +1042,7 @@ function InfoPanel(props: { title: string; items: Array<{ icon: React.ReactNode;
function ActivityTile(props: { icon: React.ReactNode; label: string; value: number; kind: 'messages' | 'commands' | 'automod' }) {
return (
-
+
{props.icon}
@@ -1055,7 +1053,7 @@ function ActivityTile(props: { icon: React.ReactNode; label: string; value: numb
-
+
);
}
@@ -1072,13 +1070,13 @@ function SettingsLayout(props: { title: string; subtitle: string; children: Reac
-
+
Design-Richtung
Dieser Bereich nutzt jetzt dieselbe HeroUI-Oberfläche wie dein Overview-Dashboard.
Die tieferen Spezial-Workflows aus dem alten Inline-Dashboard werden hier schrittweise in echte React-Komponenten überführt.
-
+
diff --git a/frontend/src/app.css b/frontend/src/app.css
index 3706a4c..d320f20 100644
--- a/frontend/src/app.css
+++ b/frontend/src/app.css
@@ -1,4 +1,7 @@
@import "tailwindcss";
+@import "@heroui/styles";
+
+@custom-variant dark (&:is(.dark *));
:root {
color-scheme: dark;