Flutter SLA Scorecard Card with Bullet Chart Target Markers
A support desk scorecard that reads the way an analyst reads one. Every metric sits on a qualitative band track carrying a thick actual value bar and a vertical target tick, so a missed target is obvious at a glance instead of buried in a percentage. Built with Wind utility classes, complete dark mode pairs, and no charting dependency.
main.dart
WDiv(
className: 'flex flex-col w-[340px] rounded-3xl bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-800 p-5',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WDiv(
className: 'flex flex-row items-center',
children: [
WDiv(
className: 'flex flex-row items-center justify-center w-10 h-10 rounded-2xl bg-indigo-50 dark:bg-indigo-950',
child: WIcon(
Icons.speed,
className: 'text-xl text-indigo-500 dark:text-indigo-400'
),
),
WDiv(
className: 'flex flex-col ml-3',
children: [
WText(
'Helpdesk SLA',
className: 'text-base font-bold text-gray-900 dark:text-white'
),
WText(
'Northwind Support, September',
className: 'text-[11px] text-gray-500 dark:text-gray-400'
),
],
),
],
),
WDiv(
className: 'rounded-full bg-amber-100 dark:bg-amber-900 px-2 py-1',
child: WText(
'2 AT RISK',
className: 'text-[9px] font-bold tracking-wide text-amber-700 dark:text-amber-300'
),
),
],
),
WDiv(
className: 'flex flex-row items-center justify-between w-full mt-4',
children: [
WDiv(
className: 'flex flex-col',
children: [
WText(
'93.4%',
className: 'text-3xl font-bold text-gray-900 dark:text-white'
),
WText(
'BLENDED ATTAINMENT',
className: 'text-[9px] font-bold tracking-wide text-gray-400 dark:text-gray-500'
),
],
),
WDiv(
className: 'flex flex-col items-end',
children: [
WDiv(
className: 'rounded-full bg-rose-100 dark:bg-rose-900 px-2 py-1',
child: WText(
'-0.1 pts',
className: 'text-[11px] font-bold text-rose-700 dark:text-rose-300'
),
),
WDiv(
className: 'mt-1',
child: WText(
'vs blended target',
className: 'text-[9px] text-gray-400 dark:text-gray-500'
),
),
],
),
],
),
WDiv(
className: 'flex flex-row items-center justify-between w-full mt-4',
children: [
WText(
'BULLET CHART',
className: 'text-[9px] font-bold tracking-wide text-gray-400 dark:text-gray-500'
),
WText(
'AXIS 60 TO 100%',
className: 'text-[9px] font-bold tracking-wide text-gray-400 dark:text-gray-500'
),
],
),
WDiv(
className: 'flex flex-col w-full mt-2',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WText(
'First response under 15m',
className: 'text-[11px] font-medium text-gray-700 dark:text-gray-300'
),
WText(
'96.4%',
className: 'text-[11px] font-bold text-emerald-600 dark:text-emerald-400'
),
],
),
WDiv(
className: 'relative w-[300px] h-[16px] mt-1',
children: [
WDiv(
className: 'flex flex-row w-[300px] h-[16px]',
children: [
WDiv(
className: 'w-[150px] h-[16px] rounded-l-sm bg-gray-100 dark:bg-gray-800'
),
WDiv(
className: 'w-[90px] h-[16px] bg-gray-200 dark:bg-gray-700'
),
WDiv(
className: 'w-[60px] h-[16px] rounded-r-sm bg-gray-400 dark:bg-gray-500'
),
],
),
WDiv(
className: 'absolute left-[0px] top-[5px] w-[273px] h-[6px] rounded-sm bg-emerald-500 dark:bg-emerald-400'
),
WDiv(
className: 'absolute left-[262px] top-[1px] w-[2px] h-[14px] bg-slate-800 dark:bg-slate-200'
),
],
),
],
),
WDiv(
className: 'flex flex-col w-full mt-3',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WText(
'Resolution under 24h',
className: 'text-[11px] font-medium text-gray-700 dark:text-gray-300'
),
WText(
'91.8%',
className: 'text-[11px] font-bold text-rose-600 dark:text-rose-400'
),
],
),
WDiv(
className: 'relative w-[300px] h-[16px] mt-1',
children: [
WDiv(
className: 'flex flex-row w-[300px] h-[16px]',
children: [
WDiv(
className: 'w-[150px] h-[16px] rounded-l-sm bg-gray-100 dark:bg-gray-800'
),
WDiv(
className: 'w-[90px] h-[16px] bg-gray-200 dark:bg-gray-700'
),
WDiv(
className: 'w-[60px] h-[16px] rounded-r-sm bg-gray-400 dark:bg-gray-500'
),
],
),
WDiv(
className: 'absolute left-[0px] top-[5px] w-[238px] h-[6px] rounded-sm bg-rose-500 dark:bg-rose-400'
),
WDiv(
className: 'absolute left-[262px] top-[1px] w-[2px] h-[14px] bg-slate-800 dark:bg-slate-200'
),
],
),
],
),
WDiv(
className: 'flex flex-col w-full mt-3',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WText(
'CSAT at or above 4 stars',
className: 'text-[11px] font-medium text-gray-700 dark:text-gray-300'
),
WText(
'97.1%',
className: 'text-[11px] font-bold text-emerald-600 dark:text-emerald-400'
),
],
),
WDiv(
className: 'relative w-[300px] h-[16px] mt-1',
children: [
WDiv(
className: 'flex flex-row w-[300px] h-[16px]',
children: [
WDiv(
className: 'w-[150px] h-[16px] rounded-l-sm bg-gray-100 dark:bg-gray-800'
),
WDiv(
className: 'w-[90px] h-[16px] bg-gray-200 dark:bg-gray-700'
),
WDiv(
className: 'w-[60px] h-[16px] rounded-r-sm bg-gray-400 dark:bg-gray-500'
),
],
),
WDiv(
className: 'absolute left-[0px] top-[5px] w-[278px] h-[6px] rounded-sm bg-emerald-500 dark:bg-emerald-400'
),
WDiv(
className: 'absolute left-[255px] top-[1px] w-[2px] h-[14px] bg-slate-800 dark:bg-slate-200'
),
],
),
],
),
WDiv(
className: 'flex flex-col w-full mt-3',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WText(
'Backlog aged under 7d',
className: 'text-[11px] font-medium text-gray-700 dark:text-gray-300'
),
WText(
'88.3%',
className: 'text-[11px] font-bold text-rose-600 dark:text-rose-400'
),
],
),
WDiv(
className: 'relative w-[300px] h-[16px] mt-1',
children: [
WDiv(
className: 'flex flex-row w-[300px] h-[16px]',
children: [
WDiv(
className: 'w-[150px] h-[16px] rounded-l-sm bg-gray-100 dark:bg-gray-800'
),
WDiv(
className: 'w-[90px] h-[16px] bg-gray-200 dark:bg-gray-700'
),
WDiv(
className: 'w-[60px] h-[16px] rounded-r-sm bg-gray-400 dark:bg-gray-500'
),
],
),
WDiv(
className: 'absolute left-[0px] top-[5px] w-[212px] h-[6px] rounded-sm bg-rose-500 dark:bg-rose-400'
),
WDiv(
className: 'absolute left-[225px] top-[1px] w-[2px] h-[14px] bg-slate-800 dark:bg-slate-200'
),
],
),
],
),
WDiv(
className: 'flex flex-row items-center justify-between w-full mt-4',
children: [
WDiv(
className: 'flex flex-row items-center',
children: [
WDiv(
className: 'w-[18px] h-[8px] rounded-l-sm bg-gray-100 dark:bg-gray-800'
),
WDiv(
className: 'w-[14px] h-[8px] bg-gray-200 dark:bg-gray-700'
),
WDiv(
className: 'w-[10px] h-[8px] rounded-r-sm bg-gray-400 dark:bg-gray-500'
),
WDiv(
className: 'ml-2',
child: WText(
'BREACH, WATCH, MET',
className: 'text-[9px] font-bold tracking-wide text-gray-400 dark:text-gray-500'
),
),
],
),
WDiv(
className: 'flex flex-row items-center',
children: [
WDiv(
className: 'w-[2px] h-[10px] bg-slate-800 dark:bg-slate-200'
),
WDiv(
className: 'ml-2',
child: WText(
'TARGET',
className: 'text-[9px] font-bold tracking-wide text-gray-400 dark:text-gray-500'
),
),
],
),
],
),
WDiv(
className: 'w-full mt-4',
child: WButton(
className: 'flex flex-row items-center justify-center w-full rounded-2xl bg-gray-900 dark:bg-white px-4 py-3',
child: WText(
'Review the two breaches',
className: 'text-sm font-bold text-white dark:text-gray-900'
),
),
),
],
)
Stats
- Views
- 5
- Stars
- 0
- Revisions
- 1
- Size
- 10,338 chars
- Created
- Sep 14, 2026