feat(03-01): add loading spinners to Login, Register, and BudgetSetup submit buttons

- LoginPage: Spinner replaces button text during loading, min-w-[120px] prevents layout shift
- RegisterPage: Spinner replaces button text during loading, min-w-[120px] prevents layout shift
- BudgetSetup: Spinner replaces create button text during saving, min-w-[120px] prevents layout shift
- All buttons remain disabled during loading/saving to prevent double-submit
This commit is contained in:
2026-03-11 22:32:30 +01:00
parent c95c7f248e
commit 30ec2d5780
3 changed files with 9 additions and 6 deletions

View File

@@ -4,6 +4,7 @@ import { Card, CardContent, CardHeader, CardTitle, CardFooter } from '@/componen
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'
import { Spinner } from '@/components/ui/spinner'
import { budgets as budgetsApi, type Budget } from '@/lib/api'
interface Props {
@@ -89,8 +90,8 @@ export function BudgetSetup({ existingBudgets, onCreated, onCancel }: Props) {
</CardContent>
<CardFooter className="flex gap-2 justify-end">
<Button variant="outline" onClick={onCancel}>{t('common.cancel')}</Button>
<Button onClick={handleCreate} disabled={saving || !name || !startDate || !endDate}>
{t('common.create')}
<Button onClick={handleCreate} disabled={saving || !name || !startDate || !endDate} className="min-w-[120px]">
{saving ? <Spinner /> : t('common.create')}
</Button>
</CardFooter>
</Card>