diff --git a/packages/drawnix/src/components/color-picker.tsx b/packages/drawnix/src/components/color-picker.tsx index e6791c3b..474da7e4 100644 --- a/packages/drawnix/src/components/color-picker.tsx +++ b/packages/drawnix/src/components/color-picker.tsx @@ -38,38 +38,40 @@ export const ColorPicker = React.forwardRef((props: ColorPickerProps, ref) => { ); return ( <> - {/* {}} - > */} - - {ROWS_CLASSIC_COLORS.map((colors, index) => ( - - {colors.map((color) => { - return ( - - ); - })} - - ))} + + {}} + > + + {ROWS_CLASSIC_COLORS.map((colors, index) => ( + + {colors.map((color) => { + return ( + + ); + })} + + ))} + ); diff --git a/packages/drawnix/src/components/size-slider.scss b/packages/drawnix/src/components/size-slider.scss index e5180f61..e6851d36 100644 --- a/packages/drawnix/src/components/size-slider.scss +++ b/packages/drawnix/src/components/size-slider.scss @@ -8,7 +8,6 @@ background-color: var(--color-gray-20); border-radius: 2px; cursor: pointer; - margin: 0 8px; } .slider-range { position: absolute; diff --git a/packages/drawnix/src/components/size-slider.tsx b/packages/drawnix/src/components/size-slider.tsx index 3e914831..e2105c77 100644 --- a/packages/drawnix/src/components/size-slider.tsx +++ b/packages/drawnix/src/components/size-slider.tsx @@ -1,5 +1,5 @@ -import React, { useState, useRef, useCallback } from 'react'; - +import React, { useState, useRef, useCallback, useEffect } from 'react'; +import { toFixed } from '@plait/core'; import './size-slider.scss'; interface SliderProps { @@ -13,19 +13,35 @@ interface SliderProps { export const SizeSlider: React.FC = ({ min = 0, max = 100, - step = 2, + step = 1, defaultValue = 100, onChange, }) => { const [value, setValue] = useState(defaultValue); + const [thumbPercentage, setThumbPercentage] = useState(defaultValue); const sliderRef = useRef(null); + const thumbRef = useRef(null); + useEffect(() => { + if (sliderRef.current && thumbRef.current) { + const sliderRect = sliderRef.current.getBoundingClientRect(); + const thumbRect = thumbRef.current.getBoundingClientRect(); + setThumbPercentage( + toFixed((thumbRect.width / 2 / sliderRect.width) * 100) + ); + } + }, [thumbRef.current, sliderRef.current]); const handleSliderChange = useCallback( (event: React.MouseEvent | MouseEvent) => { - if (sliderRef.current) { - const rect = sliderRef.current.getBoundingClientRect(); - const x = event.clientX - rect.left; - const percentage = Math.min(Math.max(x / rect.width, 0), 1); + if (sliderRef.current && thumbRef.current) { + const sliderRect = sliderRef.current.getBoundingClientRect(); + const x = event.clientX - sliderRect.left; + let percentage = Math.min(Math.max(x / sliderRect.width, 0), 1); + if (percentage >= (100 - thumbPercentage) / 100) { + percentage = 1; + } else if (percentage <= thumbPercentage / 100) { + percentage = 0; + } const newValue = Math.round((percentage * (max - min)) / step) * step + min; setValue(newValue); @@ -35,18 +51,24 @@ export const SizeSlider: React.FC = ({ [min, max, step, onChange] ); - const handleMouseDown = useCallback(() => { + const handlePointerDown = useCallback(() => { const handleMouseMove = (e: MouseEvent) => handleSliderChange(e); const handleMouseUp = () => { - document.removeEventListener('mousemove', handleMouseMove); - document.removeEventListener('mouseup', handleMouseUp); + document.removeEventListener('pointermove', handleMouseMove); + document.removeEventListener('pointerup', handleMouseUp); }; - document.addEventListener('mousemove', handleMouseMove); - document.addEventListener('mouseup', handleMouseUp); + document.addEventListener('pointermove', handleMouseMove); + document.addEventListener('pointerup', handleMouseUp); }, [handleSliderChange]); - const percentage = ((value - min) / (max - min)) * 100; + let percentage = ((value - min) / (max - min)) * 100; + if (percentage >= 100 - thumbPercentage) { + percentage = 100 - thumbPercentage; + } + if (percentage <= thumbPercentage) { + percentage = thumbPercentage; + } return (
@@ -54,7 +76,10 @@ export const SizeSlider: React.FC = ({ ref={sliderRef} className="slider-track" onClick={handleSliderChange} - onMouseDown={handleMouseDown} + onPointerDown={(event) => { + event.preventDefault(); + handlePointerDown(); + }} >
= ({ }} />