"use client"; import Image from "next/image"; import { Activity, ArrowUpRight, ChevronDown, Coins, LayoutTemplate, Search, Sparkles, } from "lucide-react"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { Progress } from "@/components/ui/progress"; import { cn } from "@/lib/utils"; const formatEurFromCents = (cents: number) => new Intl.NumberFormat("de-DE", { style: "currency", currency: "EUR", }).format(cents / 100); const mockRuns = [ { id: "run-8841", workspace: "Sommer-Kampagne", node: "KI-Bild", model: "flux-pro", status: "done" as const, credits: 42, updated: "vor 12 Min.", }, { id: "run-8839", workspace: "Produktfotos", node: "KI-Bild", model: "flux-schnell", status: "executing" as const, credits: 18, updated: "gerade eben", }, { id: "run-8832", workspace: "Social Variants", node: "Compare", model: "—", status: "idle" as const, credits: 0, updated: "vor 1 Std.", }, { id: "run-8828", workspace: "Sommer-Kampagne", node: "KI-Bild", model: "flux-pro", status: "error" as const, credits: 0, updated: "vor 2 Std.", }, ]; const mockWorkspaces = [ { name: "Sommer-Kampagne", nodes: 24, frames: 3, initial: "S" }, { name: "Produktfotos", nodes: 11, frames: 2, initial: "P" }, { name: "Social Variants", nodes: 8, frames: 1, initial: "V" }, ]; function StatusDot({ status }: { status: (typeof mockRuns)[0]["status"] }) { const base = "inline-block size-2 rounded-full"; switch (status) { case "done": return ; case "executing": return ( ); case "idle": return ; case "error": return ; } } function statusLabel(status: (typeof mockRuns)[0]["status"]) { switch (status) { case "done": return "Fertig"; case "executing": return "Läuft"; case "idle": return "Bereit"; case "error": return "Fehler"; } } export default function DashboardPage() { const balanceCents = 4320; const reservedCents = 180; const monthlyPoolCents = 5000; const usagePercent = Math.round( ((monthlyPoolCents - balanceCents) / monthlyPoolCents) * 100, ); return (
{/* Header */}
Account (Demo) Einstellungen Abrechnung Abmelden
{/* Greeting & Context */}

Guten Tag, Mock Nutzer

Überblick über deine Credits und laufende Generierungen.

{/* Credits & Active Generation — asymmetric two-column */}
{/* Credits Section */}
Credit-Guthaben
{formatEurFromCents(balanceCents)}
Reserviert {formatEurFromCents(reservedCents)}
Monatskontingent {usagePercent}%

Bei fehlgeschlagenen Jobs werden reservierte Credits automatisch freigegeben.

{/* Active Generation */}
Aktive Generierung
Läuft

Produktfotos — Variante 3/4

Fortschritt 62%

Step 2 von 4 —{" "} flux-schnell

{/* Workspaces */}
Workspaces
{mockWorkspaces.map((ws) => ( ))}
{/* Recent Activity */}
Letzte Aktivität
{mockRuns.map((run) => (
{run.workspace} {run.node}
{run.model !== "—" && ( {run.model} )} {run.credits > 0 && ( <> · {run.credits} ct )}
{statusLabel(run.status)}

{run.updated}

))}
); }