fyne-on/app/components/main/MainContent.vue

116 lines
2.9 KiB
Vue
Raw Normal View History

2022-11-26 20:58:10 +08:00
<script setup lang="ts">
defineProps<{
2022-12-29 13:21:00 +01:00
/** Show the back button on small screens */
backOnSmallScreen?: boolean
2022-12-29 13:21:00 +01:00
/** Show the back button on both small and big screens */
back?: boolean
/** Do not applying overflow hidden to let use floatable components in title */
noOverflowHidden?: boolean
2022-11-26 20:58:10 +08:00
}>()
const container = ref()
const route = useRoute()
const userSettings = useUserSettings()
const { height: windowHeight } = useWindowSize()
const { height: containerHeight } = useElementBounding(container)
const wideLayout = computed(() => route.meta.wideLayout ?? false)
const sticky = computed(() => route.path?.startsWith('/settings/'))
const containerClass = computed(() => {
// we keep original behavior when not in settings page and when the window height is smaller than the container height
2025-09-13 10:27:10 +03:00
if (
!isHydrated.value
|| !sticky.value
|| windowHeight.value < containerHeight.value
) {
return null
2025-09-13 10:27:10 +03:00
}
return 'lg:sticky lg:top-0'
})
2022-11-26 20:58:10 +08:00
</script>
<template>
<div ref="container" :class="containerClass">
2022-11-23 16:08:49 +08:00
<div
2025-09-13 10:27:10 +03:00
sticky
top-0
z-20
2022-12-31 06:45:34 +08:00
pt="[env(safe-area-inset-top,0)]"
bg="[rgba(var(--rgb-bg-base),0.7)]"
:class="{
2025-09-13 10:27:10 +03:00
'backdrop-blur': !getPreferences(
userSettings,
'optimizeForLowPerformanceDevice',
),
}"
2022-11-23 16:08:49 +08:00
>
2025-09-13 10:27:10 +03:00
<div
flex
justify-between
gap-2
min-h-53px
px5
py1
:class="{ 'xl:hidden': $route.name !== 'tag' }"
border="b base"
>
<div
flex
gap-2
items-center
:overflow-hidden="!noOverflowHidden ? '' : false"
w-full
>
<button
v-if="backOnSmallScreen || back"
2025-09-13 10:27:10 +03:00
btn-text
flex
items-center
ms="-3"
p-3
xl:hidden
:aria-label="$t('nav.back')"
@click="$router.go(-1)"
>
<div text-lg i-ri:arrow-left-line class="rtl-flip" />
</button>
2025-09-13 10:27:10 +03:00
<div
:truncate="!noOverflowHidden ? '' : false"
flex
w-full
class="native-mac:justify-start native-mac:text-center"
>
<slot name="title" />
</div>
<div sm:hidden h-7 w-1px />
2022-12-04 22:26:42 +08:00
</div>
<div flex items-center flex-shrink-0 gap-x-2>
2022-12-04 22:26:42 +08:00
<slot name="actions" />
<PwaBadge xl:hidden />
2023-01-15 16:38:02 +08:00
<NavUser v-if="isHydrated" />
<NavUserSkeleton v-else />
</div>
</div>
<slot name="header">
<div hidden />
</slot>
</div>
2025-09-13 10:27:10 +03:00
<!-- <PwaInstallPrompt xl:hidden /> -->
<div
:class="
isHydrated && wideLayout
? 'xl:w-full sm:max-w-600px'
: 'sm:max-w-600px md:shrink-0'
"
m-auto
>
<div
hidden
:class="{ 'xl:block': $route.name !== 'tag' && !$slots.header }"
h-6
/>
<slot />
</div>
</div>
</template>