import React from 'react'; export interface FormStepperStep { id: string; label: React.ReactNode; description?: React.ReactNode; } type StepState = 'complete' | 'current' | 'upcoming'; export interface FormStepperProps { steps: readonly FormStepperStep[]; current: string; onStepChange: (id: string) => void; children?: (step: FormStepperStep) => React.ReactNode; className?: string; /** Override step gating. Defaults to array-index comparison. */ isStepAccessible?: (step: FormStepperStep, state: StepState) => boolean; ariaLabel?: string; } export const FormStepper = ({ steps, current, onStepChange, children, className = '', isStepAccessible, ariaLabel = 'Progress' }: FormStepperProps): React.ReactElement => { const currentIndex = Math.max( 0, steps.findIndex(s => s.id === current) ); const resolved = steps[currentIndex] ?? steps[0]; const classes = ['form-stepper', className].filter(Boolean).join(' '); const stateAt = (i: number): StepState => { if (i < currentIndex) return 'complete'; if (i === currentIndex) return 'current'; return 'upcoming'; }; const accessible = (step: FormStepperStep, state: StepState): boolean => { if (isStepAccessible) return isStepAccessible(step, state); // Default: complete + current are navigable; upcoming gated. return state !== 'upcoming'; }; return (