Flutter Monthly Budget Card with Category Spending Bars
A personal-finance budget card built with Wind: a remaining-balance hero with an overall progress bar, plus per-category spending rows (food, transport, shopping, bills) with icon chips and linear progress bars that turn red when a category is over budget. Dark-mode ready.
main.dart
WDiv(
className: 'mx-auto max-w-sm flex flex-col gap-5 rounded-3xl p-6 bg-white border border-gray-100 shadow-xl dark:bg-gray-900 dark:border-gray-800',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WText(
'October Budget',
className: 'text-lg font-bold text-gray-900 dark:text-white'
),
WDiv(
className: 'flex flex-row items-center gap-1.5 px-2.5 py-1 rounded-full bg-emerald-50 dark:bg-emerald-500/15',
children: [
WIcon(
Icons.check_circle,
className: 'text-sm text-emerald-500 dark:text-emerald-400'
),
WText(
'On track',
className: 'text-xs font-semibold text-emerald-600 dark:text-emerald-300'
),
]
),
]
),
WDiv(
className: 'flex flex-col gap-2 w-full',
children: [
WDiv(
className: 'flex flex-row items-end justify-between w-full',
children: [
WDiv(
className: 'flex flex-col',
children: [
WText(
'Remaining',
className: 'text-xs font-medium text-gray-400 dark:text-gray-500'
),
WText(
'$1,240',
className: 'text-3xl font-bold text-gray-900 dark:text-white'
),
]
),
WText(
'of $3,500',
className: 'text-sm font-medium text-gray-400 dark:text-gray-500'
),
]
),
WDiv(
className: 'flex flex-row items-center w-full h-2.5 rounded-full bg-gray-100 dark:bg-gray-800',
child: WDiv(
className: 'h-2.5 w-[218px] rounded-full bg-gradient-to-r from-indigo-500 to-violet-500',
child: WSpacer(
className: 'w-[218px] h-2.5'
)
)
),
]
),
WDiv(
className: 'flex flex-col gap-4 w-full',
children: [
WDiv(
className: 'flex flex-col gap-2 w-full',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WDiv(
className: 'flex flex-row items-center gap-2',
children: [
WDiv(
className: 'w-9 h-9 rounded-xl bg-emerald-50 dark:bg-emerald-500/15 flex flex-row items-center justify-center',
child: WIcon(
Icons.restaurant,
className: 'text-base text-emerald-500 dark:text-emerald-400'
)
),
WText(
'Food & Dining',
className: 'text-sm font-semibold text-gray-800 dark:text-gray-100'
),
]
),
WText(
'$620 / $800',
className: 'text-sm font-medium text-gray-500 dark:text-gray-400'
),
]
),
WDiv(
className: 'flex flex-row items-center w-full h-1.5 rounded-full bg-gray-100 dark:bg-gray-800',
child: WDiv(
className: 'h-1.5 w-[262px] rounded-full bg-emerald-500 dark:bg-emerald-400',
child: WSpacer(
className: 'w-[262px] h-1.5'
)
)
),
]
),
WDiv(
className: 'flex flex-col gap-2 w-full',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WDiv(
className: 'flex flex-row items-center gap-2',
children: [
WDiv(
className: 'w-9 h-9 rounded-xl bg-blue-50 dark:bg-blue-500/15 flex flex-row items-center justify-center',
child: WIcon(
Icons.directions_car,
className: 'text-base text-blue-500 dark:text-blue-400'
)
),
WText(
'Transport',
className: 'text-sm font-semibold text-gray-800 dark:text-gray-100'
),
]
),
WText(
'$180 / $300',
className: 'text-sm font-medium text-gray-500 dark:text-gray-400'
),
]
),
WDiv(
className: 'flex flex-row items-center w-full h-1.5 rounded-full bg-gray-100 dark:bg-gray-800',
child: WDiv(
className: 'h-1.5 w-[202px] rounded-full bg-blue-500 dark:bg-blue-400',
child: WSpacer(
className: 'w-[202px] h-1.5'
)
)
),
]
),
WDiv(
className: 'flex flex-col gap-2 w-full',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WDiv(
className: 'flex flex-row items-center gap-2',
children: [
WDiv(
className: 'w-9 h-9 rounded-xl bg-rose-50 dark:bg-rose-500/15 flex flex-row items-center justify-center',
child: WIcon(
Icons.shopping_bag,
className: 'text-base text-rose-500 dark:text-rose-400'
)
),
WText(
'Shopping',
className: 'text-sm font-semibold text-gray-800 dark:text-gray-100'
),
]
),
WText(
'$540 / $500',
className: 'text-sm font-bold text-rose-500 dark:text-rose-400'
),
]
),
WDiv(
className: 'flex flex-row items-center w-full h-1.5 rounded-full bg-gray-100 dark:bg-gray-800',
child: WDiv(
className: 'h-1.5 w-[330px] rounded-full bg-rose-500 dark:bg-rose-400',
child: WSpacer(
className: 'w-[330px] h-1.5'
)
)
),
]
),
WDiv(
className: 'flex flex-col gap-2 w-full',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WDiv(
className: 'flex flex-row items-center gap-2',
children: [
WDiv(
className: 'w-9 h-9 rounded-xl bg-indigo-50 dark:bg-indigo-500/15 flex flex-row items-center justify-center',
child: WIcon(
Icons.account_balance_wallet,
className: 'text-base text-indigo-500 dark:text-indigo-400'
)
),
WText(
'Bills & Utilities',
className: 'text-sm font-semibold text-gray-800 dark:text-gray-100'
),
]
),
WText(
'$920 / $1,000',
className: 'text-sm font-medium text-gray-500 dark:text-gray-400'
),
]
),
WDiv(
className: 'flex flex-row items-center w-full h-1.5 rounded-full bg-gray-100 dark:bg-gray-800',
child: WDiv(
className: 'h-1.5 w-[309px] rounded-full bg-indigo-500 dark:bg-indigo-400',
child: WSpacer(
className: 'w-[309px] h-1.5'
)
)
),
]
),
]
),
],
)
Stats
- Views
- 68
- Stars
- 0
- Revisions
- 1
- Size
- 8,102 chars
- Created
- Jul 4, 2026