diff options
Diffstat (limited to 'packages/excalidraw/components/Range.tsx')
| -rw-r--r-- | packages/excalidraw/components/Range.tsx | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/packages/excalidraw/components/Range.tsx b/packages/excalidraw/components/Range.tsx new file mode 100644 index 0000000..cd1869c --- /dev/null +++ b/packages/excalidraw/components/Range.tsx @@ -0,0 +1,65 @@ +import React, { useEffect } from "react"; +import { getFormValue } from "../actions/actionProperties"; +import { t } from "../i18n"; +import "./Range.scss"; + +export type RangeProps = { + updateData: (value: number) => void; + appState: any; + elements: any; + testId?: string; +}; + +export const Range = ({ + updateData, + appState, + elements, + testId, +}: RangeProps) => { + const rangeRef = React.useRef<HTMLInputElement>(null); + const valueRef = React.useRef<HTMLDivElement>(null); + const value = getFormValue( + elements, + appState, + (element) => element.opacity, + true, + appState.currentItemOpacity, + ); + useEffect(() => { + if (rangeRef.current && valueRef.current) { + const rangeElement = rangeRef.current; + const valueElement = valueRef.current; + const inputWidth = rangeElement.offsetWidth; + const thumbWidth = 15; // 15 is the width of the thumb + const position = + (value / 100) * (inputWidth - thumbWidth) + thumbWidth / 2; + valueElement.style.left = `${position}px`; + rangeElement.style.background = `linear-gradient(to right, var(--color-slider-track) 0%, var(--color-slider-track) ${value}%, var(--button-bg) ${value}%, var(--button-bg) 100%)`; + } + }, [value]); + + return ( + <label className="control-label"> + {t("labels.opacity")} + <div className="range-wrapper"> + <input + ref={rangeRef} + type="range" + min="0" + max="100" + step="10" + onChange={(event) => { + updateData(+event.target.value); + }} + value={value} + className="range-input" + data-testid={testId} + /> + <div className="value-bubble" ref={valueRef}> + {value !== 0 ? value : null} + </div> + <div className="zero-label">0</div> + </div> + </label> + ); +}; |
