elk/components/main/MainContent.vue

66 lines
2.5 KiB
Vue
Raw Permalink Normal View History

2022-11-26 12:58:10 +00:00
<script setup lang="ts">
defineProps<{
2022-12-29 12:21:00 +00:00
/** Show the back button on small screens */
backOnSmallScreen?: boolean
2022-12-29 12:21:00 +00: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 12:58:10 +00:00
}>()
const container = ref()
const route = useRoute()
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
if (!isHydrated.value || !sticky.value || (windowHeight.value < containerHeight.value))
return null
return 'lg:sticky lg:top-0'
})
2022-11-26 12:58:10 +00:00
</script>
<template>
<div ref="container" :class="containerClass">
2022-11-23 08:08:49 +00:00
<div
2022-12-30 22:45:34 +00:00
sticky top-0 z10 backdrop-blur
pt="[env(safe-area-inset-top,0)]"
bg="[rgba(var(--rgb-bg-base),0.7)]"
class="native:lg:w-[calc(100vw-5rem)] native:xl:w-[calc(135%+(100vw-1200px)/2)]"
2022-11-23 08:08:49 +00:00
>
<div flex justify-between px5 py2 :class="{ 'xl:hidden': $route.name !== 'tag' }" class="native:xl:flex" border="b base">
<div flex gap-3 items-center :overflow-hidden="!noOverflowHidden ? '' : false" py2 w-full>
<NuxtLink
v-if="backOnSmallScreen || back" flex="~ gap1" items-center btn-text p-0 xl:hidden
:aria-label="$t('nav.back')"
@click="$router.go(-1)"
>
<div i-ri:arrow-left-line class="rtl-flip" />
2022-11-26 12:58:10 +00:00
</NuxtLink>
<div :truncate="!noOverflowHidden ? '' : false" flex w-full data-tauri-drag-region class="native-mac:justify-center native-mac:text-center native-mac:sm:justify-start">
<slot name="title" />
</div>
<div sm:hidden h-7 w-1px />
2022-12-04 14:26:42 +00:00
</div>
<div flex items-center flex-shrink-0 gap-x-2>
2022-12-04 14:26:42 +00:00
<slot name="actions" />
2022-12-23 18:26:28 +00:00
<PwaBadge lg:hidden />
2023-01-15 08:38:02 +00:00
<NavUser v-if="isHydrated" />
<NavUserSkeleton v-else />
</div>
</div>
<slot name="header">
<div hidden />
</slot>
</div>
<PwaInstallPrompt lg: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>