import { useMemo } from 'react'; import type { ReactNode } from 'react'; import type { OverlayLayer } from './ChartPanel.types'; import { IconEye, IconLock, IconTrash } from './ChartIcons'; type Props = { open: boolean; layers: OverlayLayer[]; onRequestClose: () => void; onToggleLayerVisible: (layerId: string) => void; onToggleLayerLocked: (layerId: string) => void; onSetLayerOpacity: (layerId: string, opacity: number) => void; fibPresent: boolean; fibSelected: boolean; fibVisible: boolean; fibLocked: boolean; fibOpacity: number; onSelectFib: () => void; onToggleFibVisible: () => void; onToggleFibLocked: () => void; onSetFibOpacity: (opacity: number) => void; onDeleteFib: () => void; }; function clamp01(v: number): number { if (!Number.isFinite(v)) return 1; return Math.max(0, Math.min(1, v)); } function opacityToPct(opacity: number): number { return Math.round(clamp01(opacity) * 100); } function pctToOpacity(pct: number): number { if (!Number.isFinite(pct)) return 1; return clamp01(pct / 100); } function IconButton({ title, active, disabled, onClick, children, }: { title: string; active?: boolean; disabled?: boolean; onClick: () => void; children: ReactNode; }) { return ( ); } function OpacitySlider({ value, disabled, onChange, }: { value: number; disabled?: boolean; onChange: (next: number) => void; }) { const pct = opacityToPct(value); return (