From 9e12a7721be62b8e58507afbf9af8ded0244eed4 Mon Sep 17 00:00:00 2001 From: Kirko Date: Sat, 25 Apr 2026 13:19:23 +0300 Subject: [PATCH] feat: /settings page, move theme picker out of Header dropdown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create dedicated /settings page with Внешний вид section (accent color presets). Header dropdown now has a Settings link + Logout button only. Co-Authored-By: Claude Sonnet 4.6 --- apps/web/src/app/settings/page.tsx | 59 ++++++++++++++++++++++++++++++ apps/web/src/components/Header.tsx | 42 +++++++-------------- 2 files changed, 72 insertions(+), 29 deletions(-) create mode 100644 apps/web/src/app/settings/page.tsx diff --git a/apps/web/src/app/settings/page.tsx b/apps/web/src/app/settings/page.tsx new file mode 100644 index 0000000..8135059 --- /dev/null +++ b/apps/web/src/app/settings/page.tsx @@ -0,0 +1,59 @@ +'use client' + +import { useRouter } from 'next/navigation' +import { useEffect } from 'react' +import { useAuthStore } from '@/store/authStore' +import { useThemeStore, ACCENT_PRESETS } from '@/store/themeStore' +import Header from '@/components/Header' + +export default function SettingsPage() { + const { user } = useAuthStore() + const { accentIdx, setAccent } = useThemeStore() + const router = useRouter() + + useEffect(() => { + if (!user) router.replace('/login') + }, [user, router]) + + if (!user) return null + + return ( +
+
+ +
+

Настройки

+ + {/* Appearance */} +
+

+ Внешний вид +

+

Акцентный цвет

+
+ {ACCENT_PRESETS.map((preset, i) => ( + + ))} +
+
+
+
+ ) +} diff --git a/apps/web/src/components/Header.tsx b/apps/web/src/components/Header.tsx index eb6cb8a..cd5a4fc 100644 --- a/apps/web/src/components/Header.tsx +++ b/apps/web/src/components/Header.tsx @@ -4,11 +4,9 @@ import Link from 'next/link' import { usePathname, useRouter } from 'next/navigation' import { useRef, useState, useEffect } from 'react' import { useAuthStore } from '@/store/authStore' -import { useThemeStore, ACCENT_PRESETS } from '@/store/themeStore' export default function Header() { const { user, clearAuth } = useAuthStore() - const { accentIdx, setAccent } = useThemeStore() const router = useRouter() const pathname = usePathname() const [open, setOpen] = useState(false) @@ -111,34 +109,20 @@ export default function Header() { className="absolute right-0 top-full mt-1.5 w-52 bg-surface border border-white/[0.09] rounded-xl shadow-xl z-50 py-1 overflow-hidden" style={{ boxShadow: '0 8px 32px rgba(0,0,0,0.5)' }} > - {/* Theme section */} -
-

- Цвет темы -

-
- {ACCENT_PRESETS.map((preset, i) => ( - - ))} -
-
+ {/* Settings link */} + setOpen(false)} + className="flex items-center gap-2.5 px-3 py-2 text-[13px] font-medium text-app-text hover:bg-white/[0.04] transition-all duration-150" + > + + + + + Настройки + -
+
{/* Logout */}