Skip to content

Komponenten

UI-Primitives

Das Dashboard nutzt 35 Radix UI Komponenten als Basis, gestylt mit Tailwind CSS (shadcn/ui Pattern):

Interaktive Elemente

KomponenteBeschreibung
ButtonStandard-Button mit Varianten (default, destructive, outline, ghost)
LoadingButtonButton mit Lade-Zustand
InputText-Eingabefeld
LabelFormular-Label
CheckboxCheckbox mit Label
SwitchToggle-Switch
SliderSchieberegler
SelectDropdown-Auswahl

Layout

KomponenteBeschreibung
CardKarten-Container (Header, Content, Footer)
SidebarKollabierbare Seitenleiste
TabsTab-Navigation
AccordionAufklappbare Sektionen
CollapsibleEin-/ausblendbar
SeparatorHorizontale Trennlinie
ScrollAreaScrollbarer Bereich mit Custom-Scrollbar
SheetMobile Drawer (von der Seite)
TableDaten-Tabelle

Overlays

KomponenteBeschreibung
DialogModal-Dialog
AlertDialogBestaetigungs-Dialog
ConfirmDialogVereinfachter Bestaetigungs-Dialog
PopoverPopup-Inhalt
TooltipHover-Tooltip
DropdownMenuDropdown-Menu
ContextMenuRechtsklick-Menu

Daten

KomponenteBeschreibung
AvatarBenutzer-Avatar (Bild + Fallback)
BadgeStatus-Badge
BreadcrumbBreadcrumb-Navigation
ChartRecharts-Wrapper mit Legend und Tooltip
CommandCommand-Palette (cmdk)

Spezial

KomponenteBeschreibung
TimezonePickerZeitzonen-Auswahl mit Suche
PageSpinnerGanzseitige Lade-Animation
SonnerToast-Benachrichtigungen

Geteilte Komponenten

Benutzer-Info im Sidebar-Footer mit:

  • Avatar, Name, Rolle
  • Logout-Funktion

Team-Branding im Sidebar-Header:

  • Logo (wenn URL konfiguriert)
  • Team-Name
  • Tagline

Navigations-Gruppe in der Sidebar:

  • Gruppentitel
  • Liste von Navigations-Items mit Icons

agent-picker.tsx

Multi-Select fuer Valorant-Agenten:

  • Checkbox-Liste aller Agenten
  • Ausgewaaehlte als Badges
  • Normalisierte Namen (KAY/O → KAYO)

pdf-preview-dialog.tsx

PDF-Vorschau in einem Dialog:

  • Iframe-basierte Anzeige
  • Download-Button

Custom Hooks

useIsMobile()

typescript
const isMobile = useIsMobile(); // true wenn < 768px

useBranding(defaults?)

typescript
const { teamName, tagline, logoUrl } = useBranding({
  teamName: 'Fallback Name'
});

useSidebarNavigation(basePath)

typescript
const { activeTab, setActiveTab } = useSidebarNavigation('/admin');

useUserDiscordId()

typescript
const { user, isLoading } = useUserDiscordId();
// user = { userName: 'Player1', discordId: '123...' }

Animation Utilities

lib/animations.ts stellt vorgefertigte Animationsklassen bereit:

typescript
import { stagger, microInteractions } from '@/lib/animations';

// Gestaffelte Animation
<div className={stagger(index, 'fast', 'fadeIn')}>

// Hover-Effekt
<button className={microInteractions.hoverLift}>

// Loading State
<div className={loadingStates.shimmer}>

Error Boundary

tsx
import { withErrorBoundary } from '@/components/error-boundary';

const SafeComponent = withErrorBoundary(MyComponent);

Faengt Render-Fehler ab und zeigt:

  • Fehlermeldung
  • "Erneut versuchen" Button
  • "Seite neu laden" Button

MIT License