From e96d58923682087907b3db5b5f40d3b9384f44ac Mon Sep 17 00:00:00 2001 From: StanisLove Date: Thu, 6 Nov 2025 00:21:32 +0300 Subject: [PATCH] feat: add theme listener --- src/app/(frontend)/layout.tsx | 2 ++ src/app/(frontend)/page.tsx | 38 ++++++++++----------- src/shared/hooks/theme-message-listener.tsx | 24 +++++++++++++ 3 files changed, 45 insertions(+), 19 deletions(-) create mode 100644 src/shared/hooks/theme-message-listener.tsx diff --git a/src/app/(frontend)/layout.tsx b/src/app/(frontend)/layout.tsx index 98f3478..fa5d047 100644 --- a/src/app/(frontend)/layout.tsx +++ b/src/app/(frontend)/layout.tsx @@ -2,6 +2,7 @@ import type { Metadata } from "next"; import { Roboto_Flex } from "next/font/google"; import "./globals.css"; import { ThemeProvider } from "@/shared/hooks/theme-provider"; +import { ThemeMessageListener } from "@/shared/hooks/theme-message-listener"; const robotoFlex = Roboto_Flex({ variable: "--font-roboto-flex", @@ -28,6 +29,7 @@ export default function RootLayout({ enableSystem disableTransitionOnChange > + {children} diff --git a/src/app/(frontend)/page.tsx b/src/app/(frontend)/page.tsx index e97fd21..275318f 100644 --- a/src/app/(frontend)/page.tsx +++ b/src/app/(frontend)/page.tsx @@ -5,19 +5,19 @@ import { Server, Code } from "lucide-react"; export default function Home() { return ( -
-
+
+
Tungulov.space @@ -26,18 +26,18 @@ export default function Home() { initial={{ opacity: 0, y: 5 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.5, delay: 0.2, ease: "easeOut" }} - className="text-lg sm:text-xl md:text-2xl text-muted-foreground font-medium wrap-break-word" + className="text-base sm:text-lg md:text-xl lg:text-2xl text-muted-foreground font-medium wrap-break-word px-2" > Избавляем вас от головной боли разработки -
+
-
+
-
- +
+ Давайте приступим к воплощению вашей идеи @@ -103,10 +103,10 @@ export default function Home() { transition={{ duration: 0.5, delay: 0.5, ease: "easeOut" }} className="text-center space-y-1" > -

+

Напишите о вашем проекте

-

+

и уже через пару мгновений протестируйте демо

@@ -123,10 +123,10 @@ export default function Home() { delay: 0.5, }} whileHover={{ scale: 1.15, rotate: -5 }} - className="text-foreground/60 hover:text-foreground cursor-pointer transition-colors duration-300" + className="text-foreground/60 hover:text-foreground cursor-pointer transition-colors duration-300 hidden sm:block" > diff --git a/src/shared/hooks/theme-message-listener.tsx b/src/shared/hooks/theme-message-listener.tsx new file mode 100644 index 0000000..61509d8 --- /dev/null +++ b/src/shared/hooks/theme-message-listener.tsx @@ -0,0 +1,24 @@ +"use client"; + +import { useEffect } from "react"; +import { useTheme } from "next-themes"; + +export function ThemeMessageListener() { + const { setTheme } = useTheme(); + + useEffect(() => { + const handleMessage = (event: MessageEvent) => { + // Проверяем, что это сообщение о смене темы + if (event.data.type === "theme-change") { + const newTheme = event.data.theme; // "light" или "dark" + setTheme(newTheme); + } + }; + + window.addEventListener("message", handleMessage); + return () => window.removeEventListener("message", handleMessage); + }, [setTheme]); + + // Этот компонент ничего не рендерит + return null; +}