-
Status
-
-
-
Online
+
+ {/* Spalte 4: TECH STACK (DEINE REPO DATEN) */}
+
+
System Architecture
+
+ {/* Python */}
+
+
+ Python (Core)
+ 66.6%
+
+
+
+
+
+
+ {/* TypeScript */}
+
+
+ TypeScript (Web)
+ 32.0%
+
+
+
+
+
+
+
{/* --- BOTTOM BAR --- */}
-
+
Built with
by ManagerX Dev Team
+
+
+
+
+ Open Source Project
+
+
+
- © {new Date().getFullYear()} / V2.0.0
+ © {new Date().getFullYear()} / ALL RIGHTS RESERVED
diff --git a/src/web/components/Navbar.tsx b/src/web/components/Navbar.tsx
index 284f147..0512810 100644
--- a/src/web/components/Navbar.tsx
+++ b/src/web/components/Navbar.tsx
@@ -1,18 +1,20 @@
import { useState, useEffect } from "react";
import { motion, AnimatePresence } from "framer-motion";
+import { Link, useLocation } from "react-router-dom";
import { Button } from "@/components/ui/button";
-import { Shield, Menu, X, Sparkles } from "lucide-react";
+import { Shield, Menu, X, Sparkles, Puzzle, Activity } from "lucide-react"; // Activity Icon hinzugefügt
import { cn } from "@/lib/utils";
const navLinks = [
- { label: "Features", href: "#features" },
- { label: "Commands", href: "#commands" },
- { label: "Support", href: "#support" },
+ { label: "Features", href: "/#features" },
+ { label: "Plugins", href: "/plugins", icon: Puzzle },
+ { label: "Status", href: "/status", icon: Activity }, // Status Link hinzugefügt
];
export function Navbar() {
const [isScrolled, setIsScrolled] = useState(false);
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
+ const location = useLocation();
useEffect(() => {
const handleScroll = () => {
@@ -29,121 +31,99 @@ export function Navbar() {
transition={{ duration: 0.6, ease: "easeOut" }}
className={cn(
"fixed top-0 left-0 right-0 z-50 transition-all duration-500",
- isScrolled ? "glass-strong py-3" : "py-5 bg-transparent"
+ isScrolled ? "glass-strong py-3 shadow-lg shadow-primary/5" : "py-5 bg-transparent"
)}
>
-
- {/* Mobile Menu */}
-
- {isMobileMenuOpen && (
-
-
-
- {navLinks.map((link, index) => (
-
setIsMobileMenuOpen(false)}
- initial={{ opacity: 0, x: -20 }}
- animate={{ opacity: 1, x: 0 }}
- transition={{ delay: index * 0.1 }}
- className="text-muted-foreground hover:text-foreground transition-colors py-3 px-4 rounded-xl hover:bg-card/50 font-medium"
- >
- {link.label}
-
- ))}
-
-
-
-
-
-
- )}
-
+
+ {/* Mobile Menu */}
+
+ {isMobileMenuOpen && (
+
+
+ {navLinks.map((link) => (
+
setIsMobileMenuOpen(false)}
+ className={cn(
+ "text-2xl font-black italic uppercase flex items-center gap-3",
+ location.pathname === link.href ? "text-primary" : "text-white"
+ )}
+ >
+ {link.icon &&
}
+ {link.label}
+
+ ))}
+
+ Bot einladen
+
+
+
+ )}
+
);
}
\ No newline at end of file
diff --git a/src/web/pages/PluginsPage.tsx b/src/web/pages/PluginsPage.tsx
new file mode 100644
index 0000000..fec14e4
--- /dev/null
+++ b/src/web/pages/PluginsPage.tsx
@@ -0,0 +1,182 @@
+import { memo } from "react";
+import { Link } from "react-router-dom";
+import { motion } from "framer-motion";
+import {
+ ArrowLeft, Puzzle, Gamepad2, Globe, ShieldCheck,
+ Users, Zap, Settings2, Code2, Layers, Mail, Github
+} from "lucide-react";
+import { Navbar } from "../components/Navbar";
+import { Footer } from "../components/Footer";
+
+const corePlugins = [
+ {
+ title: "AI Entertainment",
+ features: ["4-Gewinnt (VS KI)", "TicTacToe (VS KI)"],
+ description: "Intelligente Minispiele direkt im Discord-Chat durch moderne KI-Integration.",
+ icon: Gamepad2,
+ },
+ {
+ title: "Global Network",
+ features: ["Globalchat", "Server-übergreifend"],
+ description: "Verbinde deine Community mit dem gesamten ManagerX-Netzwerk weltweit.",
+ icon: Globe,
+ },
+ {
+ title: "Security Core",
+ features: ["Antispam", "Moderation", "Warn-System", "Notes"],
+ description: "Vollständiger Schutz und Verwaltung für dein Team mit intelligenten Filtern.",
+ icon: ShieldCheck,
+ },
+ {
+ title: "Social & Engagement",
+ features: ["Levelsystem", "Welcome-Engine", "TempVC"],
+ description: "Steigere die Aktivität durch Belohnungen und vollautomatische Sprachkanäle.",
+ icon: Users,
+ },
+ {
+ title: "Automation",
+ features: ["Autodelete", "Autorole", "Loggingsystem"],
+ description: "Halte deinen Server sauber und organisiert – alles vollautomatisch im Hintergrund.",
+ icon: Zap,
+ },
+ {
+ title: "System Control",
+ features: ["Settings", "Stats"],
+ description: "Behalte den vollen Überblick mit detaillierten Analysen und einfacher Konfiguration.",
+ icon: Settings2,
+ }
+];
+
+export const PluginsPage = memo(function PluginsPage() {
+ return (
+
+
+
+
+
+
+ {/* Zurück Button */}
+
+
+
+ Zurück zur Startseite
+
+
+
+ {/* Header Bereich */}
+
+
+ {/* Core Plugins Grid */}
+
+ {corePlugins.map((plugin, index) => (
+
+
+
+
Module 0{index + 1}
+
+
+ {plugin.title}
+
+ {plugin.description}
+
+
+
+ {plugin.features.map(f => (
+
+ #{f.replace(/\s+/g, '_')}
+
+ ))}
+
+
+ ))}
+
+
+ {/* External Section - Dezent wie Kontaktbereich */}
+
+
+
+
External Marketplace
+ COMING SOON
+
+
+
+
+
+
Developer SDK
+
+ Erstelle eigene Python-Module und integriere sie nahtlos in das ManagerX Ökosystem.
+
+
+
+
+
Community Library
+
+ Teile deine Plugins mit der Community oder entdecke Module von anderen Entwicklern.
+
+
+
+
+
+ {/* Kontakt / Support Footer wie in Legal-Seiten */}
+
+
+
Modul-Wunsch?
+
Kontaktiere uns für individuelle Funktions-Ideen.
+
+
+
+
+
+
+
+
+
+ );
+});
+
+export default PluginsPage;
\ No newline at end of file
diff --git a/src/web/pages/Status.tsx b/src/web/pages/Status.tsx
new file mode 100644
index 0000000..8bded3a
--- /dev/null
+++ b/src/web/pages/Status.tsx
@@ -0,0 +1,196 @@
+import { memo, useState, useEffect } from "react";
+import { Link } from "react-router-dom";
+import { motion } from "framer-motion";
+import {
+ ArrowLeft, Activity, Globe, Cpu, Layers,
+ CheckCircle2, XCircle, Mail, Github
+} from "lucide-react";
+import { Navbar } from "../components/Navbar";
+import { Footer } from "../components/Footer";
+
+const Status = memo(function Status() {
+ // State für die Live-Daten vom Bot
+ const [data, setData] = useState({
+ status: "loading",
+ latency: "--",
+ version: "2.0.0",
+ guilds: 0
+ });
+
+ useEffect(() => {
+ const fetchStatus = async () => {
+ try {
+ // Abfrage an deinen Py-cord Bot auf Port 8040
+ const response = await fetch("http://localhost:8040/api/status");
+ if (!response.ok) throw new Error("Offline");
+
+ const result = await response.json();
+ setData({
+ status: "online",
+ latency: result.latency,
+ version: result.version,
+ guilds: result.guilds
+ });
+ } catch (error) {
+ // Falls der Bot nicht erreichbar ist
+ setData((prev) => ({ ...prev, status: "offline", latency: "--" }));
+ }
+ };
+
+ fetchStatus();
+ // Alle 15 Sekunden aktualisieren
+ const interval = setInterval(fetchStatus, 15000);
+ return () => clearInterval(interval);
+ }, []);
+
+ const systems = [
+ {
+ name: "ManagerX Core Engine",
+ status: data.status,
+ latency: data.latency,
+ description: `Zentrale Instanz (v${data.version}) inkl. KI & SQLite`,
+ icon: Cpu,
+ isParent: true
+ },
+ {
+ name: "Globalchat Network",
+ status: data.status === "online" ? "online" : "offline",
+ latency: "Active",
+ description: "Echtzeit-Verbindung zum ManagerX-Netzwerk",
+ icon: Globe,
+ },
+ {
+ name: "Static Content",
+ status: "online", // Website läuft ja gerade
+ latency: "2ms",
+ description: "Bereitstellung von lokalen Modul-Assets",
+ icon: Layers,
+ }
+ ];
+
+ return (
+
+
+
+
+
+
+
+
+
+ Zurück zur Zentrale
+
+
+
+
+
+
+
+
+ System Status
+
+
+
+
+
+
+
+ {data.status === "online" ? "Alle Systeme stabil" : "Verbindung zum Core unterbrochen"}
+
+
+
+
+
+
+
+ {systems.map((system, index) => (
+
+
+
+
+
+
+
{system.name}
+
{system.description}
+
+
+
+
+
+
Ping / Stats
+
+ {system.isParent && data.status === "online" ? `${data.latency}` : system.latency}
+
+
+
+
+ {system.status === "online" ? : }
+ {system.status}
+
+
+
+ ))}
+
+
+ {/* Footer Info */}
+
+
+
Aktive Gilden im Netzwerk: {data.guilds}
+
Überprüfung erfolgt alle 15 Sekunden via Local-API.
+
+
+
+
+
+
+
+
+
+ );
+});
+
+// Hilfsfunktion für Tailwind-Klassen (falls nicht vorhanden, einfach weglassen oder durch Template Strings ersetzen)
+function cn(...classes: any[]) {
+ return classes.filter(Boolean).join(" ");
+}
+
+export default Status;
\ No newline at end of file
diff --git a/vite.config.ts b/vite.config.ts
index f88ba0a..ffb1d23 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -4,6 +4,9 @@ import path from "path";
import { componentTagger } from "lovable-tagger";
export default defineConfig(({ mode }) => ({
+ // WICHTIG: Erlaubt korrekte Pfade auf deiner Subdomain
+ base: "/",
+
server: {
host: "::",
port: 8080,
@@ -11,10 +14,21 @@ export default defineConfig(({ mode }) => ({
overlay: false,
},
},
- plugins: [react(), mode === "development" && componentTagger()].filter(Boolean),
+ plugins: [
+ react(),
+ mode === "development" && componentTagger()
+ ].filter(Boolean),
resolve: {
alias: {
+ // Dein Alias zeigt auf ./src/web - das ist wichtig für deine Imports
"@": path.resolve(__dirname, "./src/web"),
},
},
+ build: {
+ // Stellt sicher, dass der Output-Ordner 'dist' heißt (passend zur deploy.yml)
+ outDir: "dist",
+ // Optimierung für sauberen Code
+ minify: "esbuild",
+ reportCompressedSize: false,
+ },
}));
\ No newline at end of file