CreepURL / frontend /src /components /features /DestructionSlider.tsx
Dipan04's picture
Initial commit
d6e2363
Raw
History Blame Contribute Delete
2.63 kB
import { motion } from 'framer-motion'
interface SliderProps {
value: number
onChange: (value: number) => void
}
const levels = [
{ level: 1, label: 'Suspicious', color: '#78c26d' },
{ level: 2, label: 'Corrupted', color: '#ffd84d' },
{ level: 3, label: 'Hostile', color: '#ff9f1c' },
{ level: 4, label: 'Unstable', color: '#f06a3a' },
{ level: 5, label: 'Collapse', color: '#e54b2b' },
]
export function DestructionSlider({ value, onChange }: SliderProps) {
const current = levels[value - 1]
const progress = ((value - 1) / 4) * 100
return (
<div className="w-full">
<div className="mb-4 flex flex-wrap items-center justify-between gap-3">
<div>
<p className="mono-label mb-1">Destruction level</p>
<p className="text-sm uppercase">Choose how broken the machine should sound.</p>
</div>
<span className="border-[3px] border-black px-3 py-2 font-mono text-xs font-semibold uppercase" style={{ background: current.color }}>
{current.label}
</span>
</div>
<div className="border-[3px] border-black bg-white p-3">
<div className="relative h-5 border-[3px] border-black bg-[#d8cfbd]">
<motion.div
className="absolute left-0 top-0 h-full border-r-[3px] border-black"
style={{ background: current.color }}
animate={{ width: `${progress}%` }}
transition={{ duration: 0.2 }}
/>
<input
type="range"
min={1}
max={5}
value={value}
onChange={e => onChange(Number(e.target.value))}
className="absolute inset-0 h-full w-full cursor-pointer opacity-0"
/>
<motion.div
className="absolute top-1/2 h-7 w-7 -translate-y-1/2 border-[3px] border-black"
style={{ left: `calc(${progress}% - 14px)`, background: '#111111' }}
animate={{ left: `calc(${progress}% - 14px)` }}
transition={{ duration: 0.2 }}
/>
</div>
<div className="mt-3 grid grid-cols-5 gap-2">
{levels.map(level => (
<button
key={level.level}
type="button"
onClick={() => onChange(level.level)}
className="border-[3px] border-black px-2 py-2 text-[0.68rem] font-mono font-semibold uppercase transition-transform hover:-translate-y-[1px]"
style={{ background: value === level.level ? level.color : '#f5f0e6' }}
>
{level.level}
</button>
))}
</div>
</div>
</div>
)
}