@sorens/artist-svelte
Version:
an opinionated and clean UI framework for SvelteKit with theme support built-in
41 lines (40 loc) • 1.89 kB
JavaScript
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;