* Extract reusable league wizard components; wire settings page (#103) Extracts 9 domain components from new.tsx and $leagueId.settings.tsx into app/components/league/ (each with a Storybook story), consolidates wizard form-building into wizard-state.ts, and updates the settings page to use the shared components instead of hand-rolled duplicates. new.tsx shrinks from ~2000 → ~1280 lines. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Fix sports-season test: add participants to mock data findDraftableSportsSeasons now returns participantCount, which requires participants in the mock db response. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Fix sports-season test: loosen makeMockDb type to Record<string, unknown>[] typeof mockSeasons became too strict after adding participants to the mock data, breaking inline arrays in other tests that don't include participants. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
export interface StepperInputProps {
|
||
value: number;
|
||
min: number;
|
||
max: number;
|
||
onChange: (v: number) => void;
|
||
decrementLabel?: string;
|
||
incrementLabel?: string;
|
||
}
|
||
|
||
export function StepperInput({
|
||
value,
|
||
min,
|
||
max,
|
||
onChange,
|
||
decrementLabel = "Decrease",
|
||
incrementLabel = "Increase",
|
||
}: StepperInputProps) {
|
||
return (
|
||
<div className="flex items-center gap-3">
|
||
<button
|
||
type="button"
|
||
onClick={() => onChange(Math.max(min, value - 1))}
|
||
className="w-9 h-9 rounded-md border border-input flex items-center justify-center text-lg font-medium hover:bg-accent transition-colors"
|
||
aria-label={decrementLabel}
|
||
disabled={value <= min}
|
||
>
|
||
−
|
||
</button>
|
||
<span className="w-10 text-center text-lg font-semibold tabular-nums">{value}</span>
|
||
<button
|
||
type="button"
|
||
onClick={() => onChange(Math.min(max, value + 1))}
|
||
className="w-9 h-9 rounded-md border border-input flex items-center justify-center text-lg font-medium hover:bg-accent transition-colors"
|
||
aria-label={incrementLabel}
|
||
disabled={value >= max}
|
||
>
|
||
+
|
||
</button>
|
||
</div>
|
||
);
|
||
}
|