Files
sori.studio/composables/useMenuState.js
zenn bb8d20f138 모바일 새로고침 시 좌측 사이드바 열림→닫힘 애니메이션 문제 수정
- useMenuState에 menuMounted 추가, 모바일은 항상 닫힘 상태로 시작
- 좌측 사이드바 모바일 오버레이·백드롭을 마운트 이후에만 열리도록 게이팅
- 데스크톱 기본 열림·저장 설정은 그대로 유지
- v1.10.30

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 17:45:39 +09:00

59 lines
1.4 KiB
JavaScript

const menuStorageKey = 'MENU_STATE'
/**
* 좌측 메뉴 열림 상태 관리
* @returns {{menuOpen: import('vue').Ref<boolean>, toggleMenu: Function, closeMenu: Function}} 메뉴 상태와 토글·닫기
*/
export const useMenuState = () => {
const menuOpen = useState('site-menu-open', () => true)
const menuMounted = useState('site-menu-mounted', () => false)
onMounted(() => {
if (menuMounted.value) {
return
}
const isNarrow = window.matchMedia('(max-width: 1023px)').matches
if (isNarrow) {
// 모바일은 항상 닫힌 상태로 시작한다(데스크톱 저장 설정은 보존).
menuOpen.value = false
} else {
const savedState = localStorage.getItem(menuStorageKey)
if (savedState) {
menuOpen.value = savedState === 'open'
}
}
menuMounted.value = true
})
/**
* 좌측 메뉴 열림 상태 토글
* @returns {void}
*/
const toggleMenu = () => {
menuOpen.value = !menuOpen.value
localStorage.setItem(menuStorageKey, menuOpen.value ? 'open' : 'closed')
}
/**
* 좌측 메뉴를 닫는다(모바일 오버레이·백드롭에서 사용).
* @returns {void}
*/
const closeMenu = () => {
if (!menuOpen.value) {
return
}
menuOpen.value = false
localStorage.setItem(menuStorageKey, 'closed')
}
return {
menuOpen,
menuMounted,
toggleMenu,
closeMenu
}
}