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 */
|
2022-12-28 01:12:56 +00:00
|
|
|
backOnSmallScreen?: boolean
|
2022-12-29 12:21:00 +00:00
|
|
|
/** Show the back button on both small and big screens */
|
|
|
|
back?: boolean
|
2023-02-03 10:40:54 +00:00
|
|
|
/** Do not applying overflow hidden to let use floatable components in title */
|
|
|
|
noOverflowHidden?: boolean
|
2024-04-05 23:52:02 +01:00
|
|
|
/** Add the skip content link: it is the translation key */
|
2024-04-05 23:26:22 +01:00
|
|
|
skipContent?: string
|
2022-11-26 12:58:10 +00:00
|
|
|
}>()
|
2023-01-21 14:55:20 +00:00
|
|
|
|
2023-04-23 13:21:54 +01:00
|
|
|
const container = ref()
|
2023-01-21 14:55:20 +00:00
|
|
|
const route = useRoute()
|
2024-01-18 08:18:49 +00:00
|
|
|
const userSettings = useUserSettings()
|
2023-04-23 13:21:54 +01:00
|
|
|
const { height: windowHeight } = useWindowSize()
|
|
|
|
const { height: containerHeight } = useElementBounding(container)
|
2023-01-21 14:55:20 +00:00
|
|
|
const wideLayout = computed(() => route.meta.wideLayout ?? false)
|
2023-04-23 13:21:54 +01:00
|
|
|
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>
|
|
|
|
|
2022-11-15 13:50:41 +00:00
|
|
|
<template>
|
2023-04-23 13:21:54 +01:00
|
|
|
<div ref="container" :class="containerClass">
|
2024-04-05 23:26:22 +01:00
|
|
|
<SkipContentLink v-if="skipContent">
|
|
|
|
{{ $t(skipContent) }}
|
|
|
|
</SkipContentLink>
|
2022-11-23 08:08:49 +00:00
|
|
|
<div
|
2024-01-18 08:18:49 +00:00
|
|
|
sticky top-0 z10
|
2022-12-30 22:45:34 +00:00
|
|
|
pt="[env(safe-area-inset-top,0)]"
|
2023-03-07 20:43:23 +00:00
|
|
|
bg="[rgba(var(--rgb-bg-base),0.7)]"
|
2023-01-21 14:55:20 +00:00
|
|
|
class="native:lg:w-[calc(100vw-5rem)] native:xl:w-[calc(135%+(100vw-1200px)/2)]"
|
2024-01-18 08:18:49 +00:00
|
|
|
:class="{
|
|
|
|
'backdrop-blur': !getPreferences(userSettings, 'optimizeForLowPerformanceDevice'),
|
|
|
|
}"
|
2022-11-23 08:08:49 +00:00
|
|
|
>
|
2023-03-07 20:43:23 +00:00
|
|
|
<div flex justify-between px5 py2 :class="{ 'xl:hidden': $route.name !== 'tag' }" class="native:xl:flex" border="b base">
|
2023-02-05 15:35:21 +00:00
|
|
|
<div flex gap-3 items-center :overflow-hidden="!noOverflowHidden ? '' : false" py2 w-full>
|
2022-12-28 01:12:56 +00:00
|
|
|
<NuxtLink
|
2023-01-13 14:49:52 +00:00
|
|
|
v-if="backOnSmallScreen || back" flex="~ gap1" items-center btn-text p-0 xl:hidden
|
2023-01-06 17:46:06 +00:00
|
|
|
:aria-label="$t('nav.back')"
|
2022-12-28 01:12:56 +00:00
|
|
|
@click="$router.go(-1)"
|
|
|
|
>
|
2023-01-01 14:29:11 +00:00
|
|
|
<div i-ri:arrow-left-line class="rtl-flip" />
|
2022-11-26 12:58:10 +00:00
|
|
|
</NuxtLink>
|
2023-08-19 11:35:11 +01:00
|
|
|
<div :truncate="!noOverflowHidden ? '' : false" flex w-full data-tauri-drag-region class="native-mac:justify-start native-mac:text-center">
|
2022-12-03 05:19:59 +00:00
|
|
|
<slot name="title" />
|
|
|
|
</div>
|
2023-02-03 10:40:54 +00:00
|
|
|
<div sm:hidden h-7 w-1px />
|
2022-12-04 14:26:42 +00:00
|
|
|
</div>
|
2022-12-15 19:59:47 +00:00
|
|
|
<div flex items-center flex-shrink-0 gap-x-2>
|
2022-12-04 14:26:42 +00:00
|
|
|
<slot name="actions" />
|
2023-05-26 14:25:11 +01:00
|
|
|
<PwaBadge xl:hidden />
|
2023-01-15 08:38:02 +00:00
|
|
|
<NavUser v-if="isHydrated" />
|
2022-12-31 12:26:52 +00:00
|
|
|
<NavUserSkeleton v-else />
|
2022-11-20 21:30:21 +00:00
|
|
|
</div>
|
2022-11-15 13:50:41 +00:00
|
|
|
</div>
|
2023-03-07 20:43:23 +00:00
|
|
|
<slot name="header">
|
2023-04-30 20:46:07 +01:00
|
|
|
<div hidden />
|
2023-03-07 20:43:23 +00:00
|
|
|
</slot>
|
2022-11-15 13:50:41 +00:00
|
|
|
</div>
|
2023-05-26 14:25:11 +01:00
|
|
|
<PwaInstallPrompt xl:hidden />
|
2023-01-21 14:55:20 +00:00
|
|
|
<div :class="isHydrated && wideLayout ? 'xl:w-full sm:max-w-600px' : 'sm:max-w-600px md:shrink-0'" m-auto>
|
2023-04-30 20:46:07 +01:00
|
|
|
<div hidden :class="{ 'xl:block': $route.name !== 'tag' && !$slots.header }" h-6 />
|
2023-01-21 14:55:20 +00:00
|
|
|
<slot />
|
|
|
|
</div>
|
2022-11-15 13:50:41 +00:00
|
|
|
</div>
|
|
|
|
</template>
|