История изменений

Здесь я документирую все обновления и улучшения сайта.

Обновление 2026-06-28 04:42 GMT+5

ИсправлениеУлучшениеНовая функция

🎬 Контроль процедурных анимаций

Процедурные анимации (Змейка, Пауки) теперь не запускаются автоматически. Пользователь сам решает, хочет ли он их видеть — это экономит заряд батареи и ресурсы слабых устройств.

Что нового:

  • Новый компонент AnimationPlayer с предупреждением о нагрузке
  • Кнопки Play/Pause для контроля воспроизведения
  • Сохранение выбора в localStorage
  • Жёлтый индикатор «⚡ Высокая нагрузка» во время работы анимации

🛡️ Совместимость с мобильными устройствами

  • Безопасная обёртка safeSessionStorage с try-catch — сайт работает даже в режиме инкогнито
  • Исправлена ошибка SecurityError: Failed to read the 'sessionStorage'

⚡ Оптимизация React-кода

  • Убраны useEffect с синхронным setState в ProjectsClient — заменены на derived state
  • В ThemeSwitcher использован useSyncExternalStore вместо useEffect для безопасной гидратации
  • Все ошибки ESLint исправлены: 5 errors → 0

🎨 UI и стили

  • Адаптивная ширина main через clamp(70%, calc(...), 100%)
  • Высота 100dvh вместо 100% — корректно работает на мобильных браузерах
  • Новый утилитарный класс .lh-100
  • Меню переименовано: «Изменения» → «Обновления»

Обновление 2026-06-25 02:34 GMT+5

Новая функцияУлучшение

🚀 Новая страница Changelog

Добавлена страница «Изменения» (/updates) — история всех обновлений сайта. Теперь посетители могут отслеживать, как развивается портфолио.

Что реализовано:

  • Структура данных lib/updates.json с поддержкой локализации
  • Теги для категоризации: Новая функция, Исправление, Улучшение
  • Автоматическая сортировка по дате (новые сверху)
  • Форматирование даты на русском и английском языках
  • HTML-рендеринг контента обновлений

Эта страница сама по себе является первой записью в истории изменений — мета, но приятно.

Обновление 2026-06-11 11:15 GMT+5

УлучшениеНовая функция

🌐 Полная миграция на next-intl

Система переводов полностью переписана с использованием библиотеки next-intl — это стандарт индустрии для Next.js App Router.

Что изменилось:

  • Все тексты вынесены из projects.json в messages/ru.json и messages/en.json
  • Удалён хелпер getLocalizedString — теперь используются хуки useTranslations и getTranslations
  • Создан конфиг i18n/navigation.ts с defineRouting и createNavigation
  • Компоненты Link и usePathname из @/i18n/navigation автоматически работают с языковыми префиксами
  • Middleware теперь использует встроенный createMiddleware от next-intl
  • Исправлен порядок провайдеров: ThemeProvider обёртывает NextIntlClientProvider

Преимущества:

  • Типобезопасность переводов
  • Автоматическое определение языка по заголовку Accept-Language
  • Сохранение выбора языка в cookie
  • Легко добавить третий язык — просто создать messages/de.json

Обновление 2026-05-27 08:45 GMT+5

Улучшение

🎨 Рефакторинг UI-компонентов

Интерфейс разбит на независимые компоненты с сохранением состояния между переходами.

Новые компоненты:

  • ThemeSwitcher — кнопка смены темы с SVG-иконками солнца/луны и плавной анимацией поворота
  • LanguageSwitcher — переключатель языка с обновлением URL и cookie
  • MainMenu — вынесенное выдвижное меню с навигацией, соцсетями и переключателями

Исправлено поведение меню:

  • Меню больше не закрывается при смене языка (с /ru на /en)
  • Состояние меню сохраняется в sessionStorage и переживает перемонтирование layout
  • Меню корректно закрывается только при клике на ссылки навигации
  • Добавлен обработчик pageshow для сброса состояния при возврате через кнопку «Назад» в браузере (bfcache)

Дизайн:

  • SVG-иконки вместо эмодзи в переключателе темы
  • Hover-эффекты с масштабированием
  • Tooltip с названием текущей темы

Обновление 2026-05-17 16:23 GMT+5

ИсправлениеУлучшение

🐛 Исправление критических багов

Серия исправлений, обеспечивающих стабильную работу сайта.

SEO и метаданные:

  • Исправлены литералы {lang} и {slug} в canonical URL — теперь используются шаблонные строки ${lang} и ${slug}
  • Добавлены корректные hreflang-ссылки для всех языковых версий
  • Исправлены одинаковые URL в alternates для разных языков

Архитектура:

  • Разделён lib/projects.ts на клиентскую часть (типы и утилиты) и серверную lib/projects-server.ts (работа с fs)
  • Исправлена ошибка Module not found: Can't resolve 'fs' в клиентских компонентах
  • Добавлены подкатегории для категории «Сайты» в projects.json: Услуги, Промышленность, Магазины, Мебель, Образование, Авто, Бизнес, Бани

Навигация:

  • Исправлено сравнение активного пункта меню — теперь учитывается языковой префикс в URL
  • Добавлено определение языка браузера через заголовок Accept-Language в middleware
  • Реализовано сохранение выбранного языка в cookie на 1 год

Локализация данных:

  • Интерфейс Project теперь поддерживает city?: string | LocalizedString
  • В ProjectCard добавлена локализация поля city через getLocalizedString