From ff0d34e3a5ab733e4126f1f1aa197a99d2ffca3d Mon Sep 17 00:00:00 2001 From: grimsi <9295182+grimsi@users.noreply.github.com> Date: Wed, 25 Sep 2024 20:33:59 +0200 Subject: [PATCH] Added colorblind theme Refactored other themes & theming in general --- .../components/theming/ThemePreview.tsx | 19 +++-- .../components/theming/ThemeSelector.tsx | 80 ++++++++++++------- src/main/frontend/theming/theme.ts | 31 ++++--- src/main/frontend/theming/themes.ts | 3 +- src/main/frontend/theming/themes/blue.ts | 17 +++- .../frontend/theming/themes/colorblind.ts | 67 ++++++++++++++++ .../frontend/theming/themes/gameyfin-blue.ts | 17 +++- .../theming/themes/gameyfin-classic.ts | 17 +++- .../theming/themes/gameyfin-violet.ts | 17 +++- src/main/frontend/theming/themes/neutral.ts | 17 +++- src/main/frontend/theming/themes/orange.ts | 17 +++- src/main/frontend/theming/themes/purple.ts | 17 +++- src/main/frontend/theming/themes/red.ts | 17 +++- src/main/frontend/theming/themes/rose.ts | 17 +++- src/main/frontend/theming/themes/slate.ts | 17 +++- src/main/frontend/theming/themes/violet.ts | 17 +++- src/main/frontend/theming/themes/yellow.ts | 17 +++- src/main/frontend/views/SetupView.tsx | 7 +- 18 files changed, 322 insertions(+), 89 deletions(-) create mode 100644 src/main/frontend/theming/themes/colorblind.ts diff --git a/src/main/frontend/components/theming/ThemePreview.tsx b/src/main/frontend/components/theming/ThemePreview.tsx index c904e8f..f40c2a9 100644 --- a/src/main/frontend/components/theming/ThemePreview.tsx +++ b/src/main/frontend/components/theming/ThemePreview.tsx @@ -1,18 +1,23 @@ import {Theme} from "Frontend/theming/theme"; import {Tooltip} from "@nextui-org/react"; -export default function ThemePreview({theme, mode, isSelected}: { +export default function ThemePreview({theme, isSelected}: { theme: Theme, - mode: "light" | "dark", isSelected?: boolean }) { return ( {theme.name?.replace("-", " ")}

} placement="bottom"> -
+
+
+
+
+
+
+
+
+
); } \ No newline at end of file diff --git a/src/main/frontend/components/theming/ThemeSelector.tsx b/src/main/frontend/components/theming/ThemeSelector.tsx index d7a9472..6353797 100644 --- a/src/main/frontend/components/theming/ThemeSelector.tsx +++ b/src/main/frontend/components/theming/ThemeSelector.tsx @@ -1,7 +1,6 @@ import {useTheme} from "next-themes"; -import React, {useLayoutEffect, useState} from "react"; -import {Switch} from "@nextui-org/react"; -import {Moon, SunDim} from "@phosphor-icons/react"; +import React, {useEffect, useState} from "react"; +import {Button, Card, Divider, Select, Selection, SelectItem} from "@nextui-org/react"; import {themes} from "Frontend/theming/themes"; import {Theme} from "Frontend/theming/theme"; import ThemePreview from "Frontend/components/theming/ThemePreview"; @@ -9,47 +8,68 @@ import ThemePreview from "Frontend/components/theming/ThemePreview"; export function ThemeSelector() { const {theme, setTheme} = useTheme(); - const [isSelected, setIsSelected] = useState(theme ? theme.includes("light") : false); - const [currentTheme, setCurrentTheme] = useState(theme?.substring(0, theme?.lastIndexOf("-"))); + const [selectedTheme, setSelectedTheme] = useState(theme?.substring(0, theme?.lastIndexOf("-"))); + const [selectedMode, setSelectedMode] = useState(); - useLayoutEffect(() => setTheme(`${currentTheme}-${mode()}`), [isSelected]); + useEffect(() => { + if (!selectedMode) + setSelectedMode(new Set([theme?.split('-').pop() ?? "dark"])); + }, [theme]); - function mode(): "light" | "dark" { - return isSelected ? "light" : "dark"; + useEffect(updateTheme, [selectedTheme, selectedMode]); + + function updateTheme() { + if (selectedMode instanceof Set) + setTheme(`${selectedTheme}-${selectedMode.values().next().value}`) } return ( -
-
- } - endContent={} - isSelected={isSelected} - onValueChange={() => { - setIsSelected(!isSelected); - }} - /> - -
-
+
+ +
{ //min-w-[468px] themes.map(((t: Theme) => ( -
{ - setCurrentTheme(t.name); - setTheme(`${t.name}-${mode()}`); - }}> +
setSelectedTheme(t.name)}> + isSelected={selectedTheme === t.name}/>
))) }
+

