{"file":"Notification-Bn5sq0iS.js","mappings":"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A,MAAM;AAAA,MAAM;AAAA,MAAU;AAAA,MAAU;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACrE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxE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","names":["apiClient","_ssrRenderComponent","_push","_parent","_createVNode","_unref","_ssrInterpolate","_","_scopeId","_ssrRenderClass","_createBlock","_ssrRenderAttr","AnimatePresence","_ssrRenderDynamicModel","_ssrRenderStyle","_Transition","_vShow","_toDisplayString","emojiCategories","_ssrRenderList","_Fragment","_renderList","_withModifiers","_openBlock","unreadCount","notifications","_createTextVNode"],"sources":["../../../../composables/useNotifications.js","../../../../components/layout/Header.vue","../../../../assets/images/giphy.webp","../../../../composables/useEmoji.js","../../../../components/common/ChatSection.vue","../../../../components/common/Notification.vue"],"sourcesContent":["import { ref } from 'vue';\nimport apiClient from '@/composables/common/axios';\n\nconst notifications = ref([]);\nconst unreadCount = ref(0);\n\nexport const useNotifications = () => {\n  const fetchNotifications = async (limit = 50, offset = 0) => {\n    try {\n      const response = await apiClient.get('/api/notifications.php', {\n        params: {\n          action: 'list',\n          limit,\n          offset\n        }\n      });\n\n      if (response.data.success) {\n        notifications.value = response.data.notifications;\n        return { success: true, notifications: response.data.notifications };\n      }\n      return { success: false, message: response.data.message };\n    } catch (error) {\n      // console.error('[Notifications] Fetch error:', error);\n      return { success: false, message: '알림 조회 실패' };\n    }\n  };\n\n  const fetchUnreadCount = async () => {\n    try {\n      const response = await apiClient.get('/api/notifications.php', {\n        params: { action: 'unread_count' }\n      });\n\n      if (response.data.success) {\n        unreadCount.value = response.data.count;\n        return response.data.count;\n      }\n      return 0;\n    } catch (error) {\n      // console.error('[Notifications] Unread count error:', error);\n      return 0;\n    }\n  };\n\n  const markAsRead = async (notificationId) => {\n    try {\n      const response = await apiClient.post('/api/notifications.php?action=mark_read', {\n        notification_id: notificationId\n      });\n\n      if (response.data.success) {\n        // 로컬 상태 업데이트\n        const notification = notifications.value.find(n => n.id === notificationId);\n        if (notification) {\n          notification.is_read = 1;\n          notification.is_new = false;\n        }\n        await fetchUnreadCount();\n        return { success: true };\n      }\n      return { success: false, message: response.data.message };\n    } catch (error) {\n      // console.error('[Notifications] Mark read error:', error);\n      return { success: false, message: '읽음 처리 실패' };\n    }\n  };\n\n  const markAllAsRead = async () => {\n    try {\n      const response = await apiClient.post('/api/notifications.php?action=mark_all_read');\n\n      if (response.data.success) {\n        // 로컬 상태 업데이트\n        notifications.value.forEach(n => {\n          n.is_read = 1;\n          n.is_new = false;\n        });\n        unreadCount.value = 0;\n        return { success: true };\n      }\n      return { success: false, message: response.data.message };\n    } catch (error) {\n      // console.error('[Notifications] Mark all read error:', error);\n      return { success: false, message: '읽음 처리 실패' };\n    }\n  };\n\n  return {\n    notifications,\n    unreadCount,\n    fetchNotifications,\n    fetchUnreadCount,\n    markAsRead,\n    markAllAsRead\n  };\n};\n","<script setup>\nimport { ref, onMounted, onUnmounted, computed, watch, nextTick } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { AnimatePresence } from \"motion-v\";\nimport storage from \"@/composables/common/storage\";\nimport { useDevice } from \"@/composables/useDevice\";\nimport { useChat } from \"@/composables/useSidebar\";\nimport { useAuth } from \"@/composables/useAuth\";\nimport { useSocket } from \"@/composables/useSocket\";\nimport { useNotifications } from \"@/composables/useNotifications\";\nimport {\n  useFormField,\n  usePasswordField,\n  usePasswordConfirmField,\n  useFormValidation,\n  validateEmail,\n} from \"~/composables/useForm\";\n\n// ===== 상수 =====\nconst THEME_STORAGE_KEY = \"app-theme\";\nconst NOTIFICATION_MAX_DISPLAY = 99;\n\n// ===== 더미 데이터 =====\nconst TEST_DATA = {\n  // jackpot: 1,\n  chat: 12,\n  notification: 100,\n};\n\n// ===== Composables =====\nconst { isMobile } = useDevice();\nconst {\n  isChatOpen,\n  toggleChat,\n  unreadMessageCount,\n  isNotificationOpen,\n  toggleNotification,\n} = useChat();\nconst { fetchUnreadCount } = useNotifications();\nconst {\n  isLoggedIn,\n  currentUser,\n  logout,\n  login,\n  initialize: initializeAuth,\n  isInitialized: isAuthInitialized,\n  updateBalance,\n} = useAuth();\n\n// 랜덤 기본 아바타 (01~06)\nconst getDefaultAvatar = () => {\n  const num = Math.floor(Math.random() * 6) + 1;\n  return `/images/default_avatar_0${num}.png`;\n};\n\n// 아바타 이미지\nconst avatarUrl = computed(() => {\n  if (!currentUser.value?.avatar) {\n    return getDefaultAvatar();\n  }\n\n  const avatar = currentUser.value.avatar;\n\n  // Base64 이미지인 경우 그대로 반환\n  if (avatar.startsWith('data:image')) {\n    return avatar;\n  }\n\n  // 숫자만 있는 경우 (예: \"03\") 경로 조합\n  if (/^\\d{2}$/.test(avatar)) {\n    return `/images/default_avatar_${avatar}.png`;\n  }\n\n  // 이미 경로인 경우 그대로 반환\n  if (avatar.startsWith('/images/')) {\n    return avatar;\n  }\n\n  // 기타 경우 기본 아바타\n  return getDefaultAvatar();\n});\n\n// 아바타 이미지 에러 처리\nconst handleAvatarError = (event) => {\n  event.target.src = getDefaultAvatar();\n};\n\n// ===== Refs =====\n// 마운트 상태 (hydration mismatch 방지용)\nconst isMounted = ref(false);\n\n// 모달 refs\n// const jackpotModal = ref(null);\n// const jackpotHistoryModal = ref(null);\n// const jackpotBonusModal = ref(null);\n// const jackpotRankStandardModal = ref(null);\nconst loginModal = ref(null);\nconst signupModal = ref(null);\nconst passwordRequestModal = ref(null);\n\n// 알림 관련 상태\nconst unreadChatCount = unreadMessageCount;\nconst { unreadNotificationCount } = useChat();\n// const unreadJackpotCount = ref(0);\n\n// 잭팟 관련 상태\n// const jackpotRank = ref(null);\n\n// 더미 데이터\n// const jackpotHistoryMeta = ref({\n//   round: 1,\n//   startDate: \"2025.12.05 (금)\",\n//   startTime: \"00:00:00\",\n//   endDate: \"2025.12.12 (목) 23:59:59\",\n// });\n\n// 테마 상태\nconst currentTheme = ref(\"dark\");\n\n// 스크롤 상태\nconst isScrolled = ref(false);\nconst mainElementRef = ref(null);\n\n// 유저 메뉴 상태\nconst isUserMenuOpen = ref(false);\n\n// 언어 서브메뉴 상태\nconst isLangSubmenuOpen = ref(false);\n\n// 사운드 상태 (localStorage에서 불러오기)\n// const SOUND_STORAGE_KEY = \"app-sound\";\n// const isSoundOn = ref(true);\n\n// 비로그인용 언어 메뉴 상태\nconst isLangMenuOpen = ref(false);\n\n// ===== 로그인 폼 필드 =====\n// 계정 필드 (이메일 형식 검증 제거)\nconst email = useFormField(\"\", {\n  required: true,\n  errorMessages: {\n    empty: \"계정을 입력해주세요.\",\n    invalid: \"계정을 확인해주세요.\",\n  },\n});\n\n// 비밀번호 필드 (영문숫자 8자 검증 제거)\nconst password = useFormField(\"\", {\n  required: true,\n  errorMessages: {\n    empty: \"비밀번호를 입력해주세요.\",\n    mismatch: \"계정 또는 비밀번호가 일치하지 않습니다.\",\n  },\n});\n\n// 비밀번호 표시/숨김 상태\nconst showPassword = ref(false);\nconst togglePassword = () => {\n  showPassword.value = !showPassword.value;\n};\n\n// ===== 로그인 폼 관리 =====\nconst form = useFormValidation(\n  { email, password },\n  {\n    onSubmit: async (values) => {\n      // 로그인 시도\n      const result = await login(values.email, values.password);\n\n      if (result.success) {\n        // 로그인 성공 시 모달 닫기\n        loginModal.value?.close();\n        // 폼 초기화\n        email.value.value = \"\";\n        password.value.value = \"\";\n        return true;\n      } else {\n        // 로그인 실패 시 에러 표시\n        password.reset();\n        await nextTick();\n        password.setError(\"mismatch\");\n        await nextTick();\n        return false;\n      }\n    },\n  }\n);\n\n// ===== 로그인 함수 =====\nconst handleLogin = async () => {\n  await form.handleSubmit();\n};\n\n// 로그인 모달 열기\nconst openLoginModal = () => {\n  loginModal.value?.open();\n};\n\n// 로그인 모달 다시 열기 (비밀번호 찾기 모달 닫을 때 사용)\nconst reopenLoginModal = () => {\n  loginModal.value?.open();\n};\n\n// 로그인 모달이 열려 있으면 닫기 (비밀번호 찾기 모달 열 때 사용)\nconst closeLoginModalIfOpen = () => {\n  if (loginModal.value?.isOpened()) {\n    loginModal.value?.close();\n  }\n};\n\n// 로그인 모달 닫기 시 폼 초기화\nconst handleLoginModalClose = () => {\n  // 에러 상태 초기화\n  email.reset();\n  password.reset();\n  // 입력값 초기화\n  email.value.value = \"\";\n  password.value.value = \"\";\n};\n\n// ===== 비밀번호 찾기 (요청) 폼 =====\nconst isPasswordRequestSubmitted = ref(false);\n\nconst requestPasswordEmail = useFormField(\"\", {\n  required: true,\n  validator: validateEmail,\n  errorMessages: {\n    empty: \"이메일을 입력해주세요.\",\n    invalid: \"이메일 형식이 올바르지 않습니다.\",\n  },\n});\n\nconst requestPasswordForm = useFormValidation(\n  { email: requestPasswordEmail },\n  {\n    onSubmit: async (values) => {\n      isPasswordRequestSubmitted.value = true;\n      return true;\n    },\n  }\n);\n\nconst isPasswordRequestFormValid = computed(\n  () =>\n    requestPasswordEmail.value.value &&\n    !requestPasswordEmail.isError.value\n);\n\nconst handlePasswordRequest = async () => {\n  await requestPasswordForm.handleSubmit();\n};\n\nconst openPasswordRequestModal = () => {\n  closeLoginModalIfOpen();\n  passwordRequestModal.value?.open();\n};\n\nconst handlePasswordRequestModalClose = () => {\n  requestPasswordEmail.reset();\n  requestPasswordEmail.value.value = \"\";\n  isPasswordRequestSubmitted.value = false;\n};\n\n// 비밀번호 찾기 완료 후 로그인 모달 열기 (닫으면 previous-modal로 로그인 모달이 열림)\nconst handlePasswordRequestDoneLogin = () => {\n  passwordRequestModal.value?.close();\n};\n\n// ===== 회원가입 폼 필드 =====\n// 이메일 필드\nconst signupEmail = useFormField(\"\", {\n  required: true,\n  validator: validateEmail,\n  errorMessages: {\n    empty: \"이메일을 입력해주세요.\",\n    invalid: \"이메일 형식이 올바르지 않습니다.\",\n    duplicate: \"이미 가입된 이메일입니다.\",\n    \"auth-failed\": \"인증 오류가 발생했습니다.\",\n  },\n  onAuth: async (emailValue) => {\n    // TODO: 실제 이메일 인증 API 호출\n    // console.log(\"Email auth:\", emailValue);\n\n    // 테스트용: 무조건 인증 실패\n    return { success: false, errorCode: \"auth-failed\" };\n  },\n});\n\n// 닉네임 필드\nconst signupNickname = useFormField(\"\", {\n  required: true,\n  errorMessages: {\n    empty: \"닉네임을 입력해주세요.\",\n    duplicate: \"중복된 닉네임입니다.\",\n  },\n});\n\n// 비밀번호 필드\nconst signupPassword = usePasswordField(\"\", {\n  required: true,\n  errorMessages: {\n    empty: \"비밀번호를 입력해주세요.\",\n    invalid: \"비밀번호는 영문숫자 포함 8자 이상이어야 합니다.\",\n  },\n});\n\n// 비밀번호 확인 필드\nconst signupPasswordConfirm = usePasswordConfirmField(\"\", signupPassword, {\n  errorMessages: {\n    empty: \"비밀번호를 입력해주세요.\",\n    mismatch: \"비밀번호가 일치하지 않습니다.\",\n  },\n});\n\n// 추천인 코드 필드\nconst signupReferralCode = useFormField(\"\", {\n  required: true,\n  errorMessages: {\n    empty: \"추천인 코드를 입력해 주세요.\",\n    invalid: \"잘못된 추천인 코드입니다. 다시 확인해 주세요.\",\n    expired: \"이미 만료된 추천인 코드입니다.\",\n    self: \"본인의 코드는 추천인으로 등록할 수 없습니다.\",\n    \"server-error\": \"코드 확인 중 오류가 발생했습니다.\",\n  },\n});\n\n// 사용자 계약 동의 여부\nconst agreeToTerms = ref(false);\n\n// ===== 회원가입 폼 관리 =====\nconst signupForm = useFormValidation(\n  {\n    email: signupEmail,\n    nickname: signupNickname,\n    password: signupPassword,\n    passwordConfirm: signupPasswordConfirm,\n    referralCode: signupReferralCode,\n  },\n  {\n    additionalValidations: [\n      {\n        condition: agreeToTerms.value,\n        field: null,\n        errorCode: \"terms-required\",\n      },\n    ],\n    onSubmit: async (values) => {\n      // TODO: 실제 회원가입 API 호출\n      // console.log(\"Signup attempt:\", values);\n      // 테스트용: 이메일 중복, 추천인 코드 에러 표시\n      signupEmail.setError(\"duplicate\");\n      signupReferralCode.setError(\"invalid\");\n      return false;\n    },\n  }\n);\n\n// 폼 유효성 검사 (사용자 계약 동의 포함)\nconst isSignupFormValid = computed(() => {\n  return signupForm.isFormValid.value && agreeToTerms.value;\n});\n\n// ===== 회원가입 함수 =====\n// 이메일 인증 버튼 클릭 핸들러\nconst handleEmailAuth = async () => {\n  await signupEmail.handleAuth();\n};\n\n// 가입 버튼 클릭 핸들러\nconst handleSignup = async () => {\n  await signupForm.handleSubmit();\n};\n\n// 회원가입 모달 열기\nconst openSignupModal = () => {\n  signupModal.value?.open();\n};\n\n// 회원가입 모달 닫기 시 폼 초기화\nconst handleSignupModalClose = () => {\n  // 에러 상태 초기화\n  signupEmail.reset();\n  signupNickname.reset();\n  signupPassword.reset();\n  signupPasswordConfirm.reset();\n  signupReferralCode.reset();\n  // 입력값 초기화\n  signupEmail.value.value = \"\";\n  signupNickname.value.value = \"\";\n  signupPassword.value.value = \"\";\n  signupPasswordConfirm.value.value = \"\";\n  signupReferralCode.value.value = \"\";\n  // 동의 체크박스 초기화\n  agreeToTerms.value = false;\n};\n\n\n// ===== Google Translate 관련 =====\nconst currentLang = ref(\"ko\");\nlet isComboReady = false;\nlet pendingLang = null;\nlet translateObserver = null;\n\n// 쿠키에서 googtrans 값 읽기\nconst getCookie = (name) => {\n  if (!process.client) return \"\";\n  const m = document.cookie.match(\"(^|;)\\\\s*\" + name + \"\\\\s*=\\\\s*([^;]+)\");\n  return m ? decodeURIComponent(m.pop()) : \"\";\n};\n\n// 현재 언어 업데이트\nconst updateCurrentLang = (langCode) => {\n  if (!process.client) return;\n  currentLang.value = langCode;\n  // HTML 태그의 lang 속성 업데이트\n  document.documentElement.setAttribute(\"lang\", langCode);\n};\n\n// Google Translate 초기화\nconst googleTranslateElementInit = () => {\n  if (!process.client) return;\n\n  // google 객체가 아직 없으면 잠시 대기\n  if (typeof google === \"undefined\" || !google.translate) {\n    setTimeout(googleTranslateElementInit, 100);\n    return;\n  }\n\n  new google.translate.TranslateElement(\n    {\n      pageLanguage: \"ko\",\n      includedLanguages: \"ko,en\",\n    },\n    \"google_translate_element\"\n  );\n\n  setTimeout(waitForGoogleTranslate, 500);\n};\n\n// Google Translate 콤보 박스 대기\nconst waitForGoogleTranslate = (attempts = 0) => {\n  if (!process.client) return;\n\n  const combo = document.querySelector(\".goog-te-combo\");\n\n  if (combo && combo.options.length > 1) {\n    isComboReady = true;\n\n    // 콤보 박스 change 이벤트 감지하여 currentLang 업데이트\n    combo.removeEventListener(\"change\", handleComboChange);\n    combo.addEventListener(\"change\", handleComboChange);\n\n    // 로딩 중 클릭해 둔 언어가 있으면 한 번만 자동 적용\n    if (pendingLang) {\n      const langToApply = pendingLang;\n      pendingLang = null;\n      setTimeout(() => {\n        triggerGoogleLanguage(langToApply);\n      }, 100);\n    }\n  } else if (attempts < 20) {\n    setTimeout(() => waitForGoogleTranslate(attempts + 1), 300);\n  } else {\n    // 최대 시도 횟수 초과 시에도 pendingLang이 있으면 처리\n    if (pendingLang) {\n      const langToApply = pendingLang;\n      pendingLang = null;\n      setTimeout(() => {\n        waitForGoogleTranslate(0);\n        setTimeout(() => {\n          if (isComboReady) {\n            triggerGoogleLanguage(langToApply);\n          }\n        }, 500);\n      }, 500);\n    }\n  }\n};\n\n// 콤보 박스 변경 이벤트 핸들러\nconst handleComboChange = (e) => {\n  if (!process.client) return;\n\n  const langCode = e.target.value;\n\n  // 값이 비어있거나(원본) 'ko'이면 한국어로 처리\n  if (!langCode || langCode === \"ko\") {\n    updateCurrentLang(\"ko\");\n  } else {\n    // ko,en이 아닌 언어는 제거하고 ko로 처리\n    if (langCode !== \"en\") {\n      updateCurrentLang(\"ko\");\n    } else {\n      updateCurrentLang(langCode);\n    }\n  }\n};\n\n// 언어 클릭 핸들러 (Vue 이벤트 핸들러용)\nconst handleLangClick = (e, langCode = null) => {\n  e.preventDefault();\n  e.stopPropagation();\n\n  // 마운트되지 않았으면 무시\n  if (!isMounted.value) {\n    return;\n  }\n\n  // 언어 코드가 직접 전달되지 않으면 data-lang 속성에서 찾기\n  let lang = langCode;\n\n  if (!lang) {\n    let target = e.currentTarget;\n\n    if (!target || !target.getAttribute(\"data-lang\")) {\n      target = e.target;\n    }\n\n    if (!target || !target.getAttribute(\"data-lang\")) {\n      target = e.target.closest(\"[data-lang]\");\n    }\n\n    lang = target?.getAttribute(\"data-lang\");\n  }\n\n  if (!lang || (lang !== \"ko\" && lang !== \"en\")) {\n    return;\n  }\n\n  // 이미 선택된 언어를 다시 클릭하면 무시\n  const tr = getCookie(\"googtrans\");\n  const isCurrentlyKorean =\n    !tr || tr === \"\" || tr === \"/ko/ko\" || tr.split(\"/\").pop() === \"ko\";\n  const isCurrentlyEnglish =\n    tr && tr.includes(\"/en\") && tr.split(\"/\").pop() === \"en\";\n\n  if (lang === \"ko\" && (currentLang.value === \"ko\" || isCurrentlyKorean)) {\n    return;\n  }\n\n  if (lang === \"en\" && (currentLang.value === \"en\" || isCurrentlyEnglish)) {\n    return;\n  }\n\n  // 콤보 박스가 준비되었는지 다시 확인\n  const combo = document.querySelector(\".goog-te-combo\");\n\n  if (!combo || !isComboReady || combo.options.length <= 1) {\n    // 아직 준비되지 않았으면 대기 상태로 저장하고 재시도\n    pendingLang = lang;\n    if (!combo) {\n      waitForGoogleTranslate();\n    }\n    return;\n  }\n\n  triggerGoogleLanguage(lang);\n\n  // 비로그인용 언어 메뉴 닫기\n  if (isLangMenuOpen.value) {\n    closeLangMenu();\n  }\n};\n\n// Google Translate 언어 변경 트리거\nconst triggerGoogleLanguage = (langCode) => {\n  if (!process.client) return;\n\n  const combo = document.querySelector(\".goog-te-combo\");\n\n  // 콤보 박스가 없거나 준비되지 않았으면 재시도\n  if (!combo || !isComboReady) {\n    pendingLang = langCode;\n    if (!combo) {\n      waitForGoogleTranslate();\n    }\n    return;\n  }\n\n  combo.value = langCode;\n\n  // change 이벤트를 두 번 발생\n  const evt = new Event(\"change\", {\n    bubbles: true,\n  });\n  combo.dispatchEvent(evt);\n  setTimeout(() => {\n    combo.dispatchEvent(evt);\n  }, 100);\n\n  // 콤보 재생성 시에도 다시 바인딩되도록 초기화\n  isComboReady = false;\n  setTimeout(waitForGoogleTranslate, 500);\n};\n\n// MutationObserver로 콤보 박스 DOM 변경 감지\nconst observeComboChanges = () => {\n  if (!process.client) return;\n\n  // 기존 옵저버가 있으면 제거\n  if (translateObserver) {\n    translateObserver.disconnect();\n    translateObserver = null;\n  }\n\n  const container = document.getElementById(\"google_translate_element\");\n  if (!container) return;\n\n  translateObserver = new MutationObserver(() => {\n    // 콤보 재생성 시 waitForGoogleTranslate 호출\n    waitForGoogleTranslate();\n  });\n\n  translateObserver.observe(container, {\n    childList: true,\n    subtree: true,\n  });\n};\n\n// ===== 더미 데이터 (잭팟 - 주석처리) =====\n// const jackpotBonusData = ref([\n//   { rank: 1, percentage: \"25%\", amount: \"5,000만원\" },\n//   { rank: 2, percentage: \"15%\", amount: \"3,000만원\" },\n//   { rank: 3, percentage: \"10%\", amount: \"2,000만원\" },\n//   { rank: 4, percentage: \"8%\", amount: \"1,600만원\" },\n//   { rank: 5, percentage: \"7%\", amount: \"1,400만원\" },\n//   { rank: 6, percentage: \"6%\", amount: \"1,200만원\" },\n//   { rank: 7, percentage: \"5%\", amount: \"1,000만원\" },\n//   { rank: 8, percentage: \"4%\", amount: \"800만원\" },\n//   { rank: 9, percentage: \"3%\", amount: \"600만원\" },\n//   { rank: 10, percentage: \"2%\", amount: \"400만원\" },\n//   {\n//     rank: \"11~20위\",\n//     percentage: \"각 1.5%\",\n//     amount: \"각 300만원 (총 3,000만원)\",\n//   },\n// ]);\n\n// const jackpotHistoryData = ref([\n//   { rank: 1, amount: \"50,000,000원\", winner: \"jon**\" },\n//   { rank: 2, amount: \"30,000,000원\", winner: \"김**\" },\n//   { rank: 3, amount: \"20,000,000원\", winner: \"tem**\" },\n//   { rank: 4, amount: \"16,000,000원\", winner: \"Ave**\" },\n//   { rank: 5, amount: \"14,000,000원\", winner: \"Ril**\" },\n//   { rank: 6, amount: \"12,000,000원\", winner: \"Cas**\" },\n//   { rank: 7, amount: \"10,000,000원\", winner: \"박**\" },\n//   { rank: 8, amount: \"8,000,000원\", winner: \"이**\" },\n//   { rank: 9, amount: \"6,000,000원\", winner: \"Mor**\" },\n//   { rank: 10, amount: \"4,000,000원\", winner: \"sky**\" },\n//   { rank: \"11위~20위\", amount: \"3,000,000원\", winner: \"cc**\", extra: \"외19명\" },\n// ]);\n\n// ===== Computed =====\nconst formatNotificationCount = (count) => {\n  if (count <= 0) return null;\n  return count > NOTIFICATION_MAX_DISPLAY\n    ? `+${NOTIFICATION_MAX_DISPLAY}`\n    : count;\n};\n\n// const jackpotNotificationCount = computed(() =>\n//   formatNotificationCount(unreadJackpotCount.value)\n// );\nconst chatNotificationCount = computed(() =>\n  formatNotificationCount(unreadChatCount.value)\n);\nconst notificationCount = computed(() =>\n  formatNotificationCount(unreadNotificationCount.value)\n);\n\n// const showJackpotNotification = computed(() => unreadJackpotCount.value > 0);\nconst showNotification = computed(() => unreadNotificationCount.value > 0);\n\n// ===== Watchers =====\nwatch(isChatOpen, (newValue) => {\n  if (process.client && newValue && unreadChatCount.value > 0) {\n    try {\n      unreadChatCount.value = 0;\n      // 알림 확인 처리\n    } catch (error) {\n      console.error(\"채팅 알림 확인 처리 실패:\", error);\n    }\n  }\n});\n\n// ===== 테마 관리 =====\nconst setTheme = (theme) => {\n  let themeToSet = theme;\n\n  // 같은 버튼을 클릭하면 반대 테마로 토글\n  if (currentTheme.value === theme) {\n    themeToSet = theme === \"dark\" ? \"light\" : \"dark\";\n  }\n\n  currentTheme.value = themeToSet;\n\n  if (process.client) {\n    document.documentElement.setAttribute(\"data-theme\", themeToSet);\n    storage.setStorage(THEME_STORAGE_KEY, themeToSet);\n  }\n};\n\nconst initTheme = () => {\n  if (!process.client) return;\n\n  const savedTheme = storage.getStorage(THEME_STORAGE_KEY);\n  if (savedTheme && (savedTheme === \"dark\" || savedTheme === \"light\")) {\n    currentTheme.value = savedTheme;\n    document.documentElement.setAttribute(\"data-theme\", savedTheme);\n  } else {\n    currentTheme.value = \"dark\";\n    document.documentElement.setAttribute(\"data-theme\", \"dark\");\n    storage.setStorage(THEME_STORAGE_KEY, \"dark\");\n  }\n};\n\n// ===== 알림 관리 =====\nconst fetchNotificationCounts = async () => {\n  try {\n    await fetchUnreadCount();\n  } catch (error) {\n    console.error(\"알림 개수 조회 실패:\", error);\n  }\n};\n\n// const markJackpotAsRead = () => {\n//   if (process.client && unreadJackpotCount.value > 0) {\n//     try {\n//       unreadJackpotCount.value = 0;\n//       // 알림 확인 처리\n//     } catch (error) {\n//       console.error(\"잭팟 알림 확인 처리 실패:\", error);\n//     }\n//   }\n// };\n\n// ===== 잭팟 모달 관리 (주석처리) =====\n// const fetchJackpotRank = async () => {\n//   try {\n//     jackpotRank.value = {\n//       rank: 45,\n//       direction: \"down\",\n//       percentage: 4.33,\n//     };\n//   } catch (error) {\n//     console.error(\"잭팟 순위 조회 실패:\", error);\n//   }\n// };\n\n// const closeJackpotModalIfOpen = () => {\n//   if (jackpotModal.value?.isOpened()) {\n//     jackpotModal.value?.close();\n//   }\n// };\n\n// const openJackpotModal = async () => {\n//   await fetchJackpotRank();\n//   jackpotModal.value?.open();\n//   markJackpotAsRead();\n// };\n\n// const openJackpotHistoryModal = () => {\n//   closeJackpotModalIfOpen();\n//   jackpotHistoryModal.value?.open();\n// };\n\n// const reopenJackpotModal = () => {\n//   jackpotModal.value?.open();\n// };\n\n// const openJackpotBonusModal = () => {\n//   closeJackpotModalIfOpen();\n//   jackpotBonusModal.value?.open();\n// };\n\n// const openJackpotRankStandardModal = () => {\n//   closeJackpotModalIfOpen();\n//   jackpotRankStandardModal.value?.open();\n// };\n\n// ===== 스크롤 관리 =====\nconst handleScroll = () => {\n  if (process.client) {\n    // .main 요소의 스크롤 위치 확인\n    const mainElement = mainElementRef.value || document.querySelector(\".main\");\n    if (mainElement) {\n      const scrollTop = mainElement.scrollTop;\n      isScrolled.value = scrollTop > 0;\n    } else {\n      // fallback: window 스크롤 (기존 방식)\n      const scrollTop =\n        window.pageYOffset || document.documentElement.scrollTop;\n      isScrolled.value = scrollTop > 0;\n    }\n  }\n};\n\n// ===== 유저 메뉴 관리 =====\nconst toggleUserMenu = () => {\n  isUserMenuOpen.value = !isUserMenuOpen.value;\n};\n\nconst closeUserMenu = () => {\n  isUserMenuOpen.value = false;\n};\n\n// 언어 서브메뉴 토글\nconst toggleLangSubmenu = () => {\n  isLangSubmenuOpen.value = !isLangSubmenuOpen.value;\n};\n\nconst closeLangSubmenu = () => {\n  isLangSubmenuOpen.value = false;\n};\n\n// 비로그인용 언어 메뉴 토글\nconst toggleLangMenu = () => {\n  isLangMenuOpen.value = !isLangMenuOpen.value;\n};\n\nconst closeLangMenu = () => {\n  isLangMenuOpen.value = false;\n};\n\n// 사운드 토글\n// const toggleSound = () => {\n//   isSoundOn.value = !isSoundOn.value;\n//   // localStorage에 저장\n//   if (process.client) {\n//     localStorage.setItem(SOUND_STORAGE_KEY, isSoundOn.value ? 'on' : 'off');\n//   }\n// };\n\n// 외부 클릭 시 메뉴 닫기\nconst handleClickOutside = (event) => {\n  if (process.client) {\n    const userMenuElement = event.target.closest(\".header__gnb-user-menu\");\n    const userButtonElement = event.target.closest(\".header__gnb-user\");\n    const langSubmenuElement = event.target.closest(\n      \".header__gnb-user-submenu\"\n    );\n    const langButtonElement = event.target.closest(\n      \".header__gnb-user-menu-link.ico-before.ico-language\"\n    );\n    const langMenuButtonElement = event.target.closest(\".header__gnb-language\");\n\n    if (isUserMenuOpen.value && !userMenuElement && !userButtonElement) {\n      closeUserMenu();\n    }\n\n    // 언어 서브메뉴 외부 클릭 시 닫기\n    if (isLangSubmenuOpen.value && !langSubmenuElement && !langButtonElement) {\n      closeLangSubmenu();\n    }\n\n    // 비로그인용 언어 메뉴 외부 클릭 시 닫기\n    if (isLangMenuOpen.value && !userMenuElement && !langMenuButtonElement) {\n      closeLangMenu();\n    }\n  }\n};\n\n// 로그아웃\nconst handleLogout = () => {\n  logout();\n  navigateTo(\"/\");\n};\n\n// Socket.io 연결\nconst { connect, on, disconnect } = useSocket();\nlet socketInstance = null;\n\n// ===== Lifecycle Hooks =====\nonMounted(async () => {\n  if (process.client) {\n    // Auth 초기화를 가장 먼저 수행\n    initializeAuth();\n\n    isMounted.value = true;\n\n    initTheme();\n\n    // 사운드 설정 불러오기\n    // const savedSound = localStorage.getItem(SOUND_STORAGE_KEY);\n    // if (savedSound) {\n    //   isSoundOn.value = savedSound === 'on';\n    // }\n\n    await fetchNotificationCounts();\n\n    // Socket.io 연결 및 잔액 업데이트 구독\n    if (isLoggedIn.value && currentUser.value) {\n      socketInstance = connect(\n        currentUser.value.id,\n        currentUser.value.nickname,\n        currentUser.value.avatar\n      );\n\n      // 잔액 업데이트 이벤트 구독\n      on('balance:update', (data) => {\n        // // console.log('[Header] Balance updated:', data.balance);\n        if (data.balance !== undefined) {\n          // useAuth의 updateBalance 사용\n          updateBalance(Number(data.balance));\n        }\n      });\n    }\n\n    // .main 요소 찾기\n    await nextTick();\n    const mainElement = document.querySelector(\".main\");\n    if (mainElement) {\n      mainElementRef.value = mainElement;\n      // 초기 스크롤 위치 확인\n      handleScroll();\n      // .main 요소의 스크롤 이벤트 리스너 등록\n      mainElement.addEventListener(\"scroll\", handleScroll, { passive: true });\n    } else {\n      // fallback: window 스크롤 (기존 방식)\n      handleScroll();\n      window.addEventListener(\"scroll\", handleScroll, { passive: true });\n    }\n\n    // 외부 클릭 이벤트 리스너 등록\n    document.addEventListener(\"click\", handleClickOutside);\n\n    // Google Translate 요소 동적 생성 (hydration mismatch 방지)\n    const translateElement = document.getElementById(\n      \"google_translate_element\"\n    );\n    if (!translateElement) {\n      const div = document.createElement(\"div\");\n      div.id = \"google_translate_element\";\n      document.body.appendChild(div);\n    }\n\n    // Google Translate 초기화\n    await nextTick();\n\n    window.googleTranslateElementInit = googleTranslateElementInit;\n\n    // 이미 로드되어 있다면 바로 초기화\n    if (typeof google !== \"undefined\" && google.translate) {\n      googleTranslateElementInit();\n    }\n\n    // MutationObserver 시작\n    observeComboChanges();\n\n    // 페이지 로드 시 현재 언어 초기화\n    const tr = getCookie(\"googtrans\");\n    const parts = tr.split(\"/\");\n    let currentLangFromCookie = parts.pop() || \"ko\";\n    // ko,en이 아닌 언어는 ko로 처리\n    if (currentLangFromCookie !== \"ko\" && currentLangFromCookie !== \"en\") {\n      currentLangFromCookie = \"ko\";\n    }\n    updateCurrentLang(currentLangFromCookie);\n  }\n});\n\nonUnmounted(() => {\n  if (process.client) {\n    // .main 요소의 스크롤 이벤트 리스너 제거\n    if (mainElementRef.value) {\n      mainElementRef.value.removeEventListener(\"scroll\", handleScroll);\n    } else {\n      // fallback: window 스크롤 리스너 제거\n      window.removeEventListener(\"scroll\", handleScroll);\n    }\n    document.removeEventListener(\"click\", handleClickOutside);\n\n    // MutationObserver 정리\n    if (translateObserver) {\n      translateObserver.disconnect();\n      translateObserver = null;\n    }\n\n    // Vue의 @click 핸들러를 사용하므로 DOM 이벤트 리스너 제거 불필요\n    // (Vue가 자동으로 정리함)\n\n    // 콤보 박스 이벤트 리스너 제거\n    const combo = document.querySelector(\".goog-te-combo\");\n    if (combo) {\n      combo.removeEventListener(\"change\", handleComboChange);\n    }\n\n    // 전역 콜백 함수 제거\n    if (window.googleTranslateElementInit) {\n      delete window.googleTranslateElementInit;\n    }\n  }\n});\n</script>\n\n<template>\n  <header class=\"header\" :class=\"{ 'header--active': isScrolled }\">\n    <!-- 로고 -->\n    <h1 class=\"header__logo\">\n      <NuxtLink to=\"/\">\n        <span class=\"blind\">BITUP</span>\n      </NuxtLink>\n    </h1>\n    <!-- GNB -->\n    <nav class=\"header__gnb\">\n      <ul class=\"header__gnb-list\">\n        <!-- isMounted && isAuthInitialized 체크 추가 -->\n        <template v-if=\"isMounted && isAuthInitialized\">\n          <template v-if=\"!isLoggedIn\">\n            <li class=\"header__gnb-item\">\n              <button type=\"button\" class=\"header__gnb-link btn-gray btn-sm\" @click=\"openLoginModal\">\n                로그인\n              </button>\n            </li>\n            <li class=\"header__gnb-item\">\n              <button type=\"button\" class=\"header__gnb-link btn-primary btn-sm\" @click=\"openSignupModal\">가입</button>\n            </li>\n          </template>\n          <li v-if=\"isLoggedIn\" class=\"header__gnb-item\">\n            <!-- 크레딧 -->\n            <div class=\"header__gnb-credit\">\n              <div class=\"header__gnb-credit-info\">\n                <i class=\"ico-wallet\"></i>\n                <span>₩ {{ Number(currentUser?.balance || 0).toLocaleString('ko-KR') }}</span>\n              </div>\n              <button type=\"button\" class=\"btn-primary btn-sm\">충전</button>\n            </div>\n          </li>\n          <template v-if=\"!isMobile\">\n            <!-- 잭팟 보너스 (주석처리) -->\n            <!-- <li v-if=\"isLoggedIn\" class=\"header__gnb-item\">\n              <button type=\"button\" class=\"btn-ghost btn-sm ico-before ico-jackpot\" @click=\"openJackpotModal\">\n                <span class=\"blind\">잭팟 보너스</span>\n                <i v-if=\"showJackpotNotification\" class=\"notification\" :class=\"{ 'notification-overflow': unreadJackpotCount > 99 }\">\n                  {{ jackpotNotificationCount }}\n                </i>\n              </button>\n            </li> -->\n            <li class=\"header__gnb-item\">\n              <!-- 채팅 -->\n              <button type=\"button\" class=\"btn-ghost btn-sm ico-before ico-chat\" :class=\"{ active: isChatOpen }\" @click=\"toggleChat\">\n                <span class=\"blind\">채팅</span>\n                <i v-if=\"chatNotificationCount\" class=\"notification\" :class=\"{ 'notification-overflow': unreadChatCount > 99 }\">\n                  {{ chatNotificationCount }}\n                </i>\n              </button>\n            </li>\n            <li v-if=\"isLoggedIn\" class=\"header__gnb-item\">\n              <!-- 알림 -->\n              <button type=\"button\" class=\"btn-ghost btn-sm ico-before ico-bell\" :class=\"{ active: isNotificationOpen }\" @click=\"toggleNotification\">\n                <span class=\"blind\">알림</span>\n                <i v-if=\"showNotification\" class=\"notification\" :class=\"{\n                  'notification-overflow': unreadNotificationCount > 99,\n                }\">\n                  {{ notificationCount }}\n                </i>\n              </button>\n            </li>\n            <!-- <li class=\"header__gnb-item\">\n              사운드\n              <button type=\"button\" class=\"header__gnb-sound btn-ghost btn-sm ico-before\" :class=\"{\n                'ico-sound-on': isSoundOn,\n                'ico-sound-off': !isSoundOn,\n              }\" @click=\"toggleSound\">\n                {{ isSoundOn ? \"ON\" : \"OFF\" }}\n              </button>\n            </li> -->\n            <li v-if=\"!isLoggedIn\" class=\"header__gnb-item\">\n              <!-- 언어 -->\n              <button type=\"button\" class=\"header__gnb-language btn-ghost btn-sm ico-before ico-language\" :class=\"{ active: isLangMenuOpen }\" @click=\"toggleLangMenu\">\n                <span class=\"blind\">언어</span>\n              </button>\n\n              <AnimatePresence>\n                <motion.div v-if=\"isLangMenuOpen\" key=\"lang-menu\" class=\"header__gnb-user-menu\" :initial=\"{\n                  opacity: 0,\n                  y: -10,\n                }\" :animate=\"{\n                  opacity: 1,\n                  y: 0,\n                  transition: {\n                    type: 'spring',\n                    stiffness: 300,\n                    damping: 20,\n                    mass: 0.5,\n                  },\n                }\" :exit=\"{\n                  opacity: 0,\n                  y: -10,\n                  transition: {\n                    duration: 0.15,\n                    ease: [0.4, 0, 0.2, 1],\n                  },\n                }\">\n                  <ul class=\"header__gnb-user-menu-list\">\n                    <li class=\"header__gnb-user-menu-item\">\n                      <button type=\"button\" class=\"header__gnb-user-submenu-link\" :class=\"{ active: isMounted && currentLang === 'ko' }\" data-lang=\"ko\" @click=\"(e) => handleLangClick(e, 'ko')\">\n                        한국어\n                      </button>\n                    </li>\n                    <li class=\"header__gnb-user-menu-item\">\n                      <button type=\"button\" class=\"header__gnb-user-submenu-link\" :class=\"{ active: isMounted && currentLang === 'en' }\" data-lang=\"en\" @click=\"(e) => handleLangClick(e, 'en')\">\n                        English(영어)\n                      </button>\n                    </li>\n                  </ul>\n                </motion.div>\n              </AnimatePresence>\n            </li>\n            <li class=\"header__gnb-item\">\n              <!-- 테마 -->\n              <div class=\"header__gnb-theme btn-ghost btn-sm\">\n                <button type=\"button\" class=\"btn-dark ico-before ico-moon\" :class=\"{ active: currentTheme === 'dark' }\" @click=\"setTheme('dark')\">\n                  <span class=\"blind\">다크 모드</span>\n                </button>\n                <button type=\"button\" class=\"btn-light ico-before ico-sun\" :class=\"{ active: currentTheme === 'light' }\" @click=\"setTheme('light')\">\n                  <span class=\"blind\">라이트 모드</span>\n                </button>\n              </div>\n            </li>\n          </template>\n          <li v-if=\"isLoggedIn\" class=\"header__gnb-item\">\n            <!-- 유저 -->\n            <button type=\"button\" class=\"header__gnb-user\" @click=\"toggleUserMenu\">\n              <img :src=\"avatarUrl\" :alt=\"currentUser?.nickname || 'user'\" @error=\"handleAvatarError\" />\n            </button>\n            <AnimatePresence>\n              <motion.div v-if=\"isUserMenuOpen\" key=\"user-menu\" class=\"header__gnb-user-menu\" :initial=\"{\n                opacity: 0,\n                y: -10,\n              }\" :animate=\"{\n                opacity: 1,\n                y: 0,\n                transition: {\n                  type: 'spring',\n                  stiffness: 300,\n                  damping: 20,\n                  mass: 0.5,\n                },\n              }\" :exit=\"{\n                opacity: 0,\n                y: -10,\n                transition: {\n                  duration: 0.15,\n                  ease: [0.4, 0, 0.2, 1],\n                },\n              }\">\n                <ul class=\"header__gnb-user-menu-list\">\n                  <li class=\"header__gnb-user-menu-item\">\n                    <NuxtLink to=\"/mypage\" class=\"header__gnb-user-menu-link ico-before ico-user-thin\">프로필</NuxtLink>\n                  </li>\n                  <li class=\"header__gnb-user-menu-item\">\n                    <NuxtLink to=\"/mypage/billing\" class=\"header__gnb-user-menu-link ico-before ico-prefix\">입/출금</NuxtLink>\n                  </li>\n                  <li class=\"header__gnb-user-menu-item\">\n                    <NuxtLink to=\"/mypage/history\" class=\"header__gnb-user-menu-link ico-before ico-history\">배팅내역</NuxtLink>\n                  </li>\n                  <li class=\"header__gnb-user-menu-item\">\n                    <button type=\"button\" class=\"header__gnb-user-menu-link ico-before ico-language\" :class=\"{ active: isLangSubmenuOpen }\" @click=\"toggleLangSubmenu\">\n                      언어변경\n                      <i class=\"ico-chevron-down\"></i>\n                    </button>\n                    <AnimatePresence>\n                      <motion.ul v-if=\"isLangSubmenuOpen\" key=\"lang-submenu\" class=\"header__gnb-user-submenu\" :initial=\"{\n                        opacity: 0,\n                        y: -10,\n                      }\" :animate=\"{\n                        opacity: 1,\n                        y: 0,\n                        transition: {\n                          type: 'spring',\n                          stiffness: 300,\n                          damping: 20,\n                          mass: 0.5,\n                        },\n                      }\" :exit=\"{\n                        opacity: 0,\n                        y: -10,\n                        transition: {\n                          duration: 0.15,\n                          ease: [0.4, 0, 0.2, 1],\n                        },\n                      }\">\n                  <li class=\"header__gnb-user-submenu-item\">\n                    <button type=\"button\" class=\"header__gnb-user-submenu-link\" :class=\"{ active: isMounted && currentLang === 'ko' }\" data-lang=\"ko\" @click=\"(e) => handleLangClick(e, 'ko')\">\n                      한국어\n                    </button>\n                  </li>\n                  <li class=\"header__gnb-user-submenu-item\">\n                    <button type=\"button\" class=\"header__gnb-user-submenu-link\" :class=\"{ active: isMounted && currentLang === 'en' }\" data-lang=\"en\" @click=\"(e) => handleLangClick(e, 'en')\">\n                      English(영어)\n                    </button>\n                  </li>\n                  </motion.ul>\n            </AnimatePresence>\n          </li>\n          <li class=\"header__gnb-user-menu-item\">\n            <button type=\"button\" class=\"header__gnb-user-menu-link header__gnb-user-menu-link--logout ico-before ico-logout\" @click=\"handleLogout\">\n              로그아웃\n            </button>\n          </li>\n      </ul>\n      </motion.div>\n      </AnimatePresence>\n      </li>\n</template>\n</ul>\n</nav>\n</header>\n\n<!-- 모바일 GNB -->\n<nav v-if=\"isMobile\" class=\"header__mobile-gnb\">\n  <ul class=\"header__mobile-gnb-list\">\n    <li class=\"header__mobile-gnb-item\">\n      <!-- 홈 -->\n      <NuxtLink to=\"/\" class=\"header__mobile-gnb-btn header__mobile-gnb-btn--home ico-before ico-home-m\">\n        홈\n      </NuxtLink>\n    </li>\n    <!-- 잭팟 (주석처리) -->\n    <!-- <li class=\"header__mobile-gnb-item\">\n      <button type=\"button\" class=\"header__mobile-gnb-btn header__mobile-gnb-btn--jackpot ico-before ico-jackpot-m\" @click=\"openJackpotModal\">\n        <span>잭팟</span>\n        <i v-if=\"showJackpotNotification\" class=\"notification\" :class=\"{ 'notification-overflow': unreadJackpotCount > 99 }\">\n          {{ jackpotNotificationCount }}\n        </i>\n      </button>\n    </li> -->\n    <li class=\"header__mobile-gnb-item\">\n      <!-- 채팅 -->\n      <button type=\"button\" class=\"header__mobile-gnb-btn header__mobile-gnb-btn--chat ico-before ico-chat-m\" :class=\"{ active: isChatOpen }\" @click=\"toggleChat\">\n        <span>채팅</span>\n        <i v-if=\"chatNotificationCount\" class=\"notification\" :class=\"{ 'notification-overflow': unreadChatCount > 99 }\">\n          {{ chatNotificationCount }}\n        </i>\n      </button>\n    </li>\n    <li class=\"header__mobile-gnb-item\">\n      <!-- 알림 -->\n      <button type=\"button\" class=\"header__mobile-gnb-btn header__mobile-gnb-btn--bell ico-before ico-bell-m\" :class=\"{ active: isNotificationOpen }\" @click=\"toggleNotification\">\n        <span>알림</span>\n        <i v-if=\"notificationCount\" class=\"notification\" :class=\"{\n          'notification-overflow': unreadNotificationCount > 99,\n        }\">\n          {{ notificationCount }}\n        </i>\n      </button>\n    </li>\n  </ul>\n  <i class=\"header__mobile-gnb-bar\"></i>\n</nav>\n\n<!-- 잭팟 보너스 모달 (주석처리) -->\n<!-- <Modal ref=\"jackpotModal\" title=\"잭팟 보너스 (Friday Jackpot)\" type=\"a\">\n  <template #default=\"{ close }\">\n    <div class=\"modal__content-top\">\n      <p>\n        매주 금요일, 주간 손실\n        <strong class=\"point-yellow\">TOP 20에게 총 2억원</strong>을\n        지급합니다.\n      </p>\n    </div>\n    <div class=\"modal__content-body\">\n      <div class=\"modal__jackpot\">\n        <div class=\"modal__jackpot-header\">\n          <p class=\"modal__jackpot-title\">\n            <strong>Jonston님</strong>\n            <span>의 잭팟 당첨 순위</span>\n            <button type=\"button\" class=\"modal__jackpot-question ico-question\" @click=\"openJackpotRankStandardModal\">\n              <span class=\"blind\">잭팟 당첨 순위 기준</span>\n            </button>\n          </p>\n        </div>\n        <div class=\"modal__jackpot-body\">\n          <div class=\"modal__jackpot-rank\" :class=\"`modal__jackpot-rank--${jackpotRank.direction}`\">\n            <strong>{{ jackpotRank.rank }}위</strong>\n            <span class=\"badge badge-chart ico-before\" :class=\"[\n              `badge--${jackpotRank.direction}`,\n              `ico-${jackpotRank.direction}`,\n            ]\"></span>\n            <span class=\"badge\" :class=\"`badge--${jackpotRank.direction}`\">\n              {{\n                jackpotRank.percentage > 0\n                  ? `+${jackpotRank.percentage}%`\n                  : `${jackpotRank.percentage}%`\n              }}\n            </span>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class=\"modal__content-footer modal__content-footer--start\">\n      <button type=\"button\" class=\"btn-primary\" @click=\"openJackpotHistoryModal\">\n        잭팟 지급내역\n      </button>\n      <button type=\"button\" class=\"btn-gray\" @click=\"openJackpotBonusModal\">\n        보너스 지급표\n      </button>\n    </div>\n    <div class=\"modal__jackpot-thumb\">\n      <img src=\"@/assets/images/jackpot.png\" alt=\"잭팟 썸네일\" />\n    </div>\n  </template>\n</Modal> -->\n\n<!-- 잭팟 지급 내역 모달 (주석처리) -->\n<!-- <Modal ref=\"jackpotHistoryModal\" title=\"잭팟 지급 내역\" type=\"a\" :previous-modal=\"reopenJackpotModal\">\n  <template #default=\"{ close }\">\n    <div class=\"modal__content-top\">\n      <p>\n        {{ jackpotHistoryMeta.round }}회차 결과 :\n        {{ jackpotHistoryMeta.startDate }}\n        <strong class=\"point-primary\">\n          {{ jackpotHistoryMeta.startTime }} ~\n          {{ jackpotHistoryMeta.endDate }}</strong>\n      </p>\n    </div>\n    <div class=\"modal__content-body\">\n      <div class=\"modal__jackpot\">\n        <div class=\"modal__jackpot-table-wrap\">\n          <table class=\"modal__jackpot-table\">\n            <caption class=\"modal__jackpot-table-caption\">\n              <p>\n                <strong class=\"point-primary\">{{ jackpotHistoryMeta.round }}회차</strong>\n                당첨자\n              </p>\n            </caption>\n            <colgroup>\n              <col width=\"90px\" />\n              <col />\n              <col width=\"120px\" />\n            </colgroup>\n            <thead>\n              <tr>\n                <th class=\"modal__jackpot-table-th\">순위</th>\n                <th class=\"modal__jackpot-table-th\">등위별 당첨금액</th>\n                <th class=\"modal__jackpot-table-th\">당첨자</th>\n              </tr>\n            </thead>\n            <tbody>\n              <tr v-for=\"(item, index) in jackpotHistoryData\" :key=\"index\">\n                <td class=\"modal__jackpot-table-td\" :class=\"{ 'modal__jackpot-table-td--primary': index < 3 }\">\n                  {{\n                    typeof item.rank === \"number\"\n                      ? `${item.rank}위`\n                      : item.rank\n                  }}\n                </td>\n                <td class=\"modal__jackpot-table-td\" :class=\"{ 'modal__jackpot-table-td--primary': index < 3 }\">\n                  {{ item.amount }}\n                </td>\n                <td class=\"modal__jackpot-table-td\">\n                  {{ item.winner }}\n                  <span v-if=\"item.extra\">{{ item.extra }}</span>\n                </td>\n              </tr>\n            </tbody>\n          </table>\n        </div>\n      </div>\n    </div>\n  </template>\n</Modal> -->\n\n<!-- Friday Jacpot 보너스 지급표 모달 (주석처리) -->\n<!-- <Modal ref=\"jackpotBonusModal\" title=\"Friday Jacpot 보너스 지급표\" type=\"a\">\n  <template #default=\"{ close }\">\n    <div class=\"modal__content-top\">\n      <p>\n        매주 금요일, 주간 손실\n        <strong class=\"point-yellow\">TOP 20에게 총 2억원</strong>을 아래와\n        같이 지급하며, <br v-if=\"!isMobile\" />\n        보너스 당청금은 테더(USDT)로 입금합니다.\n      </p>\n    </div>\n    <div class=\"modal__content-body\">\n      <div class=\"modal__jackpot\">\n        <ul class=\"modal__jackpot-bonus-list\">\n          <li v-for=\"(item, index) in jackpotBonusData\" :key=\"index\" class=\"modal__jackpot-bonus-item\">\n            <span :class=\"{ 'modal__jackpot-bonus-item--primary': index < 3 }\">\n              {{\n                typeof item.rank === \"number\" ? `${item.rank}위` : item.rank\n              }}\n              {{ item.percentage }} = {{ item.amount }}\n            </span>\n          </li>\n        </ul>\n        <p class=\"modal__jackpot-bonus-note\">\n          지급 금액은 운영 정책에 따라 변동될 수 있으며, <br />\n          최종 지급 내역은 <strong>\"내 보너스 내역\"</strong>에서 확인\n          가능합니다.\n        </p>\n      </div>\n    </div>\n    <div class=\"modal__content-footer modal__content-footer--end\">\n      <button type=\"button\" class=\"btn-gray\" @click=\"close\">닫기</button>\n      <NuxtLink to=\"/mypage/wallet\" class=\"btn-primary\">내 보너스 내역</NuxtLink>\n    </div>\n  </template>\n</Modal> -->\n\n<!-- 잭팟 당첨 순위 기준 모달 (주석처리) -->\n<!-- <Modal ref=\"jackpotRankStandardModal\" title=\"잭팟 당첨 순위 기준\" type=\"a\" :previous-modal=\"reopenJackpotModal\">\n  <template #default=\"{ close }\">\n    <div class=\"modal__content-top\">\n      <p>\n        집계 기간 : 매주\n        <strong class=\"point-primary\">금요일 00:00:00 ~ 목요일 23:59:59</strong>\n        (KST)\n      </p>\n      <p>\n        발표/지급 : 매주\n        <strong class=\"point-primary\">금요일 12:00</strong> 자동 지급\n      </p>\n    </div>\n    <div class=\"modal__content-body\">\n      <div class=\"modal__jackpot\">\n        <div class=\"modal__jackpot-alert\">\n          <strong class=\"modal__jackpot-alert-title\">산정 방식(주간 순손실)</strong>\n          <div class=\"modal__jackpot-alert-desc\">\n            <p>주간 순손실 = 주간 총 베팅금 - 주간 당첨금(수익)</p>\n            <p>\n              집계 대상 : 프로모션/무료지급/보너스성 크레딧, 운영정책\n              위반/어뷰징 계정\n            </p>\n          </div>\n        </div>\n\n        <div class=\"modal__jackpot-alert\">\n          <strong class=\"modal__jackpot-alert-title\">동점 처리</strong>\n          <div class=\"modal__jackpot-alert-desc\">\n            <p>1순위 : 주간 순손실이 큰 유저</p>\n            <p>동점 시 : 총 베팅금이 큰 유저 우선</p>\n            <p>\n              그래도 동점 시 : 먼저 해당 손실을 기록한 유저 우선, 또는 공동\n              순위 처리\n            </p>\n          </div>\n        </div>\n      </div>\n    </div>\n  </template>\n</Modal> -->\n\n<Modal ref=\"loginModal\" title=\"로그인\" type=\"c\" @close=\"handleLoginModalClose\">\n  <template #default=\"{ close }\">\n    <div class=\"modal__content-body modal__content-body--login\">\n      <div class=\"auth__wrap\">\n        <h1 class=\"auth__logo\">\n          <span class=\"blind\">BITUP</span>\n        </h1>\n\n        <!-- 로그인 폼 화면 -->\n        <div class=\"login__form-wrapper\">\n          <div class=\"login__form\">\n            <div class=\"login__form-item\">\n              <label for=\"login-email\" class=\"login__form-label\">Account</label>\n              <input ref=\"email.inputRef\" type=\"text\" class=\"input-text input-lg\" :class=\"{\n                'input-error': email.isError.value,\n                'input-shake': email.shakeKey.value > 0,\n              }\" :key=\"`email-${email.shakeKey.value}`\" id=\"login-email\" placeholder=\"계정을 입력해주세요.\" v-model=\"email.value.value\" @keyup.enter=\"handleLogin\" />\n              <Transition name=\"error\">\n                <span v-if=\"email.isError.value\" class=\"login__form-error\">\n                  {{ email.errorMessage.value }}\n                </span>\n              </Transition>\n            </div>\n\n            <div class=\"login__form-item\">\n              <label for=\"login-password\" class=\"login__form-label\">Password</label>\n              <div class=\"login__eye-wrap\">\n                <input ref=\"password.inputRef\" :type=\"showPassword ? 'text' : 'password'\" class=\"input-text input-lg input-pw\" :class=\"{\n                  'input-error': password.isError.value,\n                  'input-shake': password.shakeKey.value > 0,\n                }\" :key=\"`password-${password.shakeKey.value}`\" id=\"login-password\" placeholder=\"비밀번호를 입력해주세요.\" v-model=\"password.value.value\" @keyup.enter=\"handleLogin\" />\n                <button v-show=\"password.value.value.length > 0\" type=\"button\" class=\"login__eye\" :class=\"showPassword ? 'ico-eye-active' : 'ico-eye'\n                  \" @click=\"togglePassword\">\n                  <span class=\"blind\">비밀번호 보기</span>\n                </button>\n              </div>\n              <Transition name=\"error\">\n                <span v-if=\"password.isError.value\" class=\"login__form-error\">\n                  {{ password.errorMessage.value }}\n                </span>\n              </Transition>\n            </div>\n\n            <div>\n              <button type=\"button\" class=\"login__form-link\" @click=\"openPasswordRequestModal\">비밀번호를 잊어버리셨나요?</button>\n            </div>\n\n            <div class=\"login__form-btn\">\n              <button type=\"button\" class=\"btn-primary btn-block btn-md\" @click=\"handleLogin\">\n                로그인\n              </button>\n              <div class=\"login__form-text\">\n                <span>BITUP이 처음이신가요?</span>\n                <button type=\"button\" class=\"login__form-text-link\" @click=\"openSignupModal\">계정 만들기</button>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </template>\n</Modal>\n\n<Modal ref=\"signupModal\" title=\"계정만들기\" type=\"c\" @close=\"handleSignupModalClose\">\n  <template #default=\"{ close }\">\n    <div class=\"modal__content-body modal__content-body--login\">\n      <div class=\"login__form\">\n        <!-- 이메일 주소 -->\n        <div class=\"login__form-item\">\n          <label for=\"signup-email\" class=\"login__form-label\">이메일 주소</label>\n          <div class=\"login__form-item-wrap\">\n            <input ref=\"signupEmail.inputRef\" type=\"email\" class=\"input-text input-lg\" :class=\"{\n              'input-error': signupEmail.isError.value,\n              'input-shake': signupEmail.shakeKey.value > 0,\n            }\" :key=\"`email-${signupEmail.shakeKey.value}`\" id=\"signup-email\" placeholder=\"이메일주소를 입력하세요.\" v-model=\"signupEmail.value.value\" @keyup.enter=\"handleSignup\" />\n            <button type=\"button\" class=\"btn-primary btn-md\" @click=\"handleEmailAuth\">\n              인증\n            </button>\n          </div>\n          <Transition name=\"error\">\n            <span v-if=\"signupEmail.isError.value\" class=\"login__form-error\">\n              {{ signupEmail.errorMessage.value }}\n            </span>\n          </Transition>\n        </div>\n        <!-- 닉네임 -->\n        <div class=\"login__form-item\">\n          <label for=\"signup-nickname\" class=\"login__form-label\">닉네임</label>\n          <input ref=\"signupNickname.inputRef\" type=\"text\" class=\"input-text input-lg\" :class=\"{\n            'input-error': signupNickname.isError.value,\n            'input-shake': signupNickname.shakeKey.value > 0,\n          }\" :key=\"`nickname-${signupNickname.shakeKey.value}`\" id=\"signup-nickname\" placeholder=\"닉네임을 입력하세요.\" v-model=\"signupNickname.value.value\" @keyup.enter=\"handleSignup\" />\n          <Transition name=\"error\">\n            <span v-if=\"signupNickname.isError.value\" class=\"login__form-error\">\n              {{ signupNickname.errorMessage.value }}\n            </span>\n          </Transition>\n        </div>\n        <!-- 비밀번호 -->\n        <div class=\"login__form-item\">\n          <label for=\"signup-password\" class=\"login__form-label\">비밀번호</label>\n          <div class=\"login__eye-wrap\">\n            <input ref=\"signupPassword.inputRef\" :type=\"signupPassword.showPassword.value ? 'text' : 'password'\" class=\"input-text input-lg input-pw\" :class=\"{\n              'input-error': signupPassword.isError.value,\n              'input-shake': signupPassword.shakeKey.value > 0,\n            }\" :key=\"`password-${signupPassword.shakeKey.value}`\" id=\"signup-password\" placeholder=\"비밀번호를 입력해주세요.\" v-model=\"signupPassword.value.value\" @keyup.enter=\"handleSignup\" />\n            <button v-show=\"signupPassword.value.value.length > 0\" type=\"button\" class=\"login__eye\" :class=\"signupPassword.showPassword.value ? 'ico-eye-active' : 'ico-eye'\" @click=\"signupPassword.togglePassword\">\n              <span class=\"blind\">비밀번호 보기</span>\n            </button>\n          </div>\n          <Transition name=\"error\">\n            <span v-if=\"signupPassword.isError.value\" class=\"login__form-error\">\n              {{ signupPassword.errorMessage.value }}\n            </span>\n          </Transition>\n        </div>\n        <!-- 비밀번호 확인 -->\n        <div class=\"login__form-item\">\n          <label for=\"signup-password-confirm\" class=\"login__form-label\">\n            비밀번호 확인\n          </label>\n          <div class=\"login__eye-wrap\">\n            <input ref=\"signupPasswordConfirm.inputRef\" :type=\"signupPasswordConfirm.showPassword.value ? 'text' : 'password'\" class=\"input-text input-lg input-pw\" :class=\"{\n              'input-error': signupPasswordConfirm.isError.value,\n              'input-shake': signupPasswordConfirm.shakeKey.value > 0,\n            }\" :key=\"`password-confirm-${signupPasswordConfirm.shakeKey.value}`\" id=\"signup-password-confirm\" placeholder=\"비밀번호를 입력해주세요.\" v-model=\"signupPasswordConfirm.value.value\" @keyup.enter=\"handleSignup\" />\n            <button v-show=\"signupPasswordConfirm.value.value.length > 0\" type=\"button\" class=\"login__eye\" :class=\"signupPasswordConfirm.showPassword.value ? 'ico-eye-active' : 'ico-eye'\n              \" @click=\"signupPasswordConfirm.togglePassword\">\n              <span class=\"blind\">비밀번호 보기</span>\n            </button>\n          </div>\n          <Transition name=\"error\">\n            <span v-if=\"signupPasswordConfirm.isError.value\" class=\"login__form-error\">\n              {{ signupPasswordConfirm.errorMessage.value }}\n            </span>\n          </Transition>\n        </div>\n        <!-- 추천인 코드 -->\n        <div class=\"login__form-item\">\n          <label for=\"signup-referral-code\" class=\"login__form-label\">\n            추천인 코드\n          </label>\n          <input ref=\"signupReferralCode.inputRef\" type=\"text\" class=\"input-text input-lg\" :class=\"{\n            'input-error': signupReferralCode.isError.value,\n            'input-shake': signupReferralCode.shakeKey.value > 0,\n          }\" :key=\"`referral-code-${signupReferralCode.shakeKey.value}`\" id=\"signup-referral-code\" placeholder=\"추천인 코드를 입력하세요.\" v-model=\"signupReferralCode.value.value\" @keyup.enter=\"handleSignup\" />\n          <Transition name=\"error\">\n            <span v-if=\"signupReferralCode.isError.value\" class=\"login__form-error\">\n              {{ signupReferralCode.errorMessage.value }}\n            </span>\n          </Transition>\n        </div>\n        <!-- 사용자 계약 동의 -->\n        <div class=\"login__form-agree\">\n          <div class=\"checkset checkset--fill checkset--lg\">\n            <input id=\"signup-notification-system-unread\" v-model=\"agreeToTerms\" class=\"checkset__input\" type=\"checkbox\" />\n            <label for=\"signup-notification-system-unread\" class=\"checkset__label\">\n              <strong>사용자 계약</strong>에 동의하고 18세 이상임을 확인합니다.\n            </label>\n          </div>\n        </div>\n        <!-- 가입 버튼 -->\n        <div class=\"login__form-btn\">\n          <button type=\"button\" class=\"btn-primary btn-block btn-md\" :disabled=\"!isSignupFormValid\" @click=\"handleSignup\">\n            가입\n          </button>\n        </div>\n      </div>\n    </div>\n  </template>\n</Modal>\n\n<!-- 비밀번호 찾기 모달 (로그인 모달에서 열리므로 닫을 때 로그인 모달 다시 열기) -->\n<Modal ref=\"passwordRequestModal\" title=\"비밀번호 찾기\" type=\"c\" :previous-modal=\"reopenLoginModal\" @close=\"handlePasswordRequestModalClose\">\n  <template #default=\"{ close }\">\n    <div class=\"modal__content-body modal__content-body--login\">\n      <div class=\"auth__wrap\">\n        <h1 class=\"auth__logo\">\n          <span class=\"blind\">BITUP</span>\n        </h1>\n\n        <!-- 비밀번호 찾기 폼 화면 -->\n        <div v-if=\"!isPasswordRequestSubmitted\" class=\"login__form-wrapper\">\n          <p class=\"auth__desc\" style=\"margin-bottom: 1rem;\">\n            가입할 때 사용한 이메일 주소를 입력하면<br />\n            비밀번호 재설정 방법을 보내드립니다.\n          </p>\n          <div class=\"login__form\">\n            <div class=\"login__form-item\">\n              <label for=\"request-email\" class=\"login__form-label\">이메일 주소</label>\n              <input ref=\"requestPasswordEmail.inputRef\" type=\"email\" class=\"input-text input-lg\" :class=\"{\n                'input-error': requestPasswordEmail.isError.value,\n                'input-shake': requestPasswordEmail.shakeKey.value > 0,\n              }\" :key=\"`request-email-${requestPasswordEmail.shakeKey.value}`\" id=\"request-email\" placeholder=\"이메일주소를 입력하세요.\" v-model=\"requestPasswordEmail.value.value\" @keyup.enter=\"handlePasswordRequest\" />\n              <Transition name=\"error\">\n                <span v-if=\"requestPasswordEmail.isError.value\" class=\"login__form-error\">\n                  {{ requestPasswordEmail.errorMessage.value }}\n                </span>\n              </Transition>\n            </div>\n            <div class=\"login__form-btn\">\n              <button type=\"button\" class=\"btn-primary btn-block btn-md\" :disabled=\"!isPasswordRequestFormValid\" @click=\"handlePasswordRequest\">\n                비밀번호 재설정\n              </button>\n            </div>\n          </div>\n        </div>\n\n        <!-- 비밀번호 재설정 요청 완료 화면 -->\n        <div v-else class=\"login__form-wrapper\">\n          <p class=\"auth__desc\" style=\"margin-bottom: 1rem;\">\n            가입된 계정 이메일로 비밀번호를 재설정하는 방법을 보내드렸습니다.<br /><br />\n            아래 이메일로 발송되었습니다.<br />\n            <strong>{{ requestPasswordEmail.value.value }}</strong>\n          </p>\n          <div class=\"login__form\">\n            <div class=\"login__form-btn\">\n              <button type=\"button\" class=\"btn-primary btn-block btn-md\" @click=\"handlePasswordRequestDoneLogin\">\n                로그인\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </template>\n</Modal>\n</template>\n\n<style scoped></style>\n","export default \"data:image/webp;base64,UklGRs4CAABXRUJQVlA4TMICAAAvx0AFEIDcNpIkif67HVHZWXPtPiNkXNueSbLiGwKBwAsFgZndFwoC+/FCIBB4sHGwMdhYGMwE4LtySk3Gby+T7XTbSw5yEgA5Q9ubF8txHMdqThI8TlLz46TPV1I9ztSjrjmO4y1v8eKw4E5Vv5FqO3PPDcfagnexwlMIX1j2OHNbveKILdkORwPISR8ss1RCUjl3ARJTgkkAFCYprEoSSxkAqwoUxhiTDywVSEwJhUmFnLRJBROWY6vYsCzL8hSfLWjFIzOnqltUNUAxiYh0BaYJwEW+ABgkCaqMUVUBqgKC0t2oapJJMsDIaHbYKqqhYgUAZE84a7DCIasQ1nTGmE5MNk1Vkjnp0MgFaKQDMvkDQSwlRhpjLpMkkMYYYwoEMabq5G4aY0wnxUUC0IkhuZMCD1dAl5gd3cKeAMCIu0kFAI1cCmmASSTDF6kQhMqIA+DEQBxVEADoJBcOwBcp8IdUTm5UKjJAztHa8prNC4yBzS65iAtCMuIwTLhIkC/oJiCI58EfUkCCc87ZQSVWDCEEuQHJNMmQRj54AW6HfQHWycAFg3O3SfJBJg5OLo1kU5dJiwpGhhAmCYAqP7gmRLoEuIgUjKxbUz832MHCjTRc8IfkUMkXZNJMHRq5yRWoYZJbAoijNu3AAcUgDoAEZvbrqDdAxWZXBKpK/kiAZJAM6EQqXEQGZhyM9Ge+yMBJFo+McFSAExFdEzjYVn2A4oVXgEaG5o9JHIBKJAEGuYtIJaCSLoEMIYRwQ5AQJplKM4QwidgDtVjolzwaThbqCl0R7gO4TiRcACAJDsCXUAC4RVOECsCX8AVR3XALIYRbRhXpDwMA4T7BE46fIm9ZSRrqW314URyPF5G3s4X57wKfMvX+2WSfB7b6s0H2Hvmo+N0A7sdTbG+BFFYCEFY+8LIsy/JqVoqTleK7Jedcxv8m\"","// ===== 이모지 데이터 =====\nexport const emojiCategories = [\n  {\n    id: \"smileys\",\n    name: \"스마일리\",\n    icon: \"😀\",\n    emojis: [\n      \"😀\", \"😃\", \"😄\", \"😁\", \"😆\", \"😅\", \"😂\", \"🤣\", \"😊\", \"😇\",\n      \"🙂\", \"🙃\", \"😉\", \"😌\", \"😍\", \"🥰\", \"😘\", \"😗\", \"😙\", \"😚\",\n      \"😋\", \"😛\", \"😝\", \"😜\", \"🤪\", \"🤨\", \"🧐\", \"🤓\", \"😎\", \"🤩\",\n      \"😏\", \"😒\", \"😞\", \"😔\", \"😟\", \"😕\", \"🙁\", \"😣\", \"😖\", \"😫\",\n      \"😩\", \"😢\", \"😭\", \"😤\", \"😠\", \"😡\", \"🤬\", \"🤯\", \"😳\", \"😱\",\n      \"😨\", \"😰\", \"😥\", \"😓\", \"🤗\", \"🤔\", \"🤭\", \"🤫\", \"🤥\", \"😶\",\n      \"😐\", \"😑\", \"😬\", \"🙄\", \"😯\", \"😦\", \"😧\", \"😮\", \"😲\", \"😴\",\n      \"🤤\", \"😪\", \"😵\", \"🤐\", \"🤢\", \"🤮\", \"🤧\", \"😷\", \"🤒\", \"🤕\",\n      \"🤑\", \"🤠\", \"😈\", \"👿\", \"👹\", \"👺\", \"🤡\", \"💩\", \"👻\", \"💀\",\n      \"👽\", \"👾\", \"🤖\", \"🎃\", \"😺\", \"😸\", \"😹\", \"😻\", \"😼\", \"😽\",\n      \"🙀\", \"😿\", \"😾\"\n    ]\n  },\n  {\n    id: \"gestures\",\n    name: \"제스처\",\n    icon: \"👋\",\n    emojis: [\n      \"👋\", \"🤚\", \"🖐\", \"✋\", \"🖖\", \"👌\", \"🤏\", \"✌️\", \"🤞\", \"🤟\",\n      \"🤘\", \"🤙\", \"👈\", \"👉\", \"👆\", \"🖕\", \"👇\", \"☝️\", \"👍\", \"👎\",\n      \"✊\", \"👊\", \"🤛\", \"🤜\", \"👏\", \"🙌\", \"👐\", \"🤲\", \"🤝\", \"🙏\",\n      \"✍️\", \"💪\", \"🦾\", \"🦿\", \"🦵\", \"🦶\", \"👂\", \"🦻\", \"👃\", \"🧠\",\n      \"🦷\", \"🦴\", \"👀\", \"👁️\", \"👅\", \"👄\"\n    ]\n  },\n  {\n    id: \"people\",\n    name: \"사람\",\n    icon: \"👤\",\n    emojis: [\n      \"👤\", \"👥\", \"🧑\", \"👨\", \"👩\", \"🧓\", \"👴\", \"👵\", \"👶\", \"🧒\",\n      \"👦\", \"👧\", \"👱\", \"🧔\", \"👨‍🦰\", \"👩‍🦰\", \"👨‍🦱\", \"👩‍🦱\", \"👨‍🦲\", \"👩‍🦲\",\n      \"👨‍🦳\", \"👩‍🦳\", \"🦳\", \"🦲\", \"🧑‍🦰\", \"🧑‍🦱\", \"🧑‍🦲\", \"🧑‍🦳\", \"👮\", \"👷\",\n      \"💂\", \"🕵️\", \"👩‍⚕️\", \"👨‍⚕️\", \"👩‍🌾\", \"👨‍🌾\", \"👩‍🍳\", \"👨‍🍳\", \"👩‍🎓\", \"👨‍🎓\",\n      \"👩‍🎤\", \"👨‍🎤\", \"👩‍🏫\", \"👨‍🏫\", \"👩‍🏭\", \"👨‍🏭\", \"👩‍💻\", \"👨‍💻\", \"👩‍💼\", \"👨‍💼\",\n      \"👩‍🔧\", \"👨‍🔧\", \"👩‍🔬\", \"👨‍🔬\", \"👩‍🎨\", \"👨‍🎨\", \"👩‍🚒\", \"👨‍🚒\", \"👩‍✈️\", \"👨‍✈️\",\n      \"👩‍🚀\", \"👨‍🚀\", \"👩‍⚖️\", \"👨‍⚖️\", \"🤶\", \"🎅\", \"🧙\", \"🧚\", \"🧛\", \"🧜\",\n      \"🧝\", \"🧞\", \"🧟\", \"💆\", \"💇\", \"🚶\", \"🏃\", \"💃\", \"🕺\", \"🕴\",\n      \"👯\", \"🧘\", \"🧗\", \"🤺\", \"🏇\", \"⛷️\", \"🏂\", \"🏌️\", \"🏄\", \"🚣\",\n      \"🏊\", \"⛹️\", \"🏋️\", \"🚴\", \"🚵\", \"🤸\", \"🤼\", \"🤽\", \"🤾\", \"🤹\",\n      \"🧖\", \"🛀\", \"🛌\", \"👭\", \"👫\", \"👬\", \"💏\", \"💑\", \"👪\", \"👨‍👩‍👧\",\n      \"👨‍👩‍👧‍👦\", \"👨‍👩‍👦‍👦\", \"👨‍👩‍👧‍👧\", \"👩‍👩‍👦\", \"👩‍👩‍👧\", \"👩‍👩‍👧‍👦\", \"👩‍👩‍👦‍👦\", \"👩‍👩‍👧‍👧\",\n      \"👨‍👨‍👦\", \"👨‍👨‍👧\", \"👨‍👨‍👧‍👦\", \"👨‍👨‍👦‍👦\", \"👨‍👨‍👧‍👧\", \"👩‍👦\", \"👩‍👧\", \"👩‍👧‍👦\",\n      \"👩‍👦‍👦\", \"👩‍👧‍👧\", \"👨‍👦\", \"👨‍👧\", \"👨‍👧‍👦\", \"👨‍👦‍👦\", \"👨‍👧‍👧\"\n    ]\n  },\n  {\n    id: \"animals\",\n    name: \"동물\",\n    icon: \"🐶\",\n    emojis: [\n      \"🐶\", \"🐱\", \"🐭\", \"🐹\", \"🐰\", \"🦊\", \"🐻\", \"🐼\", \"🐨\", \"🐯\",\n      \"🦁\", \"🐮\", \"🐷\", \"🐽\", \"🐸\", \"🐵\", \"🙈\", \"🙉\", \"🙊\", \"🐒\",\n      \"🐔\", \"🐧\", \"🐦\", \"🐤\", \"🐣\", \"🐥\", \"🦆\", \"🦅\", \"🦉\", \"🦇\",\n      \"🐺\", \"🐗\", \"🐴\", \"🦄\", \"🐝\", \"🐛\", \"🦋\", \"🐌\", \"🐞\", \"🐜\",\n      \"🦟\", \"🦗\", \"🕷️\", \"🕸️\", \"🦂\", \"🐢\", \"🐍\", \"🦎\", \"🦖\", \"🦕\",\n      \"🐙\", \"🦑\", \"🦐\", \"🦞\", \"🦀\", \"🐡\", \"🐠\", \"🐟\", \"🐬\", \"🐳\",\n      \"🐋\", \"🦈\", \"🐊\", \"🐅\", \"🐆\", \"🦓\", \"🦍\", \"🦧\", \"🐘\", \"🦛\",\n      \"🦏\", \"🐪\", \"🐫\", \"🦒\", \"🦘\", \"🦡\", \"🐃\", \"🐂\", \"🐄\", \"🐎\",\n      \"🐖\", \"🐏\", \"🐑\", \"🦙\", \"🐐\", \"🦌\", \"🐕\", \"🐩\", \"🦮\", \"🐕‍🦺\",\n      \"🐈\", \"🐓\", \"🦃\", \"🦚\", \"🦜\", \"🦢\", \"🦩\", \"🕊️\", \"🐇\", \"🦝\",\n      \"🦨\", \"🦦\", \"🦥\", \"🐁\", \"🐀\", \"🐿️\", \"🦔\"\n    ]\n  },\n  {\n    id: \"food\",\n    name: \"음식\",\n    icon: \"🍎\",\n    emojis: [\n      \"🍎\", \"🍊\", \"🍋\", \"🍌\", \"🍉\", \"🍇\", \"🍓\", \"🍈\", \"🍒\", \"🍑\",\n      \"🥭\", \"🍍\", \"🥥\", \"🥝\", \"🍅\", \"🍆\", \"🥑\", \"🥦\", \"🥬\", \"🥒\",\n      \"🌶️\", \"🌽\", \"🥕\", \"🥔\", \"🍠\", \"🥐\", \"🥯\", \"🍞\", \"🥖\", \"🥨\",\n      \"🧀\", \"🥚\", \"🍳\", \"🥞\", \"🥓\", \"🥩\", \"🍗\", \"🍖\", \"🦴\", \"🌭\",\n      \"🍔\", \"🍟\", \"🍕\", \"🥪\", \"🥙\", \"🌮\", \"🌯\", \"🥗\", \"🥘\", \"🥫\",\n      \"🍝\", \"🍜\", \"🍲\", \"🍛\", \"🍣\", \"🍱\", \"🥟\", \"🦪\", \"🍤\", \"🍙\",\n      \"🍚\", \"🍘\", \"🍥\", \"🥠\", \"🥮\", \"🍢\", \"🍡\", \"🍧\", \"🍨\", \"🍦\",\n      \"🥧\", \"🧁\", \"🍰\", \"🎂\", \"🍮\", \"🍭\", \"🍬\", \"🍫\", \"🍿\", \"🍩\",\n      \"🍪\", \"🌰\", \"🥜\", \"🍯\", \"🥛\", \"🍼\", \"☕️\", \"🍵\", \"🧃\", \"🥤\",\n      \"🍶\", \"🍺\", \"🍻\", \"🥂\", \"🍷\", \"🥃\", \"🍸\", \"🍹\", \"🧉\", \"🍾\",\n      \"🧊\"\n    ]\n  },\n  {\n    id: \"activities\",\n    name: \"활동\",\n    icon: \"⚽\",\n    emojis: [\n      \"⚽\", \"🏀\", \"🏈\", \"⚾\", \"🥎\", \"🎾\", \"🏐\", \"🏉\", \"🥏\", \"🎱\",\n      \"🏓\", \"🏸\", \"🥅\", \"🏒\", \"🏑\", \"🥍\", \"🏏\", \"🥊\", \"🥋\", \"🎽\",\n      \"🛹\", \"🛷\", \"⛸️\", \"🥌\", \"🎿\", \"⛷️\", \"🏂\", \"🏋️\", \"🤼\", \"🤸\",\n      \"🤺\", \"🤾\", \"🏌️\", \"🏇\", \"🧘\", \"🏄\", \"🏊\", \"🚣\", \"🧗\", \"🚵\",\n      \"🚴\", \"🏃\", \"🚶\", \"🧎\", \"🏃‍♀️\", \"🏃‍♂️\", \"🚶‍♀️\", \"🚶‍♂️\", \"🧍\", \"🧍‍♀️\",\n      \"🧍‍♂️\", \"🧎‍♀️\", \"🧎‍♂️\", \"🏃‍♀️\", \"🏃‍♂️\", \"💃\", \"🕺\", \"🕴️\", \"👯\", \"👯‍♀️\",\n      \"👯‍♂️\", \"🧖\", \"🧖‍♀️\", \"🧖‍♂️\", \"🧘‍♀️\", \"🧘‍♂️\", \"🎭\", \"🩰\", \"🎨\", \"🎬\",\n      \"🎤\", \"🎧\", \"🎼\", \"🎹\", \"🥁\", \"🎷\", \"🎺\", \"🎸\", \"🪕\", \"🎻\",\n      \"🎲\", \"♟️\", \"🎯\", \"🎳\", \"🎮\", \"🎰\", \"🧩\"\n    ]\n  },\n  {\n    id: \"travel\",\n    name: \"여행\",\n    icon: \"🚗\",\n    emojis: [\n      \"🚗\", \"🚕\", \"🚙\", \"🚌\", \"🚎\", \"🏎️\", \"🚓\", \"🚑\", \"🚒\", \"🚐\",\n      \"🚚\", \"🚛\", \"🚜\", \"🛴\", \"🚲\", \"🛵\", \"🏍️\", \"🛺\", \"🚨\", \"🚔\",\n      \"🚍\", \"🚘\", \"🚖\", \"🚡\", \"🚠\", \"🚟\", \"🚃\", \"🚋\", \"🚞\", \"🚝\",\n      \"🚄\", \"🚅\", \"🚈\", \"🚂\", \"🚆\", \"🚇\", \"🚊\", \"🚉\", \"✈️\", \"🛫\",\n      \"🛬\", \"🛩️\", \"💺\", \"🚁\", \"🚟\", \"🚀\", \"🛸\", \"🚤\", \"🛥️\", \"🛳️\",\n      \"⛴️\", \"🚢\", \"⚓\", \"⛽\", \"🚧\", \"🚦\", \"🚥\", \"🗺️\", \"🗿\", \"🗽\",\n      \"🗼\", \"🏰\", \"🏯\", \"🏟️\", \"🎡\", \"🎢\", \"🎠\", \"⛲\", \"⛱️\", \"🏖️\",\n      \"🏝️\", \"🏜️\", \"🌋\", \"⛰️\", \"🏔️\", \"🗻\", \"🏕️\", \"⛺\", \"🏠\", \"🏡\",\n      \"🏘️\", \"🏚️\", \"🏗️\", \"🏭\", \"🏢\", \"🏬\", \"🏣\", \"🏤\", \"🏥\", \"🏦\",\n      \"🏨\", \"🏪\", \"🏫\", \"🏩\", \"💒\", \"🏛️\", \"⛪\", \"🕌\", \"🕍\", \"🕋\",\n      \"⛩️\", \"🛤️\", \"🛣️\", \"🗾\", \"🎑\", \"🏞️\", \"🌅\", \"🌄\", \"🌠\", \"🎇\",\n      \"🎆\", \"🌇\", \"🌆\", \"🏙️\", \"🌃\", \"🌌\", \"🌉\", \"🌁\"\n    ]\n  },\n  {\n    id: \"objects\",\n    name: \"물건\",\n    icon: \"⌚\",\n    emojis: [\n      \"⌚\", \"📱\", \"📲\", \"💻\", \"⌨️\", \"🖥️\", \"🖨️\", \"🖱️\", \"🖲️\", \"🕹️\",\n      \"🗜️\", \"💾\", \"💿\", \"📀\", \"📼\", \"📷\", \"📸\", \"📹\", \"🎥\", \"📽️\",\n      \"🎞️\", \"📞\", \"☎️\", \"📟\", \"📠\", \"📺\", \"📻\", \"🎙️\", \"🎚️\", \"🎛️\",\n      \"⏱️\", \"⏲️\", \"⏰\", \"🕰️\", \"⌛\", \"⏳\", \"📡\", \"🔋\", \"🔌\", \"💡\",\n      \"🔦\", \"🕯️\", \"🧯\", \"🛢️\", \"💸\", \"💵\", \"💴\", \"💶\", \"💷\", \"💰\",\n      \"💳\", \"💎\", \"⚖️\", \"🧰\", \"🔧\", \"🔨\", \"⚒️\", \"🛠️\", \"⛏️\", \"🔩\",\n      \"⚙️\", \"🧱\", \"⛓️\", \"🧲\", \"🔫\", \"💣\", \"🧨\", \"🔪\", \"🗡️\", \"⚔️\",\n      \"🛡️\", \"🚬\", \"⚰️\", \"⚱️\", \"🏺\", \"🔮\", \"📿\", \"🧿\", \"💈\", \"⚗️\",\n      \"🔭\", \"🔬\", \"🕳️\", \"💊\", \"💉\", \"🧬\", \"🦠\", \"🧫\", \"🧪\", \"🌡️\",\n      \"🧹\", \"🧺\", \"🧻\", \"🚽\", \"🚿\", \"🛁\", \"🛀\", \"🧼\", \"🧽\", \"🧴\",\n      \"🛎️\", \"🔑\", \"🗝️\", \"🚪\", \"🪑\", \"🛋️\", \"🛏️\", \"🛌\", \"🧸\", \"🖼️\",\n      \"🛍️\", \"🛒\", \"🎁\", \"🎈\", \"🎏\", \"🎀\", \"🪄\", \"🪅\", \"🪆\", \"🧧\",\n      \"🎊\", \"🎉\", \"🎎\", \"🏮\", \"🎐\", \"🧧\", \"✉️\", \"📩\", \"📨\", \"📧\",\n      \"💌\", \"📥\", \"📤\", \"📦\", \"🏷️\", \"📪\", \"📫\", \"📬\", \"📭\", \"📮\",\n      \"📯\", \"📜\", \"📃\", \"📄\", \"📑\", \"🧾\", \"📊\", \"📈\", \"📉\", \"🗒️\",\n      \"🗓️\", \"📆\", \"📅\", \"🗑️\", \"📇\", \"🗃️\", \"🗳️\", \"🗄️\", \"📋\", \"📁\",\n      \"📂\", \"🗂️\", \"🗞️\", \"📰\", \"📓\", \"📔\", \"📒\", \"📕\", \"📗\", \"📘\",\n      \"📙\", \"📚\", \"📖\", \"🔖\", \"🧷\", \"🔗\", \"📎\", \"🖇️\", \"📐\", \"📏\",\n      \"🧮\", \"📌\", \"📍\", \"✂️\", \"🖊️\", \"🖋️\", \"✒️\", \"🖌️\", \"🖍️\", \"📝\",\n      \"✏️\", \"🔍\", \"🔎\", \"🔏\", \"🔐\", \"🔒\", \"🔓\"\n    ]\n  },\n  {\n    id: \"symbols\",\n    name: \"기호\",\n    icon: \"❤️\",\n    emojis: [\n      \"❤️\", \"🧡\", \"💛\", \"💚\", \"💙\", \"💜\", \"🖤\", \"🤍\", \"🤎\", \"💔\",\n      \"❣️\", \"💕\", \"💞\", \"💓\", \"💗\", \"💖\", \"💘\", \"💝\", \"💟\", \"☮️\",\n      \"✝️\", \"☪️\", \"🕉️\", \"☸️\", \"✡️\", \"🔯\", \"🕎\", \"☯️\", \"☦️\", \"🛐\",\n      \"⛎\", \"♈\", \"♉\", \"♊\", \"♋\", \"♌\", \"♍\", \"♎\", \"♏\", \"♐\",\n      \"♑\", \"♒\", \"♓\", \"🆔\", \"⚛️\", \"🉑\", \"☢️\", \"☣️\", \"📴\", \"📳\",\n      \"🈶\", \"🈚\", \"🈸\", \"🈺\", \"🈷️\", \"✴️\", \"🆚\", \"💮\", \"🉐\", \"㊙️\",\n      \"㊗️\", \"🈴\", \"🈵\", \"🈹\", \"🈲\", \"🅰️\", \"🅱️\", \"🆎\", \"🆑\", \"🅾️\",\n      \"🆘\", \"❌\", \"⭕\", \"🛑\", \"⛔\", \"📛\", \"🚫\", \"💯\", \"💢\", \"♨️\",\n      \"🚷\", \"🚯\", \"🚳\", \"🚱\", \"🔞\", \"📵\", \"🚭\", \"❗\", \"❓\", \"❕\",\n      \"❔\", \"‼️\", \"⁉️\", \"🔅\", \"🔆\", \"〽️\", \"⚠️\", \"🚸\", \"🔱\", \"⚜️\",\n      \"🔰\", \"♻️\", \"✅\", \"🈯\", \"💹\", \"❇️\", \"✳️\", \"❎\", \"🌐\", \"💠\",\n      \"Ⓜ️\", \"🌀\", \"💤\", \"🏧\", \"🚾\", \"♿\", \"🅿️\", \"🈳\", \"🈂️\", \"🛂\",\n      \"🛃\", \"🛄\", \"🛅\", \"🚹\", \"🚺\", \"🚼\", \"🚻\", \"🚮\", \"🎦\", \"📶\",\n      \"🈁\", \"🔣\", \"ℹ️\", \"🔤\", \"🔡\", \"🔠\", \"🔢\", \"🔟\", \"🔢\", \"🔠\",\n      \"🔡\", \"🔤\", \"ℹ️\", \"🔣\", \"🈁\", \"📶\", \"🎦\", \"🚮\", \"🚻\", \"🚼\",\n      \"🚺\", \"🚹\", \"🛅\", \"🛄\", \"🛃\", \"🛂\", \"🈂️\", \"🈳\", \"🅿️\", \"♿\",\n      \"🚾\", \"🏧\", \"💤\", \"🌀\", \"Ⓜ️\", \"💠\", \"🌐\", \"❎\", \"✳️\", \"❇️\",\n      \"💹\", \"🈯\", \"✅\", \"♻️\", \"🔰\", \"⚜️\", \"🔱\", \"🚸\", \"⚠️\", \"〽️\",\n      \"🔆\", \"🔅\", \"⁉️\", \"‼️\", \"❔\", \"❕\", \"❓\", \"❗\", \"🚭\", \"📵\",\n      \"🔞\", \"🚱\", \"🚳\", \"🚯\", \"🚷\", \"♨️\", \"💢\", \"💯\", \"🚫\", \"📛\",\n      \"⛔\", \"🛑\", \"⭕\", \"❌\", \"🆘\", \"🅾️\", \"🆑\", \"🆎\", \"🅱️\", \"🅰️\",\n      \"🈲\", \"🈹\", \"🈵\", \"🈴\", \"㊗️\", \"㊙️\", \"🉐\", \"💮\", \"🆚\", \"✴️\",\n      \"🈷️\", \"🈺\", \"🈸\", \"🈚\", \"🈶\", \"📳\", \"📴\", \"☣️\", \"☢️\", \"🉑\",\n      \"⚛️\", \"🆔\", \"♓\", \"♒\", \"♑\", \"♐\", \"♏\", \"♎\", \"♍\", \"♌\",\n      \"♋\", \"♊\", \"♉\", \"♈\", \"⛎\", \"🛐\", \"☦️\", \"☯️\", \"🕎\", \"🔯\",\n      \"✡️\", \"☸️\", \"🕉️\", \"☪️\", \"✝️\", \"☮️\", \"💟\", \"💝\", \"💘\", \"💖\",\n      \"💗\", \"💓\", \"💞\", \"💕\", \"❣️\", \"💔\", \"🤎\", \"🤍\", \"🖤\", \"💜\",\n      \"💙\", \"💚\", \"💛\", \"🧡\", \"❤️\"\n    ]\n  },\n  {\n    id: \"flags\",\n    name: \"국기\",\n    icon: \"🏳️\",\n    emojis: [\n      \"🏳️\", \"🏴\", \"🏁\", \"🚩\", \"🏳️‍🌈\", \"🏳️‍⚧️\", \"🇦🇫\", \"🇦🇽\", \"🇦🇱\", \"🇩🇿\",\n      \"🇦🇸\", \"🇦🇩\", \"🇦🇴\", \"🇦🇮\", \"🇦🇶\", \"🇦🇬\", \"🇦🇷\", \"🇦🇲\", \"🇦🇼\", \"🇦🇺\",\n      \"🇦🇹\", \"🇦🇿\", \"🇧🇸\", \"🇧🇭\", \"🇧🇩\", \"🇧🇧\", \"🇧🇾\", \"🇧🇪\", \"🇧🇿\", \"🇧🇯\",\n      \"🇧🇲\", \"🇧🇹\", \"🇧🇴\", \"🇧🇦\", \"🇧🇼\", \"🇧🇷\", \"🇮🇴\", \"🇻🇬\", \"🇧🇳\", \"🇧🇬\",\n      \"🇧🇫\", \"🇧🇮\", \"🇰🇭\", \"🇨🇲\", \"🇨🇦\", \"🇮🇶\", \"🇨🇻\", \"🇰🇾\", \"🇨🇫\", \"🇹🇩\",\n      \"🇨🇱\", \"🇨🇳\", \"🇨🇽\", \"🇨🇨\", \"🇨🇴\", \"🇰🇲\", \"🇨🇬\", \"🇨🇩\", \"🇨🇰\", \"🇨🇷\",\n      \"🇨🇮\", \"🇭🇷\", \"🇨🇺\", \"🇨🇼\", \"🇨🇾\", \"🇨🇿\", \"🇩🇰\", \"🇩🇯\", \"🇩🇲\", \"🇩🇴\",\n      \"🇪🇨\", \"🇪🇬\", \"🇸🇻\", \"🇬🇶\", \"🇪🇷\", \"🇪🇪\", \"🇪🇹\", \"🇫🇰\", \"🇫🇴\", \"🇫🇯\",\n      \"🇫🇮\", \"🇫🇷\", \"🇬🇫\", \"🇵🇫\", \"🇹🇫\", \"🇬🇦\", \"🇬🇲\", \"🇬🇪\", \"🇩🇪\", \"🇬🇭\",\n      \"🇬🇮\", \"🇬🇷\", \"🇬🇱\", \"🇬🇩\", \"🇬🇵\", \"🇬🇺\", \"🇬🇹\", \"🇬🇬\", \"🇬🇳\", \"🇬🇼\",\n      \"🇬🇾\", \"🇭🇹\", \"🇭🇳\", \"🇭🇰\", \"🇭🇺\", \"🇮🇸\", \"🇮🇳\", \"🇮🇩\", \"🇮🇷\", \"🇮🇶\",\n      \"🇮🇪\", \"🇮🇲\", \"🇮🇱\", \"🇮🇹\", \"🇯🇲\", \"🇯🇵\", \"🇯🇪\", \"🇯🇴\", \"🇰🇿\", \"🇰🇪\",\n      \"🇰🇮\", \"🇽🇰\", \"🇰🇼\", \"🇰🇬\", \"🇱🇦\", \"🇱🇻\", \"🇱🇧\", \"🇱🇸\", \"🇱🇷\", \"🇱🇾\",\n      \"🇱🇮\", \"🇱🇹\", \"🇱🇺\", \"🇲🇴\", \"🇲🇰\", \"🇲🇬\", \"🇲🇼\", \"🇲🇾\", \"🇲🇻\", \"🇲🇱\",\n      \"🇲🇹\", \"🇲🇭\", \"🇲🇶\", \"🇲🇷\", \"🇲🇺\", \"🇾🇹\", \"🇲🇽\", \"🇫🇲\", \"🇲🇩\", \"🇲🇨\",\n      \"🇲🇳\", \"🇲🇪\", \"🇲🇸\", \"🇲🇦\", \"🇲🇿\", \"🇲🇲\", \"🇳🇦\", \"🇳🇷\", \"🇳🇵\", \"🇳🇱\",\n      \"🇳🇨\", \"🇳🇿\", \"🇳🇮\", \"🇳🇪\", \"🇳🇬\", \"🇳🇺\", \"🇳🇫\", \"🇰🇵\", \"🇲🇵\", \"🇳🇴\",\n      \"🇴🇲\", \"🇵🇰\", \"🇵🇼\", \"🇵🇸\", \"🇵🇦\", \"🇵🇬\", \"🇵🇾\", \"🇵🇪\", \"🇵🇭\", \"🇵🇳\",\n      \"🇵🇱\", \"🇵🇹\", \"🇵🇷\", \"🇶🇦\", \"🇷🇪\", \"🇷🇴\", \"🇷🇺\", \"🇷🇼\", \"🇼🇸\", \"🇸🇲\",\n      \"🇸🇦\", \"🇸🇳\", \"🇷🇸\", \"🇸🇨\", \"🇸🇱\", \"🇸🇬\", \"🇸🇽\", \"🇸🇰\", \"🇸🇮\", \"🇬🇸\",\n      \"🇸🇧\", \"🇸🇴\", \"🇿🇦\", \"🇰🇷\", \"🇸🇸\", \"🇪🇸\", \"🇱🇰\", \"🇧🇱\", \"🇸🇭\", \"🇰🇳\",\n      \"🇱🇨\", \"🇵🇲\", \"🇻🇨\", \"🇸🇩\", \"🇸🇷\", \"🇸🇿\", \"🇸🇪\", \"🇨🇭\", \"🇸🇾\", \"🇹🇼\",\n      \"🇹🇯\", \"🇹🇿\", \"🇹🇭\", \"🇹🇱\", \"🇹🇬\", \"🇹🇰\", \"🇹🇴\", \"🇹🇹\", \"🇹🇳\", \"🇹🇷\",\n      \"🇹🇲\", \"🇹🇨\", \"🇹🇻\", \"🇻🇮\", \"🇺🇬\", \"🇺🇦\", \"🇦🇪\", \"🇬🇧\", \"🇺🇸\", \"🇺🇾\",\n      \"🇺🇿\", \"🇻🇺\", \"🇻🇦\", \"🇻🇪\", \"🇻🇳\", \"🇼🇫\", \"🇪🇭\", \"🇾🇪\", \"🇿🇲\", \"🇿🇼\"\n    ]\n  }\n];\n\n/**\n * 이모지 관련 composable\n * @returns {Object} 이모지 카테고리와 관련 함수들\n */\nexport const useEmoji = () => {\n  return {\n    emojiCategories\n  };\n};\n\n","<script setup>\nimport { motion, AnimatePresence } from \"motion-v\";\nimport { ref, onMounted, onUnmounted, nextTick, watch, computed } from \"vue\";\nimport { useChat } from \"@/composables/useSidebar\";\nimport { useEmoji } from \"@/composables/useEmoji\";\nimport { useDevice } from \"@/composables/useDevice\";\nimport { useSocket } from \"@/composables/useSocket\";\nimport { useAuth } from \"@/composables/useAuth\";\nimport apiClient from \"@/composables/common/axios\";\n\nconst props = defineProps({\n  variant: {\n    type: String,\n    default: \"\",\n  },\n  isOpen: {\n    type: Boolean,\n    default: undefined,\n  },\n});\n\nconst emits = defineEmits([\"close\"]);\n\n// ===== Composables =====\nconst { isChatOpen: globalIsChatOpen, unreadMessageCount, closeChat: globalCloseChat } = useChat();\nconst { isLoggedIn, currentUser } = useAuth();\nconst { connect, on, emit: socketEmit, disconnect, off } = useSocket();\n\n// isOpen prop이 제공되면 prop을 사용하고, 아니면 전역 상태 사용\nconst isChatOpen = computed(() => {\n  return props.isOpen !== undefined ? props.isOpen : globalIsChatOpen.value;\n});\n\nconst closeChat = () => {\n  if (props.isOpen !== undefined) {\n    emits(\"close\");\n  } else {\n    globalCloseChat();\n  }\n};\nconst { emojiCategories } = useEmoji();\nconst { isMobile } = useDevice();\n\n// 현재 선택된 카테고리\nconst selectedCategory = ref(emojiCategories[0].id);\n\n// 아바타 경로 정규화 함수\nconst normalizeAvatar = (avatar) => {\n  if (!avatar) return '01';\n\n  // 이미 전체 URL인 경우 숫자만 추출\n  if (avatar.includes('http') || avatar.includes('.png')) {\n    const match = avatar.match(/default_avatar_(\\d{2})/);\n    return match ? match[1] : '01';\n  }\n\n  // 이미 2자리 숫자인 경우 그대로 반환\n  if (/^\\d{2}$/.test(avatar)) {\n    return avatar;\n  }\n\n  // 1자리 숫자인 경우 0 패딩\n  if (/^\\d$/.test(avatar)) {\n    return avatar.padStart(2, '0');\n  }\n\n  return '01';\n};\n\n// ===== 상수 =====\nconst BASE_HEIGHT = computed(() => (isMobile.value ? 38 : 46));\nconst MAX_HEIGHT = 100;\n\n// ===== Refs =====\nconst textareaRef = ref(null);\nconst sendButtonRef = ref(null);\nconst chatBodyRef = ref(null);\nconst chatRef = ref(null);\nconst textareaHeight = ref(`${BASE_HEIGHT.value}px`);\nconst isMultiline = ref(false);\nconst isEmojiOpen = ref(false);\nconst isGifOpen = ref(false);\nconst isAtBottom = ref(true);\nconst isScrollable = ref(false);\nconst lastMessageCount = ref(0);\n\n// Giphy 관련 Refs\nconst gifs = ref([]);\n// Giphy API Key (개발용으로 발급 받은 Key, 추후 배포 시 변경 필요)\nconst apiKey = \"qxiEb2d61xFQrwj7IE5uw6E32RY1tMDN\";\n\n// 실제 채팅 메시지 (더미 데이터 제거, Socket.io로 수신)\nconst messages = ref([]);\nconst onlineCount = ref(0);\nconst lastMessageId = ref(0);\nlet socketInstance = null;\n\n// ===== 유틸리티 함수 =====\nconst formatMessageWithMentions = (text) => {\n  if (!text) return \"\";\n\n  // @로 시작하는 멘션을 찾는 정규식 (@username 형식, 한글 포함)\n  const mentionRegex = /@([가-힣a-zA-Z0-9_]+)/g;\n\n  return text.replace(mentionRegex, '<span class=\"chat__mention\">@$1</span>');\n};\n\n// ===== Textarea 높이 관리 =====\nconst updateTextareaHeight = () => {\n  if (!textareaRef.value) return;\n\n  nextTick(() => {\n    if (!textareaRef.value) return;\n\n    textareaRef.value.style.height = \"1px\";\n    const scrollHeight = textareaRef.value.scrollHeight;\n    const calculatedHeight = Math.max(\n      BASE_HEIGHT.value,\n      Math.min(scrollHeight, MAX_HEIGHT)\n    );\n\n    isMultiline.value = calculatedHeight > BASE_HEIGHT.value;\n\n    const newHeightValue = `${calculatedHeight}px`;\n    textareaHeight.value = newHeightValue;\n    textareaRef.value.style.height = textareaHeight.value;\n\n    if (calculatedHeight >= MAX_HEIGHT) {\n      textareaRef.value.style.overflowY = \"auto\";\n    } else {\n      textareaRef.value.style.overflowY = \"hidden\";\n    }\n  });\n};\n\n// ===== 이벤트 핸들러 =====\nconst handleInput = () => {\n  updateTextareaHeight();\n};\n\nconst handleSend = async () => {\n  if (!textareaRef.value) return;\n\n  const message = textareaRef.value.value.trim();\n  if (!message) return;\n\n  // 로그인 체크\n  if (!isLoggedIn.value) {\n    console.warn('[Chat] Login required to send messages');\n    return;\n  }\n\n  // 메시지 전송 (Socket.io 우선, 폴백으로 API)\n  if (socketInstance) {\n    socketEmit('chat:send', { message });\n  } else {\n    // API 폴백\n    try {\n      const response = await apiClient.post('/api/chat.php?action=send', { message });\n      if (response.data.success && response.data.message) {\n        const msg = response.data.message;\n        messages.value.push({\n          id: msg.id,\n          text: msg.message,\n          type: \"outgoing\",\n          author: currentUser.value?.nickname || null,\n          avatar: currentUser.value?.avatar || '01',\n          time: msg.time\n        });\n      }\n    } catch (error) {\n      console.error('[Chat] Send error:', error);\n    }\n  }\n\n  // 입력창 초기화\n  textareaRef.value.value = \"\";\n  textareaHeight.value = `${BASE_HEIGHT.value}px`;\n  isMultiline.value = false;\n\n  if (textareaRef.value) {\n    textareaRef.value.style.height = \"48px\";\n    textareaRef.value.style.overflowY = \"hidden\";\n  }\n\n  // 스크롤 유지\n  nextTick(() => {\n    scrollToBottom();\n  });\n};\n\nconst handleKeydown = (event) => {\n  if (event.key === \"Enter\") {\n    if (event.shiftKey) {\n      setTimeout(() => {\n        updateTextareaHeight();\n      }, 0);\n      return;\n    }\n\n    event.preventDefault();\n    handleSend();\n  }\n};\n\nconst handleKeyup = (event) => {\n  if (event.key === \"Backspace\" || event.key === \"Delete\") {\n    updateTextareaHeight();\n  }\n};\n\nconst handleEmojiClick = () => {\n  isEmojiOpen.value = !isEmojiOpen.value;\n  // 이모지가 열리면 GIF 닫기\n  if (isEmojiOpen.value) {\n    isGifOpen.value = false;\n  }\n};\n\nconst handleGifClick = () => {\n  isGifOpen.value = !isGifOpen.value;\n  // GIF가 열리면 이모지 닫기\n  if (isGifOpen.value) {\n    isEmojiOpen.value = false;\n  }\n};\n\n// 현재 선택된 카테고리의 이모지 목록\nconst currentEmojis = computed(() => {\n  const category = emojiCategories.find(\n    (cat) => cat.id === selectedCategory.value\n  );\n  return category ? category.emojis : [];\n});\n\n// 이모지 선택 핸들러\nconst onEmojiSelect = (emoji) => {\n  if (!textareaRef.value) return;\n\n  const emojiChar =\n    typeof emoji === \"string\" ? emoji : emoji.i || emoji.emoji || emoji;\n\n  // 현재 커서 위치에 이모지 삽입\n  const start = textareaRef.value.selectionStart;\n  const end = textareaRef.value.selectionEnd;\n  const text = textareaRef.value.value;\n  const before = text.substring(0, start);\n  const after = text.substring(end, text.length);\n\n  textareaRef.value.value = before + emojiChar + after;\n\n  // 커서 위치를 이모지 뒤로 이동\n  const newPosition = start + emojiChar.length;\n\n  // 포커스가 유지된 상태에서 커서 위치만 재설정\n  textareaRef.value.setSelectionRange(newPosition, newPosition);\n\n  // 높이 업데이트\n  updateTextareaHeight();\n};\n\n// 카테고리 변경 핸들러\nconst selectCategory = (categoryId) => {\n  selectedCategory.value = categoryId;\n};\n\n// Giphy 트렌딩 데이터 가져오기\nconst fetchGifs = async () => {\n  try {\n    // limit=30 설정\n    const response = await fetch(\n      `https://api.giphy.com/v1/gifs/trending?api_key=${apiKey}&limit=30&rating=g`\n    );\n    const { data } = await response.json();\n    gifs.value = data;\n  } catch (error) {\n    console.error(\"Giphy 데이터를 불러오는데 실패했습니다:\", error);\n  }\n};\n\n// GIF 선택 핸들러\nconst onGifSelect = (imageUrl, event) => {\n  if (event) {\n    event.preventDefault();\n    event.stopPropagation();\n  }\n\n  // 이미지를 메시지로 바로 추가\n  const wasAtBottom = isAtBottom.value;\n\n  messages.value.push({\n    id: Date.now(),\n    text: \"\",\n    image: imageUrl,\n    type: \"outgoing\",\n    author: null,\n  });\n\n  // 바닥에 있었다면 스크롤 유지\n  if (wasAtBottom) {\n    nextTick(() => {\n      scrollToBottom();\n    });\n  }\n\n  // GIF 피커 닫기\n  isGifOpen.value = false;\n};\n\n// ===== 스크롤 관리 =====\nconst checkScrollable = () => {\n  if (!chatBodyRef.value) return false;\n\n  const messageList = chatBodyRef.value.querySelector(\".chat__message-list\");\n  if (!messageList) return false;\n\n  // chat__body의 높이와 chat__message-list의 높이 비교\n  const bodyHeight = chatBodyRef.value.clientHeight;\n  const listHeight = messageList.scrollHeight;\n\n  return listHeight > bodyHeight;\n};\n\nconst checkIfAtBottom = () => {\n  if (!chatBodyRef.value) return;\n\n  // 스크롤 가능 여부 확인\n  const scrollable = checkScrollable();\n  isScrollable.value = scrollable;\n\n  // 스크롤이 불가능하면 바닥으로 간주하고 카운트 초기화\n  if (!scrollable) {\n    isAtBottom.value = true;\n    unreadMessageCount.value = 0;\n    lastMessageCount.value = messages.value.length;\n    return;\n  }\n\n  const { scrollTop, scrollHeight, clientHeight } = chatBodyRef.value;\n  const threshold = 10; // 10px 여유를 두고 바닥으로 간주\n  const atBottom = scrollHeight - scrollTop - clientHeight <= threshold;\n\n  isAtBottom.value = atBottom;\n\n  // 바닥에 도달하면 읽지 않은 메시지 개수 초기화\n  if (atBottom && unreadMessageCount.value > 0) {\n    unreadMessageCount.value = 0;\n    lastMessageCount.value = messages.value.length;\n  }\n};\n\nconst scrollToBottom = () => {\n  nextTick(() => {\n    if (chatBodyRef.value) {\n      chatBodyRef.value.scrollTo({\n        top: chatBodyRef.value.scrollHeight,\n        behavior: \"instant\", // 'smooth'보다 'instant'가 더 빠릿한 채팅 UI에 적합합니다.\n      });\n      // 스크롤 후 상태 업데이트\n      nextTick(() => {\n        checkIfAtBottom();\n      });\n    }\n  });\n};\n\nconst handleScroll = () => {\n  checkIfAtBottom();\n};\n\nconst handleScrollToBottomClick = (event) => {\n  if (event) {\n    event.preventDefault();\n    event.stopPropagation();\n  }\n  scrollToBottom();\n  unreadMessageCount.value = 0;\n};\n\n// ===== Computed =====\nconst showScrollButton = computed(() => {\n  return isScrollable.value && !isAtBottom.value;\n});\n\n// ===== Watchers =====\n// 타이머 ID를 저장할 변수\nlet closeTimer = null;\n\n// 채팅창이 열릴 때 바닥으로 스크롤\nwatch(\n  isChatOpen,\n  async (isOpen) => {\n    if (closeTimer) {\n      clearTimeout(closeTimer);\n      closeTimer = null;\n    }\n\n    if (isOpen) {\n      await nextTick();\n\n      if (chatBodyRef.value) {\n        chatBodyRef.value.scrollTop = chatBodyRef.value.scrollHeight;\n      }\n\n      setTimeout(() => {\n        if (chatBodyRef.value) {\n          chatBodyRef.value.scrollTop = chatBodyRef.value.scrollHeight;\n        }\n      }, 100);\n    } else {\n      closeTimer = setTimeout(() => {\n        isEmojiOpen.value = false;\n        isGifOpen.value = false;\n      }, 500);\n    }\n  }\n);\n\nwatch(\n  () => messages.value.length,\n  (newLength, oldLength) => {\n    const addedMessages = newLength - oldLength;\n\n    if (addedMessages > 0) {\n      const wasAtBottom = isAtBottom.value;\n\n      nextTick(() => {\n        if (!chatBodyRef.value) return;\n\n        const scrollable = checkScrollable();\n        isScrollable.value = scrollable;\n\n        if (!scrollable) {\n          isAtBottom.value = true;\n          unreadMessageCount.value = 0;\n          lastMessageCount.value = newLength;\n          return;\n        }\n\n        if (wasAtBottom) {\n          nextTick(() => {\n            scrollToBottom();\n            unreadMessageCount.value = 0;\n            lastMessageCount.value = newLength;\n          });\n        } else {\n          unreadMessageCount.value += addedMessages;\n          checkIfAtBottom();\n        }\n      });\n    }\n  }\n);\n\n// GIF 탭이 열릴 때만 API 호출 (최초 1회)\nwatch(isGifOpen, (newVal) => {\n  if (newVal && gifs.value.length === 0) {\n    fetchGifs();\n  }\n});\n\n// ===== 외부 클릭 핸들러 (isMobile이거나 variant가 'sub'일 때만 동작) =====\nconst handleOutsideClick = (event) => {\n  // 조건 확인: isMobile이거나 variant가 'sub'일 때만\n  if (!isMobile.value && props.variant !== 'sub') return;\n  \n  // 채팅이 열려있지 않으면 무시\n  if (!isChatOpen.value) return;\n  \n  // Header 영역 클릭 시 제외\n  const headerElement = event.target.closest('.header, .header__gnb, .header__mobile-gnb');\n  if (headerElement) {\n    return;\n  }\n  \n  // chat 영역 내부 클릭은 무시\n  if (chatRef.value) {\n    const element = chatRef.value;\n    // DOM 요소인지 확인하고 contains 메서드 사용\n    if (element && typeof element.contains === 'function' && element.contains(event.target)) {\n      return;\n    }\n  }\n  \n  // 외부 클릭이면 닫기\n  closeChat();\n};\n\n// ===== Watchers =====\n// isMobile 변경 시 textarea 높이 업데이트\nwatch(isMobile, () => {\n  if (textareaRef.value && !isMultiline.value) {\n    textareaHeight.value = `${BASE_HEIGHT.value}px`;\n    textareaRef.value.style.height = textareaHeight.value;\n  }\n});\n\n// isChatOpen이 변경될 때 이벤트 리스너 추가/제거\nwatch(\n  () => isChatOpen.value,\n  (newValue) => {\n    if (process.client) {\n      if (newValue && (isMobile.value || props.variant === 'sub')) {\n        // 채팅이 열리고 조건이 맞으면 이벤트 리스너 추가\n        window.addEventListener('click', handleOutsideClick);\n      } else {\n        // 채팅이 닫히면 이벤트 리스너 제거\n        window.removeEventListener('click', handleOutsideClick);\n      }\n    }\n  },\n  { immediate: true }\n);\n\n// ===== Lifecycle Hooks =====\nonMounted(() => {\n  if (textareaRef.value) {\n    textareaHeight.value = `${BASE_HEIGHT.value}px`;\n    textareaRef.value.style.height = textareaHeight.value;\n  }\n\n  if (chatBodyRef.value) {\n    chatBodyRef.value.addEventListener(\"scroll\", handleScroll);\n    lastMessageCount.value = messages.value.length;\n\n    nextTick(() => {\n      checkIfAtBottom();\n      scrollToBottom();\n    });\n  }\n\n  // Socket.io 연결 및 채팅 이벤트 구독\n  if (currentUser.value) {\n    socketInstance = connect(\n      currentUser.value.id,\n      currentUser.value.nickname,\n      currentUser.value.avatar || '01'\n    );\n  } else {\n    // 비로그인 사용자도 채팅 조회 가능\n    socketInstance = connect(\n      null,\n      'Guest_' + Math.random().toString(36).substring(7),\n      '01'\n    );\n  }\n\n  // 채팅 히스토리 수신\n  on('chat:history', (serverMessages) => {\n    // // console.log('[Chat] Received history:', serverMessages.length, 'messages');\n    messages.value = serverMessages.map(msg => ({\n      id: msg.id,\n      text: msg.message,\n      type: msg.user_id === currentUser.value?.id ? 'outgoing' : 'incoming',\n      author: msg.nickname,\n      avatar: msg.avatar || '01',\n      time: msg.time\n    }));\n\n    if (serverMessages.length > 0) {\n      lastMessageId.value = Math.max(...serverMessages.map(m => m.id));\n    }\n\n    nextTick(() => {\n      scrollToBottom();\n    });\n  });\n\n  // 새 메시지 수신\n  on('chat:message', (msg) => {\n    // // console.log('[Chat] New message:', msg.nickname, msg.message);\n\n    if (msg.id > lastMessageId.value) {\n      messages.value.push({\n        id: msg.id,\n        text: msg.message,\n        type: msg.user_id === currentUser.value?.id ? 'outgoing' : 'incoming',\n        author: msg.nickname,\n        avatar: msg.avatar || '01',\n        time: msg.time\n      });\n      lastMessageId.value = msg.id;\n\n      if (!isChatOpen.value) {\n        unreadMessageCount.value++;\n      } else {\n        nextTick(() => {\n          scrollToBottom();\n        });\n      }\n    }\n  });\n\n  // 메시지 전송 확인\n  on('chat:sent', (msg) => {\n    // // console.log('[Chat] Message sent:', msg.id);\n    // 내가 보낸 메시지는 chat:message로 다시 받으므로 여기서 추가 처리 불필요\n  });\n\n  // 온라인 사용자 수 업데이트\n  on('chat:online', (data) => {\n    // // console.log('[Chat] Online count:', data.count);\n    onlineCount.value = data.count;\n  });\n\n  // 채팅 오류\n  on('chat:error', (data) => {\n    console.error('[Chat] Error:', data.message);\n  });\n});\n\nonUnmounted(() => {\n  if (closeTimer) clearTimeout(closeTimer);\n  if (chatBodyRef.value) {\n    chatBodyRef.value.removeEventListener(\"scroll\", handleScroll);\n  }\n  // 외부 클릭 이벤트 리스너 제거\n  if (process.client) {\n    window.removeEventListener('click', handleOutsideClick);\n  }\n\n  // Socket.io 이벤트 리스너 제거\n  off('chat:history');\n  off('chat:message');\n  off('chat:sent');\n  off('chat:online');\n  off('chat:error');\n});\n</script>\n\n<template>\n  <motion.aside\n    :class=\"['chat', { 'chat--sub': variant === 'sub', 'chat--open': isChatOpen }]\"\n    :initial=\"{ x: '100%' }\"\n    :animate=\"\n      isChatOpen\n        ? {\n            x: 0,\n          }\n        : {\n            x: '100%',\n          }\n    \"\n    :transition=\"{\n      type: 'spring',\n      stiffness: 320,\n      damping: 25,\n      mass: 0.8,\n    }\"\n  >\n    <div ref=\"chatRef\" class=\"chat__inner\">\n      <div class=\"chat__header\">\n        <h2 class=\"chat__title\">채팅 <span v-if=\"onlineCount > 0\">({{ onlineCount }}명 접속중)</span></h2>\n        <button type=\"button\" class=\"ico-close\" @click=\"closeChat\">\n          <span class=\"blind\">닫기</span>\n        </button>\n      </div>\n      <div ref=\"chatBodyRef\" class=\"chat__body\">\n        <div class=\"chat__message-list\">\n          <!-- 메시지가 없을 때 -->\n          <div v-if=\"messages.length === 0\" class=\"chat__empty\">\n            <p>아직 채팅 메시지가 없습니다.</p>\n          </div>\n\n          <!-- 메시지 목록 -->\n          <div\n            v-for=\"message in messages\"\n            :key=\"message.id\"\n            :class=\"[\n              'chat__message',\n              message.type === 'outgoing'\n                ? 'chat__message--outgoing'\n                : 'chat__message--incoming',\n            ]\"\n          >\n            <template v-if=\"message.type === 'incoming'\">\n              <div class=\"chat__message-thumb\">\n                <img\n                  :src=\"`/images/default_avatar_${normalizeAvatar(message.avatar)}.png`\"\n                  :alt=\"`${message.author} 프로필`\"\n                  @error=\"$event.target.src='/images/default_avatar_01.png'\"\n                />\n              </div>\n              <div class=\"chat__message-content\">\n                <span class=\"chat__message-author\">{{ message.author }}</span>\n                <p\n                  class=\"chat__message-text\"\n                  v-html=\"formatMessageWithMentions(message.text)\"\n                ></p>\n              </div>\n            </template>\n            <template v-else>\n              <p\n                v-if=\"message.text || message.image\"\n                class=\"chat__message-text\"\n              >\n                <span\n                  v-if=\"message.text\"\n                  v-html=\"formatMessageWithMentions(message.text)\"\n                ></span>\n                <img\n                  v-if=\"message.image\"\n                  :src=\"message.image\"\n                  alt=\"GIF\"\n                  class=\"chat__message-image\"\n                />\n              </p>\n            </template>\n          </div>\n        </div>\n      </div>\n      <div class=\"chat__footer\">\n        <button\n          v-if=\"showScrollButton\"\n          type=\"button\"\n          class=\"chat__action-btn ico-after ico-chevron-down\"\n          @click.stop=\"handleScrollToBottomClick\"\n        >\n          <span class=\"blind\">맨 아래로 이동</span>\n          <span v-if=\"unreadMessageCount > 0\"\n            >{{ unreadMessageCount }}개의 새 메시지</span\n          >\n        </button>\n\n        <div class=\"chat__footer-inner\" :class=\"{ 'chat__footer-inner--actions-open': isEmojiOpen || isGifOpen }\">\n          <div\n            class=\"chat__input-group\"\n            :class=\"{ 'chat__input-group--column': isMultiline }\"\n          >\n            <textarea\n              ref=\"textareaRef\"\n              class=\"textarea\"\n              placeholder=\"메세지를 입력하세요.\"\n              :style=\"{\n                height: textareaHeight,\n                resize: 'none',\n                overflowY: 'hidden',\n              }\"\n              @input=\"handleInput\"\n              @keydown=\"handleKeydown\"\n              @keyup=\"handleKeyup\"\n            ></textarea>\n            <div class=\"chat__input-controls\">\n              <button\n                type=\"button\"\n                class=\"chat__input-btn ico-emoji\"\n                :class=\"{ active: isEmojiOpen }\"\n                @click=\"handleEmojiClick\"\n              >\n                <span class=\"blind\">이모지</span>\n              </button>\n              <button\n                type=\"button\"\n                class=\"chat__input-btn ico-gif\"\n                :class=\"{ active: isGifOpen }\"\n                @click=\"handleGifClick\"\n              >\n                <span class=\"blind\">GIF</span>\n              </button>\n            </div>\n          </div>\n          <button\n            ref=\"sendButtonRef\"\n            type=\"button\"\n            class=\"chat__btn-send btn-primary ico-before ico-send\"\n            @click=\"handleSend\"\n          >\n            <span class=\"blind\">전송</span>\n          </button>\n        </div>\n\n        <!-- 래퍼 추가 -->\n        <div class=\"chat__message-actions-wrapper\">\n          <AnimatePresence>\n            <motion.div\n              v-if=\"isEmojiOpen\"\n              class=\"chat__message-actions chat__message-actions--emoji\"\n              :style=\"{\n                position: isGifOpen ? 'absolute' : 'relative',\n                width: '100%',\n                bottom: 0,\n              }\"\n              :initial=\"{ height: 0, opacity: 0, y: 20 }\"\n              :animate=\"{ height: '14.4rem', opacity: 1, y: 0 }\"\n              :exit=\"{ height: 0, opacity: 0, y: 20 }\"\n              :transition=\"{\n                type: 'spring',\n                stiffness: 300,\n                damping: 30,\n                mass: 0.8,\n              }\"\n            >\n              <!-- 카테고리 버튼 -->\n              <div class=\"emoji-picker__categories\">\n                <button\n                  v-for=\"category in emojiCategories\"\n                  :key=\"category.id\"\n                  type=\"button\"\n                  class=\"emoji-picker__category-btn\"\n                  :class=\"{ active: selectedCategory === category.id }\"\n                  @mousedown.prevent=\"selectCategory(category.id)\"\n                  :title=\"category.name\"\n                >\n                  {{ category.icon }}\n                </button>\n              </div>\n\n              <!-- 이모지 그리드 -->\n              <div class=\"emoji-picker__grid\">\n                <button\n                  v-for=\"(emoji, index) in currentEmojis\"\n                  :key=\"`${selectedCategory}-${index}`\"\n                  type=\"button\"\n                  class=\"emoji-picker__emoji-btn\"\n                  @mousedown.prevent=\"onEmojiSelect(emoji)\"\n                >\n                  {{ emoji }}\n                </button>\n              </div>\n            </motion.div>\n          </AnimatePresence>\n\n          <AnimatePresence>\n            <motion.div\n              v-if=\"isGifOpen\"\n              class=\"chat__message-actions chat__message-actions--gif\"\n              :style=\"{\n                position: isEmojiOpen ? 'absolute' : 'relative',\n                width: '100%',\n                bottom: 0,\n              }\"\n              :initial=\"{ height: 0, opacity: 0, y: 20 }\"\n              :animate=\"{ height: '14.4rem', opacity: 1, y: 0 }\"\n              :exit=\"{ height: 0, opacity: 0, y: 20 }\"\n              :transition=\"{\n                type: 'spring',\n                stiffness: 300,\n                damping: 30,\n                mass: 0.8,\n              }\"\n            >\n              <div class=\"gif-picker__grid\">\n                <div\n                  class=\"gif-picker__grid-item\"\n                  v-for=\"gif in gifs\"\n                  :key=\"gif.id\"\n                  role=\"button\"\n                  @mousedown.prevent=\"\n                    onGifSelect(gif.images.fixed_height.url, $event)\n                  \"\n                >\n                  <img\n                    :src=\"gif.images.fixed_height_small.url\"\n                    :alt=\"gif.title\"\n                  />\n                </div>\n              </div>\n              <div class=\"gif-picker__attribution\">\n                <img src=\"@/assets/images/giphy.webp\" alt=\"Powered by GIPHY\" />\n              </div>\n            </motion.div>\n          </AnimatePresence>\n        </div>\n      </div>\n    </div>\n  </motion.aside>\n</template>\n\n<style scoped></style>\n","<script setup>\nimport { motion } from \"motion-v\";\nimport { ref, computed, watch, onMounted, onBeforeUnmount } from \"vue\";\nimport { useChat } from \"@/composables/useSidebar\";\nimport { useDevice } from \"@/composables/useDevice\";\nimport { useNotifications } from \"@/composables/useNotifications\";\nimport { useSocket } from \"@/composables/useSocket\";\n\nconst props = defineProps({\n  isOpen: {\n    type: Boolean,\n    default: false,\n  },\n  variant: {\n    type: String,\n    default: '',\n  },\n});\n\nconst emits = defineEmits([\"close\"]);\n\nconst { unreadNotificationCount } = useChat();\nconst { isMobile } = useDevice();\nconst {\n  notifications: apiNotifications,\n  unreadCount,\n  fetchNotifications,\n  fetchUnreadCount,\n  markAsRead: markApiAsRead,\n  markAllAsRead: markAllApiAsRead\n} = useNotifications();\nconst { on, off } = useSocket();\n\n// notification-system 요소 참조\nconst notificationSystemRef = ref(null);\n\n// 읽지 않은 메시지 표시 체크박스 상태\nconst showUnreadOnly = ref(false);\n\n// 현재 테마 감지\nconst currentTheme = ref('dark');\n\n// 테마 감지 함수\nconst getTheme = () => {\n  if (process.client) {\n    const theme = document.documentElement.getAttribute('data-theme');\n    return theme === 'light' ? 'light' : 'dark';\n  }\n  return 'dark';\n};\n\n// 이미지 경로 반환 함수 (notice.svg인 경우 테마에 따라 변경)\nconst getImagePath = (originalPath) => {\n  if (originalPath === '/images/notice.svg') {\n    return currentTheme.value === 'light'\n      ? '/images/notice_light.svg'\n      : '/images/notice.svg';\n  }\n  return originalPath;\n};\n\n// 테마 변경 감지\nlet themeObserver = null;\n\nconst watchTheme = () => {\n  if (process.client) {\n    // 초기 테마 설정\n    currentTheme.value = getTheme();\n\n    themeObserver = new MutationObserver(() => {\n      currentTheme.value = getTheme();\n    });\n\n    themeObserver.observe(document.documentElement, {\n      attributes: true,\n      attributeFilter: ['data-theme']\n    });\n  }\n};\n\n// 알림 항목들 (API에서 가져옴)\nconst notifications = computed(() => {\n  return apiNotifications.value.map(n => ({\n    id: n.id,\n    isNew: n.is_new,\n    thumb: getThumbImage(n.type, n.thumb_image),\n    title: n.title,\n    content: n.content || '',\n    time: n.time,\n    link: n.link_text ? { text: n.link_text, to: n.link_url || '#' } : null,\n    hasStrongTitle: n.type !== 'notice'\n  }));\n});\n\n// 알림 타입에 따른 썸네일 이미지\nconst getThumbImage = (type, customImage) => {\n  if (customImage) return customImage;\n\n  const thumbMap = {\n    'deposit': '/images/add_funds.svg',\n    'withdraw': '/images/usdt.svg',\n    'notice': '/images/notice.svg',\n    'jackpot': '/images/notice.svg',\n    'info': '/images/notice.svg'\n  };\n\n  return thumbMap[type] || '/images/notice.svg';\n};\n\n// 필터링된 알림 목록\nconst filteredNotifications = computed(() => {\n  if (showUnreadOnly.value) {\n    return notifications.value.filter((item) => item.isNew);\n  }\n  return notifications.value;\n});\n\n// 읽지 않은 알림 개수 업데이트\nconst updateUnreadCount = () => {\n  unreadNotificationCount.value = unreadCount.value;\n};\n\n// unreadCount 변경 감지\nwatch(\n  unreadCount,\n  () => {\n    if (process.client) {\n      updateUnreadCount();\n    }\n  }\n);\n\n// 초기 개수 설정 및 알림 로드\nonMounted(async () => {\n  watchTheme();\n\n  if (process.client) {\n    try {\n      // 알림 목록 로드\n      await fetchNotifications();\n      // 읽지 않은 개수 로드\n      await fetchUnreadCount();\n    } catch (error) {\n      // 조용히 실패 처리\n    }\n\n    // 실시간 알림 수신\n    on('notification:new', async (data) => {\n      // // console.log('[Notification] New notification:', data);\n      try {\n        // 알림 목록 갱신\n        await fetchNotifications();\n        await fetchUnreadCount();\n      } catch (error) {\n        // 조용히 실패 처리\n      }\n    });\n  }\n});\n\n// 모두 읽음으로 표시\nconst markAllAsRead = async () => {\n  const result = await markAllApiAsRead();\n  if (result.success) {\n    // // console.log('[Notification] All marked as read');\n  }\n};\n\nconst closeNotification = () => {\n  emits(\"close\");\n};\n\n// 외부 클릭 핸들러 (isMobile이거나 variant가 'sub'일 때만 동작)\nconst handleOutsideClick = (event) => {\n  // 조건 확인: isMobile이거나 variant가 'sub'일 때만\n  if (!isMobile.value && props.variant !== 'sub') return;\n\n  // 알림이 열려있지 않으면 무시\n  if (!props.isOpen) return;\n\n  // Header 영역 클릭 시 제외\n  const headerElement = event.target.closest('.header, .header__gnb, .header__mobile-gnb');\n  if (headerElement) {\n    return;\n  }\n\n  // notification-system 영역 내부 클릭은 무시\n  if (notificationSystemRef.value) {\n    const element = notificationSystemRef.value;\n    // DOM 요소인지 확인하고 contains 메서드 사용\n    if (element && typeof element.contains === 'function' && element.contains(event.target)) {\n      return;\n    }\n  }\n\n  // 외부 클릭이면 닫기\n  closeNotification();\n};\n\n// isOpen이 변경될 때 이벤트 리스너 추가/제거\nwatch(\n  () => props.isOpen,\n  (newValue) => {\n    if (process.client) {\n      if (newValue && (isMobile.value || props.variant === 'sub')) {\n        // 알림이 열리고 조건이 맞으면 이벤트 리스너 추가\n        window.addEventListener('click', handleOutsideClick);\n      } else {\n        // 알림이 닫히면 이벤트 리스너 제거\n        window.removeEventListener('click', handleOutsideClick);\n      }\n    }\n  },\n  { immediate: true }\n);\n\n// 알림 클릭 시 읽음 처리\nconst handleNotificationClick = async (notification) => {\n  if (notification.isNew) {\n    await markApiAsRead(notification.id);\n  }\n};\n\n// 컴포넌트 언마운트 시 이벤트 리스너 제거\nonBeforeUnmount(() => {\n  if (process.client) {\n    window.removeEventListener('click', handleOutsideClick);\n    if (themeObserver) {\n      themeObserver.disconnect();\n    }\n    // 소켓 이벤트 리스너 제거\n    off('notification:new');\n  }\n});\n</script>\n<template>\n  <motion.aside\n    :class=\"['notification-system', { 'notification-system--sub': variant === 'sub', 'notification-system--open': isOpen }]\"\n    :initial=\"{ x: '100%' }\"\n    :animate=\"\n      isOpen\n        ? {\n            x: 0,\n          }\n        : {\n            x: '100%',\n          }\n    \"\n    :transition=\"{\n      type: 'spring',\n      stiffness: 320,\n      damping: 25,\n      mass: 0.8,\n    }\"\n  >\n    <div ref=\"notificationSystemRef\" class=\"notification-system__inner\">\n      <div class=\"notification-system__header\">\n        <h2 class=\"notification-system__title\">시스템 알림</h2>\n        <button type=\"button\" class=\"ico-close\" @click=\"closeNotification\">\n          <span class=\"blind\">닫기</span>\n        </button>\n      </div>\n      <div class=\"notification-system__body\">\n        <div class=\"notification-system__list\">\n          <div v-for=\"notification in filteredNotifications\" :key=\"notification.id\" class=\"notification-system__item\"\n            :class=\"{ 'notification-system__item--new': notification.isNew }\"\n            @click=\"handleNotificationClick(notification)\">\n            <div class=\"notification-system__item-thumb\">\n              <img :src=\"getImagePath(notification.thumb)\" alt=\"\" />\n            </div>\n            <div class=\"notification-system__item-content\">\n              <p class=\"notification-system__item-title\">\n                <template v-if=\"notification.hasStrongTitle\">\n                  <strong>{{ notification.title }}</strong>\n                  {{ notification.content }}\n                </template>\n                <template v-else>\n                  {{ notification.title }}\n                </template>\n              </p>\n              <span class=\"notification-system__item-time\">{{\n                notification.time\n              }}</span>\n              <div v-if=\"notification.link\" class=\"notification-system__item-link\">\n                <NuxtLink :to=\"notification.link.to\" class=\"btn-primary btn-sm\">\n                  {{ notification.link.text }}\n                </NuxtLink>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"notification-system__footer\">\n        <div class=\"switchset switchset--type1 switchset--sm\">\n          <span class=\"switchset__tit\">읽지 않은 메세지 표시</span>\n          <label class=\"switchset__label\">\n            <input class=\"switchset__input\" type=\"checkbox\" role=\"switch\" v-model=\"showUnreadOnly\">\n            <span class=\"switchset__bg\"></span>\n            <span class=\"switchset__thumb\"></span>\n          </label>\n        </div>\n        <button type=\"button\" class=\"notification-system-read--all ico-before ico-check-thin\" @click=\"markAllAsRead\">\n          모두 읽음으로 표시\n        </button>\n      </div>\n    </div>\n  </motion.aside>\n</template>\n<style scoped></style>\n"],"version":3}