import { useStore } from '../store';
import { useAIAdaptation } from '../hooks/useAIAdaptation';
interface SliderProps {
label: string;
value: number;
min: number;
max: number;
step: number;
unit: string;
onChange: (v: number) => void;
colorClass?: string;
}
function Slider({ label, value, min, max, step, unit, onChange, colorClass }: SliderProps) {
return (
{label}
{value.toFixed(1)} {unit}
onChange(parseFloat(e.target.value))}
className="slider-thumb w-full h-1 appearance-none rounded cursor-pointer
bg-gradient-to-r from-blue-900 to-cyan-500 accent-cyan-400"
/>
{min}{unit}
{max}{unit}
);
}
function Badge({ children, color }: { children: React.ReactNode; color: string }) {
return (
{children}
);
}
export default function ControlPanel() {
useAIAdaptation(); // attach AI calls
const {
waveAmplitude, setWaveAmplitude,
temperature, setTemperature,
waveExpansion, setWaveExpansion,
finScale, finDesign, resistance, designNote,
isLoadingAI, aiSource,
} = useStore();
return (
{/* Header */}
🚢
NavSim 3D
Simulación Hidrodinámica
{isLoadingAI && (
⟳ IA activa
)}
{/* Sliders */}
{/* AI Results */}
🤖 IA Adaptativa
{aiSource === 'huggingface' && HuggingFace}
{aiSource === 'algorithmic' && AlgorÃtmico}
{/* Fin Scale meter */}
Aletas
{finScale.toFixed(2)}×
{/* Fin Design */}
{finDesign && (
Perfil:{finDesign.profile}
Envergadura:{finDesign.span} m
Flecha:{finDesign.sweepAngle}°
Espesor:{(finDesign.thickness * 100).toFixed(1)}%
Cantidad:{finDesign.quantity}
)}
{/* Resistance */}
{resistance && (
Resistencia (N)
Oleaje:
{resistance.waveResistance.toLocaleString()}
Viscosa:
{resistance.viscousResistance.toLocaleString()}
Aletas:
{resistance.finPenalty.toLocaleString()}
Total:
{resistance.totalResistance.toLocaleString()}
Fn:
{resistance.froudeNumber}
Re:
{resistance.reynoldsNumber}
)}
{/* Design note */}
{designNote}
);
}