Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
Something went wrong. Try again.
1.4 kB · 28 lines
TypeScript
1234567891011121314151617181920212223242526272829// Theme/viewport hooks for React islands (were @docusaurus/theme-common)import { useEffect, useState } from 'react';
const readTheme = () => typeof document !== 'undefined' && document.documentElement.dataset.theme === 'light' ? 'light' : 'dark';
/** Starlight sets <html data-theme="dark|light">; follow it live */export function useColorMode(): { colorMode: 'light' | 'dark' } { const [colorMode, setColorMode] = useState<'light' | 'dark'>(readTheme); useEffect(() => { const observer = new MutationObserver(() => setColorMode(readTheme())); observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] }); return () => observer.disconnect(); }, []); return { colorMode };}
/** Same contract as Docusaurus: 'desktop' at or above desktopBreakpoint, else 'mobile' ('ssr' before mount) */export function useWindowSize({ desktopBreakpoint = 996 }: { desktopBreakpoint?: number } = {}): 'desktop' | 'mobile' | 'ssr' { const get = () => (typeof window === 'undefined' ? 'ssr' : window.innerWidth >= desktopBreakpoint ? 'desktop' : 'mobile'); const [size, setSize] = useState<'desktop' | 'mobile' | 'ssr'>(get); useEffect(() => { const onResize = () => setSize(get()); window.addEventListener('resize', onResize); return () => window.removeEventListener('resize', onResize); }, [desktopBreakpoint]); return size;}