diff --git a/enjoy/assets/sound-waves.png b/enjoy/assets/sound-waves.png deleted file mode 100644 index 3f22ec4b..00000000 Binary files a/enjoy/assets/sound-waves.png and /dev/null differ diff --git a/enjoy/components.json b/enjoy/components.json index 8b573d4a..84987e9b 100644 --- a/enjoy/components.json +++ b/enjoy/components.json @@ -7,7 +7,7 @@ "config": "tailwind.config.js", "css": "src/index.css", "baseColor": "zinc", - "cssVariables": false + "cssVariables": true }, "aliases": { "components": "src/renderer/components", diff --git a/enjoy/src/i18n/en.json b/enjoy/src/i18n/en.json index fd137187..53ffa8bd 100644 --- a/enjoy/src/i18n/en.json +++ b/enjoy/src/i18n/en.json @@ -247,13 +247,17 @@ "logoutAndRemoveAllPersonalData": "Logout and remove all personal data", "logoutAndRemoveAllPersonalSettings": "Logout and remove all personal settings", "hotkeys": "Hotkeys", - "system": "System", "player": "Player", "quitApp": "Quit APP", "openPreferences": "Open preferences", "playOrPause": "Play or pause", "playOrPauseRecording": "Play or pause recording", "startOrStopRecording": "start or stop recording", + "appearance": "Appearance", + "theme": "Theme", + "light": "Light", + "dark": "Dark", + "system": "System", "about": "About", "currentVersion": "Current version", "checkUpdate": "Check update", diff --git a/enjoy/src/i18n/zh-CN.json b/enjoy/src/i18n/zh-CN.json index 5e15d3d4..50c85747 100644 --- a/enjoy/src/i18n/zh-CN.json +++ b/enjoy/src/i18n/zh-CN.json @@ -254,6 +254,10 @@ "playOrPause": "播放/暂停", "playOrPauseRecording": "播放/暂停录音", "startOrStopRecording": "开始/结束录音", + "appearance": "外观", + "theme": "主题", + "light": "浅色", + "dark": "深色", "about": "关于", "currentVersion": "当前版本", "checkUpdate": "检查更新", diff --git a/enjoy/src/main/window.ts b/enjoy/src/main/window.ts index f7c7e6b1..119cf6ee 100644 --- a/enjoy/src/main/window.ts +++ b/enjoy/src/main/window.ts @@ -444,10 +444,10 @@ ${log} // Create the browser window. const mainWindow = new BrowserWindow({ icon: "./assets/icon.png", - width: 1440, - height: 900, - minWidth: 1024, - minHeight: 768, + width: 1280, + height: 720, + minWidth: 720 , + minHeight: 576, webPreferences: { preload: path.join(__dirname, "preload.js"), spellcheck: false, diff --git a/enjoy/src/renderer/app.tsx b/enjoy/src/renderer/app.tsx index a9ed6980..3075d680 100644 --- a/enjoy/src/renderer/app.tsx +++ b/enjoy/src/renderer/app.tsx @@ -32,7 +32,7 @@ function App() { }); return ( - + diff --git a/enjoy/src/renderer/components/audios/audio-card.tsx b/enjoy/src/renderer/components/audios/audio-card.tsx index cb9fbe2d..147978e0 100644 --- a/enjoy/src/renderer/components/audios/audio-card.tsx +++ b/enjoy/src/renderer/components/audios/audio-card.tsx @@ -1,5 +1,6 @@ import { Link } from "react-router-dom"; import { cn } from "@renderer/lib/utils"; +import { AudioLinesIcon } from "lucide-react"; export const AudioCard = (props: { audio: Partial; @@ -11,17 +12,21 @@ export const AudioCard = (props: {
- + {audio.coverUrl ? ( + + ) : ( + + )}
diff --git a/enjoy/src/renderer/components/audios/audio-player.tsx b/enjoy/src/renderer/components/audios/audio-player.tsx index 8ce35bf4..f4053ff6 100644 --- a/enjoy/src/renderer/components/audios/audio-player.tsx +++ b/enjoy/src/renderer/components/audios/audio-player.tsx @@ -24,10 +24,12 @@ export const AudioPlayer = (props: { id?: string; md5?: string }) => { if (!layout) return ; return ( -
+
-
+
@@ -36,7 +38,7 @@ export const AudioPlayer = (props: { id?: string; md5?: string }) => {
-
+
@@ -45,7 +47,7 @@ export const AudioPlayer = (props: { id?: string; md5?: string }) => {
-
+
diff --git a/enjoy/src/renderer/components/medias/media-caption-tabs.tsx b/enjoy/src/renderer/components/medias/media-caption-tabs.tsx index 800ba74d..b95cefad 100644 --- a/enjoy/src/renderer/components/medias/media-caption-tabs.tsx +++ b/enjoy/src/renderer/components/medias/media-caption-tabs.tsx @@ -11,6 +11,7 @@ import { TabsTrigger, TabsContent, Separator, + ScrollArea, } from "@renderer/components/ui"; import { ConversationShortcuts } from "@renderer/components"; import { t } from "i18next"; @@ -30,42 +31,53 @@ export const MediaCaptionTabs = (props: { caption: TimelineEntry; selectedIndices: number[]; toggleRegion: (index: number) => void; + children?: React.ReactNode; }) => { - const { caption, selectedIndices, toggleRegion } = props; + const { caption, selectedIndices, toggleRegion, children } = props; const [tab, setTab] = useState("selected"); if (!caption) return null; return ( - setTab(value)} className=""> - - {t("captionTabs.selected")} - - {t("captionTabs.translation")} - - {t("captionTabs.analysis")} - {t("captionTabs.note")} - + + setTab(value)} className=""> + {children} -
- +
+ - + - + - -
- Comming soon -
-
-
- + +
+ Comming soon +
+
+
+ + + + {t("captionTabs.selected")} + + + {t("captionTabs.translation")} + + + {t("captionTabs.analysis")} + + + {t("captionTabs.note")} + + +
+
); }; @@ -193,26 +205,28 @@ const SelectedTabContent = (props: {
{word.text}
- { - word.timeline.length > 0 && ( -
- 0 && ( +
+ - {word.timeline - .map((t) => - t.timeline.map((s) => convertIpaToNormal(s.text)).join("") - ) - .join("")} - -
- ) - } + > + {word.timeline + .map((t) => + t.timeline + .map((s) => convertIpaToNormal(s.text)) + .join("") + ) + .join("")} +
+
+ )}
); })} @@ -452,7 +466,7 @@ const AnalysisTabContent = (props: { text: string }) => { new URL(props.href ?? ""); props.target = "_blank"; props.rel = "noopener noreferrer"; - } catch (e) { } + } catch (e) {} return {children}; }, diff --git a/enjoy/src/renderer/components/medias/media-caption.tsx b/enjoy/src/renderer/components/medias/media-caption.tsx index 35ed5360..d8fc11e5 100644 --- a/enjoy/src/renderer/components/medias/media-caption.tsx +++ b/enjoy/src/renderer/components/medias/media-caption.tsx @@ -272,87 +272,96 @@ export const MediaCaption = () => { return (
- -
- {/* use the words splitted by caption text if it is matched with the timeline length, otherwise use the timeline */} - {caption.text.split(" ").length !== caption.timeline.length - ? (caption.timeline || []).map((w, index) => ( -
toggleRegion(index)} - > -
-
- {w.text} -
- {displayIpa && ( -
- {w.timeline - .map((t) => - t.timeline - .map((s) => convertIpaToNormal(s.text)) - .join("") - ) - .join(" · ")} -
- )} -
-
- )) - : caption.text.split(" ").map((word, index) => ( -
toggleRegion(index)} - > -
-
- {word} -
- {displayIpa && ( -
- {caption.timeline[index].timeline - .map((t) => - t.timeline - .map((s) => convertIpaToNormal(s.text)) - .join("") - ) - .join(" · ")} -
- )} -
-
- ))} -
- +
- + > +
+ {/* use the words splitted by caption text if it is matched with the timeline length, otherwise use the timeline */} + {caption.text.split(" ").length !== caption.timeline.length + ? (caption.timeline || []).map((w, index) => ( +
toggleRegion(index)} + > +
+
+ {w.text} +
+ {displayIpa && ( +
+ {w.timeline + .map((t) => + t.timeline + .map((s) => convertIpaToNormal(s.text)) + .join("") + ) + .join(" · ")} +
+ )} +
+
+ )) + : caption.text.split(" ").map((word, index) => ( +
toggleRegion(index)} + > +
+
+ {word} +
+ {displayIpa && ( +
+ {caption.timeline[index].timeline + .map((t) => + t.timeline + .map((s) => convertIpaToNormal(s.text)) + .join("") + ) + .join(" · ")} +
+ )} +
+
+ ))} +
+
+
diff --git a/enjoy/src/renderer/components/medias/media-tabs.tsx b/enjoy/src/renderer/components/medias/media-tabs.tsx index 617315fa..b6bed603 100644 --- a/enjoy/src/renderer/components/medias/media-tabs.tsx +++ b/enjoy/src/renderer/components/medias/media-tabs.tsx @@ -24,7 +24,7 @@ export const MediaTabs = () => { return (
{media.mediaType === "Video" && ( diff --git a/enjoy/src/renderer/components/messages/assistant-message.tsx b/enjoy/src/renderer/components/messages/assistant-message.tsx index d68aa7d8..31923126 100644 --- a/enjoy/src/renderer/components/messages/assistant-message.tsx +++ b/enjoy/src/renderer/components/messages/assistant-message.tsx @@ -162,7 +162,7 @@ export const AssistantMessageComponent = (props: { {configuration.type === "gpt" && (
+
@@ -51,7 +50,7 @@ export const PostCard = (props: {
{t("sharedPrompt")}
- + {"```prompt\n" + post.metadata.content + "\n```"} @@ -59,16 +58,17 @@ export const PostCard = (props: { {post.metadata?.type === "gpt" && ( <> -
- {t("sharedGpt")} -
+
{t("sharedGpt")}
- {t('models.conversation.roleDefinition')}: + {t("models.conversation.roleDefinition")}:
-
+
- {(post.metadata.content as { [key: string]: any }).configuration?.roleDefinition} + { + (post.metadata.content as { [key: string]: any }) + .configuration?.roleDefinition + }
diff --git a/enjoy/src/renderer/components/posts/post-medium.tsx b/enjoy/src/renderer/components/posts/post-medium.tsx index 714765d5..54a6489f 100644 --- a/enjoy/src/renderer/components/posts/post-medium.tsx +++ b/enjoy/src/renderer/components/posts/post-medium.tsx @@ -1,6 +1,6 @@ import { PostAudio } from "@renderer/components"; import { t } from "i18next"; -import { MediaPlayer, MediaProvider } from "@vidstack/react"; +import { MediaPlayer, MediaProvider, PlayerSrc } from "@vidstack/react"; import { DefaultVideoLayout, defaultLayoutIcons, @@ -24,7 +24,7 @@ export const PostMedium = (props: { medium: MediumType }) => { medium.extname.replace(".", "") || "mp4" }`, src: medium.sourceUrl, - }} + } as PlayerSrc} > diff --git a/enjoy/src/renderer/components/posts/post-recording.tsx b/enjoy/src/renderer/components/posts/post-recording.tsx index 48d00529..f10f221c 100644 --- a/enjoy/src/renderer/components/posts/post-recording.tsx +++ b/enjoy/src/renderer/components/posts/post-recording.tsx @@ -160,7 +160,7 @@ export const PostRecording = (props: { {recording.referenceText && (
-
+
{recording.referenceText}
diff --git a/enjoy/src/renderer/components/posts/posts.tsx b/enjoy/src/renderer/components/posts/posts.tsx index f2c2a395..d3decccc 100644 --- a/enjoy/src/renderer/components/posts/posts.tsx +++ b/enjoy/src/renderer/components/posts/posts.tsx @@ -1,15 +1,26 @@ import { useContext, useEffect, useState } from "react"; import { AppSettingsProviderContext } from "@renderer/context"; import { PostCard, LoaderSpin } from "@renderer/components"; -import { toast, Button, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from "@renderer/components//ui"; +import { + toast, + Button, + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, + Separator, +} from "@renderer/components//ui"; import { t } from "i18next"; export const Posts = (props: { userId?: string }) => { const { userId } = props; const { webApi } = useContext(AppSettingsProviderContext); const [loading, setLoading] = useState(true); - const [type, setType] = useState<'all' | 'recording' | 'medium' | 'story' | 'prompt' | 'gpt'>("all"); - const [by, setBy] = useState<'all' | 'following'>("following"); + const [type, setType] = useState< + "all" | "recording" | "medium" | "story" | "prompt" | "gpt" + >("all"); + const [by, setBy] = useState<"all" | "following">("following"); const [posts, setPosts] = useState([]); const [nextPage, setNextPage] = useState(1); @@ -34,7 +45,7 @@ export const Posts = (props: { userId?: string }) => { items: 10, userId, by, - type + type, }) .then((res) => { if (page === 1) { @@ -63,40 +74,69 @@ export const Posts = (props: { userId?: string }) => { return (
- { - !userId && setBy(value)} + > - {t('following')} - {t('allUsers')} + + {t("following")} + + + {t("allUsers")} + - } + )} - setType(value)} + > - {t('allTypes')} - {t('recordingType')} - {t('promptType')} - {t('gptType')} - {t('mediumType')} - {t('storyType')} + + {t("allTypes")} + + + {t("recordingType")} + + + {t("promptType")} + + + {t("gptType")} + + + {t("mediumType")} + + + {t("storyType")} +
{posts.length === 0 && ( -
{t("noOneSharedYet")}
+
+ {t("noOneSharedYet")} +
)} -
+
{posts.map((post) => ( - + <> + + + ))}
diff --git a/enjoy/src/renderer/components/preferences/appearance.tsx b/enjoy/src/renderer/components/preferences/appearance.tsx new file mode 100644 index 00000000..1a3f9d12 --- /dev/null +++ b/enjoy/src/renderer/components/preferences/appearance.tsx @@ -0,0 +1,14 @@ +import { t } from "i18next"; +import { Separator } from "@renderer/components/ui"; +import { LanguageSettings, ThemeSettings } from "@renderer/components"; + +export const Appearance = () => { + return ( + <> +
{t("appearance")}
+ + + + + ); +}; diff --git a/enjoy/src/renderer/components/preferences/index.ts b/enjoy/src/renderer/components/preferences/index.ts index 4fa9c13b..33f81b3e 100644 --- a/enjoy/src/renderer/components/preferences/index.ts +++ b/enjoy/src/renderer/components/preferences/index.ts @@ -1,5 +1,6 @@ export * from "./preferences"; export * from "./about"; +export * from "./appearance"; export * from "./hotkeys"; export * from "./hotkeys-settings"; @@ -18,4 +19,6 @@ export * from "./balance-settings"; export * from "./reset-settings"; export * from "./reset-all-settings"; +export * from "./theme-settings"; + export * from "./proxy-settings"; diff --git a/enjoy/src/renderer/components/preferences/preferences.tsx b/enjoy/src/renderer/components/preferences/preferences.tsx index 010e08f0..e6522f31 100644 --- a/enjoy/src/renderer/components/preferences/preferences.tsx +++ b/enjoy/src/renderer/components/preferences/preferences.tsx @@ -2,11 +2,11 @@ import { t } from "i18next"; import { Button, ScrollArea, Separator } from "@renderer/components/ui"; import { About, + Appearance, DefaultEngineSettings, Hotkeys, UserSettings, BalanceSettings, - LanguageSettings, LibrarySettings, WhisperSettings, OpenaiSettings, @@ -73,8 +73,6 @@ export const Preferences = () => { - -
), }, @@ -83,6 +81,11 @@ export const Preferences = () => { label: t("hotkeys"), component: () => , }, + { + value: "appearance", + label: t("appearance"), + component: () => , + }, { value: "about", label: t("about"), diff --git a/enjoy/src/renderer/components/preferences/theme-settings.tsx b/enjoy/src/renderer/components/preferences/theme-settings.tsx new file mode 100644 index 00000000..17419143 --- /dev/null +++ b/enjoy/src/renderer/components/preferences/theme-settings.tsx @@ -0,0 +1,56 @@ +import { useTheme } from "@renderer/context"; +import { MoonIcon, SunIcon } from "lucide-react"; +import { + Button, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@renderer/components/ui"; +import { t } from "i18next"; + +export const ThemeSettings = () => { + const { setTheme, theme } = useTheme(); + + return ( +
+
+
{t("theme")}
+
{t(theme)}
+
+ +
+
+ +
+
+
+ ); +}; diff --git a/enjoy/src/renderer/components/recordings/recording-activities.tsx b/enjoy/src/renderer/components/recordings/recording-activities.tsx index b7635939..cd929719 100644 --- a/enjoy/src/renderer/components/recordings/recording-activities.tsx +++ b/enjoy/src/renderer/components/recordings/recording-activities.tsx @@ -1,9 +1,9 @@ import { useCallback, useState, useEffect, useContext } from "react"; -import { AppSettingsProviderContext } from "@/renderer/context"; +import { AppSettingsProviderContext } from "@renderer/context"; import { formatDate, secondsToTimestamp } from "@renderer/lib/utils"; import { t } from "i18next"; import { Link } from "react-router-dom"; -import { LoaderIcon } from "lucide-react"; +import { LoaderIcon, AudioLinesIcon } from "lucide-react"; export const RecordingActivities = (props: { from: string; to: string }) => { const { from, to } = props; @@ -102,7 +102,7 @@ const Activity = (props: { )}
{activity.targetType === "Audio" && ( - + )} {activity.targetType === "Audio" && ( diff --git a/enjoy/src/renderer/components/recordings/recording-calendar.tsx b/enjoy/src/renderer/components/recordings/recording-calendar.tsx index 2e375e57..d2a63a4c 100644 --- a/enjoy/src/renderer/components/recordings/recording-calendar.tsx +++ b/enjoy/src/renderer/components/recordings/recording-calendar.tsx @@ -4,7 +4,7 @@ import Calendar, { Skeleton, ThemeInput, } from "react-activity-calendar"; -import { AppSettingsProviderContext } from "@renderer/context"; +import { AppSettingsProviderContext, useTheme } from "@renderer/context"; import { ScrollArea, Button } from "@renderer/components/ui"; import i18next, { t } from "i18next"; import dayjs, { Dayjs } from "dayjs"; @@ -22,6 +22,7 @@ export const RecordingCalendar = (props: { onSelectRange?: (from: string, to: string) => void; }) => { const { onSelectRange } = props; + const { colorScheme } = useTheme(); dayjs.extend(localeData); dayjs.locale(i18next.resolvedLanguage?.toLowerCase() || "en"); @@ -135,6 +136,7 @@ export const RecordingCalendar = (props: { }), }} theme={DEFAULT_THEME} + colorScheme={colorScheme as 'light' | 'dark'} renderBlock={(block, activity) => React.cloneElement(block, { ...block.props, diff --git a/enjoy/src/renderer/components/sidebar.tsx b/enjoy/src/renderer/components/sidebar.tsx index f4209387..3e679978 100644 --- a/enjoy/src/renderer/components/sidebar.tsx +++ b/enjoy/src/renderer/components/sidebar.tsx @@ -19,7 +19,6 @@ import { import { useLocation, Link } from "react-router-dom"; import { t } from "i18next"; import { Preferences } from "@renderer/components"; -import { Tooltip } from "react-tooltip"; export const Sidebar = () => { const location = useLocation(); @@ -27,27 +26,28 @@ export const Sidebar = () => { return (
-
+
-
+
ENJOY
-
+
-
-
-

- {t("sidebar.library")} -

-
- +

+ {t("sidebar.library")} +

+
+ + - + + {t("sidebar.audios")} + + - + - + + {t("sidebar.videos")} + + - + - - {/* */} - {/* */} - {/* */} - {/* */} -
-
- -
-

- {t("sidebar.mine")} -

-
- - - - - - - - - - - - - - - - - -
+ + + {t("sidebar.stories")} + + +
- +
+

+ {t("sidebar.mine")} +

+
+ + + + + + + + + + + + + + + + + +
+
diff --git a/enjoy/src/renderer/components/videos/video-player.tsx b/enjoy/src/renderer/components/videos/video-player.tsx index e480df37..d1faf370 100644 --- a/enjoy/src/renderer/components/videos/video-player.tsx +++ b/enjoy/src/renderer/components/videos/video-player.tsx @@ -25,7 +25,7 @@ export const VideoPlayer = (props: { id?: string; md5?: string }) => { if (!layout) return ; return ( -
+
@@ -46,7 +46,7 @@ export const VideoPlayer = (props: { id?: string; md5?: string }) => {
-
+
diff --git a/enjoy/src/renderer/context/media-player-provider.tsx b/enjoy/src/renderer/context/media-player-provider.tsx index cb841200..bcc0b40e 100644 --- a/enjoy/src/renderer/context/media-player-provider.tsx +++ b/enjoy/src/renderer/context/media-player-provider.tsx @@ -14,7 +14,17 @@ import { Tooltip } from "react-tooltip"; import { debounce } from "lodash"; type MediaPlayerContextType = { - layout: { name: string, width: number, height: number, upperWrapper: string, lowerWrapper: string, playerWrapper: string, panelWrapper: string, playerHeight: number }; + layout: { + name: string; + width: number; + height: number; + wrapper: string; + upperWrapper: string; + lowerWrapper: string; + playerWrapper: string; + panelWrapper: string; + playerHeight: number; + }; media: AudioType | VideoType; setMedia: (media: AudioType | VideoType) => void; setMediaProvider: (mediaProvider: HTMLAudioElement | null) => void; @@ -72,22 +82,24 @@ export const MediaPlayerProviderContext = const LAYOUT = { sm: { - name: 'sm', - upperWrapper: "h-[calc(100vh-27.5rem)]", + name: "sm", + wrapper: "h-[calc(100vh-3.5rem)]", + upperWrapper: "h-[calc(100vh-27.5rem)] min-h-64", lowerWrapper: "h-[23rem]", playerWrapper: "h-[9rem] mb-2", - panelWrapper: "h-16", + panelWrapper: "h-16 w-full z-10 sticky bottom-0", playerHeight: 128, }, lg: { - name: 'lg', + name: "lg", + wrapper: "h-[calc(100vh-3.5rem)]", upperWrapper: "h-[calc(100vh-37.5rem)]", lowerWrapper: "h-[33rem]", - panelWrapper: "h-20", + panelWrapper: "h-20 w-full z-10 sticky bottom-0", playerWrapper: "h-[13rem] mb-4", playerHeight: 192, }, -} +}; export const MediaPlayerProvider = ({ children, @@ -97,7 +109,17 @@ export const MediaPlayerProvider = ({ const minPxPerSec = 150; const { EnjoyApp } = useContext(AppSettingsProviderContext); - const [layout, setLayout] = useState<{ name: string, width: number, height: number, upperWrapper: string, lowerWrapper: string, playerWrapper: string, panelWrapper: string, playerHeight: number }>(); + const [layout, setLayout] = useState<{ + name: string; + width: number; + height: number; + wrapper: string; + upperWrapper: string; + lowerWrapper: string; + playerWrapper: string; + panelWrapper: string; + playerHeight: number; + }>(); const [media, setMedia] = useState(null); const [mediaProvider, setMediaProvider] = useState( @@ -342,11 +364,19 @@ export const MediaPlayerProvider = ({ const calculateHeight = () => { if (window.innerHeight <= 1080) { - setLayout({ ...LAYOUT.sm, width: window.innerWidth, height: window.innerHeight }); + setLayout({ + ...LAYOUT.sm, + width: window.innerWidth, + height: window.innerHeight, + }); } else { - setLayout({ ...LAYOUT.lg, width: window.innerWidth, height: window.innerHeight }); + setLayout({ + ...LAYOUT.lg, + width: window.innerWidth, + height: window.innerHeight, + }); } - } + }; const deboundeCalculateHeight = debounce(calculateHeight, 100); @@ -471,7 +501,7 @@ export const MediaPlayerProvider = ({ if (wavesurfer) wavesurfer.destroy(); setDecoded(false); setDecodeError(null); - } + }; }, [media, ref, mediaProvider, layout?.playerHeight]); useEffect(() => { @@ -479,12 +509,12 @@ export const MediaPlayerProvider = ({ EnjoyApp.window.onResize((event, bounds) => { deboundeCalculateHeight(); - }) + }); return () => { EnjoyApp.window.removeListeners(); - } - }, []) + }; + }, []); return ( <> diff --git a/enjoy/src/renderer/context/theme-provider.tsx b/enjoy/src/renderer/context/theme-provider.tsx index 7b9eeb27..ebc2dcfa 100644 --- a/enjoy/src/renderer/context/theme-provider.tsx +++ b/enjoy/src/renderer/context/theme-provider.tsx @@ -10,6 +10,7 @@ type ThemeProviderProps = { type ThemeProviderState = { theme: Theme; + colorScheme?: Omit; setTheme: (theme: Theme) => void; }; @@ -29,6 +30,7 @@ export function ThemeProvider({ const [theme, setTheme] = useState( () => (localStorage.getItem(storageKey) as Theme) || defaultTheme ); + const [colorScheme, setColorScheme] = useState>(); useEffect(() => { const root = window.document.documentElement; @@ -42,14 +44,17 @@ export function ThemeProvider({ : "light"; root.classList.add(systemTheme); + setColorScheme(systemTheme); return; } + setColorScheme(theme); root.classList.add(theme); }, [theme]); const value = { theme, + colorScheme, setTheme: (theme: Theme) => { localStorage.setItem(storageKey, theme); setTheme(theme); diff --git a/enjoy/src/renderer/pages/community.tsx b/enjoy/src/renderer/pages/community.tsx index 31443d58..8b8cd051 100644 --- a/enjoy/src/renderer/pages/community.tsx +++ b/enjoy/src/renderer/pages/community.tsx @@ -14,7 +14,7 @@ export default () => { const navigate = useNavigate(); return ( -
+
-
+