Preview

+ +
+
+ + + + + +
+ + + + + + + +
) } \ No newline at end of file diff --git a/src/main/frontend/theming/theme.ts b/src/main/frontend/theming/theme.ts index be04584..0e55b55 100644 --- a/src/main/frontend/theming/theme.ts +++ b/src/main/frontend/theming/theme.ts @@ -1,21 +1,26 @@ +type ColorPalette = { + 100: string, + 200: string, + 300: string, + 400: string, + 500: string, + 600: string, + 700: string, + 800: string, + 900: string, + DEFAULT: string +} + export type Theme = { name?: string, colors: { background?: string, foreground?: string, - primary: { - 50: string, - 100: string, - 200: string, - 300: string, - 400: string, - 500: string, - 600: string, - 700: string, - 800: string, - 900: string, - DEFAULT: string - }, + primary: ColorPalette, + secondary?: ColorPalette, + success?: ColorPalette, + warning?: ColorPalette, + danger?: ColorPalette, focus?: string, } } \ No newline at end of file diff --git a/src/main/frontend/theming/themes.ts b/src/main/frontend/theming/themes.ts index 2273108..9513919 100644 --- a/src/main/frontend/theming/themes.ts +++ b/src/main/frontend/theming/themes.ts @@ -10,6 +10,7 @@ import {Blue} from "./themes/blue"; import {Yellow} from "./themes/yellow"; import {Violet} from "./themes/violet"; import {Orange} from "./themes/orange"; +import {Colorblind} from "./themes/colorblind"; import {Theme} from "./theme"; import {ConfigTheme, ConfigThemes} from "@nextui-org/react"; @@ -43,4 +44,4 @@ export function themeNames(): string[] { return Object.keys(compileThemes(themes)); } -export const themes: Theme[] = [GameyfinBlue, GameyfinViolet, GameyfinClassic, Neutral, Slate, Red, Rose, Orange, Purple, Blue, Yellow, Violet]; +export const themes: Theme[] = [GameyfinBlue, GameyfinViolet, GameyfinClassic, Neutral, Slate, Red, Rose, Orange, Purple, Blue, Yellow, Violet, Colorblind]; diff --git a/src/main/frontend/theming/themes/blue.ts b/src/main/frontend/theming/themes/blue.ts index 3de8686..de46c99 100644 --- a/src/main/frontend/theming/themes/blue.ts +++ b/src/main/frontend/theming/themes/blue.ts @@ -4,7 +4,7 @@ export const Blue: Theme = { name: 'blue', colors: { primary: { - 50: '#e3eeff', + DEFAULT: '#2563EB', 100: '#b6cdfe', 200: '#88abf7', 300: '#5b8af1', @@ -13,8 +13,19 @@ export const Blue: Theme = { 600: '#0b3da4', 700: '#052c77', 800: '#001a4a', - 900: '#00091e', - DEFAULT: '#2563EB' + 900: '#00091e' + }, + secondary: { + DEFAULT: '#d29613', + 100: '#faebcc', + 200: '#f5d898', + 300: '#f1c465', + 400: '#ecb132', + 500: '#d29613', + 600: '#a87810', + 700: '#7e5a0c', + 800: '#543c08', + 900: '#2a1e04' } } }; \ No newline at end of file diff --git a/src/main/frontend/theming/themes/colorblind.ts b/src/main/frontend/theming/themes/colorblind.ts new file mode 100644 index 0000000..47cbf92 --- /dev/null +++ b/src/main/frontend/theming/themes/colorblind.ts @@ -0,0 +1,67 @@ +import {Theme} from '../theme'; + +export const Colorblind: Theme = { + name: 'colorblind', + colors: { + primary: { + DEFAULT: '#cc79a7', + 900: '#2f1222', + 800: '#5f2444', + 700: '#8e3666', + 600: '#bb4b88', + 500: '#cc79a7', + 400: '#d795b9', + 300: '#e1afca', + 200: '#ebcadc', + 100: '#f5e4ed' + }, + secondary: { + DEFAULT: '#0072b2', + 900: '#001724', + 800: '#002d47', + 700: '#00446b', + 600: '#005a8f', + 500: '#0072b2', + 400: '#009bf5', + 300: '#38b6ff', + 200: '#7aceff', + 100: '#bde7ff' + }, + success: { + DEFAULT: '#009e73', + 900: '#002017', + 800: '#003f2e', + 700: '#005f46', + 600: '#007e5d', + 500: '#009e73', + 400: '#00e4a8', + 300: '#2cffc7', + 200: '#72ffd9', + 100: '#b9ffec' + }, + warning: { + DEFAULT: '#e69f00', + 900: '#2e1f00', + 800: '#5c3f00', + 700: '#8a5e00', + 600: '#b87d00', + 500: '#e69f00', + 400: '#ffb81f', + 300: '#ffca57', + 200: '#ffdb8f', + 100: '#ffedc7' + }, + danger: { + DEFAULT: '#d55e00', + 900: '#2b1300', + 800: '#562500', + 700: '#813800', + 600: '#ab4a00', + 500: '#d55e00', + 400: '#ff7912', + 300: '#ff9a4e', + 200: '#ffbc89', + 100: '#ffddc4' + } + } +}; \ No newline at end of file diff --git a/src/main/frontend/theming/themes/gameyfin-blue.ts b/src/main/frontend/theming/themes/gameyfin-blue.ts index aee7c70..728f5a8 100644 --- a/src/main/frontend/theming/themes/gameyfin-blue.ts +++ b/src/main/frontend/theming/themes/gameyfin-blue.ts @@ -4,7 +4,7 @@ export const GameyfinBlue: Theme = { name: 'gameyfin-blue', colors: { primary: { - 50: '#e7eaff', + DEFAULT: '#2332c8', 100: '#bdc3f9', 200: '#919bee', 300: '#6672e5', @@ -13,8 +13,19 @@ export const GameyfinBlue: Theme = { 600: '#1a2699', 700: '#101b6f', 800: '#070f45', - 900: '#02041d', - DEFAULT: '#2332c8' + 900: '#02041d' + }, + secondary: { + DEFAULT: '#c3b422', + 100: '#f7f3cf', + 200: '#eee6a0', + 300: '#e6da70', + 400: '#ddce40', + 500: '#c3b422', + 600: '#9c8f1c', + 700: '#756b15', + 800: '#4e480e', + 900: '#272407', } } }; \ No newline at end of file diff --git a/src/main/frontend/theming/themes/gameyfin-classic.ts b/src/main/frontend/theming/themes/gameyfin-classic.ts index d7d9dd1..3e528d0 100644 --- a/src/main/frontend/theming/themes/gameyfin-classic.ts +++ b/src/main/frontend/theming/themes/gameyfin-classic.ts @@ -4,7 +4,7 @@ export const GameyfinClassic: Theme = { name: 'gameyfin-classic', colors: { primary: { - 50: '#e1ffec', + DEFAULT: '#16A34A', 100: '#b8f7cf', 200: '#8ef0b2', 300: '#62ea94', @@ -13,8 +13,19 @@ export const GameyfinClassic: Theme = { 600: '#159d47', 700: '#0b7032', 800: '#02431d', - 900: '#001804', - DEFAULT: '#16A34A' + 900: '#001804' + }, + secondary: { + DEFAULT: '#ca208d', + 100: '#f8cfe9', + 200: '#f0a0d3', + 300: '#e970bc', + 400: '#e140a6', + 500: '#ca208d', + 600: '#a21970', + 700: '#7a1354', + 800: '#510d38', + 900: '#29061c' } } }; \ No newline at end of file diff --git a/src/main/frontend/theming/themes/gameyfin-violet.ts b/src/main/frontend/theming/themes/gameyfin-violet.ts index d0886a4..b9780f9 100644 --- a/src/main/frontend/theming/themes/gameyfin-violet.ts +++ b/src/main/frontend/theming/themes/gameyfin-violet.ts @@ -4,7 +4,7 @@ export const GameyfinViolet: Theme = { name: 'gameyfin-violet', colors: { primary: { - 50: '#f3ebff', + DEFAULT: '#6441a5', 100: '#d5c7ed', 200: '#b7a4dd', 300: '#9a7fce', @@ -13,8 +13,19 @@ export const GameyfinViolet: Theme = { 600: '#4e3281', 700: '#37235d', 800: '#21153a', - 900: '#0d0519', - DEFAULT: '#6441a5' + 900: '#0d0519' + }, + secondary: { + DEFAULT: '#82a541', + 100: '#e7efd7', + 200: '#cedfaf', + 300: '#b6cf87', + 400: '#9dbf5f', + 500: '#82a541', + 600: '#688334', + 700: '#4e6227', + 800: '#34421a', + 900: '#1a210d' } } }; \ No newline at end of file diff --git a/src/main/frontend/theming/themes/neutral.ts b/src/main/frontend/theming/themes/neutral.ts index 2a08602..3db702d 100644 --- a/src/main/frontend/theming/themes/neutral.ts +++ b/src/main/frontend/theming/themes/neutral.ts @@ -4,7 +4,7 @@ export const Neutral: Theme = { name: 'neutral', colors: { primary: { - 50: '#fceff2', + DEFAULT: '#525252', 100: '#ddd7d9', 200: '#c1bfbf', 300: '#a6a6a6', @@ -13,8 +13,19 @@ export const Neutral: Theme = { 600: '#595959', 700: '#413f40', 800: '#292526', - 900: '#16090d', - DEFAULT: '#525252' + 900: '#16090d' + }, + secondary: { + DEFAULT: '#8d8d8d', + 100: '#e8e8e8', + 200: '#d1d1d1', + 300: '#bababa', + 400: '#a3a3a3', + 500: '#8d8d8d', + 600: '#707070', + 700: '#545454', + 800: '#383838', + 900: '#1c1c1c' } } }; \ No newline at end of file diff --git a/src/main/frontend/theming/themes/orange.ts b/src/main/frontend/theming/themes/orange.ts index 34c8b28..f52092b 100644 --- a/src/main/frontend/theming/themes/orange.ts +++ b/src/main/frontend/theming/themes/orange.ts @@ -4,7 +4,7 @@ export const Orange: Theme = { name: 'orange', colors: { primary: { - 50: '#ffedde', + DEFAULT: '#EA580C', 100: '#ffcdb2', 200: '#fbac84', 300: '#f78c54', @@ -13,8 +13,19 @@ export const Orange: Theme = { 600: '#ab3f07', 700: '#7a2d03', 800: '#4b1900', - 900: '#1f0600', - DEFAULT: '#EA580C' + 900: '#1f0600' + }, + secondary: { + DEFAULT: '#0b93da', + 100: '#caebfc', + 200: '#94d6f9', + 300: '#5fc2f7', + 400: '#2aadf4', + 500: '#0b93da', + 600: '#0975ae', + 700: '#075783', + 800: '#053a57', + 900: '#021d2c' } } }; \ No newline at end of file diff --git a/src/main/frontend/theming/themes/purple.ts b/src/main/frontend/theming/themes/purple.ts index e3fd41e..541388f 100644 --- a/src/main/frontend/theming/themes/purple.ts +++ b/src/main/frontend/theming/themes/purple.ts @@ -4,7 +4,7 @@ export const Purple: Theme = { name: 'purple', colors: { primary: { - 50: '#ffe6ff', + DEFAULT: '#DD62ED', 100: '#f2b9f9', 200: '#e78df3', 300: '#dc5fed', @@ -13,8 +13,19 @@ export const Purple: Theme = { 600: '#9012a0', 700: '#670b73', 800: '#3f0547', - 900: '#19001b', - DEFAULT: '#DD62ED' + 900: '#19001b' + }, + secondary: { + DEFAULT: '#2ecd1a', + 100: '#d2f9cd', + 200: '#a6f29c', + 300: '#79ec6a', + 400: '#4de538', + 500: '#2ecd1a', + 600: '#26a215', + 700: '#1c7a10', + 800: '#13510b', + 900: '#092905' } } }; \ No newline at end of file diff --git a/src/main/frontend/theming/themes/red.ts b/src/main/frontend/theming/themes/red.ts index bdf91f9..a362dee 100644 --- a/src/main/frontend/theming/themes/red.ts +++ b/src/main/frontend/theming/themes/red.ts @@ -4,7 +4,7 @@ export const Red: Theme = { name: 'red', colors: { primary: { - 50: '#ffe5e5', + DEFAULT: '#DC2626', 100: '#f9bbbb', 200: '#ef9090', 300: '#e76464', @@ -13,8 +13,19 @@ export const Red: Theme = { 600: '#9b1718', 700: '#6f0f11', 800: '#450708', - 900: '#1e0000', - DEFAULT: '#DC2626' + 900: '#1e0000' + }, + secondary: { + DEFAULT: '#20c6c6', + 100: '#cff7f7', + 200: '#9fefef', + 300: '#6ee7e7', + 400: '#3ee0e0', + 500: '#20c6c6', + 600: '#1a9e9e', + 700: '#137676', + 800: '#0d4f4f', + 900: '#062727' } } }; \ No newline at end of file diff --git a/src/main/frontend/theming/themes/rose.ts b/src/main/frontend/theming/themes/rose.ts index cb776c4..efb213f 100644 --- a/src/main/frontend/theming/themes/rose.ts +++ b/src/main/frontend/theming/themes/rose.ts @@ -4,7 +4,7 @@ export const Rose: Theme = { name: 'rose', colors: { primary: { - 50: '#ffe4ed', + DEFAULT: '#E11D48', 100: '#fbb9c8', 200: '#f28da4', 300: '#ec607f', @@ -13,8 +13,19 @@ export const Rose: Theme = { 600: '#9f1233', 700: '#730b23', 800: '#470415', - 900: '#1e0006', - DEFAULT: '#E11D48' + 900: '#1e0006' + }, + secondary: { + DEFAULT: '#1acba4', + 100: '#cdf9ef', + 200: '#9cf2df', + 300: '#6aecd0', + 400: '#38e5c0', + 500: '#1acba4', + 600: '#15a284', + 700: '#107a63', + 800: '#0b5142', + 900: '#052921' } } }; \ No newline at end of file diff --git a/src/main/frontend/theming/themes/slate.ts b/src/main/frontend/theming/themes/slate.ts index 6910c7f..613cf5c 100644 --- a/src/main/frontend/theming/themes/slate.ts +++ b/src/main/frontend/theming/themes/slate.ts @@ -4,7 +4,7 @@ export const Slate: Theme = { name: 'slate', colors: { primary: { - 50: '#eaf3ff', + DEFAULT: '#475569', 100: '#cfd7e4', 200: '#b2bdcd', 300: '#95a3b7', @@ -13,8 +13,19 @@ export const Slate: Theme = { 600: '#48566a', 700: '#323e4d', 800: '#1d2531', - 900: '#040d17', - DEFAULT: '#475569' + 900: '#040d17' + }, + secondary: { + DEFAULT: '#88775e', + 100: '#e8e4de', + 200: '#d1c9bd', + 300: '#baae9c', + 400: '#a3937b', + 500: '#88775e', + 600: '#6c5f4b', + 700: '#514738', + 800: '#363026', + 900: '#1b1813' } } }; \ No newline at end of file diff --git a/src/main/frontend/theming/themes/violet.ts b/src/main/frontend/theming/themes/violet.ts index 26ae9e5..d01c3ba 100644 --- a/src/main/frontend/theming/themes/violet.ts +++ b/src/main/frontend/theming/themes/violet.ts @@ -4,7 +4,7 @@ export const Violet: Theme = { name: 'violet', colors: { primary: { - 50: '#f2e7ff', + DEFAULT: '#6D28D9', 100: '#d4bdf8', 200: '#b592ee', 300: '#9867e5', @@ -13,8 +13,19 @@ export const Violet: Theme = { 600: '#4b1a99', 700: '#36126e', 800: '#200944', - 900: '#0d021c', - DEFAULT: '#6D28D9' + 900: '#0d021c' + }, + secondary: { + DEFAULT: '#84c322', + 100: '#e8f7cf', + 200: '#d0eea0', + 300: '#b9e670', + 400: '#a1dd40', + 500: '#84c322', + 600: '#6b9c1c', + 700: '#507515', + 800: '#354e0e', + 900: '#1b2707' } } }; \ No newline at end of file diff --git a/src/main/frontend/theming/themes/yellow.ts b/src/main/frontend/theming/themes/yellow.ts index 034ab68..0720496 100644 --- a/src/main/frontend/theming/themes/yellow.ts +++ b/src/main/frontend/theming/themes/yellow.ts @@ -4,7 +4,7 @@ export const Yellow: Theme = { name: 'yellow', colors: { primary: { - 50: '#fffadb', + DEFAULT: '#FACC15', 100: '#feefae', 200: '#fce47f', 300: '#fbd94e', @@ -13,8 +13,19 @@ export const Yellow: Theme = { 600: '#af8c00', 700: '#7d6400', 800: '#4c3c00', - 900: '#1c1400', - DEFAULT: '#FACC15' + 900: '#1c1400' + }, + secondary: { + DEFAULT: '#0531e1', + 100: '#c8d3fe', + 200: '#91a7fd', + 300: '#5a7afc', + 400: '#234efb', + 500: '#0531e1', + 600: '#0427b4', + 700: '#031d87', + 800: '#02135a', + 900: '#010a2d' } } }; \ No newline at end of file diff --git a/src/main/frontend/views/SetupView.tsx b/src/main/frontend/views/SetupView.tsx index 18d3042..a837e8b 100644 --- a/src/main/frontend/views/SetupView.tsx +++ b/src/main/frontend/views/SetupView.tsx @@ -36,7 +36,10 @@ function WelcomeStep() { function ThemeStep() { return ( - +
+

Choose your style

+ +
); } @@ -88,7 +91,7 @@ function SetupView() { const navigate = useNavigate(); return ( -
+