Flutter VPN Connection Status Card with Server and Speed Stats
A VPN client status card with a large protected state badge, the active server and its latency, protocol and kill switch rows in a soft inner panel, session and throughput stats, plus a disconnect action. Shows how Wind handles centred column layouts, nested panels and dark-mode inverted buttons.
main.dart
WDiv(
className: 'max-w-sm w-full rounded-3xl bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-800 shadow-xl p-6',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WText(
'Private Tunnel',
className: 'text-base font-bold text-gray-900 dark:text-white'
),
WDiv(
className: 'flex flex-row items-center px-3 py-1 rounded-full bg-emerald-100 dark:bg-emerald-800',
children: [
WDiv(
className: 'w-2 h-2 rounded-full bg-emerald-500 dark:bg-emerald-300'
),
WText(
'Connected',
className: 'text-xs font-semibold text-emerald-700 dark:text-emerald-100 ml-1.5'
),
],
),
],
),
WDiv(
className: 'flex flex-col items-center w-full mt-6',
children: [
WDiv(
className: 'w-16 h-16 rounded-full bg-emerald-50 dark:bg-emerald-900 flex flex-row items-center justify-center',
child: WIcon(
Icons.check_circle,
className: 'text-emerald-600 dark:text-emerald-300 text-3xl'
),
),
WText(
'Protected',
className: 'text-xl font-extrabold text-gray-900 dark:text-white mt-3'
),
WText(
'Your traffic is encrypted end to end',
className: 'text-xs text-gray-500 dark:text-gray-400 mt-1'
),
],
),
WDiv(
className: 'flex flex-col w-full rounded-2xl bg-gray-50 dark:bg-gray-800 p-4 mt-6',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WDiv(
className: 'flex flex-row items-center',
children: [
WIcon(
Icons.location_on,
className: 'text-indigo-500 dark:text-indigo-400 text-base'
),
WText(
'Frankfurt, Germany',
className: 'text-sm font-semibold text-gray-900 dark:text-white ml-2'
),
],
),
WDiv(
className: 'px-2.5 py-1 rounded-full bg-emerald-100 dark:bg-emerald-800',
child: WText(
'18 ms',
className: 'text-xs font-semibold text-emerald-700 dark:text-emerald-100'
),
),
],
),
WDiv(
className: 'flex flex-row items-center justify-between w-full mt-3',
children: [
WText(
'Protocol',
className: 'text-xs text-gray-500 dark:text-gray-400'
),
WText(
'WireGuard | AES-256',
className: 'text-xs font-semibold text-gray-700 dark:text-gray-200'
),
],
),
WDiv(
className: 'flex flex-row items-center justify-between w-full mt-2',
children: [
WText(
'Kill switch',
className: 'text-xs text-gray-500 dark:text-gray-400'
),
WDiv(
className: 'flex flex-row items-center',
children: [
WIcon(
Icons.bolt,
className: 'text-amber-500 dark:text-amber-400 text-sm'
),
WText(
'Always on',
className: 'text-xs font-semibold text-gray-700 dark:text-gray-200 ml-1'
),
],
),
],
),
],
),
WDiv(
className: 'flex flex-row items-center justify-between w-full mt-5',
children: [
WDiv(
className: 'flex flex-col',
children: [
WText(
'01:42:07',
className: 'text-sm font-bold text-gray-900 dark:text-white'
),
WText(
'Session',
className: 'text-xs text-gray-400 dark:text-gray-500 mt-0.5'
),
],
),
WDiv(
className: 'flex flex-col',
children: [
WText(
'84 Mbps',
className: 'text-sm font-bold text-gray-900 dark:text-white'
),
WText(
'Download',
className: 'text-xs text-gray-400 dark:text-gray-500 mt-0.5'
),
],
),
WDiv(
className: 'flex flex-col',
children: [
WText(
'21 Mbps',
className: 'text-sm font-bold text-gray-900 dark:text-white'
),
WText(
'Upload',
className: 'text-xs text-gray-400 dark:text-gray-500 mt-0.5'
),
],
),
],
),
WDiv(
className: 'w-full mt-6',
child: WButton(
className: 'w-full rounded-2xl bg-gray-900 dark:bg-white py-3',
child: WText(
'Disconnect',
className: 'text-white dark:text-gray-900 text-center font-semibold text-sm'
),
),
),
],
)
Stats
- Views
- 2
- Stars
- 0
- Revisions
- 1
- Size
- 5,158 chars
- Created
- Jul 25, 2026