From a0082dc8955d530f0cc210120b503ac7e8c51aa5 Mon Sep 17 00:00:00 2001 From: sethburkart123 Date: Thu, 19 Sep 2024 16:21:31 +1000 Subject: [PATCH] feat: Add settings popup close trigger to improve user experience --- src/SEQTA.ts | 22 ++++++++--- src/css/injected/popup.scss | 1 + .../components/ColourPicker.svelte | 4 +- src/svelte-interface/hooks/SettingsPopup.ts | 37 +++++++++++++++++++ src/svelte-interface/pages/settings.svelte | 6 +++ 5 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 src/svelte-interface/hooks/SettingsPopup.ts diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 72a4fe96..ce5f3f0a 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -38,6 +38,7 @@ import documentLoadCSS from '@/css/documentload.scss?inline' import renderSvelte from '@/svelte-interface/main' import Settings from '@/svelte-interface/pages/settings.svelte' import { renderStore } from './seqta/ui/renderStore' +import { settingsPopup } from './svelte-interface/hooks/SettingsPopup' let SettingsClicked = false export let MenuOptionsOpen = false @@ -1095,7 +1096,8 @@ export function addExtensionSettings() { extensionPopup.style.opacity = '0' extensionPopup.style.transform = 'scale(0)' } - // tell it popup closed + + settingsPopup.triggerClose() SettingsClicked = false } @@ -1336,7 +1338,7 @@ export function setupSettingsButton() { var AddedSettings = document.getElementById('AddedSettings'); var extensionPopup = document.getElementById('ExtensionPopup'); - AddedSettings!.addEventListener('click', function () { + AddedSettings!.addEventListener('click', async function () { if (SettingsClicked) { extensionPopup!.classList.add('hide'); if (settingsState.animations) { @@ -1345,12 +1347,22 @@ export function setupSettingsButton() { extensionPopup!.style.opacity = '0' extensionPopup!.style.transform = 'scale(0)' } - /* (document.getElementById('ExtensionIframe')! as HTMLIFrameElement).contentWindow!.postMessage('popupClosed', '*'); */ + settingsPopup.triggerClose() SettingsClicked = false; } else { - extensionPopup!.classList.remove('hide'); if (settingsState.animations) { - animate('#ExtensionPopup', { opacity: [0, 1], scale: [0, 1] }, { easing: spring({ stiffness: 260, damping: 24 }) }); + //animate('#ExtensionPopup', { opacity: [0, 1], scale: [0, 1] }, { easing: spring({ stiffness: 260, damping: 24 }) }); + animate((progress) => { + console.log(progress) + extensionPopup!.style.opacity = progress.toString() + extensionPopup!.style.transform = `scale(${progress})` + }, { easing: spring({ stiffness: 260, damping: 24 }) }); + + await delay(10) + + extensionPopup!.classList.remove('hide'); + //extensionPopup!.style.opacity = '1' + //extensionPopup!.style.transform = 'scale(1)' } else { extensionPopup!.style.opacity = '1' extensionPopup!.style.transform = 'scale(1)' diff --git a/src/css/injected/popup.scss b/src/css/injected/popup.scss index f2ae0ef5..2f040bfe 100644 --- a/src/css/injected/popup.scss +++ b/src/css/injected/popup.scss @@ -36,4 +36,5 @@ transform-origin: 70% 0; will-change: opacity, transform; transform: translateZ(0); // promotes GPU rendering + transition: opacity 0.05s, transform 0.05s; } \ No newline at end of file diff --git a/src/svelte-interface/components/ColourPicker.svelte b/src/svelte-interface/components/ColourPicker.svelte index 28118304..713f2be7 100644 --- a/src/svelte-interface/components/ColourPicker.svelte +++ b/src/svelte-interface/components/ColourPicker.svelte @@ -60,13 +60,13 @@
{ e.key === 'Enter' && handleBackgroundClick }} >
diff --git a/src/svelte-interface/hooks/SettingsPopup.ts b/src/svelte-interface/hooks/SettingsPopup.ts new file mode 100644 index 00000000..cb2b5463 --- /dev/null +++ b/src/svelte-interface/hooks/SettingsPopup.ts @@ -0,0 +1,37 @@ +type SettingsPopupCallback = () => void; + +/** + * This is a singleton that triggers an update when the settings popup is closed. + * This is used to close the colour picker. + * Usage: + * settingsPopup.addListener(() => { + * console.log('Settings popup closed'); + * }); +*/ +class SettingsPopup { + private static instance: SettingsPopup; + private listeners: Set = new Set(); + + private constructor() {} + + public static getInstance(): SettingsPopup { + if (!SettingsPopup.instance) { + SettingsPopup.instance = new SettingsPopup(); + } + return SettingsPopup.instance; + } + + public addListener(callback: SettingsPopupCallback): void { + this.listeners.add(callback); + } + + public removeListener(callback: SettingsPopupCallback): void { + this.listeners.delete(callback); + } + + public triggerClose(): void { + this.listeners.forEach(callback => callback()); + } +} + +export const settingsPopup = SettingsPopup.getInstance(); diff --git a/src/svelte-interface/pages/settings.svelte b/src/svelte-interface/pages/settings.svelte index 8763cf22..061a6d49 100644 --- a/src/svelte-interface/pages/settings.svelte +++ b/src/svelte-interface/pages/settings.svelte @@ -11,6 +11,7 @@ import { closeSettings, OpenAboutPage, OpenWhatsNewPopup } from "@/SEQTA" import ColourPicker from '../components/ColourPicker.svelte' + import { settingsPopup } from '../hooks/SettingsPopup' const openColourPicker = () => { @@ -31,10 +32,15 @@ let showColourPicker = $state(false); onMount(() => { + settingsPopup.addListener(() => { + showColourPicker = false; + }); + if (!standalone) return; // @ts-ignore let globalStandalone = createStandalone(); globalStandalone = standalone; + });