"use client"; import { useControlledState } from "@react-stately/utils"; import { domAnimation, LazyMotion, m } from "framer-motion"; import { forwardRef, useMemo } from "react"; import type { ComponentProps, HTMLAttributes, ReactNode } from "react"; import { cn } from "@/lib/utils"; export type VerticalStepProps = { className?: string; description?: ReactNode; title?: ReactNode; }; export interface VerticalStepsProps extends HTMLAttributes { /** * An array of steps. * * @default [] */ steps?: VerticalStepProps[]; /** * The color of the steps. * * @default "primary" */ color?: | "primary" | "secondary" | "success" | "warning" | "danger" | "default"; /** * The current step index. */ currentStep?: number; /** * The default step index. * * @default 0 */ defaultStep?: number; /** * Whether to hide the progress bars. * * @default false */ hideProgressBars?: boolean; /** * The custom class for the steps wrapper. */ className?: string; /** * The custom class for the step. */ stepClassName?: string; /** * Callback function when the step index changes. */ onStepChange?: (stepIndex: number) => void; } function CheckIcon(props: ComponentProps<"svg">) { return ( ); } export const VerticalSteps = forwardRef( ( { color = "primary", steps = [], defaultStep = 0, onStepChange, currentStep: currentStepProp, hideProgressBars = false, stepClassName, className, ...props }, ref, ) => { const [currentStep, setCurrentStep] = useControlledState( currentStepProp, defaultStep, onStepChange, ); const colors = useMemo(() => { let userColor; let fgColor; const colorsVars = [ "[--active-fg-color:var(--step-fg-color)]", "[--active-border-color:var(--step-color)]", "[--active-color:var(--step-color)]", "[--complete-background-color:var(--step-color)]", "[--complete-border-color:var(--step-color)]", "[--inactive-border-color:var(--border-neutral-tertiary)]", "[--inactive-color:var(--border-neutral-tertiary)]", ]; switch (color) { case "secondary": userColor = "[--step-color:var(--color-violet-600)] dark:[--step-color:var(--color-violet-400)]"; fgColor = "[--step-fg-color:var(--color-white)]"; break; case "success": userColor = "[--step-color:var(--bg-pass-primary)]"; fgColor = "[--step-fg-color:var(--color-black)]"; break; case "warning": userColor = "[--step-color:var(--bg-warning-primary)]"; fgColor = "[--step-fg-color:var(--color-black)]"; break; case "danger": userColor = "[--step-color:var(--bg-fail-primary)]"; fgColor = "[--step-fg-color:var(--color-white)]"; break; case "default": userColor = "[--step-color:var(--color-zinc-300)] dark:[--step-color:var(--color-zinc-600)]"; fgColor = "[--step-fg-color:var(--text-neutral-primary)]"; break; case "primary": default: userColor = "[--step-color:var(--bg-button-primary)]"; fgColor = "[--step-fg-color:var(--color-black)]"; break; } if (!className?.includes("--step-fg-color")) colorsVars.unshift(fgColor); if (!className?.includes("--step-color")) colorsVars.unshift(userColor); if (!className?.includes("--inactive-bar-color")) colorsVars.push( "[--inactive-bar-color:var(--border-neutral-tertiary)]", ); return colorsVars; }, [color, className]); return ( ); }, ); VerticalSteps.displayName = "VerticalSteps";