Files
kra-new/web/src/pinia/modules/app.js
T
2026-08-13 22:35:13 +08:00

65 lines
2.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { defineStore } from 'pinia'
import { computed, ref } from 'vue'
export const useAppStore = defineStore('app', () => {
const device = ref('')
const drawerSize = ref('')
const operateMinWith = ref('240')
// 侧栏折叠态(运行时态,不持久化),供 vertical 布局的固定侧栏与外壳共享
const sideCollapse = ref(false)
// 移动端(<640)左侧抽屉菜单开合态
const mobileMenuOpen = ref(false)
// 当前断点区间(由 useResponsive 维护):mobile(<640) / pad(640–1024) / desktop(>=1024)
const layoutZone = ref('desktop')
// 平板区间强制「通栏侧边」收缩布局(不改用户所选布局)
const isPad = computed(() => layoutZone.value === 'pad')
// 进入平板前的侧栏折叠态快照,离开平板时据此恢复(区分「系统收缩」与「用户收缩」)
const prePadCollapse = ref(false)
const toggleMobileMenu = (v) => {
mobileMenuOpen.value = typeof v === 'boolean' ? v : !mobileMenuOpen.value
}
// 切换断点区间:进入平板时快照当前折叠态并强制收缩,离开平板时恢复进入前的折叠态,
// 从而只撤销系统自己施加的收缩,不覆盖用户在桌面手动收缩的意图。
const setLayoutZone = (zone) => {
const prev = layoutZone.value
if (zone === 'pad' && prev !== 'pad') {
prePadCollapse.value = sideCollapse.value
sideCollapse.value = true
} else if (zone !== 'pad' && prev === 'pad') {
sideCollapse.value = prePadCollapse.value
}
layoutZone.value = zone
}
const toggleDevice = (e) => {
if (e === 'mobile') {
drawerSize.value = '100%'
operateMinWith.value = '80'
} else {
drawerSize.value = '800'
operateMinWith.value = '240'
}
device.value = e
}
const toggleSideCollapse = (v) => {
sideCollapse.value = typeof v === 'boolean' ? v : !sideCollapse.value
}
return {
device,
drawerSize,
operateMinWith,
sideCollapse,
toggleSideCollapse,
mobileMenuOpen,
toggleMobileMenu,
layoutZone,
isPad,
setLayoutZone,
toggleDevice
}
})