From bfc9b9a367cea9136c1cbe3314aa5f5d768b7ce4 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Mon, 13 Jan 2025 16:50:13 +0300 Subject: [PATCH] Feat: new categories and mobile --- src/App.tsx | 2 +- src/components/Image.tsx | 2 +- src/components/Tier.tsx | 2 +- src/components/TierModal.tsx | 4 ++-- src/components/TierModalCategory.tsx | 30 +++++----------------------- src/store.ts | 17 +++++++++++----- src/tools/colors.ts | 18 +++++++++++++++++ 7 files changed, 40 insertions(+), 35 deletions(-) create mode 100644 src/tools/colors.ts diff --git a/src/App.tsx b/src/App.tsx index 91d2087..8d98057 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -47,7 +47,7 @@ const App = () => { /> ))} -
+
{images .filter(image => image.category === '') .map((image, index) => ( diff --git a/src/components/Image.tsx b/src/components/Image.tsx index ca07694..ecebd65 100644 --- a/src/components/Image.tsx +++ b/src/components/Image.tsx @@ -24,7 +24,7 @@ export const TierImage = ({ image }: ImageProps) => { }, [isDragging, setModalOpen]); return (
{ <>
{ return (
{tierLevels.map(tier_level => ( diff --git a/src/components/TierModalCategory.tsx b/src/components/TierModalCategory.tsx index 7326bca..07121c7 100644 --- a/src/components/TierModalCategory.tsx +++ b/src/components/TierModalCategory.tsx @@ -1,5 +1,5 @@ import { useDroppable } from '@dnd-kit/core'; -import { useEffect } from 'react'; +import { darkenRgbColor } from '../tools/colors'; interface TierModalCategoryProps { color: string; @@ -12,24 +12,8 @@ export const TierModalCategory = ({ color, textColor, name }: TierModalCategoryP id: 'droppable:' + name, data: { name }, }); - const getColorCode = (color: string) => { - let color_code = ''; - // TODO: color on hover - switch (color) { - case 'green': - color_code = isOver ? '#55efc4' : '#00b894'; - break; - case 'red': - color_code = isOver ? '#d63031' : '#ff7675'; - break; - case 'yellow': - color_code = isOver ? '#fdcb6e' : '#ffeaa7'; - break; - default: - color_code = color; - } - return color_code; - }; + const darkRGB = darkenRgbColor(color, 40); + const getTextColorCode = (textColor: string) => { let text_color_code = ''; switch (textColor) { @@ -45,18 +29,14 @@ export const TierModalCategory = ({ color, textColor, name }: TierModalCategoryP return text_color_code; }; - useEffect(() => { - console.log(isOver); - }, [isOver]); - const style = { - backgroundColor: getColorCode(color), + backgroundColor: isOver ? darkRGB : color, color: getTextColorCode(textColor), }; return (
void; @@ -36,11 +47,7 @@ const useStore = create( }, tierLevelsModalOpen: false, setTierLevelModalOpen: (open: boolean) => set({ tierLevelsModalOpen: open }), - tierLevels: [ - generateTierLevel('S', 'green', 'black'), - generateTierLevel('A', 'yellow', 'black'), - generateTierLevel('B', 'red', 'black'), - ] as TierProps[], + tierLevels: defaultTierLevels, addTierLevel: (name: string, color: string, textColor: string) => set(state => ({ tierLevels: [...state.tierLevels, generateTierLevel(name, color, textColor)] })), editTierLevelName: (id: string, name: string) => diff --git a/src/tools/colors.ts b/src/tools/colors.ts new file mode 100644 index 0000000..8074ef6 --- /dev/null +++ b/src/tools/colors.ts @@ -0,0 +1,18 @@ +export const darkenRgbColor = (rgbColor: string, percentage: number): string => { + const rgbRegex = /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/; + const match = rgbColor.match(rgbRegex); + if (!match || percentage < 0 || percentage > 100) { + return rgbColor; + } + + const r = parseInt(match[1]); + const g = parseInt(match[2]); + const b = parseInt(match[3]); + + const factor = percentage / 100; + const newR = Math.max(0, Math.round(r * (1 - factor))); + const newG = Math.max(0, Math.round(g * (1 - factor))); + const newB = Math.max(0, Math.round(b * (1 - factor))); + + return `rgb(${newR}, ${newG}, ${newB})`; +};