diff --git a/src/components/Form/Settings/Slider/Slider.jsx b/src/components/Form/Settings/Slider/Slider.jsx index 1b5a7ee3..8ed093e2 100644 --- a/src/components/Form/Settings/Slider/Slider.jsx +++ b/src/components/Form/Settings/Slider/Slider.jsx @@ -2,7 +2,7 @@ import variables from 'config/variables'; import { useState, useCallback, memo, useMemo } from 'react'; import { toast } from 'react-toastify'; import ReactSlider from 'react-slider'; -import { MdRefresh } from 'react-icons/md'; +import { MdRefresh, MdEdit } from 'react-icons/md'; import EventBus from 'utils/eventbus'; import clsx from 'clsx'; @@ -15,6 +15,15 @@ const buttonStyles = { transitions: 'transition-colors duration-200', }; +const inputStyles = { + base: 'w-20 text-sm px-3 py-1.5 rounded-md font-medium text-center', + colors: 'bg-neutral-200 hover:bg-neutral-300 focus:bg-neutral-300', + darkMode: 'dark:bg-white/10 dark:hover:bg-white/15 dark:focus:bg-white/15', + text: 'text-neutral-800 dark:text-white', + focus: 'focus:outline-none focus:ring-2 focus:ring-neutral-400 dark:focus:ring-white/40', + transitions: 'transition-colors duration-200', +}; + const thumbStyles = { base: [ 'w-5 h-5 rounded-full cursor-pointer', @@ -67,15 +76,68 @@ const MULTIPLIER_MARKS = { }; // Memoized value display component -const ValueDisplay = memo(({ value, display }) => ( - - {value} - {display} - -)); +const ValueDisplay = memo(({ value, display, onChange }) => { + const [isEditing, setIsEditing] = useState(false); + const [inputValue, setInputValue] = useState(value); + const handleBlur = () => { + setIsEditing(false); + const newValue = Number(inputValue); + if (!isNaN(newValue)) { + onChange(newValue); + } else { + setInputValue(value); + } + }; + + const handleKeyDown = (e) => { + if (e.key === 'Enter') { + handleBlur(); + } else if (e.key === 'Escape') { + setIsEditing(false); + setInputValue(value); + } + }; + + if (isEditing) { + return ( + setInputValue(e.target.value)} + onBlur={handleBlur} + onKeyDown={handleKeyDown} + className={clsx( + inputStyles.base, + inputStyles.colors, + inputStyles.darkMode, + inputStyles.text, + inputStyles.focus, + inputStyles.transitions, + )} + autoFocus + /> + ); + } + + return ( +