feat: refactor splash screen component (#5833)
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -78,3 +78,6 @@ storybook-static
|
|||||||
|
|
||||||
# frontend robots.txt
|
# frontend robots.txt
|
||||||
apps/frontend/src/public/robots.txt
|
apps/frontend/src/public/robots.txt
|
||||||
|
|
||||||
|
# Oh My Code
|
||||||
|
.omc/
|
||||||
|
|||||||
@@ -18,13 +18,10 @@ import {
|
|||||||
LibraryIcon,
|
LibraryIcon,
|
||||||
LogInIcon,
|
LogInIcon,
|
||||||
LogOutIcon,
|
LogOutIcon,
|
||||||
MaximizeIcon,
|
|
||||||
MinimizeIcon,
|
|
||||||
NewspaperIcon,
|
NewspaperIcon,
|
||||||
NotepadTextIcon,
|
NotepadTextIcon,
|
||||||
PlusIcon,
|
PlusIcon,
|
||||||
RefreshCwIcon,
|
RefreshCwIcon,
|
||||||
RestoreIcon,
|
|
||||||
RightArrowIcon,
|
RightArrowIcon,
|
||||||
ServerStackIcon,
|
ServerStackIcon,
|
||||||
SettingsIcon,
|
SettingsIcon,
|
||||||
@@ -35,7 +32,6 @@ import {
|
|||||||
import {
|
import {
|
||||||
Admonition,
|
Admonition,
|
||||||
Avatar,
|
Avatar,
|
||||||
Button,
|
|
||||||
ButtonStyled,
|
ButtonStyled,
|
||||||
commonMessages,
|
commonMessages,
|
||||||
ContentInstallModal,
|
ContentInstallModal,
|
||||||
@@ -87,6 +83,7 @@ import PromotionWrapper from '@/components/ui/PromotionWrapper.vue'
|
|||||||
import QuickInstanceSwitcher from '@/components/ui/QuickInstanceSwitcher.vue'
|
import QuickInstanceSwitcher from '@/components/ui/QuickInstanceSwitcher.vue'
|
||||||
import RunningAppBar from '@/components/ui/RunningAppBar.vue'
|
import RunningAppBar from '@/components/ui/RunningAppBar.vue'
|
||||||
import SplashScreen from '@/components/ui/SplashScreen.vue'
|
import SplashScreen from '@/components/ui/SplashScreen.vue'
|
||||||
|
import WindowControls from '@/components/ui/WindowControls.vue'
|
||||||
import { useCheckDisableMouseover } from '@/composables/macCssFix.js'
|
import { useCheckDisableMouseover } from '@/composables/macCssFix.js'
|
||||||
import { config } from '@/config'
|
import { config } from '@/config'
|
||||||
import { hide_ads_window, init_ads_window, show_ads_window } from '@/helpers/ads.js'
|
import { hide_ads_window, init_ads_window, show_ads_window } from '@/helpers/ads.js'
|
||||||
@@ -999,6 +996,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<WindowControls />
|
||||||
<SplashScreen v-if="!stateFailed" ref="splashScreen" data-tauri-drag-region />
|
<SplashScreen v-if="!stateFailed" ref="splashScreen" data-tauri-drag-region />
|
||||||
<div id="teleports"></div>
|
<div id="teleports"></div>
|
||||||
<div
|
<div
|
||||||
@@ -1196,22 +1194,6 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
|||||||
<RunningAppBar />
|
<RunningAppBar />
|
||||||
</Suspense>
|
</Suspense>
|
||||||
</div>
|
</div>
|
||||||
<section v-if="!nativeDecorations" class="window-controls" data-tauri-drag-region-exclude>
|
|
||||||
<Button class="titlebar-button" icon-only @click="() => getCurrentWindow().minimize()">
|
|
||||||
<MinimizeIcon />
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
class="titlebar-button"
|
|
||||||
icon-only
|
|
||||||
@click="() => getCurrentWindow().toggleMaximize()"
|
|
||||||
>
|
|
||||||
<RestoreIcon v-if="isMaximized" />
|
|
||||||
<MaximizeIcon v-else />
|
|
||||||
</Button>
|
|
||||||
<Button class="titlebar-button close" icon-only @click="handleClose">
|
|
||||||
<XIcon />
|
|
||||||
</Button>
|
|
||||||
</section>
|
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1297,7 +1279,11 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
|||||||
loading.startLoading()
|
loading.startLoading()
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
@resolve="loading.stopLoading()"
|
@resolve="
|
||||||
|
() => {
|
||||||
|
loading.stopLoading()
|
||||||
|
}
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<component :is="Component"></component>
|
<component :is="Component"></component>
|
||||||
</Suspense>
|
</Suspense>
|
||||||
@@ -1391,72 +1377,6 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.window-controls {
|
|
||||||
z-index: 20;
|
|
||||||
display: none;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
.titlebar-button {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: all ease-in-out 0.1s;
|
|
||||||
background-color: transparent;
|
|
||||||
color: var(--color-base);
|
|
||||||
height: 100%;
|
|
||||||
width: 3rem;
|
|
||||||
position: relative;
|
|
||||||
box-shadow: none;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
padding-right: 0.75rem;
|
|
||||||
width: 3.75rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
svg {
|
|
||||||
width: 1.25rem;
|
|
||||||
height: 1.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
content: '';
|
|
||||||
border-radius: 999999px;
|
|
||||||
width: 3rem;
|
|
||||||
height: 3rem;
|
|
||||||
aspect-ratio: 1 / 1;
|
|
||||||
margin-block: auto;
|
|
||||||
position: absolute;
|
|
||||||
background-color: transparent;
|
|
||||||
scale: 0.9;
|
|
||||||
transition: all ease-in-out 0.2s;
|
|
||||||
z-index: -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.close {
|
|
||||||
&:hover,
|
|
||||||
&:active {
|
|
||||||
color: var(--color-accent-contrast);
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
background-color: var(--color-red);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:active {
|
|
||||||
color: var(--color-contrast);
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
background-color: var(--color-button-bg);
|
|
||||||
scale: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-grid-layout,
|
.app-grid-layout,
|
||||||
.app-contents {
|
.app-contents {
|
||||||
--top-bar-height: 3rem;
|
--top-bar-height: 3rem;
|
||||||
@@ -1690,10 +1610,6 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
|||||||
height: 2.5rem !important;
|
height: 2.5rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-controls {
|
|
||||||
display: flex !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info-card {
|
.info-card {
|
||||||
right: 22rem;
|
right: 22rem;
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
84
apps/app-frontend/src/components/ui/WindowControls.vue
Normal file
84
apps/app-frontend/src/components/ui/WindowControls.vue
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
<template>
|
||||||
|
<section
|
||||||
|
v-if="!nativeDecorations && os !== 'MacOS'"
|
||||||
|
class="window-controls"
|
||||||
|
data-tauri-drag-region-exclude
|
||||||
|
>
|
||||||
|
<ButtonStyled type="transparent" circular>
|
||||||
|
<button class="titlebar-button" @click="() => getCurrentWindow().minimize()">
|
||||||
|
<MinimizeIcon />
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled type="transparent" circular>
|
||||||
|
<button class="titlebar-button" @click="() => getCurrentWindow().toggleMaximize()">
|
||||||
|
<RestoreIcon v-if="isMaximized" />
|
||||||
|
<MaximizeIcon v-else />
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled type="transparent" circular>
|
||||||
|
<button class="titlebar-button close" @click="handleClose">
|
||||||
|
<XIcon />
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { MaximizeIcon, MinimizeIcon, RestoreIcon, XIcon } from '@modrinth/assets'
|
||||||
|
import { ButtonStyled } from '@modrinth/ui'
|
||||||
|
import { getCurrentWindow } from '@tauri-apps/api/window'
|
||||||
|
import { saveWindowState, StateFlags } from '@tauri-apps/plugin-window-state'
|
||||||
|
import { onMounted, onUnmounted, ref } from 'vue'
|
||||||
|
|
||||||
|
import { getOS } from '@/helpers/utils.js'
|
||||||
|
|
||||||
|
const nativeDecorations = ref(true)
|
||||||
|
const isMaximized = ref(false)
|
||||||
|
const os = ref('')
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
os.value = await getOS()
|
||||||
|
|
||||||
|
const settings = await import('@/helpers/settings.ts').then((m) => m.get())
|
||||||
|
nativeDecorations.value = settings.native_decorations
|
||||||
|
|
||||||
|
if (os.value !== 'MacOS') {
|
||||||
|
await getCurrentWindow().setDecorations(nativeDecorations.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
isMaximized.value = await getCurrentWindow().isMaximized()
|
||||||
|
|
||||||
|
const unlisten = await getCurrentWindow().onResized(async () => {
|
||||||
|
isMaximized.value = await getCurrentWindow().isMaximized()
|
||||||
|
})
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
unlisten()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
const handleClose = async () => {
|
||||||
|
await saveWindowState(StateFlags.ALL)
|
||||||
|
await getCurrentWindow().close()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.window-controls {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 10001;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
height: var(--top-bar-height, 3rem);
|
||||||
|
padding-right: 0.5rem;
|
||||||
|
gap: 0.25rem;
|
||||||
|
|
||||||
|
.titlebar-button.close:hover {
|
||||||
|
background-color: var(--color-red);
|
||||||
|
color: var(--color-accent-contrast);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
Reference in New Issue
Block a user