增加颜色对比的分析模式选择。
This commit is contained in:
		| @@ -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> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user