Flutter Hearing Test Card with Audiogram Ear Markers and Severity Bands
A hearing check card for Flutter health apps, built with Wind utility classes: a pure tone audiogram with the clinical marker convention (red circles for the right ear, blue crosses for the left), dotted threshold lines across 250 Hz to 8 kHz, translucent severity bands from normal to severe, per-ear pure tone averages, and a noise notch callout. Positioned with fixed px, so the chart scales cleanly to a hero image.
main.dart
WDiv(
className: 'w-[340px] rounded-3xl bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-800 p-5 flex flex-col shadow-xl',
children: [
WDiv(
className: 'flex flex-row items-center justify-between w-full',
children: [
WDiv(
className: 'flex flex-row items-center gap-3',
children: [
WDiv(
className: 'flex flex-row items-center justify-center w-10 h-10 rounded-xl bg-sky-600 dark:bg-sky-500',
child: WIcon(
Icons.headphones,
className: 'text-white text-xl'
)
),
WDiv(
className: 'flex flex-col',
children: [
WText(
'Hearing Check',
className: 'text-base font-bold text-gray-900 dark:text-white'
),
WText(
'Pure tone audiogram, 6 Oct',
className: 'text-xs text-gray-500 dark:text-gray-400'
),
]
),
]
),
WDiv(
className: 'flex flex-row items-center gap-3',
children: [
WDiv(
className: 'flex flex-row items-center gap-1',
children: [
WDiv(
className: 'w-[10px] h-[10px] rounded-full border-2 border-red-500 dark:border-red-400'
),
WText(
'R',
className: 'text-xs font-semibold text-red-600 dark:text-red-400'
),
]
),
WDiv(
className: 'flex flex-row items-center gap-1',
children: [
WText(
'×',
className: 'text-base font-bold text-blue-600 dark:text-blue-400'
),
WText(
'L',
className: 'text-xs font-semibold text-blue-600 dark:text-blue-400'
),
]
),
]
),
]
),
WText(
'dB HL',
className: 'text-[10px] font-medium text-gray-400 dark:text-gray-500 mt-4'
),
WDiv(
className: 'relative w-[298px] h-[192px]',
children: [
WDiv(
className: 'absolute left-[28px] top-[6px] w-[270px] h-[50px] bg-emerald-500/10 dark:bg-emerald-400/10'
),
WDiv(
className: 'absolute left-[28px] top-[56px] w-[270px] h-[20px] bg-lime-500/15 dark:bg-lime-400/10'
),
WDiv(
className: 'absolute left-[28px] top-[76px] w-[270px] h-[30px] bg-amber-400/15 dark:bg-amber-400/10'
),
WDiv(
className: 'absolute left-[28px] top-[106px] w-[270px] h-[30px] bg-orange-500/15 dark:bg-orange-400/15'
),
WDiv(
className: 'absolute left-[28px] top-[136px] w-[270px] h-[30px] bg-rose-500/15 dark:bg-rose-400/15'
),
WDiv(
className: 'absolute left-[28px] top-[166px] w-[270px] h-[20px] bg-rose-500/25 dark:bg-rose-400/25'
),
WText(
'Normal',
className: 'absolute left-[242px] top-[25px] w-[54px] text-right text-[9px] font-medium text-gray-500 dark:text-gray-400'
),
WText(
'Slight',
className: 'absolute left-[242px] top-[60px] w-[54px] text-right text-[9px] font-medium text-gray-500 dark:text-gray-400'
),
WText(
'Mild',
className: 'absolute left-[242px] top-[85px] w-[54px] text-right text-[9px] font-medium text-gray-500 dark:text-gray-400'
),
WText(
'Moderate',
className: 'absolute left-[242px] top-[115px] w-[54px] text-right text-[9px] font-medium text-gray-500 dark:text-gray-400'
),
WText(
'Mod. severe',
className: 'absolute left-[242px] top-[145px] w-[54px] text-right text-[9px] font-medium text-gray-500 dark:text-gray-400'
),
WText(
'Severe',
className: 'absolute left-[242px] top-[170px] w-[54px] text-right text-[9px] font-medium text-gray-500 dark:text-gray-400'
),
WDiv(
className: 'absolute left-[40px] top-[6px] w-[1px] h-[180px] bg-gray-300 dark:bg-gray-700'
),
WDiv(
className: 'absolute left-[78px] top-[6px] w-[1px] h-[180px] bg-gray-300 dark:bg-gray-700'
),
WDiv(
className: 'absolute left-[116px] top-[6px] w-[1px] h-[180px] bg-gray-300 dark:bg-gray-700'
),
WDiv(
className: 'absolute left-[154px] top-[6px] w-[1px] h-[180px] bg-gray-300 dark:bg-gray-700'
),
WDiv(
className: 'absolute left-[192px] top-[6px] w-[1px] h-[180px] bg-gray-300 dark:bg-gray-700'
),
WDiv(
className: 'absolute left-[230px] top-[6px] w-[1px] h-[180px] bg-gray-300 dark:bg-gray-700'
),
WText(
'0',
className: 'absolute left-[0px] top-[19px] w-[24px] text-center text-[10px] text-gray-400 dark:text-gray-500'
),
WText(
'20',
className: 'absolute left-[0px] top-[59px] w-[24px] text-center text-[10px] text-gray-400 dark:text-gray-500'
),
WText(
'40',
className: 'absolute left-[0px] top-[99px] w-[24px] text-center text-[10px] text-gray-400 dark:text-gray-500'
),
WText(
'60',
className: 'absolute left-[0px] top-[139px] w-[24px] text-center text-[10px] text-gray-400 dark:text-gray-500'
),
WText(
'80',
className: 'absolute left-[0px] top-[179px] w-[24px] text-center text-[10px] text-gray-400 dark:text-gray-500'
),
WDiv(
className: 'absolute left-[48px] top-[44px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[58px] top-[44px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[67px] top-[44px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[86px] top-[47px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[96px] top-[50px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[105px] top-[52px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[124px] top-[57px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[134px] top-[60px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[143px] top-[62px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[162px] top-[77px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[172px] top-[90px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[181px] top-[102px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[200px] top-[104px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[210px] top-[94px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[219px] top-[84px] w-[3px] h-[3px] rounded-full bg-red-400 dark:bg-red-400'
),
WDiv(
className: 'absolute left-[48px] top-[64px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[58px] top-[64px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[67px] top-[64px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[86px] top-[67px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[96px] top-[70px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[105px] top-[72px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[124px] top-[77px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[134px] top-[80px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[143px] top-[82px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[162px] top-[94px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[172px] top-[104px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[181px] top-[114px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[200px] top-[117px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[210px] top-[110px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[219px] top-[102px] w-[3px] h-[3px] rounded-full bg-blue-400 dark:bg-blue-400'
),
WDiv(
className: 'absolute left-[34px] top-[40px] w-[12px] h-[12px] rounded-full border-2 border-red-500 dark:border-red-400 bg-white dark:bg-gray-900'
),
WDiv(
className: 'absolute left-[72px] top-[40px] w-[12px] h-[12px] rounded-full border-2 border-red-500 dark:border-red-400 bg-white dark:bg-gray-900'
),
WDiv(
className: 'absolute left-[110px] top-[50px] w-[12px] h-[12px] rounded-full border-2 border-red-500 dark:border-red-400 bg-white dark:bg-gray-900'
),
WDiv(
className: 'absolute left-[148px] top-[60px] w-[12px] h-[12px] rounded-full border-2 border-red-500 dark:border-red-400 bg-white dark:bg-gray-900'
),
WDiv(
className: 'absolute left-[186px] top-[110px] w-[12px] h-[12px] rounded-full border-2 border-red-500 dark:border-red-400 bg-white dark:bg-gray-900'
),
WDiv(
className: 'absolute left-[224px] top-[70px] w-[12px] h-[12px] rounded-full border-2 border-red-500 dark:border-red-400 bg-white dark:bg-gray-900'
),
WText(
'×',
className: 'absolute left-[32px] top-[56px] w-[16px] h-[18px] text-center text-[18px] font-bold text-blue-600 dark:text-blue-400'
),
WText(
'×',
className: 'absolute left-[70px] top-[56px] w-[16px] h-[18px] text-center text-[18px] font-bold text-blue-600 dark:text-blue-400'
),
WText(
'×',
className: 'absolute left-[108px] top-[66px] w-[16px] h-[18px] text-center text-[18px] font-bold text-blue-600 dark:text-blue-400'
),
WText(
'×',
className: 'absolute left-[146px] top-[76px] w-[16px] h-[18px] text-center text-[18px] font-bold text-blue-600 dark:text-blue-400'
),
WText(
'×',
className: 'absolute left-[184px] top-[116px] w-[16px] h-[18px] text-center text-[18px] font-bold text-blue-600 dark:text-blue-400'
),
WText(
'×',
className: 'absolute left-[222px] top-[86px] w-[16px] h-[18px] text-center text-[18px] font-bold text-blue-600 dark:text-blue-400'
)
]
),
WDiv(
className: 'flex flex-row items-center w-full',
children: [
WDiv(
className: 'w-[21px] h-[4px]'
),
WText(
'250',
className: 'w-[38px] text-center text-[10px] font-medium text-gray-500 dark:text-gray-400'
),
WText(
'500',
className: 'w-[38px] text-center text-[10px] font-medium text-gray-500 dark:text-gray-400'
),
WText(
'1k',
className: 'w-[38px] text-center text-[10px] font-medium text-gray-500 dark:text-gray-400'
),
WText(
'2k',
className: 'w-[38px] text-center text-[10px] font-medium text-gray-500 dark:text-gray-400'
),
WText(
'4k',
className: 'w-[38px] text-center text-[10px] font-medium text-gray-500 dark:text-gray-400'
),
WText(
'8k',
className: 'w-[38px] text-center text-[10px] font-medium text-gray-500 dark:text-gray-400'
),
WText(
'Hz',
className: 'text-[10px] text-gray-400 dark:text-gray-500'
)
]
),
WDiv(
className: 'flex flex-row items-center justify-between w-full mt-4',
children: [
WDiv(
className: 'flex flex-col w-[143px] rounded-xl bg-red-50 dark:bg-red-950/40 px-3 py-2',
children: [
WText(
'Right ear PTA',
className: 'text-[11px] font-medium text-red-700 dark:text-red-300'
),
WDiv(
className: 'flex flex-row items-end gap-1',
children: [
WText(
'15 dB',
className: 'text-lg font-bold text-gray-900 dark:text-white'
),
WText(
'Normal',
className: 'text-xs text-gray-500 dark:text-gray-400 pb-1'
),
]
),
]
),
WDiv(
className: 'flex flex-col w-[143px] rounded-xl bg-blue-50 dark:bg-blue-950/40 px-3 py-2',
children: [
WText(
'Left ear PTA',
className: 'text-[11px] font-medium text-blue-700 dark:text-blue-300'
),
WDiv(
className: 'flex flex-row items-end gap-1',
children: [
WText(
'25 dB',
className: 'text-lg font-bold text-gray-900 dark:text-white'
),
WText(
'Slight',
className: 'text-xs text-gray-500 dark:text-gray-400 pb-1'
),
]
),
]
),
]
),
WDiv(
className: 'flex flex-row items-center gap-2 w-full mt-3 rounded-xl bg-amber-50 dark:bg-amber-900/30 px-3 py-2',
children: [
WIcon(
Icons.warning,
className: 'text-amber-600 dark:text-amber-400 text-base'
),
WText(
'Notch at 4 kHz in both ears, typical of noise',
className: 'text-xs font-medium text-amber-800 dark:text-amber-200'
),
]
),
WDiv(
className: 'w-full mt-4',
child: WButton(
className: 'w-full rounded-2xl bg-sky-600 dark:bg-sky-500 py-3 flex flex-row items-center justify-center',
child: WText(
'Share with audiologist',
className: 'text-sm font-semibold text-white'
)
)
),
],
)
Stats
- Views
- 103
- Stars
- 0
- Revisions
- 1
- Size
- 15,563 chars
- Created
- Oct 6, 2026