2022-12-04 14:17:02 +00:00
|
|
|
<script lang="ts" setup>
|
2023-08-01 10:43:55 +01:00
|
|
|
const modelValue = defineModel<boolean>({ required: true })
|
2022-12-29 12:26:08 +00:00
|
|
|
const colorMode = useColorMode()
|
2022-12-04 14:17:02 +00:00
|
|
|
|
2023-01-12 17:52:52 +00:00
|
|
|
const userSettings = useUserSettings()
|
|
|
|
|
2023-01-06 15:46:36 +00:00
|
|
|
function toggleVisible() {
|
2023-08-02 10:43:24 +01:00
|
|
|
modelValue.value = !modelValue.value
|
2022-12-04 14:17:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const buttonEl = ref<HTMLDivElement>()
|
|
|
|
/** Close the drop-down menu if the mouse click is not on the drop-down menu button when the drop-down menu is opened */
|
|
|
|
function clickEvent(mouse: MouseEvent) {
|
|
|
|
if (mouse.target && !buttonEl.value?.children[0].contains(mouse.target as any)) {
|
2023-01-06 15:46:36 +00:00
|
|
|
if (modelValue) {
|
2022-12-04 14:17:02 +00:00
|
|
|
document.removeEventListener('click', clickEvent)
|
2023-08-01 10:43:55 +01:00
|
|
|
modelValue.value = false
|
2022-12-04 14:17:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-28 01:06:54 +00:00
|
|
|
function toggleDark() {
|
2022-12-29 12:26:08 +00:00
|
|
|
colorMode.preference = colorMode.value === 'dark' ? 'light' : 'dark'
|
2022-12-28 01:06:54 +00:00
|
|
|
}
|
|
|
|
|
2023-01-06 15:46:36 +00:00
|
|
|
watch($$(modelValue), (val) => {
|
2022-12-05 13:20:23 +00:00
|
|
|
if (val && typeof document !== 'undefined')
|
|
|
|
document.addEventListener('click', clickEvent)
|
|
|
|
})
|
2022-12-04 14:17:02 +00:00
|
|
|
|
|
|
|
onBeforeUnmount(() => {
|
2022-12-05 13:20:23 +00:00
|
|
|
document.removeEventListener('click', clickEvent)
|
2022-12-04 14:17:02 +00:00
|
|
|
})
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
|
|
|
<div ref="buttonEl" flex items-center static>
|
2023-01-06 15:46:36 +00:00
|
|
|
<slot :toggle-visible="toggleVisible" :show="modelValue" />
|
2022-12-04 14:17:02 +00:00
|
|
|
|
|
|
|
<!-- Drawer -->
|
|
|
|
<Transition
|
|
|
|
enter-active-class="transition duration-250 ease-out children:(transition duration-250 ease-out)"
|
|
|
|
enter-from-class="opacity-0 children:(transform translate-y-full)"
|
|
|
|
enter-to-class="opacity-100 children:(transform translate-y-0)"
|
|
|
|
leave-active-class="transition duration-250 ease-in children:(transition duration-250 ease-in)"
|
|
|
|
leave-from-class="opacity-100 children:(transform translate-y-0)"
|
|
|
|
leave-to-class="opacity-0 children:(transform translate-y-full)"
|
|
|
|
>
|
|
|
|
<div
|
2023-01-06 15:46:36 +00:00
|
|
|
v-show="modelValue"
|
2022-12-04 14:17:02 +00:00
|
|
|
absolute inset-x-0 top-auto bottom-full z-20 h-100vh
|
2022-12-05 13:20:23 +00:00
|
|
|
flex items-end of-y-scroll of-x-hidden scrollbar-hide overscroll-none
|
2022-12-04 14:17:02 +00:00
|
|
|
bg="black/50"
|
|
|
|
>
|
|
|
|
<!-- The style `scrollbar-hide overscroll-none overflow-y-scroll mb="-1px"` and `h="[calc(100%+0.5px)]"` is used to implement scroll locking, -->
|
|
|
|
<!-- corresponding to issue: #106, so please don't remove it. -->
|
|
|
|
<div absolute inset-0 opacity-0 h="[calc(100vh+0.5px)]" />
|
|
|
|
<div
|
2022-12-05 13:20:23 +00:00
|
|
|
|
2022-12-04 14:17:02 +00:00
|
|
|
flex-1 min-w-48 py-6 mb="-1px"
|
2022-12-05 13:20:23 +00:00
|
|
|
of-y-auto scrollbar-hide overscroll-none max-h="[calc(100vh-200px)]"
|
2022-12-04 14:17:02 +00:00
|
|
|
rounded-t-lg bg="white/85 dark:neutral-900/85" backdrop-filter backdrop-blur-md
|
|
|
|
border-t-1 border-base
|
|
|
|
>
|
|
|
|
<!-- Nav -->
|
|
|
|
<NavSide />
|
|
|
|
|
|
|
|
<!-- Divider line -->
|
|
|
|
<div border="neutral-300 dark:neutral-700 t-1" m="x-3 y-2" />
|
|
|
|
|
|
|
|
<!-- Function menu -->
|
|
|
|
<div flex="~ col gap2">
|
|
|
|
<!-- Toggle Theme -->
|
|
|
|
<button
|
|
|
|
flex flex-row items-center
|
|
|
|
block px-5 py-2 focus-blue w-full
|
|
|
|
text-sm text-base capitalize text-left whitespace-nowrap
|
|
|
|
transition-colors duration-200 transform
|
|
|
|
hover="bg-gray-100 dark:(bg-gray-700 text-white)"
|
|
|
|
@click="toggleDark()"
|
|
|
|
>
|
2023-01-01 14:29:11 +00:00
|
|
|
<span class="i-ri:sun-line dark:i-ri:moon-line flex-shrink-0 text-xl me-4 !align-middle" />
|
2022-12-29 12:26:08 +00:00
|
|
|
{{ colorMode.value === 'light' ? $t('menu.toggle_theme.dark') : $t('menu.toggle_theme.light') }}
|
2022-12-04 14:17:02 +00:00
|
|
|
</button>
|
2023-01-11 14:00:41 +00:00
|
|
|
|
|
|
|
<!-- Zen Mode -->
|
|
|
|
<button
|
|
|
|
flex flex-row items-center
|
|
|
|
block px-5 py-2 focus-blue w-full
|
|
|
|
text-sm text-base capitalize text-left whitespace-nowrap
|
|
|
|
transition-colors duration-200 transform
|
|
|
|
hover="bg-gray-100 dark:(bg-gray-700 text-white)"
|
|
|
|
:aria-label="$t('nav.zen_mode')"
|
2023-04-23 11:21:33 +01:00
|
|
|
@click="togglePreferences('zenMode')"
|
2023-01-11 14:00:41 +00:00
|
|
|
>
|
2023-04-23 11:21:33 +01:00
|
|
|
<span :class="getPreferences(userSettings, 'zenMode') ? 'i-ri:layout-right-2-line' : 'i-ri:layout-right-line'" class="flex-shrink-0 text-xl me-4 !align-middle" />
|
2023-01-11 14:00:41 +00:00
|
|
|
{{ $t('nav.zen_mode') }}
|
|
|
|
</button>
|
2022-12-04 14:17:02 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</Transition>
|
|
|
|
</div>
|
|
|
|
</template>
|