feat: светлая тема как основная + переключатель тем

- CSS-переменные --bg, --surface, --ink, --mute, --accent для обеих тем
- darkMode: 'class' в Tailwind config
- ThemeToggle компонент с Sun/Moon, сохраняет выбор в localStorage
- Inline-скрипт в layout.js защищает от FOUC (FlashOfUnstyledContent)
- Авто-определение по prefers-color-scheme как fallback
- not-found.js: красивая 404 страница вместо дефолтной Next
- Обновлены все компоненты и страницы — Header, Footer, ArticleCard, page.js, blog, tag, about
This commit is contained in:
Alexey Pavlov
2026-05-31 09:07:44 +03:00
parent d8d1affcc8
commit a16bf812e4
12 changed files with 231 additions and 75 deletions
+4 -4
View File
@@ -21,13 +21,13 @@ export default async function TagPage({ params }) {
<>
<Header />
<main className="container-wide pt-10 pb-16">
<Link href="/" className="btn-ghost text-sm mb-4 -ml-2">
<Link href="/" className="btn btn-ghost text-sm mb-4 -ml-2">
<ArrowLeft className="w-4 h-4" /> Все статьи
</Link>
<h1 className="text-3xl sm:text-4xl font-bold mb-2">#{tag}</h1>
<p className="text-mute mb-8">{articles.length} {articles.length === 1 ? 'материал' : 'материалов'}</p>
<h1 className="text-3xl sm:text-4xl font-bold mb-2 ink">#{tag}</h1>
<p className="mute mb-8">{articles.length} {articles.length === 1 ? 'материал' : 'материалов'}</p>
{articles.length === 0 ? (
<p className="text-mute">Пока пусто.</p>
<p className="mute">Пока пусто.</p>
) : (
<div className="grid sm:grid-cols-2 lg:grid-cols-3 gap-5">
{articles.map(a => <ArticleCard key={a.id} article={a} />)}