Files
art-design/src/components/core/layouts/art-layouts/index.vue
T
2025-07-21 11:16:16 +08:00

61 lines
1.7 KiB
Vue

<template>
<div class="layouts" :style="layoutStyle">
<slot></slot>
</div>
</template>
<script setup lang="ts">
import '@/assets/styles/transition.scss'
import { MenuWidth, MenuTypeEnum } from '@/enums/appEnum'
import { useMenuStore } from '@/store/modules/menu'
import { useSettingStore } from '@/store/modules/setting'
import { getTabConfig } from '@/utils/ui'
import { useRouter } from 'vue-router'
const settingStore = useSettingStore()
const menuStore = useMenuStore()
const router = useRouter()
const { menuType, menuOpen, showWorkTab, tabStyle } = storeToRefs(settingStore)
// 菜单宽度变化
watchEffect(() => {
const isOpen = menuOpen.value
const width = isOpen ? settingStore.getMenuOpenWidth : MenuWidth.CLOSE
menuStore.setMenuWidth(width)
})
// 布局样式
const layoutStyle = computed(() => ({
paddingLeft: paddingLeft.value,
paddingTop: paddingTop.value
}))
// 左侧距离
const paddingLeft = computed(() => {
const { meta } = router.currentRoute.value
const isFirstLevel = meta.isFirstLevel
const type = menuType.value
const isOpen = menuOpen.value
const width = isOpen ? settingStore.getMenuOpenWidth : MenuWidth.CLOSE
switch (type) {
case MenuTypeEnum.DUAL_MENU:
return isFirstLevel ? '80px' : `calc(${width} + 80px)`
case MenuTypeEnum.TOP_LEFT:
return isFirstLevel ? 0 : width
case MenuTypeEnum.TOP:
return 0
default:
return width
}
})
// 顶部距离
const paddingTop = computed(() => {
const { openTop, closeTop } = getTabConfig(tabStyle.value)
return `${showWorkTab.value ? openTop : closeTop}px`
})
</script>