基本完成自动色板生成功能。
This commit is contained in:
		
							
								
								
									
										55
									
								
								src/page-components/auto-palette/PaletteColors.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								src/page-components/auto-palette/PaletteColors.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | |||||||
|  | import { useMemo } from 'react'; | ||||||
|  | import { useColorFunction } from '../../ColorFunctionContext'; | ||||||
|  | import { FlexColorStand } from '../../components/FlexColorStand'; | ||||||
|  |  | ||||||
|  | type PaletteColorsProps = { | ||||||
|  |   color: string; | ||||||
|  |   swatchAmount: number; | ||||||
|  |   referenceBias: number; | ||||||
|  |   useReference: boolean; | ||||||
|  |   min: number; | ||||||
|  |   max: number; | ||||||
|  |   copyMode: 'hex' | 'rgb' | 'hsl' | 'lab' | 'oklch'; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export function PaletteColors({ | ||||||
|  |   color = '000000', | ||||||
|  |   swatchAmount, | ||||||
|  |   referenceBias, | ||||||
|  |   useReference, | ||||||
|  |   min, | ||||||
|  |   max, | ||||||
|  |   copyMode, | ||||||
|  | }: PaletteColorsProps) { | ||||||
|  |   const { colorFn } = useColorFunction(); | ||||||
|  |   const colors = useMemo(() => { | ||||||
|  |     if (!colorFn) { | ||||||
|  |       return Array.from({ length: swatchAmount }, () => color); | ||||||
|  |     } | ||||||
|  |     try { | ||||||
|  |       if (!useReference) { | ||||||
|  |         return colorFn.generate_palette_from_color(color, swatchAmount, min, max); | ||||||
|  |       } else { | ||||||
|  |         return colorFn.generate_palette_from_color( | ||||||
|  |           color, | ||||||
|  |           swatchAmount, | ||||||
|  |           min, | ||||||
|  |           max, | ||||||
|  |           useReference, | ||||||
|  |           referenceBias, | ||||||
|  |         ); | ||||||
|  |       } | ||||||
|  |     } catch (e) { | ||||||
|  |       console.error('[Generate Auto Palette]', e); | ||||||
|  |     } | ||||||
|  |     return Array.from({ length: swatchAmount }, () => color); | ||||||
|  |   }, [color, swatchAmount, referenceBias, useReference, min, max]); | ||||||
|  |  | ||||||
|  |   return ( | ||||||
|  |     <> | ||||||
|  |       {colors.map((c, index) => ( | ||||||
|  |         <FlexColorStand key={`${c}-${index}`} color={c} valueMode={copyMode} /> | ||||||
|  |       ))} | ||||||
|  |     </> | ||||||
|  |   ); | ||||||
|  | } | ||||||
| @@ -43,5 +43,13 @@ | |||||||
|       gap: var(--spacing-s); |       gap: var(--spacing-s); | ||||||
|       font-size: var(--font-size-s); |       font-size: var(--font-size-s); | ||||||
|     } |     } | ||||||
|  |     .colors_booth { | ||||||
|  |       display: flex; | ||||||
|  |       flex-direction: row; | ||||||
|  |       justify-content: center; | ||||||
|  |       align-items: stretch; | ||||||
|  |       gap: var(--spacing-xs); | ||||||
|  |       min-height: 12em; | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -7,6 +7,7 @@ import { Labeled } from '../components/Labeled'; | |||||||
| import { LabeledPicker } from '../components/LabeledPicker'; | import { LabeledPicker } from '../components/LabeledPicker'; | ||||||
| import { ScrollArea } from '../components/ScrollArea'; | import { ScrollArea } from '../components/ScrollArea'; | ||||||
| import { Switch } from '../components/Switch'; | import { Switch } from '../components/Switch'; | ||||||
|  | import { PaletteColors } from '../page-components/auto-palette/PaletteColors'; | ||||||
| import { currentPickedColor } from '../stores/colors'; | import { currentPickedColor } from '../stores/colors'; | ||||||
| import styles from './Palette.module.css'; | import styles from './Palette.module.css'; | ||||||
|  |  | ||||||
| @@ -53,14 +54,14 @@ export function AutomaticPalette() { | |||||||
|               <LabeledPicker |               <LabeledPicker | ||||||
|                 title="Swatch Amount" |                 title="Swatch Amount" | ||||||
|                 min={3} |                 min={3} | ||||||
|                 max={15} |                 max={12} | ||||||
|                 step={1} |                 step={1} | ||||||
|                 value={swatchAmount} |                 value={swatchAmount} | ||||||
|                 onChange={(value) => setSwatchAmount(value)} |                 onChange={(value) => setSwatchAmount(value)} | ||||||
|               /> |               /> | ||||||
|               <LabeledPicker |               <LabeledPicker | ||||||
|                 title="Reference Bias" |                 title="Reference Bias" | ||||||
|                 min={0} |                 min={-maxBias} | ||||||
|                 max={maxBias} |                 max={maxBias} | ||||||
|                 step={1} |                 step={1} | ||||||
|                 value={referenceBias} |                 value={referenceBias} | ||||||
| @@ -89,6 +90,17 @@ export function AutomaticPalette() { | |||||||
|           </aside> |           </aside> | ||||||
|           <div className={styles.palette_content}> |           <div className={styles.palette_content}> | ||||||
|             <h5>Generated Palette</h5> |             <h5>Generated Palette</h5> | ||||||
|  |             <div className={styles.colors_booth}> | ||||||
|  |               <PaletteColors | ||||||
|  |                 color={selectedColor} | ||||||
|  |                 swatchAmount={swatchAmount} | ||||||
|  |                 min={minLightness / 100} | ||||||
|  |                 max={maxLightness / 100} | ||||||
|  |                 useReference={useReferenceColor} | ||||||
|  |                 referenceBias={referenceBias} | ||||||
|  |                 copyMode={mode} | ||||||
|  |               /> | ||||||
|  |             </div> | ||||||
|             <div className={styles.color_value_mode}> |             <div className={styles.color_value_mode}> | ||||||
|               <label>Copy color value in</label> |               <label>Copy color value in</label> | ||||||
|               <HSegmentedControl |               <HSegmentedControl | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user