From 2c3233b5195f06a73d8563fecf68b7f3abbf11fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Tue, 31 Dec 2024 17:28:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=A2=9C=E8=89=B2=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E8=AE=A1=E7=AE=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Harmonies.tsx | 101 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 2 deletions(-) diff --git a/src/pages/Harmonies.tsx b/src/pages/Harmonies.tsx index b72a6d6..5714fac 100644 --- a/src/pages/Harmonies.tsx +++ b/src/pages/Harmonies.tsx @@ -1,9 +1,104 @@ import cx from 'clsx'; -import { Outlet } from 'react-router-dom'; +import { useMemo, useState } from 'react'; +import { useColorFunction } from '../ColorFunctionContext'; +import { ColorPicker } from '../components/ColorPicker'; import { VSegmentedControl } from '../components/VSegmentedControl'; +import { HarmonyColor } from '../models'; +import { HarmonyPreview } from '../page-components/harmonies/HarmonyPreview'; import styles from './Harmonies.module.css'; export function Harmonies() { + const { colorFn } = useColorFunction(); + const [seletedColor, setSelectedColor] = useState('000000'); + const [selectedMode, setSelectedMode] = useState('complementary'); + const generatedColors = useMemo(() => { + try { + console.debug('[Mode]', selectedMode); + const colors: HarmonyColor[] = []; + switch (selectedMode) { + case 'complementary': + { + colors.push({ color: seletedColor, ratio: 65 }); + const compColor = colorFn?.complementary(seletedColor) ?? '000000'; + colors.push({ color: compColor, ratio: 35 }); + } + break; + case 'analogous': + { + colors.push({ color: seletedColor, ratio: 60 }); + const analogousColors = colorFn?.analogous_30(seletedColor) ?? []; + colors.push({ color: analogousColors[0], ratio: 30 }); + colors.push({ color: analogousColors[1], ratio: 10 }); + } + break; + case 'analogous_with_complementary': + { + colors.push({ color: seletedColor, ratio: 55 }); + const analogousColors = colorFn?.analogous_30(seletedColor) ?? []; + colors.push({ color: analogousColors[0], ratio: 35 }); + colors.push({ color: analogousColors[1], ratio: 10 }); + const compColor = colorFn?.complementary(seletedColor) ?? '000000'; + colors.push({ color: compColor, ratio: 10 }); + } + break; + case 'triadic': + { + colors.push({ color: seletedColor, ratio: 60 }); + const triadicColors = colorFn?.triadic(seletedColor) ?? []; + colors.push({ color: triadicColors[0], ratio: 30 }); + colors.push({ color: triadicColors[1], ratio: 10 }); + } + break; + case 'split_complementary': + { + colors.push({ color: seletedColor, ratio: 60 }); + const splitCompColors = colorFn?.split_complementary(seletedColor) ?? []; + colors.push({ color: splitCompColors[0], ratio: 30 }); + colors.push({ color: splitCompColors[1], ratio: 10 }); + } + break; + case 'tetradic': + { + colors.push({ color: seletedColor, ratio: 55 }); + const tetradicColors = colorFn?.tetradic(seletedColor) ?? []; + colors.push({ color: tetradicColors[0], ratio: 35 }); + colors.push({ color: tetradicColors[1], ratio: 10 }); + colors.push({ color: tetradicColors[2], ratio: 10 }); + } + break; + case 'flip_tetradic': + { + colors.push({ color: seletedColor, ratio: 55 }); + const color120 = colorFn?.shift_hue(seletedColor, 120) ?? '000000'; + colors.push({ color: color120, ratio: 35 }); + const compColor = colorFn?.complementary(seletedColor) ?? '000000'; + colors.push({ color: compColor, ratio: 10 }); + const color240 = colorFn?.shift_hue(seletedColor, 240) ?? '000000'; + colors.push({ color: color240, ratio: 10 }); + } + break; + case 'square': + { + colors.push({ color: seletedColor, ratio: 55 }); + const color90 = colorFn?.shift_hue(seletedColor, 90) ?? '000000'; + colors.push({ color: color90, ratio: 35 }); + const compColor = colorFn?.complementary(seletedColor) ?? '000000'; + colors.push({ color: compColor, ratio: 10 }); + const color270 = colorFn?.shift_hue(seletedColor, 270) ?? '000000'; + colors.push({ color: color270, ratio: 10 }); + } + break; + default: + break; + } + console.debug('[Generated colors]', colors); + return colors; + } catch (error) { + console.error('[Generate Color Series]', error); + } + return [] as HarmonyColor[]; + }, [seletedColor, selectedMode]); + return (
@@ -14,10 +109,12 @@ export function Harmonies() {
- +