Improve mobile app initialization and range widget corner indicator

This commit is contained in:
space-nuko
2023-05-07 16:10:44 -05:00
parent efb0010a0e
commit 6dd2627f2c
16 changed files with 230 additions and 70 deletions

View File

@@ -0,0 +1,48 @@
import { debounce } from '$lib/utils';
import { get, writable } from 'svelte/store';
import type { Readable, Writable } from 'svelte/store';
export type InterfaceState = {
// Show a large indicator of the currently editing number value for mobile
// use (sliders).
pointerNearTop: boolean,
pointerNearLeft: boolean,
showIndicator: boolean,
indicatorValue: any,
}
type InterfaceStateOps = {
showIndicator: (pointerX: number, pointerY: number, value: any) => void,
}
export type WritableInterfaceStateStore = Writable<InterfaceState> & InterfaceStateOps;
const store: Writable<InterfaceState> = writable(
{
pointerNearTop: false,
pointerNearLeft: false,
showIndicator: false,
indicatorValue: null,
})
const debounceDrag = debounce(() => { store.update(s => { s.showIndicator = false; return s }) }, 1000)
function showIndicator(pointerX: number, pointerY: number, value: any) {
if (!window)
return;
const state = get(store)
let middleWidth = window.innerWidth / 2;
let middleHeight = window.innerHeight / 2;
const pointerNearLeft = pointerX < middleWidth;
const pointerNearTop = pointerY < middleHeight;
store.update(s => { return { ...s, pointerNearTop, pointerNearLeft, showIndicator: true, indicatorValue: value } });
debounceDrag();
}
const interfaceStateStore: WritableInterfaceStateStore =
{
...store,
showIndicator
}
export default interfaceStateStore;