Spaces:
Running
Running
| interface StepIndicatorProps { | |
| currentStep: 1 | 2 | 3; | |
| maxStep?: 1 | 2 | 3; | |
| onStepClick?: (step: 1 | 2 | 3) => void; | |
| } | |
| const steps = [ | |
| { num: 1 as const, label: "上傳資料" }, | |
| { num: 2 as const, label: "編輯提示詞" }, | |
| { num: 3 as const, label: "檢視報告" }, | |
| ]; | |
| export function StepIndicator({ currentStep, maxStep, onStepClick }: StepIndicatorProps) { | |
| const reachable = maxStep ?? currentStep; | |
| return ( | |
| <div className="flex items-center justify-center gap-2 py-6 px-4"> | |
| {steps.map((step, idx) => ( | |
| <div key={step.num} className="flex items-center"> | |
| <button | |
| onClick={() => onStepClick?.(step.num)} | |
| disabled={step.num > reachable} | |
| className={`flex items-center gap-2.5 px-4 py-2 rounded-full text-sm font-medium transition-all ${ | |
| step.num === currentStep | |
| ? "bg-[var(--color-primary)] text-white" | |
| : step.num <= reachable | |
| ? "text-[var(--color-primary)] cursor-pointer hover:bg-[var(--color-primary)]/5" | |
| : "text-[var(--color-text-muted)] cursor-not-allowed" | |
| }`} | |
| > | |
| <span className={`w-5 h-5 rounded-full flex items-center justify-center text-xs font-semibold shrink-0 ${ | |
| step.num === currentStep | |
| ? "bg-white/20 text-white" | |
| : step.num <= reachable | |
| ? "bg-[var(--color-primary)] text-white" | |
| : "bg-[var(--color-border)] text-[var(--color-text-muted)]" | |
| }`}> | |
| {step.num < currentStep ? "✓" : step.num} | |
| </span> | |
| <span className="hidden sm:inline">{step.label}</span> | |
| <span className="sm:hidden">{step.num}</span> | |
| </button> | |
| {idx < steps.length - 1 && ( | |
| <div className={`w-8 h-px mx-1 ${ | |
| step.num < currentStep ? "bg-[var(--color-primary)]/40" : "bg-[var(--color-border)]" | |
| }`} /> | |
| )} | |
| </div> | |
| ))} | |
| </div> | |
| ); | |
| } | |