import * as React from 'react'; import styles from './Stepper.module.scss'; import { Icon } from '../Icon/Icon'; import { IStepperStep, highestReachableIndex } from './stepperLogic'; // Логику и тип держим в stepperLogic.ts (чистые, тестируемые), здесь — реэкспорт // для единой точки импорта компонента. export type { IStepperStep } from './stepperLogic'; export { highestReachableIndex } from './stepperLogic'; export interface IStepperProps { steps: IStepperStep[]; /** Текущий (активный) шаг. */ currentId: string | number; /** Завершённые шаги (показываются галочкой). */ completedIds: Array; /** * Максимально достигнутый шаг. Кликабельны шаги ДО него включительно — * защита от «прыжка вперёд» на шаг, до которого ещё не дошли. */ highestId: string | number; onStepClick: (id: string | number) => void; } /** * Степпер прогресса: кружки с номером/галочкой, подпись, коннекторы между. * Кликабельны только достигнутые шаги (см. highestId). Презентационный и * управляемый: состояние (current/completed/highest) приходит пропсами, клик — * наружу. Шапку формы (номер/статус) держать ОТДЕЛЬНО (FormHeader), не тут. */ export function Stepper({ steps, currentId, completedIds, highestId, onStepClick }: IStepperProps): JSX.Element { const highestIdx = highestReachableIndex(steps, highestId); return ( ); }