@@ -580,23 +580,12 @@ function SettingItem(props: { item: Setting }) {
580580 ) ;
581581 case "input" :
582582 return component . inputType === "number" ? (
583- < Input
584- type = { "number" }
583+ < NumberInput
585584 min = { component . min }
586585 max = { component . max }
587586 step = { component . step }
588587 defaultValue = { component . defaultValue ( ) }
589- sx = { { width : 80 , mr : 1 } }
590- onChange = { debounce ( ( e ) => {
591- let value = e . target . valueAsNumber ;
592- value =
593- Number . isNaN ( value ) || value < component . min
594- ? component . min
595- : value > component . max
596- ? component . max
597- : value ;
598- component . onChange ( value ) ;
599- } , 500 ) }
588+ onChange = { ( value ) => component . onChange ( value ) }
600589 />
601590 ) : (
602591 < Input
@@ -665,3 +654,60 @@ export function SelectComponent(props: Omit<DropdownSettingComponent, "type">) {
665654 </ select >
666655 ) ;
667656}
657+
658+ type NumberInputProps = {
659+ min : number ;
660+ max : number ;
661+ step ?: number ;
662+ defaultValue : number ;
663+ onChange : ( value : number ) => void ;
664+ } ;
665+
666+ function NumberInput ( {
667+ min,
668+ max,
669+ step,
670+ defaultValue,
671+ onChange
672+ } : NumberInputProps ) {
673+ const [ isInputValid , setIsInputValid ] = useState ( true ) ;
674+
675+ return (
676+ < Flex sx = { { flexDirection : "column" , alignItems : "flex-end" } } >
677+ < Input
678+ type = { "number" }
679+ min = { min }
680+ max = { max }
681+ step = { step }
682+ defaultValue = { defaultValue }
683+ sx = { {
684+ width : 80 ,
685+ mr : 1 ,
686+ outline : isInputValid
687+ ? undefined
688+ : "2px solid var(--accent-error) !important"
689+ } }
690+ onChange = { debounce ( ( e ) => {
691+ let value = e . target . valueAsNumber ;
692+ const isValid = ! Number . isNaN ( value ) && value >= min && value <= max ;
693+ setIsInputValid ( isValid ) ;
694+ value =
695+ Number . isNaN ( value ) || value < min
696+ ? min
697+ : value > max
698+ ? max
699+ : value ;
700+ onChange ( value ) ;
701+ } , 500 ) }
702+ />
703+ { ! isInputValid && (
704+ < Text
705+ variant = "subBody"
706+ sx = { { fontSize : 11 , color : "error" , mt : 1 , mr : 1 } }
707+ >
708+ Value must be between { min } and { max }
709+ </ Text >
710+ ) }
711+ </ Flex >
712+ ) ;
713+ }
0 commit comments