增加颜色对比的分析模式选择。
This commit is contained in:
parent
bfd179c4aa
commit
44023fed29
|
@ -19,20 +19,28 @@ const defaultCompareResult: HctDiffference = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export function HCTCompare({ basic = '000000', compare = '000000' }: CompareMethodProps) {
|
export function HCTCompare({
|
||||||
|
basic = '000000',
|
||||||
|
compare = '000000',
|
||||||
|
mode = 'absolute',
|
||||||
|
}: CompareMethodProps) {
|
||||||
const { colorFn } = useColorFunction();
|
const { colorFn } = useColorFunction();
|
||||||
const differ = useMemo(() => {
|
const differ = useMemo(() => {
|
||||||
if (!colorFn) {
|
if (!colorFn) {
|
||||||
return defaultCompareResult;
|
return defaultCompareResult;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const diff = colorFn.differ_in_hct(basic, compare);
|
const diffFn = {
|
||||||
|
absolute: colorFn.differ_in_hct,
|
||||||
|
relative: colorFn.relative_differ_in_hct,
|
||||||
|
};
|
||||||
|
const diff = diffFn[mode](basic, compare);
|
||||||
return diff;
|
return diff;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('[Compare in HCT]', e);
|
console.error('[Compare in HCT]', e);
|
||||||
}
|
}
|
||||||
return defaultCompareResult;
|
return defaultCompareResult;
|
||||||
}, [basic, compare]);
|
}, [basic, compare, mode]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|
|
@ -19,20 +19,28 @@ const defaultCompareResult: HSLDifference = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export function HSLCompare({ basic = '000000', compare = '000000' }: CompareMethodProps) {
|
export function HSLCompare({
|
||||||
|
basic = '000000',
|
||||||
|
compare = '000000',
|
||||||
|
mode = 'absolute',
|
||||||
|
}: CompareMethodProps) {
|
||||||
const { colorFn } = useColorFunction();
|
const { colorFn } = useColorFunction();
|
||||||
const differ = useMemo(() => {
|
const differ = useMemo(() => {
|
||||||
if (!colorFn) {
|
if (!colorFn) {
|
||||||
return defaultCompareResult;
|
return defaultCompareResult;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const diff = colorFn.differ_in_hsl(basic, compare);
|
const diffFn = {
|
||||||
|
absolute: colorFn.differ_in_hsl,
|
||||||
|
relative: colorFn.relative_differ_in_hsl,
|
||||||
|
};
|
||||||
|
const diff = diffFn[mode](basic, compare);
|
||||||
return diff;
|
return diff;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('[Compare in HSL]', e);
|
console.error('[Compare in HSL]', e);
|
||||||
}
|
}
|
||||||
return defaultCompareResult;
|
return defaultCompareResult;
|
||||||
}, [basic, compare]);
|
}, [basic, compare, mode]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|
|
@ -19,20 +19,28 @@ const defaultCompareResult: OklchDifference = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export function OklchCompare({ basic = '000000', compare = '000000' }: CompareMethodProps) {
|
export function OklchCompare({
|
||||||
|
basic = '000000',
|
||||||
|
compare = '000000',
|
||||||
|
mode = 'absolute',
|
||||||
|
}: CompareMethodProps) {
|
||||||
const { colorFn } = useColorFunction();
|
const { colorFn } = useColorFunction();
|
||||||
const differ = useMemo(() => {
|
const differ = useMemo(() => {
|
||||||
if (!colorFn) {
|
if (!colorFn) {
|
||||||
return defaultCompareResult;
|
return defaultCompareResult;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const diff = colorFn.differ_in_oklch(basic, compare);
|
const diffFn = {
|
||||||
|
absolute: colorFn.differ_in_oklch,
|
||||||
|
relative: colorFn.relative_differ_in_oklch,
|
||||||
|
};
|
||||||
|
const diff = diffFn[mode](basic, compare);
|
||||||
return diff;
|
return diff;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('[Compare in Oklch]', e);
|
console.error('[Compare in Oklch]', e);
|
||||||
}
|
}
|
||||||
return defaultCompareResult;
|
return defaultCompareResult;
|
||||||
}, [basic, compare]);
|
}, [basic, compare, mode]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|
|
@ -19,14 +19,22 @@ const defaultCompareResult: RGBDifference = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export function RGBCompare({ basic = '000000', compare = '000000' }: CompareMethodProps) {
|
export function RGBCompare({
|
||||||
|
basic = '000000',
|
||||||
|
compare = '000000',
|
||||||
|
mode = 'absolute',
|
||||||
|
}: CompareMethodProps) {
|
||||||
const { colorFn } = useColorFunction();
|
const { colorFn } = useColorFunction();
|
||||||
const differ = useMemo(() => {
|
const differ = useMemo(() => {
|
||||||
if (!colorFn) {
|
if (!colorFn) {
|
||||||
return defaultCompareResult;
|
return defaultCompareResult;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const diff = colorFn?.differ_in_rgb(basic, compare);
|
const diffFn = {
|
||||||
|
absolute: colorFn.differ_in_rgb,
|
||||||
|
relative: colorFn.relative_differ_in_rgb,
|
||||||
|
};
|
||||||
|
const diff = diffFn[mode](basic, compare);
|
||||||
return {
|
return {
|
||||||
r: {
|
r: {
|
||||||
delta: Math.round(diff.r.delta * 255),
|
delta: Math.round(diff.r.delta * 255),
|
||||||
|
@ -45,7 +53,7 @@ export function RGBCompare({ basic = '000000', compare = '000000' }: CompareMeth
|
||||||
console.error('[Compare in RGB]', e);
|
console.error('[Compare in RGB]', e);
|
||||||
}
|
}
|
||||||
return defaultCompareResult;
|
return defaultCompareResult;
|
||||||
}, [basic, compare]);
|
}, [basic, compare, mode]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|
|
@ -46,7 +46,7 @@ export function ShadeScale({ basic = '000000', compare = '000000' }: CompareMeth
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.elements}>
|
<div className={styles.elements}>
|
||||||
<div className={styles.element}>
|
<div className={styles.element}>
|
||||||
<div className={cx(styles.element_name, styles.mean)}>F</div>
|
<div className={cx(styles.element_name, styles.mean)}>Factor</div>
|
||||||
<div className={styles.element_value}>{(mixFactors.average * 100).toFixed(2)}%</div>
|
<div className={styles.element_value}>{(mixFactors.average * 100).toFixed(2)}%</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -46,7 +46,7 @@ export function TintScale({ basic = '000000', compare = '000000' }: CompareMetho
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.elements}>
|
<div className={styles.elements}>
|
||||||
<div className={styles.element}>
|
<div className={styles.element}>
|
||||||
<div className={cx(styles.element_name, styles.mean)}>F</div>
|
<div className={cx(styles.element_name, styles.mean)}>Factor</div>
|
||||||
<div className={styles.element_value}>{(mixFactors.average * 100).toFixed(2)}%</div>
|
<div className={styles.element_value}>{(mixFactors.average * 100).toFixed(2)}%</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
export type CompareMethodProps = {
|
export type CompareMethodProps = {
|
||||||
basic?: string;
|
basic?: string;
|
||||||
compare?: string;
|
compare?: string;
|
||||||
|
mode?: 'absolute' | 'relative';
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import cx from 'clsx';
|
import cx from 'clsx';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { ColorPicker } from '../components/ColorPicker';
|
import { ColorPicker } from '../components/ColorPicker';
|
||||||
|
import { HSegmentedControl } from '../components/HSegmentedControl';
|
||||||
|
import { Labeled } from '../components/Labeled';
|
||||||
import { ScrollArea } from '../components/ScrollArea';
|
import { ScrollArea } from '../components/ScrollArea';
|
||||||
import { HCTCompare } from '../page-components/color-compare/HCTCompare';
|
import { HCTCompare } from '../page-components/color-compare/HCTCompare';
|
||||||
import { HSLCompare } from '../page-components/color-compare/HSLCompare';
|
import { HSLCompare } from '../page-components/color-compare/HSLCompare';
|
||||||
|
@ -13,6 +15,7 @@ import styles from './Compare.module.css';
|
||||||
export function ColorCompare() {
|
export function ColorCompare() {
|
||||||
const [basicColor, setBasicColor] = useState('000000');
|
const [basicColor, setBasicColor] = useState('000000');
|
||||||
const [compareColor, setCompareColor] = useState('000000');
|
const [compareColor, setCompareColor] = useState('000000');
|
||||||
|
const [analysisMode, setMode] = useState<'relative' | 'absolute'>('relative');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={cx('workspace', styles.compare_workspace)}>
|
<div className={cx('workspace', styles.compare_workspace)}>
|
||||||
|
@ -34,10 +37,20 @@ export function ColorCompare() {
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.compare_column}>
|
<div className={styles.compare_column}>
|
||||||
<h5>Compare Result</h5>
|
<h5>Compare Result</h5>
|
||||||
<RGBCompare basic={basicColor} compare={compareColor} />
|
<Labeled label="Analysis Mode">
|
||||||
<HSLCompare basic={basicColor} compare={compareColor} />
|
<HSegmentedControl
|
||||||
<HCTCompare basic={basicColor} compare={compareColor} />
|
options={[
|
||||||
<OklchCompare basic={basicColor} compare={compareColor} />
|
{ label: 'Absolute', value: 'absolute' },
|
||||||
|
{ label: 'Relative', value: 'relative' },
|
||||||
|
]}
|
||||||
|
value={analysisMode}
|
||||||
|
onChange={setMode}
|
||||||
|
/>
|
||||||
|
</Labeled>
|
||||||
|
<RGBCompare basic={basicColor} compare={compareColor} mode={analysisMode} />
|
||||||
|
<HSLCompare basic={basicColor} compare={compareColor} mode={analysisMode} />
|
||||||
|
<HCTCompare basic={basicColor} compare={compareColor} mode={analysisMode} />
|
||||||
|
<OklchCompare basic={basicColor} compare={compareColor} mode={analysisMode} />
|
||||||
<TintScale basic={basicColor} compare={compareColor} />
|
<TintScale basic={basicColor} compare={compareColor} />
|
||||||
<ShadeScale basic={basicColor} compare={compareColor} />
|
<ShadeScale basic={basicColor} compare={compareColor} />
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user