完成HSL颜色合成选择器组件。
This commit is contained in:
parent
7a76fe0751
commit
6aba40b94d
0
src/components/HslAssemble.module.css
Normal file
0
src/components/HslAssemble.module.css
Normal file
73
src/components/HslAsssemble.tsx
Normal file
73
src/components/HslAsssemble.tsx
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
import { floor } from 'lodash-es';
|
||||||
|
import { useEffect, useMemo, useState } from 'react';
|
||||||
|
import { useColorFunction } from '../ColorFunctionContext';
|
||||||
|
import { ColorRangePicker } from './ColorRangePicker';
|
||||||
|
|
||||||
|
type HslAssembleProps = {
|
||||||
|
color: string;
|
||||||
|
onChange: (color: string) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
export function HslAssemble({ color, onChange }: HslAssembleProps) {
|
||||||
|
const { colorFn } = useColorFunction();
|
||||||
|
const colorComponent = useMemo(() => {
|
||||||
|
try {
|
||||||
|
const [h, s, l] = colorFn?.represent_hsl(color) ?? [0, 0, 0];
|
||||||
|
return [h, s, l];
|
||||||
|
} catch (error) {
|
||||||
|
console.error('[Convert HSL]', error);
|
||||||
|
}
|
||||||
|
return [0, 0, 0];
|
||||||
|
}, [color]);
|
||||||
|
const [h, setH] = useState(0);
|
||||||
|
const [s, setS] = useState(0);
|
||||||
|
const [l, setL] = useState(0);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
try {
|
||||||
|
const newColor = colorFn?.hsl_to_hex(h, s / 100, l / 100) ?? '000000';
|
||||||
|
onChange(newColor);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('[Convert RGB]', error);
|
||||||
|
}
|
||||||
|
}, [h, s, l]);
|
||||||
|
useEffect(() => {
|
||||||
|
setH(colorComponent[0]);
|
||||||
|
setS(colorComponent[1] * 100);
|
||||||
|
setL(colorComponent[2] * 100);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<ColorRangePicker
|
||||||
|
title="Hue"
|
||||||
|
value={h}
|
||||||
|
onChange={setH}
|
||||||
|
gradient={`linear-gradient(to right, hsl(0, 100%, 50%), hsl(60, 100%, 50%), hsl(120, 100%, 50%), hsl(180, 100%, 50%), hsl(240, 100%, 50%), hsl(300, 100%, 50%), hsl(360, 100%, 50%))`}
|
||||||
|
max={360}
|
||||||
|
step={0.1}
|
||||||
|
valueProcess={(v) => floor(v, 2)}
|
||||||
|
/>
|
||||||
|
<ColorRangePicker
|
||||||
|
title="Saturation"
|
||||||
|
value={s}
|
||||||
|
unit="%"
|
||||||
|
onChange={setS}
|
||||||
|
gradient={`linear-gradient(to right, hsl(${h}, 0%, 50%), hsl(${h}, 100%, 50%))`}
|
||||||
|
max={100}
|
||||||
|
step={0.01}
|
||||||
|
valueProcess={(v) => floor(v, 2)}
|
||||||
|
/>
|
||||||
|
<ColorRangePicker
|
||||||
|
title="Lightness"
|
||||||
|
value={l}
|
||||||
|
unit="%"
|
||||||
|
onChange={setL}
|
||||||
|
gradient={`linear-gradient(to right, hsl(${h}, ${s}%, 0%), hsl(${h}, ${s}%, 50%), hsl(${h}, ${s}%, 100%))`}
|
||||||
|
max={100}
|
||||||
|
step={0.01}
|
||||||
|
valueProcess={(v) => floor(v, 2)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user