* 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>
28 lines
894 B
TypeScript
28 lines
894 B
TypeScript
import type { LucideIcon } from "lucide-react";
|
|
import type { ReactNode } from "react";
|
|
import { Button } from "~/components/ui/button";
|
|
import { GradientIcon } from "~/components/ui/GradientIcon";
|
|
|
|
export interface ReviewSectionProps {
|
|
icon: LucideIcon;
|
|
title: string;
|
|
onEdit: () => void;
|
|
children: ReactNode;
|
|
}
|
|
|
|
export function ReviewSection({ icon, title, onEdit, children }: ReviewSectionProps) {
|
|
return (
|
|
<div className="rounded-lg border border-border p-4 space-y-3">
|
|
<div className="flex items-center justify-between">
|
|
<h3 className="text-sm font-semibold flex items-center gap-2">
|
|
<GradientIcon icon={icon} className="h-4 w-4" />
|
|
{title}
|
|
</h3>
|
|
<Button type="button" variant="outline" size="sm" onClick={onEdit} className="h-7 text-xs px-3">
|
|
Edit
|
|
</Button>
|
|
</div>
|
|
{children}
|
|
</div>
|
|
);
|
|
}
|