@ -1,25 +1,8 @@
export function toggleTheme() {
document . documentElement . classList . toggle ( 'dark' ) ;
document . documentElement . classList . toggle ( 'light' ) ;
localStorage . setItem ( 'theme' , document . documentElement . classList . contains ( 'dark' ) ? "dark" : "light" ) ;
}
export class ThemeManager {
export function loadTheme() {
const theme = localStorage . getItem ( "theme" ) ;
if ( theme == "dark" ) {
document . documentElement . classList . add ( 'dark' ) ;
document . documentElement . classList . remove ( 'light' ) ;
} else if ( theme == "light" ) {
document . documentElement . classList . add ( 'light' ) ;
document . documentElement . classList . remove ( 'dark' ) ;
} else if ( window . matchMedia ( '(prefers-color-scheme: dark)' ) . media !== 'not all' ) {
document . documentElement . classList . add ( 'dark' ) ;
document . documentElement . classList . remove ( 'light' ) ;
}
}
private _themeButton : HTMLElement = null ;
export class nightwind {
beforeTransition = ( ) = > {
private _beforeTransition = ( ) = > {
const doc = document . documentElement ;
const onTransitionDone = ( ) = > {
doc . classList . remove ( 'nightwind' ) ;
@ -30,19 +13,53 @@ export class nightwind {
doc . classList . add ( 'nightwind' ) ;
}
} ;
constructor ( ) {
private _updateThemeIcon = ( ) = > {
const icon = this . _themeButton . childNodes [ 0 ] as HTMLElement ;
if ( document . documentElement . classList . contains ( "dark" ) ) {
icon . classList . add ( "ri-sun-line" ) ;
icon . classList . remove ( "ri-moon-line" ) ;
this . _themeButton . classList . add ( "~warning" ) ;
this . _themeButton . classList . remove ( "~neutral" ) ;
this . _themeButton . classList . remove ( "@high" ) ;
} else {
icon . classList . add ( "ri-moon-line" ) ;
icon . classList . remove ( "ri-sun-line" ) ;
this . _themeButton . classList . add ( "@high" ) ;
this . _themeButton . classList . add ( "~neutral" ) ;
this . _themeButton . classList . remove ( "~warning" ) ;
}
} ;
bindButton = ( button : HTMLElement ) = > {
this . _themeButton = button ;
this . _themeButton . onclick = this . toggle ;
this . _updateThemeIcon ( ) ;
}
toggle = ( ) = > {
this . _toggle ( ) ;
if ( this . _themeButton ) {
this . _updateThemeIcon ( ) ;
}
}
constructor ( button? : HTMLElement ) {
const theme = localStorage . getItem ( "theme" ) ;
if ( theme == "dark" ) {
this . enable ( true ) ;
this . _ enable( true ) ;
} else if ( theme == "light" ) {
this . enable ( false ) ;
this . _ enable( false ) ;
} else if ( window . matchMedia ( '(prefers-color-scheme: dark)' ) . media !== 'not all' ) {
this . enable ( true ) ;
this . _ enable( true ) ;
}
if ( arguments . length == 1 )
this . bindButton ( button ) ;
}
toggle = ( ) = > {
this . beforeTransition ( ) ;
private _ toggle = ( ) = > {
this . _ beforeTransition( ) ;
if ( ! document . documentElement . classList . contains ( 'dark' ) ) {
document . documentElement . classList . add ( 'dark' ) ;
} else {
@ -51,17 +68,24 @@ export class nightwind {
localStorage . setItem ( 'theme' , document . documentElement . classList . contains ( 'dark' ) ? "dark" : "light" ) ;
} ;
enable = ( dark : boolean ) = > {
private _ enable = ( dark : boolean ) = > {
const mode = dark ? "dark" : "light" ;
const opposite = dark ? "light" : "dark" ;
localStorage . setItem ( 'theme' , dark ? "dark" : "light" ) ;
this . beforeTransition( ) ;
this . _ beforeTransition( ) ;
if ( document . documentElement . classList . contains ( opposite ) ) {
document . documentElement . classList . remove ( opposite ) ;
}
document . documentElement . classList . add ( mode ) ;
} ;
enable = ( dark : boolean ) = > {
this . _enable ( dark ) ;
if ( this . _themeButton != null ) {
this . _updateThemeIcon ( ) ;
}
} ;
}