"use client"; import type { ButtonProps } from "@nextui-org/react"; import { cn } from "@nextui-org/react"; import { useControlledState } from "@react-stately/utils"; import { domAnimation, LazyMotion, m } from "framer-motion"; import type { ComponentProps } from "react"; import React from "react"; export type VerticalStepProps = { className?: string; description?: React.ReactNode; title?: React.ReactNode; }; export interface VerticalStepsProps extends React.HTMLAttributes { /** * An array of steps. * * @default [] */ steps?: VerticalStepProps[]; /** * The color of the steps. * * @default "primary" */ color?: ButtonProps["color"]; /** * 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 = React.forwardRef< HTMLButtonElement, VerticalStepsProps >( ( { color = "primary", steps = [], defaultStep = 0, onStepChange, currentStep: currentStepProp, hideProgressBars = false, stepClassName, className, ...props }, ref, ) => { const [currentStep, setCurrentStep] = useControlledState( currentStepProp, defaultStep, onStepChange, ); const colors = React.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:hsl(var(--nextui-default-300))]", "[--inactive-color:hsl(var(--nextui-default-300))]", ]; switch (color) { case "primary": userColor = "[--step-color:hsl(var(--nextui-primary))]"; fgColor = "[--step-fg-color:hsl(var(--nextui-primary-foreground))]"; break; case "secondary": userColor = "[--step-color:hsl(var(--nextui-secondary))]"; fgColor = "[--step-fg-color:hsl(var(--nextui-secondary-foreground))]"; break; case "success": userColor = "[--step-color:hsl(var(--nextui-success))]"; fgColor = "[--step-fg-color:hsl(var(--nextui-success-foreground))]"; break; case "warning": userColor = "[--step-color:hsl(var(--nextui-warning))]"; fgColor = "[--step-fg-color:hsl(var(--nextui-warning-foreground))]"; break; case "danger": userColor = "[--step-color:hsl(var(--nextui-error))]"; fgColor = "[--step-fg-color:hsl(var(--nextui-error-foreground))]"; break; case "default": userColor = "[--step-color:hsl(var(--nextui-default))]"; fgColor = "[--step-fg-color:hsl(var(--nextui-default-foreground))]"; break; default: userColor = "[--step-color:hsl(var(--nextui-primary))]"; fgColor = "[--step-fg-color:hsl(var(--nextui-primary-foreground))]"; 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:hsl(var(--nextui-default-300))]", ); return colorsVars; }, [color, className]); return ( ); }, ); VerticalSteps.displayName = "VerticalSteps";