import { useState } from 'react';
import { Badge } from '@/registry/default/ui/badge';
import { Button } from '@/registry/default/ui/button';
import {
Stepper,
StepperContent,
StepperIndicator,
StepperItem,
StepperNav,
StepperPanel,
StepperSeparator,
StepperTitle,
StepperTrigger,
} from '@/registry/default/ui/stepper';
import { BookUser, Check, CreditCard, ListTodo, LoaderCircleIcon, LockKeyhole } from 'lucide-react';
const steps = [
{ title: 'User Details', icon: BookUser },
{ title: 'Payment Info', icon: CreditCard },
{ title: 'Auth OTP', icon: LockKeyhole },
{ title: 'Preview Form', icon: ListTodo },
];
export default function Component() {
const [currentStep, setCurrentStep] = useState(2);
return (
<Stepper
value={currentStep}
onValueChange={setCurrentStep}
indicators={{
completed: <Check className="size-4" />,
loading: <LoaderCircleIcon className="size-4 animate-spin" />,
}}
className="space-y-8"
>
<StepperNav className="gap-3 mb-15">
{steps.map((step, index) => {
return (
<StepperItem key={index} step={index + 1} className="relative flex-1 items-start">
<StepperTrigger className="flex flex-col items-start justify-center gap-2.5 grow" asChild>
<StepperIndicator className="size-8 border-2 data-[state=completed]:text-white data-[state=completed]:bg-green-500 data-[state=inactive]:bg-transparent data-[state=inactive]:border-border data-[state=inactive]:text-muted-foreground">
<step.icon className="size-4" />
</StepperIndicator>
<div className="flex flex-col items-start gap-1">
<div className="text-[10px] font-semibold uppercase text-muted-foreground">Step {index + 1}</div>
<StepperTitle className="text-start text-base font-semibold group-data-[state=inactive]/step:text-muted-foreground">
{step.title}
</StepperTitle>
<div>
<Badge
variant="primary"
size="sm"
appearance="light"
className="hidden group-data-[state=active]/step:inline-flex"
>
In Progress
</Badge>
<Badge
variant="success"
size="sm"
appearance="light"
className="hidden group-data-[state=completed]/step:inline-flex"
>
Completed
</Badge>
<Badge
variant="secondary"
size="sm"
className="hidden group-data-[state=inactive]/step:inline-flex text-muted-foreground"
>
Pending
</Badge>
</div>
</div>
</StepperTrigger>
{steps.length > index + 1 && (
<StepperSeparator className="absolute top-4 inset-x-0 start-9 m-0 group-data-[orientation=horizontal]/stepper-nav:w-[calc(100%-2rem)] group-data-[orientation=horizontal]/stepper-nav:flex-none group-data-[state=completed]/step:bg-green-500" />
)}
</StepperItem>
);
})}
</StepperNav>
<StepperPanel className="text-sm">
{steps.map((step, index) => (
<StepperContent key={index} value={index + 1} className="flex items-center justify-center">
Step {step.title} content
</StepperContent>
))}
</StepperPanel>
<div className="flex items-center justify-between gap-2.5">
<Button variant="outline" onClick={() => setCurrentStep((prev) => prev - 1)} disabled={currentStep === 1}>
Previous
</Button>
<Button
variant="outline"
onClick={() => setCurrentStep((prev) => prev + 1)}
disabled={currentStep === steps.length}
>
Next
</Button>
</div>
</Stepper>
);
}