UNPKG

@sorens/artist-svelte

Version:

an opinionated and clean UI framework for SvelteKit with theme support built-in

41 lines (40 loc) 1.89 kB
import { browser } from '$app/env'; import { readable } from 'svelte/store'; import Debounce from '../../helper/debounce'; const multiplyObjectValues = (obj) => Object.values(obj).reduce((a, b) => a * b); const determineScaleFromEdge = (oldDimensions, newDimensions) => { switch (true) { case oldDimensions.height === newDimensions.height && oldDimensions.width !== newDimensions.width: return 'horizontal'; case oldDimensions.height !== newDimensions.height && oldDimensions.width === newDimensions.width: return 'vertical'; case oldDimensions.height !== newDimensions.height && oldDimensions.width !== newDimensions.width: return 'both'; default: return undefined; } }; const currentWindowSize = () => browser ? { width: window.innerWidth, height: window.innerHeight } : undefined; export const store = readable(currentWindowSize(), (set) => { let windowDimensions = currentWindowSize(); /* istanbul ignore next */ const setWindowDimensions = Debounce(() => { const currentWindowDimensions = currentWindowSize(); const scaleDirection = multiplyObjectValues(windowDimensions) > multiplyObjectValues(currentWindowDimensions) ? 'down' : 'up'; const scaleFromEdge = determineScaleFromEdge(windowDimensions, currentWindowDimensions); if (Math.abs(multiplyObjectValues(windowDimensions) - multiplyObjectValues(currentWindowDimensions)) > 1) windowDimensions = currentWindowDimensions; set({ ...currentWindowDimensions, scaleDirection, scaleFromEdge }); }, 100); browser && window.addEventListener('resize', setWindowDimensions); return () => { if (browser) window.removeEventListener('resize', setWindowDimensions); }; }); export default store;