Компоненты/Анимированные иконки темы

Анимированные иконки темы

29 сентября 2026

Пять анимированных SVG-переключателей светлой и тёмной темы: полумесяц, солнце с лучами, точки, лампочка и затмение.

Установка

npm install clsx motion tailwind-merge
pnpm add clsx motion tailwind-merge
yarn add clsx motion tailwind-merge
bun add clsx motion tailwind-merge

Файлы

theme-toggles.tsx
НазадСтопка чиповДалееТулбар с перетекающей подсказкой

Пять анимированных SVG-кнопок для переключения светлой и тёмной темы: половинка круга, солнце с лучами, солнце из точек, лампочка и затмение. При нажатии каждая плавно перерисовывается: лучи прячутся, полумесяц наплывает на диск, нить лампочки гаснет, а фон кнопки меняется с белого на чёрный.

Масштаб, отступ и расположение кнопок в строку или столбец меняются в панели «Настройка».

Вручную

Скопируйте эти файлы в components/theme-toggles/:

Общие помощники положите в lib/ проекта:

Проверьте алиас путей. Импорты в коде выше записаны как @/components/... и @/lib/.... Нужен алиас "@/*" на папку, где лежат components/ и lib/, в tsconfig.json — или поправьте импорты под свои пути.

Использование

import { ThemeToggleButton2 } from "@/components/theme-toggles/theme-toggles";

export default function Page() {
return <ThemeToggleButton2 className="size-12 p-2" onToggle={(dark) => document.documentElement.classList.toggle("dark", dark)} />;
}

Пропсы

Пропс
Описание
className?

Классы кнопки, например размер и внутренний отступ

Тип string·По умолчанию ""

defaultDark?

Начальное состояние: тёмная тема

Тип boolean·По умолчанию false

onToggle?

Вызывается при каждом переключении с новым состоянием

Тип (dark: boolean) => void

style?

Инлайн-стили кнопки, например точный размер

Тип CSSProperties