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}

); }