← back to Calc 67
components/ScientificCalculator.tsx
105 lines
'use client'
import { useState, useEffect, useRef } from 'react'
export default function ScientificCalculator() {
const [display, setDisplay] = useState('0')
const [showResult, setShowResult] = useState(false)
const [celebrating, setCelebrating] = useState(false)
const audioRef = useRef<HTMLAudioElement | null>(null)
useEffect(() => {
// Preload audio
audioRef.current = new Audio('/celebration.mp3')
}, [])
const buttons = [
['C', '(', ')', '/'],
['7', '8', '9', '*'],
['4', '5', '6', '-'],
['1', '2', '3', '+'],
['0', '.', 'sin', '='],
]
const handleClick = (value: string) => {
if (value === 'C') {
setDisplay('0')
setShowResult(false)
setCelebrating(false)
} else if (value === '=') {
setDisplay('Calculating...')
setTimeout(() => {
setDisplay('67')
setShowResult(true)
setCelebrating(true)
// Play celebration sound
if (audioRef.current) {
audioRef.current.currentTime = 0
audioRef.current.play().catch(err => console.log('Audio play failed:', err))
}
setTimeout(() => setCelebrating(false), 2000)
}, 500)
} else {
if (display === '0' || showResult) {
setDisplay(value)
setShowResult(false)
} else {
setDisplay(display + value)
}
}
}
return (
<div className="bg-white rounded-xl shadow-2xl p-3 sm:p-4 max-w-2xl mx-auto border-4 border-blue-800">
<div className="mb-3 sm:mb-4">
<div className="bg-blue-900 text-white p-4 sm:p-5 rounded-lg">
<div
className={`text-3xl sm:text-4xl md:text-5xl font-bold font-mono transition-all px-2 text-center break-words ${
celebrating ? 'rainbow-animation scale-110' : ''
}`}
>
{display}
</div>
</div>
{showResult && (
<div className="mt-2 text-center text-red-600 font-bold animate-pulse text-base sm:text-lg">
🇺🇸 Perfect! 🇺🇸
</div>
)}
</div>
<div className="grid grid-cols-4 gap-2 sm:gap-3">
{buttons.flat().map((btn, idx) => (
<button
key={idx}
onClick={(e) => {
e.preventDefault();
handleClick(btn);
}}
onTouchEnd={(e) => {
e.preventDefault();
handleClick(btn);
}}
className={`p-4 sm:p-5 md:p-6 rounded-lg font-bold text-xl sm:text-2xl md:text-3xl select-none cursor-pointer shadow-lg ${
btn === '='
? 'bg-gradient-to-r from-blue-700 to-red-600 text-white col-span-1'
: btn === 'C'
? 'bg-red-600 text-white'
: ['+', '-', '*', '/'].includes(btn)
? 'bg-blue-700 text-white'
: 'bg-gray-100 text-blue-900'
}`}
style={{ WebkitTapHighlightColor: 'transparent' }}
>
{btn}
</button>
))}
</div>
<div className="mt-3 text-center text-sm sm:text-base text-blue-900 font-semibold">
<p>🇺🇸 67 Calculator - American Made</p>
</div>
</div>
)
}