Build and Deploy Verso / deploy (push) Successful in 14m45s
New theme with gradient document cards, serif title typography and a light airy palette. Set as the default for new users. Existing users keep their current theme; all users can switch via the theme toggle (new sparkle icon). Classic Dark / Classic Light are renamed accordingly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
65 lines
1.9 KiB
TypeScript
65 lines
1.9 KiB
TypeScript
import { useUserSettingsContext } from '@/shared/context/user-settings-context'
|
|
import { OverallTheme } from '@/shared/utils/styles'
|
|
import { isIEEEBranded } from '@/utils/is-ieee-branded'
|
|
import { useEffect, useMemo, useState } from 'react'
|
|
import { useSplitTestContext } from '../context/split-test-context'
|
|
|
|
export type ActiveOverallTheme = 'dark' | 'light'
|
|
|
|
function getTheme(
|
|
overallTheme: OverallTheme,
|
|
prefersDark: boolean
|
|
): ActiveOverallTheme {
|
|
if (isIEEEBranded()) {
|
|
return 'dark'
|
|
}
|
|
if (overallTheme === 'light-' || overallTheme === 'lumiere-') {
|
|
return 'light'
|
|
}
|
|
if (overallTheme === 'system') {
|
|
return prefersDark ? 'dark' : 'light'
|
|
}
|
|
return 'dark'
|
|
}
|
|
|
|
export const useActiveOverallTheme = (
|
|
featureFlag?: string
|
|
): ActiveOverallTheme => {
|
|
const { splitTestVariants } = useSplitTestContext()
|
|
const [browserPrefersDarkMode, setBrowserPrefersDarkMode] = useState(() =>
|
|
// If matchMedia is not supported, use the default (dark) theme
|
|
{
|
|
return (
|
|
window.matchMedia?.('(prefers-color-scheme: dark)')?.matches ?? true
|
|
)
|
|
}
|
|
)
|
|
const {
|
|
userSettings: { overallTheme },
|
|
} = useUserSettingsContext()
|
|
|
|
const activeOverallTheme = useMemo<ActiveOverallTheme>(() => {
|
|
// Override theme if feature flag is provided and not enabled
|
|
if (featureFlag && splitTestVariants[featureFlag] !== 'enabled') {
|
|
return 'light'
|
|
}
|
|
|
|
return getTheme(overallTheme, browserPrefersDarkMode)
|
|
}, [overallTheme, browserPrefersDarkMode, featureFlag, splitTestVariants])
|
|
|
|
useEffect(() => {
|
|
const mediaWatcher = window.matchMedia?.('(prefers-color-scheme: dark)')
|
|
if (!mediaWatcher) return
|
|
|
|
const listener = (e: MediaQueryListEvent) => {
|
|
setBrowserPrefersDarkMode(e.matches)
|
|
}
|
|
mediaWatcher.addEventListener('change', listener)
|
|
return () => {
|
|
mediaWatcher.removeEventListener('change', listener)
|
|
}
|
|
}, [])
|
|
|
|
return activeOverallTheme
|
|
}
|