import cx from 'clsx'; import { useAtom } from 'jotai'; import { toInteger } from 'lodash-es'; 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 { ScrollArea } from '../components/ScrollArea'; 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 (
By regularly changing the color tone to generate a series of light and dark colors.