feat: clean navbar icons, floating theme bubble, auto theme on first visit

- Navbar: remove theme switcher, clean nav icons (no text labels),
  active state is accent dot underline + icon color — no pill bg
- useTheme: drop 'system' from stored type; first visit = auto
  by system preference, stays unset until user explicitly clicks
- ThemeBubble: fixed bottom-right pill with Sun/Moon icon + label,
  hover lift, click toggles light ↔ dark and persists to localStorage
- App.tsx: render ThemeBubble inside ThemeProvider

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 00:51:42 +03:00
parent 492bd1b4e1
commit ae01ebdeea
4 changed files with 80 additions and 60 deletions

View File

@@ -0,0 +1,31 @@
import { Sun, Moon } from 'lucide-react';
import { useTheme } from '@/hooks/useTheme';
export default function ThemeBubble() {
const { resolvedTheme, setTheme } = useTheme();
const isDark = resolvedTheme === 'dark';
return (
<button
onClick={() => setTheme(isDark ? 'light' : 'dark')}
title={isDark ? 'Светлая тема' : 'Тёмная тема'}
aria-label="Переключить тему"
className={[
'fixed bottom-5 right-5 z-40',
'flex items-center gap-2 h-10 px-3.5 rounded-full',
'border border-[var(--border)]',
'bg-[var(--surface)] shadow-[0_4px_20px_rgba(0,0,0,0.18)]',
'text-[var(--fg-secondary)] text-xs font-semibold',
'transition-all duration-200 ease-out',
'hover:shadow-[0_6px_24px_rgba(0,0,0,0.25)] hover:-translate-y-0.5',
'active:scale-95 active:translate-y-0',
'select-none cursor-pointer backdrop-blur-sm',
].join(' ')}
>
{isDark
? <><Sun className="h-4 w-4 text-amber-400" strokeWidth={1.8} /><span className="hidden sm:inline">Светлая</span></>
: <><Moon className="h-4 w-4 text-indigo-400" strokeWidth={1.8} /><span className="hidden sm:inline">Тёмная</span></>
}
</button>
);
}