Control.svelte (1011B)
1 <script lang="ts"> 2 import { RANGE, inp, rescale, wrangle, type Input, type NumberRange } from '$lib/types'; 3 import DumbSlider from './DumbSlider.svelte'; 4 5 export let input: Input; 6 export let controlRange: NumberRange; 7 export let setInput: (i: Input) => void; 8 9 const updateValue = (controlValue: number) => { 10 const n = Math.round(rescale(controlValue, controlRange, RANGE.signal)); 11 setInput(inp.setValue(input, n)); 12 }; 13 14 let value: number | null; 15 $: value = Object.hasOwn(input, 'value') 16 ? Math.round(wrangle(input.value!, RANGE.signal, controlRange)) 17 : null; 18 19 $: slotProps = { range: controlRange, value: value || 0, update: updateValue }; 20 </script> 21 22 <div> 23 {#if value !== null} 24 <input type="number" {value} on:input={(e) => updateValue(Number(e.currentTarget?.value))} /> 25 {#if $$slots.default} 26 <slot props={{ range: controlRange, value: value || 0, update: updateValue }} /> 27 {:else} 28 <DumbSlider range={controlRange} value={value || 0} update={updateValue} /> 29 {/if} 30 {/if} 31 </div>