增加颜色对比的分析模式选择。

This commit is contained in:
徐涛 2025-01-14 11:18:04 +08:00
parent bfd179c4aa
commit 44023fed29
8 changed files with 64 additions and 18 deletions

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -1,4 +1,5 @@
export type CompareMethodProps = { export type CompareMethodProps = {
basic?: string; basic?: string;
compare?: string; compare?: string;
mode?: 'absolute' | 'relative';
}; };

View File

@ -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>