diff --git a/build.rar b/build.rar new file mode 100644 index 0000000..1600f10 Binary files /dev/null and b/build.rar differ diff --git a/build.zip b/build.zip new file mode 100644 index 0000000..0411601 Binary files /dev/null and b/build.zip differ diff --git a/src/web/components/landing/CTA.tsx b/src/web/components/landing/CTA.tsx index 364abd2..806bb93 100644 --- a/src/web/components/landing/CTA.tsx +++ b/src/web/components/landing/CTA.tsx @@ -1,103 +1,167 @@ import { memo } from "react"; import { motion } from "framer-motion"; -import { ArrowRight, Sparkles } from "lucide-react"; +import { ArrowRight, Sparkles, Zap, Github, Shield, Star } from "lucide-react"; import { useStats } from "@/hooks/useStats"; +const FloatingOrb = ({ className, delay = 0 }: { className: string; delay?: number }) => ( + +); + export const CTA = memo(function CTA() { const { data, isLoading } = useStats(); const stats = [ - { label: "Aktive Server", value: isLoading ? "..." : `${data.guilds}` }, - { label: "Befehle", value: "90+" }, - { label: "Zufriedene User", value: isLoading ? "..." : `${data.users}` }, + { label: "Aktive Server", value: isLoading ? "—" : `${data.guilds}`, suffix: "" }, + { label: "Slash Commands", value: "90", suffix: "+" }, + { label: "Zufriedene Nutzer", value: isLoading ? "—" : `${data.users}`, suffix: "" }, ]; return ( -
- {/* Background Elements */} -
-
+
+ {/* Background */} +
+
+ + {/* Floating Orbs */} + + +
- {/* Top Glow Line */} -
+ {/* Card background with glass */} +
+
+ + {/* Animated top border line */} +
+
- - - 100% Kostenlos & Open Source - + {/* Corner decorations */} +
+
+
+
- - Bereit für das
- nächste Level? -
+
+ {/* Badge */} + + + 100% Kostenlos & Open Source + - - Füge ManagerX jetzt zu deinem Server hinzu und erlebe moderne Server-Verwaltung mit über 90 innovativen Befehlen. - + {/* Main headline */} + + Bereit für das{" "} + + nächste Level? + + - - - Bot einladen - - - 90 innovativen Befehlen. + + + {/* CTA Buttons */} + - Support Server - - + + + Bot einladen + + + + + Support Server + + + + GitHub + + - {/* Stats Footer Mapping */} -
- {stats.map((stat) => ( -
- - {stat.value} - - - {stat.label} - -
- ))} + {/* Stats */} +
+ {stats.map((stat, i) => ( + +
+ + {stat.value} + + {stat.suffix && ( + {stat.suffix} + )} +
+
+ + + {stat.label} + +
+
+ ))} +
diff --git a/src/web/components/landing/FAQ.tsx b/src/web/components/landing/FAQ.tsx index 72eb20a..bd40080 100644 --- a/src/web/components/landing/FAQ.tsx +++ b/src/web/components/landing/FAQ.tsx @@ -91,7 +91,7 @@ export const FAQ = memo(function FAQ() { diff --git a/src/web/components/landing/FeatureCard.tsx b/src/web/components/landing/FeatureCard.tsx index 23a1370..9c580e9 100644 --- a/src/web/components/landing/FeatureCard.tsx +++ b/src/web/components/landing/FeatureCard.tsx @@ -1,6 +1,6 @@ -import { memo } from "react"; -import { motion } from "framer-motion"; -import { LucideIcon, Check } from "lucide-react"; +import { memo, useState } from "react"; +import { motion, AnimatePresence } from "framer-motion"; +import { LucideIcon, Check, ArrowRight } from "lucide-react"; import { cn } from "@/lib/utils"; interface FeatureCardProps { @@ -9,27 +9,46 @@ interface FeatureCardProps { features: string[]; category: "moderation" | "community" | "social" | "interactive"; delay?: number; + index: number; } -const categoryColors = { - moderation: "text-[hsl(var(--moderation))]", - community: "text-[hsl(var(--community))]", - social: "text-[hsl(var(--social))]", - interactive: "text-[hsl(var(--interactive))]", -}; - -const categoryBgColors = { - moderation: "bg-[hsl(var(--moderation)/0.15)]", - community: "bg-[hsl(var(--community)/0.15)]", - social: "bg-[hsl(var(--social)/0.15)]", - interactive: "bg-[hsl(var(--interactive)/0.15)]", -}; - -const categoryGlows = { - moderation: "shadow-[hsl(var(--moderation)/0.2)]", - community: "shadow-[hsl(var(--community)/0.2)]", - social: "shadow-[hsl(var(--social)/0.2)]", - interactive: "shadow-[hsl(var(--interactive)/0.2)]", +const categoryConfig = { + moderation: { + color: "text-red-400", + bg: "bg-red-500/10", + border: "border-red-500/20", + glow: "shadow-[0_0_60px_rgba(239,68,68,0.25)]", + hoverBorder: "hover:border-red-500/50", + bar: "from-red-500 to-red-400", + accent: "rgba(239,68,68,0.3)", + }, + community: { + color: "text-orange-400", + bg: "bg-orange-500/10", + border: "border-orange-500/20", + glow: "shadow-[0_0_60px_rgba(249,115,22,0.25)]", + hoverBorder: "hover:border-orange-500/50", + bar: "from-orange-500 to-amber-400", + accent: "rgba(249,115,22,0.3)", + }, + social: { + color: "text-pink-400", + bg: "bg-pink-500/10", + border: "border-pink-500/20", + glow: "shadow-[0_0_60px_rgba(236,72,153,0.25)]", + hoverBorder: "hover:border-pink-500/50", + bar: "from-pink-500 to-rose-400", + accent: "rgba(236,72,153,0.3)", + }, + interactive: { + color: "text-amber-400", + bg: "bg-amber-500/10", + border: "border-amber-500/20", + glow: "shadow-[0_0_60px_rgba(245,158,11,0.25)]", + hoverBorder: "hover:border-amber-500/50", + bar: "from-amber-500 to-yellow-400", + accent: "rgba(245,158,11,0.3)", + }, }; export const FeatureCard = memo(function FeatureCard({ @@ -37,46 +56,106 @@ export const FeatureCard = memo(function FeatureCard({ title, features, category, - delay = 0 + delay = 0, + index, }: FeatureCardProps) { + const [hovered, setHovered] = useState(false); + const cfg = categoryConfig[category]; + return ( setHovered(true)} + onHoverEnd={() => setHovered(false)} + className={cn( + "group relative glass rounded-[2.5rem] p-8 border transition-all duration-500 overflow-hidden cursor-default", + cfg.border, + cfg.hoverBorder, + hovered ? cfg.glow : "shadow-xl", + )} > -
+ {/* Animated background gradient on hover */} + -
-
- + {/* Number badge */} +
+ {String(index + 1).padStart(2, "0")} +
+ + {/* Icon with glow ring */} +
+
+ +
-

+

{title}

-
- {features.map((feature, index) => ( -
+ +
+ +
+ {features.map((feature, i) => ( + - +
+ +
{feature} -
+ ))}
+ + {/* Bottom "Learn more" hint on hover */} + + {hovered && ( + + Details ansehen + + + )} + ); }); diff --git a/src/web/components/landing/Features.tsx b/src/web/components/landing/Features.tsx index b2d30a6..e9c9930 100644 --- a/src/web/components/landing/Features.tsx +++ b/src/web/components/landing/Features.tsx @@ -6,7 +6,8 @@ import { Award, Globe, Gamepad2, - Sparkles + Sparkles, + ChevronRight, } from "lucide-react"; const featureCategories = [ @@ -71,6 +72,8 @@ export const Features = memo(function Features() {
+ {/* Grid pattern overlay */} +
{/* Elite Section Header */} @@ -83,6 +86,8 @@ export const Features = memo(function Features() { > Next-Gen Architecture + + 4 Module {/* Feature Cards Elite Grid */} -
+
{featureCategories.map((category, index) => ( ))}
diff --git a/src/web/components/landing/Hero.tsx b/src/web/components/landing/Hero.tsx index cab96a7..fa4de80 100644 --- a/src/web/components/landing/Hero.tsx +++ b/src/web/components/landing/Hero.tsx @@ -27,6 +27,46 @@ export const Hero = memo(function Hero() { {/* High-End Grid Pattern */}
+ {/* Floating Decorative Elements */} +
+ + + +
+
{/* Elite Version Badge */} @@ -74,12 +114,12 @@ export const Hero = memo(function Hero() { initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ delay: 0.3 }} - className="flex flex-col sm:flex-row items-center gap-8 mb-32" + className="flex flex-col sm:flex-row items-center gap-8 mb-12" > + {/* Feature Ticker */} +
+
+
+ + {[...Array(2)].map((_, ri) => + ["90+ Slash Commands", "Anti-Spam Protection", "Global Leaderboards", "Temp Voice Channels", "XP & Level System", "Open Source GPL-3.0", "Cross-Server Chat", "Moderation Logs"].map((item, i) => ( +
+ + {item} +
+ )) + )} +
+
+
{stats.map((stat, index) => ( -
+
-
+
- {stat.value} - {stat.label} + {stat.value} + {stat.label}
))} diff --git a/src/web/components/landing/Testimonials.tsx b/src/web/components/landing/Testimonials.tsx index c9f2b0f..fb05ccf 100644 --- a/src/web/components/landing/Testimonials.tsx +++ b/src/web/components/landing/Testimonials.tsx @@ -1,6 +1,6 @@ import { memo } from "react"; import { motion } from "framer-motion"; -import { Star, Users, TrendingUp } from "lucide-react"; +import { Star, Users, Quote, Zap, Server, Heart } from "lucide-react"; import { useStats } from "../../hooks/useStats"; const testimonials = [ @@ -10,6 +10,7 @@ const testimonials = [ server: "Small Talk Central", members: "42", avatar: "L", + avatarColor: "from-red-500 to-orange-500", rating: 5, text: "Einer der ersten 10 Server zu sein hat Vorteile! Der Entwickler hört direkt auf Feedback. Das Levelsystem ist schon jetzt besser als bei den großen Bots.", }, @@ -19,6 +20,7 @@ const testimonials = [ server: "Dev Corner", members: "112", avatar: "M", + avatarColor: "from-blue-500 to-purple-500", rating: 5, text: "ManagerX ist zwar noch jung, aber extrem stabil. Endlich mal kein überladener Bot, sondern Fokus auf das, was wir wirklich brauchen.", }, @@ -28,6 +30,7 @@ const testimonials = [ server: "Chill & Game", members: "85", avatar: "S", + avatarColor: "from-pink-500 to-red-500", rating: 4, text: "Wir nutzen ManagerX für unsere Temporary Voice Channels. Funktioniert super intuitiv und das Setup war in 2 Minuten erledigt.", }, @@ -35,42 +38,60 @@ const testimonials = [ const TestimonialCard = memo(({ testimonial, index }: { testimonial: typeof testimonials[0]; index: number }) => ( -
- {[...Array(testimonial.rating)].map((_, i) => ( - - ))} + {/* Quote icon decoration */} +
+
-

- "{testimonial.text}" -

+ {/* Hover glow */} +
-
- - {testimonial.avatar} - -
-
{testimonial.name}
-
{testimonial.role}
+
+ {/* Stars */} +
+ {[...Array(5)].map((_, i) => ( + + ))}
-
-
- {testimonial.server} - - - {testimonial.members} Member - +

+ "{testimonial.text}" +

+ +
+ + {testimonial.avatar} + +
+
{testimonial.name}
+
{testimonial.role}
+
+
+ + {/* Server info footer */} +
+
+ + {testimonial.server} +
+
+ + {testimonial.members} +
+
)); @@ -78,31 +99,43 @@ const TestimonialCard = memo(({ testimonial, index }: { testimonial: typeof test export const Testimonials = memo(function Testimonials() { const { data: stats } = useStats(); + const statItems = [ + { icon: Server, label: "Aktive Server", value: stats.guilds > 0 ? `${stats.guilds}` : "16", color: "text-red-400" }, + { icon: Users, label: "Nutzer", value: stats.users > 0 ? `~${stats.users}` : "~300", color: "text-orange-400" }, + { icon: Zap, label: "Commands", value: "90+", color: "text-amber-400" }, + { icon: Heart, label: "Leidenschaft", value: "100%", color: "text-pink-400" }, + ]; + return ( -
-
+
+
+
-
+
+ {/* Header */}
- Community Feedback + Community Feedback - Stimmen der Ersten Stunde + Stimmen der{" "} + + Ersten Stunde +
-
+ {/* Testimonial Cards */} +
{testimonials.map((testimonial, index) => ( ))}
- {/* Reale Statistiken */} + {/* Live Stats Row */} -
-
-
- {stats.guilds > 0 ? stats.guilds : "16"} -
-
Aktive Server
-
-
-
- {stats.users > 0 ? `~${stats.users}` : "~300"} -
-
Nutzer
-
-
-
100%
-
Leidenschaft
-
-
+ {statItems.map((item, i) => ( + + +
{item.value}
+
{item.label}
+
+ ))}
diff --git a/src/web/components/layout/Navbar.tsx b/src/web/components/layout/Navbar.tsx index 1ba5abe..eb1687e 100644 --- a/src/web/components/layout/Navbar.tsx +++ b/src/web/components/layout/Navbar.tsx @@ -203,7 +203,7 @@ export function Navbar() { )} ( -
(e.currentTarget.style.background = "rgba(255,255,255,0.04)")} - onMouseLeave={e => (e.currentTarget.style.background = "transparent")} - > -
- +
+
+
-

{title}

-

{description}

+

{title}

+

{description}

); @@ -94,112 +87,65 @@ export default function LoginPage() { }; return ( -
- {/* Background gradients */} -
-
+
+ {/* Ambient Background Glows */} +
+
+
- {/* Floating blobs */} -
-
+ {/* Pulsing Glow Orbs */} +
+
-
-
- {/* Left: Branding */} +
+
+ + {/* Left: Branding & Value Proposition */} -
- -
- +
+ +
+
+
-
-

- ManagerX -

-

Dashboard

+
+ + ManagerX + + Dashboard Suite
-

- Verwalte dein Universum
- mit Leichtigkeit. +

+ Verwalte dein
+ + Universum + {" "} + mit Leichtigkeit.

-

- Erlebe volle Kontrolle über deine Community. Schnell, sicher und intuitiv – - direkt in deinem Browser. +

+ Erlebe volle Kontrolle über deine Community. Schnell, sicher und intuitiv – direkt in deinem Browser.

-
+
- +
-
-
- +
+
+ Dutzende Server weltweit
-
- +
+ Support-Community
@@ -210,138 +156,77 @@ export default function LoginPage() { initial={{ opacity: 0, scale: 0.95, y: 20 }} animate={{ opacity: 1, scale: 1, y: 0 }} transition={{ duration: 0.5, delay: 0.2 }} - style={{ width: "100%", maxWidth: "28rem", margin: "0 auto" }} + className="w-full max-w-md mx-auto" > -
-
+
+ {/* Decorative top glow */} +
{/* Header */} -
-
- - System-Vorschau +
+
+ + System-Vorschau
-

+

Willkommen zurück

-

- Logge dich ein, um dein Dashboard zu verwalten +

+ Logge dich ein, um deine Gilden zu verwalten

{/* Discord Button */} (e.currentTarget.style.background = "#4752C4")} - onMouseLeave={e => (e.currentTarget.style.background = "#5865F2")} + className="w-full flex items-center justify-center gap-3 bg-[#5865F2] hover:bg-[#4752C4] text-white rounded-2xl py-4 px-6 font-bold text-sm md:text-base cursor-pointer transition-all duration-300 shadow-lg shadow-[#5865F2]/20 border border-[#5865F2]/30 group" > -
- +
+
Logge dich über Discord ein - + {/* Divider */} -
-
- ODER -
+
+
+ ODER +
- {/* Admin Login (hidden by default) */} + {/* Admin Login Form */} {showAdminLogin && ( -
- +
+ setEmail(e.target.value)} required - style={{ - width: "100%", boxSizing: "border-box", - background: "rgba(255,255,255,0.05)", - border: "1px solid rgba(255,255,255,0.1)", - borderRadius: "1rem", padding: "0.875rem 1rem 0.875rem 3rem", - color: "white", fontSize: "0.875rem", outline: "none", - transition: "border-color 0.2s" - }} - onFocus={e => (e.target.style.borderColor = "rgba(220,38,38,0.5)")} - onBlur={e => (e.target.style.borderColor = "rgba(255,255,255,0.1)")} + className="w-full bg-white/5 border border-white/10 hover:border-white/20 focus:border-primary/50 rounded-xl py-3.5 pl-12 pr-4 text-white text-sm outline-none transition-all placeholder:text-slate-600" />
-
- +
+ setPassword(e.target.value)} required - style={{ - width: "100%", boxSizing: "border-box", - background: "rgba(255,255,255,0.05)", - border: "1px solid rgba(255,255,255,0.1)", - borderRadius: "1rem", padding: "0.875rem 1rem 0.875rem 3rem", - color: "white", fontSize: "0.875rem", outline: "none", - transition: "border-color 0.2s" - }} - onFocus={e => (e.target.style.borderColor = "rgba(220,38,38,0.5)")} - onBlur={e => (e.target.style.borderColor = "rgba(255,255,255,0.1)")} + className="w-full bg-white/5 border border-white/10 hover:border-white/20 focus:border-primary/50 rounded-xl py-3.5 pl-12 pr-4 text-white text-sm outline-none transition-all placeholder:text-slate-600" />
{loading ? "Wird geprüft..." : "Admin Login"} )} - {/* Preview mode buttons */} -
-
- VORSCHAU MODUS -
+ {/* Preview Mode Selection */} +
+
+ Vorschau Modus +
-
+ +
{[ { icon: Settings, label: "Einstellungen" }, { icon: LayoutDashboard, label: "Module" } ].map(({ icon: Icon, label }) => ( ))}
- {/* Security notice */} -
- -

- ManagerX fragt nicht nach deinem Passwort. - Der Login erfolgt sicher über das offizielle Discord OAuth2 System. + {/* Security Notice */} +

+ +

+ ManagerX fragt nicht nach deinem Passwort. Der Login erfolgt sicher über das offizielle Discord OAuth2 System.

- {/* Footer links */} + {/* Footer Links */} {[ { to: "/legal/privacy", label: "Datenschutz" }, - { to: "/legal/terms", label: "Nutzungsbedingungen" }, + { to: "/legal/terms", label: "AGB" }, ].map(({ to, label }) => ( - (e.currentTarget.style.color = "white")} - onMouseLeave={e => (e.currentTarget.style.color = "hsl(240 5% 65%)")} - >{label} + + {label} + ))} - (e.currentTarget.style.color = "white")} - onMouseLeave={e => (e.currentTarget.style.color = "hsl(240 5% 65%)")} - >Hilfe erhalten + + Hilfe +
- {/* Footer */} -
-

+ {/* Static Bottom Branding */} +

+

© 2026 OPPRO.NET DEVELOPMENT | ManagerX Dashboard

- -
); } diff --git a/src/web/dashboard/settings/GuildSelectionPage.tsx b/src/web/dashboard/settings/GuildSelectionPage.tsx index 1b09062..92b0adf 100644 --- a/src/web/dashboard/settings/GuildSelectionPage.tsx +++ b/src/web/dashboard/settings/GuildSelectionPage.tsx @@ -2,14 +2,14 @@ import React, { useState } from "react"; import { motion } from "framer-motion"; import { useAuth } from "../../components/core/AuthProvider"; import { useNavigate } from "react-router-dom"; -import { - LayoutDashboard, - Search, - Plus, - ChevronRight, - Shield, - Sparkles, - Users, +import { + LayoutDashboard, + Search, + Plus, + ChevronRight, + Shield, + Sparkles, + Users, Settings, Server } from "lucide-react"; @@ -23,7 +23,7 @@ export default function GuildSelectionPage() { const [search, setSearch] = useState(""); const navigate = useNavigate(); - const filteredGuilds = guilds.filter(g => + const filteredGuilds = guilds.filter(g => g.name.toLowerCase().includes(search.toLowerCase()) ); @@ -43,7 +43,7 @@ export default function GuildSelectionPage() { {/* Header Section */}
- Willkommen zurück, {user?.username}

Server Zentrale @@ -65,14 +65,14 @@ export default function GuildSelectionPage() {

- - setSearch(e.target.value)} placeholder="Server suchen..." @@ -90,18 +90,18 @@ export default function GuildSelectionPage() { animate={{ opacity: 1, y: 0 }} transition={{ delay: 0.1 + index * 0.05 }} > - handleSelect(guild.id)} - className="group relative glass border-white/10 hover:border-primary/40 shadow-2xl rounded-[2.5rem] overflow-hidden cursor-pointer transition-all hover:scale-[1.02] active:scale-[0.98]" + className="group relative glass border-white/10 hover:border-transparent hover:border-animated hover:shine shadow-2xl rounded-[2.5rem] overflow-hidden cursor-pointer transition-all hover:scale-[1.02] active:scale-[0.98] hover:shadow-[0_0_40px_rgba(220,38,38,0.25)]" >
{guild.icon ? ( - {guild.name} ) : ( @@ -132,7 +132,7 @@ export default function GuildSelectionPage() { {/* Invite Button Card */} {filteredGuilds.length === 0 && search && ( - Login fehlgeschlagen

{error}

-
- -

GDPR Compliant

-

Ihre Daten werden nach strengsten EU-Richtlinien in {LEGAL_CONFIG.hosting.location} gehostet.

-
+ {/* GDPR Badge */} +
+ +

DSGVO-konform

+

+ Ihre Daten werden ausschließlich in {LEGAL_CONFIG.hosting.location} verarbeitet und gemäß EU-DSGVO behandelt. +

+
- System Secure + System Secure
+
+ + Stand: {LEGAL_CONFIG.lastUpdate} +
+
+ +
+

Weitere Dokumente

+ + Impressum + + + Nutzungsbedingungen +
- {/* Content Area */} + {/* Content */}
- + - Privacy Documentation + Datenschutzerklärung · DSGVO / GDPR

Datenschutz

- Transparenz ist unser Kernwert. Wir erklären genau, welche Daten ManagerX erhebt, - warum wir dies tun und wie wir sie schützen. + Transparenz ist unser Grundsatz. Diese Erklärung informiert Sie gemäß Art. 13 DSGVO + über Art, Umfang und Zweck der Verarbeitung personenbezogener Daten durch ManagerX.

-
- - Status: DSGVO / GDPR Standard v2.2 (Aktualisiert am {LEGAL_CONFIG.lastUpdate}) +
+
+ + DSGVO-konform +
+
+ + EU-Datenhaltung +
+
+ + Stand: {LEGAL_CONFIG.lastUpdate} +
-
-
-

ManagerX ("wir", "Bot") nimmt den Schutz Ihrer persönlichen Daten sehr ernst. Wir behandeln Ihre personenbezogenen Daten vertraulich und entsprechend der gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerklärung.

+
+ +
+

+ Diese Datenschutzerklärung gilt für den Discord-Bot ManagerX, die Website managerx-bot.de sowie das zugehörige Web-Dashboard. ManagerX wird betrieben von ManagerX Development Network (im Folgenden „wir", „uns"). +

+

+ Wir nehmen den Schutz Ihrer persönlichen Daten sehr ernst und behandeln Ihre personenbezogenen Daten vertraulich und entsprechend der gesetzlichen Datenschutzvorschriften – insbesondere der EU-Datenschutz-Grundverordnung (DSGVO), des Bundesdatenschutzgesetzes (BDSG) sowie des Digitale-Dienste-Gesetzes (DDG). +

+
+

Wichtiger Hinweis

+

+ ManagerX ist ein nicht-kommerzielles Open-Source-Projekt. Es werden keine Daten zu Werbezwecken verkauft oder weitergegeben. +

+
-
-
-

ManagerX Development Network

-
+
+
+

ManagerX Development Network

+

{LEGAL_CONFIG.owner.name}

{LEGAL_CONFIG.owner.address.street}

{LEGAL_CONFIG.owner.address.city}, {LEGAL_CONFIG.owner.address.country}

-
-

Bei der Interaktion mit ManagerX verarbeiten wir nur die absolut notwendigen Daten:

-
+
+

Bei der Interaktion mit ManagerX verarbeiten wir ausschließlich die für den Betrieb notwendigen Daten nach dem Grundsatz der Datensparsamkeit (Art. 5 Abs. 1 lit. c DSGVO):

+
{[ - { label: "Discord-IDs", desc: "Benutzer-, Server- und Channel-IDs zur Identifizierung und Zuordnung von Befehlen." }, - { label: "Metadaten", desc: "Usernames, Rollen-Namen und Avatare zur Anzeige in Statistiken und Embeds." }, - { label: "Moderationsdaten", desc: "Warnungen, temporäre Notizen und Logs zur Sicherheit des Netzwerks." }, - { label: "Globale Statistiken", desc: "Globales Level-System, XP-Werte, Achievements und Aktivitäts-Streaks." }, - { label: "Server-Konfiguration", desc: "Einstellungen wie Willkommens-Kanäle, Log-Channels und Auto-Rollen." } + { label: "Discord-Benutzer-IDs", desc: "Numerische Identifikatoren zur Zuordnung von Befehlen, Strafen und Statistiken. Keine Klarnamen.", art: "Art. 6 Abs. 1 lit. f" }, + { label: "Discord-Server-IDs & Kanal-IDs", desc: "Zur serverseitigen Konfiguration, Logging und Moderation.", art: "Art. 6 Abs. 1 lit. f" }, + { label: "Benutzernamen & Avatare (Metadaten)", desc: "Werden temporär zur Darstellung in Embeds und Leaderboards genutzt; keine dauerhafte Speicherung.", art: "Art. 6 Abs. 1 lit. b" }, + { label: "Moderationsdaten", desc: "Warnungen, Timeouts, Bans und zugehörige Begründungen zur Aufrechterhaltung der Netzwerksicherheit.", art: "Art. 6 Abs. 1 lit. f" }, + { label: "Aktivitäts- & Statistikdaten", desc: "Nachrichten-Zählungen, Voice-Minuten, XP-Werte und Level für das Leveling-System.", art: "Art. 6 Abs. 1 lit. b" }, + { label: "Server-Konfigurationsdaten", desc: "Einstellungen zu Kanälen, Rollen, Willkommensnachrichten und Berechtigungen.", art: "Art. 6 Abs. 1 lit. b" }, + { label: "Web-Dashboard-Sitzungsdaten", desc: "OAuth2-Zugriffstoken von Discord für die Authentifizierung im Dashboard (Sitzungsdauer begrenzt).", art: "Art. 6 Abs. 1 lit. b" }, ].map((item, i) => (
-
- +
+
-
-
{item.label}
-

{item.desc}

+
+
+
{item.label}
+ {item.art} +
+

{item.desc}

))}
-
-

Die Datenverarbeitung dient ausschließlich der Kernfunktionalität von ManagerX:

-
diff --git a/src/web/pages/Impressum.tsx b/src/web/pages/Impressum.tsx index 0b4c4bc..f2584ac 100644 --- a/src/web/pages/Impressum.tsx +++ b/src/web/pages/Impressum.tsx @@ -1,8 +1,9 @@ import { memo, useState, useEffect } from "react"; import { Link } from "react-router-dom"; import { - ArrowLeft, ShieldCheck, User, MapPin, Mail, - Info, Scale, ExternalLink, Globe, ChevronRight, Gavel + ShieldCheck, User, MapPin, Mail, + Info, Scale, ExternalLink, Globe, ChevronRight, Gavel, + AlertTriangle, FileText, Clock } from "lucide-react"; import { Navbar } from "../components/layout/Navbar"; import { Footer } from "../components/layout/Footer"; @@ -14,23 +15,25 @@ const SECTIONS = [ { id: "verantwortlich", title: "Verantwortlich", icon: User }, { id: "anschrift", title: "Anschrift", icon: MapPin }, { id: "kontakt", title: "Kontakt", icon: Mail }, - { id: "rechtliches", title: "Rechtliche Angaben", icon: Gavel }, + { id: "rechtliches", title: "Projektart", icon: FileText }, { id: "haftung-inhalte", title: "Haftung für Inhalte", icon: Info }, { id: "haftung-links", title: "Haftung für Links", icon: ExternalLink }, { id: "urheberrecht", title: "Urheberrecht", icon: Scale }, { id: "hosting", title: "Hosting", icon: Globe }, - { id: "streitbeilegung", title: "Streitbeilegung", icon: ShieldCheck }, + { id: "streitbeilegung", title: "Streitbeilegung", icon: Gavel }, ]; -const Section = ({ id, title, children }: { id: string; title: string; children: React.ReactNode }) => ( +const Section = ({ id, title, icon: Icon, children }: { id: string; title: string; icon: any; children: React.ReactNode }) => (
-
+
+ +

{title}

-
+
{children}
@@ -43,7 +46,6 @@ export const Impressum = memo(function Impressum() { const handleScroll = () => { const sectionElements = SECTIONS.map(s => document.getElementById(s.id)); const scrollPosition = window.scrollY + 200; - for (let i = sectionElements.length - 1; i >= 0; i--) { const el = sectionElements[i]; if (el && scrollPosition >= el.offsetTop) { @@ -52,32 +54,30 @@ export const Impressum = memo(function Impressum() { } } }; - window.addEventListener("scroll", handleScroll); return () => window.removeEventListener("scroll", handleScroll); }, []); const scrollToSection = (id: string) => { const el = document.getElementById(id); - if (el) { - window.scrollTo({ - top: el.offsetTop - 120, - behavior: "smooth" - }); - } + if (el) window.scrollTo({ top: el.offsetTop - 120, behavior: "smooth" }); }; return (
+
{/* Sidebar */} @@ -112,97 +129,196 @@ export const Impressum = memo(function Impressum() { {/* Content Area */}
- + - Legal Disclosure + Legal Disclosure · § 5 DDG

Impressum

- Angaben gemäß § 5 DDG. ManagerX ist ein privates Open-Source-Projekt von ManagerX Development. + Angaben gemäß § 5 DDG (Digitale-Dienste-Gesetz). ManagerX ist ein privates, + nicht-kommerzielles Open-Source-Projekt.

+ + {/* Legal notice banner */} +
+ +
+

Hinweis zur Impressumspflicht

+

+ Dieses Impressum gilt für alle unter der Domain managerx-bot.de betriebenen Dienste sowie den Discord-Bot ManagerX. Die Angaben werden gemäß § 5 DDG zur Verfügung gestellt. +

+
+
-
-
-
-

{LEGAL_CONFIG.owner.name}

+
+ +
+
+

{LEGAL_CONFIG.owner.name}

{LEGAL_CONFIG.owner.role}

+

ManagerX Development Network

-
-
+
+
+

{LEGAL_CONFIG.owner.name}

{LEGAL_CONFIG.owner.address.street}

{LEGAL_CONFIG.owner.address.city}

{LEGAL_CONFIG.owner.address.country}

-
-
-
-

E-Mail

- +
+
+ -
-

Legal Support

-
+
+

Rechtliche Anfragen

+
{LEGAL_CONFIG.contact.legalEmail} +

Für DSGVO-Anfragen, Löschanträge und rechtliche Belange.

+

+ Hinweis: Für eine schnelle Bearbeitung bitten wir darum, Anfragen per E-Mail zu stellen. + Eine telefonische Erreichbarkeit wird gemäß § 5 DDG für nicht-gewerbliche Projekte nicht vorgeschrieben. +

-
-
-

-

Projektart: Privates Open-Source-Projekt (nicht-kommerziell).

+
+
+
+
+ Projektart + Privates Open-Source-Projekt +
+
+ Kommerziell + Nein +
+
+ Lizenz + GNU GPL v3.0 +
+
+ Umsatzsteuer-ID + Nicht vorhanden (kein Gewerbe) +
+
+ Handelsregisternummer + Nicht vorhanden (kein Gewerbe) +
+
+

+ ManagerX wird ohne kommerzielle Absicht betrieben. Es handelt sich um ein privates Gemeinschaftsprojekt. + Eine Gewerberegistrierung ist daher nicht erforderlich. +

-
-

Als Diensteanbieter sind wir gemäß § 7 DDG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 DDG sind wir jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen.

+
+

+ Als Diensteanbieter sind wir gemäß § 7 Abs. 1 DDG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. + Nach §§ 8 bis 10 DDG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen + oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. +

+

+ Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. + Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden + von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen. +

-
diff --git a/src/web/pages/LeaderboardPage.tsx b/src/web/pages/LeaderboardPage.tsx index 4602fc1..98a4232 100644 --- a/src/web/pages/LeaderboardPage.tsx +++ b/src/web/pages/LeaderboardPage.tsx @@ -60,8 +60,12 @@ export const LeaderboardPage = memo(function LeaderboardPage() { animate={{ opacity: 1, y: 0 }} transition={{ delay }} className={cn( - "relative flex flex-col items-center p-8 rounded-[2.5rem] glass border border-white/5 group overflow-hidden", - isFirst ? "md:-translate-y-8 z-20 scale-110" : "z-10", + "relative flex flex-col items-center p-8 rounded-[2.5rem] glass border border-white/5 group overflow-hidden hover:shine transition-all duration-500", + isFirst + ? "md:-translate-y-8 z-20 scale-110 hover:shadow-[0_0_60px_rgba(251,191,36,0.25)] hover:border-yellow-500/50" + : (rank === 2 + ? "z-10 hover:shadow-[0_0_50px_rgba(156,163,175,0.15)] hover:border-slate-400/50" + : "z-10 hover:shadow-[0_0_50px_rgba(180,83,9,0.15)] hover:border-amber-700/50"), borderColor )} > diff --git a/src/web/pages/License.tsx b/src/web/pages/License.tsx index e17a31f..df2ab30 100644 --- a/src/web/pages/License.tsx +++ b/src/web/pages/License.tsx @@ -1,14 +1,36 @@ -import { memo, useState, useEffect } from "react"; +import { memo, useState, useEffect, useMemo, useRef, useCallback } from "react"; import { Link } from "react-router-dom"; import { - ArrowLeft, Code2, GitBranch, Heart, ExternalLink, - Shield, ChevronRight, Package, Terminal, Box, HelpCircle + Code2, GitBranch, Heart, ExternalLink, Info, FileText, + Shield, ChevronRight, Package, Terminal, Box, Copyright, + Search, X, Clock, Mail } from "lucide-react"; import { Navbar } from "../components/layout/Navbar"; import { Footer } from "../components/layout/Footer"; -import { motion } from "framer-motion"; +import { motion, AnimatePresence } from "framer-motion"; +import { LEGAL_CONFIG } from "../lib/legal"; -const pythonCategories = [ +// --------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------- + +interface Dependency { + name: string; + version: string; + license: string; + url: string; +} + +interface DependencyCategory { + title: string; + deps: Dependency[]; +} + +// --------------------------------------------------------------------------- +// Data +// --------------------------------------------------------------------------- + +const pythonCategories: DependencyCategory[] = [ { title: "ManagerX Ecosystem", deps: [ @@ -66,7 +88,7 @@ const pythonCategories = [ } ]; -const nodeCategories = [ +const nodeCategories: DependencyCategory[] = [ { title: "Framework & Core", deps: [ @@ -121,73 +143,180 @@ const SECTIONS = [ { id: "node-deps", title: "Node.js Deps", icon: Package }, { id: "other-deps", title: "Other Details", icon: Terminal }, { id: "contributing", title: "Contributing", icon: Heart }, - { id: "copyright", title: "Copyright", icon: HelpCircle }, + { id: "copyright", title: "Copyright", icon: Copyright }, ]; -const Section = ({ id, title, children }: { id: string; title: string; children: React.ReactNode }) => ( -
-
-
+// --------------------------------------------------------------------------- +// Small presentational pieces +// --------------------------------------------------------------------------- + +const Section = ({ id, title, icon: Icon, children, first = false }: { id: string; title: string; icon: any; children: React.ReactNode; first?: boolean }) => ( +
+ +
+ +

{title}

-
-
+ +
{children}
); -const DependencyCard = ({ dep }: { dep: any }) => ( - -
-

{dep.name}

- +/** Small legend explaining the license color-coding used on dependency cards. */ +const LicenseLegend = () => ( +
+
+ + Permissiv (MIT, BSD, Apache, ISC …)
-
); +/** Maps a license identifier to a tint so permissive vs. copyleft licenses are scannable at a glance. */ +function licenseTint(license: string): string { + const l = license.toUpperCase(); + if (l.includes("GPL")) return "bg-amber-500/10 border-amber-500/20 text-amber-400"; + if (l.includes("MIT") || l.includes("BSD") || l.includes("APACHE") || l.includes("ISC") || l.includes("HPND")) { + return "bg-emerald-500/10 border-emerald-500/20 text-emerald-400"; + } + return "bg-white/5 border-white/10 text-primary"; +} + +const DependencyCard = memo(function DependencyCard({ dep, index = 0 }: { dep: Dependency; index?: number }) { + const tint = licenseTint(dep.license); + return ( + +
+

{dep.name}

+ +
+
+ v{dep.version} + + {dep.license} + +
+
+ ); +}); + +/** + * Renders a list of dependency categories, filtered by an optional search + * query (matches against package name or license). Shared by the Python and + * Node.js sections so the filtering/empty-state logic only lives in one place. + */ +const DependencyGrid = ({ categories, query }: { categories: DependencyCategory[]; query: string }) => { + const filtered = useMemo(() => { + const q = query.trim().toLowerCase(); + if (!q) return categories; + return categories + .map((cat) => ({ + ...cat, + deps: cat.deps.filter( + (dep) => dep.name.toLowerCase().includes(q) || dep.license.toLowerCase().includes(q) + ), + })) + .filter((cat) => cat.deps.length > 0); + }, [categories, query]); + + if (filtered.length === 0) { + return ( +

+ Keine Abhängigkeiten gefunden für „{query}“. +

+ ); + } + + return ( +
+ {filtered.map((cat) => ( +
+

+ {cat.title} +

+
+ {cat.deps.map((dep, i) => ( + + ))} +
+
+ ))} +
+ ); +}; + +// --------------------------------------------------------------------------- +// Page +// --------------------------------------------------------------------------- + export const License = memo(function License() { const [activeSection, setActiveSection] = useState("project-license"); + const [query, setQuery] = useState(""); + const tickingRef = useRef(false); + + const allDeps = useMemo( + () => [...pythonCategories, ...nodeCategories].flatMap((cat) => cat.deps), + [] + ); + const uniqueLicenseCount = useMemo( + () => new Set(allDeps.map((dep) => dep.license)).size, + [allDeps] + ); + const matchCount = useMemo(() => { + const q = query.trim().toLowerCase(); + if (!q) return null; + return allDeps.filter((dep) => dep.name.toLowerCase().includes(q) || dep.license.toLowerCase().includes(q)).length; + }, [allDeps, query]); useEffect(() => { const handleScroll = () => { - const sectionElements = SECTIONS.map(s => document.getElementById(s.id)); - const scrollPosition = window.scrollY + 200; - - for (let i = sectionElements.length - 1; i >= 0; i--) { - const el = sectionElements[i]; - if (el && scrollPosition >= el.offsetTop) { - setActiveSection(SECTIONS[i].id); - break; + if (tickingRef.current) return; + tickingRef.current = true; + window.requestAnimationFrame(() => { + const sectionElements = SECTIONS.map(s => document.getElementById(s.id)); + const scrollPosition = window.scrollY + 200; + for (let i = sectionElements.length - 1; i >= 0; i--) { + const el = sectionElements[i]; + if (el && scrollPosition >= el.offsetTop) { + setActiveSection(SECTIONS[i].id); + break; + } } - } + tickingRef.current = false; + }); }; - - window.addEventListener("scroll", handleScroll); + window.addEventListener("scroll", handleScroll, { passive: true }); return () => window.removeEventListener("scroll", handleScroll); }, []); - const scrollToSection = (id: string) => { + const scrollToSection = useCallback((id: string) => { const el = document.getElementById(id); - if (el) { - window.scrollTo({ - top: el.offsetTop - 120, - behavior: "smooth" - }); - } - }; + if (el) window.scrollTo({ top: el.offsetTop - 120, behavior: "smooth" }); + }, []); return (
@@ -197,24 +326,23 @@ export const License = memo(function License() { {/* Sidebar */} @@ -240,18 +392,51 @@ export const License = memo(function License() { className="flex items-center gap-4 text-primary mb-6" > - Developer Credits + Developer Credits · Third-Party Licenses

Lizenzwesen

-

+

Transparenz bedeutet Vertrauen. Wir nutzen Open-Source-Technologien und geben unseren Code der Community zurück.

+ +
+
+ {matchCount !== null && ( +

+ {matchCount} von {allDeps.length} Paketen +

+ )} -
-
+
+

GNU GPL v3.0

@@ -275,37 +460,17 @@ export const License = memo(function License() {
-
-
- {pythonCategories.map((cat) => ( -
-

{cat.title}

-
- {cat.deps.map((dep) => ( - - ))} -
-
- ))} -
+
+ +

Farbcodierung gilt für alle Abhängigkeiten auf dieser Seite.

+
-
-
- {nodeCategories.map((cat) => ( -
-

{cat.title}

-
- {cat.deps.map((dep) => ( - - ))} -
-
- ))} -
+
+
-
+

Neben den oben genannten Bibliotheken nutzen wir zahlreiche weitere Tools zur Qualitätssicherung und Entwicklung:

    @@ -324,7 +489,7 @@ export const License = memo(function License() {
-
+

Join the Devs

@@ -333,19 +498,37 @@ export const License = memo(function License() { href="https://github.com/ManagerX-Development/ManagerX" target="_blank" rel="noopener noreferrer" - className="px-8 py-3 rounded-full bg-accent text-white font-black uppercase tracking-widest hover:scale-105 transition-transform" + className="px-8 py-3 rounded-full bg-accent text-white font-black uppercase tracking-widest hover:scale-105 transition-transform focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/60" > GitHub Repository
-
@@ -355,4 +538,4 @@ export const License = memo(function License() { ); }); -export default License; +export default License; \ No newline at end of file diff --git a/src/web/pages/Nutzungsbedingungen.tsx b/src/web/pages/Nutzungsbedingungen.tsx index 90879db..465d684 100644 --- a/src/web/pages/Nutzungsbedingungen.tsx +++ b/src/web/pages/Nutzungsbedingungen.tsx @@ -1,10 +1,11 @@ import { memo, useState, useEffect } from "react"; import { Link } from "react-router-dom"; import { - ArrowLeft, FileText, ChevronRight, Shield, Scale, Info, - CheckCircle, UserCheck, Lock, Zap, Users, MessageSquare, - Copyright, CreditCard, ExternalLink, Slash, ShieldAlert, - AlertCircle, RefreshCw, Mail, Gavel + FileText, ChevronRight, Shield, Scale, Info, + CheckCircle2, UserCheck, Lock, Zap, Users, + Copyright, ExternalLink, Slash, ShieldAlert, + AlertCircle, RefreshCw, Mail, Gavel, AlertTriangle, + Clock, XCircle } from "lucide-react"; import { Navbar } from "../components/layout/Navbar"; import { Footer } from "../components/layout/Footer"; @@ -12,32 +13,35 @@ import { motion } from "framer-motion"; import { LEGAL_CONFIG } from "../lib/legal"; const SECTIONS = [ - { id: "overview", title: "Overview", icon: Info }, - { id: "acceptance", title: "Acceptance", icon: CheckCircle }, - { id: "eligibility", title: "Eligibility", icon: UserCheck }, - { id: "security", title: "Accounts & Security", icon: Lock }, - { id: "acceptable-use", title: "Acceptable Use", icon: Zap }, - { id: "community", title: "Community Guidelines", icon: Users }, - { id: "content-ip", title: "Content & IP", icon: Copyright }, - { id: "third-party", title: "Third-Party Services", icon: ExternalLink }, - { id: "termination", title: "Suspension & Termination", icon: Slash }, - { id: "disclaimers", title: "Disclaimers", icon: ShieldAlert }, - { id: "liability", title: "Limitation of Liability", icon: AlertCircle }, - { id: "indemnity", title: "Indemnity", icon: Shield }, - { id: "changes", title: "Changes to Terms", icon: RefreshCw }, - { id: "contact", title: "Contact", icon: Mail }, - { id: "law", title: "Governing Law", icon: Gavel }, + { id: "overview", title: "Übersicht & Geltungsbereich", icon: Info }, + { id: "acceptance", title: "Zustimmung zu den Bedingungen", icon: CheckCircle2 }, + { id: "eligibility", title: "Nutzungsvoraussetzungen", icon: UserCheck }, + { id: "security", title: "Konten & Sicherheit", icon: Lock }, + { id: "acceptable-use", title: "Zulässige Nutzung", icon: Zap }, + { id: "prohibited", title: "Verbotene Handlungen", icon: XCircle }, + { id: "community", title: "Community-Richtlinien", icon: Users }, + { id: "content-ip", title: "Geistiges Eigentum", icon: Copyright }, + { id: "third-party", title: "Drittanbieter-Dienste", icon: ExternalLink }, + { id: "termination", title: "Sperrung & Kündigung", icon: Slash }, + { id: "disclaimers", title: "Haftungsausschluss", icon: ShieldAlert }, + { id: "liability", title: "Haftungsbeschränkung", icon: AlertCircle }, + { id: "indemnity", title: "Freistellung", icon: Shield }, + { id: "changes", title: "Änderungen der Bedingungen", icon: RefreshCw }, + { id: "law", title: "Anwendbares Recht & Gerichtsstand", icon: Gavel }, + { id: "contact", title: "Kontakt", icon: Mail }, ]; -const Section = ({ id, title, children }: { id: string; title: string; children: React.ReactNode }) => ( +const Section = ({ id, title, icon: Icon, children }: { id: string; title: string; icon: any; children: React.ReactNode }) => (
-
-

+
+ +
+

{title}

-
+
{children}
@@ -50,7 +54,6 @@ export const Nutzungsbedingungen = memo(function Nutzungsbedingungen() { const handleScroll = () => { const sectionElements = SECTIONS.map(s => document.getElementById(s.id)); const scrollPosition = window.scrollY + 200; - for (let i = sectionElements.length - 1; i >= 0; i--) { const el = sectionElements[i]; if (el && scrollPosition >= el.offsetTop) { @@ -59,19 +62,13 @@ export const Nutzungsbedingungen = memo(function Nutzungsbedingungen() { } } }; - window.addEventListener("scroll", handleScroll); return () => window.removeEventListener("scroll", handleScroll); }, []); const scrollToSection = (id: string) => { const el = document.getElementById(id); - if (el) { - window.scrollTo({ - top: el.offsetTop - 120, - behavior: "smooth" - }); - } + if (el) window.scrollTo({ top: el.offsetTop - 120, behavior: "smooth" }); }; return ( @@ -80,11 +77,11 @@ export const Nutzungsbedingungen = memo(function Nutzungsbedingungen() {
- {/* Sidebar Container */} + {/* Sidebar */} - {/* Content Area */} + {/* Content */}
- + - Legal Documentation + Nutzungsbedingungen · Terms of Service

Nutzungsbedingungen

-

- Bitte lesen Sie diese Bedingungen sorgfältig durch, bevor Sie ManagerX nutzen. - Sie regeln die rechtliche Beziehung zwischen Ihnen und ManagerX Development. -

-
+

+ Bitte lesen Sie diese Bedingungen sorgfältig, bevor Sie ManagerX nutzen. + Sie regeln die Rechtsbeziehung zwischen Ihnen und ManagerX Development Network. +

+ +
+ +
+

Durch die Nutzung stimmen Sie zu

+

+ Mit dem Hinzufügen des Bots zu einem Server, der Nutzung der Website oder des Dashboards erklären Sie sich mit diesen Bedingungen einverstanden. + Wenn Sie nicht zustimmen, nutzen Sie ManagerX bitte nicht. +

+
+
+ +
- {LEGAL_CONFIG.lastUpdate} + Letzte Änderung + {LEGAL_CONFIG.lastUpdate}
- Version - {LEGAL_CONFIG.version}-beta + Version + {LEGAL_CONFIG.version}
-
-
-

ManagerX ist ein Discord-Bot, der Server-Management, Moderation, Leveling und Unterhaltungsfunktionen bereitstellt. Diese Bedingungen regeln den Zugriff auf und die Nutzung der ManagerX-Dienste, einschließlich unserer Website und API. Die Nutzung erfolgt in Übereinstimmung mit unserer Datenschutzerklärung.

-

Unsere Mission ist es, Discord-Communities sicherere und engagiertere Werkzeuge zur Verfügung zu stellen.

-
+
-
-

Durch das Hinzufügen des Bots zu einem Discord-Server, die Nutzung unserer Website oder den Zugriff auf unsere API erklären Sie sich mit diesen Bedingungen einverstanden.

-
-

Wichtiger Hinweis

-

Wenn Sie diesen Bedingungen nicht in vollem Umfang zustimmen, ist Ihnen die Nutzung unserer Dienste untersagt.

-
+
+

+ ManagerX ist ein Discord-Bot, der Server-Management, Moderation, Leveling und Unterhaltungsfunktionen bereitstellt. + Dienstanbieter ist ManagerX Development Network (im Folgenden „ManagerX", „wir", „uns"). +

+

+ Diese Nutzungsbedingungen gelten für die Nutzung von: +

+
    + {[ + "Den Discord-Bot ManagerX (Bot-ID: 1542970562588975135)", + "Die Website managerx-bot.de", + "Das Web-Dashboard (dash.managerx-bot.de)", + "Alle öffentlichen APIs von ManagerX", + ].map((item, i) => ( +
  • + + {item} +
  • + ))} +
+

+ Die Nutzung erfolgt ergänzend in Übereinstimmung mit unserer Datenschutzerklärung. +

-
-

Sie müssen mindestens 13 Jahre alt sein (oder das in Ihrem Land geltende Mindestalter für die Nutzung von Discord erreicht haben), um ManagerX zu nutzen.

-

Durch die Nutzung bestätigen Sie, dass Sie über die rechtliche Befugnis verfügen, diese Vereinbarung einzugehen.

+
+

+ Durch das Hinzufügen von ManagerX zu einem Discord-Server, die Nutzung unserer Website oder den Zugriff auf unser Dashboard + erklären Sie sich – als natürliche Person oder als Serveradministrator im Namen Ihres Servers – mit diesen Bedingungen + in ihrer jeweils gültigen Fassung einverstanden. +

+
+

Wichtiger Hinweis

+

+ Wenn Sie diesen Bedingungen nicht zustimmen, ist Ihnen die Nutzung unserer Dienste untersagt. + Bitte entfernen Sie in diesem Fall den Bot von Ihrem Server und stellen Sie die Nutzung unserer Website ein. +

+
-
-

Die Sicherheit Ihres Discord-Kontos und Servers liegt ausschließlich in Ihrer Verantwortung. Dies beinhaltet:

-
    +
    +

    Die Nutzung von ManagerX setzt Folgendes voraus:

    +
    • 01 - Korrekte Konfiguration der Bot-Berechtigungen auf Ihrem Server. + Sie müssen mindestens 13 Jahre alt sein (Discord-Mindestalter gemäß deren ToS). In manchen EU-Ländern gilt ein höheres Mindestalter (bis 16 Jahre).
    • 02 - Schutz Ihres Discord-Accounts vor unbefugtem Zugriff. + Sie benötigen ein gültiges, aktives Discord-Konto gemäß den Nutzungsbedingungen von Discord.
    • - Verantwortung für alle Aktionen, die durch falsch konfigurierte Moderations-Tools oder Berechtigungen entstehen. + 03 + Um ManagerX auf einem Server hinzuzufügen, benötigen Sie auf diesem Server die Discord-Berechtigung „Server verwalten".
    • +
    • + 04 + Sie müssen rechtlich handlungsfähig sein und dürfen durch keine geltenden Gesetze von der Nutzung ausgeschlossen sein. +
    • +
    +
    + +
    +

    Die Sicherheit Ihres Discord-Kontos und der Bot-Konfiguration auf Ihrem Server liegt in Ihrer Verantwortung:

    +
      + {[ + "Korrekte und umsichtige Konfiguration der Bot-Berechtigungen auf Ihrem Server.", + "Schutz Ihres Discord-Accounts vor unbefugtem Zugriff (starkes Passwort, 2FA).", + "Verantwortung für alle Aktionen, die durch Ihrer Anweisung ausgeführte Bot-Befehle entstehen.", + "Sofortige Benachrichtigung, falls Sie Kenntnis von einem Missbrauch des Bots auf Ihrem Server erlangen.", + ].map((item, i) => ( +
    • + + {item} +
    • + ))}
    -
    +
    - Globale Funktionen + Serverübergreifende Funktionen (Global XP)
    -

    - Bestimmte Funktionen von ManagerX, wie etwa das globale Level-System (Global XP), wirken sich serverübergreifend aus. Durch Ihre Aktivität in teilnehmenden Communities willigen Sie ein, dass Ihre Daten (wie Level und XP) in einem globalen Kontext verarbeitet werden. Innerhalb des Global XP Systems bieten wir die Option zur Anonymisierung Ihres Profils auf dem globalen Leaderboard an (erreichbar über die User-Einstellungen im Dashboard). +

    + Das globale Level-System (Global XP) wirkt serverübergreifend aus. Durch Ihre Aktivität in teilnehmenden Servern + willigen Sie ein, dass Ihre Aktivitätsdaten in einem globalen Kontext verarbeitet werden. + Sie können Ihr Profil im Dashboard jederzeit anonymisieren (Opt-out).

    -
    -

    ManagerX darf nicht für folgende Zwecke verwendet werden:

    +
    +

    ManagerX darf ausschließlich für seine vorgesehenen Zwecke genutzt werden:

    +
    + {[ + "Server-Moderation und Verwaltung von Discord-Servern.", + "Engagement und Gamification durch das XP- und Leveling-System.", + "Community-Kommunikation über den Global-Chat.", + "Unterhaltung durch integrierte Minispiele.", + "Verwaltung des eigenen Nutzerprofils über das Dashboard.", + ].map((item, i) => ( +
    + + {item} +
    + ))} +
    +
    + +
    +

    Folgende Nutzungen sind ausdrücklich untersagt. Verstöße können zur sofortigen Sperrung führen:

      {[ - "Illegale Aktivitäten", - "Belästigung von Nutzern", - "Verschicken von Spam", - "Umgehung von Sicherheitsfunktionen", - "DDoS-Angriffe", - "Verbreitung von Malware", - "Automatisierte API-Abfragen", - "Reverse Engineering", - "Raiding oder Massen-Spamming", - "Nutzung von Self-Bots" + "Durchführung illegaler Aktivitäten jeglicher Art", + "Belästigung, Stalking oder Bedrohung anderer Nutzer", + "Versenden von Spam oder unerwünschten Massennachrichten", + "Umgehung von Sicherheitsfunktionen oder Sperren", + "DDoS-Angriffe oder andere Cyberangriffe", + "Verbreitung von Malware, Viren oder Phishing-Links", + "Automatisierte API-Abfragen ohne Genehmigung (Scraping)", + "Reverse Engineering oder Dekompilierung des Bot-Codes", + "Raiding, Massen-Beitritt oder koordiniertes Massen-Spamming", + "Nutzung von Self-Bots oder unautorisierten Bot-Clients", + "Verbreitung von Hassrede, Diskriminierung oder illegalen Inhalten", + "Missbrauch von Moderationsfunktionen gegen unschuldige Nutzer", + "Impersonation (Identitätsmissbrauch) von ManagerX oder unseren Mitarbeitern", ].map((item, i) => ( -
    • - +
    • + {item}
    • ))}
    -
    -

    Wir unterstützen eine sichere Umgebung für alle. Als Anbieter behalten wir uns das Recht vor, Server von unseren Diensten auszuschließen, die gegen Community-Standards verstoßen.

    +
    +

    + Wir fördern eine sichere und respektvolle Umgebung für alle. Als Dienstanbieter behalten wir uns das Recht vor, + Server oder Nutzer von unseren Diensten auszuschließen, die gegen Community-Standards verstoßen. +

    -
    -
    Hassrede & Gewalt
    -

    Server, die Hassrede, Gewaltverherrlichung oder illegale Inhalte fördern, werden ohne Vorwarnung gesperrt.

    -
    -
    -
    Discord ToS
    -

    Alle Nutzer müssen zudem die offiziellen Nutzungsbedingungen von Discord einhalten.

    -
    + {[ + { title: "Null-Toleranz bei Hassrede & Gewalt", desc: "Server, die Hassrede, Gewaltverherrlichung, extremistische Ideologien oder illegale Inhalte (insbesondere CSAM) fördern, werden ohne Vorwarnung dauerhaft gesperrt.", color: "border-red-500/20" }, + { title: "Einhaltung der Discord ToS", desc: "Alle Nutzer müssen zusätzlich die aktuellen Nutzungsbedingungen und Community-Richtlinien von Discord einhalten.", color: "border-blue-500/20" }, + { title: "Respektvoller Umgang", desc: "Persönliche Angriffe, Doxxing oder die gezielte Schädigung anderer Nutzer im Global-Chat oder über Bot-Funktionen werden nicht toleriert.", color: "border-amber-500/20" }, + ].map((item, i) => ( +
    +
    {item.title}
    +

    {item.desc}

    +
    + ))}
    -
    -

    Die Markenrechte an ManagerX, die Logos, das Design und die Web-UI liegen bei ManagerX Development Network.

    -

    Der Quellcode des Bots ist unter der GNU GPL v3.0 lizenziert.

    +
    +

    + Die Markenrechte an ManagerX, die Logos, das UI-Design und die Website liegen bei ManagerX Development Network. + Eine Nutzung des Namens oder der Markenzeichen ohne ausdrückliche schriftliche Genehmigung ist untersagt. +

    +

    + Der Quellcode des Bots ist unter der GNU General Public License v3.0 (GPL-3.0) lizenziert. + Dies bedeutet: Sie können den Code frei verwenden, kopieren, verbreiten und modifizieren – sofern Sie die GPL-Lizenzbedingungen einhalten + und Ihre Ableitungen ebenfalls unter GPL-3.0 veröffentlichen. +

    +
    -
    -

    Unser Dienst integriert oder interagiert mit Drittanbietern wie der Discord API. Wir sind nicht verantwortlich für die Leistung oder Verfügbarkeit dieser externen Dienste.

    +
    +

    + ManagerX interagiert mit Drittanbietern, insbesondere der Discord API (Discord Inc., San Francisco, USA). + Wir haben keinen Einfluss auf die Verfügbarkeit, Leistung oder Datenschutzpraktiken von Discord. + Ausfälle der Discord API können die Verfügbarkeit von ManagerX beeinträchtigen. +

    +

    + Für die Nutzung von Discord gelten zusätzlich die Nutzungsbedingungen von Discord. +

    -
    -

    Wir behalten uns das Recht vor, den Zugriff auf ManagerX für bestimmte Nutzer, IDs oder ganze Server permanent zu beenden, wenn gegen diese Bedingungen verstoßen wird.

    +
    +

    + Wir behalten uns das Recht vor, den Zugriff auf ManagerX für bestimmte Nutzer-IDs, Server-IDs oder IP-Adressen + vorübergehend oder dauerhaft zu sperren, wenn gegen diese Bedingungen, + die Datenschutzerklärung oder geltende Gesetze verstoßen wird. +

    +
    +
    +
    Grundlose Kündigung durch Nutzer
    +

    Sie können ManagerX jederzeit durch das Entfernen des Bots von Ihrem Server beenden. Alle Serverdaten werden daraufhin gelöscht.

    +
    +
    +
    Sperrung durch ManagerX
    +

    Bei schwerwiegenden Verstößen (insbesondere Abschnitt 6) erfolgt eine sofortige Sperrung ohne Vorankündigung. Es besteht kein Anspruch auf Wiederherstellung.

    +
    +
    -
    -

    Wird "WIE BESEHEN" bereitgestellt.

    -

    Wir übernehmen keine Garantie für die ständige Verfügbarkeit (Uptime), die absolute Richtigkeit von Statistiken oder die vollständige Fehlerfreiheit des Codes.

    +
    +
    +

    Dienst „wie besehen" (As-is)

    +

    ManagerX wird ohne Mängelgewähr und ohne jegliche ausdrückliche oder stillschweigende Garantien bereitgestellt.

    +
    +

    Insbesondere übernehmen wir keine Gewähr für:

    +
      + {[ + "Ununterbrochene Verfügbarkeit oder Fehlerfreiheit des Dienstes.", + "Absolute Richtigkeit von angezeigten Statistiken und Level-Berechnungen.", + "Kompatibilität mit zukünftigen Discord-API-Updates.", + "Die Sicherheit oder den Inhalt verlinkter externer Dienste.", + ].map((item, i) => ( +
    • + + {item} +
    • + ))} +
    -
    -

    Soweit gesetzlich zulässig, haftet ManagerX Development oder dessen Entwickler nicht für indirekte Schäden, Datenverluste oder Server-Konflikte, die durch die Nutzung des Bots entstehen.

    +
    +

    + Soweit gesetzlich zulässig, haftet ManagerX Development Network und {LEGAL_CONFIG.owner.name} nicht für: +

    +
      + {[ + "Indirekte Schäden, Folgeschäden oder entgangene Gewinne.", + "Datenverluste, die durch Bot-Fehlfunktionen oder Discord-API-Ausfälle entstehen.", + "Schäden, die durch Missbrauch des Bots durch Dritte auf Ihrem Server entstehen.", + "Schäden durch Angriffe auf die Discord-Infrastruktur.", + ].map((item, i) => ( +
    • + + {item} +
    • + ))} +
    +
    +

    Gesetzliche Haftung bleibt unberührt

    +

    + Diese Haftungsbeschränkung gilt nicht für Schäden aus der Verletzung des Lebens, des Körpers oder der Gesundheit + sowie für grobe Fahrlässigkeit oder Vorsatz gemäß § 276 BGB. Die gesetzliche Haftung bleibt in jedem Fall bestehen. +

    +
    -
    -

    Sie erklären sich damit einverstanden, ManagerX Development von allen Forderungen freizustellen, die sich aus Ihrer Nutzung des Dienstes oder Ihrer Verletzung dieser Bedingungen ergeben.

    +
    +

    + Sie erklären sich damit einverstanden, ManagerX Development Network, {LEGAL_CONFIG.owner.name} und etwaige + Mitarbeiter oder Beitragende von allen Ansprüchen, Schäden, Verlusten und Kosten (einschließlich angemessener + Anwaltskosten) freizustellen, die sich aus Folgendem ergeben: +

    +
      + {[ + "Ihrer Nutzung der ManagerX-Dienste in Verletzung dieser Bedingungen.", + "Ihrer Verletzung von Rechten Dritter.", + "Ihrer Verletzung geltender Gesetze oder Behördenvorschriften.", + ].map((item, i) => ( +
    • + + {item} +
    • + ))} +
    -
    -

    Wesentliche Änderungen werden auf unserem Support-Server oder dieser Website mit einer angemessenen Vorlaufzeit angekündigt.

    +
    +

    + Wir behalten uns vor, diese Nutzungsbedingungen jederzeit anzupassen. Wesentliche Änderungen werden + mindestens 7 Tage im Voraus über folgende Kanäle angekündigt: +

    +
      +
    • + + Ankündigung auf unserem Discord Support-Server (discord.gg/9T28DWup3g) +
    • +
    • + + Aktualisierung des Datums „Stand" auf dieser Seite +
    • +
    +

    + Die fortgesetzte Nutzung von ManagerX nach Inkrafttreten der Änderungen gilt als Zustimmung. + Wenn Sie den Änderungen nicht zustimmen, beenden Sie bitte die Nutzung. +

    -
    -

    Bei rechtlichen Anfragen erreichen Sie uns unter:

    -
    - - - {LEGAL_CONFIG.contact.legalEmail} - -

    ManagerX Legal Department

    +
    +
    +
    + Anwendbares Recht + Recht der Bundesrepublik Deutschland +
    +
    +
    + Gerichtsstand + 04523 Pegau, Sachsen, Deutschland +
    +
    +
    + Sprache (maßgeblich) + Deutsch +
    +

    + Diese Bedingungen unterliegen dem Recht der Bundesrepublik Deutschland unter Ausschluss des UN-Kaufrechts (CISG). + Gerichtsstand für alle Streitigkeiten ist, soweit gesetzlich zulässig, der Sitz des Dienstanbieters. + Für Verbraucher gilt § 29 ZPO (Gerichtsstand am Wohnort des Verbrauchers). +

    -
    -

    Diese Bedingungen unterliegen dem Recht der Bundesrepublik Deutschland.

    +
    +
    +
    +
    + +

    Rechtliche Anfragen

    + + {LEGAL_CONFIG.contact.legalEmail} + +

    ManagerX Development Network · {LEGAL_CONFIG.owner.name}

    +

    + Stand: {LEGAL_CONFIG.lastUpdate} · Version {LEGAL_CONFIG.version} · © ManagerX Development +

    +
    +
    +
diff --git a/src/web/pages/PluginsPage.tsx b/src/web/pages/PluginsPage.tsx index 5307deb..316e6e1 100644 --- a/src/web/pages/PluginsPage.tsx +++ b/src/web/pages/PluginsPage.tsx @@ -149,7 +149,7 @@ export const PluginsPage = memo(function PluginsPage() {

Unsere Spiele-Engine basiert auf modernen Algorithmen, die ein forderndes Spielerlebnis direkt in Discord ermöglichen.

-
+

Neural Minigames

@@ -161,7 +161,7 @@ export const PluginsPage = memo(function PluginsPage() {

Verbinde deine Community mit tausenden anderen Servern weltweit durch unser hochperformantes Globalchat-System.

-
+

Real-time Syncing

@@ -173,7 +173,7 @@ export const PluginsPage = memo(function PluginsPage() {

Der Security Core ist das Herzstück der Moderation. Er schützt deinen Server 24/7 vor Spam, Raids und Fehlverhalten.

-
+

Advanced Protection

@@ -185,7 +185,7 @@ export const PluginsPage = memo(function PluginsPage() {

Steigere die Aktivität auf deinem Server durch ein motivierendes Leveling-System und automatisierte Interaktionen.

-
+

Incentive Engine

@@ -197,7 +197,7 @@ export const PluginsPage = memo(function PluginsPage() {

Spare wertvolle Zeit durch intelligente Automatisierung von Routineaufgaben im Hintergrund.

-
+

Silent Workers

@@ -209,7 +209,7 @@ export const PluginsPage = memo(function PluginsPage() {

Behalte die volle Kontrolle über alle Bot-Funktionen mit unserem intuitiven Konfigurations-System.

-
+

Command Center

diff --git a/src/web/pages/Status.tsx b/src/web/pages/Status.tsx index b124b0d..92d1185 100644 --- a/src/web/pages/Status.tsx +++ b/src/web/pages/Status.tsx @@ -137,9 +137,11 @@ const Status = memo(function Status() { animate={{ opacity: 1, y: 0 }} transition={{ delay: index * 0.1 }} className={cn( - "glass rounded-2xl p-6 border flex flex-col md:flex-row items-center justify-between gap-6 relative", - system.status === "online" ? "border-white/5" : "border-red-500/20 bg-red-500/[0.02]", - system.isParent && system.status === "online" ? "border-primary/20 bg-primary/[0.01]" : "" + "glass rounded-2xl p-6 border flex flex-col md:flex-row items-center justify-between gap-6 relative transition-all duration-300", + system.status === "online" + ? "border-white/5 hover:border-green-500/20 hover:shadow-[0_0_30px_rgba(34,197,94,0.1)]" + : "border-red-500/20 bg-red-500/[0.02] hover:border-red-500/35 hover:shadow-[0_0_30px_rgba(239,68,68,0.1)]", + system.isParent && system.status === "online" ? "border-primary/20 bg-primary/[0.01] hover:border-primary/40 hover:shadow-[0_0_35px_rgba(220,38,38,0.15)]" : "" )} >
diff --git a/src/web/tsconfig.app.json b/src/web/tsconfig.app.json index 3add82f..2623344 100644 --- a/src/web/tsconfig.app.json +++ b/src/web/tsconfig.app.json @@ -24,8 +24,8 @@ "baseUrl": ".", "paths": { - "@/*": ["./src/*"] + "@/*": ["./*"] } }, - "include": ["src"] + "include": ["."] } diff --git a/src/web/tsconfig.json b/src/web/tsconfig.json index 2518773..65706ff 100644 --- a/src/web/tsconfig.json +++ b/src/web/tsconfig.json @@ -4,7 +4,7 @@ "compilerOptions": { "baseUrl": ".", "paths": { - "@/*": ["./src/*"] + "@/*": ["./*"] }, "noImplicitAny": false, "noUnusedParameters": false,