From 1272c60a4d77757e38349fc2e3b42bdd9fb8e0fb Mon Sep 17 00:00:00 2001 From: sethburkart123 Date: Fri, 13 Sep 2024 16:01:48 +1000 Subject: [PATCH] feat(Store): added store page --- src/SEQTA.ts | 39 ++++++++ src/css/injected.scss | 53 +++++++++++ src/seqta/ui/renderStore.ts | 20 +++++ .../components/SkeletonLoader.svelte | 5 ++ .../components/store/CoverSwiper.svelte | 48 ++++++++++ .../components/store/ThemeCard.svelte | 19 ++++ .../components/store/ThemeGrid.svelte | 40 +++++++++ .../components/store/ThemeModal.svelte | 45 ++++++++++ .../components/themes/ThemeSelector.svelte | 10 +-- src/svelte-interface/index.css | 13 +++ src/svelte-interface/main.ts | 3 +- src/svelte-interface/pages/settings.svelte | 2 +- src/svelte-interface/pages/store.svelte | 89 +++++++++++++++++++ src/svelte-interface/types/Theme.ts | 7 ++ 14 files changed, 385 insertions(+), 8 deletions(-) create mode 100644 src/seqta/ui/renderStore.ts create mode 100644 src/svelte-interface/components/SkeletonLoader.svelte create mode 100644 src/svelte-interface/components/store/CoverSwiper.svelte create mode 100644 src/svelte-interface/components/store/ThemeCard.svelte create mode 100644 src/svelte-interface/components/store/ThemeGrid.svelte create mode 100644 src/svelte-interface/components/store/ThemeModal.svelte create mode 100644 src/svelte-interface/pages/store.svelte create mode 100644 src/svelte-interface/types/Theme.ts diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 1e073587..0f964734 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -37,6 +37,7 @@ import injectedCSS from '@/css/injected.scss?inline' 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' let SettingsClicked = false export let MenuOptionsOpen = false @@ -343,6 +344,44 @@ export function OpenWhatsNewPopup() { }) } +export function OpenStorePage() { + const remove = renderStore() + /* export function renderStore() { + const container = document.querySelector('#container'); + if (!container) { + throw new Error('Container not found'); + } + + const child = document.createElement('div'); + child.id = 'store'; + container!.appendChild(child); + + const shadow = child.attachShadow({ mode: 'open' }); + const app = renderSvelte(Store, shadow); + + return () => unmount(app) +} + */ + + // add a close button to the page + const closeButton = document.createElement('button') + closeButton.id = 'storeclosebutton' + closeButton.classList.add('closeButton') + closeButton.innerHTML = 'Close' + document.body.appendChild(closeButton) + + closeButton.addEventListener('click', () => { + closeButton.classList.add('hide') + document.getElementById('store')!.classList.add('hide') + + setTimeout(() => { + remove() + document.body.removeChild(closeButton) + document.getElementById('store')!.remove() + }, 500) + }) +} + export function OpenAboutPage() { const background = document.createElement('div') background.id = 'whatsnewbk' diff --git a/src/css/injected.scss b/src/css/injected.scss index 7ab86545..1b9bc801 100644 --- a/src/css/injected.scss +++ b/src/css/injected.scss @@ -62,6 +62,58 @@ html { } } +#store { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + z-index: 9998; + animation: fadeIn 500ms forwards; + animation-delay: 200ms; + opacity: 0; + + &.hide { + animation: fadeOut 500ms forwards; + } +} +#storeclosebutton { + position: absolute; + top: 10px; + right: 10px; + z-index: 9999; + animation: fadeIn 500ms forwards; + animation-delay: 200ms; + opacity: 0; + + &.hide { + animation: fadeOut 500ms forwards; + pointer-events: none; + } +} + +.dark #storeclosebutton { + color: white; +} + +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + .dark .resizeBar { background-color: rgb(28 28 30); } @@ -2532,6 +2584,7 @@ li.MessageList__unread___3imtO { position: absolute; display: none; } + /* Show the checkmark when checked */ .upcoming-checkbox-container input:checked ~ .upcoming-checkmark:after { display: block; diff --git a/src/seqta/ui/renderStore.ts b/src/seqta/ui/renderStore.ts new file mode 100644 index 00000000..7842ac50 --- /dev/null +++ b/src/seqta/ui/renderStore.ts @@ -0,0 +1,20 @@ +import renderSvelte from '@/svelte-interface/main'; +import Store from '@/svelte-interface/pages/store.svelte' + +import { unmount } from 'svelte' + +export function renderStore() { + const container = document.querySelector('#container'); + if (!container) { + throw new Error('Container not found'); + } + + const child = document.createElement('div'); + child.id = 'store'; + container!.appendChild(child); + + const shadow = child.attachShadow({ mode: 'open' }); + const app = renderSvelte(Store, shadow); + + return () => unmount(app) +} diff --git a/src/svelte-interface/components/SkeletonLoader.svelte b/src/svelte-interface/components/SkeletonLoader.svelte new file mode 100644 index 00000000..17e23ade --- /dev/null +++ b/src/svelte-interface/components/SkeletonLoader.svelte @@ -0,0 +1,5 @@ + + +
diff --git a/src/svelte-interface/components/store/CoverSwiper.svelte b/src/svelte-interface/components/store/CoverSwiper.svelte new file mode 100644 index 00000000..4d4b2a88 --- /dev/null +++ b/src/svelte-interface/components/store/CoverSwiper.svelte @@ -0,0 +1,48 @@ + + +{#if coverThemes.length > 0} +
+ + {#each coverThemes as theme, index (index)} + + Theme Preview +
+

{theme.name}

+

{theme.description}

+
+
+
+ {/each} +
+ + +
+ + +
+
+{/if} diff --git a/src/svelte-interface/components/store/ThemeCard.svelte b/src/svelte-interface/components/store/ThemeCard.svelte new file mode 100644 index 00000000..a03778af --- /dev/null +++ b/src/svelte-interface/components/store/ThemeCard.svelte @@ -0,0 +1,19 @@ + + +
+
+
+ {theme.name} +
+
+
+ Theme Preview +
+
+
diff --git a/src/svelte-interface/components/store/ThemeGrid.svelte b/src/svelte-interface/components/store/ThemeGrid.svelte new file mode 100644 index 00000000..a98e5030 --- /dev/null +++ b/src/svelte-interface/components/store/ThemeGrid.svelte @@ -0,0 +1,40 @@ + + +
+ {#each filteredThemes as theme (theme.id)} + displayTheme = theme} /> + {/each} + + + +
+
{'\uecb3'}
+
+ Got a Theme Idea? +

Transform it into a stunning theme!

+
+
+
+ + {#if filteredThemes.length === 0} +
+

That doesn't exist! 😭😭😭

+

Sorry, we couldn't find the theme you're looking for. Maybe... you could create it?

+
+ {/if} +
+ +{#if displayTheme} + displayTheme = null} onInstall={() => {}} onRemove={() => {}} /> +{/if} diff --git a/src/svelte-interface/components/store/ThemeModal.svelte b/src/svelte-interface/components/store/ThemeModal.svelte new file mode 100644 index 00000000..8350ca94 --- /dev/null +++ b/src/svelte-interface/components/store/ThemeModal.svelte @@ -0,0 +1,45 @@ + + +
+
+
+ +

+ {theme.name} +

+ Theme Cover +

+ {theme.description} +

+ {#if currentThemes.includes(theme.id)} + + {:else} + + {/if} +
+
+
diff --git a/src/svelte-interface/components/themes/ThemeSelector.svelte b/src/svelte-interface/components/themes/ThemeSelector.svelte index c72a9f7f..6e86ec1a 100644 --- a/src/svelte-interface/components/themes/ThemeSelector.svelte +++ b/src/svelte-interface/components/themes/ThemeSelector.svelte @@ -8,6 +8,7 @@ import { disableTheme } from '@/seqta/ui/themes/disableTheme' import { setTheme } from '@/seqta/ui/themes/setTheme' import { deleteTheme } from '@/seqta/ui/themes/deleteTheme' + import { OpenStorePage } from '@/SEQTA' let themes = $state(null); let { isEditMode } = $props<{ isEditMode: boolean }>(); @@ -183,17 +184,16 @@
{/if} - OpenStorePage()} class="flex items-center justify-center w-full transition aspect-theme rounded-xl bg-zinc-100 dark:bg-zinc-900 dark:text-white" > Theme Store - + + diff --git a/src/svelte-interface/pages/store.svelte b/src/svelte-interface/pages/store.svelte new file mode 100644 index 00000000..9cf0167e --- /dev/null +++ b/src/svelte-interface/pages/store.svelte @@ -0,0 +1,89 @@ + + +
+
+ + +
+ +
+ + + {#if loading} +
+ +
+ {:else} + + {#if searchTerm === ''} + + {/if} + + + + + {#if filteredThemes.length === 0 && !loading} +
+

No results! 😭

+

Sorry, no themes match your search. Maybe create one?

+
+ {/if} + + {/if} +
+
\ No newline at end of file diff --git a/src/svelte-interface/types/Theme.ts b/src/svelte-interface/types/Theme.ts new file mode 100644 index 00000000..8ebe4b51 --- /dev/null +++ b/src/svelte-interface/types/Theme.ts @@ -0,0 +1,7 @@ +export type Theme = { + name: string; + description: string; + coverImage: string; + marqueeImage: string; + id: string; +}; \ No newline at end of file