/** * OverlayControlPanel Component * UI panel for controlling ML overlay visibility and configuration * Provides toggles for each overlay type and configuration options */ import React, { useState, useCallback } from 'react'; // ============================================================================ // Types // ============================================================================ export interface OverlayState { predictions: boolean; signals: boolean; ictConcepts: boolean; amdZones: boolean; confidenceBands: boolean; } export interface OverlayConfig { predictionModel: string; signalMinConfidence: number; amdLookback: number; refreshInterval: number; } export interface OverlayControlPanelProps { overlayState: OverlayState; onOverlayChange: (key: keyof OverlayState, value: boolean) => void; config?: OverlayConfig; onConfigChange?: (config: OverlayConfig) => void; availableModels?: string[]; isLoading?: boolean; compact?: boolean; theme?: 'dark' | 'light'; } // ============================================================================ // Default Values // ============================================================================ const DEFAULT_CONFIG: OverlayConfig = { predictionModel: 'ensemble', signalMinConfidence: 0.6, amdLookback: 10, refreshInterval: 30, }; const DEFAULT_MODELS = ['ensemble', 'lstm', 'xgboost', 'random-forest']; // ============================================================================ // Subcomponents // ============================================================================ interface ToggleSwitchProps { label: string; description?: string; checked: boolean; onChange: (checked: boolean) => void; disabled?: boolean; theme: 'dark' | 'light'; } const ToggleSwitch: React.FC = ({ label, description, checked, onChange, disabled = false, theme, }) => { const textColor = theme === 'dark' ? 'text-gray-200' : 'text-gray-800'; const descColor = theme === 'dark' ? 'text-gray-400' : 'text-gray-500'; return (