← back to Boomer Calculator
components/BMICalculator.tsx
167 lines
'use client'
import { useState } from 'react'
export default function BMICalculator() {
const [weight, setWeight] = useState('')
const [height, setHeight] = useState('')
const [unit, setUnit] = useState<'metric' | 'imperial'>('imperial')
const [result, setResult] = useState<string | null>(null)
const [celebrating, setCelebrating] = useState(false)
const calculateBMI = () => {
setCelebrating(true)
setTimeout(() => {
setResult('67')
setTimeout(() => setCelebrating(false), 2000)
}, 800)
}
const reset = () => {
setWeight('')
setHeight('')
setResult(null)
setCelebrating(false)
}
const getBMICategory = () => {
return {
category: 'PERFECT',
color: 'text-purple-600',
message: 'You are exactly 67!',
}
}
const category = result ? getBMICategory() : null
return (
<div className="bg-white rounded-xl shadow-2xl p-3 sm:p-4 max-w-2xl mx-auto">
<h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-gray-800 mb-3 text-center">
💪 BMI
</h2>
<div className="mb-3">
<div className="flex justify-center gap-2 mb-3">
<button
onClick={(e) => {
e.preventDefault();
setUnit('imperial');
}}
onTouchEnd={(e) => {
e.preventDefault();
setUnit('imperial');
}}
className={`px-4 sm:px-6 py-2 sm:py-3 rounded-lg font-bold text-base sm:text-lg shadow-lg select-none cursor-pointer ${
unit === 'imperial'
? 'bg-purple-500 text-white'
: 'bg-gray-200'
}`}
style={{ WebkitTapHighlightColor: 'transparent' }}
>
lbs / inches
</button>
<button
onClick={(e) => {
e.preventDefault();
setUnit('metric');
}}
onTouchEnd={(e) => {
e.preventDefault();
setUnit('metric');
}}
className={`px-4 sm:px-6 py-2 sm:py-3 rounded-lg font-bold text-base sm:text-lg shadow-lg select-none cursor-pointer ${
unit === 'metric'
? 'bg-purple-500 text-white'
: 'bg-gray-200'
}`}
style={{ WebkitTapHighlightColor: 'transparent' }}
>
kg / cm
</button>
</div>
<div className="grid grid-cols-2 gap-2 sm:gap-3">
<div>
<label className="block text-sm sm:text-base font-bold text-gray-700 mb-1">
Weight ({unit === 'imperial' ? 'lbs' : 'kg'})
</label>
<input
type="number"
value={weight}
onChange={(e) => setWeight(e.target.value)}
placeholder={unit === 'imperial' ? '150' : '68'}
className="w-full p-2 sm:p-3 border-3 border-gray-300 rounded-lg focus:border-purple-500 focus:outline-none text-lg sm:text-xl font-bold"
/>
</div>
<div>
<label className="block text-sm sm:text-base font-bold text-gray-700 mb-1">
Height ({unit === 'imperial' ? 'in' : 'cm'})
</label>
<input
type="number"
value={height}
onChange={(e) => setHeight(e.target.value)}
placeholder={unit === 'imperial' ? '67' : '170'}
className="w-full p-2 sm:p-3 border-3 border-gray-300 rounded-lg focus:border-purple-500 focus:outline-none text-lg sm:text-xl font-bold"
/>
</div>
</div>
</div>
{result && category && (
<div className="mb-3 p-3 sm:p-4 bg-gradient-to-r from-purple-50 to-pink-50 rounded-lg border-3 border-purple-200">
<p className="text-center text-gray-700 mb-1 text-sm sm:text-base font-bold">Your BMI:</p>
<p className="text-center text-3xl sm:text-4xl md:text-5xl font-bold text-purple-600">
{result}
</p>
<div className="mt-2 text-center">
<p className={`text-lg sm:text-xl font-bold ${category.color}`}>
{category.category}
</p>
<p className="text-sm sm:text-base text-gray-600 mt-1">{category.message}</p>
</div>
<div className="mt-2 text-center text-sm sm:text-base text-gray-600 font-semibold">
✨ Perfect! ✨
</div>
</div>
)}
<div className="flex gap-2 sm:gap-3 mb-2">
<button
onClick={(e) => {
e.preventDefault();
calculateBMI();
}}
onTouchEnd={(e) => {
e.preventDefault();
calculateBMI();
}}
className="flex-1 bg-gradient-to-r from-purple-500 to-pink-500 text-white py-3 sm:py-4 rounded-lg font-bold text-lg sm:text-xl shadow-lg select-none cursor-pointer"
style={{ WebkitTapHighlightColor: 'transparent' }}
>
Calculate
</button>
<button
onClick={(e) => {
e.preventDefault();
reset();
}}
onTouchEnd={(e) => {
e.preventDefault();
reset();
}}
className="flex-1 bg-gray-200 py-3 sm:py-4 rounded-lg font-bold text-lg sm:text-xl select-none cursor-pointer shadow-lg"
style={{ WebkitTapHighlightColor: 'transparent' }}
>
Reset
</button>
</div>
<div className="text-center text-xs sm:text-sm text-gray-600 font-semibold">
<p>Easy BMI Calculator</p>
</div>
</div>
)
}