精简色调调色的颜色生成。
This commit is contained in:
		@@ -1,21 +1,40 @@
 | 
			
		||||
import cx from 'clsx';
 | 
			
		||||
import { useAtom } from 'jotai';
 | 
			
		||||
import { toInteger } from 'lodash-es';
 | 
			
		||||
import { useState } from 'react';
 | 
			
		||||
import { useMemo, useState } from 'react';
 | 
			
		||||
import { useColorFunction } from '../ColorFunctionContext';
 | 
			
		||||
import { ColorPicker } from '../components/ColorPicker';
 | 
			
		||||
import { FlexColorStand } from '../components/FlexColorStand';
 | 
			
		||||
import { HSegmentedControl } from '../components/HSegmentedControl';
 | 
			
		||||
import { LabeledPicker } from '../components/LabeledPicker';
 | 
			
		||||
import { DarkenSeries, LightenSeries } from '../page-components/tones/ToneSeries';
 | 
			
		||||
import { currentPickedColor } from '../stores/colors';
 | 
			
		||||
import styles from './Tones.module.css';
 | 
			
		||||
 | 
			
		||||
export function Tones() {
 | 
			
		||||
  const { colorFn } = useColorFunction();
 | 
			
		||||
  const [selectedColor, setSelectedColor] = useAtom(currentPickedColor);
 | 
			
		||||
  const [steps, setSteps] = useState(10);
 | 
			
		||||
  const [tones, setTones] = useState(3);
 | 
			
		||||
  const [seedBias, setSeedBias] = useState(0);
 | 
			
		||||
  const [mode, setMode] = useState<'hex' | 'rgb' | 'hsl' | 'lab' | 'oklch'>('hex');
 | 
			
		||||
  const colors = useMemo(() => {
 | 
			
		||||
    try {
 | 
			
		||||
      const lightenColors = colorFn!.tonal_lighten_series(
 | 
			
		||||
        selectedColor,
 | 
			
		||||
        tones - seedBias,
 | 
			
		||||
        steps / 100,
 | 
			
		||||
      );
 | 
			
		||||
      const darkenColors = colorFn!.tonal_darken_series(
 | 
			
		||||
        selectedColor,
 | 
			
		||||
        tones + seedBias,
 | 
			
		||||
        steps / 100,
 | 
			
		||||
      );
 | 
			
		||||
      return [...darkenColors, selectedColor, ...lightenColors];
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      console.error('[Expand colors]', e);
 | 
			
		||||
    }
 | 
			
		||||
    return Array.from({ length: tones * 2 + 1 }, () => selectedColor);
 | 
			
		||||
  }, [selectedColor, tones, seedBias, steps]);
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <div className={cx('workspace', styles.tone_workspace)}>
 | 
			
		||||
@@ -43,7 +62,7 @@ export function Tones() {
 | 
			
		||||
              }}
 | 
			
		||||
            />
 | 
			
		||||
            <LabeledPicker
 | 
			
		||||
              title="Root bias"
 | 
			
		||||
              title="Basic Bias"
 | 
			
		||||
              min={-(tones - 1)}
 | 
			
		||||
              max={tones - 1}
 | 
			
		||||
              value={seedBias}
 | 
			
		||||
@@ -77,19 +96,9 @@ export function Tones() {
 | 
			
		||||
            />
 | 
			
		||||
          </div>
 | 
			
		||||
          <div className={styles.colors_booth}>
 | 
			
		||||
            <DarkenSeries
 | 
			
		||||
              color={selectedColor}
 | 
			
		||||
              expand={tones + seedBias}
 | 
			
		||||
              step={steps}
 | 
			
		||||
              valueMode={mode}
 | 
			
		||||
            />
 | 
			
		||||
            <FlexColorStand color={selectedColor} valueMode={mode} />
 | 
			
		||||
            <LightenSeries
 | 
			
		||||
              color={selectedColor}
 | 
			
		||||
              expand={tones - seedBias}
 | 
			
		||||
              step={steps}
 | 
			
		||||
              valueMode={mode}
 | 
			
		||||
            />
 | 
			
		||||
            {colors.map((c, index) => (
 | 
			
		||||
              <FlexColorStand key={`${c}-${index}`} color={c} valueMode={mode} />
 | 
			
		||||
            ))}
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </section>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user