aboutsummaryrefslogtreecommitdiffstats
path: root/packages/excalidraw/components/Range.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'packages/excalidraw/components/Range.tsx')
-rw-r--r--packages/excalidraw/components/Range.tsx65
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>
+ );
+};