Flutter SLA Scorecard Card with Bullet Chart Target Markers
A Flutter SLA scorecard card for support desk dashboards: bullet charts with qualitative bands, a thick actual-value bar and a vertical target tick, so a missed target shows at a glance instead of hiding in a percentage. Built with wind_kit utility classes, dark mode pairs, no chart package.
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'
),
),
),
],
)
More like this
-
Flutter Electromagnetic Spectrum Card with Log Scale Wavelength Bands and Visible Light Zoom
A Flutter electromagnetic spectrum card for science and physics education apps: radio, microwave, infrared, visible, UV, X-ray and gamma bands on a log wavelength axis from 10 m to 0.1 pm with NASA band edges, and a connector zooming the visible slice into a 700 to 400 nm strip. Built with wind_kit.
-
Flutter Pascal Triangle Card with Odd Entry Pattern and Row Sums
A Flutter Pascal's triangle card for maths and tutoring apps: rows 0 to 7 as binomial coefficient tiles, odd entries shaded so the Sierpinski pattern shows, and a row sum gutter doubling from 1 to 128. Counts 36 entries, 27 odd, 255 total. Centred wind_kit rows, one node per number.
-
Flutter Git Commit Graph Card with Branch Lanes and Merge Lines
A commit history card for developer tools and Git clients, built with Wind in Flutter. Colour-coded lanes for main, a feature branch and a hotfix fork and merge with right-angle connectors, commit rows carry branch, tag and HEAD chips, and an ahead/behind summary sits above a rebase action.