primevue-mirror/apps/volt/layouts/default.vue

67 lines
1.7 KiB
Vue
Raw Normal View History

2025-02-28 11:49:42 +00:00
<template>
2025-03-11 08:14:17 +00:00
<div :class="containerClass">
2025-02-28 11:49:42 +00:00
<AppNews />
<AppTopBar @menubutton-click="onMenuButtonClick" />
<div :class="['layout-mask', { 'layout-mask-active': sidebarActive }]" @click="onMaskClick"></div>
<div class="layout-content">
<app-menu :active="sidebarActive" />
<div class="layout-content-slot">
<slot></slot>
</div>
</div>
<AppFooter />
<Toast />
<Toast position="top-left" group="tl" />
<Toast position="bottom-left" group="bl" />
<Toast position="bottom-right" group="br" />
</div>
</template>
2025-03-11 08:14:17 +00:00
<script setup>
import Toast from '@/volt/toast';
2025-02-28 11:49:42 +00:00
import { blockBodyScroll, unblockBodyScroll } from '@primeuix/utils/dom';
2025-03-11 08:14:17 +00:00
import { useToast } from 'primevue/usetoast';
import { computed, ref, watch } from 'vue';
2025-02-28 11:49:42 +00:00
2025-03-11 08:14:17 +00:00
const { layoutState } = useLayout();
const route = useRoute();
const toast = useToast();
const sidebarActive = ref(false);
2025-02-28 11:49:42 +00:00
2025-03-11 08:14:17 +00:00
const containerClass = computed(() => {
return [
{
'layout-news-active': layoutState.newsActive
2025-02-28 11:49:42 +00:00
}
2025-03-11 08:14:17 +00:00
];
});
const onMenuButtonClick = () => {
if (sidebarActive.value) {
sidebarActive.value = false;
unblockBodyScroll('blocked-scroll');
} else {
sidebarActive.value = true;
blockBodyScroll('blocked-scroll');
2025-02-28 11:49:42 +00:00
}
};
2025-03-11 08:14:17 +00:00
const onMaskClick = () => {
sidebarActive.value = false;
unblockBodyScroll('blocked-scroll');
};
watch(
() => route.path,
() => {
// if (!import.meta.client || typeof window === 'undefined') {
// return;
// }
sidebarActive.value = false;
unblockBodyScroll('blocked-scroll');
toast.removeAllGroups();
}
);
2025-02-28 11:49:42 +00:00
</script>