diff --git a/package.json b/package.json index eccac3fc..50087ce4 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,6 @@ "sortablejs": "^1.15.3", "svelte": "5.0.0-next.244", "svelte-hash-router": "^1.0.1", - "svelte-motion": "^0.12.2", "swiper": "latest", "tailwindcss": "^3.4.11", "ts-loader": "^9.5.1", 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/Button.svelte b/src/svelte-interface/components/Button.svelte index 22362c6d..97f07499 100644 --- a/src/svelte-interface/components/Button.svelte +++ b/src/svelte-interface/components/Button.svelte @@ -1,7 +1,7 @@ - \ No newline at end of file diff --git a/src/svelte-interface/components/MotionDiv.svelte b/src/svelte-interface/components/MotionDiv.svelte new file mode 100644 index 00000000..e8d4794b --- /dev/null +++ b/src/svelte-interface/components/MotionDiv.svelte @@ -0,0 +1,68 @@ + + +
+ {#if children} + {@render children()} + {/if} +
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/TabbedContainer.svelte b/src/svelte-interface/components/TabbedContainer.svelte index ca25dc5c..7dcc7e8a 100644 --- a/src/svelte-interface/components/TabbedContainer.svelte +++ b/src/svelte-interface/components/TabbedContainer.svelte @@ -1,11 +1,9 @@ + +{#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/settings/general.svelte b/src/svelte-interface/pages/settings/general.svelte index 33804f76..72781435 100644 --- a/src/svelte-interface/pages/settings/general.svelte +++ b/src/svelte-interface/pages/settings/general.svelte @@ -1,7 +1,7 @@ + +
+
+ + +
+ +
+ + + {#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