基本完成自动色板生成功能。
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);
 | 
			
		||||
      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 { ScrollArea } from '../components/ScrollArea';
 | 
			
		||||
import { Switch } from '../components/Switch';
 | 
			
		||||
import { PaletteColors } from '../page-components/auto-palette/PaletteColors';
 | 
			
		||||
import { currentPickedColor } from '../stores/colors';
 | 
			
		||||
import styles from './Palette.module.css';
 | 
			
		||||
 | 
			
		||||
@@ -53,14 +54,14 @@ export function AutomaticPalette() {
 | 
			
		||||
              <LabeledPicker
 | 
			
		||||
                title="Swatch Amount"
 | 
			
		||||
                min={3}
 | 
			
		||||
                max={15}
 | 
			
		||||
                max={12}
 | 
			
		||||
                step={1}
 | 
			
		||||
                value={swatchAmount}
 | 
			
		||||
                onChange={(value) => setSwatchAmount(value)}
 | 
			
		||||
              />
 | 
			
		||||
              <LabeledPicker
 | 
			
		||||
                title="Reference Bias"
 | 
			
		||||
                min={0}
 | 
			
		||||
                min={-maxBias}
 | 
			
		||||
                max={maxBias}
 | 
			
		||||
                step={1}
 | 
			
		||||
                value={referenceBias}
 | 
			
		||||
@@ -89,6 +90,17 @@ export function AutomaticPalette() {
 | 
			
		||||
          </aside>
 | 
			
		||||
          <div className={styles.palette_content}>
 | 
			
		||||
            <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}>
 | 
			
		||||
              <label>Copy color value in</label>
 | 
			
		||||
              <HSegmentedControl
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user