diff --git a/src/renderer/src/components/settings/SettingsFormControls.tsx b/src/renderer/src/components/settings/SettingsFormControls.tsx index 7acac4a4da7..a733986325d 100644 --- a/src/renderer/src/components/settings/SettingsFormControls.tsx +++ b/src/renderer/src/components/settings/SettingsFormControls.tsx @@ -149,6 +149,33 @@ export function NumberField({ onChange, suffix }: NumberFieldProps): React.JSX.Element { + const [draft, setDraft] = useState(Number.isFinite(value) ? String(value) : '') + const [prevValue, setPrevValue] = useState(value) + + // Sync draft when the external value changes (e.g. from another source) + if (value !== prevValue) { + setPrevValue(value) + setDraft(Number.isFinite(value) ? String(value) : '') + } + + const commit = (): void => { + const trimmed = draft.trim() + if (trimmed === '') { + // Empty input — reset to current value rather than committing 0 + setDraft(Number.isFinite(value) ? String(value) : '') + return + } + const next = Number(trimmed) + if (Number.isFinite(next)) { + const clamped = Math.min(max, Math.max(min, next)) + onChange(clamped) + setDraft(String(clamped)) + } else { + // Reset to current value if input is invalid + setDraft(Number.isFinite(value) ? String(value) : '') + } + } + return (