import { Component } from 'solid-js'; import { Slider } from './Slider'; import { PillToggle } from './PillToggle'; import { CURVE_NAMES, type CurveName } from '../output/curves'; import styles from './ParamEditor.module.css'; /** * A single parameter definition (subset of mode schema's param entry, * shared between modes for the editor). */ export interface ParamDef { name: string; label: string; /** Hard min/max for the parameter (used as override clamp limits). */ hardMin: number; hardMax: number; /** Authoring default. */ default: number; /** Default curve from schema (overrides may change it). */ curve: CurveName; group?: string; } /** Override applied between MLP output and parameter destination. */ export interface ParamOverride { min: number; max: number; curve: CurveName; curveParam?: number; muted: boolean; pinned: boolean; fixedValue: number; } export interface ParamEditorProps { param: ParamDef; override: () => ParamOverride; onChange: (next: ParamOverride) => void; /** Compact rendering for inline use. */ compact?: boolean; } export const ParamEditor: Component = (props) => { const update = (patch: Partial) => { props.onChange({ ...props.override(), ...patch }); }; return (
{props.param.label} {props.param.name}
props.override().pinned ? 'pinned' : props.override().muted ? 'muted' : 'live'} onChange={(v) => { if (v === 'live') update({ muted: false, pinned: false }); else if (v === 'muted') update({ muted: true, pinned: false }); else update({ muted: false, pinned: true }); }} ariaLabel="param mode" />
update({ min: Math.min(v, props.override().max) })} /> update({ max: Math.max(v, props.override().min) })} /> update({ fixedValue: v })} disabled={!props.override().muted} />
); };