Files
cinny/src/app/pages/ThemeManager.tsx
T

77 lines
2.8 KiB
TypeScript
Raw Normal View History

import React, { ReactNode, useEffect } from 'react';
import { configClass, varsClass } from 'folds';
import {
DarkTheme,
LightTheme,
LotusTerminalLightTheme,
LotusTerminalTheme,
ThemeContextProvider,
ThemeKind,
useActiveTheme,
useSystemThemeKind,
} from '../hooks/useTheme';
import { lotusTerminalBodyClass } from '../../lotus-terminal.css';
2025-08-25 18:49:14 +05:30
import { useSetting } from '../state/hooks/settings';
import { settingsAtom } from '../state/settings';
2026-05-13 22:36:48 -04:00
import { runLotusBootSequence } from '../../lotus-boot';
export function UnAuthRouteThemeManager() {
const systemThemeKind = useSystemThemeKind();
2026-05-13 22:36:48 -04:00
const [lotusTerminal] = useSetting(settingsAtom, 'lotusTerminal');
useEffect(() => {
document.body.className = '';
document.body.classList.add(configClass, varsClass);
2026-05-13 22:36:48 -04:00
if (lotusTerminal) {
const isLight = systemThemeKind === ThemeKind.Light;
document.documentElement.setAttribute('data-theme', isLight ? 'light' : 'dark');
document.body.classList.add(...(isLight ? LotusTerminalLightTheme : LotusTerminalTheme).classNames);
2026-05-13 22:36:48 -04:00
document.body.classList.add(lotusTerminalBodyClass);
} else {
document.documentElement.removeAttribute('data-theme');
if (systemThemeKind === ThemeKind.Dark) {
document.body.classList.add(...DarkTheme.classNames);
} else {
document.body.classList.add(...LightTheme.classNames);
}
}
2026-05-13 22:36:48 -04:00
}, [systemThemeKind, lotusTerminal]);
return null;
}
export function AuthRouteThemeManager({ children }: { children: ReactNode }) {
const activeTheme = useActiveTheme();
2025-08-25 18:49:14 +05:30
const [monochromeMode] = useSetting(settingsAtom, 'monochromeMode');
const [lotusTerminal] = useSetting(settingsAtom, 'lotusTerminal');
const terminalIsLight = lotusTerminal && activeTheme.kind === ThemeKind.Light;
const effectiveTheme = lotusTerminal
? (terminalIsLight ? LotusTerminalLightTheme : LotusTerminalTheme)
: activeTheme;
// Boot animation only fires when lotusTerminal is toggled on, not on every theme change
useEffect(() => {
if (lotusTerminal) runLotusBootSequence();
}, [lotusTerminal]);
useEffect(() => {
document.body.className = '';
document.body.classList.add(configClass, varsClass);
document.body.classList.add(...effectiveTheme.classNames);
if (lotusTerminal) {
document.documentElement.setAttribute('data-theme', terminalIsLight ? 'light' : 'dark');
document.body.classList.add(lotusTerminalBodyClass);
} else {
document.documentElement.removeAttribute('data-theme');
}
if (monochromeMode && !lotusTerminal) {
2025-08-25 18:49:14 +05:30
document.body.style.filter = 'grayscale(1)';
} else {
document.body.style.filter = '';
}
}, [effectiveTheme, monochromeMode, lotusTerminal, terminalIsLight]);
return <ThemeContextProvider value={effectiveTheme}>{children}</ThemeContextProvider>;
}