import { Button, Paper, Select, Slider, Stack, Text, Group, Title } from '@mantine/core' import type { Band, Precip } from '../types' import { PRESETS, matchPreset } from '../presets' export interface ControlsState { dm: number logNw: number mu: number band: Band cantingStd: number precip: Precip } interface Props { value: ControlsState onChange: (next: ControlsState) => void } function SliderField({ label, value, min, max, step, decimals, marks, onChange, }: { label: React.ReactNode value: number min: number max: number step: number decimals: number marks?: { value: number; label?: string }[] onChange: (v: number) => void }) { return (
{label} {value.toFixed(decimals)}
) } export function Controls({ value, onChange }: Props) { const set = (k: K, v: ControlsState[K]) => onChange({ ...value, [k]: v }) return ( v && set('band', v as Band)} data={[ { value: 'S', label: 'S band (10 cm)' }, { value: 'C', label: 'C band (5 cm)' }, { value: 'X', label: 'X band (3 cm)' }, ]} allowDeselect={false} /> Dm (mm)} value={value.dm} min={0.5} max={20.0} step={0.1} decimals={1} marks={[ { value: 1, label: '1' }, { value: 5, label: '5' }, { value: 10, label: '10' }, { value: 15, label: '15' }, { value: 20, label: '20' }, ]} onChange={(v) => set('dm', v)} /> log10 Nw (mm⁻¹ m⁻³)} value={value.logNw} min={0.5} max={6.0} step={0.1} decimals={2} marks={[ { value: 1, label: '1' }, { value: 3, label: '3' }, { value: 5, label: '5' }, ]} onChange={(v) => set('logNw', v)} /> μ (shape)} value={value.mu} min={-3} max={80} step={1} decimals={0} marks={[ { value: 0, label: '0' }, { value: 20, label: '20' }, { value: 40, label: '40' }, { value: 60, label: '60' }, ]} onChange={(v) => set('mu', v)} /> Canting σ (deg)} value={value.cantingStd} min={0} max={40} step={1} decimals={0} marks={[ { value: 0, label: '0' }, { value: 20, label: '20' }, { value: 40, label: '40' }, ]} onChange={(v) => set('cantingStd', v)} /> Presets {PRESETS.map((p) => { const active = matchPreset(value) === p.key return ( ) })} ) }